diff --git a/go.mod b/go.mod index 89c0e54ab5..06c09f155d 100644 --- a/go.mod +++ b/go.mod @@ -11,33 +11,27 @@ require ( github.com/grpc-ecosystem/grpc-health-probe v0.4.40 github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 - github.com/onsi/ginkgo/v2 v2.25.3 - github.com/openshift/api v3.9.0+incompatible - github.com/operator-framework/api v0.34.0 + github.com/onsi/ginkgo/v2 v2.26.0 + github.com/openshift/api v0.0.0-20251023193535-8691c3014652 + github.com/operator-framework/api v0.35.0 github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000 - github.com/operator-framework/operator-registry v1.59.0 + github.com/operator-framework/operator-registry v1.60.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.10.1 github.com/stretchr/testify v1.11.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 - google.golang.org/protobuf v1.36.9 + google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 - k8s.io/code-generator v0.33.4 - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a + k8s.io/api v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 + k8s.io/code-generator v0.34.1 + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 - sigs.k8s.io/controller-runtime v0.21.0 - sigs.k8s.io/controller-tools v0.18.0 + sigs.k8s.io/controller-runtime v0.22.3 + sigs.k8s.io/controller-tools v0.19.0 ) -// latest gRPC library causes changes in the way the CatalogSource connection status behaves -// previously it would reach READY - but now seems to stay on IDLE unless there is data going down the pipe -// this is breaking many CatalogSource related tests -// issue: https://github.com/operator-framework/operator-lifecycle-manager/issues/3284 -replace google.golang.org/grpc => google.golang.org/grpc v1.63.2 - require ( cel.dev/expr v0.24.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect @@ -72,10 +66,10 @@ require ( github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/cli v28.4.0+incompatible // indirect + github.com/docker/cli v28.5.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v28.3.3+incompatible // indirect - github.com/docker/docker-credential-helpers v0.9.3 // indirect + github.com/docker/docker v28.5.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.4 // indirect github.com/docker/go-connections v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect @@ -84,12 +78,12 @@ require ( github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-air/gini v1.0.4 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.2 // indirect - github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect @@ -97,14 +91,14 @@ require ( github.com/go-openapi/swag v0.23.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect - github.com/goccy/go-yaml v1.11.0 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-migrate/migrate/v4 v4.19.0 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.1 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-containerregistry v0.20.6 // indirect github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect @@ -147,7 +141,7 @@ require ( github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/onsi/gomega v1.38.2 // indirect @@ -162,7 +156,7 @@ require ( github.com/proglottis/gpgme v0.1.5 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/common v0.67.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -183,9 +177,9 @@ require ( github.com/x448/float16 v0.8.4 // indirect github.com/zeebo/errs v1.4.0 // indirect go.etcd.io/bbolt v1.4.3 // indirect - go.etcd.io/etcd/api/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/v3 v3.5.21 // indirect + go.etcd.io/etcd/api/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/v3 v3.6.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect @@ -198,60 +192,58 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 // indirect go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.podman.io/common v0.65.0 // indirect - go.podman.io/image/v5 v5.37.0 // indirect - go.podman.io/storage v1.60.0 // indirect + go.podman.io/image/v5 v5.38.0 // indirect + go.podman.io/storage v1.61.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect - golang.org/x/crypto v0.42.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/lint v0.0.0-20241112194109-818c5a804067 // indirect - golang.org/x/mod v0.28.0 // indirect - golang.org/x/net v0.44.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.29.0 // indirect - golang.org/x/time v0.13.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.38.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect - golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/grpc v1.75.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/grpc v1.76.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.33.4 // indirect - k8s.io/apiserver v0.33.4 // indirect + k8s.io/apiextensions-apiserver v0.34.1 // indirect + k8s.io/apiserver v0.34.1 // indirect k8s.io/cli-runtime v0.33.2 // indirect - k8s.io/component-base v0.33.4 // indirect - k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect + k8s.io/component-base v0.34.1 // indirect + k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect k8s.io/klog v1.0.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kms v0.33.4 // indirect - k8s.io/kube-aggregator v0.33.4 // indirect + k8s.io/kms v0.34.1 // indirect + k8s.io/kube-aggregator v0.34.1 // indirect k8s.io/kubectl v0.33.2 // indirect oras.land/oras-go/v2 v2.6.0 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) replace ( // pinned because of incompatibility with k8s.io/apiserver github.com/google/cel-go => github.com/google/cel-go v0.22.1 - // controller runtime - github.com/openshift/api => github.com/openshift/api v0.0.0-20210517065120-b325f58df679 github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 // release-4.5 // use staged repositories diff --git a/go.sum b/go.sum index 18f84d01fa..54b3fc3052 100644 --- a/go.sum +++ b/go.sum @@ -1,1317 +1,10 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= -cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0= -cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= -cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= -cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk= -cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= -cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= -cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo= -cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= -cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.2/go.mod h1:c3kCiVmb6UC1dHAjZjcpDj6ZS0bHQ2slL88ZjC2LtlA= -cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA= -cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= -cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8= -cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= -cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= -cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18= -cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= -cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= -cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8= -cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= -cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= -cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo= -cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= -cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= -cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4= -cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= -cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= -cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= -cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI= -cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= -cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= -cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= -cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4= -cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= -cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.16.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.1/go.mod h1:byvDw36UME5AzGNK7o4JnOnINkwOZ1yRrGrKIahHrng= -cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4= -cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= -cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= -cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg= -cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= -cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= -cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= -cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88= -cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= -cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= -cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8= -cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= -cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk= -cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= -cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= -cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= -cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= -cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= -cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= -cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg= -cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= -cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= -cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE= -cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= -cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ= -cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= -cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= -cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= -cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ= -cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= -cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU= -cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= -cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= -cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk= -cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= -cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= -cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk= -cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= -cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= -cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= -cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE= -cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= -cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= -cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04= -cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= -cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.30.1/go.mod h1:vkbfX0EnAKL/vgVECs5BZn24e1cJROzgszJirRKQ4Bg= -cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= -cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY= -cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= -cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= -cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A= -cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= -cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= -cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo= -cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= -cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= -cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM= -cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= -cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= -cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0= -cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= -cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= -cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE= -cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= -cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= -cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs= -cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= -cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.1/go.mod h1:bWxQAbg6Smg+sca2+Ex7s8D9a5qU6xfXtwmq4BVReps= -cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= -cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o= -cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= -cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= -cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs= -cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= -cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= -cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c= -cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= -cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= -cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g= -cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= -cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= -cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk= -cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= -cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= -cloud.google.com/go/dialogflow v1.48.2/go.mod h1:7A2oDf6JJ1/+hdpnFRfb/RjJUOh2X3rhIa5P8wQSEX4= -cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ= -cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= -cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= -cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo= -cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= -cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.8/go.mod h1:Vd/y5PosxCpUHmwC+v9arZyeMfTqBR9VIwOwIqQYYfA= -cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I= -cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= -cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= -cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4= -cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= -cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= -cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo= -cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= -cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= -cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y= -cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= -cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= -cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE= -cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= -cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= -cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE= -cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= -cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= -cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk= -cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= -cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= -cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY= -cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= -cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= -cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY= -cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= -cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= -cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8= -cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= -cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU= -cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= -cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= -cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= -cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= -cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q= -cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= -cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= -cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk= -cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= -cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= -cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg= -cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= -cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= -cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= -cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ= -cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= -cloud.google.com/go/kms v1.15.6/go.mod h1:yF75jttnIdHfGBoE51AKsD/Yqf+/jICzB9v1s1acsms= -cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= -cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U= -cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= -cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= -cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA= -cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= -cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= -cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= -cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8= -cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= -cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= -cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY= -cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= -cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= -cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8= -cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= -cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= -cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A= -cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= -cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= -cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= -cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU= -cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= -cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= -cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= -cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4= -cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= -cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.1/go.mod h1:SJzPMakCF0GHOuKEH/r4hxVKF04zl+cRPQyc3d/fqII= -cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug= -cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= -cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= -cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= -cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI= -cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= -cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= -cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI= -cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= -cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= -cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= -cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A= -cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= -cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= -cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= -cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8= -cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= -cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= -cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0= -cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= -cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= -cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o= -cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= -cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0= -cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= -cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= -cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= -cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg= -cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= -cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= -cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= -cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8= -cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= -cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= -cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= -cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U= -cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= -cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= -cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc= -cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= -cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= -cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= -cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y= -cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= -cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= -cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= -cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18= -cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= -cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA= -cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= -cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= -cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE= -cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= -cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= -cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk= -cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= -cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= -cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8= -cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= -cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= -cloud.google.com/go/retail v1.15.1/go.mod h1:In9nSBOYhLbDGa87QvWlnE1XA14xBN2FpQRiRsUs9wU= -cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= -cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s= -cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= -cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= -cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY= -cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= -cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss= -cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= -cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= -cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg= -cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= -cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= -cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s= -cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= -cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI= -cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= -cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= -cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc= -cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= -cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= -cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= -cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU= -cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= -cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= -cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA= -cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= -cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs= -cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= -cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= -cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo= -cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= -cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= -cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4= -cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= -cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= -cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU= -cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= -cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= -cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA= -cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= -cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= -cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8= -cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= -cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= -cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU= -cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= -cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= -cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc= -cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= -cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= -cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM= -cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= -cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= -cloud.google.com/go/vision/v2 v2.7.6/go.mod h1:ZkvWTVNPBU3YZYzgF9Y1jwEbD1NBOCyJn0KFdQfE6Bw= -cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8= -cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= -cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= -cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk= -cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= -cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= -cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU= -cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= -cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= -cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc= -cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= -cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= -cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas= -cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= -cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= -cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= -cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM= -cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= -cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= -cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= @@ -1326,8 +19,6 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= @@ -1348,71 +39,29 @@ github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1o github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/akrylysov/pogreb v0.10.2 h1:e6PxmeyEhWyi2AKOBIJzAEi4HkiC+lKyCocRGlnDi78= github.com/akrylysov/pogreb v0.10.2/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= -github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= -github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= -github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= github.com/containerd/containerd v1.7.28 h1:Nsgm1AtcmEh4AHAJ4gGlNSaKgXiNccU270Dnf81FQ3c= @@ -1448,7 +97,6 @@ github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= @@ -1465,14 +113,14 @@ github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v28.4.0+incompatible h1:RBcf3Kjw2pMtwui5V0DIMdyeab8glEw5QY0UUU4C9kY= -github.com/docker/cli v28.4.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= +github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= -github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= -github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/docker v28.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= +github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.4 h1:76ItO69/AP/V4yT9V4uuuItG0B1N8hvt0T0c0NN/DzI= +github.com/docker/docker-credential-helpers v0.9.4/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 h1:EHZfspsnLAz8Hzccd67D5abwLiqoqym2jz/jOS39mCk= @@ -1483,7 +131,6 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -1491,78 +138,52 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.14 h1:3fAqdB6BCPKHDMHAKRwtPUwYexKtGrNuw8HX/T/4neo= +github.com/gkampitakis/go-snaps v0.5.14/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s= github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= +github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -1581,18 +202,13 @@ github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= @@ -1600,192 +216,99 @@ github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= -github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= -github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= -github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= -github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.19.0 h1:RcjOnCGz3Or6HQYEJ/EEVLfWnmw9KnoigPSjzhCuaSE= github.com/golang-migrate/migrate/v4 v4.19.0/go.mod h1:9dyEcu+hO+G9hPSw8AIg50yg622pXJsoHItQnDGZkI0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU= github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y= -github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 h1:JYghRBlGCZyCF2wNUJ8W0cwaQdtpcssJ4CgC406g+WU= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 h1:+epNPbD5EqgpEMm5wrl4Hqts3jZt8+kYaqUisuuIGTk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/grpc-ecosystem/grpc-health-probe v0.4.40 h1:Lr1E28yjpR3D1V42tNDjrFB0Vk+4X0TCDSVfiWXo008= @@ -1806,13 +329,7 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -1828,44 +345,32 @@ github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ github.com/joelanford/ignore v0.1.1 h1:vKky5RDoPT+WbONrbQBgOn95VV/UPh4ejlyAbbzgnQk= github.com/joelanford/ignore v0.1.1/go.mod h1:8eho/D8fwQ3rIXrLwE23AaeaGDNXqLE9QJ3zJ4LIPCw= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.8.0 h1:ZX/URYa7ilESY19ik/vBmCn6zdGQLxACwjAcWbHlYlg= github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -1882,10 +387,6 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1893,38 +394,32 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 h1:aOeI7xAOVdK+R6xbVsZuU9HmCZYmQVmZgPf9xJUd2Sg= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0/go.mod h1:0hZWbtfeCYUQeAQdPLUzETiBhUSns7O6LDj9vH88xKA= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 h1:lPmsut5Sk7eK2BmDXuvNEvMbT7MkAJBu64Yxr7iJ6nk= github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= @@ -1935,7 +430,6 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= @@ -1955,15 +449,15 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -1972,8 +466,8 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.25.3 h1:Ty8+Yi/ayDAGtk4XxmmfUy4GabvM+MegeB4cDLRi6nw= -github.com/onsi/ginkgo/v2 v2.25.3/go.mod h1:43uiyQC4Ed2tkOzLsEYm7hnrb7UJTWHYNsuy3bG/snE= +github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE= +github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= @@ -1984,9 +478,10 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/openshift/api v0.0.0-20210517065120-b325f58df679 h1:aKnhCEj48qYquZk+w5t0fVthwAtifHUXTQrvwM1xJf8= -github.com/openshift/api v0.0.0-20210517065120-b325f58df679/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= -github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/api v0.0.0-20200326152221-912866ddb162/go.mod h1:RKMJ5CBnljLfnej+BJ/xnOWc3kZDvJUaIAEq2oKSPtE= +github.com/openshift/api v0.0.0-20251023193535-8691c3014652 h1:iFo7XEz9/q6qxZey/MCCBTqCC88DXbtUz7mUWtGkQzg= +github.com/openshift/api v0.0.0-20251023193535-8691c3014652/go.mod h1:d5uzF0YN2nQQFA0jIEWzzOZ+edmo6wzlGLvx5Fhz4uY= +github.com/openshift/build-machinery-go v0.0.0-20200211121458-5e3d6e570160/go.mod h1:1CkcsT3aVebzRBzVTSbiKSkJMsC/CASqxesfqEMfJEc= github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 h1:kMiuiZXH1GdfbiMwsuAQOqGaMxlo9NCUk0wT4XAdfNM= github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0/go.mod h1:uUQ4LClRO+fg5MF/P6QxjMCb1C9f7Oh4RKepftDnEJE= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= @@ -1995,18 +490,9 @@ github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -2022,17 +508,13 @@ github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UH github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI= +github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -2045,24 +527,15 @@ github.com/redis/go-redis/extra/redisotel/v9 v9.10.0 h1:4z7/hCJ9Jft8EBb2tDmK38p2 github.com/redis/go-redis/extra/redisotel/v9 v9.10.0/go.mod h1:B0thqLh4hB8MvvcUKSwyP5YiIcCCp8UrQ0cA9gEqyjk= github.com/redis/go-redis/v9 v9.10.0 h1:FxwK3eV8p/CQa0Ch276C7u2d0eNC9kCmAYQ7mCXCzVs= github.com/redis/go-redis/v9 v9.10.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= @@ -2087,10 +560,6 @@ github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= @@ -2108,7 +577,6 @@ github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GB github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -2122,21 +590,22 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= github.com/tidwall/btree v1.8.1/go.mod h1:jBbTdUWhSZClZWoDg54VnvV7/54modSOzDN7VXftj1A= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -2155,42 +624,28 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chqDkyE9Z4N61UnQd+KOfgp5Iu53llk= github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v2 v2.305.21 h1:eLiFfexc2mE+pTLz9WwnoEsX5JTTpLCYVivKkmVXIRA= -go.etcd.io/etcd/client/v2 v2.305.21/go.mod h1:OKkn4hlYNf43hpjEM3Ke3aRdUkhSl8xjKjSf8eCq2J8= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= -go.etcd.io/etcd/pkg/v3 v3.5.21 h1:jUItxeKyrDuVuWhdh0HtjUANwyuzcb7/FAeUfABmQsk= -go.etcd.io/etcd/pkg/v3 v3.5.21/go.mod h1:wpZx8Egv1g4y+N7JAsqi2zoUiBIUWznLjqJbylDjWgU= -go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= -go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= -go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= -go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= +go.etcd.io/etcd/pkg/v3 v3.6.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= +go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= +go.etcd.io/etcd/server/v3 v3.6.4 h1:LsCA7CzjVt+8WGrdsnh6RhC0XqCsLkBly3ve5rTxMAU= +go.etcd.io/etcd/server/v3 v3.6.4/go.mod h1:aYCL/h43yiONOv0QIR82kH/2xZ7m+IWYjzRmyQfnCAg= +go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ= +go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= @@ -2201,15 +656,8 @@ go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 h1:XfzKtKSrbtYk9TNCF8dk go.opentelemetry.io/contrib/exporters/autoexport v0.61.0/go.mod h1:N6otC+qXTD5bAnbK2O1f/1SXq3cX+3KYSWrkBUqG0cw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= @@ -2236,40 +684,24 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 h1:G8Xec/SgZQricwW go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY= go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= -go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.podman.io/common v0.65.0 h1:8JNl25U4VpKDkFHSymSPm4te7ZQHJbfAB/l2FqtmYEg= go.podman.io/common v0.65.0/go.mod h1:+lJu8KHeoDQsD9HDdiFaMaOUiqPLQnK406WuLnqM7Z0= -go.podman.io/image/v5 v5.37.0 h1:yzgQybwuWIIeK63hu+mQqna/wOh96XD5cpVc6j8Dg5M= -go.podman.io/image/v5 v5.37.0/go.mod h1:+s2Sx5dia/jVeT8tI3r2NAPrARMiDdbEq3QPIQogx3I= -go.podman.io/storage v1.60.0 h1:bWNSrR58nxg39VNFDSx3m0AswbvyzPGOo5XsUfomTao= -go.podman.io/storage v1.60.0/go.mod h1:NK+rsWJVuQeCM7ifv7cxD3abegWxwtW/3OkuSUJJoE4= +go.podman.io/image/v5 v5.38.0 h1:aUKrCANkPvze1bnhLJsaubcfz0d9v/bSDLnwsXJm6G4= +go.podman.io/image/v5 v5.38.0/go.mod h1:hSIoIUzgBnmc4DjoIdzk63aloqVbD7QXDMkSE/cvG90= +go.podman.io/storage v1.61.0 h1:5hD/oyRYt1f1gxgvect+8syZBQhGhV28dCw2+CZpx0Q= +go.podman.io/storage v1.61.0/go.mod h1:A3UBK0XypjNZ6pghRhuxg62+2NIm5lcUGv/7XyMhMUI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= @@ -2281,117 +713,48 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +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= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20241112194109-818c5a804067 h1:adDmSQyFTCiv19j015EGKJBoaa7ElV0Q1Wovb/4G7NA= golang.org/x/lint v0.0.0-20241112194109-818c5a804067/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2400,139 +763,48 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2540,242 +812,87 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= -golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +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-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -2784,331 +901,35 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= -google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= -google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= -google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= -google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= -google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= -google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= -google.golang.org/genproto/googleapis/api v0.0.0-20240122161410-6c6643bf1457/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I= -google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:SCz6T5xjNXM4QFPRwxHcfChp7V+9DcXR3ay2TkHR8Tg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240122161410-6c6643bf1457/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -3123,25 +944,14 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -3161,8 +971,6 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -3170,153 +978,71 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= -k8s.io/api v0.21.0-rc.0/go.mod h1:Dkc/ZauWJrgZhjOjeBgW89xZQiTBJA2RaBKYHXPsi2Y= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.21.0-rc.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= k8s.io/cli-runtime v0.33.2 h1:koNYQKSDdq5AExa/RDudXMhhtFasEg48KLS2KSAU74Y= k8s.io/cli-runtime v0.33.2/go.mod h1:gnhsAWpovqf1Zj5YRRBBU7PFsRc6NkEkwYNQE+mXL88= k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.21.0-rc.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/code-generator v0.33.4 h1:DiA801QxqApRIBh3OWULasVAUA237XnYvFNMh+E34Y8= -k8s.io/code-generator v0.33.4/go.mod h1:ifWxKWhEl/Z1K7WmWAyOBEf3ex/i546ingCzLC8YVIY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= +k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc= +k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.33.4 h1:rvsVglcIFa9WeKk5vd3mBufSG4D5dqponz1Jz5d6FXU= -k8s.io/kms v0.33.4/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E= -k8s.io/kube-aggregator v0.33.4 h1:TdIJKHb0/bLpby7FblXIaVEzyA1jGEjzt/n9cRvwq8U= -k8s.io/kube-aggregator v0.33.4/go.mod h1:wZuctdRvGde5bwzxkZRs0GYj2KOpCNgx8rRGVoNb62k= +k8s.io/kms v0.34.1 h1:iCFOvewDPzWM9fMTfyIPO+4MeuZ0tcZbugxLNSHFG4w= +k8s.io/kms v0.34.1/go.mod h1:s1CFkLG7w9eaTYvctOxosx88fl4spqmixnNpys0JAtM= +k8s.io/kube-aggregator v0.34.1 h1:WNLV0dVNoFKmuyvdWLd92iDSyD/TSTjqwaPj0U9XAEU= +k8s.io/kube-aggregator v0.34.1/go.mod h1:RU8j+5ERfp0h+gIvWtxRPfsa5nK7rboDm8RST8BJfYQ= k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/kubectl v0.33.2 h1:7XKZ6DYCklu5MZQzJe+CkCjoGZwD1wWl7t/FxzhMz7Y= k8s.io/kubectl v0.33.2/go.mod h1:8rC67FB8tVTYraovAGNi/idWIK90z2CHFNMmGJZJ3KI= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.2/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE= -sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U= +sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y= +sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk= +sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/manifests/0000_50_olm_00-catalogsources.crd.yaml b/manifests/0000_50_olm_00-catalogsources.crd.yaml index 1ce841df79..e0bde39811 100644 --- a/manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -635,8 +635,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml index 63c9bdc6f0..563474fa48 100644 --- a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -1386,8 +1386,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1771,7 +1771,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1826,6 +1828,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1876,8 +1914,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1904,7 +1942,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2548,7 +2588,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2601,10 +2641,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2616,6 +2656,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3217,7 +3308,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3272,6 +3365,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3322,8 +3451,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3350,7 +3479,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3973,7 +4104,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4027,9 +4158,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4544,7 +4717,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4569,6 +4744,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4656,7 +4844,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4711,6 +4901,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4761,8 +4987,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4789,7 +5015,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5433,7 +5661,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5486,10 +5714,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5501,6 +5729,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6010,6 +6289,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6161,7 +6441,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6175,7 +6455,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7409,15 +7689,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7586,16 +7864,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7670,7 +7945,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8063,6 +8338,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8189,7 +8568,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/manifests/0000_50_olm_00-installplans.crd.yaml b/manifests/0000_50_olm_00-installplans.crd.yaml index 3fd8618308..08f6701336 100644 --- a/manifests/0000_50_olm_00-installplans.crd.yaml +++ b/manifests/0000_50_olm_00-installplans.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-olmconfigs.crd.yaml b/manifests/0000_50_olm_00-olmconfigs.crd.yaml index d050561f88..ec2291246b 100644 --- a/manifests/0000_50_olm_00-olmconfigs.crd.yaml +++ b/manifests/0000_50_olm_00-olmconfigs.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-operatorconditions.crd.yaml b/manifests/0000_50_olm_00-operatorconditions.crd.yaml index 8b57b2927c..2f5a208669 100644 --- a/manifests/0000_50_olm_00-operatorconditions.crd.yaml +++ b/manifests/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-operatorgroups.crd.yaml b/manifests/0000_50_olm_00-operatorgroups.crd.yaml index 72847359aa..acf2160ddc 100644 --- a/manifests/0000_50_olm_00-operatorgroups.crd.yaml +++ b/manifests/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-operators.crd.yaml b/manifests/0000_50_olm_00-operators.crd.yaml index 5a0e2ba520..c571a3264a 100644 --- a/manifests/0000_50_olm_00-operators.crd.yaml +++ b/manifests/0000_50_olm_00-operators.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/manifests/0000_50_olm_00-subscriptions.crd.yaml b/manifests/0000_50_olm_00-subscriptions.crd.yaml index b093a12ef5..87ce80f720 100644 --- a/manifests/0000_50_olm_00-subscriptions.crd.yaml +++ b/manifests/0000_50_olm_00-subscriptions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -622,8 +622,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -972,7 +972,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1027,6 +1029,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1102,7 +1140,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1141,7 +1181,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1991,15 +2031,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2168,16 +2206,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2252,7 +2287,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2645,6 +2680,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2771,7 +2910,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml b/manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml index 8e9ea5f101..febe778850 100644 --- a/manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml +++ b/manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml @@ -24,6 +24,18 @@ rules: verbs: ["watch", "list", "get", "create", "update", "patch", "delete", "deletecollection", "escalate", "bind"] - nonResourceURLs: ["*"] verbs: ["*"] + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create - apiGroups: - security.openshift.io resources: diff --git a/manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml b/manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml index 63cde3a8da..7b78fabe69 100644 --- a/manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml +++ b/manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml @@ -35,7 +35,7 @@ spec: secretName: olm-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: olm-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/manifests/0000_50_olm_07-olm-operator.deployment.yaml b/manifests/0000_50_olm_07-olm-operator.deployment.yaml index 0463328554..ebe1847e4a 100644 --- a/manifests/0000_50_olm_07-olm-operator.deployment.yaml +++ b/manifests/0000_50_olm_07-olm-operator.deployment.yaml @@ -34,7 +34,7 @@ spec: secretName: olm-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: olm-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml b/manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml index 61c35d18c8..ff8745794d 100644 --- a/manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml +++ b/manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml @@ -35,7 +35,7 @@ spec: secretName: catalog-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: catalog-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/manifests/0000_50_olm_08-catalog-operator.deployment.yaml b/manifests/0000_50_olm_08-catalog-operator.deployment.yaml index 238b91d9a2..e514aa3939 100644 --- a/manifests/0000_50_olm_08-catalog-operator.deployment.yaml +++ b/manifests/0000_50_olm_08-catalog-operator.deployment.yaml @@ -34,7 +34,7 @@ spec: secretName: catalog-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: catalog-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/manifests/0000_90_olm_00-service-monitor.yaml b/manifests/0000_90_olm_00-service-monitor.yaml index bcb43ae183..6fe1646be4 100644 --- a/manifests/0000_90_olm_00-service-monitor.yaml +++ b/manifests/0000_90_olm_00-service-monitor.yaml @@ -1,4 +1,37 @@ apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-lifecycle-manager-metrics-reader + annotations: + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + capability.openshift.io/name: "OperatorLifecycleManager" + include.release.openshift.io/hypershift: "true" +rules: + - nonResourceURLs: + - "/metrics" + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: operator-lifecycle-manager-metrics-reader + annotations: + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + capability.openshift.io/name: "OperatorLifecycleManager" + include.release.openshift.io/hypershift: "true" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: operator-lifecycle-manager-metrics-reader +subjects: + - kind: ServiceAccount + name: prometheus-k8s + namespace: openshift-monitoring +--- +apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: operator-lifecycle-manager-metrics diff --git a/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml b/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml index 1ce841df79..e0bde39811 100644 --- a/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -635,8 +635,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml index 63c9bdc6f0..563474fa48 100644 --- a/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -1386,8 +1386,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1771,7 +1771,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1826,6 +1828,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1876,8 +1914,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1904,7 +1942,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2548,7 +2588,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2601,10 +2641,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2616,6 +2656,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3217,7 +3308,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3272,6 +3365,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3322,8 +3451,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3350,7 +3479,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3973,7 +4104,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4027,9 +4158,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4544,7 +4717,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4569,6 +4744,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4656,7 +4844,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4711,6 +4901,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4761,8 +4987,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4789,7 +5015,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5433,7 +5661,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5486,10 +5714,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5501,6 +5729,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6010,6 +6289,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6161,7 +6441,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6175,7 +6455,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7409,15 +7689,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7586,16 +7864,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7670,7 +7945,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8063,6 +8338,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8189,7 +8568,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/microshift-manifests/0000_50_olm_00-installplans.crd.yaml b/microshift-manifests/0000_50_olm_00-installplans.crd.yaml index 3fd8618308..08f6701336 100644 --- a/microshift-manifests/0000_50_olm_00-installplans.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-installplans.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml b/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml index d050561f88..ec2291246b 100644 --- a/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-olmconfigs.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml b/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml index 8b57b2927c..2f5a208669 100644 --- a/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml b/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml index 72847359aa..acf2160ddc 100644 --- a/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-operators.crd.yaml b/microshift-manifests/0000_50_olm_00-operators.crd.yaml index 5a0e2ba520..c571a3264a 100644 --- a/microshift-manifests/0000_50_olm_00-operators.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-operators.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" diff --git a/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml b/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml index b093a12ef5..87ce80f720 100644 --- a/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml +++ b/microshift-manifests/0000_50_olm_00-subscriptions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.18.0 + controller-gen.kubebuilder.io/version: v0.19.0 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" capability.openshift.io/name: "OperatorLifecycleManager" @@ -622,8 +622,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -972,7 +972,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1027,6 +1029,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1102,7 +1140,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1141,7 +1181,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1991,15 +2031,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2168,16 +2206,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2252,7 +2287,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2645,6 +2680,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2771,7 +2910,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/microshift-manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml b/microshift-manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml index 8e9ea5f101..febe778850 100644 --- a/microshift-manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml +++ b/microshift-manifests/0000_50_olm_02-olm-operator.serviceaccount.yaml @@ -24,6 +24,18 @@ rules: verbs: ["watch", "list", "get", "create", "update", "patch", "delete", "deletecollection", "escalate", "bind"] - nonResourceURLs: ["*"] verbs: ["*"] + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create - apiGroups: - security.openshift.io resources: diff --git a/microshift-manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml b/microshift-manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml index 63cde3a8da..7b78fabe69 100644 --- a/microshift-manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml +++ b/microshift-manifests/0000_50_olm_07-olm-operator.deployment.ibm-cloud-managed.yaml @@ -35,7 +35,7 @@ spec: secretName: olm-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: olm-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/microshift-manifests/0000_50_olm_07-olm-operator.deployment.yaml b/microshift-manifests/0000_50_olm_07-olm-operator.deployment.yaml index 856795b652..27870907e2 100644 --- a/microshift-manifests/0000_50_olm_07-olm-operator.deployment.yaml +++ b/microshift-manifests/0000_50_olm_07-olm-operator.deployment.yaml @@ -34,7 +34,7 @@ spec: secretName: olm-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: olm-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml b/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml index 61c35d18c8..ff8745794d 100644 --- a/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml +++ b/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.ibm-cloud-managed.yaml @@ -35,7 +35,7 @@ spec: secretName: catalog-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: catalog-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.yaml b/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.yaml index 238b91d9a2..e514aa3939 100644 --- a/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.yaml +++ b/microshift-manifests/0000_50_olm_08-catalog-operator.deployment.yaml @@ -34,7 +34,7 @@ spec: secretName: catalog-operator-serving-cert - name: profile-collector-cert secret: - secretName: pprof-cert + secretName: catalog-operator-serving-cert - name: tmpfs emptyDir: {} containers: diff --git a/microshift-manifests/0000_90_olm_00-service-monitor.yaml b/microshift-manifests/0000_90_olm_00-service-monitor.yaml index bcb43ae183..6fe1646be4 100644 --- a/microshift-manifests/0000_90_olm_00-service-monitor.yaml +++ b/microshift-manifests/0000_90_olm_00-service-monitor.yaml @@ -1,4 +1,37 @@ apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-lifecycle-manager-metrics-reader + annotations: + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + capability.openshift.io/name: "OperatorLifecycleManager" + include.release.openshift.io/hypershift: "true" +rules: + - nonResourceURLs: + - "/metrics" + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: operator-lifecycle-manager-metrics-reader + annotations: + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + capability.openshift.io/name: "OperatorLifecycleManager" + include.release.openshift.io/hypershift: "true" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: operator-lifecycle-manager-metrics-reader +subjects: + - kind: ServiceAccount + name: prometheus-k8s + namespace: openshift-monitoring +--- +apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: operator-lifecycle-manager-metrics diff --git a/staging/api/.github/workflows/go.yaml b/staging/api/.github/workflows/go.yaml index 36b19911d5..5ebc0026ce 100644 --- a/staging/api/.github/workflows/go.yaml +++ b/staging/api/.github/workflows/go.yaml @@ -16,7 +16,7 @@ jobs: - name: Check out code into the Go module directory uses: actions/checkout@v5 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.mod id: go @@ -47,7 +47,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: go.mod id: go diff --git a/staging/api/.github/workflows/stale.yaml b/staging/api/.github/workflows/stale.yaml index 8a6bac598b..f3425f3ed0 100644 --- a/staging/api/.github/workflows/stale.yaml +++ b/staging/api/.github/workflows/stale.yaml @@ -33,7 +33,7 @@ jobs: issues: write # allow labeling, commenting, closing issues pull-requests: write # allow labeling, commenting, closing PRs steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 90 diff --git a/staging/api/.github/workflows/verify.yml b/staging/api/.github/workflows/verify.yml index ce7bab22c5..9a5ac9605c 100644 --- a/staging/api/.github/workflows/verify.yml +++ b/staging/api/.github/workflows/verify.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version-file: go.mod - name: Run the verify target @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version-file: go.mod - name: Deploy Kind diff --git a/staging/api/crds/operators.coreos.com_catalogsources.yaml b/staging/api/crds/operators.coreos.com_catalogsources.yaml index f8924f9af4..2b10463bac 100644 --- a/staging/api/crds/operators.coreos.com_catalogsources.yaml +++ b/staging/api/crds/operators.coreos.com_catalogsources.yaml @@ -631,8 +631,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml index 20bb1a0394..b957a9badb 100644 --- a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -1382,8 +1382,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1767,7 +1767,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1822,6 +1824,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1872,8 +1910,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1900,7 +1938,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2544,7 +2584,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2597,10 +2637,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2612,6 +2652,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3213,7 +3304,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3268,6 +3361,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3318,8 +3447,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3346,7 +3475,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3969,7 +4100,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4023,9 +4154,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4541,7 +4714,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4566,6 +4741,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4653,7 +4841,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4708,6 +4898,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4758,8 +4984,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4786,7 +5012,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5430,7 +5658,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5483,10 +5711,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5498,6 +5726,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6007,6 +6286,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6158,7 +6438,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6172,7 +6452,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7406,15 +7686,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7583,16 +7861,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7667,7 +7942,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8060,6 +8335,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8186,7 +8565,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/api/crds/operators.coreos.com_subscriptions.yaml b/staging/api/crds/operators.coreos.com_subscriptions.yaml index c388b9181e..10f465665c 100644 --- a/staging/api/crds/operators.coreos.com_subscriptions.yaml +++ b/staging/api/crds/operators.coreos.com_subscriptions.yaml @@ -618,8 +618,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -968,7 +968,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1023,6 +1025,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1098,7 +1136,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1137,7 +1177,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1987,15 +2027,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2164,16 +2202,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2248,7 +2283,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2641,6 +2676,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2767,7 +2906,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/api/crds/zz_defs.go b/staging/api/crds/zz_defs.go index 50b1b0352a..06bb23be58 100644 --- a/staging/api/crds/zz_defs.go +++ b/staging/api/crds/zz_defs.go @@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x70\x17\x52\xbd\x85\xbb\x90\xc2\x5d\x48\xe1\x2e\x24\xdb\xc2\x5d\x48\xe1\x2e\xa4\x50\xc3\x2f\xd4\xf0\x0b\x35\xfc\xfa\x7f\x15\x6a\xf8\x35\xb7\x50\xc3\x6f\x48\x0b\x35\xfc\x7a\x8f\x1e\x6a\xf8\x85\x1a\x7e\xc3\x06\x0e\x35\xfc\x48\xa8\xe1\x17\x6a\xf8\x7d\xc1\x35\xfc\xc2\x5d\x48\x5f\xc4\x85\x20\xe1\x36\x90\x01\x63\x7f\x5e\xb7\x81\x84\xbb\x90\x5a\x07\x09\x77\x21\x05\xd6\x17\xee\x42\xfa\xdd\x72\xbf\x70\x17\x52\x8f\x41\xc2\x5d\x48\xe1\x2e\xa4\xd6\x16\xee\x42\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\xbb\x90\xc2\x5d\x48\xe1\x2e\xa4\x62\xe4\x70\x17\x52\xb8\x0b\x09\x5b\xb8\x0b\xa9\xc7\x08\xe1\x2e\xa4\x2f\xf5\x2e\xa4\x5a\x3e\xd0\x97\x7b\x21\xd2\xf0\x65\x84\x5b\x91\xc2\xad\x48\x0d\x2d\xdc\x8a\x14\x6e\x45\xda\xd5\xc2\xad\x48\xe1\x56\xa4\x96\x16\x2a\x20\xf6\x6c\xa1\x02\x62\xdf\x16\x2a\x20\x36\xb5\x50\x01\x71\xb3\x85\x0a\x88\xa1\x02\x62\xa8\x80\x18\x2a\x20\x6e\x0f\x18\x2a\x20\x86\x0a\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\xa8\x80\x18\x6e\x45\xfa\x2c\xaf\x14\x09\xf7\x89\x74\xb4\xcf\xe7\x3e\x91\x70\x2b\x52\xad\xf3\x70\x2b\x52\x60\x61\xe1\x56\xa4\x2f\x8e\x8b\x85\x5b\x91\x76\x74\x1e\x6e\x45\x0a\xb7\x22\x85\x5b\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\xb7\x22\x85\x5b\x91\xc2\xad\x48\xd8\xc2\xad\x48\xe1\x56\xa4\x70\x2b\xd2\xce\x8f\xe1\x5a\x4b\x1a\xe9\x63\xc1\x35\xf0\xc6\x9c\x9b\xbe\xe8\xfc\xb2\xd6\x9b\x39\x5d\x17\x6c\x99\x4b\xa7\xf7\x2f\xdf\x9f\x1e\x93\x88\x6a\x9a\x88\x25\x39\x15\xb1\x35\x2d\xe3\x17\xc5\xcf\x29\x68\x1a\x53\x4d\x0b\xaf\x84\xd1\x8f\x2f\x59\x8c\x4c\x35\x86\x6b\xc2\x52\xba\x04\xc3\xbc\x1a\x27\x91\x2b\x20\x94\x5c\x41\x92\x4c\x2f\xb8\xb8\xe2\xe4\x12\xa4\xaa\xb0\xeb\x4f\x22\x4b\x3f\x11\x05\xf2\xd2\xde\x2c\x04\xd7\x99\x41\x34\xa6\xed\xb9\xef\x67\x52\x1d\xae\x0c\x52\x3f\xb6\x4f\xcf\x30\xa8\xb7\xed\x92\x9e\x62\xed\xb8\x4c\x33\xa7\xa7\x46\xb0\x7f\x6a\x88\x3a\x57\x3e\xa2\x7e\xc1\x12\x98\xce\xa9\x82\xd8\x8f\xab\x0c\xad\x09\x19\xdb\xb9\xe5\x9a\x25\xec\x57\x70\xa7\x09\x50\x9d\xcb\xc6\x3c\x89\x1e\x02\x47\xb7\x21\x64\xea\xe7\xf1\x82\x35\x19\x31\xfa\x18\x2c\x22\x1a\xad\xe0\x05\x6b\x55\xe1\x6b\x48\x75\xec\x3e\xf0\x26\x89\x3d\x91\x59\x39\x68\x9f\xc4\x4c\x22\x13\x5a\x13\xa5\x85\xf4\x90\xcb\x24\x4c\x23\x9a\x44\x79\x82\x2c\xe7\xe8\xf4\xc4\x0e\xda\x7d\x5d\x56\x07\x29\x95\xeb\x1f\x30\x79\xff\x89\x9f\xfe\xee\x39\x6f\xef\x36\x0a\xa0\x68\x8f\xbc\xc9\xb4\x53\x48\x85\x5c\x9f\x53\xb9\x84\x1b\x93\xf0\x9b\x4a\x5f\x9b\x04\xfc\x87\x57\xef\xde\xbc\x7c\xf3\xfa\xe4\xcd\xc9\xb9\xe3\xcb\xde\x19\xb6\x49\xda\x4e\x6d\xb5\x16\x46\xb1\xd0\x6e\x8a\x24\x61\x29\xd3\xc5\x57\x96\x06\x9b\x55\x66\xcb\xb7\x31\x81\x2e\xe7\x9a\xa5\x60\x3d\x5f\x54\x6b\x23\xd2\x18\xfa\x48\x01\x34\xde\xcf\x95\xd2\x0b\x30\xcc\x95\x2c\x73\x2a\x29\xd7\xe0\x8f\x02\xa6\xed\x47\xb1\x20\x4a\x38\x45\x9e\xa9\xd2\x4b\xa6\x40\xdb\xb4\xa1\x53\xd1\xcc\x52\xb0\x87\x15\xbd\xb4\x17\x28\x2d\x84\xe1\xdf\x66\x53\x53\x11\xb3\x05\x8b\xac\x65\x88\xa4\x34\x2e\x52\x5d\x9c\x62\x01\xb2\x38\xfe\xca\x05\xb7\x51\xdf\x26\x98\x81\x5f\x32\x29\x38\x2a\x4c\x97\x54\x32\x3a\x4f\xa0\xf0\xff\x29\xd0\x76\xbc\x72\x41\x9c\xcc\xd7\x1a\x9a\xd9\x92\x1d\xc1\xed\x86\xbb\x79\xab\xb9\xbf\x47\x8d\xfd\x9c\x97\x39\x69\xa5\xb0\x62\xbe\x67\x2e\x59\x21\x06\xc5\x1c\xf3\x93\x10\xe7\x91\x07\x9d\xd0\x99\x64\x56\xfb\xa3\x05\xc6\x38\x66\x4c\x15\x49\x73\x73\x52\x1b\x29\x48\x29\x36\x4f\x60\x62\x64\x1d\xd6\x9c\x4c\x53\xf6\x31\x07\x03\x65\xec\x09\x25\x90\x4b\x30\xf8\x66\xf0\xd8\x8a\xba\x00\x46\x10\x12\x78\x09\x16\xb5\xe2\x8c\x77\x99\x9a\xf3\x38\x72\x0e\xf3\x93\x05\x59\x8b\x5c\xd6\xd8\xff\x8a\x1a\x3c\x46\xea\x6d\x9c\x88\x4b\x80\x43\x1e\x34\x21\x31\x18\xc5\x81\x71\x73\x12\x2d\x85\x88\x8d\xfe\x20\xc5\x35\x4b\x71\x14\x47\x00\xc5\xae\xcd\xd7\x24\x16\xf9\x3c\x29\xd0\xc4\xb0\x7c\x77\x5a\x65\x34\xba\x30\x73\xc0\x8e\xdb\x52\x17\x0f\x74\x9a\x1d\xe0\x5b\xee\xbf\xee\x4b\x35\xfb\x59\x09\x5e\x3a\x9d\x8b\x65\xcd\x7a\xed\x2e\x53\x64\x0e\x4a\x4f\x61\xb1\x10\x52\xff\xcd\xec\x6f\xce\x91\x68\xb8\x28\x00\xe8\x11\x08\x03\x0c\x10\xda\x98\x82\x52\xa7\x7a\x21\x77\x30\x90\x0a\xea\x35\xb1\xc0\xcc\xd0\xbb\xe4\x87\xe4\xff\xec\xfd\xfb\x8f\xbf\x4d\xf7\xbf\xdb\xdb\xfb\xf0\x6c\xfa\xd7\x8f\x7f\xdc\xfb\xf7\x0c\xff\xf1\x74\xff\xbb\xfd\xdf\xfc\x1f\x7f\xdc\xdf\xdf\xdb\xfb\xf0\xc3\x9b\x57\xe7\xa7\x2f\x3f\xb2\xfd\xdf\x3e\xf0\x3c\xbd\xb0\x7f\xfd\xb6\xf7\x01\x5e\x7e\xec\xd9\xc9\xfe\xfe\x77\x7f\x68\x98\x10\xe5\xeb\x77\x8b\x56\x22\xee\x95\xbd\x3b\xed\x73\x1e\xd5\x44\x3a\xc6\xf5\x54\xc8\xa9\xfd\xe0\x90\x68\x99\xef\x16\x65\x8d\xdc\xdb\xe5\x1a\xee\x7b\x1e\xbc\xad\xf4\xb5\xe1\x31\x72\x57\xd8\x39\x73\xa5\x99\x4d\xc1\xd9\x33\x2b\xdd\x2d\xcc\xb6\x7b\xb1\xbf\xf9\x88\x3b\xdb\xd1\x23\xca\xf3\xee\xcb\x27\xca\x47\x3e\x6c\xf4\xbf\x91\x84\x6b\x39\x7e\xdb\x58\x3d\x64\xa4\x61\x26\x98\xce\x2d\xcc\x24\x13\x92\xe9\xf5\x71\x42\x95\x7a\x4b\x53\xb8\xe9\x86\x9c\x2c\x4a\x35\x6c\x62\xe8\xd9\x9c\x3f\xee\x80\x76\xa1\x28\x6e\xc8\x66\x80\x9f\x2c\x50\x0f\xa9\xf4\xe3\x81\xea\xbf\x2d\x08\xd3\x93\xb8\x90\xe4\x57\x90\xc2\x5d\x66\x28\xc1\xea\x32\x8d\x23\xb8\xcf\xda\xf7\xa1\x05\x6c\x0a\xa2\x1c\xc1\x66\xe4\xa3\x6b\xa3\x51\x2c\xd8\xf2\xa6\xa0\x3b\xdb\xd5\x29\x89\x28\x37\x0b\xc5\xeb\x39\x17\xe4\x53\x02\x4b\x1a\xad\x3f\x99\x05\x7f\x92\x60\xa6\x68\x74\xc0\x4f\x56\x39\xa8\x89\xff\x2e\xea\x87\x29\x02\x0c\x6f\x6c\x65\xfc\x67\xab\x30\x7a\xed\xbb\x71\x26\x12\xeb\x0f\x64\x22\x9e\x99\x3d\x98\x6d\xac\x16\x59\x68\xf1\xb0\x10\x25\x3e\x3c\xfd\xb8\xf5\xa6\xb3\x66\x6a\x61\x95\xca\x2a\x71\xc8\x1c\xb9\x7e\x9b\x5c\xe3\x01\x42\x8e\xe2\x94\xa1\x09\x96\xec\x9d\x9e\x1d\xed\xd7\x56\x6e\xa4\x1c\x7b\x0e\xc7\x02\x7c\xdc\x8d\x19\x48\x95\xc6\x54\x3c\x43\x31\xc5\xd1\x92\x30\xe6\x38\xfa\xb9\x18\x00\xa3\x7d\xb5\x25\xad\xd7\x4f\xf6\xec\x88\x7c\x32\x12\x72\xc2\x38\xd8\x3d\xc8\x24\xbb\x64\x09\x2c\xcd\x4c\x2a\x81\x0c\xde\x25\xb3\x7b\x4f\x99\x32\xa7\x54\x1d\xbd\x53\xcc\xd1\xb5\x68\xdd\x82\xb7\xee\xe0\x76\x31\x25\x15\xeb\xde\x13\x85\xd3\xf3\x32\x71\x29\x2f\xd4\xde\x42\x74\xe0\x0b\x21\x23\x73\x9a\xef\x80\xa3\x76\x49\xec\x06\x34\xed\x02\x27\x9a\x7f\x0a\x2d\x92\x2a\x43\x7b\xb5\x0e\xaf\x68\xa5\x52\xc0\x8c\xbc\x33\x48\x78\xc5\x14\x4c\x0a\xa9\x77\x67\x17\x1e\xc3\xaf\x68\xb3\x9c\x58\xe9\xf6\x0c\xff\xb9\xb6\xde\x26\x67\x8e\x41\x74\x47\x39\xaa\x89\x5e\x88\x04\x65\xf8\x06\xe3\xf6\x2b\x16\x5b\xd1\x07\xa4\x14\x72\x66\x53\xf9\xad\x1e\x2c\x92\xb8\xe5\x94\x2c\xd4\x71\x23\xb2\xa0\xb1\xc9\xe2\x17\x47\x0e\xe6\xd0\x66\x37\x98\x1b\x70\xa3\x2e\xaf\x6a\x51\x2c\xa1\x45\x20\x7a\x23\x30\xff\xdf\x16\xd9\x30\xcb\xa0\x73\x91\x6b\x8b\x0f\x96\x7d\x2c\x44\xce\x63\x62\x38\xe3\x21\x59\x69\x9d\xa9\xc3\x83\x83\xf2\xe8\x9e\x31\x71\x10\x8b\x48\x1d\x44\x82\x47\x90\x69\x75\xe0\x09\xf9\x20\x13\xf1\xd4\xff\x31\xa5\x9e\x0e\x0f\xc6\x32\x4e\x42\x80\xe7\x2d\xb7\x79\x4e\x89\x5d\x6d\xcb\x0b\x25\x30\x77\xbe\xa4\x45\xe2\x22\x26\x1b\xcf\xc5\xfa\x1d\xaf\xe5\xfb\xc5\x1d\xb4\x85\xe0\x5f\x61\xa4\x4f\x54\xb5\xeb\xf6\x93\xa3\xcd\xb2\xdc\x61\x4b\xee\x6f\x9a\x3d\xf7\xbc\xd4\x48\xc3\xe5\x2a\x50\x0a\xd2\x9a\xe2\xf5\xb4\x46\x5d\xb2\x4f\x0c\x1b\xe4\x6b\x62\x58\xb5\x76\x77\x25\x5b\x93\x64\x9b\x66\xbf\x32\x72\x13\xd6\xb0\xf8\xa6\x70\xbb\x4d\x60\xb1\x80\x48\x7f\x5b\x31\x13\x15\x55\x18\x0a\xb7\xd6\x37\xfe\x5f\xdf\x36\x9f\xf2\xbd\x3c\x50\xfd\xc2\x4f\xec\x94\xda\x6d\xdf\xc3\x6c\xde\x2f\xb1\xc7\x0d\xf9\xc5\x02\xcf\x0e\x86\xea\x3d\xfa\xa6\x9d\x21\xd5\x7a\x25\x9c\x5c\x98\x24\xb5\x97\x3b\x03\x30\x90\xdf\x54\x0e\x04\x67\x82\x2d\xbd\x81\x40\xde\x0a\x57\xce\x06\x26\xe4\x14\xaf\x0c\x2e\x7f\xc1\x13\xf9\xad\xb0\x85\x6d\x3a\x2a\x95\xf4\x34\xd8\x76\xc6\xef\x0c\x83\xe7\x0f\x65\x38\x8f\x05\x4c\x2d\x9c\xa7\x24\xac\xaa\x1f\xac\x15\xb0\x17\xb0\xee\x84\xaa\x3b\xfc\x5c\x28\x11\xfa\x99\x26\x25\x8e\x7a\xcd\xc0\x46\x4a\xfc\xcd\x55\x3f\x10\xe9\x9c\x71\x3b\x15\x3b\xb0\xdf\x67\x1c\xdb\xef\x07\x8f\xf1\xcf\xee\x49\xf4\x84\x76\xbf\x98\xa2\x61\x20\x7f\x37\x20\x5e\xa8\xf0\x3c\x77\x81\x74\x57\x5c\x50\x25\x18\xe8\xe5\x2f\x39\x4d\x66\xe4\x85\x15\xaf\x11\x78\xf6\xa7\x2e\x72\xb3\x5d\x6c\xf9\xe3\xaf\x58\x12\x47\x54\xc6\xa8\x59\x59\xf6\x43\x94\xb0\x88\x43\xbd\xf4\xd6\xd1\xb7\x67\x80\x25\xf2\xd8\xcb\xbc\x49\x46\xa5\x66\x51\x9e\x50\x69\x18\x3e\x2c\x85\xec\x88\x47\xef\xb9\x99\x25\x36\x9f\x41\x24\x78\xdc\xe1\x39\x1c\xb6\xab\xe7\x9b\x9d\x57\xb7\x17\xe5\x36\x90\xcc\x55\x54\x61\x29\x6c\x92\xd7\x5e\x4d\x2b\xee\x18\x4b\x2c\x3c\xb3\x2b\x78\xcb\xc4\x0a\x57\x46\x8c\xab\x16\x7e\x62\xca\x47\xfb\xef\x57\x0e\x9c\x82\xda\x67\xe4\x1f\x6b\xaf\x73\x75\x85\x20\x31\xed\xfd\x50\x68\xc6\x71\xf3\x75\xa4\xe8\x76\xb2\x64\x23\x0b\x21\xe1\x12\x24\xd9\x8b\x05\x7e\x83\x05\x9c\xf6\x67\xe4\x5f\x46\x19\x6c\x73\xc3\xd8\xc6\x61\x69\x4b\x00\x39\xc2\x2e\x92\x30\x24\xa0\xdd\x9e\x2a\xf2\x8c\xec\xd9\xaa\x50\x2c\x4d\x21\x66\x54\x43\xb2\xde\xf7\xd2\xb7\x35\xab\xf5\xc1\x9a\x3e\xc5\xd2\x2a\x45\xd2\xbe\xfe\x73\xcb\x9b\x38\xd9\xdb\x44\xaa\x9f\xbc\xb9\xb9\x04\xac\x95\xa4\x37\xb0\xa7\xf0\x62\x76\x06\x29\x34\x46\xa4\x4d\x4a\x5e\x53\x11\x75\x3d\x6f\x2e\x70\xeb\x67\x83\xa0\x94\x48\x58\x22\x7d\x5a\x9a\xbb\x01\x75\xb2\x68\x77\xb9\xb7\x0e\x21\xa4\xdd\x23\x35\x25\x46\x17\xfc\xfa\xcf\x31\xd5\xb4\xe1\x05\x8b\x32\xeb\x6c\x17\xa9\x75\xc9\x36\x65\xe7\x4d\x7b\xdd\xc3\xf5\xe2\x86\x1f\xd5\x03\x2a\x35\xbb\xbe\xec\x83\x5d\x27\x68\x9b\xb6\xb1\x92\x1e\x0d\xa6\x12\x96\x4c\x69\xb9\xae\x38\x20\x9c\x0b\x53\x10\xc6\x95\xa6\x5c\x33\x64\xd5\xc4\xbf\x39\x75\xc6\xf7\x2b\xa6\x1b\xc2\x00\xdf\x19\xdd\x1d\x4d\xbb\x98\x89\x63\x8d\x1f\xe7\xeb\x0c\xc8\xdf\x2b\x7f\xbc\x92\x59\xb4\xfb\xfb\x93\x05\x71\x0c\xd4\xe2\x26\x8d\x63\x09\x6a\x9b\xb3\xed\xfa\xba\x15\x7c\xde\x58\x35\x16\x82\xa7\xde\xd8\xe5\x6a\x04\x2a\xc5\x96\x46\x49\xf1\xf5\x21\xbd\x2f\xa7\xa6\xac\x98\x5f\xdd\xc0\xd6\x33\x0b\x69\x71\x62\x32\xed\xd5\xc1\x48\x70\x95\xa7\xa5\x15\x21\x86\x0c\x78\x0c\x3c\x5a\x63\x49\xa8\xe4\x12\x1a\xc2\x78\x7e\x54\x0d\x28\x41\xc8\xff\x62\x4b\xa3\x76\xbb\xc9\x55\x25\x67\xef\x9d\xde\x98\x29\x53\x06\xf0\x0b\x90\x46\xf9\xc7\xcc\x1d\x23\xf4\xfa\x1e\x2a\x5e\x48\x57\xa3\xca\x07\x95\x6e\x4e\x16\x0b\x05\xee\x9e\xee\x79\x51\xdd\xd2\xfb\x2b\x3c\x4c\x2d\x07\x32\xe0\x58\x0a\xeb\xcd\xcf\x84\x62\xbe\x1c\x5c\x71\x2e\xd4\x2a\x64\x8a\x85\xad\x5f\xd9\x3c\x56\x3d\xcb\x0d\x03\xb1\x37\x16\x8d\xb6\xb7\x9c\xdb\xcd\x84\xaa\x45\xd3\xf3\xc2\x86\x1a\x9c\xe7\xdb\x5b\x5d\x44\xd1\x60\x6a\x5c\x7d\x69\xe5\x59\x26\x29\xbf\x80\x98\x24\x70\xcd\x22\xb1\x94\x34\x5b\xb1\x08\x8b\x1d\x5a\x57\xaf\xd1\x18\xb5\x0d\xa1\x6a\xc6\xf0\xa6\xd3\x2b\xcb\xe7\x09\x53\xab\xdd\x4e\xc3\x56\xe2\x50\x10\x49\xd0\x3b\x39\x5f\x1f\xda\x38\xb3\x9f\x97\xc2\x8f\x0f\x78\x77\xfd\xba\x7c\x11\x8b\xed\x3e\xb1\x94\x46\x91\x21\x6c\xef\x00\x05\x27\x09\x56\x88\xa8\x81\x43\x68\xef\x67\x32\xbd\x5c\x00\x64\x16\x9f\x31\x50\x4d\xa5\x68\x5b\x54\x8c\x47\x80\xc5\x1b\x5d\x11\x4e\x00\xef\x03\xd0\x92\x81\x95\x60\x01\xbd\x7e\x7e\x17\x81\xeb\xdd\x12\x67\xbb\x11\xa1\xc5\x80\xd0\x0e\xf1\x82\x17\x76\x02\xbd\xc2\x43\xbd\x50\x60\xfe\x6d\xc0\x8b\x4f\x86\x6e\xb6\xad\xd5\x79\x66\x43\xc1\x47\xf3\xc3\x1f\x6b\xbd\xb8\x18\x2e\x45\x56\xe2\xca\x0d\xb0\xc9\x31\x9c\x55\xce\xa3\x41\xcc\x54\x64\xd8\x4c\x83\xe1\xe8\x58\x70\xe5\x6b\x73\x52\x6e\xcb\x69\x5e\xd2\xc4\x25\xc8\xba\xc1\x32\x91\xa0\x1f\x34\xce\xbd\xbe\x6a\x53\x8f\x20\x9d\x43\x1c\x43\xec\xe3\xdd\xd7\xa4\xe1\xd0\xef\x10\x38\xba\x64\x02\x7f\x2c\x9e\x8a\x24\x69\x3f\xd3\x5b\x0d\x2b\x7d\xcc\x2a\x1e\x00\xbd\xe3\x4c\x3a\xc4\xcc\x13\x0f\x50\xa6\x0a\x8a\x2c\x1d\xd1\x88\x64\x46\x61\x29\xe0\x3e\x07\x7d\x05\xc0\x49\xb4\x82\xe8\x42\x95\x31\x76\xda\xd0\xe1\xc6\x46\xbb\x18\xaa\x76\x01\xb1\xca\x41\x0b\xc1\xd4\x6c\xa8\x4b\x72\x07\xc2\x8c\x5a\xc8\xe1\x6a\x33\x26\x6b\xfb\xe0\xa2\x97\x94\x25\x74\x9e\x74\x28\xcc\x27\x8b\xf2\xcd\x49\x75\xfe\xcc\x4b\x47\x59\x9e\x24\xce\x2b\x8d\x51\x2a\x5a\xd2\xc5\x82\x45\x18\xa4\x88\x51\x3a\x65\x54\xef\xce\xa5\x8f\x8a\xcc\x51\x9a\xea\x7c\x6b\xeb\x5b\xf0\xa6\x0d\x5f\x8c\x16\xca\x1a\xed\xad\x7d\x30\xe4\x7d\x5d\x83\x35\xb3\x03\xab\xa2\xd7\x1c\x5a\x33\xf2\x56\x68\x17\xed\xf6\x06\x94\x72\x91\x76\xe4\x3d\x50\x25\x78\xe5\x28\x40\xcd\x43\xb2\x25\xe3\x74\x77\x95\x02\xbb\xfe\xaa\xc5\xbc\x50\x34\xe9\x1a\x8b\x17\xb3\xa5\xa4\xba\xe0\xe0\xe5\x12\xdd\xa1\xe9\xc4\x82\x45\x8e\x11\x6f\xe4\x88\xaf\x11\x6d\x5c\x08\xdc\x6e\x9b\x2a\xe3\x5a\x8a\x38\x8f\xc0\x95\x69\xce\x55\xb5\xe3\x5b\x3d\x07\xea\xe1\x5f\x7e\x8c\x32\x9d\x20\x06\x4d\x99\xf3\x57\x0b\x0e\x84\xaa\xcc\x68\xf9\x1e\xdb\x73\x29\xf1\x44\xf5\xfb\x80\x87\xdd\xd1\xe9\x09\x79\x0f\x6d\x48\xd7\xc9\x77\xba\xe2\xfb\xa6\x24\xa1\x4a\x9f\x4b\xca\x15\x4e\xf8\x9c\xa5\x4d\x26\x0a\xa3\x59\x21\x06\x34\x3e\x97\x88\x15\x8d\x8f\x2d\x0a\x34\x3e\x6e\xe0\xde\x7d\x38\xe7\xf6\x1a\x6e\xc3\xda\xbf\xdd\x6b\x99\x1e\x69\xe4\x12\x6f\xeb\x29\x30\xca\x70\x12\xf7\x36\xb8\x52\xd6\x66\xab\x1d\xea\x63\xae\x0b\xaa\xdb\x6d\x0c\x04\x03\x6d\x4a\x2d\xfd\xca\xfb\x06\x73\x1e\x83\x4c\xd0\xe7\x56\x8e\x17\xad\x8c\x90\x1c\xcf\x9c\xf2\x4f\x0b\x3b\x0e\x86\xb9\x3a\xcf\x62\xe9\x34\xb0\x01\x73\xbe\x47\x83\x5d\xae\x86\xb8\xed\x06\x99\x6c\x14\x41\xa6\xdb\xb9\x6c\x2f\x9b\x9c\x37\xac\x18\x21\x61\xaa\x9b\xb1\xca\xe1\xd4\x6d\xec\x97\xeb\xca\xc6\xa4\xac\xf2\x94\x1a\x06\x45\x63\x0c\x90\x2b\x9e\x59\x1d\xc9\xea\x34\x96\x22\xad\xe3\xce\x3a\x5e\xfc\xf6\x75\xee\x90\x63\x5a\xb4\x48\xb5\xef\xb0\x96\xf4\x82\x59\x4a\xaf\x5f\x03\x5f\xea\xd5\x21\xf9\xd3\x57\xff\xf3\xeb\xbf\x34\xbc\x28\xe6\x36\xa6\xed\x15\x70\x67\x25\xba\x0d\xe8\x6d\xf7\xba\x69\xe6\x9c\xf9\x50\xec\xd9\xb2\x7c\xa7\x70\x28\x94\x58\x89\x4e\x68\xd0\x8e\x6f\xe7\x59\x3b\x38\xbf\xc7\x64\x02\xa5\x29\x8f\x60\x62\xc4\x81\x9d\xc3\x18\x55\xd6\xf2\xc8\x64\x4d\x9e\x7f\x35\xc1\x10\x4f\x9c\x94\xa5\xae\x59\xc9\xd6\x3f\x5c\x7f\x9c\xed\x58\x0c\x53\xe4\xaf\x93\x8d\x99\x32\x45\xcc\xde\x8b\x05\xa2\x69\xcb\x24\x51\xed\x93\x60\x79\xb6\x37\x02\x6c\xf3\x6c\x28\x56\xd2\x85\x09\x5d\xb6\xc9\x7e\x76\xc9\x94\x71\x96\xe6\xe9\x21\x79\xd6\xf0\x8a\xe5\xc8\xb7\x81\x1e\xb6\xa7\xf2\x3c\xa3\x86\x2d\x2f\x25\x4d\x53\xcc\xb8\x62\x31\x70\xcd\x16\x0c\x63\x5e\x0a\x12\x43\x3d\xde\x7e\xe8\xe3\xb4\x0a\xe0\x63\x08\x97\x61\xa3\xbd\x88\xee\xd4\x9e\xe3\x12\x85\x52\xe7\xb5\x8b\xaa\x9c\x77\x9d\x81\xa5\x4a\xab\x36\x10\xb8\xce\xac\x24\x57\xf1\x1f\xa5\x40\x39\xe3\x4b\x55\x46\x5b\x22\xff\x6b\x33\x8f\x9b\xcf\xae\x56\xe0\xa2\x1b\xa0\xea\x1d\xf4\xa5\x82\x8c\x28\x59\x06\x19\x63\xe0\x79\x3b\xfb\xd8\xb6\xc5\x1a\xa9\x2b\x85\xe4\x98\x2a\xe8\x61\x77\xad\xc4\x62\xfa\x6b\x15\x8a\xe4\xe0\x5b\x63\x40\xcf\x9f\x7d\xd5\x8a\x77\xc5\x7b\x8d\x2f\x95\x51\x9a\x1f\x8e\xa6\xff\xa2\xd3\x5f\x3f\xee\xb9\x7f\x3c\x9b\xfe\xf5\xff\x4e\x0e\x3f\x3e\xad\xfc\xf9\xb1\x39\xb8\x72\xb7\xe4\x5c\xb6\x1a\x0e\xbb\xb3\xd6\x8b\x55\x1e\x3f\x26\x3e\x98\xeb\x5c\xe6\x30\x21\xdf\xd3\x44\xc1\x84\xfc\xc8\xf1\x9c\xbc\x21\xd0\xda\xa3\x2b\x8c\x64\xf3\xd8\x8c\xfa\xb8\xfd\x15\x9c\x52\xfb\x3b\x6e\xba\x6d\x2a\x68\x3f\x20\x79\xcb\x42\x85\x11\xf2\x0a\x06\xda\xec\xae\x85\x10\x33\xb8\xa6\x69\x96\xc0\x2c\x12\xe9\x41\xf1\xfc\x16\x0f\xb9\xe7\x5f\xf7\xc0\x9e\xbd\x0f\x16\x47\x3e\xee\x7d\x98\xba\x7f\x3d\xf5\x3f\xed\x7f\xb7\xf7\xef\x59\xeb\xf3\xfd\xa7\x07\x18\xda\x5b\xa0\xda\xc7\x0f\xd3\x12\xed\x66\x1f\x9f\xee\x7f\x57\x79\xb6\xbf\x0b\x09\xb7\x93\xa8\x52\x9a\x4d\x2f\x1a\x2b\xc6\x35\x8a\xb2\x4d\xd9\x58\x29\xcd\x76\xa9\x78\x0b\xb6\x7c\x43\xb3\xf7\xb0\x00\x09\x3c\xea\x36\x21\x1d\x6f\x7d\x42\xf6\x62\x73\x84\x63\x0e\xde\xbe\x17\x5e\x65\xf1\xd4\x1d\x64\xc5\x77\x9e\xbb\x17\x17\x1e\x6d\xc6\xe4\xd4\x22\xdd\x26\xa5\x28\xb9\x43\x59\x2f\x7b\xbd\x7d\x17\x10\xa7\x0d\xe2\xe4\xb4\x8c\xba\x1b\x61\xe8\x31\xc7\x91\x35\x78\xb5\x69\x10\x3d\x90\xbc\x9f\xec\xcb\x5b\x42\x7f\x3b\x07\x29\xd6\x39\xba\x07\x7f\x0f\xc5\x4f\xd6\xee\x32\xba\x9f\x9c\x35\x2a\x97\x7d\xa5\x8b\x1f\x4f\x5e\x58\x9c\x41\xc6\x84\x12\xe5\x4a\x24\xb1\x22\x39\x67\xbf\xe4\x40\x4e\x5e\x14\xd5\x87\x18\x8f\x92\x1c\xef\xed\xf9\xf1\xc7\x93\x17\x6a\x46\xc8\x3f\x20\xa2\x46\xaf\xbf\x6a\x09\xe1\xc4\x52\x7b\xef\xde\xbe\xfe\xdf\x68\x01\xc0\x2f\xdd\xb5\x19\xae\xb0\x48\xc2\xa8\xb5\x48\xd9\xc3\xd7\xf4\x6a\xa3\x1b\x71\x46\x11\xcd\x9a\x6d\x0c\xc4\xd9\xed\xb8\x0d\xd2\x5d\x41\x92\x29\x4c\x3e\x22\x2a\x97\x6e\x35\x66\x40\x9b\x05\x81\x69\xe8\xce\x71\xee\xf3\xa9\x30\x5f\x6d\x54\x5c\x74\x24\x38\x87\x08\x23\x13\x8c\x10\xda\x87\x43\x54\xdf\xdf\x14\xf0\x77\x4a\xb4\x9b\x01\xce\xe5\x98\x9e\x7f\x78\x03\xe9\xed\x13\xba\xa1\xc8\x77\x4e\x94\xc7\x19\x8f\xa0\x6a\xe7\x5b\x1c\x8d\xdf\x66\x0e\x0e\x6e\x77\xce\x12\xb6\xd6\x3b\x6a\x44\x6b\xb4\x44\x67\xf0\xfb\x0e\xdb\x75\x3d\x2c\x73\xcb\xb2\xb1\x91\xdb\x8a\x06\xd4\xc2\x9f\xbc\xa2\x8a\xcc\x01\x38\xda\x73\xad\xdd\x0e\xb8\xc3\x79\x28\xad\xad\x79\x36\xd5\x62\xda\xa0\x5f\x75\x40\xae\x1b\x6a\x2d\xe6\x83\xda\xda\x8e\x06\x1b\x04\xae\x56\xeb\x5d\x30\x50\xe5\xad\x3d\x5e\x7a\x1a\xec\xa5\x6e\xd6\xca\x6a\x73\x76\x46\xd6\xe2\xd8\xc6\xbf\xb6\xa7\x64\xd4\xed\x9a\xe1\x49\x0b\x74\x2f\xd6\xa8\x79\xc4\x1c\xed\x36\x9f\x81\xbc\x64\x3d\x84\x8f\xf7\xf5\xf7\x7b\xb1\x96\x57\xef\x4f\x8f\x31\x3f\xcf\x7c\xe0\xfd\x13\x88\xfd\x55\xa9\xe2\xf6\x3d\x3a\x91\x0d\x35\x3a\xba\x7b\x82\xce\x84\x1c\x3f\x48\x26\x85\x16\x91\xe8\x70\x3a\xb5\xa6\xcc\x20\x68\xdb\x72\x8c\x86\xf4\x31\x54\xde\xb0\x7c\xac\x96\x95\xa6\xb4\x90\x86\x5c\x6b\xbf\xe5\xf3\xe2\x4e\xac\xb2\x77\xa7\xf5\x91\xff\xfc\xf7\xd1\xff\x0b\x00\x00\xff\xff\xbd\xa3\xb8\x4f\x69\x56\x01\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x7b\xbc\x0b\x49\xe5\x73\x2d\x69\xa4\x07\x5d\x88\xe4\x1d\x8e\xe1\x4a\xa4\xad\x16\xae\x44\x0a\x57\x22\x85\x2b\x91\xc2\x95\x48\xa1\x94\x5f\x28\xe5\x57\x6d\x9f\x8d\x1f\x8f\x84\x52\x7e\x03\x3f\x0d\xa5\xfc\xba\x5a\x28\xe5\x17\x4a\xf9\x35\x8d\x1e\x4a\xf9\x85\x52\x7e\xc3\x06\x0e\xa5\xfc\x48\x28\xe5\x17\x4a\xf9\x7d\xc1\xa5\xfc\xc2\x95\x48\x5f\xc4\xbd\x20\xe1\x52\x90\x01\x63\x7f\x5e\x97\x82\x84\x2b\x91\x5a\x07\x09\x57\x22\x05\xd6\x17\xae\x44\xfa\xdd\x72\xbf\x70\x25\x52\x8f\x41\xc2\x95\x48\xe1\x4a\xa4\xd6\x16\xae\x44\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\x2b\x91\xc2\x95\x48\xe1\x4a\xa4\x62\xe4\x70\x25\x52\xb8\x12\x09\x5b\xb8\x12\xa9\xc7\x08\xe1\x4a\xa4\x2f\xf5\x4a\xa4\x5a\x5a\xd0\x97\x7b\x2f\xd2\xf0\x65\x84\xcb\x91\xc2\xe5\x48\x0d\x2d\x5c\x8e\x14\x2e\x47\xda\xd5\xc2\xe5\x48\xe1\x72\xa4\x96\x16\x0a\x21\xf6\x6c\xa1\x10\x62\xdf\x16\x0a\x21\x36\xb5\x50\x08\x71\xb3\x85\x42\x88\xa1\x10\x62\x28\x84\x18\x0a\x21\x6e\x0f\x18\x0a\x21\x86\x42\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\x28\x84\x18\x2e\x47\xfa\x2c\x6f\x16\x09\xd7\x8a\x74\xb4\xcf\xe7\x5a\x91\x70\x39\x52\xad\xf3\x70\x39\x52\x60\x61\xe1\x72\xa4\x2f\x8e\x8b\x85\xcb\x91\x76\x74\x1e\x2e\x47\x0a\x97\x23\x85\xcb\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\x97\x23\x85\xcb\x91\xc2\xe5\x48\xd8\xc2\xe5\x48\xe1\x72\xa4\x70\x39\xd2\xce\x8f\xe1\x1a\x2f\x37\x39\x16\x5c\x03\x6f\xcc\xb9\xe9\x8b\xce\x2f\x6b\xbd\x99\xd3\x75\xc1\x96\xb9\x74\x7a\xff\xf2\xfd\xe9\x31\x89\xa8\xa6\x89\x58\x92\x53\x11\x5b\xd3\x32\x7e\x51\xfc\x9c\x82\xa6\x31\xd5\xb4\xbc\x41\x25\x93\xe2\x92\xc5\xc8\x54\x63\xb8\x26\x2c\xa5\x4b\x30\xcc\xab\x71\x12\xb9\x02\x42\xc9\x15\x24\xc9\xf4\x82\x8b\x2b\x4e\x2e\x41\xaa\x0a\xbb\xfe\x24\xb2\xf4\x13\x51\x20\x2f\xed\x05\x43\x70\x9d\x19\x44\x63\xda\x9e\xfb\x7e\x26\xd5\xe1\xca\x20\xf5\x63\xfb\xf4\x0c\x83\x7a\xdb\xee\xea\x29\xd6\x8e\xcb\x34\x73\x7a\x6a\x04\xfb\xa7\x86\xa8\x73\xe5\x23\xea\x17\x2c\x81\xe9\x9c\x2a\x88\xfd\xb8\xca\xd0\x9a\x90\xb1\x9d\x5b\xae\x59\xc2\x7e\x05\x77\x9a\x00\xd5\xb9\x6c\xcc\x93\xe8\x21\x70\x74\x1b\x42\xa6\x7e\x1e\x2f\x58\x93\x11\xa3\x8f\xc1\x22\xa2\xd1\x0a\x5e\xb0\x56\x15\xbe\x86\x54\xc7\xee\x03\x6f\x92\xd8\x13\x99\x95\x83\xf6\x49\xcc\x24\x32\xa1\x35\x51\x5a\x48\x0f\xb9\x4c\xc2\x34\xa2\x49\x94\x27\xc8\x72\x8e\x4e\x4f\xec\xa0\xdd\xb7\x66\x75\x90\x52\xb9\xfe\x01\x93\xf7\x9f\xf8\xe9\xef\x9e\xf3\xf6\x6e\xa3\x00\x8a\xf6\xc8\x9b\x4c\x3b\x85\x54\xc8\xf5\x39\x95\x4b\xb8\x31\x09\xbf\xa9\xf4\xb5\x49\xc0\x7f\x78\xf5\xee\xcd\xcb\x37\xaf\x4f\xde\x9c\x9c\x3b\xbe\xec\x9d\x61\x9b\xa4\xed\xd4\x56\x6b\x61\x14\x0b\xed\xa6\x48\x12\x96\x32\x5d\x7c\x65\x69\xb0\x59\x65\xb6\x7c\x1b\x13\xe8\x72\xae\x59\x0a\xd6\xf3\x45\xb5\x36\x22\x8d\xa1\x8f\x14\x40\xe3\x35\x5d\x29\xbd\x00\xc3\x5c\xc9\x32\xa7\x92\x72\x0d\xfe\x28\x60\xda\x7e\x14\x0b\xa2\x84\x53\xe4\x99\x2a\xbd\x64\x0a\xb4\x4d\x1b\x3a\x15\xcd\x2c\x05\x7b\x58\xd1\x4b\x7b\x81\xd2\x42\x18\xfe\x6d\x36\x35\x15\x31\x5b\xb0\xc8\x5a\x86\x48\x4a\xe3\x22\xd5\xc5\x29\x16\x20\x8b\xe3\xaf\x5c\x70\x1b\xf5\x6d\x82\x19\xf8\x25\x93\x82\xa3\xc2\x74\x49\x25\xa3\xf3\x04\x0a\xff\x9f\x02\x6d\xc7\x2b\x17\xc4\xc9\x7c\xad\xa1\x99\x2d\xd9\x11\xdc\x6e\xb8\x0b\xb8\x9a\xfb\x7b\xd4\xd8\xcf\x79\x99\x93\x56\x0a\x2b\xe6\x7b\xe6\x92\x15\x62\x50\xcc\x31\x3f\x09\x71\x1e\x79\xd0\x09\x9d\x49\x66\xb5\x3f\x5a\x60\x8c\x63\xc6\x54\x91\x34\x37\x27\xb5\x91\x82\x94\x62\xf3\x04\x26\x46\xd6\x61\xcd\xc9\x34\x65\x1f\x73\x30\x50\xc6\x9e\x50\x02\xb9\x04\x83\x6f\x06\x8f\xad\xa8\x0b\x60\x04\x21\x81\x97\x60\x51\x2b\xce\x78\x97\xa9\x39\x8f\x23\xe7\x30\x3f\x59\x90\xb5\xc8\x65\x8d\xfd\xaf\xa8\xc1\x63\xa4\xde\xc6\x89\xb8\x04\x38\xe4\x41\x13\x12\x83\x51\x1c\x18\x37\x27\xd1\x52\x88\xd8\xe8\x0f\x52\x5c\xb3\x14\x47\x71\x04\x50\xec\xda\x7c\x4d\x62\x91\xcf\x93\x02\x4d\x0c\xcb\x77\xa7\x55\x46\xa3\x0b\x33\x07\xec\xb8\x2d\x75\xf1\x40\xa7\xd9\x01\xbe\xe5\xfe\xeb\xbe\x54\xb3\x9f\x95\xe0\xa5\xd3\xb9\x58\xd6\xac\xd7\xee\x32\x45\xe6\xa0\xf4\x14\x16\x0b\x21\xf5\xdf\xcc\xfe\xe6\x1c\x89\x86\x8b\x02\x80\x1e\x81\x30\xc0\x00\xa1\x8d\x29\x28\x75\xaa\x17\x72\x07\x03\xa9\xa0\x5e\x13\x0b\xcc\x0c\xbd\x4b\x7e\x48\xfe\xcf\xde\xbf\xff\xf8\xdb\x74\xff\xbb\xbd\xbd\x0f\xcf\xa6\x7f\xfd\xf8\xc7\xbd\x7f\xcf\xf0\x1f\x4f\xf7\xbf\xdb\xff\xcd\xff\xf1\xc7\xfd\xfd\xbd\xbd\x0f\x3f\xbc\x79\x75\x7e\xfa\xf2\x23\xdb\xff\xed\x03\xcf\xd3\x0b\xfb\xd7\x6f\x7b\x1f\xe0\xe5\xc7\x9e\x9d\xec\xef\x7f\xf7\x87\x86\x09\x51\xbe\x7e\xb7\x68\x25\xe2\x5e\xd9\xbb\xd3\x3e\xe7\x51\x4d\xa4\x63\x5c\x4f\x85\x9c\xda\x0f\x0e\x89\x96\xf9\x6e\x51\xd6\xc8\xbd\x5d\xae\xe1\xbe\xe7\xc1\xdb\x4a\x5f\x1b\x1e\x23\x77\x85\x9d\x33\x57\x9a\xd9\x14\x9c\x3d\xb3\xd2\xdd\xc2\x6c\xbb\x17\xfb\x9b\x8f\xb8\xb3\x1d\x3d\xa2\x3c\xef\xbe\x7c\xa2\x7c\xe4\xc3\x46\xff\x1b\x49\xb8\x96\xe3\xb7\x8d\xd5\x43\x46\x1a\x66\x82\xe9\xdc\xc2\x4c\x32\x21\x99\x5e\x1f\x27\x54\xa9\xb7\x34\x85\x9b\x6e\xc8\xc9\xa2\x54\xc3\x26\x86\x9e\xcd\xf9\xe3\x0e\x68\x17\x8a\xe2\x86\x6c\x06\xf8\xc9\x02\xf5\x90\x4a\x3f\x1e\xa8\xfe\xdb\x82\x30\x3d\x89\x0b\x49\x7e\x05\x29\xdc\x65\x86\x12\xac\x2e\xd3\x38\x82\xfb\xac\x7d\x1f\x5a\xc0\xa6\x20\xca\x11\x6c\x46\x3e\xba\x36\x1a\xc5\x82\x2d\x6f\x0a\xba\xb3\x5d\x9d\x92\x88\x72\xb3\x50\xbc\xa5\x73\x41\x3e\x25\xb0\xa4\xd1\xfa\x93\x59\xf0\x27\x09\x66\x8a\x46\x07\xfc\x64\x95\x83\x9a\xf8\xef\xa2\x7e\x98\x22\xc0\xf0\xe2\x56\xc6\x7f\xb6\x0a\xa3\xd7\xbe\x1b\x67\x22\xb1\xfe\x40\x26\xe2\x99\xd9\x83\xd9\xc6\x6a\x91\x85\x16\x0f\x0b\x51\xe2\xc3\xd3\x8f\x5b\x6f\x3a\x6b\xa6\x16\x56\xa9\xac\x12\x87\xcc\x91\xeb\xb7\xc9\x35\x1e\x20\xe4\x28\x4e\x19\x9a\x60\xc9\xde\xe9\xd9\xd1\x7e\x6d\xe5\x46\xca\xb1\xe7\x70\x2c\xc0\xc7\xdd\x98\x81\x54\x69\x4c\xc5\x33\x14\x53\x1c\x2d\x09\x63\x8e\xa3\x9f\x8b\x01\x30\xda\x57\x5b\xd2\x7a\xfd\x64\xcf\x8e\xc8\x27\x23\x21\x27\x8c\x83\xdd\x83\x4c\xb2\x4b\x96\xc0\xd2\xcc\xa4\x12\xc8\xe0\x5d\x32\xbb\xf7\x94\x29\x73\x4a\xd5\xd1\x3b\xc5\x1c\x5d\x8b\xd6\x2d\x78\xeb\x0e\x6e\x17\x53\x52\xb1\xee\x3d\x51\x38\x3d\x2f\x13\x97\xf2\x42\xed\x2d\x44\x07\xbe\x10\x32\x32\xa7\xf9\x0e\x38\x6a\x97\xc4\x6e\x40\xd3\x2e\x70\xa2\xf9\xa7\xd0\x22\xa9\x32\xb4\x57\xeb\xf0\x8a\x56\x2a\x05\xcc\xc8\x3b\x83\x84\x57\x4c\xc1\xa4\x90\x7a\x77\x76\xe1\x31\xfc\x8a\x36\xcb\x89\x95\x6e\xcf\xf0\x9f\x6b\xeb\x6d\x72\xe6\x18\x44\x77\x94\xa3\x9a\xe8\x85\x48\x50\x86\x6f\x30\x6e\xbf\x62\xb1\x15\x7d\x40\x4a\x21\x67\x36\x95\xdf\xea\xc1\x22\x89\x5b\x4e\xc9\x42\x1d\x37\x22\x0b\x1a\x9b\x2c\x7e\x71\xe4\x60\x0e\x6d\x76\x83\xb9\x01\x37\xea\xf2\xaa\x16\xc5\x12\x5a\x04\xa2\x37\x02\xf3\xff\x6d\x91\x0d\xb3\x0c\x3a\x17\xb9\xb6\xf8\x60\xd9\xc7\x42\xe4\x3c\x26\x86\x33\x1e\x92\x95\xd6\x99\x3a\x3c\x38\x28\x8f\xee\x19\x13\x07\xb1\x88\xd4\x41\x24\x78\x04\x99\x56\x07\x9e\x90\x0f\x32\x11\x4f\xfd\x1f\x53\xea\xe9\xf0\x60\x2c\xe3\x24\x04\x78\xde\x72\x9b\xe7\x94\xd8\xd5\xb6\xbc\x50\x02\x73\xe7\x4b\x5a\x24\x2e\x62\xb2\xf1\x5c\xac\xdf\xf1\x5a\xbe\x5f\xdc\x41\x5b\x08\xfe\x15\x46\xfa\x44\x55\xbb\x6e\x3f\x39\xda\x2c\xcb\x1d\xb6\xe4\xfe\xa6\xd9\x73\xcf\x4b\x8d\x34\x5c\xae\x02\xa5\x20\xad\x29\x5e\x4f\x6b\xd4\x25\xfb\xc4\xb0\x41\xbe\x26\x86\x55\x6b\x77\x65\xb2\x35\x49\xb6\x69\xf6\x2b\x23\x37\x61\x0d\x8b\x6f\x0a\xb7\xdb\x04\x16\x0b\x88\xf4\xb7\x15\x33\x51\x51\x85\xa1\x70\x6b\x7d\xe3\xff\xf5\x6d\xf3\x29\xdf\xcb\x03\xd5\x2f\xfc\xc4\x4e\xa9\xdd\xf6\x3d\xcc\xe6\xfd\x12\x7b\xdc\x90\x5f\x2c\xf0\xec\x60\xa8\xde\xa3\x6f\xda\x19\x52\xad\x57\xc2\xc9\x85\x49\x52\x7b\xb9\x33\x00\x03\xf9\x4d\xe5\x40\x70\x26\xd8\xd2\x1b\x08\xe4\xad\x70\xe5\x6c\x60\x42\x4e\xf1\xca\xe0\xf2\x17\x3c\x91\xdf\x0a\x5b\xd8\xa6\xa3\x52\x49\x4f\x83\x6d\x67\xfc\xce\x30\x78\xfe\x50\x86\xf3\x58\xc0\xd4\xc2\x79\x4a\xc2\xaa\xfa\xc1\x5a\x01\x7b\x01\xeb\x4e\xa8\xba\xc3\xcf\x85\x12\xa1\x9f\x69\x52\xe2\xa8\xd7\x0c\x6c\xa4\xc4\xdf\x5c\xf5\x03\x91\xce\x19\xb7\x53\xb1\x03\xfb\x7d\xc6\xb1\xfd\x7e\xf0\x18\xff\xec\x9e\x44\x4f\x68\xf7\x8b\x29\x1a\x06\xf2\x77\x03\xe2\x85\x0a\xcf\x73\x17\x48\x77\xc5\x05\x55\x82\x81\x5e\xfe\x92\xd3\x64\x46\x5e\x58\xf1\x1a\x81\x67\x7f\xea\x22\x37\xdb\xc5\x96\x3f\xfe\x8a\x25\x71\x44\x65\x8c\x9a\x95\x65\x3f\x44\x09\x8b\x38\xd4\x4b\x6f\x1d\x7d\x7b\x06\x58\x22\x8f\xbd\xcc\x9b\x64\x54\x6a\x16\xe5\x09\x95\x86\xe1\xc3\x52\xc8\x8e\x78\xf4\x9e\x9b\x59\x62\xf3\x19\x44\x82\xc7\x1d\x9e\xc3\x61\xbb\x7a\xbe\xd9\x79\x75\x7b\x51\x6e\x03\xc9\x5c\x45\x15\x96\xc2\x26\x79\xed\xd5\xb4\xe2\x8e\xb1\xc4\xc2\x33\xbb\x82\xb7\x4c\xac\x70\x65\xc4\xb8\x6a\xe1\x27\xa6\x7c\xb4\xff\x7e\xe5\xc0\x29\xa8\x7d\x46\xfe\xb1\xf6\x3a\x57\x57\x08\x12\xd3\xde\x0f\x85\x66\x1c\x37\x5f\x47\x8a\x6e\x27\x4b\x36\xb2\x10\x12\x2e\x41\x92\xbd\x58\xe0\x37\x58\xc0\x69\x7f\x46\xfe\x65\x94\xc1\x36\x37\x8c\x6d\x1c\x96\xb6\x04\x90\x23\xec\x22\x09\x43\x02\xda\xed\xa9\x22\xcf\xc8\x9e\xad\x0a\xc5\xd2\x14\x62\x46\x35\x24\xeb\x7d\x2f\x7d\x5b\xb3\x5a\x1f\xac\xe9\x53\x2c\xad\x52\x24\xed\xeb\x3f\xb7\xbc\x89\x93\xbd\x4d\xa4\xfa\xc9\x9b\x9b\x4b\xc0\x5a\x49\x7a\x03\x7b\x0a\x2f\x66\x67\x90\x42\x63\x44\xda\xa4\xe4\x35\x15\x51\xd7\xf3\xe6\x02\xb7\x7e\x36\x08\x4a\x89\x84\x25\xd2\xa7\xa5\xb9\x1b\x50\x27\x8b\x76\x97\x7b\xeb\x10\x42\xda\x3d\x52\x53\x62\x74\xc1\xaf\xff\x1c\x53\x4d\x1b\x5e\xb0\x28\xb3\xce\x76\x91\x5a\x97\x6c\x53\x76\xde\xb4\xd7\x3d\x5c\x2f\x6e\xf8\x51\x3d\xa0\x52\xb3\xeb\xcb\x3e\xd8\x75\x82\xb6\x69\x1b\x2b\xe9\xd1\x60\x2a\x61\xc9\x94\x96\xeb\x8a\x03\xc2\xb9\x30\x05\x61\x5c\x69\xca\x35\x43\x56\x4d\xfc\x9b\x53\x67\x7c\xbf\x62\xba\x21\x0c\xf0\x9d\xd1\xdd\xd1\xb4\x8b\x99\x38\xd6\xf8\x71\xbe\xce\x80\xfc\xbd\xf2\xc7\x2b\x99\x45\xbb\xbf\x3f\x59\x10\xc7\x40\x2d\x6e\xd2\x38\x96\xa0\xb6\x39\xdb\xae\xaf\x5b\xc1\xe7\x8d\x55\x63\x21\x78\xea\x8d\x5d\xae\x46\xa0\x52\x6c\x69\x94\x14\x5f\x1f\xd2\xfb\x72\x6a\xca\x8a\xf9\xd5\x0d\x6c\x3d\xb3\x90\x16\x27\x26\xd3\x5e\x1d\x8c\x04\x57\x79\x5a\x5a\x11\x62\xc8\x80\xc7\xc0\xa3\x35\x96\x84\x4a\x2e\xa1\x21\x8c\xe7\x47\xd5\x80\x12\x84\xfc\x2f\xb6\x34\x6a\xb7\x9b\x5c\x55\x72\xf6\xde\xe9\x8d\x99\x32\x65\x00\xbf\x00\x69\x94\x7f\xcc\xdc\x31\x42\xaf\xef\xa1\xe2\x85\x74\x35\xaa\x7c\x50\xe9\xe6\x64\xb1\x50\xe0\xee\xe9\x9e\x17\xd5\x2d\xbd\xbf\xc2\xc3\xd4\x72\x20\x03\x8e\xa5\xb0\xde\xfc\x4c\x28\xe6\xcb\xc1\x15\xe7\x42\xad\x42\xa6\x58\xd8\xfa\x95\xcd\x63\xd5\xb3\xdc\x30\x10\x7b\x63\xd1\x68\x7b\xcb\xb9\xdd\x4c\xa8\x5a\x34\x3d\x2f\x6c\xa8\xc1\x79\xbe\xbd\xd5\x45\x14\x0d\xa6\xc6\xd5\x97\x56\x9e\x65\x92\xf2\x0b\x88\x49\x02\xd7\x2c\x12\x4b\x49\xb3\x15\x8b\xb0\xd8\xa1\x75\xf5\x1a\x8d\x51\xdb\x10\xaa\x66\x0c\x6f\x3a\xbd\xb2\x7c\x9e\x30\xb5\xda\xed\x34\x6c\x25\x0e\x05\x91\x04\xbd\x93\xf3\xf5\xa1\x8d\x33\xfb\x79\x29\xfc\xf8\x80\x77\xd7\xaf\xcb\x17\xb1\xd8\xee\x13\x4b\x69\x14\x19\xc2\xf6\x0e\x50\x70\x92\x60\x85\x88\x1a\x38\x84\xf6\x7e\x26\xd3\xcb\x05\x40\x66\xf1\x19\x03\xd5\x54\x8a\xb6\x45\xc5\x78\x04\x58\xbc\xd1\x15\xe1\x04\xf0\x3e\x00\x2d\x19\x58\x09\x16\xd0\xeb\xe7\x77\x11\xb8\xde\x2d\x71\xb6\x1b\x11\x5a\x0c\x08\xed\x10\x2f\x78\x61\x27\xd0\x2b\x3c\xd4\x0b\x05\xe6\xdf\x06\xbc\xf8\x64\xe8\x66\xdb\x5a\x9d\x67\x36\x14\x7c\x34\x3f\xfc\xb1\xd6\x8b\x8b\xe1\x52\x64\x25\xae\xdc\x00\x9b\x1c\xc3\x59\xe5\x3c\x1a\xc4\x4c\x45\x86\xcd\x34\x18\x8e\x8e\x05\x57\xbe\x36\x27\xe5\xb6\x9c\xe6\x25\x4d\x5c\x82\xac\x1b\x2c\x13\x09\xfa\x41\xe3\xdc\xeb\xab\x36\xf5\x08\xd2\x39\xc4\x31\xc4\x3e\xde\x7d\x4d\x1a\x0e\xfd\x0e\x81\xa3\x4b\x26\xf0\xc7\xe2\xa9\x48\x92\xf6\x33\xbd\xd5\xb0\xd2\xc7\xac\xe2\x01\xd0\x3b\xce\xa4\x43\xcc\x3c\xf1\x00\x65\xaa\xa0\xc8\xd2\x11\x8d\x48\x66\x14\x96\x02\xee\x73\xd0\x57\x00\x9c\x44\x2b\x88\x2e\x54\x19\x63\xa7\x0d\x1d\x6e\x6c\xb4\x8b\xa1\x6a\x17\x10\xab\x1c\xb4\x10\x4c\xcd\x86\xba\x24\x77\x20\xcc\xa8\x85\x1c\xae\x36\x63\xb2\xb6\x0f\x2e\x7a\x49\x59\x42\xe7\x49\x87\xc2\x7c\xb2\x28\xdf\x9c\x54\xe7\xcf\xbc\x74\x94\xe5\x49\xe2\xbc\xd2\x18\xa5\xa2\x25\x5d\x2c\x58\x84\x41\x8a\x18\xa5\x53\x46\xf5\xee\x5c\xfa\xa8\xc8\x1c\xa5\xa9\xce\xb7\xb6\xbe\x05\x6f\xda\xf0\xc5\x68\xa1\xac\xd1\xde\xda\x07\x43\xde\xd7\x35\x58\x33\x3b\xb0\x2a\x7a\xcd\xa1\x35\x23\x6f\x85\x76\xd1\x6e\x6f\x40\x29\x17\x69\x47\xde\x03\x55\x82\x57\x8e\x02\xd4\x3c\x24\x5b\x32\x4e\x77\x57\x29\xb0\xeb\xaf\x5a\xcc\x0b\x45\x93\xae\xb1\x78\x31\x5b\x4a\xaa\x0b\x0e\x5e\x2e\xd1\x1d\x9a\x4e\x2c\x58\xe4\x18\xf1\x46\x8e\xf8\x1a\xd1\xc6\x85\xc0\xed\xb6\xa9\x32\xae\xa5\x88\xf3\x08\x5c\x99\xe6\x5c\x55\x3b\xbe\xd5\x73\xa0\x1e\xfe\xe5\xc7\x28\xd3\x09\x62\xd0\x94\x39\x7f\xb5\xe0\x40\xa8\xca\x8c\x96\xef\xb1\x3d\x97\x12\x4f\x54\xbf\x0f\x78\xd8\x1d\x9d\x9e\x90\xf7\xd0\x86\x74\x9d\x7c\xa7\x2b\xbe\x6f\x4a\x12\xaa\xf4\xb9\xa4\x5c\xe1\x84\xcf\x59\xda\x64\xa2\x30\x9a\x15\x62\x40\xe3\x73\x89\x58\xd1\xf8\xd8\xa2\x40\xe3\xe3\x06\xee\xdd\x87\x73\x6e\xaf\xe1\x36\xac\xfd\xdb\xbd\x96\xe9\x91\x46\x2e\xf1\xb6\x9e\x02\xa3\x0c\x27\x71\x6f\x83\x2b\x65\x6d\xb6\xda\xa1\x3e\xe6\xba\xa0\xba\xdd\xc6\x40\x30\xd0\xa6\xd4\xd2\xaf\xbc\x6f\x30\xe7\x31\xc8\x04\x7d\x6e\xe5\x78\xd1\xca\x08\xc9\xf1\xcc\x29\xff\xb4\xb0\xe3\x60\x98\xab\xf3\x2c\x96\x4e\x03\x1b\x30\xe7\x7b\x34\xd8\xe5\x6a\x88\xdb\x6e\x90\xc9\x46\x11\x64\xba\x9d\xcb\xf6\xb2\xc9\x79\xc3\x8a\x11\x12\xa6\xba\x19\xab\x1c\x4e\xdd\xc6\x7e\xb9\xae\x6c\x4c\xca\x2a\x4f\xa9\x61\x50\x34\xc6\x00\xb9\xe2\x99\xd5\x91\xac\x4e\x63\x29\xd2\x3a\xee\xac\xe3\xc5\x6f\x5f\xe7\x0e\x39\xa6\x45\x8b\x54\xfb\x0e\x6b\x49\x2f\x98\xa5\xf4\xfa\x35\xf0\xa5\x5e\x1d\x92\x3f\x7d\xf5\x3f\xbf\xfe\x4b\xc3\x8b\x62\x6e\x63\xda\x5e\x01\x77\x56\xa2\xdb\x80\xde\x76\xaf\x9b\x66\xce\x99\x0f\xc5\x9e\x2d\xcb\x77\x0a\x87\x42\x89\x95\xe8\x84\x06\xed\xf8\x76\x9e\xb5\x83\xf3\x7b\x4c\x26\x50\x9a\xf2\x08\x26\x46\x1c\xd8\x39\x8c\x51\x65\x2d\x8f\x4c\xd6\xe4\xf9\x57\x13\x0c\xf1\xc4\x49\x59\xea\x9a\x95\x6c\xfd\xc3\xf5\xc7\xd9\x8e\xc5\x30\x45\xfe\x3a\xd9\x98\x29\x53\xc4\xec\xbd\x58\x20\x9a\xb6\x4c\x12\xd5\x3e\x09\x96\x67\x7b\x23\xc0\x36\xcf\x86\x62\x25\x5d\x98\xd0\x65\x9b\xec\x67\x97\x4c\x19\x67\x69\x9e\x1e\x92\x67\x0d\xaf\x58\x8e\x7c\x1b\xe8\x61\x7b\x2a\xcf\x33\x6a\xd8\xf2\x52\xd2\x34\xc5\x8c\x2b\x16\x03\xd7\x6c\xc1\x30\xe6\xa5\x20\x31\xd4\xe3\xed\x87\x3e\x4e\xab\x00\x3e\x86\x70\x19\x36\xda\x8b\xe8\x4e\xed\x39\x2e\x51\x28\x75\x5e\xbb\xa8\xca\x79\xd7\x19\x58\xaa\xb4\x6a\x03\x81\xeb\xcc\x4a\x72\x15\xff\x51\x0a\x94\x33\xbe\x54\x65\xb4\x25\xf2\xbf\x36\xf3\xb8\xf9\xec\x6a\x05\x2e\xba\x01\xaa\xde\x41\x5f\x2a\xc8\x88\x92\x65\x90\x31\x06\x9e\xb7\xb3\x8f\x6d\x5b\xac\x91\xba\x52\x48\x8e\xa9\x82\x1e\x76\xd7\x4a\x2c\xa6\xbf\x56\xa1\x48\x0e\xbe\x35\x06\xf4\xfc\xd9\x57\xad\x78\x57\xbc\xd7\xf8\x52\x19\xa5\xf9\xe1\x68\xfa\x2f\x3a\xfd\xf5\xe3\x9e\xfb\xc7\xb3\xe9\x5f\xff\xef\xe4\xf0\xe3\xd3\xca\x9f\x1f\x9b\x83\x2b\x77\x4b\xce\x65\xab\xe1\xb0\x3b\x6b\xbd\x58\xe5\xf1\x63\xe2\x83\xb9\xce\x65\x0e\x13\xf2\x3d\x4d\x14\x4c\xc8\x8f\x1c\xcf\xc9\x1b\x02\xad\x3d\xba\xc2\x48\x36\x8f\xcd\xa8\x8f\xdb\x5f\xc1\x29\xb5\xbf\xe3\xa6\xdb\xa6\x82\xf6\x03\x92\xb7\x2c\x54\x18\x21\xaf\x60\xa0\xcd\xee\x5a\x08\x31\x83\x6b\x9a\x66\x09\xcc\x22\x91\x1e\x14\xcf\x6f\xf1\x90\x7b\xfe\x75\x0f\xec\xd9\xfb\x60\x71\xe4\xe3\xde\x87\xa9\xfb\xd7\x53\xff\xd3\xfe\x77\x7b\xff\x9e\xb5\x3e\xdf\x7f\x7a\x80\xa1\xbd\x05\xaa\x7d\xfc\x30\x2d\xd1\x6e\xf6\xf1\xe9\xfe\x77\x95\x67\xfb\xbb\x90\x70\x3b\x89\x2a\xa5\xd9\xf4\xa2\xb1\x62\x5c\xa3\x28\xdb\x94\x8d\x95\xd2\x6c\x97\x8a\xb7\x60\xcb\x37\x34\x7b\x0f\x0b\x90\xc0\xa3\x6e\x13\xd2\xf1\xd6\x27\x64\x2f\x36\x47\x38\xe6\xe0\xed\x7b\xe1\x55\x16\x4f\xdd\x41\x56\x7c\xe7\xb9\x7b\x71\xe1\xd1\x66\x4c\x4e\x2d\xd2\x6d\x52\x8a\x92\x3b\x94\xf5\xb2\xd7\xdb\x77\x01\x71\xda\x20\x4e\x4e\xcb\xa8\xbb\x11\x86\x1e\x73\x1c\x59\x83\x57\x9b\x06\xd1\x03\xc9\xfb\xc9\xbe\xbc\x25\xf4\xb7\x73\x90\x62\x9d\xa3\x7b\xf0\xf7\x50\xfc\x64\xed\x2e\xa3\xfb\xc9\x59\xa3\x72\xd9\x57\xba\xf8\xf1\xe4\x85\xc5\x19\x64\x4c\x28\x51\xae\x44\x12\x2b\x92\x73\xf6\x4b\x0e\xe4\xe4\x45\x51\x7d\x88\xf1\x28\xc9\xf1\xde\x9e\x1f\x7f\x3c\x79\xa1\x66\x84\xfc\x03\x22\x6a\xf4\xfa\xab\x96\x10\x4e\x2c\xb5\xf7\xee\xed\xeb\xff\x8d\x16\x00\xfc\xd2\x5d\x9b\xe1\x0a\x8b\x24\x8c\x5a\x8b\x94\x3d\x7c\x4d\xaf\x36\xba\x11\x67\x14\xd1\xac\xd9\xc6\x40\x9c\xdd\x8e\xdb\x20\xdd\x15\x24\x99\xc2\xe4\x23\xa2\x72\xe9\x56\x63\x06\xb4\x59\x10\x98\x86\xee\x1c\xe7\x3e\x9f\x0a\xf3\xd5\x46\xc5\x45\x47\x82\x73\x88\x30\x32\xc1\x08\xa1\x7d\x38\x44\xf5\xfd\x4d\x01\x7f\xa7\x44\xbb\x19\xe0\x5c\x8e\xe9\xf9\x87\x37\x90\xde\x3e\xa1\x1b\x8a\x7c\xe7\x44\x79\x9c\xf1\x08\xaa\x76\xbe\xc5\xd1\xf8\x6d\xe6\xe0\xe0\x76\xe7\x2c\x61\x6b\xbd\xa3\x46\xb4\x46\x4b\x74\x06\xbf\xef\xb0\x5d\xd7\xc3\x32\xb7\x2c\x1b\x1b\xb9\xad\x68\x40\x2d\xfc\xc9\x2b\xaa\xc8\x1c\x80\xa3\x3d\xd7\xda\xed\x80\x3b\x9c\x87\xd2\xda\x9a\x67\x53\x2d\xa6\x0d\xfa\x55\x07\xe4\xba\xa1\xd6\x62\x3e\xa8\xad\xed\x68\xb0\x41\xe0\x6a\xb5\xde\x05\x03\x55\xde\xda\xe3\xa5\xa7\xc1\x5e\xea\x66\xad\xac\x36\x67\x67\x64\x2d\x8e\x6d\xfc\x6b\x7b\x4a\x46\xdd\xae\x19\x9e\xb4\x40\xf7\x62\x8d\x9a\x47\xcc\xd1\x6e\xf3\x19\xc8\x4b\xd6\x43\xf8\x78\x5f\x7f\xbf\x17\x6b\x79\xf5\xfe\xf4\x18\xf3\xf3\xcc\x07\xde\x3f\x81\xd8\x5f\x95\x2a\x6e\xdf\xa3\x13\xd9\x50\xa3\xa3\xbb\x27\xe8\x4c\xc8\xf1\x83\x64\x52\x68\x11\x89\x0e\xa7\x53\x6b\xca\x0c\x82\xb6\x2d\xc7\x68\x48\x1f\x43\xe5\x0d\xcb\xc7\x6a\x59\x69\x4a\x0b\x69\xc8\xb5\xf6\x5b\x3e\x2f\xee\xc4\x2a\x7b\x77\x5a\x1f\xf9\xcf\x7f\x1f\xfd\xbf\x00\x00\x00\xff\xff\x78\xea\x72\xfc\x70\x56\x01\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -105,7 +105,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\x23\xb9\x95\x2f\xf8\xbf\x3f\x05\x42\xf6\xac\xa4\x31\x49\x55\xd9\x63\xef\x4c\xdd\xd9\x71\xe8\xaa\xd4\xdd\xda\xee\x52\x29\x24\xb9\xbc\x8e\x9e\xbe\x36\x98\x79\x48\x62\x94\x09\xe4\x00\x48\xaa\xe8\xdb\xf7\xbb\x6f\xe0\x00\xc8\x07\x1f\x12\x99\x80\x44\x56\x75\xc2\x11\xee\x12\x99\x04\x4e\xe2\x71\x70\x9e\xbf\x43\x0b\xf6\x09\xa4\x62\x82\xbf\x23\xb4\x60\xf0\x59\x03\x37\x7f\xa9\xd1\xc3\xbf\xaa\x11\x13\x67\xf3\xb7\xbf\x7a\x60\x3c\x7d\x47\x2e\x4a\xa5\x45\x7e\x0b\x4a\x94\x32\x81\xf7\x30\x61\x9c\x69\x26\xf8\xaf\x72\xd0\x34\xa5\x9a\xbe\xfb\x15\x21\x94\x73\xa1\xa9\xf9\x58\x99\x3f\x09\x49\x04\xd7\x52\x64\x19\xc8\xe1\x14\xf8\xe8\xa1\x1c\xc3\xb8\x64\x59\x0a\x12\x3b\xf7\x43\xcf\xdf\x8c\xde\xfe\xeb\xe8\xcd\xaf\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x73\x96\x80\x7b\x4c\x8d\x44\x01\x92\x6a\x21\xd5\x28\x11\x12\x84\xf9\x4f\xfe\x2b\x55\x40\x62\x06\x9b\x4a\x51\x16\xef\xc8\xda\x67\x6c\xbf\x9e\x26\xaa\x61\x2a\x24\xf3\x7f\x13\x32\x24\x22\xcb\xf1\xdf\xee\x5d\xed\xf0\x77\x76\x78\x37\x41\xf8\x7d\xc6\x94\xfe\x7e\xf3\x33\x3f\x30\xa5\xf1\xb9\x22\x2b\x25\xcd\x36\xbd\x08\x3e\xa2\x66\x42\xea\xeb\x9a\x2c\x43\x46\xa2\xe6\xcd\x7f\xbb\x07\x19\x9f\x96\x19\x95\x1b\x7a\xfb\x15\x21\x2a\x11\x05\xbc\x23\xd8\x59\x41\x13\x48\x7f\x45\x88\x1f\xcb\x76\x3e\x24\x34\x4d\x71\xbd\x68\x76\x23\x19\xd7\x20\x2f\x44\x56\xe6\xbc\x1a\xdc\x3c\x93\x82\x4a\x24\x2b\x34\xae\xc9\xfd\x0c\x70\xd6\x88\x98\x10\x3d\x03\x72\x71\xf7\xa9\x7a\x94\x90\xff\x52\x82\xdf\x50\x3d\x7b\x47\x46\x66\x01\x46\x29\x53\x45\x46\x17\x86\x84\xc6\x53\x76\x35\xdf\xdb\xef\x1a\x9f\xeb\x85\xa1\x57\x69\xc9\xf8\xf4\xa9\xf1\xdd\x4b\x6c\x47\xc2\xbc\xb1\x4e\xcd\xe1\x3f\xad\x7c\xbe\xed\xf0\xfe\xf5\xa9\x19\x99\xe8\x19\xd5\x44\xcf\x98\x22\x82\x03\x91\x50\x64\x34\x01\xf5\x04\x41\x6b\x1e\xb1\x14\xdd\xae\x7e\xb1\x81\xa4\x66\x97\x9a\xea\x52\x8d\x8a\x19\x55\xab\x53\x7c\xb3\xf4\xe9\x9a\xee\xec\x83\xf3\xb7\x34\x2b\x66\xf4\xad\xfb\x50\x25\x33\xc8\x69\xbd\x07\x44\x01\xfc\xfc\xe6\xea\xd3\xef\xef\x96\xbe\x20\xed\xd9\x59\xbb\xfb\x09\x53\x66\xaa\x90\x51\x10\xcf\x29\x70\xed\x16\x05\x90\xbf\xaf\xfd\xcd\x5d\x01\xc9\xdf\x47\x2b\x94\x8b\xf1\x7f\x41\xa2\x1b\x1f\x4b\xf8\xef\x92\x49\x48\x9b\x14\x99\x09\xf2\xdc\x67\xe9\x63\x33\xff\x8d\x8f\x0a\x69\xd8\x82\x6e\x1c\x79\xdb\x1a\xec\xaf\xf5\xf9\xd2\xdb\xfe\x3c\x5c\xfa\x96\x10\x33\x49\xee\xad\x53\xc3\x0b\x41\xe1\x0e\x75\x7b\x10\x52\x37\xb3\x76\xe7\x32\x65\xb6\x8b\x04\x05\xdc\x72\x47\xdc\x54\xdc\xbd\xe5\x68\xa5\x73\x33\x45\x20\x95\x61\x11\x65\x96\x1a\x26\x3a\x07\xa9\x89\x84\x44\x4c\x39\xfb\x47\xd5\xbb\x22\x5a\xe0\xb0\x19\xd5\xa0\x34\xc1\x73\xcd\x69\x46\xe6\x34\x2b\x61\x40\x28\x4f\x57\xfa\xce\xe9\x82\x48\x30\xe3\x92\x92\x37\x7a\xc4\x9f\xa8\x55\x5a\x3e\x08\x09\x84\xf1\x89\x78\x47\x66\x5a\x17\xea\xdd\xd9\xd9\x94\x69\x7f\x3d\x24\x22\xcf\x4b\xce\xf4\xe2\x0c\x39\x3d\x1b\x97\x86\xf5\x9e\xa5\x30\x87\xec\x4c\xb1\xe9\x90\xca\x64\xc6\x34\x24\xba\x94\x70\x46\x0b\x36\xc4\x97\xe1\x78\x45\x8c\xf2\xf4\xd7\xd2\x6d\x13\xb5\x34\xf0\xda\xf3\x40\x3c\x87\xde\x71\xb1\x0c\xc7\xb6\x9b\xd3\x76\x68\x5f\xb6\x5e\x13\xf3\x91\x99\xc6\xdb\xcb\xbb\x7b\xe2\x29\x72\x47\x1d\x97\xa8\x7e\x74\xcd\x0c\xf9\xd5\x32\x33\xcb\xf8\x04\xa4\xfd\xe5\x44\x8a\x1c\x7b\x05\x9e\x16\x82\x71\x8d\x7f\x24\x19\x03\xae\x89\x2a\xc7\x39\xd3\x0a\xb7\x35\x28\x6d\x16\x72\xb5\xe3\x0b\xbc\x4e\xc9\x18\x48\x59\xa4\x54\x43\xba\xfa\xc8\x15\x27\x17\x34\x87\xec\x82\x2a\x78\xf5\xb5\x33\x6b\xa4\x86\x66\x41\xb6\x5e\xbd\xa6\xb0\xb0\xfa\x83\x95\x53\x4f\x88\xbf\xdd\x77\x59\xee\x8d\x8c\x86\xa4\x90\x64\x54\x5a\x01\x85\x68\xc8\x32\xf2\xf1\x87\x0f\x64\x26\x1e\xcd\x41\x62\x5c\x69\x9a\x65\x78\x30\x9d\x10\xb1\xd2\x35\xde\x01\x09\xe5\x24\xa7\x9c\x4e\x81\xd0\xa2\x50\x64\x22\x24\xa1\x64\xca\xe6\xc0\x3d\x03\x58\x5e\x8b\x8d\xef\xb7\x89\xb3\x11\x7b\x23\xad\xbd\x55\xfd\xb7\x8e\xe0\xa5\x6f\x36\xf1\x3a\xd3\x56\xe4\xb3\xdd\x26\xd6\xb4\xf3\xba\x0b\x3c\x52\x9c\x94\x5c\x69\x59\xe2\x2e\x49\xc9\x03\x2c\xdc\xe9\xca\x69\x41\x94\x16\xe6\xc3\x47\xa6\x67\x84\x36\x4f\x16\xd5\x78\x5c\xc6\xab\xaf\x65\x9a\x02\x4d\xc6\x0b\x62\xa4\x51\x64\x67\x5a\x88\x0c\x79\x1d\xf6\x67\xd8\x1a\x91\xa0\x25\x83\x39\x10\x2a\xc7\x4c\x4b\x2a\x17\xd5\xde\x5a\x3d\x07\x4f\xce\x3f\xce\x4b\x43\x38\xda\x3c\x7b\xe4\xa9\x9d\x4d\xec\x75\xe2\x64\xb3\xb4\x92\x8f\xbb\x4f\xf4\xcd\x95\xdb\xc1\xb5\xb0\xad\xdc\x0e\x06\x45\xcc\x4e\x75\x62\x51\x25\xb5\x23\x01\x6e\x6b\xa6\x44\xc8\x6a\x6f\x91\xf1\x62\xed\x18\x8d\xad\x4e\xc6\x60\xd8\xa0\xa4\xdc\x4c\xfd\xda\x23\xd4\x61\x62\x9f\xda\x8c\xa6\x89\x47\xbe\x6e\xe7\x37\xfb\xa6\x52\xd2\xf5\xd4\x13\xc2\x34\xe4\x1b\x7a\x26\xcb\xd3\xdc\x9c\xcf\xea\x63\x43\xe0\x9c\xa5\x60\x26\x56\x53\x66\x77\x99\xe1\x09\x74\x2c\x4a\x6d\xe7\xd3\x3d\x92\x92\x39\xa3\x84\x4e\xa7\x12\xa6\xb8\xff\x37\x0e\xfb\xcc\x9c\xd8\xb6\xf9\xd8\xd7\x6d\x68\x95\x9a\x27\x9f\x30\xec\xf7\xc9\x07\xf8\x3a\xe6\xd1\x7c\x60\x55\x6e\x6e\xb7\xe7\xd6\xd0\x36\x9a\x98\x39\xf1\x53\x2b\xe4\x93\x0f\x6f\xb3\xb6\xb6\x3d\xb3\xc2\xb6\xb5\xd7\x79\x89\x10\xf7\xed\xd8\x9c\x99\xfa\x02\x30\x9c\x03\x1f\xac\x59\xfa\x18\x48\x01\x72\x22\x64\x6e\x0e\x0f\x27\x94\x24\x56\x94\xad\xf8\x16\x32\x5c\x9e\x3c\x35\x9d\x64\xdb\xf5\xb7\x6d\x9b\x5d\x60\xdb\x90\x14\x54\xcf\x9e\x79\x6c\xbb\xa5\xb2\xad\x39\x69\xcf\x3e\xfc\x0c\xe3\x5b\xe9\xbb\xbe\xb7\xa2\xf7\x6d\xa6\x21\x7a\xa7\x78\x65\x6d\xd3\xeb\x36\x9c\x7b\xb9\xdd\xd2\xc7\x0f\xa0\x94\x91\x17\x50\x08\x95\xf4\x91\x00\x4f\x84\xe1\x29\xff\xef\xdd\xc7\x6b\x3b\xfa\x3a\xee\xba\xda\xae\x34\x61\x79\x91\x41\x6e\x64\x51\xf2\xe3\x07\x2a\xd5\x8c\x66\x20\x7f\xc2\x5b\xf1\xc7\x3f\xf3\xbc\xfd\x49\x42\x37\x1f\xec\x66\x33\x42\xa6\x82\xd4\xb0\xbf\x14\x32\xba\xb0\x84\xa5\x90\x88\xd4\x5c\x0b\x42\x92\xc2\x28\x0b\x79\x51\x6a\x20\xd4\x7e\x8b\xef\xc0\xf8\x74\x1b\xca\x77\x5a\x0d\x62\x44\xaa\x9c\xea\x77\x64\xbc\xd0\xcf\x9d\x36\x42\x3e\x0f\xd3\x6d\xd9\x4e\x93\x98\xe7\x99\x8f\x6d\x5b\xb1\xa0\x66\xc7\xcf\xbe\xa5\x91\xb7\x29\xe3\x20\x6f\x84\xd4\xdb\xf0\x49\xa3\xd8\x4d\x61\x55\x1c\x6d\x36\x3f\x65\x8c\xeb\xdf\xff\xee\x89\x27\x53\x28\x32\xb1\x30\xfb\xe7\xf9\xe3\xb9\xe5\xfb\x6c\xcd\x4a\xb6\xed\x6f\x5b\xf6\xb1\x65\x7f\xd6\x34\x18\xa3\xa7\x75\xda\x67\xa7\x8e\x78\xac\x77\xab\x14\xe8\xbd\xdd\xb7\x37\x57\xde\xd6\x73\x0b\x13\x90\xc0\x13\xcf\xe7\xaa\x3f\xb5\x20\x94\x7c\x5f\x8e\x41\x72\xd0\xa0\x1a\x9a\xc0\xa2\x00\x6f\x58\x03\xfb\x03\x09\x92\x94\x9a\x65\xec\x1f\xeb\xcc\x11\xeb\xde\x2a\xfa\x4d\xfb\x8c\x4c\xe5\x1f\x7b\x46\xb2\xf2\x8f\x3d\x27\x5f\xd9\xb6\xcb\xd5\xfd\xfc\x2e\xb4\xad\xb5\x4e\x68\x04\x71\x1a\x43\xb5\x32\x69\x7b\x29\xa2\x73\xf2\xe7\xb7\xf9\x1a\x4a\x6f\xd0\x78\xde\x32\x3e\x6f\x22\x98\x9c\x6c\xf2\x4b\x8c\x8c\xc2\x3f\x42\x93\xf8\x8f\x3f\x8d\x6c\x97\xa7\x23\x72\x99\x17\x7a\xe1\xcd\x40\xec\x99\xce\x99\x22\x5c\xe8\x55\x41\x30\xfa\x34\xcd\xd7\x1b\x21\x9f\x9d\xa9\xf3\x9b\x2b\x6f\xde\x7e\xc5\xa5\x55\x05\x24\x07\x20\xe8\xdf\xb5\xc8\x68\x89\xf9\x13\x06\x59\x4a\x98\x91\xe1\x0d\xb1\x64\x9c\x89\xe4\xc1\x59\xf2\x6f\xdf\x13\x25\x2c\xcf\x31\x8a\x9e\x91\xfc\x13\xc1\x55\x99\x03\x61\xcf\x31\x91\x5e\xb2\xef\x25\xfb\x66\xeb\x25\xfb\x5e\xb2\x6f\x35\xeb\xa4\x3b\x04\xe6\xb8\x44\xc8\x46\xf6\x88\xcf\xf5\x0c\xf2\xa9\xd6\x33\x48\x6c\x3d\x83\xec\x19\xe4\x73\x1d\x3f\xfb\x96\x5b\x49\xba\xcf\xf6\xf5\x1c\xef\xe8\x3d\x07\xbd\xe7\xa0\xf7\x1c\xb8\xd6\x5f\x9f\xae\xf5\xd7\x67\x7f\x7d\xb6\xdb\x17\x77\x7d\xf6\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\x41\xb3\xf5\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\xc1\x86\xd6\x4b\xf6\x1d\x3b\xed\x25\xfb\x5e\xb2\xdf\xd4\x7a\xcf\x41\xef\x39\xe8\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\xe7\x20\xc9\x80\xf2\xf5\xea\xfc\x52\x72\x23\x3e\x87\x02\x20\x9b\x30\x97\xda\xe7\x7e\x4d\xc6\x30\xa3\x73\x26\x4a\x49\x1e\x67\xc0\x7d\x5e\x2a\x99\x82\x56\x66\x17\x80\x86\x75\x1a\xe0\x33\xec\xed\x69\x96\x36\x24\xc0\xe9\x38\x5b\xdb\xf1\x73\xdc\xcb\xfd\xf2\x69\x4f\xc9\x58\x08\xf3\x76\xab\x33\x86\xda\x8b\xd7\x06\x22\x24\xb5\x6c\xd2\xb9\xd6\x27\xb6\x5c\xdc\xbe\x7f\xd1\x74\x96\xb5\x9d\x5c\x55\x63\x13\x74\xe1\x60\xda\x9f\xb9\xf2\xcc\xa7\x1f\x1f\x39\xa4\x98\x05\x3e\x20\x4c\x9b\x07\x0c\x63\x61\x09\xd3\xd9\xa2\x22\xef\xcb\xce\x93\xb9\xb8\x7d\xbf\xbd\x9b\xcb\xaf\xd2\xc6\xae\x23\x7a\xb4\x7a\x7f\x55\xef\xaf\xaa\x5a\x2f\xb4\x75\xec\xb4\x17\xda\x7a\xa1\x6d\x53\x8b\x2f\xb4\x1d\xba\x7f\xa7\xf7\xca\x90\xde\x2b\xe3\x1f\xeb\xbd\x32\xcf\x3e\xde\x7b\x65\x7a\xaf\x4c\xef\x95\x79\xba\xf5\xf2\xab\x6b\xbd\xfc\xda\xcb\xaf\xed\xf6\xc5\xc9\xaf\xbd\x57\xa6\x67\x90\x3d\x83\xac\x5b\xcf\x20\x7b\x06\xd9\x6a\x5f\x62\x3e\x47\x6f\xe1\xee\x2d\xdc\xbd\x85\xbb\xbf\x00\xfb\x0b\xb0\xbf\x00\x9f\xeb\xb8\xb7\x70\xfb\xd6\x5b\xb8\x7b\x0b\x77\xab\xf5\x16\xee\xde\xc2\xdd\x5b\xb8\x7b\x0b\xf7\x86\xd6\xcb\xaf\x1d\x3b\xed\xe5\xd7\x5e\x7e\xdd\xd4\x7a\x0b\x77\x6f\xe1\xee\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\x85\xfb\x99\xc3\xbb\xcd\x2e\x6d\xda\xab\x9d\xd8\xec\x23\xdd\x47\xe4\x82\x72\xc2\x78\x92\x95\x29\xe0\x37\x13\xa0\xba\x94\xa0\x06\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x98\x50\x05\xca\xf5\xb1\x76\xa8\xaa\xdf\x35\xdf\x3e\xfd\x9a\x4f\xf3\x91\x27\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x99\x0c\x96\x6c\x31\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7d\xed\x4d\x5b\xf0\x89\x2d\xf7\xec\xe5\xf2\xdc\x95\x32\x24\x63\xaa\xe0\x8f\xff\xb2\x52\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\xb5\x4f\x3c\x7f\xcd\xd4\x43\x6c\xde\xe4\x5b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\x95\xed\xe3\x4e\x4b\xaa\x61\xba\x68\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x43\x09\x33\xaf\x81\xae\x1d\xe2\x71\x06\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x97\xff\xe3\xc7\x59\xf3\xf5\x73\xeb\xbb\xae\x82\x92\x6f\xdb\x5e\x90\x7e\x3e\xdf\x5b\x0f\xd9\xfb\x0a\x08\x66\x79\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xec\x7f\x69\xd9\x36\xdd\x51\x5b\xc8\x6a\xcf\xcb\x68\xc3\x06\x8e\xcd\x26\xaf\xde\x36\xa2\x99\x2b\xc6\x78\x03\x32\x67\x4a\x6d\x4a\x8a\x6a\x93\xfe\xdc\x2d\xb6\xc5\xed\xb5\x24\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x4c\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xed\xf6\xde\xe2\xee\xdb\x42\x82\xde\x56\x7e\x1e\x5a\x3a\x9f\x7d\xca\xbd\xc3\xb9\x7d\x85\xb5\x45\xb2\x9a\x6d\x7b\x79\x1b\x87\x7f\x5e\x88\xd8\x45\x32\xd9\x5a\x2e\xe9\x22\xb3\xde\x88\x8c\x25\x8b\xdb\x32\x03\x32\x13\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x01\x19\x97\x9a\xa4\x02\xac\xd9\xd0\xa1\x4b\x35\x7f\xbe\xd5\xf8\xd6\x53\xfe\x38\xb3\xc5\x08\x4d\xc7\x84\x16\x45\x86\x99\x93\xc2\x08\x1e\x8f\x33\x96\xcc\x6c\x0d\xd6\x82\x26\xb0\xee\xb1\xed\xe5\xd2\xad\x74\x35\xb2\x93\xbe\x46\xbc\xd9\x7b\xfc\xdc\xae\x23\x3b\x2a\x6e\xc4\x96\x05\xfb\x56\x8a\xb2\xd8\xf2\xf1\x6e\x7b\x80\xd8\x92\x61\x76\x20\x73\x1d\xe9\x25\x11\xcb\x7f\xe9\x9c\xe4\x76\xa9\x95\xb3\xc0\x3a\x8f\xcc\x08\xd3\x1f\xf3\x32\xd3\xac\xc8\xf0\x27\x16\x01\x4b\x11\x2a\xa1\xbe\xe0\x06\x84\xf2\x85\xf7\xb9\xbb\x12\x86\x90\x12\x3a\x35\x3d\x6a\x2c\x8f\x2a\x26\x5b\x53\x6d\x6b\x24\x96\xb9\x91\xbf\x1a\x36\x60\x85\xea\x3e\x5f\xd4\x54\x90\x47\x96\x65\x46\xf9\xa1\x59\x26\x1e\x21\x1d\x91\xa3\xa3\xe5\x0b\x28\x11\xb2\x41\x37\xb2\xba\xa3\x7f\x6e\x3d\x65\xf8\x5a\xfd\x62\xdb\x29\x72\xbb\x6a\x21\x64\x37\x4d\x84\xec\xae\x73\x11\x54\xa5\x1e\x2a\x07\xd5\x30\x63\x4a\x0f\x1d\x95\x5a\xe4\x2c\xd9\xaa\x13\x2e\xb8\x77\x44\xfc\xf9\xf6\x87\x17\xdf\xa0\xd7\xed\xe1\x5c\x4d\x4e\xd0\x66\x8f\x16\x54\x6a\x46\x33\x52\xca\x4c\xd9\x3d\x4a\x8d\xc2\x22\x7d\x15\xd4\x19\xc5\x38\x8f\x04\x14\xb2\x0b\x42\xfe\xd9\xee\x4a\xb7\x19\x2c\x2b\x13\x3c\x5b\x10\x6a\xb7\xc2\xa4\xcc\xb2\x01\x99\x30\x4e\xcd\x45\x06\x85\xcf\xe1\xdd\xc2\x34\x53\xb7\x3b\xc6\x13\x30\xd3\x34\xac\x7c\x13\x48\xb9\x19\xd9\xb0\xcc\x8a\xa7\xa5\x03\x57\xf6\xd3\x5a\xaa\x94\x23\xc5\xf0\xb7\x84\x8e\x33\x40\x4d\xc3\xc9\x9c\xb7\x22\x43\x97\x62\xe5\xf7\xc0\x5a\xa1\xb4\xf9\xf5\xff\x64\x7c\x5b\x6d\xdd\xb6\x5b\xbc\xda\x13\xca\x09\x30\x3d\x03\x89\x43\x2f\x0c\xff\x35\x9b\xbd\x3e\x54\x27\xaa\x4c\x66\x66\x8a\x8e\x0a\x91\xaa\x23\xc3\x9d\x8f\x14\x24\x12\xb4\x3a\x3a\x35\x7f\x2d\xbf\x2b\xce\x57\xf3\x77\x67\xb4\x60\x47\xa7\x03\x82\x13\x8e\x05\x4a\x85\x9e\xfd\xc2\xcf\x91\x9f\xb0\x56\x3d\xef\xe7\x5a\xeb\x14\xdd\x36\x7b\x70\x95\x35\x45\x61\x8b\x52\x9a\xfb\x53\x03\xa6\x9d\x9b\x93\x82\x7b\xae\xe1\x83\x5e\xba\x48\x09\x39\xe7\x04\xac\xd7\x10\x34\xc9\x81\x72\xf7\x34\xcc\x41\x2e\xf4\x0c\x1d\x89\xaa\xe2\xa2\xfd\xca\x6d\x11\x8d\x50\xb7\xb5\xab\xe6\x58\x99\x5f\xa1\xfa\xb8\xd9\xe2\xcf\xcb\x2b\x74\xfc\xcf\xc7\xcb\x57\x52\x7d\x07\xff\xb2\xd7\x03\x85\xb0\x4e\x6b\xf1\xc9\xfc\xb2\xbd\x0e\xf6\x23\x7b\x99\x54\xec\xf0\x87\x1f\x6c\xb1\x67\x37\xe1\xdf\x33\x9e\xaa\x0a\x58\x35\xb5\xb7\x84\x5b\xb4\xb5\x2b\x85\x14\xfe\x62\x57\x69\x55\xe9\xda\x56\x51\x7a\x86\xc6\x86\x56\x7e\x08\x8a\x34\xd6\x8b\x6e\x49\xc9\x86\xed\x0e\xac\x77\xde\x88\x95\x19\x1d\x43\xa6\x9c\x01\x11\x1a\xe4\x93\xf3\x1f\x3e\x54\xa5\xdb\x25\xd0\x67\x8c\xe2\x2f\xa0\x3e\x6f\x11\xe6\xb3\x52\x22\x7f\xb5\x6d\xaf\xe6\xe0\x54\xec\xe6\xc4\x22\x77\xa0\xed\x59\xcd\x69\x61\x8e\xaa\xed\xc3\x3a\x57\x96\x1c\x27\x3f\xe0\x4c\x3f\x7f\xe2\x76\x52\x0f\xb7\x2f\xf9\xbc\x6e\x90\xad\xce\xdb\x76\xa1\x44\x3b\x74\xf8\x94\x29\xaf\x6e\xad\x69\x5e\xda\xd0\x4e\x2f\x74\x9a\x5c\x42\x9b\x0e\x85\x14\x94\x05\xd7\xb1\x00\x47\xd2\x7f\x5e\x77\x11\x79\x09\x76\xd1\xcf\x87\x44\x41\x06\xc9\xba\x9a\xec\xeb\x1e\xd6\x90\x17\xd9\x73\x27\x8f\xec\xac\xcb\xe7\x8c\xdf\x02\x4d\x17\x77\x90\x08\x9e\x6e\xc9\xa5\xbb\x29\x4b\x1f\x18\x67\x79\x99\x13\x5e\xe6\x63\xc0\xb5\x50\x76\x50\xe4\x38\xd6\xa0\x42\x09\x87\xc7\x6c\xe1\xb8\x4c\x4a\x0a\x91\x7a\xc6\x33\x36\x5a\x3d\x4d\xb7\xbd\x74\x1e\x99\x9e\x61\xd9\x0a\xbe\x30\x43\x31\x5d\xdf\x88\x92\x24\x92\x2a\x23\x34\x0e\x70\x68\xa6\xcd\x2d\x3a\x06\x74\xb1\xb3\x14\xcc\x96\xa1\x73\xca\x32\xa3\xe5\x6c\x7b\x2d\xbe\x87\x09\x2d\x33\x8d\xf6\xa1\x37\xe4\xc4\x10\xee\x95\xfb\x75\xdd\x1a\xbd\x43\x09\xc1\xcd\x7f\x2d\xec\x12\xbe\xdc\xe9\x0e\x7e\xbe\x6d\x80\xd0\x7d\xdb\x16\x10\xdd\xb7\x82\x96\x6a\x5b\x33\x53\x6b\x37\x5c\xf1\xd4\x1c\xc2\xa6\x34\xdf\xb8\x47\x98\x72\x3d\x6f\x37\xab\x4f\x43\x79\xad\xa1\x5a\x8a\xa9\x04\xa5\xde\x03\x4d\x33\xc6\xe1\x15\x36\xf5\xfd\x0c\x48\x4e\x3f\xe3\xc6\xd6\x2c\x07\x23\x6c\x35\xb7\x35\x6d\xbe\xbe\x16\x24\xa7\x0f\x50\xd1\x49\xc6\x30\x11\x72\x8b\x90\x0e\xdf\x98\x6a\x6e\x26\xbb\x69\x27\x94\x65\x90\x8e\x90\x92\xc6\x58\x66\xb3\x4b\x91\x65\x20\xed\x3e\x34\x7f\x33\x5e\x02\xd1\x62\xcb\xc1\x0a\x29\xd0\x34\x61\x07\x68\x4a\x33\x28\x2d\x50\xd3\xa5\xbd\x71\xf0\xb0\x11\x4a\x6e\x96\xe6\xff\xf2\x73\x82\x46\xf8\x2d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x84\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x91\x6b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x5b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xfd\xde\x6d\x9d\xf5\x3f\xbe\x79\xb3\xa5\xe8\xfc\xf2\xa7\x56\x02\xda\x66\x5e\x74\xc3\x5f\x57\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xb4\x64\x6a\x46\xc6\xa0\x1f\x01\x38\x81\xcf\x16\x5e\x6e\xcb\xf1\xfe\x01\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xf6\x70\x16\x60\xce\x14\x13\xfc\x3b\xa6\xb4\x90\x8b\x1f\x58\xce\x9e\xa9\x69\xe1\x5b\x77\xee\x53\x5f\xa7\x22\x4b\xc9\xad\xdd\x02\x77\x60\x67\x46\x02\xba\x3f\xb4\xb0\xb6\x11\x62\x38\xc2\x98\x26\x0f\xdb\xde\x6a\x3b\xaf\xea\xa6\xf5\xea\x70\x8b\xbe\x7d\x73\x28\xcb\xea\x05\xb5\x97\x5c\x4a\x54\x09\xaa\x91\xf0\xee\xb0\x07\xeb\xf2\xb3\x9d\xee\xd6\xd2\x3e\xce\x84\x02\x7c\x80\x50\xf9\xbc\x4c\xd8\x7c\x0d\xef\x13\x65\xaa\xe2\xb4\x18\xaf\xc2\x41\x11\x3a\x99\xb4\x9f\x48\x77\x90\x94\x6d\xbb\xd2\x24\x2f\x95\x26\x39\xd5\xc9\xcc\x5a\xa7\x45\x5a\x49\xaf\xc7\xca\x69\x99\xbb\x2c\xed\xd6\xee\xb1\xdd\x1d\x59\xc4\xd2\x79\xf9\xb9\x30\x97\xc7\x73\x2e\xef\x76\x6b\xad\xf3\x72\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\x3f\xbf\x7e\xbf\xfd\xa9\xe9\x62\x94\xd9\xd9\x2c\xd3\xdd\x47\x62\xda\xf9\x13\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x35\x20\x94\x3c\xc0\x62\x60\x25\x8f\x06\x28\xaa\x79\x78\x27\x42\x24\x64\x4e\x3c\x05\xd3\x23\x76\x68\xc7\xd8\x7e\xb6\x3b\x6c\x4c\x3f\xf8\x2e\xfe\x5b\xdf\x86\x86\xd0\x1d\x7f\xe1\x27\x68\x87\x9f\xed\x7e\x76\x6c\x7b\x80\xc5\x6e\x3f\x58\xda\x49\x66\x15\x9c\x16\x6f\xf7\x88\xf9\xa0\xd2\x1e\xaa\x6d\xb1\x9b\x63\xbd\xd9\x3a\x18\x14\x6d\xf3\x93\x18\xf4\x7a\x3b\x1e\x94\xe6\xb8\x2d\x3b\xad\x99\x96\x63\x65\xf7\xaf\xe1\x30\x33\x56\xd8\x9c\x3e\xe7\x6d\xdc\x7d\x13\xdb\xf6\x89\x66\x2c\xad\x86\xb4\xdc\xe7\x8a\x0f\x8c\x6c\x6d\xfe\x83\xd7\x8f\x95\xf8\xdf\x0b\x50\xd7\x42\xe3\x27\xaf\xb6\x06\xf6\xb5\x5e\x7b\x05\xec\xa8\xce\x69\x85\x6c\x15\xed\x15\x36\x65\xcd\xcd\xb4\xc7\x55\xae\x23\x3d\x15\xb9\xe2\x44\x48\x37\x75\x3b\x0f\x6a\x3a\x73\x03\xdb\x21\xf1\x22\x1d\x5b\x67\x2d\xba\xbf\xd6\x8e\xe9\x56\x48\xc8\xd6\x02\x45\x1c\xde\x0d\x8d\xb2\xa0\xfd\x06\xcd\x15\x45\x86\xda\x99\x53\x9a\xa8\x0f\xad\xda\xd2\x2b\xd2\x6c\x39\xc8\x29\x7a\xb1\x93\xad\xbd\xae\x15\xd1\x1d\x2e\x3e\xdb\x76\xbe\xfe\x9a\x03\x76\xd8\xc8\x51\x7c\x49\xd1\xba\x41\x79\xc5\x9a\xa1\x3b\x4a\x3c\x3b\x9d\xaa\xc6\x70\x2d\x1b\xf9\xff\x36\x97\x3a\x6e\xba\xff\x43\x0a\xca\xa4\x1a\x91\x73\xa2\x18\x9f\x66\xd0\xfa\xce\x99\x00\x1a\xdd\xec\x34\x78\x61\x06\x35\x77\xef\x9c\x66\xce\x10\x43\x39\x01\x6b\x8e\x37\x74\x2c\x8b\x6f\x03\x27\x61\x9b\xab\xa8\x8a\x7f\x38\x7a\x80\xc5\xd1\x60\x63\x98\xf9\xfa\xd6\x3c\xa9\x47\x57\xfc\xc8\x8a\x30\x2b\x67\xad\x92\x77\x30\xc8\xe2\x08\xbf\x3b\x8a\x29\x1b\xee\x28\xab\x74\x75\x26\xb4\x07\xdd\xe1\x98\xb4\x76\x75\x4e\x8b\x5d\x37\xb5\x0f\xec\xec\xa0\xa3\xdd\x2f\x1b\x97\x5c\x04\xb4\x16\xa4\x54\x60\xd5\x68\x64\x76\x04\xbc\x2e\x86\x9a\x17\x5a\xbd\x38\x3c\xa2\xee\x74\x30\x0a\x8d\x51\xf1\x19\x9f\xfe\xb9\x48\xa9\xde\x2a\xa7\xc8\xb6\xee\x67\xfb\xd6\x0e\x48\x4a\x1c\xd1\xec\xe4\x09\x9b\x92\x82\x4a\x9a\xab\x11\xb9\x71\xe5\x06\x70\x5f\xb3\x49\xd3\x7d\xe3\xe6\xf9\x7e\x51\x00\xf9\x7f\x76\x1f\xd0\xbe\xe1\x0b\x9f\x83\x6e\x42\x71\x4e\x3f\xdf\x95\x72\xba\xc3\xf4\x93\x60\xa1\xa5\x69\x89\xae\x6d\x42\xb8\x51\x9b\x20\x42\x2a\x99\x41\x5a\x66\x90\x12\x3a\x16\x73\x68\xf9\xc9\xaa\x9f\xed\x38\x34\x1a\x2a\x76\xfc\xcd\x27\xc3\xe1\x3c\x51\x46\xc8\x1a\x2b\x91\x95\xba\xb2\x67\x9d\xc0\xe7\x77\xe4\x0f\x18\xbf\x45\x49\x01\x32\x01\xae\xe9\x14\x96\x0d\x8f\xf6\xb9\xb7\x6f\xfe\xe9\x74\x57\x02\x50\x9c\x31\xe3\x3b\x33\xf0\x1b\xb3\x3b\x3f\xd0\xcf\x7f\xe6\xb5\x93\x86\x29\xb2\xa5\x11\xaa\x6e\xe7\x4b\x2f\x82\xa3\x64\x49\x99\xa1\x89\x19\xe3\xe2\x1a\xaf\x33\x5e\x10\x29\x4a\x8c\x8c\x23\x65\xb1\xeb\x58\x4d\x73\xd9\xef\xfe\xf0\x4f\xbb\xfe\xfc\xf2\x33\xcd\x8b\x0c\xde\xf9\xba\x2f\xd6\xd6\x67\xf4\x09\x2d\xc8\xef\xdf\xfc\xd3\xc0\x46\x09\xc0\x63\xc3\xf6\x54\xef\x23\x6a\x36\x51\x59\x10\x96\xdb\x3c\x19\xc8\x16\xd8\xd1\xae\x12\x9c\xb9\xe2\xda\x2c\x44\x69\x2a\xb5\x1a\x10\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x96\xcc\x9d\x68\x68\x84\x47\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x91\x8a\xb7\xbf\x7f\xf3\x4f\xab\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x31\x00\x27\x0f\x2c\xcb\x20\xdd\x55\xc4\x7e\x6e\x22\x27\xa5\xd4\x33\x90\x03\x02\x5c\x79\x4f\x84\x79\xf7\xa5\xf7\x46\x5a\x64\xc9\xf9\xee\x12\x28\xb5\xfe\x50\x74\x6e\x34\x9c\x1d\x6e\xda\x8d\x60\xa6\x49\x2e\x94\x5e\x3f\x1d\x3b\x0d\x46\xf9\xe2\xe3\x64\x57\xf1\x7a\xd8\xc1\x98\xbb\xfa\xeb\x0e\xc2\x79\x4b\xfa\x60\x5c\x0f\x85\x1c\xda\x6e\xde\x11\x2d\xcb\x5d\x04\xbe\xbc\xc5\x42\x0e\xf0\x06\x28\x1b\x0c\x6e\x65\x13\x7c\x71\x6c\xbc\x3b\xbb\x4d\xc5\x23\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x15\x16\xde\xf6\x0c\x2d\x71\x1e\x33\x0f\xe6\xe9\xff\x7b\xf5\xc8\xef\xaa\x52\x2f\xdd\x04\x9b\x79\xbb\x63\xad\x15\xeb\x36\x6a\x0d\x06\x40\x0c\x96\x68\xdd\x91\x82\x35\x6f\x56\x71\xd5\x89\xb0\xe1\xc1\x66\x13\x98\x07\x2c\x51\x6b\xae\xb8\x9a\x01\xef\x7c\x95\x6d\xb8\xaa\xec\x3b\xd6\xb1\x1f\x1a\xc3\x2e\x0d\x1b\x56\x9b\xf8\xf0\x8e\x43\x67\x40\x95\x5e\xb7\x84\x3d\xd7\x7e\xb6\x3d\x9d\xe1\xbb\xdc\xda\xaa\xa3\xd1\x5d\x70\xc6\x2b\x3f\x19\x26\xaf\x8f\x81\x1c\xdd\x82\x8d\x62\xb2\x19\x09\x2d\xa5\xe5\xa8\xf2\x5f\x9b\xc5\x0e\xd2\x67\xb6\x9e\x36\xef\x82\x7b\x51\x7f\xb4\x1b\xa3\x91\x9d\xe7\x3c\x80\xee\x0a\xaa\x42\xa2\x6c\x7c\xd7\xf6\x6e\x68\x70\xd9\x27\xee\x08\xfb\x97\x19\xa9\x02\x92\x91\x04\xe4\x2a\x36\x69\xd0\xda\x55\xd0\xdc\x72\x9e\x3d\xd2\x85\x3a\x3a\x18\xd5\x3c\x07\x4d\x9f\x4e\x4a\x5f\x6e\xdd\x05\x82\x3b\x4d\x79\x4a\x65\xea\xde\xe8\x58\x55\xa3\xef\xc2\x11\x3e\x60\x78\x12\x9f\x88\x77\x64\xa6\x75\xa1\xde\x9d\x9d\x4d\x99\x1e\x3d\xfc\xab\x1a\x31\x71\x96\x88\x3c\x2f\x39\xd3\x8b\x33\x8c\x36\x62\xe3\x52\x0b\xa9\xce\x52\x98\x43\x76\xa6\xd8\x74\x48\x65\x32\x63\x1a\x12\x5d\x4a\x38\xa3\x05\x1b\x26\x82\xcf\x81\xa3\xff\x62\x94\xa7\xbf\xf6\x24\xbd\xac\x0e\xdf\x62\x13\xe8\x50\x91\x73\x18\x96\xfc\x81\x8b\x47\x3e\x44\xf3\x9e\xda\x89\x61\x6c\x17\xb5\xea\x5b\xc0\x1a\xee\x12\xd4\x5a\x88\x1d\x6c\x82\x2f\xbe\xb2\x66\x8a\x86\x94\xa7\x43\x1b\xaa\xf5\xb2\x0b\xdc\xc5\xad\x3a\xac\xc3\x41\xb7\xa7\xae\x9b\x35\x88\x26\x9a\xcd\xa1\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x02\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\xce\x77\x08\x1d\xf4\xed\xce\xb0\xe5\x7b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x94\x86\xdc\x5e\x05\x76\xb4\x6c\x41\xb4\x5c\xd8\xf0\x48\xf9\x40\x98\xf6\x31\x87\x46\xbd\x7f\xc0\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5b\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xff\x65\x97\x7d\x34\x41\x60\xcd\x1d\xbd\xed\xed\xf0\xdc\x49\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8c\x25\xb1\xbe\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x9e\x77\x9a\x14\xb2\x9a\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x8e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x51\xdf\xb8\xab\xde\xeb\x6a\xca\x45\xf5\xf1\xe5\x67\x48\xca\x6d\x31\xd9\x56\x5b\xa8\xdb\xdd\x36\x23\xed\x79\x33\xb5\x8b\x5e\xb6\xd4\x1b\x0e\xe1\xbf\x70\x42\xa5\xc0\xf5\x72\xd2\xa5\xa2\x9a\xa9\xc9\xae\x8e\x60\xdf\xcc\xaa\x56\xeb\x0e\x8d\x50\xae\xea\xc4\x54\x61\x71\x28\x33\xd8\xfc\x6c\xa6\x91\x73\x26\x33\x21\xd4\x2e\x66\xa2\x66\xa3\x76\xd3\xe1\x3b\xcc\x99\xb0\x01\x4a\x88\x39\x20\x49\x6e\xd8\xa6\xbb\xe2\x1b\x44\x59\xd7\x60\xfd\x33\xb6\xab\xae\xee\x1b\x9a\xfb\xaa\xcd\xe1\x03\x71\xcc\xe0\xe8\xde\x32\x7f\x4c\x51\x58\x57\x9a\xa8\x32\x37\xa4\x3c\x02\x9b\xce\xb4\x1a\x10\x36\xda\xd9\x5e\xe4\x9b\x39\x46\x40\x93\x59\xe3\x15\x72\x00\xdd\x2a\x96\xdd\x3c\x7b\x4d\x1f\xe8\xc9\x93\x90\x46\xcf\x37\x87\xef\x30\xa8\xe4\x86\xe5\x23\xb1\x76\x1b\x0c\x08\xe8\x64\x74\xba\x7b\x5c\x85\x6d\x35\x78\x9d\x99\xc5\xf1\x82\x30\x0d\xe6\x32\x46\xd5\x5f\x8a\x72\x6a\xe7\x1a\x7c\x8a\x18\xce\x41\x95\x7d\x8f\x61\x6f\x69\xba\xbb\x49\xc2\xb7\x23\xbb\x68\x47\xe6\xc4\xe0\xdc\x96\xb9\x87\x5e\xc6\x15\x40\x07\x38\x54\x88\x13\x12\x54\x21\xac\x99\x6c\xd9\x35\xfe\x3f\x76\x74\x80\x37\x9b\x19\xea\x44\x9d\xd6\x5b\x6b\xc6\xa6\x33\xbf\xb3\xa8\x93\x0f\xda\x3b\xb2\xdb\x06\xeb\x1e\x16\x62\x5b\xc7\xe0\x10\xdb\xe2\x70\xc1\x46\xd2\x7b\x7d\x3c\x1b\x47\x42\x83\xcc\xab\x65\xc3\x53\x83\xd7\x8a\x73\x4b\xfb\x22\xee\xee\xb0\x92\x37\x9d\xa9\x38\x31\xa7\x9c\x30\xa3\x41\x1a\x3e\x35\x14\xc5\xe9\x88\x9c\x13\x5e\x56\x6c\xf9\x29\xc2\xb8\xa8\xe8\x72\x1d\x19\x62\x95\xa8\xfb\xea\xca\xad\x43\xae\x52\xdb\xba\x45\x63\x36\xdb\xd0\xcd\x00\x3c\x5f\x76\xe5\xa9\x4e\xec\x1a\x75\xec\x20\x4c\x2c\xf0\x7d\xf8\xb7\xe8\xde\xc7\x32\x2c\xba\xe5\x2b\x75\x54\x2f\xc8\x7c\xd0\x94\xe3\x2b\x1e\xd0\x66\x37\x76\x2e\xba\xee\x0a\x12\x67\x67\x90\x48\xf3\x4a\x82\x02\xcc\xd7\xb7\xa5\x59\xae\x20\x34\x5a\xb3\xdd\xba\x2f\xc7\x0b\xfc\x76\xc7\xd8\xfb\xcd\x2d\x94\xb9\xd6\x2d\x88\xcd\xd6\x2d\x16\xc3\xad\xdb\xf2\xee\x8d\x13\xad\x1e\x81\x30\x1c\x2e\x4e\x0c\xfb\x86\x01\xe2\x9c\x1e\xdb\xc2\x39\x6c\xdd\x76\x8f\x82\xdf\xd4\x4f\xb4\xe5\x88\xc5\x22\x6c\xeb\x10\x47\xbf\xbe\xad\x04\xb7\xbd\x4c\x58\xfd\xfa\x16\x10\x1f\xbb\xae\x75\x0d\xc1\x5f\xdf\xe2\x33\x0a\xd3\x6e\x5f\x21\x4a\x7f\x7d\xdb\x2a\x76\x7f\xd0\x0e\xdc\x27\xdf\x6a\xcb\x98\x7e\x08\xba\x65\xeb\x16\x79\xc5\xbb\x05\xfc\xaf\x6f\x2f\xb3\xde\xe7\xaf\x97\x12\xb0\xbe\xed\x39\x51\x60\x47\xa2\x36\x13\xf4\xad\x36\xc4\xfc\xa0\x07\x8d\x1f\x47\xa2\xa6\x41\x82\x85\xd9\xf3\x51\xe5\x4e\xc1\x1e\x38\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xe6\xb6\x75\xf6\x44\x48\x36\xc4\xfa\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xd5\x3b\x47\x3d\xe1\x1b\xeb\x8c\xdc\xa3\x8a\x60\xdd\xa1\xbd\x8a\xf0\x6c\xeb\x55\x84\x5e\x45\x78\xbe\xf5\x2a\xc2\x6a\xeb\x55\x84\x5e\x45\x08\x6a\xbd\x8a\xf0\x6c\xeb\x55\x84\x67\x5b\xaf\x22\xd4\xad\x57\x11\x0e\x5f\x45\x08\xcd\x90\x5d\xdf\xac\xbf\x25\x9a\xdb\xe7\x2f\xd6\xdd\xb8\xec\xe7\x41\xe5\xc6\x87\xb9\xb7\x1d\x3e\x46\x8a\xbe\x73\xa2\xc6\x3d\x3a\x89\x5c\xb2\xb7\xa4\x7c\x0a\xe4\xed\xf0\xed\x9b\x9d\x93\x2a\x9a\x2d\x24\x36\xbd\xd9\x76\x05\x8d\x5a\x6d\xd1\x77\xc6\xa6\xf8\x85\xc3\x0b\xe9\x71\x9c\xbd\x8a\xab\x68\x29\x9f\x1b\xe2\x6b\xaa\x8a\x04\x39\xe8\xdd\x13\x22\x7c\x6b\x3a\xa6\x59\x0e\x55\xd0\x9b\x65\xeb\x2e\x8d\xa7\x4e\x8a\x15\xdc\x05\x48\x98\x6d\xd9\x75\xdb\x75\x7a\xdb\x04\xa8\x4d\x36\x1f\x83\x79\xe3\xae\xa1\x44\x9a\x28\x91\x83\x85\x6b\xf3\x57\x87\x79\x5d\xf0\xdb\x80\x9c\xc0\x68\x3a\x22\x69\x09\x0e\x06\xc1\x66\x9d\x9c\x0e\x1a\xc1\x99\x5d\x63\x89\x8c\xc0\x23\xf1\x3f\x66\x62\x5d\x4c\x27\xcc\x81\xeb\x92\x66\xd9\x82\xc0\x9c\x25\xba\x5a\x01\x4c\xce\x62\x5a\x05\xcc\x75\xb0\x2a\x1a\xaa\x7e\x0e\x57\xf8\x57\x37\xf1\x24\x5c\x4f\x5c\xa1\xa3\x3b\x4f\x5f\x2a\x08\x60\x67\x68\xb4\xd1\x92\xa4\xcd\x68\x36\x20\x0d\xff\x89\x07\xf7\xe3\x6d\xd7\xd8\x1d\x12\x49\x1e\x09\x96\x41\x62\xaa\x06\x2e\x60\x46\x48\x17\xd2\xb3\x3a\x83\x6b\x42\x66\xd6\xe0\x7f\xec\x9c\x9b\xdf\x6e\x7a\x06\x79\x17\x0c\x91\x75\xcd\xd0\x76\x2f\x0a\x91\x89\xe9\xa2\xb9\xf1\x5c\xdd\xfe\x1a\xed\x9c\x12\x55\x8e\x9d\x72\x6b\xce\xfe\xf5\xd2\x4e\xed\x83\x3d\x36\xb6\x3e\xd8\x63\xa5\xf5\x96\xdc\xde\x92\xbb\x43\x3f\xbd\x25\xb7\xb7\xe4\xf6\x96\xdc\xde\x92\xdb\xb5\xf5\x96\xdc\x9d\x88\xea\x2d\xb9\xa4\xb7\xe4\x6e\x6c\xbd\x25\xd7\xb5\x3e\xd8\x63\x6d\xeb\x55\x84\x5d\x5b\xaf\x22\x84\xf7\xd3\xab\x08\xbd\x8a\xd0\xab\x08\xbd\x8a\xd0\xb5\xf5\x2a\xc2\x4e\x44\xf5\x2a\x02\xe9\x55\x84\x8d\xad\x57\x11\x56\x3b\x8e\x16\xec\xf1\x02\xe4\xc6\x24\xb4\x10\x69\x74\x38\x97\x42\xa4\x4f\xa0\xb9\x58\x5f\x78\x22\x86\x99\x48\x28\xd6\x12\x64\xf6\x27\x2e\x06\x45\xd1\xdc\x86\x02\x0c\xc8\x3f\x04\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x01\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x7b\x34\x98\x6d\x5a\x8f\x06\xd3\xa3\xc1\xf4\x68\x30\xaf\x8b\x06\x33\xa3\xca\x95\xb8\x40\xa1\x68\x33\x38\x4c\x83\x63\xdf\x83\xcc\x7b\x6c\x98\xe7\xda\x8a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\x6f\xda\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\xa1\x3d\x3c\x82\x4c\x98\xab\x30\xb3\x74\x9a\xdd\x0c\x77\x65\x88\x07\x02\xb8\xd2\x9e\x89\x80\x9e\xf6\x8f\xba\xd2\x7e\x95\x68\xa1\x4a\xcd\x88\xad\x96\xf8\xf3\xc5\x61\xb0\xc4\xb1\x17\x0e\x89\x76\x61\x4a\xdf\x07\x59\x0c\x63\x99\xf7\xd0\xfc\x76\xb7\x53\x4d\xd9\xcd\x2d\xb6\x49\xc3\x17\xea\xfc\xef\x12\xe4\x82\x88\x39\xc8\xda\x58\xe5\x6f\x5a\xe5\x62\xb4\x11\x0b\xdf\xd5\xa1\x0d\x57\x4d\xaf\x26\x16\x65\x8a\x97\x59\x36\xb0\xbd\x2f\xb3\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\x1c\x58\xc5\xda\xcd\x2d\xae\x79\x22\xa2\x71\xe2\x85\xac\x87\x87\x52\x19\x77\x73\x7b\x49\xff\x12\x89\xed\x63\x22\x91\xfd\x4c\x24\xa2\xaf\x89\xc4\xf5\x37\x91\xe8\x3e\x27\x12\xd3\xef\x44\x5e\xbd\xd2\xef\xe6\x16\xdd\xac\x18\xdb\x15\x45\x5e\x8c\xc1\x90\xd7\xae\x28\xbc\xb9\xbd\x4e\xad\xe1\xcd\xed\x05\x76\x41\x4c\xf7\x14\x79\xd1\x3d\xb0\x97\x9a\xc6\x9b\xdb\x41\x3a\xad\x9e\x24\xec\xc5\xeb\x20\x6f\x6e\xd1\x7d\x40\xe4\x05\xfc\x40\x24\xb6\x2f\x88\xbc\xcc\x91\x7d\x61\x9f\xd0\x2b\x0c\xd0\xa9\x7a\xf3\xe6\xf6\x12\x3c\x67\xaf\x15\x9f\x9f\x22\x6b\x8f\xb5\xa0\x37\xb7\xfd\x57\x89\xde\xdc\x22\x4b\xe7\xa1\x95\xa5\x9f\x23\x34\x0a\xab\x78\x19\xf7\x2b\x69\x9d\x8b\xef\x61\x11\x37\xf8\x33\xc2\xc9\xfd\xd0\xa2\xce\xab\x9f\xda\xd5\xb0\xab\xa5\x76\xf4\xb5\x59\x81\xdd\xf9\x08\x5c\x45\xec\x2c\x0b\xa6\x61\x0c\x44\xd3\x07\xc0\x88\x0b\x81\xe5\x48\x58\x0a\xb6\x6e\x8d\xdd\xea\x38\xbe\xd9\xe2\xa5\x82\xd4\x10\x92\x09\xf1\x50\x16\xfe\xa8\x60\x5a\x71\x8c\x83\xc9\x78\x22\x72\x9f\x3f\x6d\xb3\xe9\xcc\x89\x77\xbc\x60\x68\xeb\x8c\xd9\xcf\x91\x1c\xbc\xa4\x9d\x51\xf5\xef\x2d\x23\xdf\xdf\x09\x55\xe4\xef\xa8\xfe\x70\x72\x82\x3f\x3c\xfd\x7b\x78\x68\x66\xb5\x04\xd6\x2f\x27\x4a\xe4\xb0\x4b\x45\xca\xdb\xab\xf3\xd4\xec\x06\x13\xe4\x6b\xa3\x34\x27\xee\xd8\xfa\xd3\x4f\x28\xd7\xec\xb4\x32\x45\x8f\x08\xee\x2f\xd4\xfd\x52\xc1\x8f\xb5\xa5\xda\x73\x7d\xdf\x41\x78\x44\x66\xb5\x72\x75\x64\x8f\xf5\x70\x8f\x5c\xd9\x77\x5b\x85\xaf\xaa\x19\x67\x65\xbc\xe0\x71\xef\x7d\xec\x80\x53\x79\x27\x42\x8e\x59\x9a\x02\x16\xda\xac\x5e\x75\x2c\x3c\x34\x46\x7d\xe4\x0c\xdf\x6f\xed\x9d\x70\x62\xce\x33\x25\x06\xcb\xe3\x24\x94\x7b\xf0\x03\xd0\xb6\x5a\x67\x6b\x58\xc2\x94\x59\x16\x05\xc1\xea\xd7\xc1\x85\x87\xbf\xd4\x3d\x11\x39\x45\x80\xa9\x03\xbf\x2b\x96\x09\xec\xaf\x8b\xe8\xd7\x05\x17\xba\xbf\x31\xfa\x1b\x63\xe9\xc6\x58\x39\x78\x2f\x77\x69\xac\x0c\xd5\xdf\x1b\x07\x7e\x6f\x70\x9a\x83\x2a\x68\x02\x5f\x90\x87\xd9\x9a\xff\x6d\xde\x9a\x27\x5f\x35\xca\x69\x83\xcc\xa3\x7a\x05\x3c\x54\x0d\xde\x58\xd8\x6f\xea\x43\xa1\x4a\xde\xa8\xb5\xda\x20\xc6\xf2\xcd\xe5\xa8\xbf\x60\x4a\xbc\x9a\x2f\x38\x28\x74\xbe\x42\x15\x7b\xda\x18\x1c\xc7\x0a\x7f\x6d\x84\xa0\xa9\xdd\x2c\x3c\x5d\x06\xa5\xa9\x47\x44\x3f\x70\x0e\x94\x2b\x72\xe4\x83\x62\x8f\x55\xfd\xc4\x96\x45\x95\x9f\x6a\x55\x79\xab\x8a\xa2\x93\xff\xfd\x7f\x4e\x5b\x25\xad\x6a\x82\x7a\x2f\xff\xd6\xad\xf7\xf2\x07\xb5\xde\xcb\xdf\x7b\xf9\x63\xf4\xd5\x7b\xf9\x7b\x2f\xff\xda\xd6\x7b\xf9\x7b\x2f\x7f\xef\xe5\xef\xbd\xfc\xab\xad\xf7\xf2\xf7\x5e\xfe\x46\xeb\xbd\xfc\xdd\xc9\xea\xbd\xfc\x3b\xb6\xde\xcb\x1f\xd3\xcb\x5f\x1b\x2e\x0e\xcd\xfa\xd6\x34\x69\xb9\x4c\x56\xd4\x3e\x35\xd5\x2c\xa9\xd1\xa3\xfc\x53\xf6\x5f\x87\x65\x8a\x6b\x9a\xc9\x5e\xc6\x10\xd7\x34\xf6\xad\xd8\x53\x23\xd9\xe1\x36\x5a\xdd\x2a\xbb\xdc\xca\xc8\x2f\x6a\x90\xeb\xcd\xed\xdd\xa8\xac\x53\xcb\x0e\xed\xa8\xdf\x7b\x30\x03\x35\x13\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd6\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x61\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x25\x72\xa5\xe6\x8b\x31\x85\xfb\x83\x66\x99\x78\x0c\x97\x36\xa2\x9c\xeb\xc8\x65\x6b\x02\x4f\xdb\xe3\xce\x55\x6f\x96\x72\x7f\xc3\x34\xdb\xbe\x60\xce\x96\xad\x2f\x98\xf3\x7c\xeb\x0b\xe6\x3c\x5d\x30\xa7\x11\xd9\xd4\xac\x9c\xd3\x75\xb6\xb1\xde\xce\x1e\x2a\xe7\x10\xf2\x97\x19\x20\xdf\x90\x60\xc3\x91\xca\x4c\xb3\xa2\x46\x44\x53\x76\xe5\x33\x6b\x88\x9b\x38\x64\x9d\x36\x17\x33\x34\xd2\x64\xd6\x91\x80\x25\x1e\x88\x54\x20\xee\x9a\xc2\x9b\xcd\x22\xca\xa0\x1f\xd8\x96\x95\xf1\x16\x3a\x0b\xec\xc3\xbe\x7c\xfc\x8f\x80\x5b\xe7\x3d\x8a\x3d\xed\x78\x3b\x45\x4e\x8c\xb4\x94\x2d\x5c\xd4\x59\xeb\xfa\x69\x89\x59\x9d\x87\xb5\x5e\x84\x39\x78\x15\x6d\xca\xe6\xc0\x6b\x19\xed\x44\x9d\x9e\x7a\x5d\x71\x59\xf6\xec\x3c\x66\x88\xcc\xda\xfd\x5e\xdd\x55\xd6\x5c\x92\x15\x3b\x8f\xbb\x46\xc6\xfc\xf7\x86\x2c\xf6\x1f\xcf\x4b\x99\x9d\x87\xb6\xac\xcd\xc3\x2d\x35\xb6\x55\x2d\x5d\x76\xec\xfb\x40\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\xb5\x0f\xd8\x8f\x3d\x40\x7e\xfc\x92\x0a\x46\x1d\x64\xf0\xcf\xc1\xd9\x99\x5e\x02\x2d\xfe\xa0\x83\x7d\x7a\xb8\xf8\xa0\x7e\x7e\x51\x70\xf1\x7b\x0a\xe6\xf9\x05\xa2\xc6\x1f\x40\xf0\xce\x3e\x03\x77\x7e\x71\xa8\xf1\x07\x14\xa8\x73\x90\x41\x3a\x87\x16\xa0\xd3\xc3\xb0\x07\xb5\x2f\x13\x86\x3d\x6a\x10\x4e\x6c\x3e\x72\x80\xc1\x37\x07\x18\x78\x73\xa8\x41\x37\x11\x25\xe5\x97\x09\xb6\x89\xc4\x02\x5e\x26\xc8\x26\x5e\x6a\x74\xcc\x53\xb9\x6f\xf8\x8c\x83\xc8\x85\x3e\x64\xd8\x8c\x83\x4a\x80\x3e\xac\xe4\xe7\x7d\x24\x3e\x1f\x0c\x4c\xc6\x1e\x21\x32\xe2\x88\x81\x11\x84\xbf\x97\xe0\xf7\xf1\x64\xb1\xa8\x70\x18\x51\x79\xfe\xfe\x61\x30\xbe\x5a\xb6\x1f\x11\xfe\xa2\xe7\xfc\x1b\xdb\xa1\x73\xfe\x97\x86\xbb\xd8\x2f\xd4\x45\xcf\xff\xb7\x6a\x51\x61\x2d\x5e\xd8\x73\xfa\x9a\x70\x16\x87\x01\x65\xf1\x6a\x30\x16\x87\x03\x61\xf1\x6a\xf0\x15\xbd\xc7\xba\xf7\x58\xb7\x5b\xef\xb1\xee\x3d\xd6\xbb\xf4\xd3\x7b\xac\x7b\x8f\x75\xef\xb1\xee\x3d\xd6\x81\xad\xf7\x58\x77\x24\xaa\xf7\x58\xaf\x6f\xbd\xc7\xba\xf7\x58\xf7\x1e\xeb\x95\xd6\x7b\xac\x83\x08\x3c\x50\x8f\x75\x1c\x48\x88\x98\x27\xf2\x90\xa0\x20\x0e\x01\x06\xe2\xb5\x20\x20\x0e\x0e\xfe\xa1\x37\x41\x6f\x47\x5d\x1c\xa8\x87\x98\x47\xf8\xb0\x21\x1e\x0e\x19\xde\xe1\x40\xa1\x1d\x5e\x06\xd6\xe1\x25\x21\x1d\x82\xcf\x6c\xd4\xd3\x5a\x88\xf4\x9c\x6b\xe6\x53\xc8\x76\x3f\xa7\xad\xd3\xf9\x1e\xff\x18\x83\x3d\x63\xad\x03\xd3\xcc\x93\x97\x65\x06\xca\xa5\x89\xd3\xb9\x60\x29\x29\x4a\xad\x6d\xe6\xad\x3b\x9f\x7e\xe3\xd3\xdc\x66\xca\x0f\xc8\x3f\x04\x87\x01\x01\x9d\x8c\xcc\xe6\xc6\x1c\x74\xa1\x67\x20\xcd\xe3\x27\xea\xf4\x74\xf7\x35\x09\x92\xcf\xc2\x4c\x7b\x85\x84\x09\xc8\x2f\x02\x59\x01\x3d\xcf\x0e\xbe\x40\x5a\x87\xb7\xa5\x1e\x43\x04\xdc\x17\xf6\xf8\x69\xe1\xb2\xde\xf1\xd8\xdb\xb4\xf3\xae\x37\x24\xe2\x1b\xb4\x36\x10\x34\xdc\x1c\x1b\x30\x0e\x06\x64\x5c\x6a\xc2\x34\x02\x03\x24\x33\x21\x54\x57\xee\xe2\x92\x94\xf1\x45\xe6\x4c\x58\x73\xba\xe0\x80\xa8\x03\x42\x56\x3c\xb0\x41\x94\x55\x25\xea\x9f\xb1\xae\xca\x56\x2e\x94\xae\x77\x88\x37\xce\x9a\xc1\xab\x3b\x67\x2a\xc1\x50\xa4\x89\x2a\x73\x43\x8a\x05\x54\x51\x16\x02\xa0\xe3\xb0\x13\x23\x62\xd1\x64\xd6\x78\x85\x1c\x40\x5b\xd7\x9c\xcf\x72\x6e\x1c\xe2\xa6\xce\x74\xe2\x73\x5e\x3b\x8e\x6d\x3a\x03\xa5\x07\x1b\x11\x47\x36\xef\x05\xcb\x13\x4e\xbb\x1a\xa5\x12\x91\x17\xa5\x06\x23\xc7\x97\xb9\xd9\x4d\x4c\x63\xc4\x0a\x32\x23\x29\xca\xa9\x9d\x70\x0f\xf2\x60\x27\xa2\x46\x10\xe1\x29\xea\x66\x9d\x2f\xfe\x23\xbb\x72\x47\x5e\x78\x37\x44\xb0\x49\x05\x10\x42\x66\x54\x35\x43\x6d\xea\x7b\xf5\x19\x80\x9c\xff\x11\x70\xb3\x9a\x81\x4f\x54\x43\xc2\x99\xb1\xe9\xcc\x6f\x36\xa3\x1d\xa3\x4d\xa1\xb5\x49\xbf\x74\x64\x09\x73\x72\xdd\x19\x42\x71\xa5\xde\xf1\x76\xc6\x53\xf2\x17\xfc\x16\xd2\xe5\x7c\x6b\xdc\x07\xd6\x68\x40\xd3\xd4\x08\x22\x20\x87\xf6\x04\x09\x32\x61\x4e\x45\x5a\x3a\xd2\x6e\x86\xbb\xb2\xc6\xc3\x40\x07\x58\xda\x71\x01\x3d\xd9\x99\xef\xd8\x41\x0c\x1f\xdb\xd2\xab\x44\xd3\x56\x6e\xdd\x34\x8f\xc8\xb9\x95\x88\x3c\xff\x32\xaa\xfb\x60\x05\xff\x6a\xf5\x54\xdb\x99\x39\x80\x68\x88\x38\x8e\xda\x18\x90\x12\x24\xa2\x5f\x35\x1a\xb4\x04\x79\x9d\xba\x3f\xaf\x00\x31\x41\xf6\x03\x33\x41\xfa\x9a\x33\x87\x15\xc4\x43\xfa\x9a\x33\x07\x16\xd4\x43\xfa\x9a\x33\x7d\xcd\x99\xee\xed\x10\x82\x7e\x48\x5f\x73\xe6\x00\x82\x80\x48\x5f\x73\x66\x9b\xd6\xd7\x9c\xe9\x6b\xce\xac\xb6\xbe\xe6\x4c\x5f\x73\xa6\xd1\xfa\x9a\x33\xdd\xc9\x3a\xb8\x40\x22\x72\xc0\xc1\x44\xa4\xaf\x39\x13\xb9\xe6\x4c\xbc\xf4\x68\xf2\x02\x27\x77\xdf\xd0\x18\xe4\x50\xf2\xa4\xc9\x81\x43\x64\x90\x43\x4b\x96\x26\x07\x97\x30\x4d\xf6\x94\x34\x4d\x0e\x09\x32\x83\xec\x17\x36\x83\x1c\x62\x62\xde\x97\x51\xb2\x28\x2a\x94\x06\x79\x89\xbb\x62\xff\x90\x1a\xe4\x6b\xbf\x2e\x22\x42\x6b\x90\xfe\xc6\xd8\xa6\x7d\x09\x37\xc6\x4b\x43\x6d\x90\xbd\xc3\x6d\x90\xfe\xde\xe8\xda\xa2\x42\x70\x90\xd7\xf1\x30\xbf\x26\x14\x07\x39\x18\x38\x0e\xf2\x9a\x90\x1c\xe4\xa0\x60\x39\xc8\x6b\x42\x73\x90\xde\xcb\xdf\x7b\xf9\xb7\x6e\xbd\x97\xbf\xf7\xf2\xc7\xe8\xab\xf7\xf2\xf7\x5e\xfe\xb5\xad\xf7\xf2\xf7\x5e\xfe\xde\xcb\xdf\x7b\xf9\x57\x5b\xef\xe5\xef\xbd\xfc\x8d\xd6\x7b\xf9\xbb\x93\xd5\x7b\xf9\x77\x6c\xbd\x97\x3f\xa6\x97\x3f\x0e\x8c\x08\x79\x81\x53\x7b\x48\x70\x22\xe4\x40\x20\x45\xc8\x2b\xc2\x8a\x90\x43\x84\x16\x21\xbd\xb9\xbd\x33\x95\x71\xe0\x46\xc8\x0b\x1c\xf5\xc3\x86\x1d\x21\x07\x0e\x3d\x42\x0e\x17\x7e\x84\xbc\x18\x04\x09\x79\x61\x18\x12\x12\xeb\x5c\xdb\x14\xd5\x43\x01\xf8\xb1\xd4\xac\x64\xd6\xb6\x4a\xfb\x3f\x99\x38\x1f\xa6\xd9\xba\x43\x23\x29\x9f\x02\x79\x3b\x7c\xfb\xe6\x4d\x78\xee\x2e\xe3\x1a\xa6\x10\x62\xbd\x9c\x08\x99\x53\x8d\x3d\xfd\xfe\x77\x9d\xfa\x89\xce\xb6\x37\xe1\x3c\x1c\x1e\xfe\x89\xb3\x89\xb4\xf1\x27\x5a\xd2\xff\x06\x30\x12\xd4\x0a\xcc\x69\xcd\x41\x93\xce\xbe\x81\x06\xe2\x86\x66\x39\x0c\x3c\xef\xb7\x31\x11\x3e\x00\xc0\xc1\xb0\xa4\x44\x70\x27\xb2\x19\x76\xd7\x75\xef\x75\x7f\xe5\x04\xa8\x42\xe4\x83\x31\x98\xd7\xee\x38\x3e\xd5\x16\xdf\xa7\x10\x8c\x6b\x6f\xe8\x31\xef\x0c\x7e\x43\x38\xf0\xa0\xb4\x04\x6b\x41\xad\x63\x9c\xca\x22\xa5\x1a\x4e\x43\x54\x45\xb5\x50\x1a\x72\xc4\x90\x31\x92\x1e\xc5\xe0\x1f\xa2\xe5\x02\x03\x40\xe6\xc0\x75\x49\xb3\x6c\x41\x60\xce\x5c\xfc\x8e\x19\x1e\xa3\x97\x98\x56\x41\x33\xff\x97\x19\x20\x07\x91\x60\x03\x93\xca\x4c\xb3\x22\xab\xe1\x47\xec\xf2\x67\xd6\x24\x37\x71\x68\x3b\x6d\x7e\x66\x68\xa4\xc9\xac\x23\x01\x4b\xdc\x10\xa9\x30\x0c\x48\x2a\xbc\xe3\x2c\xc0\x0c\x7a\x84\x8d\xaa\xa0\x2a\x5b\x9d\x05\xfb\x61\x5f\x3e\x12\x48\xc0\xfd\xf3\x1e\x05\xa0\x76\xe4\x9d\x22\x27\x46\x6e\xca\x16\x2e\xfe\xac\x75\x11\xb5\x04\xae\xce\xc3\x5a\x7f\xc2\x1c\xbc\xb2\x36\x65\x73\xe0\xb5\xb4\x76\xa2\x4e\x4f\xbd\xd6\xb8\x2c\x85\x76\x1e\x33\x44\x7a\xed\x7e\xc3\xee\x2a\x75\x2e\x49\x8d\x9d\xc7\x5d\x23\x6d\xfe\x7b\x43\x2a\xfb\x8f\xe7\xe5\xcd\xce\x43\x5b\xd6\xe6\xd1\x97\x1a\xdb\xaa\x96\x33\x3b\xf6\x7d\x20\x28\x32\xe1\x80\x20\x31\x3c\xb2\xd1\x80\x40\x5e\xb8\x52\xd2\x2b\x00\x80\xec\x01\xfc\xa3\xaf\xd8\xd3\x57\xec\x69\xb7\xbe\x62\x4f\x5f\xb1\x67\x97\x7e\xfa\x8a\x3d\x7d\xc5\x9e\xbe\x62\x4f\x5f\xb1\x27\xb0\x1d\x50\xc8\xce\x41\x86\xeb\x1c\x5a\xa8\x4e\x5f\xb1\x27\xa8\xf5\x15\x7b\xfa\x8a\x3d\x7d\xc5\x9e\x46\xeb\x2b\xf6\x84\x1c\xcd\x78\x49\xd2\x31\x4f\xe5\xbe\x81\x34\x0e\x22\x2b\xfa\x90\x01\x34\x0e\x2a\x15\xfa\xb0\xd2\xa0\xf7\x91\x02\x7d\x30\x80\x19\x7b\x04\xcb\xe8\x0b\x3c\x6d\xd5\xa2\x02\x63\x44\xe5\xf9\xfb\x07\xc4\xf8\x6a\xd9\x7e\x44\x20\x8c\x9e\xf3\x6f\x6c\x87\xce\xf9\x5f\x1a\xf8\x62\xbf\xa0\x17\x3d\xff\xdf\xaa\x45\x05\xb8\x78\x61\xcf\xe9\x6b\x02\x5b\x1c\x06\xa8\xc5\xab\x01\x5a\x1c\x0e\x98\xc5\xab\x01\x59\xf4\x1e\xeb\xde\x63\xdd\x6e\xbd\xc7\xba\xf7\x58\xef\xd2\x4f\xef\xb1\xee\x3d\xd6\xbd\xc7\xba\xf7\x58\x07\xb6\xde\x63\xdd\x91\xa8\xde\x63\xbd\xbe\xf5\x1e\xeb\xde\x63\xdd\x7b\xac\x57\x5a\xef\xb1\x0e\x22\xf0\x40\x3d\xd6\x71\xc0\x21\x62\x9e\xc8\x43\x02\x85\x38\x04\x40\x88\xd7\x02\x83\x38\x38\x20\x88\xde\x04\xbd\x1d\x75\x71\x40\x1f\x62\x1e\xe1\xc3\x06\x7b\x38\x64\xa0\x87\x03\x05\x79\x78\x19\x80\x87\x97\x04\x77\x08\x3e\xb3\xd1\x4e\x2b\x2d\xb5\xc8\x45\xc9\xf5\x1d\xc8\x39\x4b\xe0\x3c\x49\xcc\x5f\xf7\xe2\x01\x76\xcc\xea\x6f\x1d\xd1\xf3\x27\xba\x25\x8c\xa7\x2c\x41\xdb\xe4\xe3\x0c\xf4\xcc\xa5\xcd\xe1\x73\x84\xda\x07\x89\xc6\x27\xeb\x13\x8a\x74\x9a\x3b\x16\x33\xbb\xb1\xeb\x5d\x97\xc0\xce\xd0\x58\x88\x0c\xe8\x2e\xae\x68\x27\x33\x82\xdc\x91\x51\x87\xf1\xac\x1f\x9c\x28\x51\x8f\x4e\xc6\x90\x09\x3e\x75\x39\xe4\x8e\xeb\xec\xba\x0b\x2f\xea\xee\x9c\xab\x36\x29\xa5\x04\xae\xb3\x05\x4e\x73\x9a\x42\x4a\xd0\x3c\x95\x8b\xf9\xee\x9b\xfc\x1e\xd9\x91\xd7\xe1\xa9\x26\x19\x50\xf3\x1e\x1c\xea\x17\x31\x0c\x8d\x92\x9b\x0e\xb4\x57\xbe\x65\x0b\x22\xd0\x69\xfd\x77\xbf\xb1\x3b\xdd\xd1\xed\xd3\xe0\xf5\x32\x94\xd2\x12\x34\xf2\x35\xe6\x03\x19\xe4\x42\x94\xe4\x91\x5a\x55\x4a\x96\x1c\x59\x2a\x4e\x54\x87\x45\x0e\x50\x3a\xba\x1b\xe3\x87\x78\x2f\xed\xf8\xb3\x10\xe3\x38\x95\xd3\x4e\xa2\x53\x0c\x59\xe2\x5c\x4e\x4b\xab\x29\xba\xa3\x08\x5c\xcb\x05\xe2\x61\x74\xbb\x17\xee\x67\xad\x13\x92\xd3\x29\x1c\x2b\x72\xf1\xe1\xbd\xb9\x75\x30\x02\x89\x4d\xac\xcc\xee\x6e\xa1\x42\x8a\x39\x4b\xbb\x5e\x43\x9f\xa8\x64\x74\x9c\x19\xad\x77\x02\x12\xb8\x91\xa4\x7f\x73\xf2\xe9\xfc\xf6\x6f\xd7\xe7\x1f\x2e\x4f\x51\xff\x85\xcf\x05\xe5\x86\x1d\x94\xaa\x46\xe6\x71\x14\x1e\x2b\x02\x7c\xce\xa4\xe0\x66\x16\xd0\x6e\x48\xc9\xdc\x75\xda\x89\xa2\x3a\x70\x44\x82\x12\xd9\x1c\x52\x8b\xa5\x51\x11\x58\x87\xef\x14\xa5\xf6\x16\x54\x1f\x7b\x53\xf2\x64\x46\xf9\x14\xd2\x11\x79\x2f\x4a\xf3\x62\xbf\xf9\x0d\xbe\x84\x84\xb4\x4c\xa0\x9b\x8e\x63\x4d\xf0\xf6\xe4\xfe\x66\xe0\x65\x16\x73\xfb\x63\xec\x0d\x01\x95\xd0\xc2\x4f\x4d\x73\xf6\xd4\x82\x6b\xfa\xf9\x9d\xc5\xe2\x38\xfa\x4d\xe3\xab\xa3\xee\x81\x6b\x85\x14\xe6\x55\xac\x2c\x68\xdf\x3e\x63\x1a\x24\xcd\xc8\x51\x73\x84\x11\xb9\x34\x74\x41\xda\x5c\x5b\x0b\x46\x03\x73\x90\x68\x5b\x75\x2b\x3b\x20\x12\xa6\x54\xa6\x19\xa8\x6e\x46\x21\x31\xa9\xae\x70\x6b\x6a\x71\xbb\x0a\x2a\x9b\x31\x17\x7a\x14\xca\xb8\x7d\xfb\x20\x10\xec\x64\x22\xde\x91\x99\xd6\x85\x7a\x77\x76\x56\x4b\x41\x23\x26\xce\x52\x91\xa8\x33\x4d\xd5\x83\x3a\x63\xdc\x30\xbf\x61\x4a\x35\x1d\x36\xb8\xee\x99\x95\x8d\x87\x89\xc8\x73\xca\xd3\x21\x75\xe7\x78\x58\xed\xec\xb3\x5f\x3b\xe9\x71\x48\xab\xa7\x18\x1f\xd2\xa1\x9a\x41\xa7\x95\x0b\x53\x14\x03\x14\xc4\x40\x21\x33\xb2\x42\xe8\xe6\x72\x5f\x0c\xfb\xb2\xe2\xcf\x76\x29\x46\xe4\x5a\x68\x87\x57\xe4\x22\x2a\xf1\xb6\xc5\x55\x8e\xc9\xc2\x2f\xaf\xef\x6f\xff\x7a\xf3\xf1\xea\xfa\xbe\xe7\xe4\x3d\x27\xc7\xd6\x73\xf2\x9e\x93\x77\x18\xf8\x50\x38\x39\xf0\xf9\xbe\xb8\xb8\x57\x8a\x1b\x1c\xab\xda\xaa\x2e\x51\xa0\x0a\xf3\xae\xf6\x41\xb7\x2d\x1a\x65\xa7\xef\x6d\xc7\xb4\x26\xfb\x92\xcf\x3f\xd1\x76\xc4\x09\x5f\x3b\x85\xc4\x3d\x60\x35\xf4\x8b\xb0\x09\x0c\xf6\x7c\x85\xc6\x85\x75\x52\x48\x6d\x0b\x8f\xd9\x32\x43\x77\x37\x78\xb7\x96\xef\x9a\xe6\x95\xb9\x75\xdd\xaa\x8d\xc8\x07\x6f\x6f\x21\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\x6d\x77\x03\x65\x04\x97\x02\x1a\x89\x23\x4d\x40\x90\xbd\x7f\x17\xf9\x28\x60\x98\x5a\xb2\x2a\x24\xcc\x99\x28\x55\xb6\xa8\x0c\xf1\xeb\xd9\xd5\x32\x9f\x22\x94\x87\x50\x40\xf9\xa2\xb2\xa2\xae\x1d\x70\x49\xb6\x5b\x27\xa7\x85\x98\xb4\xf7\x2b\xe1\x39\x22\x62\xc8\x79\x01\xe3\xaf\x91\x10\xb7\x97\xf6\x02\xc6\xed\x24\x27\x6e\x92\xf9\x02\xe8\x68\x4b\x8b\x01\x1d\xbd\xb7\xe9\x53\x78\xa7\x1f\x05\x4c\x4d\x2c\x4e\xf6\x8d\x14\x79\x24\x6e\x76\x87\xb8\x80\x55\x3a\xdb\xba\xa3\x7a\xec\x62\xc4\x5b\xf2\xb6\xd3\x1c\xab\x84\x32\xf3\x79\x60\x52\x59\x94\xe0\x94\x38\xf1\xcd\x89\xe0\x13\x36\xfd\x40\x8b\xef\x61\x71\x0b\x93\x30\x97\x78\x7b\xbe\xd1\x3b\xe8\xa2\x6c\xd1\x0f\x69\x24\x1b\x3b\x58\x98\x87\x30\x5a\x6c\x4f\xac\x08\xf8\xf0\xe8\xf7\x78\xc1\xea\x51\x02\xd5\x5b\x0b\xe9\x92\x72\xeb\xac\xd4\x58\x79\x0c\x51\xe2\x1f\xc3\x04\x3e\xdf\xe2\x07\x21\x37\xa5\x47\x77\x3d\x44\x89\xe5\xbe\xaf\x41\xc5\x99\x22\x30\x99\x40\xa2\xd9\x1c\xb2\x0a\x88\x3c\x1d\x90\x71\xa9\x3d\x04\xf8\x98\x26\x0f\x8f\x54\xa6\x8a\x24\x22\x2f\xa8\x66\x63\x96\x31\xbd\x20\x2c\x46\x19\x2b\xe7\x91\x77\xb8\xe6\x3e\x94\x99\x2b\x4d\xf1\x2a\x14\xce\xde\x66\x56\xdb\x86\x2a\x50\x9f\x87\x66\xb9\xa9\xc7\xf3\x8e\x42\x4a\x2e\x94\x26\x09\x48\x23\xd4\x65\x0b\xf2\x28\x45\x8c\x52\x13\xdb\xda\x4c\x12\xc1\x13\x28\xb4\x3a\x13\x73\x23\x0b\xc2\xe3\xd9\xa3\x90\x0f\x8c\x4f\x87\xe6\xc5\x87\x96\x59\xa9\x33\x0c\x21\x39\xfb\x35\xfe\xe7\x90\x4e\x11\xf1\x89\xd3\xef\xc8\xd1\x51\x60\x5f\xa2\xb0\xd1\x92\x91\x4f\xe5\x1d\xc6\xe1\x2c\x5a\xa2\x53\x75\xa1\x18\xd1\x87\x69\x85\x7c\xca\x7b\xc1\x9d\x16\x10\x69\x9a\x77\x8f\x5f\x58\x6d\x2f\x55\xcd\x0b\xd9\x41\xdc\xdb\x3b\x98\x07\xd6\xd7\xbf\x65\x56\x8e\x15\x16\x22\x7d\x47\x54\x59\x14\x42\x6a\x45\x72\xd0\x34\xa5\x9a\x8e\xcc\x81\x18\xb4\xff\xc4\x48\xab\x01\xf9\x7b\xf5\xa1\x4d\xfb\xff\xf1\xf8\xdf\xbf\xbf\xfc\xeb\x7f\x1c\xff\xf4\xf7\xe6\x77\x28\xae\xd9\x24\x9e\xc6\x03\x81\xaf\xa0\x0a\x48\x46\x5c\xa4\x70\x8d\xd4\xe1\x9f\xaa\x15\x57\xe3\xbe\xd0\x54\x97\x6a\x34\x13\x4a\x5f\xdd\x54\x7f\x16\x22\x5d\xfe\x2b\x30\x95\xe8\x00\xe5\x1e\x5c\xdb\x1b\xaa\xbb\x03\xb9\x93\xa8\xd2\x0f\x2d\xd8\x27\x90\xaa\x73\x69\x94\x66\x6b\x9d\x07\xd7\x6b\x85\x38\x9f\xcc\x20\xa7\xf8\xcf\x6f\xfc\x14\x98\xfb\xf8\x51\x32\xad\x31\xd4\xca\xd5\x81\x10\x93\x81\x67\xad\x56\xa9\x9a\xbf\x0d\xae\x83\x16\x95\xf3\x57\x2b\x18\x79\xc2\x70\x46\xdc\x6c\x59\x0e\x50\xa3\x9a\xac\x44\x56\x9e\xdf\x5c\x91\xb9\x9d\xe1\x03\x9a\x9c\x97\x62\xd7\x1e\xa3\xfe\x9b\x83\x66\xdb\x9e\x4a\xbf\x88\x95\xbd\xec\x9d\x4d\xe2\xa8\x90\xf6\x49\xc6\x72\xe6\x32\x17\x0d\x67\x01\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\x13\x8a\x19\xe4\x20\x69\x36\x54\x5a\x48\x3a\x85\x41\x35\xb8\xfd\x59\xf5\x97\xfd\x61\x8b\xbc\xd5\x5f\x5b\x83\x64\x1d\x93\xe7\xae\xa8\xd0\x44\x94\x03\x64\xd9\x7e\xdd\x0e\x84\x63\x57\xdb\xea\x3a\xbe\x22\x77\x5c\xb9\x52\xac\x9a\x58\xcd\x22\x5a\x81\xe6\x22\x2b\x73\x50\x83\x4a\x60\xb5\xa6\x4a\x3e\x27\x73\x2a\xd5\xf1\xe1\xf0\x21\x42\x52\x36\x67\x2a\x46\x82\xf5\x1a\x89\x9a\x39\xac\x02\x51\xea\xa2\xd4\xae\x26\x5a\xe5\xf7\xf8\x5c\x08\x85\x06\xce\xaa\xac\x46\xeb\x36\x7b\x1b\xaa\x2c\x10\x52\x50\xad\x41\xf2\x77\xe4\x7f\x9d\xfc\xe7\x6f\x7f\x1e\x9e\xfe\xe9\xe4\xe4\xc7\x37\xc3\x7f\xfb\xe9\xb7\x27\xff\x39\xc2\x7f\xfc\xf3\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xf6\xf4\xf4\xe4\xe4\xc7\xef\x3f\x7c\x7b\x7f\x73\xf9\x13\x3b\xfd\xf9\x47\x5e\xe6\x0f\xf6\xaf\x9f\x4f\x7e\x84\xcb\x9f\xb6\xec\xe4\xf4\xf4\x4f\xbf\x09\x26\x9d\xf2\xc5\xc7\x40\xee\x6d\xdb\x30\x5a\x49\xbb\xe5\x1e\x23\x69\x87\xad\xab\x90\x71\x3d\x14\x72\x68\xbb\x7e\x47\xb4\x2c\x43\x35\x78\xbf\xbd\x62\x9f\xff\x5b\xcf\x35\xeb\xdb\xac\x92\x42\x0e\xe8\x80\xbf\x94\xa0\xa1\x20\x91\xa0\x5f\xc3\xb2\x6b\x47\xf2\x82\xdd\x52\xbe\xd7\xd7\x76\x83\xfe\x12\x8c\xbd\x55\x65\x2d\x5c\xd7\x5a\x74\x9f\x48\x91\x8f\x48\xc3\xf3\x3d\x47\x54\x0b\xf7\xdc\x03\x04\x42\xed\x91\xde\x38\x1c\xd2\x7a\xe3\xf0\x06\x52\x7a\xe3\x70\x50\xfb\x22\x8d\xc3\x77\x96\x27\xfd\x22\x2d\xc3\xab\xa1\x87\xa6\xd3\x87\xce\x50\xc4\x9d\x63\xba\x36\xc5\x40\xe6\xb4\xe8\x12\x00\xd9\x35\x1e\x20\x66\x10\xa4\x37\x7b\x68\x41\x0a\x51\x94\x19\xd5\x1b\x02\x7f\x22\x45\x44\x56\xa0\xc8\x3e\xac\xa9\x0e\x9a\xb7\x22\x6d\xbe\x3e\x0c\x8d\x9c\x67\x19\x61\xdc\x5e\xd0\xa6\x83\x4e\xa3\xfb\xe8\x21\x09\xd6\x1e\x42\xa8\x0d\x63\x9c\x9b\x57\x7d\x74\x65\x79\x9b\xf1\xf7\x8a\x28\x4d\xa5\x66\x7c\x3a\xb2\x65\x7b\xad\x98\xe8\x42\x54\x18\xaf\x8a\xf7\x76\x22\xa7\x52\x43\x2b\x88\x91\x95\x9a\xe6\x36\x3d\x5a\x69\x3f\x3d\xf8\x06\x9a\x3e\x60\x88\x58\x02\x29\xf0\xa4\x63\xb0\xd1\x27\x0b\x69\xe2\xd7\x61\xbc\x30\x33\x71\xc9\xe7\xee\xfe\x22\x69\x69\xc3\xa4\xad\x08\x15\x6f\xdc\xaf\x2b\x26\xd6\x9c\x61\x17\x8c\xd3\x08\x8d\x45\x69\xb3\x32\x38\x56\x10\x6c\x95\x87\x0f\xa3\x9b\x2c\x4b\xef\xb6\x91\x83\x15\x89\x70\xb1\xbd\x0a\xb6\x09\xd2\xc7\x56\xe4\xf5\xda\x0b\xda\x96\xd3\xbf\x86\xf8\xa4\x70\x09\x3e\xae\xf4\xfe\x12\x92\xfb\xa1\x48\xed\x07\x22\xb1\xbf\x8c\xb4\x7e\x98\x92\x7a\x34\x29\x3d\x8e\x84\x1e\x47\x3a\xdf\x21\x6c\x23\xa6\x44\x1e\x47\x1a\x7f\x09\x5b\x5c\x21\x61\xc2\x3e\x47\xe2\xf8\x1f\xbd\xb7\x42\xc3\x67\xb4\xcc\x14\x12\x0a\xe0\x15\x04\x15\x77\x1c\x0a\x68\x32\xfb\x72\xf2\x16\xac\x01\x29\xee\xbd\x78\xb7\xce\x78\xd5\x5f\x8a\xa4\xbf\x14\x77\x68\xfd\xa5\xd8\x5f\x8a\xaf\x72\x29\x3a\x6e\xf5\xf5\xdf\x88\x91\xd3\x62\x31\xe1\x7f\x5f\x36\xa1\x8b\x36\xee\x00\x72\xe6\x97\x4c\xcd\xae\x8e\x62\x0d\x4f\x75\x86\x23\x77\x3b\x71\x6d\x26\x5b\xc5\x41\x68\x61\xd9\x1e\x99\xb1\xa9\xd9\x9e\x19\xcc\x21\x73\xda\x2b\xc9\x29\xa7\x53\x8b\x37\xab\x45\x55\x6f\x49\x48\x2c\x27\x23\x59\x47\xa8\xbb\x25\x00\x07\x34\x14\x19\x2e\x93\x09\x9a\xe2\x97\x52\x64\x19\x48\x45\x32\xf6\x00\xe4\x3d\x14\x99\x58\x38\xc8\x58\x9e\x92\x3b\x4d\x35\x4c\xca\xec\x0e\x74\xa7\x18\xcb\x20\x8e\x83\x04\xdf\x94\x59\x76\x23\x32\x96\x74\x72\xc8\xc5\xd8\x8a\x57\xb8\x01\x8b\x32\xcb\x48\x81\x84\x74\xdb\x87\x1f\x39\x5e\xe5\xe7\xd9\x23\x5d\xa8\x01\xb9\x86\x39\xc8\x01\xb9\x9a\x5c\x0b\x7d\x63\x6d\x35\xdd\xfa\x6d\x66\x96\xd9\xce\x09\x9b\x90\x77\x58\x2b\x43\x13\x4d\xa7\x68\x39\xf4\x11\x81\x03\xb3\xa1\x9a\x83\x12\x61\x18\xe5\x23\x53\xfb\x34\xa1\x85\x9f\xd2\x5f\xe3\xe8\xe6\xea\xec\x7c\x6a\x83\xf6\x6a\xc6\x26\x90\x2c\x92\x6c\x6f\x0c\xf3\x3c\xc1\x20\xed\x1a\x99\xb7\xc1\x4e\xd4\x42\x69\xc8\x3d\xf8\x20\x5a\x4e\x19\x27\x12\x54\x21\xb8\x42\x29\xaf\xe6\x12\xd5\x8b\x58\x4b\x74\xc7\xc8\xea\x88\x86\xd5\xce\x8a\x41\xa8\x4a\x50\x08\xa5\xef\x34\x95\xba\xab\x7c\x12\x4b\x17\xb8\xf1\x84\x98\x93\x9c\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\xe4\x76\x3a\xd1\x08\x39\xd9\xf2\x15\x24\x12\x70\xde\x7d\x05\x84\x19\xe5\x69\x06\x92\x4c\x28\xcb\x54\xf7\x00\xfe\x15\x9f\x84\x06\x99\x33\x8e\x4e\x02\x1b\x08\x8a\x4e\x0a\xf3\x57\x92\x08\x99\x3a\x70\x47\xa6\x95\xff\x2a\x88\x89\x9a\xf6\x11\x25\xbb\xc6\xf6\x5e\x8e\xa3\x25\xe3\x4c\x24\x0f\x8a\x94\x5c\xb3\xcc\xbe\xbc\x10\x0f\xa8\xbf\x64\xc8\x4e\x3a\x0f\xdd\x9d\x4b\x55\xff\x1c\x56\x07\x6c\x68\xa8\x52\x67\xbf\xae\xbf\xc2\x0f\x3a\x12\x17\x41\x8b\x8e\xa1\x43\xc3\x67\x48\xa2\xe1\x22\x5f\x7e\x86\xa4\x85\x4a\xee\x50\x6f\x6c\x79\x48\x44\xba\x8a\xe4\x0a\xb4\xed\xc0\x8a\xac\x05\x20\x8c\x35\x5b\xec\x28\x9b\x0b\xb7\x08\xae\xbe\x92\x5f\x93\x8c\x71\x68\x2f\x8c\x62\x29\xb4\x17\xc7\x7a\x17\x9d\x92\x4b\x52\x26\x11\x10\x7a\xe1\x73\xc7\x83\x49\xf3\xb4\x20\x66\xb2\x10\x9a\x9c\x1c\x9f\x1d\x9f\xae\xec\x91\x63\x23\x9b\x67\x60\xaf\xc5\x91\xc3\x39\xab\x5e\x4a\xb1\xbc\xc8\x16\xf8\x1e\xc7\xe9\x80\x30\x1d\x23\x6c\xc7\xdc\x86\xb2\xe4\x7e\x56\x1c\x2e\xdb\x80\x28\x41\xb4\xa4\xbe\x0e\x82\xfd\xd4\x3c\xa4\x65\xe9\x2e\xf4\x93\xe3\x9f\x8f\x07\x04\x74\x72\x4a\x1e\xb1\xf6\xab\x99\xbe\x11\xb9\x17\xa4\x54\xe1\x33\x56\x11\xb2\x10\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x16\x78\xdd\x10\x51\x6a\x6b\x04\xa5\x3a\x04\x4f\xae\xd9\x2e\x3f\x33\xed\x52\xb8\x0c\xff\x7e\x83\xbb\xc9\x5e\x59\x84\x1a\x65\x64\x0e\x67\x33\xa0\x99\x9e\xd9\x04\x03\x2e\xf8\xf0\x1f\x20\x05\x62\xce\x71\xf7\xcd\x57\x57\xd3\x2f\x62\x6c\xd1\x0b\xc1\xdf\x9b\x6b\xef\x5b\xe8\x2c\x12\x91\x65\x7e\xf4\xdd\xfd\xfd\xcd\xb7\xa0\x9b\x5c\x9e\xe3\x87\xe4\xdb\xcb\x7b\x9f\x56\x82\xc6\x78\x90\x13\x21\xf3\x03\x60\xef\x71\xe2\x5d\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\xfd\x2d\x56\x37\xe1\x58\xb2\x5b\xb4\x73\x24\x5c\x40\x34\xb9\xba\x19\x91\xbf\x8a\xd2\x4c\xc8\x98\x8e\xb3\x45\x85\x3a\xad\x20\xbc\x96\xe3\x91\x21\xe5\xc8\xdc\x20\x66\xe7\x7f\x07\x34\x05\xa9\x90\x41\x03\x8d\x54\x4b\x27\xc2\x71\x6f\xd0\x16\x75\x29\x2f\x4a\xa5\x45\x4e\x66\xee\xb5\xdb\x78\x74\xee\x70\x8e\xec\x71\x75\xa0\x44\x12\x0a\xcb\xc4\xdd\x6f\xbe\x3a\x16\xbd\xc2\xbd\xec\xbc\xbb\xcf\xc7\x56\x4c\x6d\x4e\x9b\x73\x70\x58\xb8\x1b\xc7\xdb\xcc\x56\x8d\x16\x8a\x7a\x90\x55\x4b\x3b\x23\xd5\x2d\x77\x84\xce\x9e\xe0\x9e\xe2\xd6\x2c\x8d\x13\xfd\x4e\x5e\xac\x46\xa3\x11\x68\xdd\xe6\xb3\x36\xe8\xee\xd6\xf3\x75\x9d\x33\x55\x05\x2f\x26\x94\x0b\xce\x12\x9a\xb1\x7f\x40\x4a\xca\x42\x70\x97\xee\x86\x92\x6d\x42\x15\x0c\xd1\x3b\xce\xb5\x2b\x1c\x55\x63\xa6\x19\xee\xa0\x85\x40\x71\x0f\x63\xd4\x0c\xbb\xb7\x54\x1f\x6e\x69\xce\x17\x58\xf5\x95\xc5\x8a\xb3\xe3\xc9\x17\x21\x4e\x12\x9b\xa7\x18\x9c\x23\xbf\x9a\x21\xaf\x05\xa1\x49\x82\xa8\x70\xf6\xba\x42\xc6\xab\x40\xce\xc3\xf7\x57\xb4\x79\x35\x22\xe0\xa1\xc9\x5e\x36\xe6\x40\x12\x5e\xe6\x63\x90\x35\xbc\x88\xd4\xab\x73\x1a\xc5\xea\xe2\x86\xb5\xc3\x79\x2f\xad\x97\x31\x28\x9f\x02\x79\x6b\x46\xfe\xe3\x1f\xfe\xf0\xfb\x3f\x44\x18\xc7\xbc\x5e\x15\xd8\xcd\xc9\xd5\xf9\xf5\xf9\xdf\xee\x3e\x5d\x20\x68\x61\x68\xf7\x91\xf2\x56\x63\x67\xad\x46\xcd\x59\x7d\xd1\x8c\x55\x84\xff\x08\xe6\xb2\xb1\x8f\xc4\x1d\x52\x65\x36\x61\xa9\x2c\xd0\xa1\xd3\x49\x1a\xa5\x8b\x8c\x1a\x15\xbe\x3b\x9b\xce\x3c\xc3\xb0\x0e\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x99\xde\xda\xd5\xc2\xd3\x52\xda\x12\x42\x95\xf3\xaa\xb6\xe5\x3b\xa7\x15\xd2\xf0\x15\x29\xff\x0a\x12\xc1\xd3\x10\x15\x20\x96\x48\xeb\x28\x89\x7a\xe6\xee\x6c\x9f\xde\x44\x5c\x5f\x25\x6e\x30\xd4\x24\x43\x57\x94\x54\xab\x1a\x87\x4f\x5a\x80\x06\xec\xed\x8f\xff\xd2\xdd\x41\x96\x14\x77\x22\x79\x88\x68\x22\x0b\x64\x60\xef\xcd\x49\x4b\xac\x2f\xf0\xfe\xe2\xc6\x12\x67\x56\xe6\xfa\xe3\x7d\x8d\xc6\x82\xd9\x47\xe4\x07\xef\x9b\xfa\xce\x79\x0b\x29\x4f\xc9\x03\x14\x61\xda\xa5\x61\x98\x3e\x8c\xb0\x1d\x45\x38\x72\xf5\xd5\x10\xfd\xd5\x66\x3c\x5b\x46\xe0\xa3\xff\xac\x44\x1c\x86\x23\xdd\x70\xce\xa3\x23\xd0\x29\x21\x13\xca\x32\x42\xd1\x2a\xaf\x59\x0e\x36\xe5\x0a\x8d\xfd\x75\xb4\xc4\x57\xc4\x70\xbe\x56\x6b\xe3\xb1\x0f\xdb\x7e\xb7\xb3\xd5\x30\x14\xa8\xe2\xeb\x56\x03\x1c\xcf\x96\x55\xdc\x7b\xaf\x06\x6c\xdb\x7a\x35\xa0\xa3\x1a\x50\x48\xb8\xd3\xa2\xb3\xac\x19\x2d\xe0\xc6\x92\xb1\x21\xdc\x66\x0c\x13\x21\x61\x39\xde\xa6\x11\x07\xe3\x22\xe7\x03\x22\x83\xcf\x6f\xae\x2a\xdf\x97\x68\xc5\xba\xd8\xf4\x60\x55\x26\x33\xef\x26\xe5\xa0\xd4\x19\x46\xd6\x94\x85\x35\x2c\xe3\xd5\x56\x4a\xe8\x1e\xe5\x53\x48\x80\x1c\xe7\x71\x50\x03\xfc\x98\xd7\x05\x6e\x3f\x04\x9d\x58\xbf\xb9\x0f\x2b\x72\xf8\xed\x7e\xba\xc2\x6a\x20\xd7\x13\x9b\x48\xaa\x66\x80\x29\xaa\xf0\x99\x69\x65\x07\xbd\x41\x18\x1c\x3f\xe3\x46\x5e\x98\x4a\x9a\x00\x29\x40\x32\x61\x44\x8c\x92\xeb\x54\x3c\x72\x32\x86\x29\xe3\xca\xaf\x58\x08\x49\x7e\x4b\x60\x24\x11\x53\x55\xa1\xb5\x11\xb9\x6d\xd5\x1f\x70\x80\x5f\x89\xa8\x79\xa6\x9b\xa2\x41\xa4\x29\x41\xe1\x05\xb7\x41\x89\xa5\x83\xab\x8d\xe7\xd3\xd7\xf5\xe6\x19\xea\xbe\x21\xec\xcc\x9e\x94\x1c\x5f\x34\x85\x8c\x2e\x6c\xa2\xf6\x84\x71\xb4\xfe\x4a\x75\x3a\x0a\x0f\xcd\xea\x4c\xa0\x90\x8d\x3e\x37\xee\x0c\xa6\x88\x04\x9a\xcc\x42\x24\xbb\x3e\x06\xec\xb9\xd6\xc7\x80\xf5\x31\x60\x7d\x0c\xd8\x6a\xeb\x63\xc0\xda\xad\x8f\x01\xdb\x4c\xd0\x21\x3b\xed\xfa\x18\xb0\xde\x2a\xb3\xda\xfa\x18\xb0\x4e\xad\x8f\x01\x7b\xb6\x1d\x1c\x8b\xee\x63\xc0\xb6\x68\x7d\x0c\xd8\x96\xad\x8f\x01\xeb\x63\xc0\xfa\x18\xb0\x3e\x06\x2c\xa0\xf5\x31\x60\xbb\xbf\x5e\xef\xfc\xe9\xde\xfa\x18\xb0\x3e\x06\x6c\xc7\xd6\xc7\x80\x2d\xb5\x3e\x06\xac\x8f\x01\x7b\xaa\xf5\x31\x60\x7d\x0c\x98\x6b\xbd\xb5\x71\xa5\xf5\x31\x60\x6b\x5a\x1f\x03\xb6\xdb\x38\xbd\x1a\x10\xd6\xd9\x8b\xa8\x01\x4a\x8b\xe2\x8e\x4d\x03\x70\x21\x63\x1d\x83\xbb\x8a\x12\x07\x1a\xa9\xc8\xe3\x8c\x25\x33\xa2\xec\x87\xde\x8e\xa5\x1c\x64\x5f\x33\x22\xac\x71\x93\x8c\xc1\xa8\x08\xe6\xb5\x8a\x90\xdb\xe4\x6a\x82\x0e\xe4\x06\x92\x9b\x39\x15\x1e\x26\x90\xb5\xaa\x27\xb4\xc5\x67\x7f\xbb\x31\x6e\x74\x97\xee\x14\x34\xe6\x23\xa1\xdc\x16\x2b\xc5\xd7\xc7\xe2\x86\xe4\x46\xa4\xca\x17\x6c\xe0\x82\x0f\x2d\x58\xeb\x08\xab\x3b\x0b\x35\x0a\xb0\x06\x07\x22\xb3\xd9\x18\xb9\x1b\x29\xc6\x7b\x43\x67\xbb\xc1\xf8\x23\x96\xb8\x00\x3d\x31\x69\x21\xae\x59\x02\x3b\x22\xad\xb5\x03\xc3\xb0\xa0\x88\x87\xe0\x62\x8e\x61\x57\x41\x81\xfb\x44\x73\xdb\x39\x72\xca\xa3\x54\xaa\xb3\x42\xd8\xff\xab\xe3\xa6\x1a\x01\x53\x9d\xfd\x28\x7b\x86\x97\x0b\x89\x92\xda\x5b\x84\xd4\x81\x44\x98\x45\x88\x8a\x8a\x29\x2b\x1d\x68\x34\xd4\x61\x46\x42\x1d\x62\x14\xd4\x3e\x22\xa0\xf6\x1e\xfd\x14\xc7\xad\x1e\xc1\xa5\x1e\x49\x22\x7d\x01\xf7\x94\x0b\xa4\xbf\x9f\x49\x50\x33\x91\x75\x66\x38\xb1\x98\xcd\x07\xc6\x59\x5e\xe6\xe6\xec\x2a\xc3\x53\xd8\xbc\x0a\xf6\x57\x9e\x65\xb8\xeb\xde\x46\x1c\x98\x07\x59\x0a\x58\x99\x9b\xb2\xcc\x6c\x2d\x04\x0b\x9d\xd1\x39\x0a\xa5\x65\x92\x00\xa4\x21\x62\x69\xd3\x5a\xfd\xfb\x51\x45\xa1\xc5\xe8\x67\x8a\xbc\x0d\xbb\x6a\xc2\xf4\x9e\x86\x39\xef\xf7\xbf\xeb\xd4\xc7\x54\x16\x71\x6e\xe9\x6f\x6f\x6f\x2e\x5a\xb7\x34\x7e\xf0\x1d\x1e\xe3\x8b\x19\x24\x0f\xb7\x2e\x94\x66\x7f\x37\x73\xb8\x99\x29\xc8\xc4\x14\x43\x30\x08\xb5\xa2\xb4\x7d\xc8\x42\xea\x25\x17\xe8\x14\x57\x11\xe4\x9c\x25\x30\x7a\x05\x43\x45\x2c\xe5\x3f\xfc\x20\x10\x74\x13\xe0\x8b\x1f\x8a\xd8\x75\x67\xc9\xa9\x3c\x0c\x0d\x1b\x95\xa3\x14\x83\x46\x33\x9a\x54\x6b\x33\x5d\x7f\xe8\x82\xc8\x38\x51\x00\x95\x42\x33\x65\x7a\x56\x8e\x47\x89\xc8\xcf\x0c\xeb\xb0\xff\x37\xce\xc4\xf8\x2c\xa7\x4a\x83\x34\x3a\x8e\xbb\xd6\x87\x89\xa1\x80\xf1\xe9\x28\x4f\x4f\x47\xbf\x0a\xa2\xe1\xca\xd9\xca\x5d\x1a\xd6\x06\x23\xc1\x18\x0c\xdf\x17\x72\xc9\x5a\x60\x26\x25\x7c\x93\x06\xdf\xdf\xa1\x45\x45\x02\xc3\x92\xf7\x12\x92\xdc\x73\x6d\x12\xc1\x21\x10\x93\xa9\x1c\x46\xd8\xf1\x8b\x85\x1c\x47\x39\xab\x91\x42\x8d\x0f\x28\xcc\xf8\x60\x74\xa1\x43\x09\x2d\x8e\x16\x56\x1c\x2b\xa4\x38\x4a\x38\x71\x8c\x50\xe2\x78\x61\xc4\x71\x42\x88\xe3\x87\x0f\xbf\x58\xe8\xf0\x17\x11\x36\x1c\xd1\x3f\x16\x29\x5c\xf8\x35\x42\x85\x0f\xd7\x06\x43\x22\x84\x07\xbf\x5e\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x3d\x84\x02\xbf\x86\xff\xff\xc5\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\x2f\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x2a\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x43\x46\x17\x77\x61\x81\xa0\xb1\x56\xe2\x7a\x25\x58\xd4\x9a\xad\xdb\x71\x0d\x33\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\x0e\xcf\x73\x4d\x0e\xc6\x3c\x6e\x71\x55\x0e\x64\xd7\x7c\x27\x1e\x89\x98\x68\xe0\xe4\x84\x71\xbf\x73\x4e\x1b\x56\x9a\xda\x3d\x12\xec\xef\x30\xbd\xbe\x7d\xe3\x07\xf9\xfa\xfc\x1e\xe8\x19\x52\xea\xa0\x3d\x5f\x8e\xc6\xe7\x5d\x5f\xee\xc1\x49\x99\xb5\xdd\x5f\xd6\x25\x16\xc7\xf7\xf5\xb6\xae\xfe\xfe\x16\xe9\xa9\x58\x11\xe5\x29\x71\xf8\x5c\x5f\xdf\x3e\x09\x0e\x75\x6f\x2b\x37\x55\x6c\x7a\x3b\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\xdd\x53\x04\xf6\xd7\xa7\x6d\xbd\x7e\xc4\x75\xaf\x6d\xfd\x52\xb4\xad\x06\x2c\xde\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x75\x22\x60\x2d\xc3\x55\xec\x82\x03\xd8\xc4\xb1\x1a\xf4\x10\xf1\xfd\x26\x65\x96\x2d\xac\x0d\xb1\x85\x80\xd9\x7d\x6b\xdd\xcf\x60\x05\x3a\x10\x5d\xa9\x6b\xa8\xab\x75\x93\x42\x0a\x27\x91\xc8\x92\x73\x23\x62\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x5b\xc0\x86\x2e\x08\x1d\x03\x3d\x67\x40\xea\xfc\xa5\x36\x21\x66\xd4\x89\x90\x09\x1b\x67\x0b\x32\xa3\x99\x51\x96\x5c\x90\xf6\x03\xcb\x32\xd7\x4d\x40\x50\x38\x68\xeb\x7a\xb6\x12\x4d\x26\xf8\x14\x27\x83\x5a\x42\xe0\x73\x01\x89\x19\x33\xc9\x80\xf2\xb2\xb0\x74\x1a\xf9\x68\x21\x4a\xe9\xe9\x0c\x8a\x8a\x6f\x8c\xce\x14\xe1\x2c\x1b\xf8\x29\x6f\x43\x60\xae\xee\xf9\xda\xa4\xac\x20\x75\xe8\x95\x8f\x4c\xc1\x00\xfb\xec\x4c\x93\xa5\xc5\x57\xed\xb7\xfb\xc6\x7e\x56\x48\x31\x67\x69\x1d\xa3\x6f\xb6\x05\xc6\xc7\x77\x1e\xeb\x13\xf6\xeb\x59\x2b\x17\x7c\xc8\x61\x4a\x51\x3c\x76\x0c\xcd\x46\x74\xda\xf1\x6d\xfc\x20\x4f\x59\x42\x35\x28\xcc\x49\x68\x41\xdb\xce\x19\xed\x4c\x89\x79\x9f\xc6\x8e\x22\x27\x5c\x10\x81\x99\x85\x25\x67\x7a\x81\x1e\xbd\x59\xa9\x49\x2a\x1e\xf9\x69\xc8\xc1\xb4\x61\x0e\x94\x8c\x41\xd3\x3a\x39\xd0\x8b\x64\x8a\x00\xa7\xe3\xcc\x9c\x3d\x8c\xf8\xbf\x5f\xbb\x01\xc8\x04\xa8\x2e\x25\x90\x29\xd5\x01\x5c\x62\x8d\x34\x6f\xd7\xf3\xe9\x6d\xc7\x94\xf3\xd7\x4d\x48\xc9\x15\x04\x0a\xb2\xd1\x54\x80\x8e\x19\xaf\xe6\x44\x8b\x52\x1f\xc8\x3d\xb2\xc9\x74\x64\x33\x77\x1a\x4a\x22\xcb\x41\x11\x51\x06\x58\xf2\x5a\xea\x9f\x1b\x2e\xa6\x86\xd7\xdb\x9d\xd6\xb6\xae\x6e\xd3\x18\x3b\xec\xba\x21\x95\x37\xf0\x09\x7c\xb8\x95\xcd\xa0\x7e\x7f\x7d\xf7\xb7\x1f\xce\xff\xe7\xe5\x0f\xdd\x16\xfe\x92\x26\xb3\x26\xb6\x38\x27\x14\x2f\x0a\x64\xf2\x33\x3a\x07\x42\x49\xc9\xd9\x7f\x97\x2e\xe4\xed\xa4\x1a\xaf\x23\x5b\x8d\x92\xde\x13\x24\xf8\x9a\x5b\xa2\x13\xe7\x88\xb1\xa6\x3f\x30\x85\x40\xd5\x48\x84\x0b\xfc\x17\x0a\xc8\x44\x8a\x7c\x49\xd1\x22\xd7\x55\x70\xdd\xc2\xdc\x30\xd4\xaa\x66\x33\x90\xdd\x24\xf2\xf7\x1f\x2f\xef\x30\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x11\x39\xe7\x0b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x19\xe1\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xce\x32\xeb\x34\xb2\xd5\x5f\xd9\x38\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x94\x25\x24\x07\x39\x05\x52\x50\x9d\xcc\x48\x4e\x17\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x46\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\xef\xd6\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xec\xed\x9b\x7f\xfd\xdd\x1f\x3a\xaa\xd7\x11\x0f\x6e\xd7\xd0\xa7\x80\x90\xa7\x76\xf8\x97\xdf\x60\x18\x74\xdd\x42\x86\x71\x3b\xc4\xee\x7c\xe4\x86\x8a\xf1\x69\x16\x6c\x00\x09\x36\x03\x86\x1a\x01\x87\xf5\x1b\xdc\x74\xb5\x05\x86\x5b\x02\x5b\x34\x74\x37\xa5\xc4\xb3\x82\xd5\x12\x9c\xb7\x7b\x39\x86\x2c\x78\x43\xb1\xbb\xba\xf1\x5c\x2a\xc4\x7e\x84\xda\x44\x65\x98\xb2\xe8\x23\x76\x58\x1b\xef\x30\x20\x6f\xc8\xbf\x93\xcf\xe4\xdf\xd1\x0a\xf6\xc7\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x09\xa5\xaf\x6e\x22\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x19\x33\x67\x8e\x80\xcf\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xa5\xec\xee\xd0\xe0\x82\xab\x49\x3b\xfa\xff\x95\xf6\x37\x0e\xfc\x9d\x50\xfa\xda\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x33\x16\xc0\x1c\x0e\xe7\xc4\x86\xc5\x89\xc6\xdb\xba\x4f\x6d\xad\x25\x9b\x3e\x5a\x64\x9c\x92\xd2\x28\x4b\x53\x88\x74\x84\xfa\x4d\x00\x15\x66\x36\xd2\x86\x30\xf0\x84\x6a\x34\xb2\xfa\x5a\xe5\x1d\xc6\x03\x67\x38\x56\x42\x79\x57\x19\xd6\x36\x09\x13\x90\xd2\xe6\x09\x8f\x17\x3e\xdd\x28\x78\xb7\x05\x71\xb9\x42\x0a\x2d\x12\xd1\x19\x36\x25\xe6\x56\xb9\x71\xb4\xe0\xdc\xa3\xaf\xb6\xf2\x8e\xff\xf9\xfd\xcd\x80\xdc\x5f\xdc\x0c\x88\x90\xe4\xee\x22\x2c\xf8\xa9\x69\x82\x39\xba\xbf\xb8\x39\xda\xeb\x0a\x34\x72\x98\xee\x2f\x6e\x3a\x74\xb2\x1a\x3e\x9b\xd3\x62\xf8\x00\x8b\x8e\xd2\x5d\x0c\x09\x73\x58\x6d\xac\x28\x2f\x64\xa7\x39\xa7\xc5\xce\xbd\x49\xa0\x29\x3b\x68\x24\x17\x9f\x75\x58\x51\x1a\x0f\xd2\x25\x17\x73\x48\xad\xd6\xec\x47\x01\x9e\x16\x82\x19\x1d\xa9\xc7\x79\x79\xaa\xf5\x38\x2f\xbb\xb7\x1e\xe7\x65\x5d\xeb\x71\x5e\x76\x68\x3d\xce\x8b\x6d\x3d\xce\x4b\x9b\x90\x43\xcc\x31\xea\x71\x5e\x9e\x6d\x3d\xce\xcb\xc6\xd6\xe3\xbc\xec\xd4\x7a\x9c\x97\xd5\xd6\xe3\xbc\x3c\xd1\x7a\x9c\x97\xaa\xf5\x38\x2f\x3d\xce\xcb\x97\xcb\xb5\x7b\x9c\x97\xe5\xd6\xe3\xbc\xf4\x38\x2f\x3d\xce\x4b\xb3\xf5\x38\x2f\x1b\x5a\x8f\xf3\xd2\xe3\xbc\xf4\x38\x2f\x4f\xb7\x1e\xe7\xa5\x73\xeb\x71\x5e\x76\x6b\x7d\xe6\xe1\x8e\xad\xc7\x79\xe9\x71\x5e\x96\x5b\x8f\xf3\xf2\x6c\x3b\x0c\xf3\x78\x8f\xf3\xd2\xe3\xbc\x3c\xd9\x7a\x9c\x97\x1e\xe7\xe5\xc9\xd6\xe3\xbc\x74\x68\x07\x67\x74\xed\x71\x5e\x7a\x9c\x97\xa7\xc6\xe8\xb5\xad\xdd\x5a\x8f\xf3\xd2\xe3\xbc\xac\xb4\x1e\xe7\x65\xb5\xf5\x38\x2f\x3d\xce\x4b\x8f\xf3\xd2\xe3\xbc\x54\xad\xc7\x79\xf9\xda\xed\x4e\x12\x14\xfb\x07\xdc\x88\x8c\x25\x8b\xe0\x6c\x9f\x5b\x50\xa2\x94\x89\xb9\xb1\xb1\x5b\x52\x60\xbf\x95\x45\x21\x48\xc8\x3e\x30\x08\x85\xdb\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\x97\x98\x82\x83\x80\x53\xf0\x2f\x78\xdd\x3d\x82\x60\xe8\xcb\x67\xdb\xe9\xeb\x66\x2c\x0d\xd6\xda\x9b\x2f\x72\x08\xe9\x9c\x4d\xd8\xa3\x6a\x17\x69\x51\x31\x5b\xb6\x71\x73\xd1\xa2\xc8\x58\x48\x62\x2c\x21\x77\x25\x4a\x17\xe0\x5c\xe0\xea\x1d\x49\x8a\x72\x40\x72\xc8\x85\x0c\x48\x8c\x88\xa0\xc1\xb5\xb6\xca\x21\xac\xd3\xad\x25\xc8\x4f\xbe\x16\x38\xff\x0b\xab\x2f\xd4\x28\x55\xd5\x5a\x31\xcf\x0e\x83\x62\xcd\xae\x26\xcb\xc1\xa8\x4c\xb7\xac\x40\xd7\x42\xdf\xba\xc3\xbd\xb7\xf5\x8a\x1c\xb1\xe0\xa7\x70\x6f\xa8\x55\x17\x22\x2f\x4a\x0d\xad\x8b\xcd\x4e\xb1\x55\x3a\x98\x0a\x65\xe8\xfb\xc9\x06\x4d\x04\x9f\xb0\xa9\xd3\xbe\xcf\x72\xca\xe9\x14\x86\xd5\x6c\x0f\x6b\xa8\x87\xb3\xce\x17\xf5\xde\x52\x41\x93\x8c\xb2\xee\x81\x83\xb1\xd8\xc4\x05\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x3c\xa8\xc2\xc6\x99\xe5\x1b\x23\xff\x95\xfd\xf1\x20\x40\x7b\xa4\x1a\x6d\x15\xa8\x18\xad\xd9\xa9\xe1\x0a\x23\x27\x34\x2b\x66\x4f\xab\x8c\x21\x29\x97\xef\x17\x9c\xe6\x2c\xf1\x07\xef\x3c\xcb\x44\x62\x4d\x35\x6d\x65\x33\xec\x4d\x2c\xf5\xe6\x95\xf2\xbc\xd4\x74\x9c\xc1\x88\x5c\x59\xe4\x0a\xc1\xb3\x85\x39\x96\x0a\xb4\x8f\x5c\x70\x67\x22\x4c\xc1\x0c\x09\x8b\x0d\x0c\x89\x5d\x2b\xab\xe3\x5e\xb3\x50\x1b\xc0\x0d\x87\x13\x1c\x08\x70\x2d\x17\x66\x5b\xde\x88\xf4\xce\xec\xcc\xd6\xd3\xc1\x08\x1c\x81\x91\xb0\x31\xa2\x60\x03\x23\x60\xe3\xc4\xad\x86\xc7\xac\xc6\x8d\x57\xad\x3d\x0b\x16\x40\xa8\x99\x08\xd4\xda\x16\x85\x48\x47\x6b\x38\x16\x11\x93\x40\x0a\xcc\x88\x37\x22\x35\xb2\x94\x04\xcb\xb6\xaa\x33\x6a\xed\x8a\x57\x86\xb8\x07\x34\x04\x52\x5d\x0b\x59\x74\x4e\x59\x66\x0e\x70\x20\x01\xab\x60\x8c\x61\xce\x9a\x48\x2e\x0c\x17\xb3\x7f\x48\x9b\xc5\x65\x7b\xb5\x12\xc6\x92\x99\x50\xc0\x91\x5f\xd2\x2a\xb1\xa7\x4a\x3b\x70\x2c\x26\xb5\x57\x74\x68\x70\xf1\xd5\x84\x40\x5e\xe8\xc5\x80\xc0\x1c\xe4\x42\xcf\x30\x08\xa1\x82\x13\x45\xb6\xc6\x14\xc9\x69\xda\xd8\x1d\x03\x22\xbc\x5d\x3a\x70\x78\xbc\x1f\x9c\xaa\x56\x66\xda\x2a\x6e\x4c\x55\xd9\x15\xfb\xde\x35\xb1\x51\x6e\x48\x28\xd3\x8c\x89\x52\x43\x10\x61\x35\x67\xdd\xf0\x6c\x49\xc4\xb3\xf0\x03\x52\xd1\xc8\x28\x31\x5b\x22\xa7\x9f\xd1\x6a\x49\x73\x51\x72\x6d\xe1\x6b\xac\x22\x51\x09\x7f\x36\xef\xe6\x15\xc3\xe8\x5e\x54\xe4\x27\x71\xae\x76\x9a\x7a\xc4\x8a\x9b\x18\xe9\xcb\x54\x6b\x90\xfc\x1d\xf9\x5f\x27\xff\xf9\xdb\x9f\x87\xa7\x7f\x3a\x39\xf9\xf1\xcd\xf0\xdf\x7e\xfa\xed\xc9\x7f\x8e\xf0\x1f\xff\x7c\xfa\xa7\xd3\x9f\xfd\x1f\xbf\x3d\x3d\x3d\x39\xf9\xf1\xfb\x0f\xdf\xde\xdf\x5c\xfe\xc4\x4e\x7f\xfe\x91\x97\xf9\x83\xfd\xeb\xe7\x93\x1f\xe1\xf2\xa7\x2d\x3b\x39\x3d\xfd\xd3\x6f\xba\x3b\x25\x43\x3d\xf0\xf1\xfc\xef\x91\xbc\xef\x2f\xe2\x7b\x77\x3c\x76\xef\x87\xdf\x5d\x81\x2b\xc7\xdf\x39\x2d\x9e\x3a\xfe\x32\xd8\x54\x73\x35\xa9\xc7\x67\x8a\x88\x9c\x69\x0d\xa9\xbb\x7b\x1b\x90\x38\x4b\x66\x22\xc7\xb0\x10\xcd\x8a\xe2\xed\xdd\x80\x66\xa9\xad\x4b\x9d\xc9\xaa\xee\x57\x34\x8c\x71\xc2\xf2\x22\x83\x1c\xb8\x46\xc6\x33\xf4\x2a\x2f\x5a\x19\x47\xf5\x1b\x24\xd6\x0e\x02\x9f\x13\x80\xd4\x11\xd9\xf3\xc6\x46\xeb\x79\x63\xcf\x1b\x9f\x6b\xc1\xa6\xf2\x18\x8c\xf1\xb6\x49\x84\x33\x71\x29\x2f\x29\xa3\xe1\xbc\x42\x4e\x10\x13\x8c\x9f\x98\xb3\xb4\xa4\x59\x13\x60\xd6\x63\x8e\x76\xe3\x00\x0d\xd3\x4e\x4e\x17\x2b\x96\x1c\xc6\x59\x13\xcd\x76\x50\x45\xfd\xe0\x83\x4e\x2e\xab\x3d\xce\x47\xe7\xd9\x23\x5d\xa8\x8e\xa0\x97\xdf\x08\x89\x81\x24\x4b\x83\x12\x21\x7d\x7c\x51\x53\xc5\x6d\x5b\xf8\xbb\x79\x08\xd7\x4d\x74\x1b\xa2\xc2\x29\xd9\xc7\xaa\x7a\xd0\xfb\x91\xdc\x44\xd4\x59\x21\x66\x9f\x77\x7b\xf1\x3b\xd0\xda\x19\x01\x97\xb6\x04\xad\xe7\xb4\x72\x8b\xb6\xa7\xc7\x86\x12\x21\xd4\xac\xf9\x72\x22\xcc\x9a\x60\x91\x86\xc9\x04\x92\x8e\x5a\xb0\x85\xf4\x58\x33\x8e\x0d\x6f\xd7\x8c\x97\x34\xcb\x16\x7e\x4e\x20\x25\x82\x77\x1a\x08\x3e\x33\x4d\x4a\xae\x59\x66\x36\x13\x91\x30\x2d\x33\xda\x34\x20\xba\x37\xf3\x51\x77\xe9\x88\x7c\xe4\x09\x34\x1f\xee\x66\xf8\x5e\x1a\xc0\x08\x1d\x19\x68\x48\x07\xd8\xf5\xf2\x0e\xc4\xb8\xb5\x16\xc7\xa8\x96\xa5\xd3\xf0\x7e\x2e\xab\xb8\xa4\x91\x3d\x88\x55\xd0\x04\x49\xd9\x64\x62\x46\x46\x25\x9d\x0b\x99\xd3\x55\xaa\x28\x4f\x3b\x8d\x6e\x24\x20\xcc\x56\x69\x82\x06\x63\xa1\x98\x23\xc5\x52\x48\xa8\x3c\x6a\x96\x18\x39\xcf\xf4\x4c\x94\xd3\x59\xbd\x2b\xc2\xa6\x9c\x28\x8d\xd1\x5a\x66\x32\x95\xb7\x78\x2c\x6d\x36\x65\x64\x1d\x9e\x80\x15\xc9\x04\xd8\xe3\xfe\x48\x3b\x8e\xbd\x12\x51\x60\x43\xc4\xed\x9a\xfb\x14\x2e\x0c\x09\x84\xb4\x91\x6f\xc7\xe1\xb3\x8e\xf0\xc2\x23\x72\x65\xf1\x33\x06\xed\x5e\x5b\x53\x62\x27\xa3\x11\x12\xe7\x83\x3b\x3b\xc6\x03\x2e\x0d\xc0\xaa\x8c\x35\x84\x39\xb6\x9d\x53\xbe\xf0\x09\x22\x18\xb2\x66\x13\xdb\xaa\x9c\x95\xac\x9b\xed\xbd\x3a\x4b\xaf\x5e\xb5\x47\x41\x52\x4a\xa6\x17\x17\x82\x6b\xf8\xdc\x89\xf7\xc5\xb8\xd5\xef\xda\x64\xb4\xee\x75\x4f\x22\x11\x85\xc5\x96\x5c\x2a\xdc\x34\x13\x65\x96\x22\xc2\x6e\xc9\x91\xed\x74\xbb\x51\xae\x26\xe6\x0a\xb7\xfb\x0d\x6f\x4c\x74\xa7\x2d\x13\xe6\x23\x45\x6d\xc0\xec\x7f\x97\x6c\x4e\x33\xe0\xba\xf1\x8b\x1b\x8c\x1d\x6c\xfe\xe8\x25\x7d\xae\x9a\xaa\x87\x5a\xc3\x80\x61\x21\xd2\x5a\xa1\x38\xf3\x53\x87\x1f\xc1\x67\xfd\x05\xfa\x5b\x51\x60\xba\x91\x6c\xce\x32\x98\xc2\xa5\x4a\x68\x86\x7a\xd4\xbe\x95\xf3\xf3\x0d\x74\xe1\xce\x94\x22\x53\x46\x00\x33\xca\xaa\x11\x35\x6d\xe4\x34\x3a\xfe\xa6\x94\x71\xac\x3a\x14\xe0\x1c\x72\x83\x2a\x1b\xba\x6d\xf4\xed\x82\x4a\xb3\x0b\x7d\x88\xb6\xbd\x1a\xc7\x42\x64\x0e\xa6\x36\x5b\xd4\x74\xb1\xee\x5e\x14\xe4\xc5\xe2\x6f\x1c\x1e\xff\x66\xa8\x50\x64\x92\xd1\x69\x7d\x35\x83\x5e\xc9\x77\x09\x8f\x1a\xdf\x38\xd1\x88\xc1\x5a\x1a\xc1\xc6\x48\x15\x75\x3c\x7d\x93\x83\x77\x57\xe8\xde\x9e\x22\x3f\xa1\x8a\x54\x63\x77\x13\x1d\x4c\xfb\xdd\x29\xde\x13\x17\xe7\x37\x7f\xbb\xfb\xeb\xdd\xdf\xce\xdf\x7f\xb8\xba\xee\x1e\x35\x2b\x34\x58\xeb\x4a\x43\xba\x4f\xaa\x40\x0f\xb3\x0a\x55\xac\xd0\x48\xa8\x11\xba\x4e\x10\xcc\x85\xa7\xe2\x31\xd0\xbf\x6c\xf6\x14\xd0\x6e\x92\x2b\x2d\x8a\x73\x99\x0b\x79\x23\xc5\x84\x65\x9d\x5d\x93\xb1\x4e\xf0\x12\x39\xde\xd3\x74\xee\x3e\xae\xaf\x1b\x8b\x2f\xb0\x1a\xe7\xd0\xb8\x32\x18\x66\xb1\x9b\x6e\xba\x5b\xb6\x5a\x39\x08\x36\x23\x62\x89\xc4\xee\x87\x68\xaf\x7b\x66\xef\xd9\x9b\x86\x8c\x8e\x3f\x8f\xe1\x89\xcf\x44\x42\x33\xac\x5f\x14\xb6\xf1\x49\x64\x27\xeb\x32\x5d\x8d\x6c\x13\xea\xb7\x33\xc9\x04\x4d\x51\x59\x75\xcc\x3f\x05\x8f\xaa\xed\xc5\x2e\x74\x9c\x07\x11\x72\x6f\x23\xfd\x71\x3c\x9f\x1e\x53\x48\xa8\xa4\x9a\xa5\xe1\x05\xe9\x5e\x6d\xd0\xb7\x0f\xed\x30\x04\xf7\x96\xad\x44\xce\xd0\x33\x57\x0d\xe3\x0e\x18\x9b\xa0\x05\x04\xcd\x40\x6c\x82\x9b\x12\x0d\x40\x3f\xf8\x65\x08\x28\x7c\x12\x29\x12\x00\x3b\x39\x90\xdd\x69\xe7\xa7\xda\x91\x36\x4c\xf9\x81\x99\x19\x9c\xd4\x4c\xda\x6f\x1b\x2f\x83\xd8\x58\xe5\xc0\xfd\xf8\x09\x4b\x6c\x79\xfe\x4f\x65\x30\x2e\x58\xb5\xc4\x64\xd8\x38\x5a\x85\x84\xe1\xea\xf1\x0a\x0d\x5c\xb8\x2d\xb9\x66\x39\x78\xec\x8b\xe1\x92\x4c\x24\xed\xd7\xc7\xaa\x42\x9a\x8d\xb2\xd1\x09\xf9\x33\xc7\xf3\xca\x21\x25\x43\xc2\x45\xbd\x44\xc0\x27\x42\x26\xe8\xa4\xd9\xeb\x06\x4f\x68\x41\xc7\x2c\x63\x21\xcc\x3c\xd6\x06\xc7\xc2\x0d\x0d\x7a\xd0\x9c\x94\xa6\x67\xa9\x14\x85\xbd\x89\x7d\x52\x6a\x78\x60\x60\x3b\xf9\xa9\x89\x31\x8c\x02\xfb\xa4\x4d\xc8\x54\x52\xae\x6b\x43\xee\xca\xc6\xf9\x25\xca\x20\x31\x84\x00\x9a\xc6\x2b\x81\x72\x9e\x1a\x9e\xd1\x5c\xb6\xe0\x73\x75\x68\x70\xaa\x17\xfe\xe5\x1a\xd9\x4f\xe4\xe6\xe3\xdd\xd5\xff\xb7\x74\x6e\xba\x8b\x76\xb6\x1d\x36\x98\xa2\xe1\x07\xd1\xb6\xcd\xad\xab\x40\xd5\x6f\x9c\xaf\x7b\xe3\x54\x06\xa2\xbd\x23\x41\xdd\x96\xbc\x5d\x05\xbf\x26\x8d\xe4\x41\xb2\xce\x4d\x05\x9a\xd0\xee\xb5\xe9\xeb\x91\x40\xcc\x23\x5c\x33\xf4\xbc\x35\xac\xb5\x5a\xd8\x22\x4b\x51\xea\xb5\x36\x6f\xd7\x09\xcd\xd4\x97\x7a\x45\x86\x98\x76\x0a\x29\x92\x0f\xa2\xe4\x71\xa0\xa5\x02\x76\x5c\x45\x08\x49\x81\x0b\xed\xac\x29\xa8\x4b\x88\x09\x7e\x4b\x6c\xd8\x54\x03\x35\xb2\x25\xe7\x04\x88\x59\xf7\x0d\xd1\xaa\xf2\xef\x7b\x39\xdc\xea\x2f\xa5\x82\x65\xff\x85\x93\xab\xea\x28\xaa\x89\xe8\x1e\x3c\x22\x81\xa6\xa8\x60\x16\x54\xcf\x2c\x9c\x59\x4e\xd5\x03\xa4\xf6\x83\x40\x28\x87\x2a\x07\x07\x5d\xfc\x7e\xa6\xef\xcd\xe4\xfa\xb4\x19\x34\x08\x5b\x50\x37\x4c\xd4\x09\x51\xc5\xf6\x7a\x1a\x02\x18\xbb\x59\x84\x8f\x3c\x5b\xdc\x0a\xa1\xbf\xa9\xaa\xb5\xed\xfb\x64\xfc\xc5\xb9\x23\xda\x46\x4c\xb4\x4b\x53\x24\x79\x88\x1b\x07\xf9\x62\xa3\xc6\x5c\x28\x5b\x34\x0b\xf2\x4b\xe5\x8a\xb2\xe4\xe7\xea\x5b\x29\xca\xce\x32\x5c\x4c\x7d\xf3\xdb\xab\xf7\x78\xf1\x95\x0e\xed\x87\x6b\xb9\xc0\xe2\xa3\xde\xe2\x15\xd1\x69\xf3\x67\x87\xab\xd4\xe4\x6c\xc1\x10\x2a\x84\x7c\xa0\x0b\x42\x33\x25\x2a\x93\x1a\x5f\xe7\x6e\xf5\xbe\x5c\xf3\xf5\x58\xe8\xd9\x8a\x13\xb7\x6b\x14\x88\x69\xab\xe3\x0d\x1a\xa0\x41\x75\x7e\x36\xe3\x2b\xc3\x6a\x4c\x2c\x2a\x24\x24\x90\x02\x4f\xbe\xd4\x13\xb1\x6f\x0c\x1b\x3c\x55\xd7\x82\x1b\xf6\xba\xef\x73\x75\x55\xd9\x27\xdd\x6a\x34\x4f\x11\x9a\xb2\x9d\x13\x91\x62\x98\x1e\x32\xd7\x52\x85\x64\x7d\x5d\x4d\xd0\xeb\x69\x37\xdd\xf7\xe5\x18\x32\xb3\xd8\x2c\xcb\xcc\x0e\x64\x29\xd5\x36\x34\x81\xe5\x74\x0a\x84\xea\xea\x10\x6a\x41\x80\xab\x52\xba\x7d\xd3\x31\x40\xc7\xb4\x2a\xb6\xc8\xbd\xda\x9f\xaf\xde\x93\x37\xe4\xc4\xbc\xdb\x29\x4a\x1c\x13\xca\x32\x84\x90\xc2\xe0\xbf\x25\x97\xec\xc4\x87\x27\x05\x4d\x01\xf2\x11\x22\xa4\xbd\x5a\x06\x84\x0b\xa2\xca\x64\xe6\xe7\x80\x09\x5e\x59\x84\x1d\x9e\x70\x50\x2e\x4c\xcf\x76\xe2\xdd\x87\x7f\x56\x20\xf7\x7d\x6c\xcd\x75\xf8\xe7\x57\xbc\x0e\x9b\x2a\xa2\x39\xfe\xed\x05\xb3\x67\x35\x07\x4d\x53\xaa\xa9\xbb\x26\xfd\x03\xfd\xae\xed\x2f\xcb\x80\xcb\x52\xc1\x0f\x8c\x97\x9f\x2d\x62\xe7\x41\xb8\x3d\xee\x2e\x91\x22\x92\xf8\x85\x16\x0d\xbf\x9d\xf7\x50\x44\x48\x8f\xbe\x6a\x1d\xa3\xc1\x06\xad\x1b\x6f\x09\x6a\xe1\x1f\xc0\x28\x42\x94\xa7\x22\x5f\x21\x72\x22\x24\x01\x9a\xcc\x3a\x53\xd3\x88\x1a\xe9\x0f\xa6\x6b\xbf\x6c\x87\x50\x06\x73\xc8\xa2\xd9\xf6\x7f\x30\xbd\x99\xc9\xf1\x3b\x17\xbb\x27\x19\x1d\x43\xe6\x00\x5b\x2c\x8a\x57\xc4\x13\x16\xc9\x06\x2e\x45\xc4\x90\x98\x5b\x61\x23\xb9\x68\x35\x11\xa6\xfb\x2f\x62\x1e\xa2\x06\x5f\xdc\xbb\xe8\x92\x7a\x1e\xd0\x06\xfa\x25\xcc\x43\x19\x20\x20\x92\xe5\x79\x30\xd2\x66\x7b\x1e\x50\xfe\x3a\xf4\x79\x50\x90\x24\x22\x2f\x0e\x24\x52\xf2\xde\x46\xe1\x1b\x8a\xb6\x8d\x8a\x6c\x3f\x4c\x83\xc2\x9d\x1d\x0e\x33\xd5\xf6\x1e\xf4\x60\xcc\xff\x57\xe3\x3a\x47\x6e\xb7\x7c\xc7\xbb\xd1\x83\x23\x32\xab\x11\x5d\x87\xbf\xc4\x1b\xaf\x0f\xc3\x6c\xb5\x57\x0f\xc3\x6c\x60\xb9\x51\x34\xcf\xb7\x42\x22\xbf\x86\x60\x4c\xa3\x04\xe0\xbc\x02\xc7\x84\xb2\x82\xea\xd9\x80\x48\xc8\x2c\x42\xba\x63\xcf\x0f\xd6\xe2\x75\x8c\x1c\xc7\x13\xe4\xd9\x4d\x1d\xb3\x6a\xc1\xdc\xa2\xc6\x6e\xae\x8b\xd7\xb4\xcf\x5c\x7f\xbc\x6f\x26\x00\x53\xbe\xb0\x30\x05\x01\xe9\xad\xb6\x1d\x9e\x58\xf1\x92\x31\x9d\xcb\xab\xf8\xd2\x21\x9d\x41\xfd\xad\x8f\xe8\x7c\xbd\x53\xba\x5d\x94\xe7\x72\x8c\x67\x54\x12\x96\x03\x3e\x57\xc7\x88\xb0\x72\xc1\x47\xc0\x5d\x9d\x07\x64\x00\xf9\x8b\xa5\xc8\x6b\xd9\x89\x61\x1c\x9a\xf1\xa9\x6a\x1a\x41\x68\x96\x45\x89\x49\x58\x67\x05\xf1\xa7\xa0\x42\x33\x5b\xb5\x06\xb4\xab\x6d\x84\x8c\xfe\x8c\x05\xe3\xcb\xb6\x44\x64\x46\xa3\xf8\xc2\xed\x10\xd3\x5c\xd1\x0b\x69\x66\x50\x33\x9a\xdd\x15\x90\x1c\xca\x6d\xf1\xed\x87\xbb\xf3\x36\x65\x28\x0b\x3b\xec\x46\xc0\xef\x09\x4d\x73\xa6\x14\x3a\x7c\x60\x3c\x13\xe2\x21\x68\xc8\x13\x9f\x6a\x3b\x65\x7a\x56\x8e\x47\x89\xc8\x1b\x59\xb7\x43\xc5\xa6\xea\xcc\x71\x94\xa1\x99\xb8\x53\xc2\x78\x56\x65\x2a\xa3\xb5\x90\x6b\xe5\x3c\x08\xc1\x2f\x4f\x92\xea\xed\x71\xeb\x61\x7e\x4a\x15\x9a\xbd\x3a\x3d\x08\xb0\x89\x9b\x77\xef\x52\xc7\xea\xae\x0a\xc3\xc1\x5f\xda\x59\x1b\xde\xbd\x09\x16\xe9\xbc\x38\x6b\xe7\xd1\x2a\xaf\x7b\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\xef\x6a\x92\x48\x0a\x16\x44\x04\x10\xcf\x8b\x6e\xcc\xb9\x47\xf7\xf6\x31\xd6\x12\x74\x3f\x3d\x8e\x85\x6f\x7a\x9e\x65\x66\x21\xa9\x03\x94\x69\x44\x77\xa2\x6a\x52\x61\xb8\x28\xb3\xe2\x16\xbe\xc5\x28\x0b\xcd\xb7\x08\xaf\xb9\x7f\xc2\xb4\x47\xcf\xf1\xf0\x3d\x5a\xd8\xb1\x29\xc9\xd9\x67\x43\x61\x73\xc4\x36\xde\x08\x3a\xfe\xd7\x7f\x1d\x50\x5a\x89\x60\xf0\x41\x05\xdb\x35\x30\x2b\xd4\x1c\xc4\x27\x47\x6b\x73\x6d\x99\x2f\xae\x41\x1b\x45\xcd\xce\x5b\xd3\xfb\x60\x14\x2b\x59\x46\x38\x0c\x21\x9e\x61\xd2\xf4\x0e\x47\xe5\x14\x81\xe7\x01\x3d\xc5\x8e\x26\x23\x83\x78\xe1\xed\xb5\x3c\xc7\x64\x4d\xfa\xce\xab\x79\x90\xc9\xf6\x5e\xe4\x17\xf4\x55\x91\x43\xf1\x57\x85\x42\xad\x34\x60\x63\xf6\x86\xb3\xd2\x84\xae\x61\xab\xc1\x4b\x37\x22\x5d\x41\xb4\xf1\x45\xe7\xbb\x97\x18\x31\x9b\xa3\x56\x41\xb8\x70\xe6\x91\x46\xdd\x77\xf8\x0c\x49\xa9\x21\x75\xc0\x56\xce\xa4\x6c\x41\x71\xda\xd4\x74\xa6\xc0\x27\xe9\xbb\x8a\x93\x6a\x50\xa3\x81\x3b\x5d\xa7\x82\xe6\x1a\x90\xff\x42\x2e\xe9\x70\x2c\xeb\x52\xf5\x37\xd5\xcf\xbb\x4e\x05\xc6\x51\x27\x94\x7b\xdd\x0a\x2b\x9e\x5b\x0b\xb7\x03\xb0\x72\x38\x1e\x63\x20\x05\x95\x34\x37\x77\xb0\x22\x6e\x79\xc6\x30\x65\x36\x2d\xb0\x71\x29\x56\x08\x58\xdd\x10\xdd\x50\xb1\x61\x9a\xe4\x6c\x3a\xb3\xa7\x85\x50\x2c\x0d\x49\x7c\xdc\x58\x26\x68\x4a\x90\xb1\x08\x49\x1e\xa9\xcc\x8d\x2c\x40\x93\x19\x06\xa1\x51\x4e\xd2\xd2\x9c\x07\x82\x78\x4d\x8b\xa1\xd2\x54\x1b\x1d\x13\x64\x80\x0d\xce\x4f\xd3\x1e\x8a\x97\xbc\x74\x61\xb6\x3d\xe3\xe9\x98\x93\x16\xc5\x0a\x72\xf9\x19\x92\xa5\xd2\xdf\x79\x8e\x10\x7f\xc2\x1f\x67\x8f\x54\x16\x2c\x0c\x1e\x88\xaa\xec\xde\xf0\x50\x64\x93\x0b\x37\xe1\xcc\x6b\x9f\xf6\x4f\xa3\x8f\xb6\x17\x41\x79\x27\x56\x03\xb7\xd7\xfc\x69\xb6\xba\x39\xb9\x16\x23\x48\xc8\xaa\x8e\x5c\x10\x59\x9e\x0e\xac\x4c\x25\x84\x26\x27\xc7\x67\xc7\xa7\x2b\x7b\xe1\x58\x35\xd3\x0c\x6c\x46\x74\xfd\x42\x8a\xe5\x45\xb6\xc0\x77\x38\xb6\xc5\xa8\x02\x8a\xbc\x9a\xe6\x03\x56\xab\x0a\x0c\x6a\x06\x59\x36\x20\xca\x88\xbf\xd4\x83\xdf\xda\x4f\xcd\x43\x5a\x96\x89\x35\x93\x9d\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xb6\x0e\x0f\x72\x8f\x3a\x64\x10\x4d\x15\x11\x0b\x51\x62\xbd\x64\xbb\x6c\x15\x5e\x72\x42\x8d\xfa\x53\x5a\x19\xdd\x82\x6e\x40\x16\x50\xff\xd7\xb4\xcb\xcf\x4c\x1b\x51\x44\x97\x68\xa6\x78\x63\x35\x05\x30\xec\xd5\x5c\x78\xe6\xa6\x3b\x9b\x01\xcd\xf4\x6c\x51\x69\x2f\xb6\x14\xad\x22\x25\x77\xdf\x84\xcb\x50\x07\x90\x36\x7a\xb8\x09\x9c\xae\x22\xf6\xfd\x4c\x82\x9a\x89\x6c\xef\x69\x9c\xbe\x4c\x6a\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\xb9\x52\xad\xc2\x01\x9e\x9a\x53\x26\x21\x75\xc2\x92\x43\x4f\x9c\xd1\x39\x4a\x0a\x46\x9e\x83\x34\x44\x35\x69\xea\x44\xbf\x8f\x59\xc8\x75\xff\x35\x53\x4d\x9b\xca\x22\xce\x2d\xfd\xed\xed\xcd\x45\xeb\x96\xc6\x0f\xbe\xc3\x63\x7c\x31\x83\xe4\xe1\x36\xac\xa0\xc8\x81\x84\x16\x14\x42\xee\x53\x30\x30\xc3\x47\x93\x0a\x6e\x84\xd4\x84\x57\xa5\x91\xcd\xd9\x9a\xe2\x2a\x82\x9c\xb3\x04\x46\xbe\x6c\xb2\x77\xce\xfb\x02\x38\x94\x4f\x81\xbc\x35\x07\xe2\x8f\x7f\xf8\xc3\xef\xff\x10\xce\xa3\xc3\x91\xcc\xc3\x0f\x02\xc1\x60\x28\x7c\xf1\x43\x11\xbb\xee\x2c\x39\xeb\x8c\xcd\x8e\x52\x54\xea\x32\x9a\x54\x6b\x33\x5d\x7f\xe8\xc2\xac\x92\x0a\x80\xac\x71\x57\x18\xd6\x61\xff\x6f\x9c\x89\xf1\x59\x4e\x95\x06\x69\x74\x1c\x77\xad\x0f\x13\x43\x01\xe3\xd3\x51\x9e\x9e\x06\x54\xb8\x23\x0d\xb5\x7a\x05\x5b\xbc\x05\x33\xb3\x01\x27\xdc\x4c\xca\xde\x4d\xf0\xc4\x53\xf9\x8e\x1c\x75\x03\xa6\x36\x4b\xf0\x2d\xc4\xc9\x44\xfb\xee\xfe\xfe\xe6\x5b\xd0\x4d\x86\xcd\xf1\x43\xf2\xed\xe5\x7d\x55\xf1\xca\xec\x2e\x9b\xd4\xd4\x73\xed\x10\xae\x3d\x13\x61\x25\xcf\x62\xfb\x5d\x2c\x2b\x41\x98\x6d\xce\x21\x31\x0b\x3d\x68\x15\x57\xf1\x71\x88\x57\x37\x23\xf2\x57\x51\xa2\xc8\x45\xc7\xd9\x82\x3c\x52\x8b\x68\xa0\x20\x8c\xa7\x1c\x19\x32\x8e\x0c\xd7\x32\xbb\xfa\x3b\xa0\xa9\x2d\x97\x80\xa6\x9d\xbd\x9f\xd5\x06\x4d\xd1\x96\xed\xa2\x54\x5a\xe4\x64\xe6\x5e\xd5\xce\x61\x5d\x53\xce\xca\x46\xf6\x08\xa2\xef\x47\x11\x09\x85\xd5\x96\xdc\x6f\xbe\x0a\x5d\x68\x85\x0b\xd9\x79\x6e\x54\x1e\xa2\x24\x69\x4e\x95\x13\xf4\xd1\x84\xc9\x1c\x8f\xea\x6c\x12\xab\x5b\x94\x02\x9e\x24\x52\x11\x4f\x12\x5e\xc8\xd3\x77\x12\xee\x84\x8c\x53\x12\x94\x44\x29\x0b\x4a\xa2\x57\x7b\x24\xce\xd5\xe6\x36\x97\x0d\xc0\x31\x84\x86\xa2\x12\x12\x6f\x4c\xae\x6a\x71\x50\x2e\x38\x4b\xac\x3b\x83\x94\x85\xe0\x44\x94\xba\x28\x35\x9a\x82\x12\xaa\x60\x38\xa7\x92\x19\x86\x6a\x6b\x2a\x57\x91\x50\xdc\x9c\x76\x2d\x04\xda\x49\x2a\xa7\xb3\xa5\x38\x9c\xcc\x48\xd2\x8c\x69\xb8\xd9\x22\xaf\xf0\xca\xe2\x84\xef\x68\x72\xd0\x36\x18\x62\xcb\x58\xcd\xe2\xa9\x75\x54\xcf\x30\xb2\x0f\x7d\x59\x3e\x30\x14\x19\xa7\x51\x1b\x0e\x20\xf1\x26\xaa\x16\x1b\xc8\x12\xd0\xdf\x2e\xe4\x92\x1e\x6c\x28\x5c\x9d\xc3\x48\xb1\x26\x2f\xaf\x56\x37\x4b\x20\x8f\xc1\xc8\xf6\x57\xe7\xd7\xe7\x7f\xbb\xfb\x74\xf1\xb7\xeb\xf3\x0f\x97\x21\x5d\x07\x97\x2f\x8b\x59\xc0\x2c\x5a\x09\xb3\x17\x2a\xf0\x68\x9a\x4a\x66\x70\x38\x61\x26\x77\x48\x4d\x13\x94\xcc\xe9\x00\x8d\xd2\x3a\x61\x28\x75\x64\xc9\x68\x6a\x18\xcf\x5e\x39\x8e\x8b\x2a\x78\x0f\x19\x5d\xdc\x41\x22\x78\xba\xf7\xe8\xec\xeb\x8a\xd9\x28\x4b\x50\x55\x51\x08\x96\x10\xb3\x7c\x0d\x2f\x57\x07\xc9\xc7\x07\x34\x43\x1a\xec\xfb\x75\xf6\x5a\x93\xc3\xf3\x5c\x93\x83\x31\x8f\x17\x20\x19\x46\x04\x1d\xc2\xae\xf9\x4e\x3c\xba\xe2\x60\x27\x8c\xfb\x9d\x73\xda\xb0\xd2\xd4\xee\x91\x70\x34\x35\x2d\xc8\xdb\x37\x7e\x90\xaf\xcf\xef\xe1\x22\x7d\x0e\xda\xf3\xe5\x68\x7c\xde\xf5\x55\x87\x2d\xb5\xdd\x5f\x21\xf1\x43\x64\x89\x8d\xbf\x1d\x55\x79\x6a\x6f\x91\x9e\x8a\x15\x51\x9e\xfa\x90\xb3\xaf\x6f\x9f\xe8\xa4\xb8\x13\xc9\x43\x24\xb3\xeb\xfd\xc5\x8d\xed\x6d\x29\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\x3d\xb6\x69\x5d\x34\x7b\xb7\xb3\x01\xf5\xb8\xd7\xb6\xea\xe6\x05\x1f\xd9\xae\x80\xd2\x6b\x5b\x1b\x5a\xaf\x6d\xed\xd0\x7c\x25\x5a\x26\xf8\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x24\x75\xf5\xd9\x49\x2d\xc3\x55\xec\x82\x03\xa4\x96\x7f\xf8\xa2\xba\x64\x6a\xde\xc4\x86\x47\xa3\x0d\xb1\x0e\x2c\x2e\x65\x80\x98\x77\x3f\x73\x5d\x3b\x11\xd7\x3b\x99\xd7\x51\x57\xeb\x26\x45\x05\x86\xee\xab\x86\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x9a\xe9\xf2\xb5\x9c\x2d\x88\x96\x2f\xbd\x57\x13\x62\x46\x9d\x08\x99\xb0\x71\xb6\x20\x33\x9a\x19\x65\x09\x4b\x02\x53\xf2\x80\xa5\x6c\xb1\x9b\xee\x13\x75\x07\x2e\x57\xd3\x4a\x34\x99\xe0\x53\x9c\x0c\xea\x72\x32\x3e\x17\x90\x98\x31\x93\x0c\x28\x2f\x0b\x4b\xa7\x91\x8f\x16\xa2\x8c\x90\x96\xe1\x1d\xdf\x95\x3c\xc5\x99\x83\x1f\xb1\x85\xdb\x9e\xdc\xf3\xed\xe4\x5a\xf2\x51\xcf\x40\x3e\x32\x05\x83\xee\xa5\x6b\x89\x37\xfb\x2e\x95\x91\xb3\x9f\x55\x10\x2a\x2e\x73\xd0\x6c\x0b\x4c\x65\xed\x3c\xd6\x27\xec\xd7\xb3\x56\x2e\xf8\x90\xc3\xd4\x02\x35\x38\x86\x66\x23\x3a\xed\xf8\x36\x7e\xb0\xca\x36\x50\x5a\x14\xad\xba\xbd\x73\x46\x3b\x53\x82\xa0\x10\xf5\x8e\x22\x27\x5c\x10\x51\x98\xab\xab\xe4\x4c\x2f\xd0\xa3\xe7\x4b\x46\x07\xe4\x5b\xdd\xbb\x30\x07\x4a\xc6\xa0\xa9\xb3\x81\x9b\x43\x50\x61\xa2\x23\xdc\xb9\x39\x7b\x98\x24\x70\xbf\x76\x03\x54\x30\xe9\x53\xaa\x03\xb8\xc4\x1a\x69\xde\xae\xe7\xd3\xdb\x8e\x29\xe7\xaf\x0b\xc4\x61\x3e\x0c\x64\x43\x73\xa2\x45\xa9\x0f\xe4\x1e\xd9\x64\x3a\xb2\x10\x17\x0d\x25\x91\xe5\xa0\x88\x28\x23\xd5\x9b\x78\xeb\x86\x8b\xa9\xe1\xf5\x76\xa7\xb5\x4d\xe9\x94\x75\xaa\x3a\x1c\x63\x8b\x6d\x00\xef\x77\x79\xb8\x0d\xfc\xca\x71\x39\x99\x80\xc4\x9b\x0e\x09\x5e\x09\xbb\xaf\xea\x78\xf9\x3b\xac\x9b\xf1\xd6\x05\x7c\x81\x1e\x60\xed\x00\x07\x26\xb1\x61\x48\x07\xb2\x89\x65\x7a\x25\x28\xc4\x82\xe7\xe4\xf2\xe3\x37\xdd\xb6\x68\x8c\xca\x02\x61\x29\xab\xf8\x9e\x1f\x79\xb7\x98\xc4\xb8\xfb\x61\x1d\xea\x8b\xdb\x16\x49\x26\x94\x4b\x8f\xc6\x75\x49\x66\x94\x73\xf0\xc6\x28\xa6\xd1\x92\x3d\x06\xe0\x44\x14\x60\x83\xf2\x3a\x11\x43\x89\x62\x7c\x9a\x01\xa1\x5a\xd3\x64\x36\x32\xd4\x71\xbf\x17\xea\x3c\x64\xf7\x89\xd2\x12\x68\x6e\xf7\x84\x84\x9c\x32\x3b\x3c\xa1\x89\x14\x4a\x91\xbc\xcc\x34\x2b\xaa\xce\xba\x59\x11\x01\x11\x21\x94\x4d\x4b\xf5\x6b\x85\x69\x25\x75\xc2\xf3\xa0\xa6\xd0\xbd\xbe\x68\x16\x2b\x42\xd3\xd9\xc0\x7c\x0b\x79\xa1\x17\x55\x62\x62\x37\x1d\x68\xc2\xa4\xd2\x24\xc9\x18\x70\xed\xde\xcc\x42\x0e\x22\x0d\x03\x2f\x4e\x73\x37\x23\xca\x4d\x09\x4f\x51\xf9\x2e\xb4\xb2\xf9\x77\x15\x11\xbe\xab\x94\x29\x67\xeb\x50\xdd\xb2\xff\xa8\xaf\x4c\x63\x37\x8e\x9f\x11\xdc\x3a\x5e\xc0\xb1\x14\xb9\x8f\x1a\x24\x34\xea\x6c\xd7\xb9\x93\x61\x7c\x05\xcb\xc7\xf8\x73\x3d\x68\x61\x0e\xd4\xba\x05\xa6\xc2\xac\x70\x1d\xdc\x50\x1c\xe6\xe6\x1c\x40\x02\x46\x14\xa5\x11\x99\xcc\xab\xf3\x98\x86\x2c\xf7\x01\x94\xa2\x53\xb8\xe9\x18\x8e\x10\x83\xe1\xd4\x86\x36\x8c\x63\xa8\xb7\xcd\x0c\x2c\xd0\x95\x16\x8d\x4f\x9a\x49\x5e\x4d\xe5\x31\xb7\x2f\xd2\x89\x02\xaf\x34\x3d\x4a\xa6\x35\xe0\x2e\xc5\x4a\x4e\x18\x80\xb6\x0c\xde\xd9\x4e\x2e\xeb\x34\x9e\x9b\xf4\xe6\x78\x46\xfc\xe0\xa9\x4d\xd3\x1a\x03\x19\x4b\x06\x13\x32\x61\x98\x37\x86\x19\x55\x03\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x90\x29\x66\x71\x39\x25\xf8\x5f\xde\xfc\xdb\x1f\xc9\x78\x61\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xd4\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfd\xdd\xc3\x38\xe8\xe8\x21\x7f\x3c\x4b\x61\x7e\xd6\xd8\x42\xc3\x4c\x4c\xbb\xf5\x7a\x11\x23\x9b\x38\xc8\xce\xb6\xe6\x44\x8b\x8c\x25\x8b\x7d\x9d\x69\x5f\xbc\x84\xcc\xc4\xa3\x35\xe6\xac\x1e\xd5\x06\xd4\x4b\x21\x8a\x32\xc3\x89\x23\xdf\x54\xf8\x7c\xa5\x82\x65\xe8\xa3\x50\x23\x61\x83\xdb\xa1\x13\xd5\x0d\xbb\x74\xe7\xb8\x14\x46\x4f\xa6\x70\xc0\x13\xce\xe7\x56\xd5\x21\xe9\x6c\x8d\xfb\x86\x66\xd9\x98\x26\x0f\xf7\xe2\x07\x31\x55\x1f\xf9\xa5\x94\x42\xb6\xdf\x39\xa3\xe6\x4e\x9f\x95\xfc\x01\xab\xe8\xd6\x60\xb4\x62\xea\x62\x0a\x3d\x7e\x40\xe3\xed\x3a\x11\xe3\xdf\xd2\xc2\x83\x7a\x91\xc4\xdb\xe0\xea\x91\xe1\x33\xab\x0d\x6d\x9c\x80\xa1\xb9\x6b\x02\x3e\xb4\xde\x43\x35\x8f\xf6\xef\xde\xfc\xcb\xbf\x5a\xe6\x42\x84\x24\xff\xfa\x06\x53\x8e\xd5\xc0\x5e\x00\x78\x03\x1b\x51\x2b\xa7\x59\xd6\xd5\x4b\xd0\x64\x01\xdf\x74\x2e\x4e\x7d\x00\x47\x5e\xef\xed\x74\x6f\xad\x32\xde\xdf\xff\x15\xf5\x45\xa6\x15\x64\x93\x81\x45\x7b\xa9\xcc\x5a\xc7\x28\x5d\x1d\xbb\x2b\xaf\x3b\x52\xd0\xfe\x95\xb6\xb9\xc8\xca\x1c\xde\xc3\x9c\x25\xdd\x1c\x98\xad\x55\x69\xf5\xe6\xcd\xf4\x19\x53\x08\x02\x34\xce\x44\xf2\x40\x52\xf7\x65\x23\x54\x7e\xb9\xaa\x76\xf7\x59\xe8\x9a\x34\x10\x90\x2c\xb0\xf1\xfd\x5b\x69\x02\x39\x2d\x8a\x0a\xa1\x44\xd2\xc7\xd6\x64\x20\x6b\x42\x74\xd4\x40\x37\x62\xb0\x33\x3d\xd4\x95\x3e\x74\x6f\x64\xae\xa9\xce\x5d\x74\xce\x2d\x08\xf7\xc4\xd7\xd4\x77\xf7\x63\xb6\x36\x44\xdd\xa1\x3f\x0d\x05\xfe\xdb\xe2\x2d\xac\x20\x63\x55\x90\x43\xd5\xc6\xb0\x12\xa4\xd9\x3e\x78\xcb\x74\x37\x5f\x46\x70\x86\x86\xe5\x48\xb4\xe6\x85\x57\x4e\xe8\x9c\x6a\xa7\x1f\x79\x2f\x3b\x25\x05\x48\xc5\x94\x11\x9d\x3e\xe1\x81\xba\xc8\x28\xcb\x1b\xee\xbb\x7d\x4d\xc2\x6a\x44\x7d\x4e\x8b\xe1\x03\x2c\x3a\x6e\xb8\xc0\xe3\xb2\x29\xc0\x3f\xa7\x45\xc7\x7b\x00\x4b\xd7\x86\x5f\x03\x1d\x2f\xe7\x1b\x91\x3a\x3a\xf0\x7a\xb0\x25\x89\x5f\x44\x8d\x8d\x28\x03\xed\xfb\xca\xf9\x54\x2f\x5c\xfb\xc6\x31\x9f\x54\x57\x8e\x7d\xea\x6b\xba\x68\xf0\xfd\xbe\xd4\x7b\xa6\x22\x3e\x12\x3b\x0d\x8a\x74\xc2\xdb\xc9\xed\x8c\xf6\x75\xd4\x32\x68\xd9\x93\xd9\x50\x7d\x9d\xa1\x69\x64\x8b\x02\x04\x10\x60\x8e\xa2\x1b\x94\x1c\xbf\x3b\xde\xeb\x1d\x67\x57\x46\x8a\x82\x4e\x51\x33\x3d\x84\x05\x5a\xa6\xa9\x89\x41\x3b\x13\x8f\xf6\x7b\x1b\x5d\x52\xb8\xa7\x20\xad\x81\xcc\x67\x22\x68\x75\x6c\xe4\xa0\xdf\x11\x4e\xbb\xb6\x58\x85\x8f\x74\x41\xa8\x14\x25\x0f\x4a\x83\x46\xc7\x48\xe5\x38\xfb\xb0\xf4\xb2\xd7\x82\x83\x77\xd2\x87\x8c\x72\x5f\x63\x98\x33\x65\xe3\x15\x18\x27\x6f\x47\x6f\xdf\x04\xd3\x7e\x0b\x49\x29\x15\x9b\xc3\xad\xab\x71\xde\x70\xaa\x5c\x4d\x6e\x84\x52\x6c\x9c\x61\xe2\x96\x16\xe4\xd2\x16\x80\x5f\x7d\xd1\x2a\x70\x04\xdf\x58\xc8\x26\x5a\x69\x00\x85\x27\xf6\x04\x37\x03\x3e\xcd\x00\x01\x51\x1f\x87\x25\x49\xe2\xba\x2e\x49\x92\xd7\x95\x24\x69\xef\xbd\xbd\xbe\xab\x2f\x7c\x7f\x08\x9c\xe4\x83\xf3\x0d\xd4\x95\xed\x99\xaf\x9c\x8c\x1f\x3d\x4a\xa6\xdd\xe1\x7e\x64\x0a\xc8\x09\x5a\x25\x96\x36\x63\x10\x40\x73\xd3\x86\x15\x58\x01\x3f\x06\xc0\xb2\x5c\x3e\xba\x87\xb0\x4a\xab\xfc\xa4\x8e\xc0\x7f\x74\x06\xac\x7a\x05\x1d\xf7\xaf\xef\xe5\x19\xe5\x69\x16\xc4\x33\xaa\x59\xc9\x16\x41\x58\x38\x57\x13\xd2\x64\x89\xce\x7f\xd9\xa8\x26\x31\xa3\x8a\x70\x41\x72\xa0\x18\xa0\x69\x6e\x17\xcf\x05\x5b\x58\xcd\xf1\x68\xb0\x9b\xdd\x5e\x63\xcd\x0b\xc1\xb1\xeb\xf7\x4c\x39\xf6\x6c\xf8\x88\xd3\x40\x6c\x58\x47\x4e\xd3\x90\xd4\xee\xc6\x9c\xd6\x8b\x37\xaa\x83\x26\x97\x29\xa9\x2f\x8e\x25\x5a\x5e\x82\x8e\x81\x2b\x41\x6e\x86\x2f\x31\x4e\x70\x8d\x59\xae\x0e\x92\x09\xf2\x66\xdb\xb6\xfc\xba\xd5\xb5\xb8\xf2\xae\xeb\x29\xae\x08\x0e\xa0\xe1\xf9\x57\x1d\x34\x78\xa1\x8f\x11\xb5\x2e\x75\x57\x03\xc5\x65\x3c\x86\x21\x79\x7b\xa7\x44\x65\xee\x99\x02\x07\x49\x9d\x5f\xc1\x87\x88\x3a\xf0\x15\xaa\x04\x0f\x3d\x10\xcf\x6c\x38\xc3\xef\x9f\x17\x53\xec\xcf\x02\x08\x41\x39\xe7\x44\xc8\xa5\xd3\xee\x3c\x26\xeb\x24\x96\x98\x6f\xbd\x04\xcd\x65\x37\x7f\x03\xf3\xd3\x2c\xca\x7f\x97\x6c\x4e\x33\xb0\x18\xf6\x9e\x35\xec\x55\x98\x50\xe5\xf8\x50\xd5\x46\xa7\x1f\xa2\xda\xb1\x3e\xe8\x61\xa3\x06\x19\x49\x9e\x38\x3a\x22\x27\x76\x8c\x63\x0b\xb2\xbb\x5f\x21\xd7\xad\xd5\xe5\xe7\x22\xa0\x72\x6b\xbc\xf5\xba\xfc\x5c\x50\x8c\xd3\x28\x0e\x62\xe1\xfe\x27\xcc\xe8\x1c\x10\xd3\x98\x65\x54\x66\x18\x94\x7e\x67\xa7\x8c\x8c\x4b\x4d\x80\xcf\x99\x14\x3c\x37\xc7\x0f\xc1\x67\x0c\x67\x92\x80\x60\xf0\x09\x28\xf2\x9b\x93\x4f\xe7\xb7\x98\xb4\x74\xea\xd0\xf2\xdd\xfb\x95\x0a\xf1\x01\x96\xde\xa1\xd1\xdd\x21\xee\x37\xe2\xdf\xdd\x6c\x17\x94\x4f\xfc\x5c\x98\x77\xcb\x4b\x5d\xd2\x0c\xa1\x9f\x93\xac\x34\x77\xe1\xde\x76\x76\x7c\x1b\x78\x88\x25\x2f\xa6\x09\xdc\x01\x7f\xbf\x67\x9d\x8e\x6b\x8c\x83\x7a\xd1\xd8\xaf\x2b\x30\xe4\x9d\x6b\x3c\xac\x01\xa1\x5c\x11\x74\x8e\x55\x05\x4c\xd9\xcc\xc3\x71\x77\x71\xb7\xf0\x0c\x2c\x9d\x60\x93\xbf\x7d\x4d\xd2\x15\x0b\x23\xd6\x68\xd9\xbb\x0d\xbf\xc3\x61\x88\x77\x0c\x3a\x18\xa2\xe3\xec\xfa\x94\xab\x0b\x5c\x9a\xdd\x28\x0e\xdb\xe8\x77\x95\x26\x6b\x36\xc2\xfb\xeb\xbb\x66\x41\x0f\xeb\xfc\x13\x3b\xaf\xe4\x4d\xdd\x45\x5d\xf5\x06\x2b\xe2\x55\x0e\x54\x90\x53\x2b\x4e\x23\xf2\x6c\x25\x5f\xbf\xbf\xbe\xdb\x71\x2c\xbf\x9b\xad\x30\x3c\xa6\xca\xc6\x48\xbf\xbf\xbe\xb3\x71\x6b\xbb\xd1\xde\xd9\x91\xd2\xdd\x07\x81\x00\x6e\x88\xad\xd5\x81\x63\x87\x73\xb9\xf3\x2a\x1e\xc4\x2c\x3e\xfa\x7c\x2d\x35\xe4\xea\x86\xd0\x34\x95\x18\xce\xdc\xe5\x2c\xb7\x10\xed\x68\x51\x54\x51\xa9\x58\x24\x86\x2a\x68\xbe\x7a\x63\x0f\xa0\xe0\xd3\x71\xfd\x6c\x7b\x5f\x16\x19\xb3\xe1\xa7\xcd\x21\xea\x12\x3a\xb9\x98\x77\xe1\x4f\x21\x1e\xc6\xce\xfe\xc5\x20\xf9\x20\x2a\xe6\x9c\xe8\x5a\x9e\x36\xf6\x2e\x95\xa0\x44\x36\xaf\x8b\xe7\x07\xef\x4e\xc7\x8e\x30\x24\xb1\xda\x9d\xbe\x02\xed\x0b\xed\x4c\xe0\x5a\x32\x58\xdd\x95\xe4\xd6\xbc\x5d\x89\xec\xac\x22\x81\xcd\x01\x53\x96\x5c\x85\xe0\x0e\x23\xe3\x30\x3e\xef\x96\xe8\x99\xcd\xba\xa1\x1a\x4f\x26\x95\x5e\x14\xc0\x37\x0f\x78\xc5\xbd\x1c\x91\x25\x64\xfa\xf4\xfd\xf5\x9d\xbd\x49\xed\x74\x39\x3c\x6f\xb5\x76\xef\x74\xbe\xe4\xc8\xfe\xcb\x24\x85\xb8\x6d\xa2\xe5\x94\x56\x25\x4d\xd9\xda\x09\x3e\x56\x81\x10\xa9\xb7\x2e\x34\x21\x2c\x11\x38\xc0\x72\x10\x84\x54\xda\x8e\x0d\xf1\x69\xaf\x4f\x4c\x16\x8e\xb6\x97\x77\x8d\x7a\x57\x28\xa0\x32\x99\x75\xd9\xd8\xb1\x2f\x0b\x4b\x09\x49\x85\xcd\x10\x9b\x08\x89\x1e\xf8\x21\x8a\x3a\x99\x10\x0f\x65\xf1\x32\xd2\x8d\x1b\xb8\xa0\x7a\xf6\x62\x97\x48\x6b\x8c\x5e\xbe\xe9\xbe\x67\x53\xae\xba\xe4\xb9\x04\x2a\x5f\xa0\xad\xca\x85\x23\xd7\x48\x6d\xbb\x5f\x46\x2d\x33\xd8\x45\x56\x2a\x0d\xf2\x1b\x26\x95\x3e\xda\xb5\xa7\x4f\x34\x63\x0e\x38\xd9\x86\xb0\x1c\x37\xbb\xfb\x0b\xd3\x33\x57\xa8\xf7\x78\xd0\xfe\xca\xfc\xed\xc8\x38\x26\x42\x92\xe3\x6b\xc1\x61\xe7\xe0\xa1\x25\x0d\xb4\x12\x7c\xaa\x2b\x7d\xa3\xcc\xe6\x26\x51\x41\x66\x41\x55\xf0\x8b\xce\xe7\xec\xde\xd5\x4e\x36\xf4\x78\x49\x41\x81\x26\x14\x8b\x4e\x62\xdf\xb3\xba\x60\xb1\x2d\x8e\x66\x0b\x3d\x0b\xa7\xf3\x2e\x1a\x4b\xbb\xe3\xe0\x8d\xea\x6a\x5a\x6c\x5e\x80\x2e\xaa\xed\xce\xe7\x0c\x11\x43\xc0\x95\x93\xf9\x81\xf1\x87\x1d\x0f\x79\xd8\x09\xb9\x5c\x19\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\xb1\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xba\x2a\x6b\x0c\xe0\x6a\x60\xc3\x5c\xbc\x85\x5b\x2d\xb8\xa6\x58\x6b\xfb\xbd\x48\x1e\x40\x92\xcc\xd0\xbc\xeb\xe6\xab\xf3\x58\x5b\x55\x95\x77\x4e\x6b\xe9\x1a\x91\x01\xc5\x0c\x72\x90\x34\xab\x0c\xa0\xaf\xba\xe8\x3f\xb8\xdb\xbb\x22\xa3\x99\xc4\x69\xcb\x23\xba\x42\xb9\x22\x1d\x91\xcb\x75\x4f\xe5\x74\xe1\x0b\xbf\x33\x8e\xbe\xc3\xcf\x4c\xe9\xdd\x6f\x98\x42\xa4\x4d\x8c\xd4\x52\x81\x1c\x56\x98\xb9\x84\xba\xe2\x8b\x3e\x9f\x36\x85\x71\x39\x9d\x32\x3e\x1d\x59\xf1\x00\xc5\x90\xba\x40\x6c\x6d\x0b\x7b\x9c\xc1\xae\x11\x32\x89\x04\x8a\xf1\xc3\xa8\xac\xd8\x90\x09\xd6\xec\x3d\x17\xa9\xed\x7c\xbc\xb0\x16\x58\xbf\x27\x2b\x20\x25\x72\xc5\x89\x90\xae\x2e\x06\x4d\x53\xb2\x73\x98\xce\x9a\x15\xc1\xbe\xea\xf9\xb5\xc4\x95\xb5\x7f\xfe\x58\xd5\xbf\x6a\x2c\x90\x2a\xc7\x46\xf6\x2d\xe5\xae\xb5\xae\xbb\xca\x28\x9d\xe4\x93\x50\x59\xf4\x9c\xd7\xdb\xf3\xa2\x89\x44\x40\x89\x86\xbc\x10\x92\xca\xc5\x72\xba\x89\xb9\x49\xcc\xf6\x35\x0b\xb4\x34\xb7\x37\x22\x35\x42\xc2\xce\x64\xac\xd9\xb6\x73\x66\xd4\xce\x75\x3b\x77\xed\x79\xc2\xab\x8d\x0b\xe2\xd7\x8c\x74\xa0\x42\x25\x33\x48\x4b\x44\x9f\x9a\x96\x54\x52\xae\xc1\xf0\x4f\x17\xc2\xba\x68\x05\x72\x54\x48\x0d\x15\x6c\xdb\x02\xf3\x46\xb1\xb8\xb3\xf9\x04\xeb\x4a\x77\x09\x37\x71\xc2\xb1\xe9\xa8\x01\x07\x71\x3f\x03\x62\x24\xc9\x0c\x34\x4e\x3e\xcc\x59\xa2\xfd\x20\x13\x5c\x84\x35\x5b\x3f\xa1\xa5\x85\x7a\xd8\x3d\x00\xe8\x46\xb8\x3a\xaa\x09\x98\x3b\x49\xab\x7a\x6a\x5d\xd6\x23\xeb\x14\x57\x72\xef\x4f\xf6\x3a\x82\xeb\x83\xf9\xcc\x91\x44\xa3\x48\x67\xa6\x89\x6f\xf7\x04\x63\xae\xd6\x78\xcd\x4a\xec\x38\x54\x80\x01\xa6\x7b\xca\x43\xa7\x54\x85\x10\x5b\x0f\x95\xd3\xbd\x25\x01\x9d\xcb\x69\x99\x63\xd2\xbc\xd3\x6d\x81\x6b\xb9\x28\x04\xeb\xea\xb7\x37\x47\x0d\xdd\x8c\xc7\x8a\x5c\x7c\x78\xdf\x04\x7c\x6b\x96\xe9\xf3\x70\x80\xdd\x06\xf9\x14\x37\x40\x81\x5c\x4d\x08\xad\x84\xbe\x4e\x14\xd5\x17\xb5\xb3\xf9\x38\xd7\x6f\x45\xa0\xb7\xc0\x32\x5e\x18\x09\x16\xe5\xf4\x46\x5d\x9f\x64\x46\xf9\xd4\xb0\xaa\xf7\xa2\x34\x2f\xf6\x9b\xdf\xe0\x4b\x48\x48\xcb\xa4\x63\x70\x29\x02\x46\x3b\x54\xa4\xdf\xf8\x30\x2f\x57\x40\xcc\xe8\xa2\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x95\x72\xdf\x11\x36\x82\x11\x39\xfa\x4d\xe3\xab\x23\xa4\xb8\x13\x35\x85\x14\xe6\x55\x1c\x08\x13\xbe\x7d\xc6\x34\xf2\x8f\xa3\xe6\x08\x23\x72\x69\xe8\xc2\xa8\xe9\x6a\x6d\x1b\xb8\x3a\xe3\x7a\x65\x07\x44\xc2\x94\xca\x34\x83\x8e\x00\x22\x62\x52\x29\x19\x16\xa8\xd2\xed\x2a\x64\x8c\x88\x2b\xc0\x85\x1e\xc5\x71\x7d\x6f\x8b\x68\xa7\xa9\x7a\x50\x67\x56\x9d\x19\xa6\x54\xd3\x21\x2d\xac\x3d\x88\x09\x7e\x66\x4d\xdd\x43\x57\xa4\x7c\x48\xdd\xe9\x1d\x56\x3b\xfb\xec\xd7\x0e\x7e\x75\x48\xab\xa7\x18\x1f\xd2\x21\x96\xed\xee\x6c\xbf\xd9\x43\xda\x5d\xf4\xc0\x99\xa0\x72\x4c\x01\x65\xf7\x63\xb0\xe9\xcb\x8a\x2b\xdb\xa5\x18\x91\x6b\xa1\x7d\x75\xfd\xb4\x4e\x34\x0c\x28\xce\xde\x64\xdc\x97\xd7\xf7\xb7\x7f\xbd\xf9\x78\x75\x7d\xdf\xf3\xef\x9e\x7f\x63\xeb\xf9\x77\xcf\xbf\x3b\x0c\x7c\x28\xfc\x1b\xf8\x7c\x5f\xbc\xbb\xb2\x77\xad\x33\x30\x2e\x55\x7b\x0d\x4c\x14\xff\x8a\x12\xed\x2f\xf9\xfc\x13\x35\xaa\x63\x21\x41\xa1\x82\x62\x34\xd6\x75\x41\xca\xee\x01\xb4\x04\xd6\x31\x9d\x5f\x6c\xa6\xfd\x1e\xf3\xe4\x23\xe6\x89\x5e\x37\x6a\x78\xac\x5b\xb5\xba\x64\x10\x25\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\xed\x5e\x53\x08\x02\x8b\x96\xc6\x4b\x1e\xd8\x45\x3e\x0a\x18\xa6\x96\xac\x0a\x09\x73\x26\x4a\x95\x2d\xaa\xea\xf8\xeb\xd9\xd5\x2a\x68\x41\x60\x2e\xd6\xc2\x7b\x73\xd6\x0f\xb8\x24\xdb\xad\x93\xd3\x02\x86\xdf\xb3\x84\xe7\x88\x88\x21\xe7\x05\x8c\xbf\x46\x42\xdc\x5e\xda\x0b\x18\xb7\x93\x9c\xb8\x49\xe6\x0b\xa0\xa3\x2d\x2d\x06\x74\xd4\x4e\x56\xd9\x3f\x27\xfb\x46\x8a\x3c\x12\x37\xbb\xb3\x76\x63\x1f\xc2\xb0\xee\xa8\x56\xc1\x4d\x4d\x29\xc4\x69\x8e\x75\x89\x12\xa3\xb5\xe6\x85\xee\x98\x5e\x41\x62\x95\x67\x8f\x53\xc9\xdc\x06\xa7\x7f\xa0\xc5\xf7\xb0\xb8\x85\xc0\x62\x4c\xed\xf9\xc6\x30\x07\x45\x28\x79\x80\x85\x8d\x61\xbc\xf0\x83\x85\xd5\xa3\x3a\xc0\xea\xf6\x0f\xd0\x0d\xf3\xdd\xb7\x78\x65\xe9\x1f\x20\x00\x91\xc0\xb7\x95\x9a\xe5\x66\x09\x51\xcc\x37\x6b\x7a\x50\x55\xda\x0f\xb5\x0c\x7f\x53\x7a\x74\xd7\x43\x84\x89\x5b\x46\xa5\x81\xc9\x04\x12\xed\x33\xdd\xed\x6e\x1e\x60\x32\x64\x5a\xda\x52\x9a\x34\x79\x78\xa4\x32\x55\x24\x11\x79\x41\x35\x1b\xb3\x8c\xe9\x45\x58\x1a\xbc\x6f\x78\xc3\x57\x38\xde\x96\x29\x92\x2b\xae\x34\xc5\xab\x50\x38\x7b\x9b\x59\xed\x1a\x4c\x17\x31\x77\x2d\x37\xc5\x84\x1b\x2a\xc3\xeb\xdf\x1b\x52\x72\xa1\x34\x49\x40\x1a\xa1\x2e\x5b\x90\x47\x29\x78\x47\x88\xeb\x76\xdb\xb1\x8a\x8b\x98\x1b\x59\x10\x1e\xcf\x5c\x3a\xde\xd0\xbc\xf8\xd0\x32\x2b\x75\x86\xc9\x1e\x67\xbf\xc6\xff\x1c\xd2\x29\x22\x3e\x99\xef\x1d\x39\x3a\x0a\xec\x4b\xf8\xd8\xa0\xb8\xa7\xf2\xce\xc5\xac\x35\x45\xa7\xea\x42\x21\x16\x78\x17\xf9\x94\x87\x1b\x70\x5a\x40\xa4\x69\x0e\x43\x8d\xb1\xad\x65\x10\xca\x69\x11\x66\x0f\xaa\x1b\xb2\x83\xb8\xb7\x77\x30\x0f\xac\xaf\x7f\xcb\xac\xaa\x62\x98\xe9\x3b\x0f\xa3\xa1\x48\x0e\x9a\xa6\x54\xd3\x91\x39\x10\x83\xf6\x9f\xaa\xa0\x09\x0c\xc8\xdf\xab\x0f\x33\x3a\x86\x4c\xfd\x78\xfc\xef\xdf\x5f\xfe\xf5\x3f\x8e\x7f\xfa\x7b\xf3\x3b\x14\xd7\xd0\x3e\xd9\x7c\x20\xf0\x15\x30\x24\x89\x8b\x14\xae\x91\x3a\xfc\xd3\x69\x7a\xe7\x49\x22\x4a\xae\xdd\x17\x88\xa1\x3e\x9a\x09\xa5\xaf\x6e\xaa\x3f\x0b\x91\x2e\xff\x15\x50\x29\x8f\x1c\xa6\xdc\x83\x6b\x1b\x80\xa9\x68\x5b\x3c\xe9\x87\x16\xec\x13\x48\x15\x04\xc3\xe7\x5b\x3b\x31\xc2\xf6\xea\xb7\xb1\x4a\x66\x90\x53\xfc\xe7\x37\x7e\x0a\xcc\x7d\x5c\x55\xb9\xe0\x08\x56\x6f\xee\xc0\x76\xe9\xdc\xa3\xf9\xdb\x20\x8d\xd3\xb6\x88\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x4a\x7e\xf4\x56\x8a\x3a\xda\xf0\xfc\xe6\x8a\xcc\xed\x0c\x1f\xd0\xe4\xbc\x14\xbb\xf6\x31\x4c\xdf\x1c\x34\xdb\x6e\x46\x5a\xb5\xec\x65\xef\x08\xc2\x29\xf9\xef\x5d\x49\x03\x55\x95\x71\x04\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\xb3\x8a\x0f\x1b\x2a\x2d\x24\x9d\x22\x20\x9d\x1d\xdc\xfe\xac\xfa\xcb\xfe\xb0\x45\xde\xea\xaf\xad\x41\x32\x29\xa5\x91\xd3\xb3\x45\x8d\xf4\xf4\xd5\xb1\x6c\xbf\x6e\x07\xc2\xb1\xab\x6d\x75\x1d\x5f\x91\x3b\xae\x23\x5a\x51\x4d\xac\x66\x11\xad\x40\x0e\x38\x7a\x50\x09\xac\xd6\x54\xc9\xe7\x64\x4e\xa5\x0a\x29\x6c\x6e\x5b\x44\x26\x9d\xb2\x39\x53\x22\x00\x14\xa8\xea\x68\x55\xa2\xf6\xc8\x0a\xae\x44\x89\x4d\x54\xa8\xfc\x1e\x9f\x0b\x2c\x57\x56\x1d\xf6\xa5\xdb\xec\x6d\xa8\xb2\x40\x48\x41\xb5\x06\xc9\xdf\x91\xff\x75\xf2\x9f\xbf\xfd\x79\x78\xfa\xa7\x93\x93\x1f\xdf\x0c\xff\xed\xa7\xdf\x9e\xfc\xe7\x08\xff\xf1\xcf\xa7\x7f\x3a\xfd\xd9\xff\xf1\xdb\xd3\xd3\x93\x93\x1f\xbf\xff\xf0\xed\xfd\xcd\xe5\x4f\xec\xf4\xe7\x1f\x79\x99\x3f\xd8\xbf\x7e\x3e\xf9\x11\x2e\x7f\xda\xb2\x93\xd3\xd3\x3f\xfd\x26\x98\xf4\x08\xf5\xcb\x6d\x8b\x59\xc5\xbc\xdd\x63\x24\xed\xf0\x45\x2a\x9a\xd7\xcd\x6f\xaf\xd8\xe7\xdf\x67\xe6\xbe\xab\x6f\xb3\x4a\x0a\x39\xa0\x03\xfe\x52\x82\x86\x82\x44\x82\x7e\x0d\xcb\xae\x1d\xa9\x51\x70\xc1\x25\x55\xa3\x12\xf7\xb5\xdd\xa0\xbf\x04\x63\xaf\xd7\x73\xec\xba\xd6\xa2\xfb\x44\x8a\xdc\xe1\xb7\x5b\xcf\xf7\x1c\xb3\x31\xdd\x73\x0f\x10\xe0\x15\xf1\xad\x37\x0e\x77\x6e\xbd\x71\x78\x03\x29\xbd\x71\x38\xa8\x7d\x91\xc6\xe1\x3b\xcb\x93\x7e\x91\x96\xe1\xf8\x98\x8b\x1d\x63\xba\x62\xc2\x2d\x02\x9f\x77\x8d\x07\x88\x19\x04\xe9\xcd\x1e\xcd\xa2\x9a\xdb\x45\x1a\x75\x8f\x6a\x37\x2b\x57\x85\x35\xd5\xa1\xf2\x56\xa4\xcd\xd7\x87\xa1\x91\xf3\x2c\x23\x8c\xdb\x0b\xda\x74\xd0\x69\xf4\x1a\xb2\xc3\x21\x5f\x3b\xa4\xe3\xb9\x79\x55\x9f\xfa\xd8\x2e\x62\x8d\x99\x72\x98\xa9\xf9\x17\x9b\x08\xf9\x60\x73\x23\x95\xc6\x29\xf1\xa5\xc9\x3b\x91\x53\xa9\xa1\x36\x72\xc6\x5c\x14\x54\x29\x91\xd8\xbc\xd1\x0a\x6a\x01\x6b\x8a\xba\xe9\xc1\x37\xd0\xf4\x01\x43\xc4\x12\x48\x81\xef\x9a\xd1\xeb\xdb\x27\x8b\x39\xe1\xd7\x61\xbc\xc0\xd2\xd8\x7c\xee\xee\x2f\x92\x7a\xd8\x13\x7c\xe3\x78\xe3\x7e\x5d\x31\xb1\xe6\x0c\xbb\x60\x9c\x46\x68\x2c\x4a\x9b\x75\x6a\x27\x46\x14\x8b\x49\xed\xe1\xc3\xe8\x26\xcb\xd2\xbb\x6d\xe4\x60\x45\x22\x5c\x6c\xaf\x82\x6d\x82\xf4\xb1\x15\x79\xbd\xf6\x82\xb6\xe5\xf4\xaf\x21\x3e\x29\x5c\x82\x8f\x2b\xbd\xbf\x84\xe4\x7e\x28\x52\xfb\x81\x48\xec\x2f\x23\xad\x1f\xa6\xa4\x1e\x4d\x4a\x8f\x23\xa1\xc7\x91\xce\x77\x08\xdb\x88\x29\x91\xc7\x91\xc6\x5f\xc2\x16\x57\x48\x98\xb0\xcf\x91\x38\xbe\x87\xde\x21\x1a\x3e\xa3\x65\xa6\x90\x50\x00\xaf\x90\xdd\x7c\x51\x54\xa0\xc9\xec\xcb\xc9\x5b\xb0\x06\xa4\xb8\xf7\xe2\xdd\x3a\xe3\x55\x7f\x29\x92\xfe\x52\xdc\xa1\xf5\x97\x62\x7f\x29\xbe\xca\xa5\xe8\xb8\xd5\xd7\x7f\x23\x46\x4e\x8b\xc5\x84\xff\xbd\xd7\xdf\xb0\x64\x04\x00\x09\xef\x78\x14\x6b\xc0\xa2\x33\x1c\xb9\xcb\x89\x0b\x3a\x67\x38\xea\x4d\x99\x65\x5d\x40\x49\x6d\x8b\xb1\x00\x57\x38\xed\x45\x99\x65\x0e\xc8\xb2\xdb\xec\x7f\xe4\x78\x81\x9d\x67\x8f\x74\xa1\x06\xe4\x1a\xe6\x20\x07\xe4\x6a\x72\x2d\xf4\x8d\xb5\x50\x74\xeb\xb7\x99\x4f\x65\x3b\x27\x6c\x42\xde\x65\x54\x83\xd2\x44\xd3\x29\xda\xcb\xea\x52\x2b\x42\xb6\x06\xad\x8b\xc9\xed\xd1\x70\x14\xbe\x37\x7f\xed\xd1\xfe\x86\xfb\xd9\xab\x19\x9b\x40\xb2\x48\xb2\x70\x36\xf1\x83\xef\xc9\x67\x82\x79\xf1\x00\x43\x87\xd6\xc0\x89\x7d\x81\x98\xed\x85\x50\xfa\x4e\x53\xa9\xf7\x0d\xdc\x7e\xe3\x09\x31\x93\x9d\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\x04\x41\x3a\xd1\x20\x9b\xa5\xe9\xf1\x39\x5b\x90\x6f\x64\xeb\xf7\xf9\xda\xa6\x92\x4c\x28\xcb\x54\xf7\x88\xf0\x15\x23\xb7\xad\xa7\x4d\x5d\x2d\xc7\x06\x1c\x20\x4d\x12\x21\x53\x4c\x76\x15\x1e\x36\x0f\x5f\x22\x84\x3f\x99\xf6\x11\x45\x85\x9c\x72\x3a\x85\xdc\x95\x18\x6c\x93\x35\xce\x44\xf2\xa0\x48\xc9\x35\xcb\x5c\x21\x6f\xf1\x80\x02\x71\x86\x27\xb5\xf3\xd0\xdd\x19\x40\xf5\xcf\x61\x75\x08\x87\x86\x2a\x75\xf6\xeb\xfa\x2b\xfc\xa0\x23\x71\x11\xd4\xb2\x18\x4a\x19\x7c\x86\x24\x44\x40\x6c\x1b\xc9\x3f\x43\xd2\xa8\xe0\x4b\x3d\x74\x93\xc5\x63\x44\xc0\xa4\x48\xbe\x25\xdb\x22\xc5\xd8\xc4\x8a\x6b\x09\x00\xaa\x6a\xb6\xd8\x61\x1b\x17\x6e\x11\x98\x72\x33\x6f\xff\xcc\x18\x87\xf6\xc2\x28\x5b\xbf\x04\x9a\xb0\x96\xe6\xcf\x95\x02\x6d\x3e\x19\x39\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xd9\xf1\xe9\xca\x1e\x39\x36\x1a\x75\x06\x6a\xa1\x34\xe4\x16\x52\x34\xa9\x5f\x4a\xb1\xbc\xc0\x82\x81\x90\x1c\xfb\xfa\xa6\xc1\x94\x99\x3b\xd2\x62\x1c\xe3\xac\x38\x78\xaf\x01\x51\x82\x68\x49\x53\xe6\x6c\x59\xf8\xa9\x79\x48\xcb\xd2\x41\x16\x9f\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xc6\xe9\x1b\x91\x7b\x41\x4a\x15\x3e\x63\x15\x21\x0b\x51\x12\x0e\xe0\xce\x56\x85\x6a\x6e\xae\x1b\x22\x4a\x6d\xad\x6a\x54\x87\xc0\x92\x35\xdb\xe5\x67\xa6\x5d\x4e\x90\xe1\xdf\x6f\x96\x6a\xc8\x66\x6c\x0e\x67\x33\xa0\x99\x9e\xd9\x88\x75\x2e\xf8\xf0\x1f\x20\x05\x82\x98\x71\xf7\x4d\x28\x19\x61\xae\xc0\x66\x0b\x70\x0b\xae\x12\x14\x25\x58\x25\xb2\x76\xe9\x9b\xb9\xf6\xbe\x85\xce\x22\x11\x59\xe6\x47\xdf\xdd\xdf\xdf\x7c\x0b\xba\xc9\xe5\x39\x7e\x48\xbe\xbd\xbc\xf7\x79\x0a\x0d\x60\xef\x03\x60\xef\x71\x02\x28\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\x0d\xf8\x5a\x18\xb6\xcd\x21\x31\x9b\xa0\x1d\x74\xef\x11\xd3\xaf\x6e\x46\xe4\xaf\xa2\x34\x13\x32\xa6\xe3\x6c\x41\x1e\x29\x77\xd6\xee\xb0\x48\x59\xd3\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x3b\xa0\x29\x48\x85\x0c\x1a\x68\x60\x4e\x4c\xc4\xe3\xde\xa0\x2d\xea\x52\x5e\x94\x4a\x8b\x9c\xcc\xdc\x6b\xb7\x01\xce\xdc\xe1\x1c\xd9\xe3\xea\x50\x6e\x24\x14\x96\x89\xbb\xdf\x7c\x75\x2c\x7a\x85\x7b\xd9\x79\x77\x9f\x8f\xad\x98\xda\x9c\x36\x67\x31\xb7\xf8\x29\x8e\xb7\x99\xad\x1a\x2d\xb6\x31\x42\x4c\x38\x89\x18\x17\x4e\xc2\xa0\xcf\x96\x3b\x42\xef\x41\x70\x4f\xf1\x42\xcd\x49\xb4\x70\x6a\xf2\x22\x21\xd5\xc4\x45\xca\xb9\xcd\x67\x3d\x47\x61\x75\xdd\x96\x3b\x6f\x94\xd3\x4a\x28\x17\x9c\x25\x34\x63\xff\x80\x94\x94\x85\xe0\x2e\x7f\x0a\x25\xdb\x84\x2a\x18\xa2\xbb\x95\x5b\x76\xae\x1a\x20\x5c\x86\x3b\x68\x21\x50\xdc\xc3\xa0\x27\xc3\xee\x2d\xd5\x71\x48\x8d\x1a\xf9\x1b\x8c\x28\xd7\x6c\x2b\x1e\xda\xd6\x62\xc5\xd9\xf1\xe4\x8b\x10\x27\x89\x4d\x7c\x0b\x4e\xba\x5e\x4d\xb9\xd6\x82\xd0\x24\x41\x98\x31\x7b\x5d\x21\xe3\xb5\x05\x66\x0f\xe6\xde\x36\x22\xe0\xa1\xc9\x5e\xd6\x89\x2d\x09\x2f\xf3\x31\xc8\x1a\xaf\x42\xea\xd5\x39\x8d\x62\x75\x71\xc3\xda\xe1\xbc\xdb\xcf\xcb\x18\x94\x4f\x81\xbc\x35\x23\xff\xf1\x0f\x7f\xf8\xfd\x1f\x22\x8c\x63\x5e\xaf\x8a\x14\xe6\xe4\xea\xfc\xfa\xfc\x6f\x77\x9f\x2e\x10\x05\x2f\xb4\xfb\x48\x89\x90\xb1\xd3\x20\xa3\x26\x41\xbe\x68\x0a\x24\xe2\x49\x04\x73\xd9\xd8\x47\xe2\x0e\xa9\x32\x9b\xb0\x54\x16\x39\xcf\xe9\x24\xce\xba\x6d\x4d\xcc\x2a\x42\xea\x52\xd3\x4f\x66\x18\xd6\x41\x70\x2a\x95\x01\x14\xd1\x34\xfe\x3b\xd3\x5b\x0b\x0c\x98\xa4\xbe\x28\x3c\x5a\x98\xda\xb6\x7c\x57\x17\x0e\x69\xf8\x8a\x94\x7f\x05\x89\xe0\x69\x88\x0a\x10\x4b\xa4\x75\x94\x44\x3d\x73\x77\xb6\x4f\x6f\x22\xae\xaf\x12\x37\x18\x6a\x92\xa1\x2b\x4a\xaa\x55\x8d\xc3\x27\x6d\xc6\x3f\xf6\xf6\xc7\x7f\xe9\xee\x20\x4b\x8a\x3b\x91\x3c\x44\x34\x91\x05\x32\xb0\xf7\xe6\xa4\x25\xd6\x17\x78\x7f\x71\x63\x89\x33\x2b\x73\xfd\xf1\xbe\x86\xf7\xc0\x74\x96\xda\xad\xfb\x9d\xf3\x16\x52\x9e\x92\x07\x28\xc2\xb4\x4b\xc3\x30\x7d\x5c\x5a\x3b\x2c\x0d\x6d\xef\xd2\x39\x91\x6d\x0a\xad\x65\x04\x3e\x9c\xcc\x4a\xc4\x61\xc0\xc4\x0d\xbf\x37\x3a\x02\x9d\x12\x32\xa1\x2c\x23\x14\xad\xf2\x9a\xe5\x60\x73\x78\xd0\xd8\x5f\x07\x22\x7c\x45\x0c\xe7\x6b\xb5\x36\x1e\xd7\x25\x38\x77\xb5\x1a\x86\x22\x1f\x7c\xdd\x6a\x80\xe3\xd9\xb2\x0a\xa4\xee\xd5\x80\x6d\x5b\xaf\x06\x74\x54\x03\x0a\x09\x77\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\x36\x84\xdb\x8c\x61\x22\x24\x2c\xc7\xdb\x34\xe2\x60\x5c\x28\x76\x40\xa8\xe9\xf9\xcd\x55\xe5\xfb\x12\xad\x58\x17\x9b\x6f\xea\x8b\x81\x66\x6c\x0e\x1c\x94\x3a\xc3\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x0e\x6a\xc4\x18\xf3\xba\xc0\xed\x87\xa0\x13\xeb\x37\xf7\x61\x45\x2e\x0c\xcc\x4f\xd7\x24\xc8\x9d\xdf\xa8\xdb\x29\xa9\x9a\x01\xe6\x3c\xc2\x67\xa6\x95\x1d\xf4\x06\x71\x55\xfc\x8c\x1b\x79\x61\x2a\x69\x02\xa4\x00\xc9\x84\x11\x31\x4a\xae\x53\xf1\xc8\xc9\x18\xa6\x8c\x2b\xbf\x62\x21\x24\xf9\x2d\x81\x91\x44\x4c\x55\xf5\xba\x46\xe4\xb6\x05\x68\xef\x10\xa4\x12\x51\xf3\x4c\x37\x45\x83\x48\x53\x82\xc2\x0b\x6e\x83\x92\x66\xd9\xa2\xde\x78\x3e\x1f\x5a\x6f\x9e\xa1\xee\x1b\xc2\xce\xec\x49\xc9\xf1\x45\x53\xc8\xe8\xc2\x66\xfe\x4e\x18\x47\xeb\xaf\x54\xa7\xa3\xf0\xd0\xac\xce\x04\x0a\xd9\xe8\x73\xe3\xce\x60\x8a\x48\xa0\xc9\x2c\x44\xb2\xeb\x63\xc0\x9e\x6b\x7d\x0c\x58\x1f\x03\xd6\xc7\x80\xad\xb6\x3e\x06\xac\xdd\xfa\x18\xb0\xcd\x04\x1d\xb2\xd3\xae\x8f\x01\xeb\xad\x32\xab\xad\x8f\x01\xeb\xd4\xfa\x18\xb0\x67\xdb\xc1\xb1\xe8\x3e\x06\x6c\x8b\xd6\xc7\x80\x6d\xd9\xfa\x18\xb0\x3e\x06\xac\x8f\x01\xeb\x63\xc0\x02\x5a\x1f\x03\xb6\xfb\xeb\xf5\xce\x9f\xee\xad\x8f\x01\xeb\x63\xc0\x76\x6c\x7d\x0c\xd8\x52\xeb\x63\xc0\xfa\x18\xb0\xa7\x5a\x1f\x03\xd6\xc7\x80\xb9\xd6\x5b\x1b\x57\x5a\x1f\x03\xb6\xa6\xf5\x31\x60\xbb\x8d\xd3\xab\x01\x61\x9d\xbd\x88\x1a\xa0\xb4\x28\xee\xd8\x34\x00\x68\x30\xd6\x31\xb8\xab\x28\x71\x28\x84\x8a\x3c\xce\x58\x32\x23\xca\x7e\xe8\xed\x58\x88\x50\x66\x0e\x44\x33\x4a\xa7\xbe\x49\xc6\x60\x54\x04\xf3\x5a\x45\xc8\x6d\x72\x35\x41\x07\x72\x03\x24\xcd\x9c\x0a\xc7\xd6\xcc\x38\x0d\x38\xfe\xb6\xf8\xec\x6f\x37\xc6\x8d\xee\xd2\x9d\x82\xc6\x7c\x24\x94\xdb\xea\x97\xf8\xfa\x58\x2d\x8f\xdc\x88\x54\xf9\x0a\x00\xfc\xff\x67\xef\xdd\x7b\xdb\xc8\xb1\xbc\xe1\xff\x9f\x4f\x41\x64\x06\x8f\xed\x6d\xc9\x4e\xe6\x86\x99\xc6\xe2\x6d\x78\x1d\x77\xda\x98\xc4\x11\x6c\x27\xf3\x0c\x7a\x7a\x7b\xa9\x2a\x4a\xe2\xba\x8a\xac\x26\x59\xb2\x35\xe8\x0f\xff\x82\x87\x97\x62\x49\x72\x12\x91\xb4\x25\xa7\x55\x0b\xcc\x76\x24\xb9\x78\x3f\x3c\x97\xdf\xf9\x1d\xce\x86\x86\xfd\xf3\x18\xca\x05\x73\x79\x9c\xe0\x0d\x4e\x24\x3d\x33\x18\xb9\x91\xe0\xe3\x74\xe2\x33\x78\x8b\x84\x22\x99\x5f\x29\xed\x59\x0a\x7a\x67\x6b\xc8\x9d\x1d\x41\x3e\x65\x40\xeb\xe4\xbc\xc3\x77\x14\xa5\xb3\x9b\x08\x9d\x5d\x44\xe7\x6c\x03\x99\xb3\x75\x54\x4e\x9e\x70\x6f\x86\x50\x6f\x26\x4d\xe9\x11\xc2\x26\x16\xe0\x7d\x33\x13\x44\xce\x78\x15\x2d\x70\x72\x09\x9b\x77\x94\xd1\xba\xad\xf5\xd9\x95\x5a\xa6\xd0\xb9\x07\xa1\x4b\x27\x32\x2c\x36\xdd\x44\xc2\xf5\x0f\x69\x49\xa0\x04\x31\xa6\x95\xde\x5a\x40\x62\x39\xc3\x73\x50\x96\xda\xa2\x20\xa4\x4c\x51\x97\x42\x2f\xea\x1f\x8f\x7d\x0f\x0d\x19\x39\x95\xe8\x55\xda\x55\x93\xa6\x8f\x07\x6e\xa6\x3f\xfe\x21\xea\x1d\x53\xd1\xe4\xb9\xa5\xdf\x5c\x8d\xce\x7a\xb7\x34\x7c\xf0\x03\x1c\xe3\xb3\x19\x29\x6e\xaf\x2c\xc4\x63\x7b\x37\x73\xba\xfb\x23\xc9\xf5\x91\x43\x31\x48\xb5\xee\xfb\x3a\xa8\x36\xc0\xfb\xa1\xb9\x29\xac\x22\x11\x73\x5a\x90\xe3\x27\x30\xa0\x73\x19\xa5\xe9\x07\x01\x81\xfb\x1a\x06\xbe\x2b\x6a\xd7\xb5\xe9\x8e\xf7\x7c\x07\xbe\x13\xdb\x53\x00\x33\x56\xb8\xf0\x6b\x33\x5d\x7f\xe8\x92\xba\x71\x28\x09\xf1\x29\x0a\x53\xaa\x66\xed\xf8\xb8\xe0\xf5\x89\x16\x1d\xe6\x7f\xc6\x15\x1f\x9f\xd4\x58\x2a\x22\x4e\x4a\x5e\xd8\x6b\x7d\x58\xe8\x1e\x50\x36\x3d\xae\xcb\xa3\xe3\xff\x93\xd4\x87\x0b\xeb\xc3\xb5\xe9\x41\x0f\x18\xaf\x63\xa2\xe5\x3e\x17\x4b\x56\xac\x9e\x94\xf4\x4d\x9a\x7c\x7f\xa7\x56\x4f\x48\x84\xcb\x6e\x05\x2a\xbb\x97\xda\x28\x83\xa3\x3a\xa7\x50\xd9\x0d\x38\xec\xa3\x41\x61\xb3\x9c\xd5\x4c\x10\xd8\x1d\x82\xbf\xee\x8c\x2d\xb4\x2b\x90\xd7\x1d\x2c\x83\x9f\x01\xe6\x9a\x03\xe2\x9a\x0f\xde\xba\xab\xd5\xe2\x1f\x0d\xd2\xfa\x2c\xe0\xac\x19\xe3\x36\x99\x60\xac\x4f\x01\x61\xdd\x5d\x1f\x0c\xca\x00\x5b\x7d\x3a\xc8\x6a\x96\x79\xcc\x6a\xc5\x26\x8a\x84\x2d\x40\x54\x9f\x22\x2e\xfd\x68\x31\xe9\x0c\xf1\xe8\x9c\xb1\xe8\x6c\x71\xe8\x47\x83\xa2\xa6\xc3\x50\xb3\xfa\x14\x9e\x04\x7e\x9a\x13\x7a\x9a\xbc\xbe\x94\x51\x45\x71\xf5\x9a\x54\x78\x71\x9d\x06\x50\xcc\xb5\x12\x97\x2b\x20\x46\xe3\xb6\xee\xc7\xdb\x67\xd8\xd6\xfe\x27\xa5\xa3\x1e\x71\x41\x68\xab\x02\x43\xfc\xd8\x8c\x2f\xba\x18\x19\xda\x9c\x8b\xe2\x8e\x8b\xdb\x8a\xe3\x52\x9e\x34\xdc\xfc\x4f\xc7\x44\x11\x50\x50\x24\xa9\xe9\xbb\xe1\x1e\x37\x7c\x1f\x3b\xb2\x6b\x7e\xe0\x77\x88\x4f\x14\x61\xe8\x90\x32\xb7\x73\x8e\x02\x2f\x4d\x17\x1e\x49\x8e\x77\xe8\xb7\xbe\x7a\xe9\x1a\xf9\xfa\xe2\x1e\x10\x19\x92\x72\xa7\x23\x5f\xb6\x8f\x9f\x0f\x7d\xd9\x1f\x4e\xda\xaa\x1f\xfe\x32\x21\xb1\x3c\xb1\xaf\x57\x5d\x99\xeb\x57\xd0\x1f\x2f\x8a\x30\x2b\x91\xe5\x8d\xfa\xfa\xf6\x49\x32\x04\xbb\x6f\xdc\x78\xcc\x74\x1f\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xaf\x40\x01\xdd\x3b\x5d\x77\xc6\xe9\xba\x25\x64\xf0\xd7\x67\x6d\x3d\x3d\x12\x78\x6f\x6d\xfd\x56\xac\xad\x80\xae\xed\x8d\xc0\x05\x19\xed\x92\xf2\xe6\x04\x48\x97\xa0\xd6\xe9\x70\x5e\x5c\x30\x42\x4c\x42\x53\x47\xc6\x07\xbc\x73\x93\xb6\xaa\x16\xc6\x87\xd8\x63\x66\x8c\xdf\x5a\x37\x33\xb2\x42\x69\x07\xa1\xd4\x35\xbd\xeb\x6c\x93\x46\x70\xab\x91\x88\x96\x31\xad\x62\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\xf7\x08\xf7\x2c\x38\x1a\x80\x9e\x33\x82\xba\xbc\x9a\x7e\x47\x74\xab\x13\x2e\x0a\x3a\xae\x16\x68\x86\x2b\x6d\x2c\x59\xf0\xf0\x2d\xad\x2a\xfb\x9a\x04\xb0\x32\x51\x26\xf4\x6c\x34\x9a\x8a\xb3\x29\x4c\x06\x36\x1d\x21\xf7\x0d\x29\x74\x9b\x45\x45\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x2b\x5c\x3f\x93\xd0\xda\x41\xeb\x54\x22\x46\xab\x81\x9b\xf2\x3e\x35\xe3\xea\x9e\xef\x5c\xca\x92\x94\x96\x55\xf1\x8e\x4a\x32\x80\x77\x46\xf7\xc9\xf4\x85\xcf\x89\x10\xb4\x24\x66\xdf\x98\xcf\x1a\xc1\xe7\xb4\xec\xb0\xe3\x7a\x5b\x00\x6e\x3b\xba\xad\x8f\xf0\x5e\x27\x5a\x19\x67\x43\x46\xa6\x18\xd4\x63\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\xac\xa4\x05\x56\x44\x02\x56\xbe\x47\xb9\x3a\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x19\x6f\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x69\xcd\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\x21\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\xc4\xd4\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\xa3\x24\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\xf9\x9a\x3c\x94\x0e\x78\x65\x72\x7c\x5f\x5f\x5e\xff\xfc\xf6\xf4\xbf\xce\xdf\xc6\x6d\x01\x90\x75\x2c\xd4\x9d\x5b\x46\x7f\x69\x09\xc2\x35\x67\x53\x84\xab\x30\x05\x66\x00\x8e\xce\xe0\x03\x90\x8a\x79\x93\x65\x22\xf5\x5a\x7d\x09\x44\x09\x86\x15\x38\xe6\x53\x64\x04\xc5\xa2\x40\x12\xd0\x1f\x7d\x24\x8c\x1b\x03\xe0\x4f\x7b\xe4\x0d\x8c\x28\x7d\xc6\x8d\x41\x48\x19\xc2\x48\x52\x36\xad\x92\x6d\xc1\x64\x8f\x48\xaa\x3f\x64\xd8\x8d\x60\x14\xeb\x16\x49\x77\x8a\xf4\xfa\x10\x6f\x55\xe6\x73\x08\x74\x97\x99\x73\x01\x90\xfb\x86\x4b\xe2\x5c\x00\x46\xc7\xbd\x18\x21\x5c\x96\x22\x49\x8f\xb6\xc2\xc6\xdb\xe8\x86\x20\xc0\x34\x6b\x42\xbf\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x0e\x81\xbf\xc4\x37\x95\xc7\xdc\xce\x81\x68\x9e\x71\xa9\x2e\x46\x99\x16\xfa\x1f\x33\xac\xe0\x8d\x7a\x3d\x14\x47\x63\x6a\x2d\x33\x72\xaf\x88\xd0\x1a\xb1\x5d\xc3\xd4\x99\x4b\x72\x2e\xe8\x0e\x3e\x97\xdd\x9d\x1a\x67\xbd\x98\xf4\x81\xd0\x4f\xb4\xbf\xa1\xe1\x1f\xb8\x54\x97\x56\x5a\x87\x2c\x17\x61\x3f\x6a\xac\x8a\x59\x5f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xe0\xfa\x2f\x39\x5c\x94\x26\x9d\x6d\x46\x13\x84\xc3\xee\x9c\xd8\x34\xc8\x5c\xbe\xad\xfb\xa9\xad\xb5\xe4\xde\x04\x35\xcc\xea\x6d\x41\xe5\x88\x86\x97\xc7\xe8\x1c\x17\xb3\x84\x5e\xe8\xd9\x28\x03\x65\xa0\xe1\xa5\xe9\xc6\x0c\xcf\xf5\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4e\xc1\x8f\x09\x32\x21\x42\x98\x94\xc9\xf1\xc2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x91\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\xc3\xeb\xd1\x00\xdd\x9c\x8d\x06\x88\x0b\x74\x7d\x96\x86\x03\x09\xad\xd1\x17\x37\x67\xa3\x17\x5b\x5d\x81\x20\x9d\xe3\xe6\x6c\x14\xf1\x92\x55\x24\x61\x8d\x9b\xe1\x2d\x59\x44\x6a\x77\x39\x34\xcc\xa1\xdf\x58\x59\x06\x64\xa6\xb9\xc6\xcd\xc6\x6f\x13\x04\x97\x74\x4f\xb6\xf0\xe5\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\x76\x17\xe8\xbf\x27\x5b\xf8\xec\xb3\x27\x5b\x78\xf0\xd9\x93\x2d\x6c\xf4\xec\xc9\x16\x56\x9f\x3d\xd9\xc2\x27\x9e\x3d\xd9\x82\x7f\xf6\x64\x0b\x7b\xb2\x85\xe7\x2b\xb5\xf7\x64\x0b\xcb\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\x08\x9f\x3d\xd9\xc2\x03\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xf8\xf4\xb3\x27\x5b\x88\x7e\xf6\x64\x0b\x9b\x3d\xfb\xf4\x9f\x0d\x9f\x3d\xd9\xc2\x9e\x6c\x61\xf9\xd9\x93\x2d\x7c\xf6\xd9\x0d\xf7\xf8\x9e\x6c\x61\x4f\xb6\xf0\xc9\x67\x4f\xb6\xb0\x27\x5b\xf8\xe4\xb3\x27\x5b\x88\x78\x76\xce\xe9\xba\x27\x5b\xd8\x93\x2d\x7c\xaa\x8d\xbd\xb5\xb5\xd9\xb3\x27\x5b\xd8\x93\x2d\xac\x3c\x7b\xb2\x85\xd5\x67\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\xfc\xb3\x27\x5b\xf8\xda\xfd\x4e\x82\x48\xfa\x6f\x32\xe2\x15\x2d\x16\xc9\x79\x26\x57\x44\xf2\x56\x14\xfa\xc6\x86\xd7\xa2\x06\xde\xeb\x3d\x0a\x49\x4a\xf6\x8e\x25\xef\x5f\x05\x13\x17\x26\xf1\x0b\x3b\x07\x8f\x31\x05\x3b\x91\xc8\xef\x06\x78\x19\x8f\x20\x80\x97\x28\x2c\x94\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\x12\x09\x43\xee\x11\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x25\x13\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x23\x88\xf1\x6b\x45\x9d\x38\x4c\xc2\x9a\xad\x96\xad\xa6\xaa\xe7\x05\xba\xe4\xea\xca\x1e\xee\xad\xad\x57\x66\xc4\x82\x9b\xc2\x74\x6e\x99\xc8\x05\xef\x2e\xb4\x2f\xce\x9d\x44\xe7\x6b\x3e\x85\xf8\xa7\x6c\xf4\x4b\xfc\x98\xa2\x3a\x84\x2b\x41\x70\xb9\x80\x6e\x14\x80\xd7\xeb\xfc\x7f\xcf\x30\x6d\xb3\xa8\x30\x8d\x07\xf9\xe5\x3a\xd2\x67\xd0\x0b\xa4\xf7\x6b\x07\x7e\x87\x3c\x32\xbf\x58\x03\x0f\xf1\xa6\xe6\x8c\x1f\xbb\xaf\xcc\x1f\x0f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x6e\xdc\x31\x84\xab\x66\xf6\x69\xf3\x2e\x25\x3d\xf2\xf5\x82\xe1\x9a\x16\xee\xb0\x9c\x9a\xbd\x49\x39\x5b\x32\x0c\xd3\x46\x62\x7a\xaf\x87\x54\xd7\xad\xc2\xe3\x8a\x1c\xa3\x0b\xb5\xb6\x82\x7e\x5a\x2a\x33\xca\x02\x61\x4d\x84\xaf\xae\xd5\xab\x61\xaf\x19\x42\x06\xc2\xb4\x54\xe2\x8c\x20\xc2\x94\x58\xe8\x6d\x39\xe2\xe5\xb5\xde\x99\xbd\x5f\x27\xf3\x34\x24\xa2\x56\x73\x20\x56\x13\xd1\xaa\x79\x30\xa6\xe9\xf8\xd2\xbc\xd8\xd2\x2e\x0a\x60\x68\x66\xc2\xa4\x9d\xde\xb6\xd0\x37\xc3\x1a\x89\x85\xf8\x24\xb1\x07\xba\xc5\x11\x2f\xb5\xde\x23\x88\x11\x5b\xfe\x8c\x1a\x1f\xe0\x85\xee\xdc\x2d\x38\xed\xb0\xea\x14\x22\x3c\xc7\xb4\xd2\x07\x38\xb1\x03\x3e\xe9\x39\x53\xf0\x26\x53\xb8\xc1\xe2\xeb\x77\x69\xb3\xd8\xcc\xac\x5e\x72\x57\x31\xe3\x92\x30\x90\x97\xd8\x27\xe1\xf8\x14\x01\x2b\x62\x4a\x73\x45\xa7\x02\x81\x2f\x26\x88\xd4\x8d\x5a\x0c\x10\x99\x13\xb1\x50\x33\x00\x0c\x08\x6e\x40\x24\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x0c\x10\x77\x3e\xe4\xc4\xe6\xe1\x7e\xb0\x66\x55\x5b\x29\x63\x64\x81\x5a\x9e\x94\x25\x6a\x9e\x0c\xbb\x26\x37\x17\x0a\x4a\x15\x9a\x39\xb9\x4c\xf4\x53\xd1\x9a\xc6\x31\x44\xa2\x8c\x67\xe1\x2d\xf4\x22\xc8\xfe\xd0\x5b\xa2\xc6\xf7\xe0\x61\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x4d\xdd\x29\xfd\x4f\xe6\x7a\x2c\x38\x9b\xd0\xa9\x0d\x8e\x9d\xd4\x98\xe1\x29\x19\xfa\xee\x0c\x3b\xf5\xe6\x64\x7b\xa0\x0d\x5c\x3a\x76\x89\x51\x8e\x54\x63\xac\x14\x11\xec\x5b\xf4\xdf\x87\xff\xfa\xe6\xd7\xe1\xd1\x77\x87\x87\x3f\xbe\x1c\xfe\xed\xa7\x6f\x0e\xff\x75\x0c\xff\xf1\x1f\x47\xdf\x1d\xfd\xea\xfe\xf1\xcd\xd1\xd1\xe1\xe1\x8f\x7f\x7f\xf7\xe6\x66\x74\xfe\x13\x3d\xfa\xf5\x47\xd6\xd6\xb7\xe6\x5f\xbf\x1e\xfe\x48\xce\x7f\xfa\xc2\x97\x1c\x1d\x7d\xf7\xfb\xf8\x00\x62\x6a\xb4\x3c\x5f\xac\x3c\x53\xa4\xfc\x51\xe2\xe4\x56\xc6\x6e\xfd\xf0\xdb\x2b\x70\xe5\xf8\xdb\x00\xc3\xa7\x8e\xbf\x48\x76\xab\x5c\x4c\xba\xf6\xa9\x44\xbc\xa6\x4a\x59\x27\x02\x0e\xe9\x6b\x96\x5c\x3a\x56\x60\xd1\x89\x51\xa0\xa8\x0c\x69\x54\x3a\x4f\x50\x74\xb7\xfc\xfd\x0a\x4e\x2c\x86\x68\xdd\x54\xa4\x26\x4c\x81\xe0\x19\x3a\x93\x17\x3c\x82\xc7\xdd\x08\x0a\xcc\x18\x57\x88\xdc\x17\x84\x94\xb6\x93\x7b\xd9\x18\x3c\x7b\xd9\xb8\x97\x8d\x9f\x7b\x92\xdd\xda\x99\xfc\x9b\xa1\x2b\x7b\x25\x48\xa5\xe5\x82\x39\x62\x4e\x7d\x86\x9f\x7b\xea\x03\x3e\x41\x24\x96\xe2\xb2\x6b\xc4\xb2\x66\xe2\x58\x27\xa6\xe3\x36\xc6\x8b\x15\x4f\xd0\x12\x65\xba\x49\x30\xb7\xf2\x4b\x3a\xb0\x8d\xb1\x5a\x39\x8b\x6a\x7a\x27\x08\xd8\x25\x29\x5a\x41\xd5\xe2\x8c\x33\x45\xee\xa3\x4c\xcf\x1c\xdb\xa9\xc3\xad\x5e\xf7\x3b\x64\xbd\xa7\x36\xc1\xd4\x7e\x87\x78\x63\xa8\xc8\x1e\x24\xdb\x9f\xf1\xb6\x2a\xf5\x72\x8a\x96\xc1\x2e\x89\xdb\x1d\x17\x13\xbd\xd6\x06\xc8\x04\x6b\x0d\xbe\xdd\xe5\x2e\x3a\x88\x91\xe9\xce\x2f\x2d\x9d\xe3\x8a\x30\x15\xfc\xc5\x08\x40\x27\xe1\x1f\x3d\x43\x97\x3b\xd8\x32\x23\x41\xe7\xb4\x22\x53\x72\x2e\x0b\x5c\xc1\x55\xba\x6d\xfd\xec\xf4\x81\x7e\xc1\x7e\x10\xbc\x92\xe8\x6e\x46\xb4\xbe\xa2\xe5\x84\x01\xba\x81\xef\x77\x8a\x29\x43\x35\x17\x29\xfe\x41\xdb\xa8\x34\x48\x3b\xad\x72\x35\x58\xe8\xb5\x77\x88\x3a\x23\x60\xc6\x9c\x57\x96\x55\xb0\x5a\x74\xfd\xa2\xf1\x8e\x34\x70\xc6\xf0\x9f\x19\xb9\xfb\x59\xf7\x42\xa2\x49\x85\xa7\x1e\x48\xa7\x05\xd4\x32\x3c\x39\x1d\xe4\xf7\xe0\x44\x03\x65\x5e\x4b\x10\xae\xee\xf0\x42\x76\xf0\xc7\xae\x6d\x9a\xa0\xc5\xbc\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xc3\x11\xe4\xab\x9d\x9d\x8e\x7e\xbe\xfe\xe7\xf5\xcf\xa7\xaf\xdf\x5d\x5c\xc6\x83\x9c\xb8\x22\x46\xc1\x0e\x6e\x03\x7b\x47\xd8\x55\xf0\xa1\xdd\x63\x2e\x8f\xc1\x7b\x06\xb9\xf7\xac\xe4\x77\x89\x21\x06\xbd\xa7\x08\x8e\xbb\x7a\x70\xd3\x9c\x8a\x9a\x8b\x91\xe0\x13\x5a\x45\x7b\xa7\x73\x9d\xe0\xa5\xee\x38\x67\xe3\xa9\xfd\xb8\x13\xf7\x26\x1d\x74\x35\xd4\x15\x08\x6a\x0a\x49\x87\xfa\x35\xf1\xc6\x4d\x0f\x32\x6a\x00\xac\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\x4f\xb6\xd1\xdd\x88\xfc\xf3\x1c\xc1\x98\x8a\x17\xb8\x82\x42\x07\x69\x1b\x1f\x65\xf6\xb3\x2f\xf7\x2b\x00\x07\x63\xb7\x9d\x51\xc5\x71\x49\x4a\x27\xd7\x19\x2f\x89\x23\x41\x75\xca\x0e\xc4\x4e\x92\x3a\x72\x63\x80\x99\xd0\x9e\x43\x33\x37\x82\x38\xd3\x79\xb9\x79\x6e\xb8\x5f\x93\x9a\x7c\xd7\x8f\x44\xd9\x51\xf6\xf2\x6e\x52\xcf\x9c\x6f\xc6\x1e\x30\x3a\x81\x58\x36\xa8\xfc\x74\x02\x9b\x52\x1f\xb1\x17\x6f\xdd\x32\x24\x30\xa4\x67\x0a\x06\xc1\x4b\x76\x64\x77\x9a\xf9\xf1\x3b\xd2\xa0\xca\x6e\xa9\x9e\xc1\x49\x27\xa4\xdd\xb6\x71\x3a\x88\x81\x96\x25\xee\xc7\x8f\x50\x8b\xc3\xc9\x7f\x2c\x92\x69\x5c\xfc\x12\xa3\x61\x70\xb4\x1a\x41\x86\xab\xc7\x2b\x35\x76\x75\xd5\x32\x45\x6b\xe2\x52\x95\x87\x4b\x3a\x91\x30\x5f\x1f\x48\x4f\x0c\x98\x65\xa3\x23\xf4\x81\xc1\x79\x65\xa4\x44\x43\xc4\x78\xb7\x44\x84\x4d\xb8\x28\xc0\x4f\xb7\xd5\x0d\x5e\xe0\x06\x8f\x69\x45\x53\x84\x79\xae\x0d\x0e\x3c\xdb\x41\x7f\xc0\xa1\x59\x96\x27\xa5\xe0\x8d\xb9\x89\x5d\x0e\x51\x3a\x36\xa4\x8f\x55\x0f\x29\x21\x41\x61\x9f\xf4\x3b\x32\x15\x98\xa9\x2e\x49\x65\x65\xe3\xfc\x16\x75\x90\x1c\x4a\x00\x2e\xf3\x31\xd6\x9f\x96\x5a\x66\x84\xcb\x96\x7c\xae\x76\x8d\xfd\xee\xcc\x0d\x2e\x00\xab\xa3\xd1\xfb\xeb\x8b\xff\xb7\x74\x6e\xe2\x55\x3b\xf3\xec\x36\xf7\x95\x96\x07\xd9\xb6\xcd\x15\xa9\xf9\x7c\xbf\x71\xbe\xfa\x8d\xe3\x1d\x44\x5b\x27\xee\xb8\x6a\x59\xe8\x8e\x61\x41\xd7\x50\x9d\xa4\xeb\x8c\x7c\x8e\x6b\xff\xad\x61\xb9\x51\x41\x90\xfe\x09\x53\x14\x57\xd5\x22\xf4\x91\x2a\x6e\x6a\x62\x64\x29\xec\x16\xde\xae\x13\x5c\xc9\xe7\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\x77\xbc\x65\x79\x98\x40\x12\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x13\xf8\x16\x99\xc8\x79\x40\xf2\xd5\xd3\x73\x12\xd4\xac\x9b\x40\xb5\xf2\x09\x80\x4e\x0f\x37\xf6\x4b\x2b\x89\x5c\xaf\x57\x75\x81\xf4\x09\x8f\x8f\x1f\x0a\x82\x4b\x30\x30\x1b\xac\x66\x86\x7d\xa6\xc6\xf2\x96\x94\xe6\x83\xc4\xcc\x5b\x0f\xc3\x06\x28\xa5\x9b\xe9\x1b\x3d\xb9\x0e\x39\x0d\x0e\x61\xc3\xc1\x03\x58\xed\x14\x53\x6c\xab\xa7\x21\x41\xb0\xeb\x45\x78\xcf\xaa\xc5\x15\xe7\xea\x7b\x5f\x5c\x67\xdb\x27\xe3\x1f\x36\x1c\xd1\x77\x62\x82\x5f\x1a\x43\x97\x87\xb0\x71\x40\x2e\x06\x25\x81\x52\xc5\xa2\x5e\x90\xdf\xaa\x54\x14\x2d\x3b\x95\x6f\x04\x6f\xa3\x75\xb8\x9c\xf6\xe6\x9b\x8b\xd7\x70\xf1\xb5\x96\x9c\x81\x29\xb1\x68\x38\x65\xca\x79\xbc\x32\x06\x6d\x3e\x58\x1a\x8c\x50\xb2\x25\x67\xbc\x23\xf4\x0e\x2f\x10\xae\x24\xf7\x2e\x35\xb6\x2e\xc8\xe9\x22\xa8\xfa\xeb\x31\x57\xb3\x95\xd0\x29\x66\xf1\xa1\x9c\xd5\xf6\x06\x01\xc7\x43\x97\x4e\x47\xd9\x4a\xb3\x0a\xb0\xe5\x8d\x20\x05\x29\x09\x2b\x9e\xeb\x89\xd8\x36\xe5\x00\x9c\xaa\x4b\xce\xb4\x78\xdd\xf6\xb9\xba\xf0\xfe\x49\xbb\x1a\xe1\x29\x02\x57\xb6\x0d\x22\x62\xa0\xe7\x00\xe1\xda\xca\x14\xe0\xff\xc5\x04\xa2\x9e\x66\xd3\xfd\xbd\x1d\x93\x4a\x2f\x36\xad\x2a\x53\x41\x18\x2b\x03\x08\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\xa1\xf1\x29\x32\x25\x27\xd2\x17\x72\xc3\x12\x7d\xb8\x78\x8d\x5e\xa2\x43\x3d\xb6\x23\xd0\x38\x26\x98\x56\xc0\xf8\x01\xe0\x9b\xa5\x90\xec\x04\x40\x83\x3c\x25\xfb\xf7\xc2\xca\x11\xc4\x85\xb9\x5a\x06\x88\x71\x24\xdb\x62\xe6\xe6\x80\x72\xe6\x3d\xc2\x96\xfe\x31\x09\x0e\xbd\x17\x3b\xf9\xee\xc3\x0f\x92\x88\x6d\x1f\x5b\x7d\x1d\x7e\x78\xc2\xeb\x30\x34\x11\xf5\xf1\xef\x2f\x98\x39\xab\x35\x51\xb8\xc4\x0a\xdb\x6b\xd2\xfd\x60\xbf\x6b\xf7\x97\x65\xc2\x65\x29\xc9\x5b\xca\xda\x7b\x83\x74\xdb\x89\xb0\xc7\xf5\x39\xf4\x08\x8e\x17\x2c\x34\x0f\xe2\x76\x2e\x42\x91\x21\x43\xee\xa2\x77\x8c\x06\x0f\x58\xdd\x70\x4b\xb8\xec\x74\x6d\x08\x61\x56\xf2\x7a\xa5\x93\x90\x3e\x9f\x52\x1c\x3d\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x42\x41\xf8\xa5\x43\xf9\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x6c\xce\xbe\x21\x5d\xc9\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf0\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x6d\x26\x56\xe6\x1e\x74\xdc\x99\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x9d\x0f\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x58\x49\xd9\x14\x02\x56\x03\x24\x48\x65\x08\x6d\xad\x78\xbe\x35\x1e\xaf\x03\x90\x38\xae\x43\x4e\xdc\x74\x98\x55\xc3\xe7\x93\x15\xbb\xb9\x0e\xaf\x69\x7e\x73\xf9\xfe\x26\xcc\xe1\xc2\x6c\x61\x32\x55\xe1\x4f\xb6\x7e\x9d\x3e\x1b\x4c\xe7\xf2\x2a\x3e\x36\xa4\x33\xe9\x7d\xeb\x11\x9d\x4f\x77\x4a\xbf\x0c\xe5\xb9\x8c\xf1\xcc\xda\x85\x65\xc0\xe7\x6a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x87\x1c\x20\xff\x30\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2a\x43\x27\x08\xae\x52\x13\x34\xcd\xb3\xce\x0b\xe2\x4e\x81\x27\xb4\x59\xf5\x06\xf4\xc9\xd1\x53\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x7d\x17\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x6b\x4a\xf9\x07\xf8\x3c\x49\xa7\xf2\xc4\x4a\x94\xa1\x9e\xb8\x23\x44\x59\xe5\x33\x85\xc1\x5b\xc8\x94\xb4\x11\x84\xe4\xc1\xa3\xc2\x8f\x1e\xb6\x1e\xe4\xa7\x78\x68\xf6\xea\xf4\x00\xc7\x1a\x6c\xde\xad\x6b\x1d\xab\xbb\x2a\x8d\xb6\x78\x69\x67\x3d\x30\xf6\x90\x2f\xcc\x46\x71\xd6\xce\xa3\x31\x5e\xb7\x3e\x49\x56\xe9\x2f\x88\xcc\x57\x4a\x3d\x43\x05\x7c\xdb\x25\x54\x12\x53\xc9\x80\x00\xa5\x0b\x7e\x30\xd3\x1d\xc2\xdb\x07\x50\xfa\xc9\xfe\xe9\x41\x2e\x8a\xbb\xd3\xaa\xd2\x0b\x89\xf5\x35\x71\x20\x43\x74\x27\x98\x26\x33\x3c\x27\x5d\x11\x68\x32\x99\x90\x02\x8c\x85\x70\x14\xe9\x25\x92\x0f\x29\xa0\x98\x42\x3a\x5d\xc5\x4d\xdb\x18\xd5\xf4\x5e\xf7\x30\x6c\x31\xc4\xa0\xb2\x12\x02\xff\xeb\xbf\x4e\xa8\x84\x81\x00\x7c\xe0\x99\x5b\x06\x7a\x85\xc2\x46\x5c\x72\xb4\xd2\xd7\x96\xfe\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2a\x72\x8c\xd6\xa4\xef\x3c\x59\x04\x19\x7d\x79\x14\xf9\x11\x63\x55\x68\x57\xe2\x55\xa9\xa4\x27\xa6\x0c\x24\x14\xa6\x49\x66\x3c\x19\x75\x25\x6e\xbf\x88\xe6\x3b\xa2\xbd\x2d\x13\x7f\x90\xfb\x78\x4d\xb4\x37\x55\xe7\xf7\xa4\x58\x2a\x29\x59\xd7\x50\x39\x8b\x43\x23\xad\xf2\x85\xef\x92\x6f\xad\x1d\xd1\xe9\xed\x08\x77\x45\x88\x9e\xd9\x09\xa7\x4e\x4d\x36\xff\xd4\x8a\x73\x7f\x11\xa4\xf3\xb6\x07\x1c\x73\xfa\x9f\xfa\xe6\xa2\x6c\x6a\xc9\x4c\xb8\xf0\xd4\x4f\x49\xdd\x72\xfd\x80\x8a\x07\x9c\x2b\x74\x78\x70\x72\x70\xb4\xb2\x17\x0e\x64\x88\x87\x36\xa9\x9b\xdd\x80\x24\xad\x9b\x6a\x01\x63\x38\x30\x45\x0e\x12\x8a\x87\xe9\xc7\x21\xeb\x3c\x5b\xb0\x9c\x91\xaa\x1a\x20\xa9\xef\x69\xec\x88\xda\xcc\xa7\xfa\x47\x4a\xb4\x85\xb1\xe7\x0f\x0f\x7e\x3d\x18\x20\xa2\x8a\x23\x74\xc7\xd9\x81\x32\x9e\x59\x74\x03\xca\x6e\x52\x9f\x7c\x27\x16\xbc\x85\x3a\x7c\x66\xd9\x3c\xb7\x5f\x81\xb5\x9e\xd6\x1a\x65\xc2\xb0\x03\x90\x2a\xa1\xae\x9c\x7e\xce\xef\xa9\xd2\x32\x53\xb5\x60\x4f\xbd\x34\x2a\x0d\x81\x22\x02\x58\x42\x85\xdd\x93\x19\xc1\x95\x9a\x2d\xbc\x9a\x65\x4a\x9c\x49\xd4\x32\xfb\x4d\xba\xb0\xdf\x81\xfc\xb6\xdd\xcd\x34\xb3\x95\x16\x77\xba\x50\xb4\xed\xe3\x67\xeb\x44\x9b\x7a\xd0\xfd\x1a\xd1\x50\x3b\x9a\x94\xb9\xca\x44\xff\xf1\xeb\x2b\x01\x3d\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\x2a\x8d\xfc\x7a\x47\x62\xa0\x5b\xae\xfb\x9c\xb5\xdc\xf1\x88\x0b\x85\x98\x2f\xb9\xa7\xcf\xd6\x14\x56\x91\x88\x39\x2d\xc8\xf1\x13\x54\x17\xce\xc5\xba\x99\x7e\x10\x10\xa0\x36\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xac\xf3\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\xae\x3f\x74\x69\xee\x13\x49\x08\x5a\xe3\x57\xd5\xa2\xc3\xfc\xcf\xb8\xe2\xe3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x0f\x0b\xdd\x03\xca\xa6\xc7\x75\x79\x94\x50\x8d\x05\x05\x95\x62\xad\x1b\x67\x29\x20\xe2\xa2\x64\x9e\x27\x94\x4a\x1f\xca\x1b\x2f\x60\x52\xb6\xee\x2b\x44\xae\x97\xdf\xa2\x17\x2f\xa2\xde\xa2\x97\xe0\x4d\xa6\x5a\xfd\x3f\xdc\xdc\x8c\xde\xf4\x2b\xf5\x33\xf8\x10\xbd\x39\xbf\xf1\xd5\x19\xf4\xee\x32\xd9\x17\x7b\xa9\xbd\x33\xd5\xfa\x33\x38\x88\x37\xa9\xf0\x0f\x0c\xb6\x5a\xe5\xc2\xe3\x6a\x81\xee\xb0\x49\xbd\x96\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x12\x21\xc1\x1a\x22\x78\xfb\xc1\x8f\xa0\x4f\xd9\x96\xed\xac\x95\x8a\xd7\x68\x66\x87\x6a\xe6\xb0\xab\x7f\x62\x74\x23\x73\x04\xc1\x19\x24\x91\x20\x8d\xb1\x96\xec\xdf\x7c\x15\xb6\xd0\x8a\x14\x32\xf3\x1c\xb0\xe4\x63\x54\x84\x53\x65\x15\x7d\x53\x72\xd9\xca\xa8\xa4\x1a\xb8\xe6\xc9\x52\x6c\x0a\x65\x2a\x38\x85\xd2\x8b\x4e\xb9\x97\xa4\x47\x4b\xf2\x94\xaf\x42\x59\x4a\x58\xa1\xec\x95\x89\x90\x8d\x09\xd8\xcd\x65\x90\x02\xba\xa3\xa9\xf4\x69\xc8\x91\x2c\x38\xe4\x45\x81\x19\x67\xb4\xc0\x15\xfd\x37\x29\x51\xdb\x70\x86\x78\xab\x9a\x56\x81\x2b\xa8\xc0\x92\x0c\xe7\x58\x50\x2d\x50\x4d\xfd\x3f\x0f\xd9\x60\xfa\xb4\x2b\xce\xc1\x4f\xe2\xa3\x63\xa6\xc7\xe9\xdd\xcc\xa4\xcd\x20\x57\x2b\x3f\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\xe4\xc2\x2c\x9f\x59\x87\xd5\x0c\x20\x48\x05\x44\x12\x2d\x82\x0d\x04\xa7\x36\x1b\x76\x20\x43\x20\xab\x15\x9b\x28\x12\x4c\x15\x64\xb1\x64\x07\xeb\x1e\xae\xce\x61\xa6\xa0\xf8\xe3\x9b\xd5\x61\xb9\xbe\x31\xd1\xba\xfd\xc5\xe9\xe5\xe9\xcf\xd7\x1f\xcf\x7e\xbe\x3c\x7d\x77\x9e\xf2\xea\xe4\x52\x1b\x39\x8b\x6d\x64\x2b\xb7\xf1\x48\xc5\x88\xf4\x23\x8b\x19\xd9\x9d\x78\xf8\x35\xf4\x26\x64\x4f\xb2\x36\x00\x14\x65\xe5\x19\xe8\xb4\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\xca\xa8\xa2\xb8\x7a\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\x61\xa4\x97\x5e\xd8\x48\xd3\x21\xeb\xb6\xee\x83\x0f\x66\x58\x9a\xa0\x33\x29\xd1\x98\x4c\xb8\x20\x10\x35\x61\x5a\x22\x35\x5d\xfc\xd8\x8c\x4f\x3d\x61\xbd\xb8\x3b\x2e\x6e\x2b\x8e\x4b\x79\xd2\x70\xf3\x3f\xc3\x8a\x4e\x48\xb1\x28\x2a\xf2\x3b\xdf\xff\x61\x92\x9a\xbe\x1b\xee\xf1\x86\x08\x0a\xd0\x85\x5d\xd8\x35\x3f\xf0\x3b\xc4\x27\x8a\x30\x74\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xd3\x3e\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x88\x0c\x49\xb9\xd3\x91\x2f\xdb\xc7\xcf\x87\xbe\xec\x0f\x27\x6d\xd5\x0f\x7f\x99\x90\x58\x9e\xd8\xd7\xab\x63\x9f\x50\xf3\x0a\xfa\xe3\x45\x11\x66\xa5\xc3\xc6\x7c\x7d\xfb\x44\x15\xcd\x35\x2f\x6e\x33\xb9\x5d\x6f\xce\x46\xe6\x6d\x4b\x78\x16\x73\x03\x6b\x2d\x93\x23\xac\x7f\x05\x0a\xe8\xde\xe9\xba\x33\x4e\xd7\x83\xae\xd4\xd4\xa6\x0e\xd4\x83\xbd\xb5\xd5\x3d\x4e\xf1\x11\xfd\x52\x0d\x7b\x6b\xeb\x81\x67\x6f\x6d\x6d\xf0\x18\xb4\x3b\x64\x8e\xbe\x11\xb8\x20\xa3\x5d\x52\xde\x9c\x00\x41\xa5\xad\x25\x8a\x3a\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x53\x3d\x92\x49\x5b\x55\x0b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\xeb\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\xd7\xb6\x88\x24\x2c\xde\x9d\x8e\xc3\x15\x44\x92\x4e\xf5\x74\x01\xd0\x73\x46\x90\x61\xfb\x71\x35\xc2\xba\x8e\xe8\x56\x27\x5c\x14\x74\x5c\x2d\xd0\x0c\x57\xda\x58\xba\xa3\x6a\x86\x30\xba\xa5\x55\x65\x5f\x13\x3f\x51\xd7\xae\x6a\xa3\xd1\x68\x2a\xce\xa6\x30\x19\xd8\x82\xc7\xef\x1b\x52\x28\xa8\x5b\x4f\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x9b\x01\x3f\xee\x02\xdf\x5e\x9f\x62\xd4\xf2\x24\x98\x0a\x53\x9f\xdc\xf3\xfd\x2c\x40\xf4\xde\x95\xdf\x35\x15\xaf\xa2\xfb\x64\xfa\xd2\xaf\x77\x65\x3e\xf3\x5c\x0f\x36\xc5\x49\x6f\x0b\xc8\xb9\x8b\x6e\xeb\x23\xbc\xd7\x89\x56\xc6\xd9\x90\x91\xa9\xc9\x28\xb7\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xf3\x93\xa5\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x0b\x34\xa7\x38\xba\x27\x90\xbd\xde\xed\x28\x74\xc8\x38\xe2\x8d\xbe\xba\x5a\x46\xd5\x02\x22\x7a\xb3\x56\xa1\x92\xdf\xb1\x84\xc4\x90\x1b\x0b\x73\xc0\x68\x4c\x14\xb6\x3e\x70\x7d\x08\x3c\x79\x33\xf0\x32\xeb\xb3\x07\x18\xf2\x9b\xb5\x1b\xc0\xf3\x39\x4f\xb1\x4a\x90\x12\x6b\xb4\x79\xb3\x9e\x9f\xde\x76\x54\xda\x78\x5d\x22\x61\xec\x6e\x50\xb0\xe9\x13\xcd\x5b\xb5\x23\xf7\xc8\x43\xae\x23\x93\x8b\x1f\x18\x89\xb4\x26\x12\xf1\x36\x13\x31\xfe\x2b\xdb\x5c\x4e\x0b\x6f\xef\x77\x5a\xfb\x48\x55\xd2\xa8\xf2\xa8\x39\xb6\xd8\x03\x2c\xe3\x36\x61\x30\x20\xda\x1b\xb7\x93\x09\x11\x70\xd3\x41\x87\x57\x60\xf7\xbe\xe0\x90\xbb\xc3\xe2\x9c\xb7\x16\xf0\x45\xd4\x00\x48\xce\x6d\xd6\xfb\x03\x4d\x5a\x36\x40\xa8\x27\x2a\x88\x04\xd2\x6a\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x50\xa0\xa7\xe5\xd6\xc1\x38\xdf\xb3\x38\x4c\x62\xde\xfd\xb0\x8e\x9e\xc2\x6e\x8b\xa2\xe2\xd2\xe6\x71\xc2\xba\x14\x33\xcc\x18\x71\xce\x28\xaa\xc0\x93\x3d\x26\x84\x21\xde\x10\x03\xca\x8b\xea\x0c\x46\x92\xb2\x69\x45\x10\x56\x0a\x17\xb3\x63\xdd\x3b\xe6\xf6\x42\x97\x30\x69\x3f\x91\x4a\x10\x5c\x9b\x3d\x21\x48\x8d\xa9\x69\x1e\xe1\x42\x70\x29\x51\xdd\x56\x8a\x36\xfe\x65\x71\x5e\x44\x02\xa9\xeb\xd2\xe4\xcf\xb9\xb5\x82\xb4\x92\x2e\x33\x73\xd0\xf5\xd0\x0e\x9f\x87\x55\x55\xc0\x75\x36\xd0\xdf\x92\xba\x51\x0b\xa4\xa7\xb6\x8a\xce\x8d\x99\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\xdc\x68\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x22\xc8\x40\xf4\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x39\x88\x5b\x3b\x57\x42\xc3\x6c\x1c\x37\x23\xb0\x75\x9c\x82\x63\x7a\x64\x3f\x0a\xba\x10\x14\x04\x76\x35\xe1\xb5\x3e\x9b\x22\x57\xa0\xce\x85\x3b\xd7\x83\x5e\x72\x74\x67\x5b\x40\x2a\xcc\x8a\xd4\x81\x0d\xc5\xc8\x5c\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xc9\x65\x8c\xc2\x62\x4a\xd4\x99\x1b\x7f\x6c\xf6\x6e\x0e\x69\x13\x56\x4e\x0f\x1d\x44\xdd\xe2\xc0\x3a\x8c\x78\x09\x6c\x12\x1d\xe3\xc7\xba\x72\xee\x66\x5c\x91\xb6\xd7\xcd\x03\x35\xe2\x9d\x45\x65\x32\xbc\x7c\x47\x65\x83\x0b\x22\xd1\xe1\xc5\xe8\x6c\x80\x46\x17\xaf\x6d\x1a\x17\x9f\x2c\xb3\xeb\xc5\x4e\x8b\xbd\x04\xcd\xd9\x7d\xa8\x80\xbd\xaf\x4e\x13\x74\x29\xa0\xd9\xb2\xfd\x1d\x79\xa3\x2c\x7a\x66\x56\x6f\x02\xb0\xd0\x68\xdd\x54\x50\x27\x12\xc9\x16\x2c\x23\x1b\xb8\xd0\x5b\xdb\xd8\x23\xf6\xd0\x92\x8e\xe0\xc8\x92\xd1\x47\x06\x71\x4c\x2b\x7e\xb8\x76\xcd\x21\x96\xed\x26\xca\xea\x01\xa0\x30\x2b\xfb\x95\xe7\x88\x81\x5c\x33\x0b\x15\x8f\xbf\xdd\x23\xdd\x61\x81\x11\xf5\x8e\x48\x89\xa7\x64\x14\x89\x03\xca\x71\xf6\x3a\x0f\x37\x00\x88\x3a\x79\x3d\x23\x86\x0a\x4b\xf1\xe0\x93\x30\xbb\x32\xf4\xda\xd4\x66\x20\x51\x3d\x70\x67\xeb\x4e\x50\xa5\x08\x5c\x0f\x50\xeb\x09\xb6\xee\x32\xbd\x67\x3f\xab\x33\xaa\x3d\x3b\xe9\x61\x7b\x5a\xef\x67\xa5\xc9\x8f\x1c\x13\x34\x16\x94\x4c\xd0\x84\x42\xc2\x26\xa4\x32\x0e\x4c\x9d\x02\x0c\x80\x79\x2c\x25\x11\x30\x6c\xeb\x8f\x73\xc3\x8f\xeb\xcf\x3f\xec\xf8\x95\x68\x59\x81\x83\x22\x9e\xc0\x3e\x46\x27\x68\x0a\xe9\x93\xd6\xfb\xf4\xa7\x97\x7f\xfb\x0b\x1a\x2f\xb4\xa1\x04\x67\x52\x71\x85\x2b\xd7\x01\x54\x11\x36\xd5\xab\x08\xba\x4e\xdc\x85\xdd\x63\xb0\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\xba\xf3\x40\x31\x39\x29\xc9\xfc\x24\xd8\x42\xc3\x8a\x4f\xe3\xde\x7a\xe6\x09\x9f\xda\xa6\x8c\x05\x44\xe4\x3e\xd1\xbc\xa2\xc5\x62\x6b\xf7\xa9\x75\x85\xa1\x19\xbf\x33\x5e\xd4\xd5\xa3\x1a\x90\xc1\x34\xbc\x69\x2b\x98\x38\xf4\xbd\x67\xf0\x6b\x25\x59\x26\x47\x4a\xf5\xce\x07\xd2\x0e\xd0\x0b\xb6\xd9\xa5\xab\xde\xe6\x0e\xbb\x6e\x72\x4b\x4d\x61\x83\xdd\xbe\x52\x49\xb4\x1b\xfc\x7b\x5c\x55\x63\x5c\xdc\xde\xf0\xb7\x7c\x2a\xdf\xb3\x73\x21\xb8\xe8\x8f\xb9\xc2\x5a\x99\x9e\xb5\xec\x16\xea\xec\x76\x74\xb5\x7c\x6a\xc1\xbc\xc0\x2c\xd9\x9f\xd8\xa8\xce\xb8\x51\x1a\x02\x51\x67\x0b\x38\xe7\x77\xd7\x32\xb9\xa7\x9d\x87\x9b\x21\xa2\xfb\x1c\xaf\xe1\x84\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\xc8\xf5\x97\x03\x73\x01\x80\xea\xab\x6d\x9c\x1a\x57\x55\xac\x4e\x13\x8a\x80\xef\xa3\xcb\x57\xef\xc0\x91\x57\x5b\x3b\xdd\x5f\xec\xab\xb9\xb9\xf9\x27\x68\x62\x54\x49\x52\x4d\x06\x86\x0f\xc6\xfb\x93\x0f\xc0\xac\x39\xb0\x57\x5e\x3c\x97\xd0\xf6\xbd\x25\x73\x5e\xb5\x35\x79\x4d\xe6\xb4\x88\x43\x0e\xf4\x56\xa5\xf7\x36\x17\x1f\xab\xa8\x04\x5d\x72\x5c\xf1\xe2\x16\x95\xf6\xcb\x20\x47\x65\xb9\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x38\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x5d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x0c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\xff\x36\x44\x27\x2b\xa6\xba\xaf\xa8\xe6\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\x3e\x6e\x90\x01\x85\x90\x96\x9c\xd4\x9b\x17\xe6\xd1\x1f\x35\x56\xd6\x3e\x72\xde\x0b\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xdb\x9a\x84\xd5\x54\x96\x1a\x37\xc3\x5b\xb2\x88\xdc\x70\x89\xc7\xe5\xa1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x11\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x67\xc6\xa2\xeb\x76\x0c\x67\x0a\x7e\xfe\xb8\xf4\x60\x59\x95\xa7\x6d\xdf\x55\x1f\xbb\x15\xef\x5f\x55\xfa\x13\x7f\x57\x99\x5f\x7d\x4d\x37\x14\x8c\xef\xb9\x5e\x50\xbe\xf3\x99\xe4\x70\x12\x36\x11\xae\x35\xbb\x33\xfa\xf7\x58\xcf\x13\x66\x8e\x74\x60\x33\x5b\x0f\xd5\xb1\xa9\x37\x90\xd0\x01\x7d\x14\x6d\xa3\xe8\xe0\xdb\x83\xad\x5e\x8e\x66\x65\x04\x6f\xf0\x14\x4c\xda\x5d\x58\xa0\xe5\x3e\x85\xf4\xb6\x33\x7e\x17\x8a\xcc\xc6\xfe\x4a\x4b\x4c\xc7\x91\x3e\xe3\x49\xab\x63\xb0\xbe\x6e\x47\x58\xb3\xdc\x54\x89\xb8\xc3\x0b\x84\x05\x6f\x59\x12\x71\x01\x84\x32\x7d\xa8\xfb\xdd\xd2\x60\x2f\x39\x23\x0e\x56\x93\xd2\xca\x4d\xcf\xf5\x0d\x08\x23\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x3a\x27\x57\xb6\x7c\x7a\x10\x06\xbd\x98\x8c\xb8\x94\x74\x5c\x41\xaa\xa5\xe2\xe8\xdc\xd4\x96\x5f\x1d\xa8\x87\x7a\xc1\x88\xb9\x08\x89\x50\x13\x7a\x78\x68\x4e\x70\x08\xd1\xd6\x0d\x24\xe0\xb4\x76\x4b\x05\x85\x75\x5d\x52\x41\x2f\xbd\x0a\x6a\xee\xbd\xad\x8e\xd5\xd5\xd4\xdf\x05\x49\xf2\xce\x06\x15\xba\xa2\xf9\xd4\x15\x65\x86\x8f\xee\x04\x55\xf6\x70\xdf\x51\x49\xd0\x21\xb8\x33\x96\x36\x63\x12\xf7\x73\xe8\xfc\x4a\x2c\xae\x9f\x83\xbb\x59\x2c\x1f\xdd\x5d\x58\xa5\x55\x79\xd2\xe5\xcc\xdc\x59\xcf\x57\xb7\x82\x56\xfa\x77\xf7\xf2\x0c\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x45\x12\x7b\xd5\xc5\x04\x85\x22\xd1\x22\x0e\x82\x20\xe4\x0c\x4b\xc4\x38\xaa\x09\x06\x48\xb5\xbe\x5d\x9c\x14\xec\xd1\x40\xe7\xeb\x83\xd9\xec\xe6\x1a\x0b\x2f\x04\x2b\xae\x5f\x53\x69\xc5\xb3\x96\x23\xd6\x74\x31\x40\xac\x1a\x97\x29\x64\x0c\xc1\x9c\x76\x8b\x77\xdc\xc1\x9c\x97\x7b\xd2\x5d\x1c\x4b\x7d\x79\x8c\x7e\x0c\x6c\x75\x73\xdd\xbc\x89\x2c\xaf\xf1\xe7\x75\xb0\xb6\x24\xfc\x89\x79\x96\x87\xeb\xaf\xc5\x95\xb1\xae\xef\xb1\xef\x70\x42\x1f\x3e\x3f\xd4\x41\x20\x0b\x1d\xaa\xdb\x80\x60\x6c\x79\x15\x9b\xa3\x9c\x46\x12\xee\xa2\x19\xde\x4f\x34\x25\x8c\x08\x6c\x03\x12\x0e\xd4\x6d\x43\xfa\x58\x72\x96\x7a\x20\x3e\xb3\xe1\xb4\xbc\xff\xbc\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x74\xda\x6d\xa8\x65\x9d\xc6\x92\x73\xd4\x4b\x64\x7a\x66\xf3\x07\x2c\xbd\x7a\x51\x7e\x69\xe9\x1c\x57\xc4\xd0\xe3\x3b\xd1\xb0\x55\x65\x42\xb6\xe3\x5d\x35\x1b\xad\x7d\x08\x66\xc7\x7a\xb4\xc4\x83\x16\x64\x26\x7d\xe2\xc5\x0b\x74\x68\xda\x38\x30\xb4\xd8\xdb\x55\x72\xed\x5a\x9d\xdf\x37\x09\x45\x61\xf3\xad\xd7\xf9\x7d\x83\x01\xe0\xd1\xec\xc4\xc2\xfd\x17\x99\xe1\x39\x01\x16\x72\x5a\x61\x51\x41\x1a\xc9\xb5\x99\x32\x34\x6e\x15\x22\x6c\x4e\x05\x67\x00\xaa\x02\xba\x28\x2d\x99\x04\x99\x10\x41\x58\x41\x24\xfa\xfd\xe1\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x14\x0e\x48\x03\x50\xf6\x69\x63\x57\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x74\xa6\x2c\x5d\xc3\x12\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xed\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\x3f\xe3\x52\x9d\x56\x14\xcb\x4d\xfd\xd8\x69\x5b\xfd\x87\xae\x59\xc8\xf6\x63\xb6\xaa\x23\xae\x3c\xc4\x40\xf7\xcc\xc0\x9c\x2e\x46\x16\x8b\xee\x76\x25\x65\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd8\x13\x83\x38\x9a\xa0\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x66\xbc\xb2\x79\xd7\x0e\xcd\x30\x26\xea\x8e\x10\x86\x2e\x46\x30\xe7\x7a\x2a\x0d\x2f\xe3\xfa\x99\xb7\xca\x31\x53\x62\x61\x0f\xf4\xc6\xbd\x09\xd6\x0c\x56\x61\xd3\xa3\x9b\x10\x7f\x8a\x8f\x3c\x0d\x11\xdd\xf4\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\x7e\xf0\x0b\xea\xd8\x74\xf0\x98\xcf\x09\xac\x77\x59\x8a\xc8\x2c\xed\xad\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xe4\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x86\xc7\x2d\xdf\xad\x78\x31\x3a\x7b\xca\x1b\xf1\x83\xf5\x2e\xe9\xa6\x0f\x24\xa2\x4d\xd1\xe5\x75\x6c\xba\xf4\x5d\x2e\x43\x40\x67\x16\xe1\x68\x8f\x75\xae\xcf\xba\x82\x8d\x4f\xad\x54\x20\x66\xda\xd5\x57\x9a\xa5\x15\xb7\xc0\x11\xf0\xfc\x34\xbc\x3c\x5e\x9e\x6a\xfb\x17\xf1\xd3\xed\xdc\x4a\x46\x85\xb1\xde\xb4\x81\xa7\xf6\x59\xba\x42\x01\x26\xe9\xfd\x67\xb1\x55\x0e\xb7\xb7\xb0\xa3\x8b\xd7\x5b\x3c\x17\x0d\x2d\x9f\xf7\xb9\xf8\x20\x37\xa6\xd5\xcf\x3a\x81\x50\x7d\x33\xef\x0c\xc6\x60\xa6\x6d\xc1\x4d\xfb\xd7\xc0\x88\xc5\x15\x6a\x04\x91\x84\xf9\xb3\x53\xae\xcb\x37\x84\x6b\xb1\x3f\x8a\x81\xfe\xf7\xa4\xad\x36\x55\xfd\xb9\x08\x28\x75\x3c\xff\x10\xf6\xec\x21\x10\x63\xc0\x73\x4c\x2b\xf0\x3b\x05\xfc\xb0\x2b\x1d\xb0\x69\x51\x1b\xf6\xa0\xe2\xb8\x84\x98\x17\xba\xd5\x77\x56\x85\x6a\x5e\xb6\x95\x81\x68\xa1\xb3\xd3\xd1\xcf\xd7\xff\xbc\xfe\xf9\xdd\xfb\xd7\x1f\xde\x6e\x4c\xa3\x65\x72\xc3\x49\xb7\xc5\x07\x08\x23\x46\xee\xa0\xe7\x0c\xac\xae\xc2\x3a\xba\x3d\xbd\xa2\x16\x8e\xd7\x36\x4b\xd0\x04\x7d\x0d\xe6\x62\xd2\x56\xfa\x47\x1b\xf6\xa0\xa6\x8a\x4e\x31\xbc\xac\xb3\xf5\xc7\x82\xe0\x5b\xde\x2a\x34\x6f\x2b\x46\x04\x1e\xd3\x8a\x6a\xd5\x18\x91\x39\x61\x06\xe8\xa7\xff\x40\x77\x32\xac\x52\x4b\x37\x6d\x3c\x2c\x62\x6c\xcb\x23\xea\x49\xd5\x2d\xe3\xc2\xfa\xd1\x2c\x4d\x24\x7c\xd9\x08\x3a\xa7\x15\x99\x12\xcf\xbf\x16\x43\x03\xdc\xc7\x97\xe0\xaa\x99\xe1\x61\x45\xe6\xc4\xf0\x38\xe9\x2b\x42\xef\xa8\x19\x67\x5c\x98\x80\x93\x61\x24\xb7\x37\x04\x30\xdb\x98\xc3\xea\x6a\xf6\x9a\x2c\xd6\x6b\x97\x4e\x6a\xb3\x48\x9f\x4c\x58\x6d\x0e\xd1\x48\x93\x55\xd7\x3e\xc4\xed\x56\x20\x4c\x83\x1e\x6d\x8c\x16\x5e\xef\xf8\xea\x0c\x4f\x78\xbb\x93\x31\xf6\xb0\x60\x64\xd0\xa8\x43\x57\x42\x09\x98\x5e\x62\xe6\x7c\x63\xbd\x1b\x1c\x61\xa3\xb6\xaa\xae\x49\x21\xc8\xa6\xe0\xdd\xb4\xa9\xbf\x58\x6a\xfb\x21\xb7\x4c\xe0\x7c\x87\x22\x2e\xf6\xc7\xac\xab\xd4\x10\xa4\x23\x77\x34\xdb\x4d\x5b\x55\x26\xba\xbf\x70\xcb\x09\xa3\x95\x41\xda\x08\x95\x2e\xb5\x3d\xe6\x36\xe9\xad\xb1\x24\xbe\x6b\x6e\x79\x1b\x2c\x65\x17\x4c\x9d\xd3\xb2\xc5\x15\x74\x0b\x3c\x90\x36\x73\x1b\x9b\x52\xa4\x56\x22\xd6\x91\x95\xf6\x37\xe4\xf5\xe9\x64\xd5\x89\x99\x93\xdf\x99\xc1\x2c\x28\x9b\x0e\xe1\x13\xdd\x4d\x3b\x9e\x21\x67\x43\x3c\xdc\x14\x38\xff\xac\xdc\x54\x6f\x79\x81\xab\xf7\xe0\xd7\xb9\x72\xbb\xcd\x09\x74\x89\x08\xe3\xed\x74\x06\xd3\x2b\x6a\xec\x68\x63\x2b\xa2\xa0\xba\xab\x4d\xfa\x8a\xf1\x47\xf9\x9d\x5d\x5a\xa7\x52\x58\xd1\xb7\xbf\xb3\x9f\xd0\x55\x95\xe2\x3d\x8a\x45\xd8\xe5\x08\x63\x5c\x06\x82\xdb\xce\x6c\x64\xcc\xad\x7f\xa9\x92\xc9\x84\x14\xca\x01\x41\x8c\x1b\x6f\x00\xb1\xc2\xb2\x35\xdc\xd0\xb8\xb8\xbd\xc3\xa2\x94\xa8\xe0\x75\x83\x15\x05\x15\x63\x11\x8b\x12\x71\xb9\x07\x26\xc7\x0d\xf2\x52\x8f\xd1\x05\x93\x0a\x83\x0c\x74\x14\x17\x7a\x85\xbb\xb4\x54\xc8\x5e\x35\x0c\x61\x33\x22\x08\xc2\x22\x0e\xad\x83\xab\x5a\x2b\x9b\x05\x11\x7a\xef\x57\x0b\x74\x27\x38\x8b\x4c\x0f\xdf\x50\x28\xf1\x39\x11\x73\x4a\xee\x4e\xac\x35\x3d\xd4\x83\x1b\x9a\x2d\x2c\x4f\xe0\x24\x9c\xfc\x0e\xfe\xdf\xf3\xf1\x4b\x2d\xb9\x87\x6a\xdc\xc4\xbb\xfd\xbe\x82\xd8\x0f\x65\xb4\xe3\xbd\x79\x52\x65\xe3\xad\x55\x26\x6c\x6d\x0a\xfa\x6f\x23\xc7\x03\xa5\x7d\x4c\x2a\xce\xa6\x41\x55\x0e\x6d\x9c\x6c\xaa\x15\x30\xaa\x7a\x86\x00\x00\x04\xa0\x58\x3b\x44\x21\xb9\x28\x81\xef\x88\x1a\x50\x76\xaf\x75\x28\x9f\x1c\x30\x2d\x61\xb6\xa9\x83\x9b\xf6\x5a\x87\x5c\x7d\xd9\x19\xb6\x26\x65\xd9\x31\xd8\x2b\xae\x8d\x11\xe2\x8b\x38\x1b\x63\xc1\x62\x38\x11\x2e\x0a\x2e\xca\xcd\x8f\x8a\x56\x75\x94\xa7\x8c\x32\x54\x0c\x86\x2c\x03\xf4\x5e\xad\xe4\x60\xb6\xdc\x4f\xb0\xc4\x45\xdd\x23\xd6\xb1\xde\xaa\x0d\x9b\x6f\x19\xfd\xa5\x25\x08\xd7\x5c\xeb\x7d\x55\x4a\xc2\xd6\xf2\x4a\xd6\x78\x01\x8a\x3d\x4c\xda\x5b\xc7\x81\xa8\x2d\x3b\xad\xbe\x0d\x00\xec\x49\x83\x42\x21\x03\xf4\xb6\x5f\x39\x64\xa0\xc7\x79\x6d\x58\xfb\xed\x47\x9b\xdb\x7a\x40\xae\xc3\x5b\x51\x90\x2b\x73\x11\xd5\x96\x20\x62\xcd\xb4\xea\xbd\xa7\xf0\x2d\x61\x26\x66\xa9\x97\x14\x92\xb5\x5a\x01\x3b\xad\x98\x91\xb2\xad\x36\x5f\xe2\xf1\x02\x4d\xb4\x3a\x6b\xb1\x2e\x33\x3a\x9d\x11\xa9\x9c\xe7\xf3\x04\x28\x0d\x4c\xda\x1c\x2e\x66\xbe\xbb\x20\x7f\x03\x32\xb4\x0e\x2c\x53\xe3\xfb\xcd\x09\x2e\xc0\x78\xb5\xac\xb8\xc6\x93\x20\xdb\xda\xdd\xfd\xcb\x9b\x49\x1e\xa3\xb7\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf1\x69\x03\x7a\x3c\x80\x11\xa1\x09\x96\x33\xca\x59\xea\x2e\x2b\x0c\xb8\xa0\x68\x85\x56\x5e\xaa\x05\xb0\x9b\x97\xa5\xd6\x0f\x05\x12\xa4\xe6\xf3\xcd\xfd\xb6\xc9\x80\x85\x34\xce\x50\x3d\xc9\xc3\xc0\xde\x78\x26\x46\xc4\xa9\x67\x3e\xd4\xfb\xa5\x58\xba\x2d\xcc\x06\xd4\xda\xbf\xab\xcf\x2a\x5a\xd6\xa5\x39\x46\xdc\x1c\x5b\x0a\x2d\x47\x24\x23\xa6\x98\x07\x58\x4c\xb7\x96\x1f\x7c\x2a\xa6\xad\x11\x97\xf6\x7e\x87\x18\x67\xc3\x69\xbc\x95\xb0\x02\x29\x3a\x90\xe8\xec\xdd\xeb\x90\x8e\x39\x2c\xa2\xed\xc8\xba\xe3\x9a\xfb\x98\x17\x8c\x08\x2a\x86\x47\x38\x46\xf5\xa8\xf0\x92\x45\x8b\xf9\x6a\xee\xbc\x5d\xbe\x83\xce\x49\x43\x59\xd3\x2a\xab\x7c\x07\x55\x37\x8b\x19\x66\x53\xad\xed\xbc\xe6\xad\x1e\xd8\xef\x7f\x0f\x83\x10\xa4\x6c\x8b\xc8\x44\x12\xe3\x4d\x33\x27\xf7\xf7\x0e\xd2\x6d\xcb\xfb\xc2\xa5\x24\x0b\xdc\xb8\xa9\x09\x67\x4f\x2e\x98\xc2\xf7\xdf\x22\x7a\x4c\x8e\xd1\x8b\xdf\x07\x5f\xbd\x80\x1e\x47\xf5\xa6\x11\x5c\x0f\xc5\x52\xa4\xc2\xe8\x2b\xaa\x20\x95\xfc\x45\xd8\xc2\x31\x3a\xd7\xfd\x82\x0c\x29\xbf\xb6\x01\xeb\xe5\xb8\x5b\xd9\x01\x12\x64\x8a\x45\x59\x91\x48\x96\x31\x3e\xf1\xc9\x3c\x86\x46\xde\xee\x2a\x72\x4f\xa5\x92\x36\x2c\x72\x9c\x07\xe6\xf6\xa5\x77\x87\xc2\xf2\x56\xdf\x14\x5a\xf8\x0d\x4b\xac\xf0\x30\x90\xba\x27\xc6\x2b\x3a\x2c\x78\x5d\x63\x56\x0e\xb1\x3d\xc7\xdd\xa5\x72\xf2\x3b\x5b\x1c\x61\x88\xfd\xaf\x28\x1b\xe2\xa1\x9c\x91\xa8\x95\xdb\x63\x4c\xe0\xb1\x73\xb9\x2d\x81\x7d\xee\xe5\xb3\x59\x8a\x63\x74\xc9\x55\x67\x4e\xf9\xdb\x16\x56\x39\xa7\x08\x3f\xbf\xbc\xb9\xfa\xe7\xe8\xfd\xc5\xe5\xcd\x5e\x92\xef\x25\x39\x3c\x7b\x49\xbe\x97\xe4\x11\x0d\xef\x8a\x24\x27\x6c\xbe\x2d\x29\xee\x1c\x6f\xeb\xf2\x6a\x6c\x40\x4f\xad\x00\xf4\xb7\x0e\xcd\xdf\x36\xbd\xce\x39\x9b\x7f\xc4\xda\xe4\xb7\xf8\x14\x8b\x7d\x5e\x93\x9a\x64\x7f\x60\xdc\x11\x67\xcf\x9e\x5f\x67\x8b\xec\x38\x19\xd9\x21\xc2\x50\xd4\xba\x55\xeb\x4a\x7b\x62\x74\xf6\xf3\xc5\xeb\xf3\xcb\x9b\x8b\xef\x2f\xce\xaf\xb6\x9a\x38\x08\xfe\xb4\x5d\x48\x19\xdc\x44\x3f\x4a\x68\xa6\xd3\xac\x1a\x41\xe6\x94\xb7\xb2\x5a\x20\x07\xc1\x58\x2f\xae\x56\xa9\x8a\x12\x33\xb0\x0d\x1e\x87\x16\xeb\xb7\x89\x5c\xd2\xed\xd6\xe9\x69\x09\xcd\x6f\x59\xc3\xb3\x9d\xc8\xa1\xe7\x25\xb4\xbf\x46\x43\xfc\x72\x6d\x2f\xa1\xdd\x28\x3d\xf1\x21\x9d\x2f\xa1\x1f\x7d\x6d\x31\xe1\x45\xfd\x14\xd5\xed\x4b\xb2\xef\x05\xaf\x33\x49\xb3\x6b\x13\xc3\x70\xa8\xc5\x75\x47\xf5\xc0\x56\x0c\xec\xe9\xdb\xd6\x72\xec\x4a\x09\x6a\xfb\x15\xe2\xf9\x89\xb3\x93\x54\x6a\x38\x4f\xb5\x5f\x64\x13\x2c\xdf\xe1\xe6\xef\x64\x71\x45\x12\x8b\xa6\xf6\xe7\x9b\x54\xa4\xd0\x3a\x0f\xba\x25\x0b\xc3\xa8\x74\xe6\x1a\x4b\xab\x1b\x9b\x65\xfa\x50\x96\x7a\xcd\xe6\x19\xea\x21\x26\xbd\x23\xcf\x62\xea\xe7\x96\x24\xf0\x10\xb9\x67\x89\x25\x8b\xc0\x12\x82\x9a\xaf\xd7\x34\x6d\xf5\x50\xae\x0a\xcd\xe6\x49\x53\xf8\xdc\x93\xb3\x5a\xb3\x79\xf2\x01\x99\xfa\xcf\x76\x61\x4d\xfd\x67\xab\x20\xa7\xe5\xae\xe4\x83\x3c\xf5\x9f\x5d\x02\x40\xf5\x9f\x8c\xa7\x28\x05\x1c\xb5\xfc\x38\xec\x6f\xe6\x53\x69\x40\xde\x8b\x9e\xea\xe4\x2f\x14\x64\x78\xfa\x41\x4e\xb9\x24\x29\x6b\x05\x64\x9a\xe6\x34\xae\x38\xf3\xe4\x83\x91\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x46\x58\xf9\xa2\xf5\xe5\xb7\x8e\x3c\x4b\xa2\x9a\x28\x5c\x62\x85\x8f\xf5\x81\x18\xf4\xff\x69\x33\x64\xfe\xc7\x7f\x58\xe1\x31\xa9\xe4\x8f\x07\xff\xf9\xf7\xf3\x7f\xfe\x7f\x07\x3f\xfd\x4f\xf8\x1d\xa8\x6b\x06\x85\x1d\xfc\x20\x71\x08\x50\xee\x8b\xf1\x92\x5c\x42\xef\xe0\x9f\xd6\xd2\x3b\x35\x40\x1c\xfb\x05\x94\x5c\x39\x36\xd9\x9f\xfe\x9f\x0d\x2f\x97\xff\x95\x50\xd1\x1a\xed\xa6\xde\x03\x6b\x9b\xc0\xa4\x6c\x9e\x7c\xda\x0f\x6e\xe8\x47\x22\x64\x12\xf9\xae\x7b\xfa\x54\xd9\xe6\xad\x6e\x1b\xcb\x62\x46\x6a\x0c\xff\xf9\xbd\x9b\x02\x7d\x1f\xfb\xa2\x58\x0c\x6a\xdb\xe8\x3b\x70\xd0\x63\x23\x7b\x31\x7f\x95\x64\x71\x9a\x27\xa3\xe4\xf7\x2b\x98\x79\xc2\x60\x46\xec\x6c\x19\x09\xe0\xf5\x47\x9f\xf6\xe1\x72\x2f\xd0\xe9\xe8\x02\xcd\xcd\x0c\xef\xd0\xe4\x3c\x96\xb8\x76\x78\xba\xef\x77\x5a\x6c\x7b\xd4\xdf\x72\x89\x8a\x6f\x4d\x3a\x9a\xfb\xde\x56\x40\x92\xbe\xdc\x3a\xd9\x9c\x4d\x65\xf9\x39\x34\xaf\x3c\x2e\x9a\x76\x60\x5f\x7f\x5c\x93\x9a\x8b\x85\xff\xa7\x27\xf4\x1f\x4a\xc5\x05\x9e\x02\x0d\xad\x69\xdc\xfc\x99\xff\x97\xf9\xc3\x5e\xf7\x56\xff\xda\x38\x24\x3b\xcc\x9e\xe7\x77\xfc\xea\x44\xb6\x5b\xb7\x1d\x91\xd8\x45\x6a\x05\xd5\xfe\xd3\x3b\x0d\x07\x3e\x94\x62\xcc\x44\x3f\x8b\xe0\x05\xb2\x75\x26\x06\x5d\xb2\x1a\xb8\x2a\xd9\x1c\xcd\xb1\x90\x07\xbb\x23\x87\x10\x2a\xe9\x9c\x4a\x9e\x40\x05\xe8\x5f\xb4\xaa\x51\xbb\xb4\x49\x5b\xd1\xcc\xa4\x47\xf9\xb8\xc7\x7d\x03\x65\x85\xfd\x61\x5f\xba\xcd\x5e\xa5\x1a\x0b\x08\x35\x58\x29\x22\xd8\xb7\xe8\xbf\x0f\xff\xf5\xcd\xaf\xc3\xa3\xef\x0e\x0f\x7f\x7c\x39\xfc\xdb\x4f\xdf\x1c\xfe\xeb\x18\xfe\xe3\x3f\x8e\xbe\x3b\xfa\xd5\xfd\xe3\x9b\xa3\xa3\xc3\xc3\x1f\xff\xfe\xee\xcd\xcd\xe8\xfc\x27\x7a\xf4\xeb\x8f\xac\xad\x6f\xcd\xbf\x7e\x3d\xfc\x91\x9c\xff\xf4\x85\x2f\x39\x3a\xfa\xee\xf7\xc9\x5d\xc7\x6c\xf1\x3e\x51\x7a\x9b\x67\x98\xa5\x80\xfe\xba\x37\x66\xb2\x0e\x7b\x57\x21\x65\x6a\xc8\xc5\xd0\xbc\xfa\x5b\xc8\xc4\x4f\x6c\xc0\x6d\xaf\xdc\xe7\xff\xca\x49\xcd\x00\xc3\xee\xb4\x90\x1d\x3a\xe0\x8f\xa5\x68\x98\xdc\xcf\xa7\xf0\xec\x9a\x96\x82\xfa\x4c\x07\xb2\x4b\x7b\xfc\xda\x6e\xd0\xdf\x82\xb3\xd7\xd9\x39\x66\x5d\x3b\xd5\x7d\x22\x78\x6d\xab\xb6\x98\xc8\xf7\x1c\x57\xb4\x74\xbf\xbb\x25\x09\x51\x11\xf7\xec\x9d\xc3\xd1\xcf\xde\x39\xfc\x40\x57\xf6\xce\xe1\xa4\xe7\x59\x3a\x87\x0d\x23\xc5\x6f\xd3\x33\x9c\x9f\x69\x39\x12\xd3\x95\x93\x64\x99\xb0\x79\x2c\x1e\x20\x27\x08\xd2\xb9\x3d\xc2\x1a\xdc\x5f\x86\x34\x8a\xc7\xb7\xeb\x95\xf3\xb0\xa6\x0e\x34\x6f\x54\xda\x7a\x3d\x0c\x0d\x9d\x56\x15\xa2\xcc\x5c\xd0\xfa\x05\x51\xad\x7b\x2a\x2d\x62\xeb\x5d\x58\x0a\xd7\xb9\x1e\xaa\xa7\xc1\x0a\xf0\xf7\xd2\x24\x40\x53\x36\x3d\x36\x6c\x52\x46\x4d\xb4\x10\x15\xca\x50\xdd\x56\x8a\x36\x91\x78\x17\x6f\x86\x1a\xe4\x8c\xbe\x28\xb0\x94\xbc\xa0\xd8\x17\xf8\xf6\x25\xc8\xed\xf4\xc0\x08\x14\xbe\x05\x88\x58\x41\x4a\xc2\x36\x67\xe2\x30\xcf\x47\xdd\x5e\xb7\x0e\xe3\x85\x9e\x89\x73\x36\xb7\xf7\x17\x2a\x5b\x03\x93\x36\x2a\x54\xbe\x76\xbf\x2e\x4c\xac\x3e\xc3\x16\x8c\x13\x40\x63\x41\xdb\xf4\x0e\x47\x0c\x88\x62\x3e\xe9\x22\x7c\x80\x6e\xb2\x24\x43\xdb\xc1\xc5\xa6\xab\xed\x1e\x6c\x93\x64\x8f\xad\xe8\xeb\x5d\x14\xb4\xaf\xa7\x7f\x0d\xf8\xa4\x74\x0d\x3e\xaf\xf6\xfe\x18\x9a\xfb\xae\x68\xed\x3b\xa2\xb1\x3f\x8e\xb6\xbe\x9b\x9a\x7a\x36\x2d\x3d\x8f\x86\x9e\x47\x3b\xdf\x00\xb6\x91\x53\x23\xcf\xa3\x8d\x3f\x86\x2f\xae\x11\x64\x42\xef\x33\x49\x7c\xc7\xa5\x8a\x14\xb9\x07\xcf\x4c\x23\x48\x43\x58\xe9\x32\xe2\x1d\xf5\x21\x50\x77\x3c\x9b\xbc\x05\xe3\x40\xca\x7b\x2f\x5e\xaf\x73\x5e\xed\x2f\x45\xb4\xbf\x14\x37\x78\xf6\x97\xe2\xfe\x52\x7c\x92\x4b\xd1\x4a\xab\xaf\xff\x46\xcc\x5d\x44\xa3\xc6\xd3\xad\xd1\x55\x9e\xf5\x79\x07\x40\x32\x3f\x09\xcf\xe2\x0a\xf9\x6b\xa4\x6b\x29\x14\xb2\x1e\x07\xa1\xb8\x11\x7b\x86\x18\x4c\x20\xc3\x45\x6d\xac\x57\x54\x63\x86\xa7\xc0\x59\xa6\x7f\xe7\x2a\x7f\x71\x81\xb4\x74\x10\x34\xb2\xc0\xec\x12\x81\x03\x38\x8a\x1c\x09\x15\x7c\x29\x78\x55\x11\x21\x51\x45\x6f\x09\x7a\x4d\x9a\x8a\x2f\x6a\x9b\x53\x5b\xa2\x6b\x85\x15\x99\xb4\xd5\x35\x51\x09\xf5\x68\x22\x25\x8e\xa7\x5f\x36\x54\x79\xdb\xda\x8a\xc0\xc4\x0c\xcc\xc4\xa8\x31\x9c\x7d\x51\xaf\x79\xcf\xe0\x2a\x3f\xad\xee\xf0\x42\x0e\xd0\x25\x99\x13\x31\x40\x17\x93\x4b\xae\x46\xc6\x57\x13\xf7\xde\x30\xb3\xcc\xbc\x1c\xd1\x09\xfa\xb6\xc2\x8a\x48\x85\x14\x9e\x82\xe7\xb0\x63\x63\xe6\xa2\xd7\x68\x57\x4c\x77\x8b\x2e\xb4\x0c\x14\xcd\xd0\xba\x27\x68\x7e\x72\x12\xd4\xca\x91\x1e\x6e\x8d\xc0\xcb\x70\x2d\x1a\xee\x35\x43\x1d\xe8\xc5\x89\x21\x50\x77\xa5\x42\xc1\x73\x4a\x19\x12\x44\x36\x9c\x49\xd2\xe3\xda\xec\x06\x62\x3c\xd1\x91\xc8\xea\x8c\x8e\xd5\x68\xc3\x20\xd5\x24\x68\xb8\x54\x40\x49\x19\xab\x9f\xe4\xb2\x05\x46\xae\x23\xc0\x52\x8a\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x13\x45\x04\xc2\xfd\x58\x81\x2d\x26\x71\x6c\xaa\xe1\xb8\x02\xf4\x8e\xf7\x34\xde\x58\x5b\x8e\x49\x28\x22\x6a\xca\xb0\x2d\xb8\xed\xc8\x4d\x43\x96\xd4\x25\xde\xd3\x24\x21\xaa\x9f\xf7\xa0\xd9\x05\xdb\x7b\x19\x47\x8b\xc6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\x5c\xc0\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x7f\x0e\xfd\x01\x1b\xea\x5e\xc9\x93\xdf\x75\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x3d\x29\x52\xf4\xf9\x7e\x4c\xe3\x9e\x14\xfe\xea\x92\xb0\xc3\x81\xf5\x46\xef\x28\xcb\x74\x95\x29\x14\x68\x9e\x4c\x90\xa8\x5c\x30\xa4\x04\x86\xb1\xf0\xc9\x8d\xb2\x39\xb3\x8b\x40\xa5\x9d\x79\xf3\xcf\x8a\x32\xd2\x5f\x18\x4f\xd6\xef\x17\xc7\x44\x17\x57\xaa\xe8\xba\xdc\xf1\xe4\xae\xb9\xbe\xe8\xbe\x41\x19\x99\xc3\x83\x93\x83\xa3\x95\x3d\x72\x60\x0a\x5c\x9a\x6b\xf1\xd8\xf2\x9c\xf9\x41\x49\x5a\x37\x50\xd5\x99\x14\x07\xae\x08\x7d\x72\xcf\xf4\x6d\x68\x8a\x26\xc1\xac\x58\x5e\xb6\x01\x92\x1c\x29\x81\x4b\x6a\x0d\x04\xf8\x54\xff\x48\x89\xd6\x5e\xe8\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\xc1\xf4\x1d\xa3\x1b\xa8\x84\x91\x8e\xb4\x75\x1d\x59\xf0\x16\xea\x2d\x99\x25\x6c\x2a\x5a\x50\x55\x2d\xe0\xba\x41\xbc\x35\x95\xa1\xb4\x6a\x91\xc0\x27\x17\x3e\xe7\xf7\x54\xd9\x14\x2e\x2d\xbf\x5f\x2e\x15\xfa\xaf\xe8\x9c\x9c\xcc\x08\xae\xd4\xcc\x24\x18\x30\xce\x86\xff\x26\x82\x03\xe7\x1c\xb3\xdf\xa4\x76\x23\x2d\x72\x1b\x3e\x09\x51\xdc\xd5\x0e\x65\xc1\x16\x65\x76\x06\xb8\x47\x5f\x7b\x6f\x48\xb4\x4a\x84\x56\xca\xa0\xde\xdc\x8c\xde\x10\x15\x4a\x79\x06\x1f\xa2\x37\xe7\x37\x2e\xad\x04\x9c\xf1\x44\x4c\xb8\xa8\x77\x40\xbc\xe7\xc1\xbb\x0e\xa1\x16\xe1\x0e\xdc\x32\x33\x2e\x93\x96\x13\x3d\xc2\x15\x63\x2a\x47\xe2\xda\xd9\x26\x8c\x14\x7a\x13\xf4\x73\x24\x1c\x75\xff\xc5\xe8\x18\xfd\x93\xb7\x40\x1b\x8f\xc7\xd5\xc2\xb3\x4e\x4b\x92\x06\x6c\xd6\xcf\x0b\xdd\x95\x17\xfa\x06\xd1\x3b\xff\x07\x82\x4b\x22\x24\x08\x68\x82\x13\x53\x98\x32\x1e\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x66\x87\xdd\xe7\xa3\xb3\x87\xf3\xd8\x1c\x57\x4b\x4a\x24\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x48\x2f\x33\xef\xf6\xf3\xb1\x51\x53\xc3\x69\xb3\x01\x0e\x43\x77\x63\x65\x9b\xa9\x70\x90\xe9\xba\xc8\x00\xe1\x47\x19\x61\xfc\x28\x8d\xa9\x6e\xf9\x45\x10\xec\x49\x7e\x53\xbe\xcc\x00\x94\x0d\xfd\x8e\x1e\x05\x01\x8f\x2c\xb0\xd1\x6e\x3e\xe3\x83\x8e\xf7\x9e\xaf\x7b\x39\xed\x8a\xb8\x15\x98\x71\x46\x0b\x5c\xd1\x7f\x93\x12\xb5\x0d\x67\x36\xdd\x0d\x34\xdb\x02\x4b\x32\x84\xe8\x38\x33\xe2\x5c\x06\x9c\x69\x5a\x3a\x28\xce\x41\xdd\xf3\x15\xbd\x4c\xaf\xf3\x74\x35\x2b\x50\x3b\x99\x00\x30\x7c\x56\x02\xea\xbd\xc5\xca\xb3\xe3\xd1\xb3\x50\x27\x91\xc9\x53\x4c\xce\x91\x5f\xcd\x90\x37\x45\x5d\x80\x15\xce\x5c\x57\x20\x78\x4d\x7d\xcf\x9d\xb9\xb7\xb5\x0a\xb8\x6b\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4c\x44\x47\x2f\x22\xd4\xea\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xa6\x04\xbd\xd2\x2d\xff\xe5\xcf\x7f\xfe\xe3\x9f\x33\xb4\xa3\x87\xe7\x81\xdd\x0c\x5d\x9c\x5e\x9e\xfe\x7c\xfd\xf1\x0c\x48\x0b\x53\x5f\x9f\x29\x6f\x35\x77\xd6\x6a\xd6\x9c\xd5\x47\xcd\x58\x05\xfa\x8f\x64\x29\x9b\xfb\x48\x5c\x43\xaf\xc2\xf2\xa9\xd6\x26\x09\xea\xa1\xc5\x94\x27\x5e\x7d\xc2\x60\x9e\x16\x58\x3b\x21\xa9\x64\x45\x48\x93\xcd\xe2\xbf\xd6\x6f\xeb\x71\x37\xa3\xb2\x15\xb6\x70\xa8\x0b\x5e\x75\xbe\x7c\x1b\xb4\x82\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x82\x06\x78\xdb\x5f\xfe\x14\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x32\x9d\xd3\x2b\x73\xf9\xfe\xa6\x63\x63\x81\xec\xa3\xae\x74\xdf\x0f\x36\x5a\x88\x59\x89\x6e\x49\x93\x66\x5d\x6a\x81\xe9\x60\x84\x7d\x14\x21\xf8\xde\x85\x65\x7f\x35\x19\xcf\x46\x10\x38\xf4\x9f\xd1\x88\xd3\x78\xa4\x83\xe0\x3c\x04\x02\xad\x11\x32\xc1\xb4\x42\x18\xbc\xf2\x8a\xd6\xc4\xa4\x5c\x81\xb3\xbf\x43\x4b\x7c\x45\x02\xe7\x6b\xf5\x36\x1e\x38\xd8\xf6\xb7\x1b\x7b\x0d\x53\x89\x2a\xbe\x6e\x33\xc0\xca\x6c\x81\xc2\x92\xff\x7b\x33\xe0\x4b\x9e\xbd\x19\x10\x69\x06\x34\x82\x5c\x2b\x1e\xad\x6b\x66\x03\xdc\x98\x6e\x3c\x00\xb7\x19\x93\x09\x17\x64\x19\x6f\x13\xe0\x60\x2c\x72\x3e\x01\x19\x7c\x3a\xba\xf0\xb1\x2f\xde\xc3\xba\x98\xf4\x60\xd9\x16\x33\x17\x26\x65\x44\xca\x13\x19\x96\xce\x85\xab\xad\x15\x24\x1e\xe5\xd3\x08\x42\x6a\x98\xc7\x41\x47\xf0\xa3\x87\x4b\x98\xf9\x90\xa8\xc2\xc4\xcd\x1d\xac\xc8\xf2\xb7\xbb\xe9\x9a\x24\x85\xf3\xbb\x89\x2d\x04\x96\x33\x02\x29\xaa\xe4\x9e\x2a\x69\x1a\x1d\x01\x0d\x8e\x9b\x71\xad\x2f\x4c\x05\x2e\x08\x6a\x88\xa0\x5c\xab\x18\x2d\x53\x25\xbf\x63\x68\x4c\xa6\x94\x49\xb7\x62\x29\x5d\x72\x5b\x02\x90\x44\x54\xfa\x42\x6b\xc7\xe8\xaa\x57\x7f\xc0\x12\x7e\x15\xbc\x93\x99\x76\x8a\x06\x99\xa6\x04\x94\x17\xd8\x06\x2d\xae\xaa\x45\xb7\xf1\x5c\xfa\xba\x7a\x78\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\x85\x49\xd4\x9e\x50\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\x83\x3b\x83\x4a\x24\x08\x2e\x66\x29\x9a\xdd\x1e\x03\xf6\xb9\x67\x8f\x01\xdb\x63\xc0\xf6\x18\xb0\xd5\x67\x8f\x01\xeb\x3f\x7b\x0c\xd8\xc3\x1d\xda\xe5\xa0\xdd\x1e\x03\xb6\xf7\xca\xac\x3e\x7b\x0c\x58\xd4\xb3\xc7\x80\x7d\xf6\xd9\x39\x11\xbd\xc7\x80\x7d\xc1\xb3\xc7\x80\x7d\xe1\xb3\xc7\x80\xed\x31\x60\x7b\x0c\xd8\x1e\x03\x96\xf0\xec\x31\x60\x9b\x0f\x6f\x1f\xfc\x89\x7f\xf6\x18\xb0\x3d\x06\x6c\xc3\x67\x8f\x01\x5b\x7a\xf6\x18\xb0\x3d\x06\xec\x53\xcf\x1e\x03\xb6\xc7\x80\xd9\x67\xef\x6d\x5c\x79\xf6\x18\xb0\x35\xcf\x1e\x03\xb6\x59\x3b\x7b\x33\x20\xed\x65\x8f\x62\x06\x48\xc5\x9b\x6b\x3a\x4d\xe0\x85\xcc\x75\x0c\xae\x7d\x4f\x2c\x69\xa4\x44\x77\x33\x5a\xcc\x90\x34\x1f\x3a\x3f\x96\xb4\x94\x7d\x21\x22\x2c\xb8\x49\xc6\x44\x9b\x08\x7a\x58\x4d\xca\x6d\x72\x31\x81\x00\x72\xc0\xe4\xa6\x4f\x85\xa3\x09\xa4\xbd\xea\x09\x7d\xf5\xd9\xdd\x6e\x94\x69\xdb\x25\xbe\x07\xc1\x7c\x14\x98\x99\x62\xa5\x30\x7c\x28\x6e\x88\x46\xbc\x94\xae\x60\x03\xe3\x6c\x68\xc8\x5a\x8f\xa1\xba\x33\x97\xc7\x09\xde\xe0\x44\x66\x36\x83\x91\x1b\x09\x3e\xde\x1a\x3b\xdb\x08\xf0\x47\xb4\xb0\x00\x3d\x3e\xe9\x31\xae\x99\x0e\x46\x32\xad\xf5\x81\x61\x50\x50\xc4\x51\x70\x51\x2b\xb0\x3d\x28\x70\x9b\x6c\x6e\x1b\x23\xa7\x1c\x4b\xa5\x3c\x69\xb8\xf9\x9f\x0e\x37\x15\x00\xa6\xa2\xe3\x28\x5b\xa6\x97\x4b\x41\x49\x6d\x0d\x21\xb5\x23\x08\xb3\x0c\xa8\xa8\x9c\xba\xd2\x8e\xa2\xa1\x76\x13\x09\xb5\x8b\x28\xa8\x6d\x20\xa0\xb6\x8e\x7e\xca\x13\x56\xcf\x10\x52\xcf\xa4\x91\x3e\x42\x78\xca\x02\xe9\x6f\x66\x82\xc8\x19\xaf\xa2\x05\x4e\x2e\x61\xf3\x8e\x32\x5a\xb7\xb5\x3e\xbb\x52\xcb\x14\x3a\xf7\x60\x7f\xe9\x44\x86\xbd\xee\x0d\xe2\x40\xff\x90\x96\x04\x2a\x73\x63\x5a\xe9\xad\x05\x64\xa1\x33\x3c\x07\xa5\xb4\x2d\x0a\x42\xca\x14\xb5\x34\xf4\x56\xff\xf1\xd8\xf7\xd0\x70\xf4\x53\x89\x5e\xa5\x5d\x35\x69\x76\x4f\xe0\xce\xfb\xe3\x1f\xa2\xde\x31\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\xca\x42\x69\xb6\x77\x33\xa7\xbb\x99\x92\x5c\x4c\x39\x14\x83\x54\x2f\x4a\x3f\x86\xcc\x85\x5a\x0a\x81\x4e\x61\x15\x89\x98\xd3\x82\x1c\x3f\x81\xa3\x22\x97\xf1\x9f\x7e\x10\x10\x84\x09\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xf8\x08\x43\xe0\xa3\xb2\x3d\x05\xd0\x68\x85\x0b\xbf\x36\xd3\xf5\x87\x2e\xa9\x1b\x87\x92\x10\x6f\xd0\x4c\xa9\x9a\xb5\xe3\xe3\x82\xd7\x27\x5a\x74\x98\xff\x19\x57\x7c\x7c\x52\x63\xa9\x88\xd0\x36\x8e\xbd\xd6\x87\x85\xee\x01\x65\xd3\xe3\xba\x3c\x3a\xfe\x3f\x49\x7d\xb8\xb0\xbe\x72\x9b\x86\xf5\x80\x93\x60\x4c\xb4\xdc\xe7\x62\xc9\x5b\xa0\x27\x25\x7d\x93\x26\xdf\xdf\xa9\x45\x45\x12\x61\xc9\x5b\x81\x24\xef\xa5\x36\xca\x10\x10\xc8\x29\x54\x76\x03\x76\xfc\x68\x90\xe3\x2c\x67\x35\x13\xd4\x78\x87\x60\xc6\x3b\x63\x0b\xed\x0a\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xd1\xa0\xc3\xcf\x02\x36\x9c\x31\x3e\x96\x09\x2e\xfc\x14\x50\xe1\xdd\xf5\xc1\xa0\x0c\xf0\xe0\xa7\x83\x06\x67\x99\xc7\xac\x56\x6c\xa2\x48\xd8\x02\x14\xf8\x29\xe2\xff\x8f\x16\xfb\xcf\x10\xf7\xcf\x19\xf3\xcf\x16\xef\x7f\x34\xc8\x6f\x3a\xdc\x37\xab\x4f\xe1\x49\x60\xbe\x39\x21\xbe\xc9\xeb\x4b\x19\x55\x14\x57\xaf\x49\x85\x17\xd7\x69\x40\xd0\x5c\x2b\x71\xb9\x02\x16\x35\x6e\xeb\x3e\xae\x61\x86\x25\x72\xa1\x6e\x4b\xf1\xe2\x62\xe9\x56\x05\x46\x18\x22\xce\x7a\x7c\xd1\x51\x6b\xb4\x7b\x91\x6b\xb4\x33\xee\x71\xc3\xab\xb2\x23\xbb\xe6\x07\x7e\x87\xf8\x44\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\x77\x3a\xf2\x65\xfb\xf8\xf9\xd0\x97\xfd\xe1\xa4\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\xd5\x55\x7f\x7f\x05\xfd\xf1\xa2\x08\xb3\x12\x59\x7e\xae\xaf\x6f\x9f\x24\x43\xdd\xfb\xc6\x8d\xc7\xa6\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\xff\x0a\x14\xd0\xbd\xd3\x75\x67\x9c\xae\x5b\x42\x60\x7f\x7d\xd6\xd6\xd3\x23\xae\xf7\xd6\xd6\x6f\xc5\xda\x0a\x68\xf1\xde\x08\x5c\x90\xd1\x2e\x29\x6f\x4e\x80\x74\x89\x80\x9d\x0e\xe7\xc5\x05\x23\xc4\x24\x8e\x75\xa4\x87\xc0\xef\x37\x69\xab\x6a\x61\x7c\x88\x3d\x06\xcc\xf8\xad\x75\x33\x23\x2b\xd4\x81\x10\x4a\x5d\xd3\xbb\xce\x36\x69\x04\xb7\x1a\x89\x68\x19\xd3\x2a\x86\x3d\x4e\xba\xf3\xda\x16\x91\x84\xc5\xbb\xd3\x71\x8f\xd8\xd0\x82\xd0\x01\xe8\x39\x23\xa8\xcb\x5f\xea\x77\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x92\x05\x69\xdf\xd2\xaa\xb2\xaf\x49\x00\x85\x13\x65\x42\xcf\x46\xa3\xa9\x38\x9b\xc2\x64\x60\xd3\x11\x72\xdf\x90\x42\xb7\x59\x54\x04\xb3\xb6\x31\xfd\xd4\xfa\xd1\x82\xb7\xc2\xf5\x33\x09\x15\x1f\xb4\x4e\x25\x62\xb4\x1a\xb8\x29\xef\x53\x60\xae\xee\xf9\xce\xa5\x2c\x49\x69\xd9\x2b\xef\xa8\x24\x03\x78\x67\x74\x9f\x4c\x5f\x5c\xd5\x7e\xb3\x6f\xcc\x67\x8d\xe0\x73\x5a\x76\x18\x7d\xbd\x2d\x00\x1f\x1f\xdd\xd6\x47\x78\xaf\x13\xad\x8c\xb3\x21\x23\x53\x0c\xea\xb1\x15\x68\x06\xd1\x69\xda\x37\xf8\x41\x56\xd2\x02\x2b\x22\x21\x27\xa1\x47\x6d\x3b\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x99\x85\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x39\xd0\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\xf8\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\x78\xd5\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\x73\x27\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\x79\xc0\x4f\xe0\xe0\x56\x26\x83\xfa\xf5\xe5\xf5\xcf\x6f\x4f\xff\xeb\xfc\x6d\xdc\xc2\x9f\xe3\x62\x16\x72\x8b\x33\x84\xe1\xa2\x00\x21\x3f\xc3\x73\x82\x30\x6a\x19\xfd\xa5\xb5\x90\xb7\x43\xdf\x5e\xa4\x58\xcd\x92\xde\x93\xa4\xf8\xea\x5b\x22\x4a\x72\xe4\x58\xd3\xb7\x54\x02\x51\x35\x74\xc2\x02\xff\xb9\x24\x68\x22\x78\xbd\x64\x68\xa1\x4b\x0f\xae\x5b\xe8\x1b\x06\x1b\xd3\x6c\x46\x44\x9c\x46\xfe\xfa\xfd\xf9\x35\xe4\xe0\x37\xc2\x10\xbb\x43\x72\x01\xbc\x13\x5a\x37\xa9\x83\xa6\x3f\xe5\x31\x3a\x65\x0b\xf3\xa5\x11\x66\x91\x2a\x4a\x45\xa5\x22\xa0\x9c\x5a\x43\xd2\xc1\x03\x5f\xbc\x3c\x86\xff\x7b\x81\x70\x59\x0a\x6d\x69\xfa\x1c\x8d\x62\x39\xcb\x2c\xaa\x65\x63\xbf\xd2\x71\x15\x4c\x2e\x23\x0a\xd2\x38\xa2\x5e\xf8\x8e\x97\x76\x25\x40\x09\x04\xfc\x8e\xd1\x6e\xa5\x12\x58\x91\x29\x2d\x50\x4d\xc4\x94\xa0\x06\xab\x62\x86\x6a\xbc\x40\x05\x17\xa2\x6d\x0c\xc5\x48\x89\x15\x8e\x6b\xf9\x7b\x2e\x50\xed\xa4\xb3\x96\x66\x5a\x25\xbf\x5e\x0f\x04\xed\x44\x76\xf8\x9f\x54\xca\x96\xc8\x93\x57\x2f\xff\xfa\x87\x3f\x47\x9a\xd7\x19\x0f\x6e\x2c\xf4\x29\x01\xf2\xd4\x87\x7f\xb9\x0d\x06\xa0\xeb\x1e\x33\x8c\xdd\x21\x66\xe7\x83\x34\x94\x94\x4d\xab\x64\x07\x48\xb2\x1b\x30\xd5\x09\x38\xec\x46\x30\x8a\xf5\x05\xa6\x7b\x02\x7b\x7d\x88\x77\xa5\xe4\xf3\x82\x75\x1a\x9c\xf3\x7b\x59\x81\xcc\x59\x60\xd8\x5d\x8c\x9c\x94\x4a\xf1\x1f\x81\x35\xe1\x1d\x53\x86\x7d\xc4\x34\x6b\xf0\x0e\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x5e\xb0\xbf\xc4\x37\x95\xc7\xc7\x94\x03\xc6\x3f\xe3\x52\x5d\x8c\x32\x2d\xf4\x3f\xf4\x7d\xa5\xdf\xa8\xd7\x43\x71\x34\xa6\xd6\x1d\x41\xee\x15\x11\xda\x0c\xb4\x6b\x98\x3a\x73\x49\x1e\x35\xdd\xc1\xe7\xb2\xbb\x53\xc1\x05\x17\x93\x3e\xfa\xff\x89\xf6\x37\x34\xfc\x03\x97\xea\xd2\x4a\xeb\x90\x42\x27\xec\x47\x0d\x17\x71\x4f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xae\xc6\x06\x2a\x39\x24\x40\x98\x1c\xce\x19\x4d\x10\x0e\xbb\x73\x62\xd3\x70\xa2\xf9\xb6\xee\xa7\xb6\xd6\x92\x4f\x1f\x3c\x32\xd6\x48\x09\xca\xd2\x34\xbc\x3c\x06\xfb\x26\xa1\x17\x7a\x36\xca\x40\x19\xf8\x84\x69\x74\x6c\xec\x35\x1f\x1d\x86\x03\xa7\x25\x56\x81\x59\xac\x0e\x6b\x1e\x41\x26\x44\x08\x93\x27\x3c\x5e\xb8\x74\xa3\xe4\xdd\x96\x24\xe5\x1a\xc1\x15\x2f\x78\x34\x6d\x4a\xce\xad\x32\xb2\x7d\x81\xb9\x87\x58\xad\x8f\x8e\x7f\x78\x3d\x1a\xa0\x9b\xb3\xd1\x00\x71\x81\xae\xcf\xd2\xc0\x4f\xa1\x0b\xe6\xc5\xcd\xd9\xe8\xc5\x56\x57\x20\xc8\x61\xba\x39\x1b\x45\xbc\x64\x15\x3e\x5b\xe3\x66\x78\x4b\x16\x91\xda\x5d\x0e\x0d\x73\xe8\x37\x56\x96\x01\x99\x69\xae\x71\xb3\xf1\xdb\x04\xc1\x25\xdd\x69\x26\x17\x97\x75\xe8\x7b\x9a\x8f\xd2\xa5\xe6\x73\x52\x1a\xab\xd9\xb5\x42\x58\xd9\x70\xaa\x6d\xa4\x3d\xcf\xcb\xa7\x9e\x3d\xcf\xcb\xe6\xcf\x9e\xe7\x65\xdd\xb3\xe7\x79\xd9\xe0\xd9\xf3\xbc\x98\x67\xcf\xf3\xd2\xef\xc8\x2e\xe6\x18\xed\x79\x5e\x3e\xfb\xec\x79\x5e\x1e\x7c\xf6\x3c\x2f\x1b\x3d\x7b\x9e\x97\xd5\x67\xcf\xf3\xf2\x89\x67\xcf\xf3\xe2\x9f\x3d\xcf\xcb\x9e\xe7\xe5\xf9\x4a\xed\x3d\xcf\xcb\xf2\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\xc2\x67\xcf\xf3\xf2\xc0\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\x3e\xfd\xec\x79\x5e\xa2\x9f\x3d\xcf\xcb\x66\xcf\x3e\xf3\x70\xc3\x67\xcf\xf3\xb2\xe7\x79\x59\x7e\xf6\x3c\x2f\x9f\x7d\x76\xc3\x3d\xbe\xe7\x79\xd9\xf3\xbc\x7c\xf2\xd9\xf3\xbc\xec\x79\x5e\x3e\xf9\xec\x79\x5e\x22\x9e\x9d\x73\xba\xee\x79\x5e\xf6\x3c\x2f\x9f\x6a\x63\x6f\x6d\x6d\xf6\xec\x79\x5e\xf6\x3c\x2f\x2b\xcf\x9e\xe7\x65\xf5\xd9\xf3\xbc\xec\x79\x5e\xf6\x3c\x2f\x7b\x9e\x17\xff\xec\x79\x5e\xbe\x76\xbf\x93\x20\x92\xfe\x9b\x8c\x78\x45\x8b\x45\x72\xb6\xcf\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x63\x14\x0a\x57\xc1\xc4\x85\x54\x0a\xc2\xce\xc1\x63\x4c\xc1\x4e\xd0\x29\xb8\x01\x5e\xc6\x23\x08\x86\xae\x7c\xb6\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\xd2\x39\x43\xda\x23\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x31\x16\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x63\xa9\xf2\x6b\x45\x9d\x38\x4c\xc2\x9a\x5d\x4c\x96\xc1\xa8\x54\xf5\xbc\x40\x97\x5c\x5d\xd9\xc3\xbd\xb5\xf5\xca\x8c\x58\x70\x53\xb8\x35\xd6\xaa\x33\x5e\x37\xad\x22\xbd\x8b\xcd\x4c\xb1\x31\x3a\xa8\x4c\x15\xe8\xdb\xc9\x06\x2d\x38\x9b\xd0\xa9\xb5\xbe\x4f\x6a\xcc\xf0\x94\x0c\xfd\x6c\x0f\x3b\xaa\x87\x93\xe8\x8b\x7a\x6b\xa9\xa0\x45\x85\x69\x3c\x70\x30\x97\x98\x38\x83\x5e\x00\x0d\x58\x07\xa8\x87\xdc\x34\x3f\xcd\x03\x0f\x1b\xa7\x46\x6e\x1c\xbb\xaf\xcc\x1f\x0f\x12\xac\x47\xac\xc0\x57\x01\x86\xd1\x9a\x9d\x9a\x6e\x30\x32\x84\xab\x66\xf6\x69\x93\x31\x25\xe5\xf2\xf5\x82\xe1\x9a\x16\xee\xe0\x9d\x56\x15\x2f\x8c\xab\xa6\x6f\x6c\xa6\x8d\xc4\xf4\x5e\x0f\xa9\xae\x5b\x85\xc7\x15\x39\x46\x17\x86\xb9\x82\xb3\x6a\xa1\x8f\xa5\x24\xca\x21\x17\xec\x99\x48\x33\x30\x53\x60\xb1\x89\x90\xd8\xb5\xba\x3a\xec\x35\x43\xb5\x41\x98\x96\x70\x9c\x11\x44\x98\x12\x0b\xbd\x2d\x47\xbc\xbc\xd6\x3b\xb3\xf7\xeb\x64\x06\x8e\x44\x24\x6c\x0e\x14\x6c\x22\x02\x36\x0f\x6e\x35\x1d\xb3\x9a\x17\xaf\xda\x45\x16\x0c\x81\x50\x98\x08\xd4\xdb\x16\x0d\x2f\x8f\xd7\x48\x2c\xc4\x27\x89\x3d\xd0\x2d\x8e\x78\xa9\x75\x29\x41\x8c\xd8\xf2\x67\xd4\xf8\x15\x2f\x74\xe7\x6e\xc1\x11\x88\x55\xa7\x64\xe1\x39\xa6\x95\x3e\xc0\x89\x1d\x58\x25\x63\x4c\x0b\xd6\x64\x0a\x61\x58\xcc\xfe\x2e\x6d\x16\x9b\xed\xd5\x4b\x18\x2b\x66\x5c\x12\x06\xf2\x12\xfb\xc4\x1e\x9f\x76\x60\x45\x4c\x69\xae\xe8\x54\x70\xf1\xc5\x04\x91\xba\x51\x8b\x01\x22\x73\x22\x16\x6a\x06\x20\x04\x4f\x27\x0a\x62\x8d\x4a\x54\xe3\x32\xd8\x1d\x03\xc4\x9d\x5f\x3a\xb1\x79\xb8\x1f\xac\xa9\xd6\x56\xca\x18\x6e\x54\xfa\xec\x8a\x6d\xef\x9a\xdc\x2c\x37\x28\x55\x68\xe6\x64\xa9\x41\xc0\xb0\x5a\xd3\x38\x3e\x5b\x94\xf1\x2c\xbc\x85\x5e\x04\x19\x25\x7a\x4b\xd4\xf8\x1e\xbc\x96\xb8\xe6\x2d\x53\x86\xbe\xc6\x18\x12\x5e\xf9\x33\x79\x37\x4f\x08\xa3\x7b\x54\x95\x1f\xe5\xb9\xda\x71\xe9\x18\x2b\x46\x39\xd2\x97\xb1\x52\x44\xb0\x6f\xd1\x7f\x1f\xfe\xeb\x9b\x5f\x87\x47\xdf\x1d\x1e\xfe\xf8\x72\xf8\xb7\x9f\xbe\x39\xfc\xd7\x31\xfc\xc7\x7f\x1c\x7d\x77\xf4\xab\xfb\xc7\x37\x47\x47\x87\x87\x3f\xfe\xfd\xdd\x9b\x9b\xd1\xf9\x4f\xf4\xe8\xd7\x1f\x59\x5b\xdf\x9a\x7f\xfd\x7a\xf8\x23\x39\xff\xe9\x0b\x5f\x72\x74\xf4\xdd\xef\xe3\x83\x92\xa9\x11\xf8\x7c\xf1\xf7\x4c\xd1\xf7\x47\x89\xbd\x5b\x19\xbb\xf5\xc3\x6f\xaf\xc0\x95\xe3\x6f\x83\x16\x9f\x3a\xfe\x22\xd9\x55\x73\x31\xe9\xda\xa7\x12\xf1\x9a\x2a\x45\x4a\x7b\xf7\x06\x94\x38\x4b\x6e\x22\x2b\xb0\x80\xcd\x0a\xc3\xed\x1d\x50\xb3\x74\xde\xa5\xe8\x6e\xf9\xfb\x15\x1c\x63\x0c\xd1\xba\xa9\x48\x4d\x98\x02\xc1\x33\x74\x26\x2f\x78\x19\x8f\xbb\x11\x14\xc6\x0f\x42\xee\x0b\x42\x4a\xdb\xc9\xbd\x6c\x0c\x9e\xbd\x6c\xdc\xcb\xc6\xcf\x3d\xc9\xae\xf2\x1c\x82\xf1\x2a\xec\x84\x75\x71\x49\xa7\x29\x83\xe3\xdc\x33\x27\xf0\x09\xe0\x27\xe6\xb4\x6c\x71\x15\x12\xcc\x3a\xce\xd1\x38\x09\x10\xb8\x76\x6a\xbc\x58\xf1\xe4\x50\x46\x43\x36\xdb\x81\x47\xfd\xc0\x0f\xad\x5e\xd6\x45\x9c\x5f\x9c\x56\x77\x78\x21\x23\x49\x2f\xbf\xe7\x02\x80\x24\x4b\x8d\x22\x2e\x1c\xbe\x28\x34\x71\xfb\x1e\xfe\xb8\x08\xe1\xba\x89\xee\x53\x54\x58\x23\xfb\x40\xfa\x1f\xba\x38\x92\x9d\x88\x2e\x2b\x44\xef\xf3\xb8\x81\x5f\x13\xa5\xac\x13\x70\x69\x4b\xe0\x6e\x4e\x7d\x58\xb4\x3f\x3d\x06\x4a\x04\x54\xb3\xfa\xcb\x09\xd7\x6b\x02\x45\x1a\x26\x13\x52\x44\x5a\xc1\x86\xd2\x63\x4d\x3b\x06\xde\xae\x28\x6b\x71\x55\x2d\xdc\x9c\x90\x12\x71\x16\xd5\x10\xb9\xa7\x0a\xb5\x4c\xd1\x4a\x6f\x26\x24\xc8\xb4\xad\x70\xe8\x40\xb4\x23\x73\xa8\xbb\xf2\x18\xbd\x67\x05\x09\x7f\x1c\xe7\xf8\x5e\x6a\x40\x2b\x1d\x15\x51\xa4\x1c\xc0\xab\x97\x77\x20\xe0\xd6\x7a\x12\xc3\x2f\x4b\x54\xf3\x6e\x2e\x3d\x2e\xe9\xd8\x1c\x44\x0f\x9a\x40\x25\x9d\x4c\x74\xcb\x60\xa4\x33\x2e\x6a\xbc\xda\x2b\xcc\xca\xa8\xd6\xb5\x06\x04\xd9\x2a\x21\x69\x30\x14\x8a\x79\x21\x69\x49\x0a\x2c\x5e\x84\x25\x46\x4e\x2b\x35\xe3\xed\x74\xd6\xed\x8a\xb4\x29\x47\x52\x01\x5a\x4b\x4f\xa6\x74\x1e\x8f\xa5\xcd\x26\xb5\xae\xc3\x0a\x62\x54\x32\x4e\xcc\x71\xbf\xc3\x91\x6d\xaf\x20\x0a\x0c\x44\xdc\xac\xb9\x4b\xe1\x02\x48\x20\x29\x83\x7c\x3b\x46\xee\x55\x86\x01\x1f\xa3\x0b\xc3\x9f\x31\xe8\xbf\xb5\x37\x25\x66\x32\x02\x48\x9c\x03\x77\x46\xe2\x01\x97\x1a\xa0\x3e\x63\x0d\x68\x8e\xcd\xcb\x31\x5b\xb8\x04\x11\x80\xac\x99\xc4\x36\x9f\xb3\x52\xc5\xf9\xde\xfd\x59\x7a\xf2\xaa\x3d\x92\x14\xad\xa0\x6a\x71\xc6\x99\x22\xf7\x51\xb2\x2f\xc7\xad\x7e\xdd\xef\x46\xef\x5e\x77\x5d\x44\xbc\x31\xdc\x92\x4b\x85\x9b\x66\xbc\xad\x4a\x60\xd8\x6d\x19\x88\x9d\xb8\x1b\xe5\x62\xa2\xaf\x70\xb3\xdf\xe0\xc6\x84\x70\xda\x72\xc7\x1c\x52\xd4\x00\x66\x7f\x69\xe9\x1c\x57\x84\xa9\xe0\x2f\x46\x80\x1d\x0c\xff\xe8\x31\x63\xae\x0a\xcb\xdb\xce\xc2\x20\xc3\x86\x97\x9d\x41\x71\xe2\xa6\x0e\x3e\x22\xf7\xea\x19\xc6\x5b\x41\x61\x1a\x09\x3a\xa7\x15\x99\x92\x73\x59\xe0\x0a\xec\xa8\x6d\x1b\xe7\xa7\x0f\xf4\x0b\x76\xa6\xe0\x95\xd4\x0a\x98\x36\x56\xb5\xaa\x69\x90\xd3\x10\xf8\x9b\x62\xca\xa0\xea\x50\x42\x70\xc8\x36\x2a\x0d\x74\x5b\xdb\xdb\x0d\x16\x7a\x17\x3a\x88\xb6\xb9\x1a\xc7\x9c\x57\x96\xa6\xb6\x5a\x74\xfd\xa2\xf1\x51\x14\x90\xc5\xfc\x67\x46\xee\x7e\xd6\xbd\x90\x68\x52\xe1\x69\x77\x35\x13\xb5\x92\xef\x92\x8e\x1a\x7f\x70\xa2\x81\x83\xb5\xd5\x8a\x8d\xd6\x2a\x3a\x3c\x7d\x28\xc1\xe3\x0d\xba\x57\x47\x20\x4f\xb0\x44\xbe\xed\x38\xd5\x41\x3f\x7f\x38\x82\x7b\xe2\xec\x74\xf4\xf3\xf5\x3f\xaf\x7f\x3e\x7d\xfd\xee\xe2\x32\x1e\x35\xcb\x15\x31\xde\x95\x40\xbb\x2f\x3c\xd0\x43\xaf\x82\xc7\x0a\x1d\x73\x79\x0c\xa1\x13\x20\x73\x61\x25\xbf\x4b\x8c\x2f\xeb\x3d\x45\x70\x9c\xe6\x8a\x9b\xe6\x54\xd4\x5c\x8c\x04\x9f\xd0\x2a\x3a\x34\x99\xeb\x04\x2f\x75\xc7\x45\x9a\x4e\xed\xc7\xdd\x75\x63\xf8\x05\x56\x71\x0e\xc1\x95\x41\x21\x8b\x5d\xbf\x26\xde\xb3\xd5\xcb\x41\x30\x19\x11\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\xcf\xde\xd4\xdd\x88\xfc\xf3\x1c\x91\xf8\x8a\x17\xb8\x82\xfa\x45\x69\x1b\x1f\x65\x0e\xb2\x2e\xf7\x2b\xc8\x36\xc1\x6e\x3b\xa3\x8a\xe3\x12\x8c\x55\x2b\xfc\x4b\xe2\x58\xb5\x9d\xda\x05\x81\xf3\xa4\x8e\xdc\x18\xa4\x3f\xb4\xe7\xd2\x63\x1a\x41\xbc\x56\xb3\xd4\x3c\x47\xf1\xd5\x06\xdd\xf3\xae\x0f\x43\xb0\xa3\xec\x25\x72\xa6\x9e\x39\xdf\x8c\x3d\x60\x74\x02\x1e\x10\x70\x03\xd1\x09\x6c\x4a\x70\x00\xbd\x75\xcb\x90\x50\xf8\x24\x13\x12\x00\x5e\xb2\x23\xbb\xd3\xcc\x8f\xdf\x91\x06\xa6\x7c\x4b\xf5\x0c\x4e\x3a\x21\xed\xb6\x8d\xd3\x41\x0c\x56\x39\x71\x3f\x7e\x84\x12\x5b\x4e\xfe\x63\x91\xcc\x0b\xe6\x97\x18\x0d\x83\xa3\xd5\x08\x32\x5c\x3d\x5e\xa9\xc0\x85\xab\x96\x29\x5a\x13\xc7\x7d\x31\x5c\xd2\x89\x84\xf9\xfa\x40\x7a\xa6\xd9\x2c\x1b\x1d\xa1\x0f\x0c\xce\x2b\x23\x25\x1a\x22\xc6\xbb\x25\x22\x6c\xc2\x45\x01\x41\x9a\xad\x6e\xf0\x02\x37\x78\x4c\x2b\x9a\x22\xcc\x73\x6d\x70\x28\xdc\x10\xf4\x07\xdc\x49\x65\x79\x52\x0a\xde\x98\x9b\xd8\x25\xa5\xa6\x03\x03\xfb\xc9\x4f\x21\xc7\x30\x28\xec\x93\x7e\x47\xa6\x02\x33\xd5\x39\x72\x57\x36\xce\x6f\x51\x07\xc9\xa1\x04\xe0\x32\x5f\x09\x94\xd3\x52\xcb\x8c\x70\xd9\x92\xcf\xd5\xae\xd1\xa9\x9e\xb9\xc1\x05\xd9\x4f\x68\xf4\xfe\xfa\xe2\xff\x2d\x9d\x9b\x78\xd5\xce\x3c\xbb\x4d\xa6\xa8\xe5\x41\xb6\x6d\x73\x65\x2b\x50\xed\x37\xce\xd7\xbd\x71\xbc\x83\x68\xeb\x4c\x50\x57\x2d\xeb\x57\xc1\xef\xba\x86\xea\x24\x5d\x67\xe4\x49\x13\xfa\x6f\x0d\x63\x3d\x82\x20\xfd\x13\xa6\x28\x44\xde\x02\x6f\xad\xe2\xa6\xc8\x52\x96\x7a\xad\xe1\xed\x3a\xc1\x95\x7c\xae\x57\x64\x8a\x6b\xa7\x11\xbc\x78\xc7\x5b\x96\x87\x5a\x2a\x61\xc7\xf9\x8e\xa0\x92\x30\xae\xac\x37\x05\x6c\x09\x3e\x81\x6f\x91\x81\x4d\x05\xac\x91\x3d\x3d\x27\x41\xcd\xba\x09\x54\x2b\x1f\xdf\x77\x7a\xb8\xb1\x5f\x5a\x49\x96\xe3\x17\x56\xaf\xea\x50\x54\x13\x1e\x0f\x1e\x11\x04\x97\x60\x60\x36\x58\xcd\x0c\x9d\x59\x8d\xe5\x2d\x29\xcd\x07\x89\x54\x0e\x3e\x07\x07\x42\xfc\x6e\xa6\x6f\xf4\xe4\xba\xb4\x19\x70\x08\x1b\x52\x37\x48\xd4\x49\x31\xc5\xb6\x7a\x1a\x12\x04\xbb\x5e\x84\xf7\xac\x5a\x5c\x71\xae\xbe\xf7\xd5\xda\xb6\x7d\x32\xfe\x61\xc3\x11\x7d\x27\x26\xf8\xa5\x31\x74\x79\x08\x1b\x07\xe4\x62\x50\x63\x2e\x55\x2c\xea\x05\xf9\xad\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xd9\x7e\x98\x12\x0b\x28\x3e\xea\x3c\x5e\x19\x83\x36\x1f\x2c\xaf\x52\x28\xd9\x92\x29\x54\x10\x7a\x87\x17\x08\x57\x92\x7b\x97\x1a\x5b\x17\x6e\x75\xb1\x5c\xfd\xf5\x98\xab\xd9\x4a\x10\x37\x16\x05\xa2\x9f\xd5\xf6\x06\x01\x69\x50\x97\x9f\x4d\xd9\x4a\xb3\x0a\x12\x8b\x1a\x41\x0a\x52\x12\x56\x3c\xd7\x13\xb1\x6d\x0e\x1b\x38\x55\x97\x9c\x69\xf1\xba\xed\x73\x75\xe1\xfd\x93\x76\x35\xc2\x53\x04\xae\x6c\x1b\x44\xc4\x00\xd3\x03\xe1\xda\xca\x94\xac\xaf\x8b\x09\x44\x3d\xcd\xa6\xfb\x7b\x3b\x26\x95\x5e\x6c\x5a\x55\x7a\x07\xd2\x12\x2b\x03\x4d\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\x89\x04\xe8\xe8\xc7\x63\x8b\xec\xd0\x3e\x5c\xbc\x46\x2f\xd1\xa1\x1e\xdb\x11\x68\x1c\x13\x4c\x2b\xa0\x90\x02\xf0\xdf\x52\x48\x76\xe2\xe0\x49\x49\x53\x00\x72\x04\x71\x61\xae\x96\x01\x62\x1c\xc9\xb6\x98\xb9\x39\xa0\x9c\x79\x8f\xb0\xe5\x13\x4e\xca\x85\xd9\x8b\x9d\x7c\xf7\xe1\x07\x49\xc4\xb6\x8f\xad\xbe\x0e\x3f\x3c\xe1\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\x7e\xb0\xdf\xb5\xfb\xcb\x32\xe1\xb2\x94\xe4\x2d\x65\xed\xbd\x61\xec\xdc\x89\xb0\xc7\xf5\x39\xf4\x08\x15\x6e\xa1\x79\x10\xb7\x73\x11\x8a\x0c\xe9\xd1\x17\xbd\x63\x34\x78\xc0\xea\x86\x5b\x02\x1b\xfa\x07\xa2\x0d\x21\xcc\x4a\x5e\xaf\x74\x72\xc2\x05\x22\xb8\x98\x45\xf7\x26\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x95\xcd\xb7\xff\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x2c\x61\x8b\x61\xf1\xca\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf8\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x0f\x33\x56\xe6\x1e\x74\x64\xcc\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x97\x1b\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x18\x24\x94\x35\x58\xcd\x06\x48\x90\xca\x30\xa4\x5b\xf1\x7c\x6b\x3c\x5e\x07\x20\x71\x5c\x87\x9c\xb8\xe9\x30\xab\x86\xcc\x2d\x2b\x76\x73\x1d\x5e\xd3\xfc\xe6\xf2\xfd\x4d\x98\x00\x8c\xd9\xc2\xd0\x14\x24\xa4\xb7\x9a\x67\xf7\xd4\x8a\xc7\xc4\x74\x2e\xaf\xe2\x63\x43\x3a\x93\xde\xb7\x1e\xd1\xf9\x74\xa7\xf4\xcb\x50\x9e\xcb\x18\xcf\xac\x5d\x58\x06\x7c\xae\xb6\x91\x61\xe5\x92\x8f\x80\xbd\x3a\x77\xc8\x01\xf2\x0f\xd3\x23\x67\x65\x17\x5a\x70\x28\xca\xa6\x32\x74\x82\xe0\xaa\xca\x82\x49\x58\xe7\x05\x71\xa7\xc0\xb3\x99\xad\x7a\x03\xfa\xd5\x36\x52\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x77\x23\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x2e\xd5\x76\x4a\xd5\xac\x1d\x1f\x17\xbc\x0e\xb2\x6e\x87\x92\x4e\xe5\x89\x95\x28\x43\x3d\x71\x47\x88\xb2\xca\x67\x2a\x83\xb7\x90\x29\x69\x23\x08\xc9\x83\x47\x85\x1f\x3d\x6c\x3d\xc8\x4f\xf1\xd0\xec\xd5\xe9\x01\x82\x4d\xd8\xbc\x5b\xd7\x3a\x56\x77\x55\x1a\x0f\xfe\xd2\xce\x7a\x60\xec\x21\x59\xa4\x8d\xe2\xac\x9d\x47\x63\xbc\x6e\x7d\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\x7e\xe8\xba\x84\x4a\x62\x48\x44\x08\xf0\x79\xe1\x07\x73\xee\x21\xbc\x7d\x00\xb5\x04\xed\x9f\x1e\xe4\xe2\x37\x3d\xad\x2a\xbd\x90\xd8\x12\xca\x04\xe8\x4e\x30\x4d\x3c\x87\x8b\xd4\x2b\x6e\xe8\x5b\xb4\xb1\x10\x8e\x22\xbd\xe6\xfe\x21\x55\x8e\x3d\xc7\xd1\xf7\x28\x6e\xda\xc6\xa8\xa6\xf7\xba\x87\x61\x8b\x7d\xbe\x11\x08\xfc\xaf\xff\x3a\xa1\xb4\x12\x02\xf0\x81\xa7\xed\x1a\xe8\x15\x0a\x1b\x71\xc9\xd1\x4a\x5f\x5b\xfa\x8b\x4b\xa2\xb4\xa1\x66\xe6\x2d\x8c\x3e\x68\xc3\x4a\xb4\x19\x0e\x43\x4a\x64\x18\x85\xd1\xe1\xac\x92\x22\xf1\x3c\x40\xa4\xd8\xf6\x49\xeb\x20\x4e\x79\x7b\xaa\xc8\x31\x5a\x93\xbe\xf3\x64\x11\x64\xf4\xe5\x51\xe4\x47\x8c\x55\xa1\x5d\x89\x57\xa5\x52\xad\x04\xb4\x31\x5b\xe3\x59\x09\xa9\x6b\xe8\x2a\x78\x69\xc4\xcb\x15\x46\x1b\x57\x74\x3e\xbe\xc4\x88\xde\x1c\x9d\x09\xc2\xb8\x75\x8f\x04\x75\xdf\xc9\x3d\x29\x5a\x45\x4a\x4b\x6c\x65\x5d\xca\x86\x14\xa7\xdf\x9b\xe8\x1e\xb8\x24\x7d\x5b\x71\x52\x0e\x3a\x36\x70\x6b\xeb\x78\x6a\xae\x01\xfa\x5f\x90\x92\x96\xc7\xb2\x2b\x55\x3f\xf2\x7f\x1e\x3b\x15\x80\xa3\x2e\x30\x73\xb6\x15\x54\x3c\x37\x1e\x6e\x4b\x60\x65\x79\x3c\xc6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x19\x93\x29\x35\x69\x81\xc1\xa5\xe8\x19\xb0\xe2\x18\xdd\xc0\xb0\xa1\x0a\xd5\x74\x3a\x33\xa7\x05\x61\x28\x0d\x89\x1c\x6e\xac\xe2\xb8\x44\x20\x58\xb8\x40\x77\x58\xd4\x5a\x17\xc0\xc5\x0c\x40\x68\x98\xa1\xb2\xd5\xe7\x01\x01\x5f\xd3\x62\x28\x15\x56\xda\xc6\x24\x22\xc1\x07\xe7\xa6\x69\x0b\xc5\x4b\x1e\xbb\x30\xdb\x96\xf9\x74\xf4\x49\xcb\xe2\x05\x39\xbf\x27\xc5\x52\xe9\xef\xba\x06\x8a\x3f\xee\x8e\xb3\x63\x2a\x4b\x56\x06\x77\xc4\x54\xb6\x23\xdc\x15\xdd\xe4\xcc\x4e\x38\x75\xd6\xa7\xf9\xa7\xb6\x47\xfb\x8b\x20\x5d\x10\x2b\xe0\xed\xd5\xff\xd4\x5b\x5d\x9f\x5c\xc3\x11\xc4\x85\xaf\x23\x97\xd4\x2d\xd7\x0f\xa8\x4c\xc5\xb9\x42\x87\x07\x27\x07\x47\x2b\x7b\xe1\x40\x86\x69\x06\x26\x23\xba\x1b\x90\xa4\x75\x53\x2d\x60\x0c\x07\xa6\x18\x55\x42\x91\x57\xfd\x38\xc0\xaa\xaf\xc0\x20\x67\xa4\xaa\x06\x48\x6a\xf5\x17\x3b\xf2\x5b\xf3\xa9\xfe\x91\x12\x6d\x61\xdc\x64\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\x99\x80\x07\xba\x01\x1b\x32\xa9\x4f\xbe\x13\x0b\xde\x42\xbd\x64\xb3\x6c\x9e\x2f\xb9\xc0\xda\xfc\x69\x8d\x8e\x6e\x48\x37\x48\x95\x50\xff\x57\x3f\xe7\xf7\x54\x69\x55\x44\xb5\xe0\xa6\x78\x69\x2c\x05\xa2\xc5\xab\xbe\xf0\xf4\x4d\x77\x32\x23\xb8\x52\xb3\x85\xb7\x5e\x4c\x29\x5a\x89\x5a\x66\xbf\x49\xd7\xa1\x76\x20\x6d\x74\x77\x13\x38\x6d\x45\xec\x9b\x99\x20\x72\xc6\xab\xad\xa7\x71\xba\x32\xa9\x05\x67\x52\xcb\x14\x6d\x62\xdb\x3e\x4a\x9f\x41\x67\x4b\xb5\x72\x4b\x78\xaa\x4f\x99\x20\xa5\x55\x96\x2c\x7b\xe2\x0c\xcf\x41\x53\xd0\xfa\x1c\x29\x53\x4c\x93\xd0\x26\xfa\x63\xce\x42\xae\xdb\xaf\x99\xaa\x9f\xa9\x68\xf2\xdc\xd2\x6f\xae\x46\x67\xbd\x5b\x1a\x3e\xf8\x01\x8e\xf1\xd9\x8c\x14\xb7\x57\x69\x05\x45\x76\x04\x5a\xd0\x70\xb1\x4d\xc5\x40\x37\x9f\x4d\x2b\x18\x71\xa1\x10\xf3\xa5\x91\xf5\xd9\x9a\xc2\x2a\x12\x31\xa7\x05\x39\x76\x65\x93\x5d\x70\xde\x15\xc0\xc1\x6c\x4a\xd0\x2b\x7d\x20\xfe\xf2\xe7\x3f\xff\xf1\xcf\xe9\x32\x3a\x9d\xc9\x3c\xfd\x20\x20\x00\x43\xc1\xc0\x77\x45\xed\xba\x36\xdd\x59\xe7\x6c\xb6\x3d\x05\xa3\xae\xc2\x85\x5f\x9b\xe9\xfa\x43\x97\xe6\x95\x94\x84\xa0\x35\xe1\x0a\x2d\x3a\xcc\xff\x8c\x2b\x3e\x3e\xa9\xb1\x54\x44\x68\x1b\xc7\x5e\xeb\xc3\x42\xf7\x80\xb2\xe9\x71\x5d\x1e\x25\x54\xb8\x43\x81\x59\xbd\xc2\x2d\xde\xa3\x99\x79\x80\x27\x5c\x4f\xca\xd6\x5d\xf0\xc8\xf5\xf2\x5b\xf4\x22\x8e\x98\x5a\x2f\xc1\x1b\x92\x27\x13\xed\x87\x9b\x9b\xd1\x1b\xa2\x42\x81\xcd\xe0\x43\xf4\xe6\xfc\xc6\x57\xbc\xd2\xbb\xcb\x24\x35\xed\xa5\x76\x8a\xd4\x9e\xf1\xb4\x92\x67\xb9\xe3\x2e\x46\x94\x00\xcd\x36\x63\xa4\xd0\x0b\x3d\xe8\x15\x57\x71\x38\xc4\x8b\xd1\x31\xfa\x27\x6f\x41\xe5\xc2\xe3\x6a\x81\xee\xb0\x61\x34\x90\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x9a\x72\x09\xe0\xda\xd9\xfa\x59\x0d\xfa\x94\x6d\xd9\xce\x5a\xa9\x78\x8d\x66\x76\xa8\x66\x0e\xbb\x9a\x72\x46\x37\x32\x47\x10\x62\x3f\x12\x09\xd2\x18\x6b\xc9\xfe\xcd\x57\x61\x0b\xad\x48\x21\x33\xcf\x41\xe5\x21\x8c\x8a\x70\xaa\xac\xa2\x0f\x2e\x4c\x6a\x65\x54\xb4\x4b\xac\x7b\xb2\x14\xf0\x44\x99\x8a\x78\xa2\xf4\x42\x9e\xee\x25\xe9\x41\xc8\x3c\x25\x41\x51\x96\xb2\xa0\x28\x7b\xb5\x47\x64\x43\x6d\x76\x73\x19\x00\x8e\xee\x68\x2a\x2b\x21\x72\xce\x64\x5f\x8b\x03\x33\xce\x68\x61\xc2\x19\xa8\x6d\x38\x43\xbc\x55\x4d\xab\xc0\x15\x54\x60\x49\x86\x73\x2c\xa8\x16\xa8\xa6\xa6\xb2\x47\x42\x31\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\xf4\x03\x9b\x2d\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\x8c\xd5\x2c\x9f\x59\x87\xd5\x0c\x90\x7d\x10\xcb\x72\xc0\x50\x10\x9c\xda\x6c\xd8\x81\xc4\x9b\xac\x56\x6c\xa2\x48\x80\x78\x3b\x17\x4b\x76\xb0\xee\xe1\xea\x1c\x66\xc2\x9a\x3c\xbe\x59\x1d\x96\x40\x1e\x13\xad\xdb\x5f\x9c\x5e\x9e\xfe\x7c\xfd\xf1\xec\xe7\xcb\xd3\x77\xe7\x29\xaf\x4e\x2e\x5f\x96\xb3\x80\x59\xb6\x12\x66\x8f\x54\xe0\x51\x3f\xb2\x98\x91\xdd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xa5\x75\xd2\x58\xea\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x51\x88\x2c\x31\x66\xb9\x1a\x5e\xb6\x0e\x92\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbd\xc8\x35\xda\x19\xf7\x78\x43\x04\x05\x44\xd0\x2e\xec\x9a\x1f\xf8\x9d\x2d\x0e\x76\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xb3\xa9\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x8b\xf4\xd9\xe9\xc8\x97\xed\xe3\xe7\x43\x5f\x1d\x6c\xa9\x1f\xfe\x4a\xc1\x0f\xa1\x25\x31\xfe\xea\xd8\xe7\xa9\xbd\x82\xfe\x78\x51\x84\x59\xe9\x20\x67\x5f\xdf\x3e\x51\x45\x73\xcd\x8b\xdb\x4c\x6e\xd7\x9b\xb3\x91\x79\xdb\x12\x9e\xc5\xdc\xc0\x5a\xcb\xe4\x08\xeb\x5f\x81\x02\xba\x77\xba\xee\x8c\xd3\xf5\xc0\xa4\x75\xe1\xea\xdb\x8d\x1d\xa8\x07\x7b\x6b\xab\x7b\x9c\xe2\x23\xfa\x15\x50\xf6\xd6\xd6\x03\xcf\xde\xda\xda\xe0\x71\x95\x68\x29\x67\x6f\x04\x2e\xc8\x68\x97\x94\x37\x27\x40\x50\x69\xeb\xb3\xa3\x4e\x87\xf3\xe2\x82\x11\x52\x1a\xf9\xe1\x8a\xea\xa2\xa9\x1e\x89\x81\x47\x83\x0f\xb1\x03\x16\xb7\x22\x41\xcd\xbb\x99\xd9\x57\x5b\x15\xd7\x05\x99\xd7\xf5\xae\xb3\x4d\x1a\x4f\x86\xee\xaa\x86\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\x87\x2b\x88\x24\x9d\xea\xe9\x72\xb5\x9c\x0d\x89\x96\x2b\xbd\xd7\x75\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x12\x94\x04\xc6\xe8\x16\x4a\xd9\xc2\x6b\xe2\x27\xea\x9a\xd8\x5c\x4d\xa3\xd1\x54\x9c\x4d\x61\x32\xb0\xcd\xc9\xb8\x6f\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc1\xdb\x0c\x69\x19\x2e\xf0\xed\xf5\x29\x46\x2d\xfd\x88\x29\xdc\xf6\xc9\x3d\xdf\x4f\xae\x45\xef\xd5\x8c\x88\x3b\x2a\xc9\x20\xbe\x74\x2d\x72\x6e\xdf\xa5\x32\x72\xe6\x33\x4f\xa1\x62\x33\x07\xf5\xb6\x80\x54\xd6\xe8\xb6\x3e\xc2\x7b\x9d\x68\x65\x9c\x0d\x19\x99\x1a\xa2\x06\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\x3e\xdb\x40\x2a\xde\xf4\xea\xf6\xce\x29\x8e\xee\x09\x90\x42\x74\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x80\x88\x9e\x2b\x19\x9d\x90\x6f\x75\x63\x61\x0e\x18\x8d\x89\xc2\xd6\x07\xae\x0f\x81\xe7\x44\x07\xba\x73\x7d\xf6\x20\x49\xe0\x66\xed\x06\xf0\x34\xe9\x53\xac\x12\xa4\xc4\x1a\x6d\xde\xac\xe7\xa7\xb7\x1d\x95\x36\x5e\x97\xc8\xc3\xbc\x1b\xcc\x86\xfa\x44\xf3\x56\xed\xc8\x3d\xf2\x90\xeb\xc8\x50\x5c\x04\x46\x22\xad\x89\x44\xbc\xcd\x54\x6f\xe2\x95\x6d\x2e\xa7\x85\xb7\xf7\x3b\xad\x7d\xa4\x2a\x69\x54\xd5\xe1\x1c\x5b\xec\x01\xf2\x7e\x9b\x87\x1b\xf0\x57\x8e\xdb\xc9\x84\x08\xb8\xe9\xa0\xc3\x2b\xb0\x7b\x5f\xc7\xcb\xdd\x61\x71\xce\x5b\x0b\xf8\x22\x6a\x00\xb5\x03\x2c\x99\xc4\x03\x4d\x5a\x92\x4d\x28\xd3\x2b\x88\x04\x2e\x78\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x54\x16\x48\x4b\x59\x85\x71\xbe\x67\x71\x98\xc4\xbc\xfb\x61\x1d\xeb\x8b\xdd\x16\x45\xc5\xa5\x4d\x8f\x86\x75\x29\x66\x98\x31\xe2\x9c\x51\x54\x81\x27\x7b\x4c\x08\x43\xbc\x21\x06\x94\x17\xd5\x19\x8c\x24\x65\xd3\x8a\x20\xac\x14\x2e\x66\xc7\xba\x77\xcc\xed\x85\x2e\x0f\xd9\x7e\x22\x95\x20\xb8\x36\x7b\x42\x90\x1a\x53\xd3\x3c\xc2\x85\xe0\x52\xa2\xba\xad\x14\x6d\xfc\xcb\xe2\xbc\x88\x04\x18\x21\xa4\x49\x4b\x75\x6b\x05\x69\x25\x5d\xc2\xf3\xa0\xeb\xa1\x1d\x3e\x0f\x8b\x15\x81\xeb\x6c\xa0\xbf\x25\x75\xa3\x16\x3e\x31\x31\xce\x06\x9a\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\x94\x83\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x9a\xfc\x3b\xdf\x09\xf7\xaa\x92\x4a\xeb\xeb\x90\x71\xd9\x7f\xd8\x55\xa6\x31\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x75\xb6\xbb\xdc\xc9\x34\xb9\x02\xe5\x63\xdc\xb9\x1e\xf4\x38\x07\x3a\xdb\x02\x52\x61\x56\xa4\x0e\x6c\x28\x46\xe6\xfa\x1c\x90\x82\x68\x55\x14\x67\x14\x32\x4f\x2e\x63\x02\x5d\xee\x1d\x91\x12\x4f\xc9\x28\x12\x8e\x90\x43\xe0\x74\x8e\x36\xc0\x31\x74\xdb\x66\x46\x0c\xd1\x95\xe2\xc1\x27\x61\x92\x57\x68\x3c\xd6\x66\x20\x51\x3d\x70\x46\xd3\x9d\xa0\x4a\x11\xd8\xa5\x50\xc9\x09\x00\x68\xcb\xe4\x9d\xfd\xe4\xb2\xa8\xf6\xec\xa4\x87\xed\x69\xf5\x83\x95\x26\x4d\x6b\x4c\xd0\x58\x50\x32\x41\x13\x0a\x79\x63\x90\x51\x35\x30\x55\x08\x30\xe0\x76\xb1\x94\x44\xc0\xb0\xad\x5b\xc0\x0d\x3f\xae\x3f\xff\xb0\xe3\x57\xa2\x65\x05\x0e\x4a\x74\x02\xb7\x18\x9d\xa0\x29\x64\x71\x59\x23\xf8\x4f\x2f\xff\xf6\x17\x34\x5e\x68\x7d\x0d\x0c\x31\xc5\x15\xae\x5c\x07\x50\x45\xd8\x54\xaf\x22\x88\xdc\x38\xb9\xd1\xe3\xa7\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\x3a\x7a\x20\x1f\x4f\x4a\x32\x3f\x09\xb6\xd0\xb0\xe2\xd3\xb8\xb7\x9e\xe5\xc8\x26\x4e\xf2\xb3\xad\x39\xd1\xbc\xa2\xc5\x62\x5b\x67\xda\x15\x2f\x41\x33\x7e\x67\x9c\x39\xab\x47\x35\xa0\x7a\x69\x78\xd3\x56\x30\x71\xe8\x7b\xcf\xcf\xd7\x4a\xb2\x4c\x7d\x94\xea\x24\x0c\xa4\x1d\x04\x51\x6d\xb3\x4b\x77\x8e\x4d\x61\x74\xdd\xe4\x96\x78\xc2\xc6\xdc\x7c\x1d\x92\x68\x6f\xdc\xf7\xb8\xaa\xc6\xb8\xb8\xbd\xe1\x6f\xf9\x54\xbe\x67\xe7\x42\x70\xd1\x1f\x73\x85\xf5\x9d\x3e\x6b\xd9\x2d\x54\xd1\xed\xc8\x68\xf9\xd4\x62\x0a\x1d\x7f\x40\x30\xba\xa8\xce\xb8\x51\x1a\x7a\x50\xa7\x92\x38\x1f\x5c\xd7\x32\xb9\xa7\x9d\xa3\x8d\x21\xa2\xfb\x1c\x9b\x80\x4f\x7a\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\x48\x39\x96\x03\x73\x01\xc0\x0d\xac\x55\xad\x1a\x57\x55\x6c\x94\x20\x14\x01\xdf\x47\x17\xa7\xde\x81\x23\xaf\xb6\x76\xba\xbf\xd8\x64\xbc\xb9\xf9\x27\xd8\x8b\x54\x49\x52\x4d\x06\x86\xed\xc5\xbb\xb5\x0e\x40\xbb\x3a\xb0\x57\x5e\x3c\x53\xd0\xf6\x8d\xb6\x39\xaf\xda\x9a\xbc\x26\x73\x5a\xc4\x05\x30\x7b\xab\xd2\x7b\x9b\x73\xd3\x57\x54\x02\x09\xd0\xb8\xe2\xc5\x2d\x2a\xed\x97\x01\x54\x7e\xb9\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x38\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xd7\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\x87\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\x7f\x1b\xbe\x85\x15\x66\x2c\x4f\x39\xe4\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\xde\x7d\x99\x21\x18\x9a\x96\x23\xd1\x9b\x17\xe6\x83\xd0\x35\x56\xd6\x3e\x72\x51\x76\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xdb\x9a\x84\x55\x44\x7d\x8d\x9b\xe1\x2d\x59\x44\x6e\xb8\xc4\xe3\xf2\x10\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc4\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x47\x31\x63\x33\xea\x40\xdb\xbe\x72\x3e\x76\x0b\xd7\xbf\x71\xf4\x27\xfe\xca\x31\xbf\xfa\x9a\x2e\x1a\x18\xdf\x73\xbd\x67\x7c\xe7\x33\x89\xd3\x24\xa4\x13\xdc\x4e\x76\x67\xf4\xaf\xa3\x9e\x43\xcb\x9c\xcc\xc0\xf4\xb5\x8e\xa6\x63\x53\x14\x20\xa1\x03\xfa\x28\xda\x46\xd1\xc1\xb7\x07\x5b\xbd\xe3\xcc\xca\x08\xde\xe0\x29\x58\xa6\xbb\xb0\x40\xcb\x7d\x0a\x39\x68\x67\xfc\xce\x7c\x6f\xd0\x25\x8d\xfd\x15\x29\x3b\x22\xf3\x19\x4f\x5a\x1d\x83\x1c\x74\x3b\xc2\x5a\xd7\x86\xab\xf0\x0e\x2f\x10\x16\xbc\x65\x49\x69\xd0\x10\x18\xf1\x81\xb3\x77\x4b\x83\xbd\xe4\x8c\xb8\x20\x7d\x4a\x2b\x37\x1d\x87\x39\x95\x06\xaf\x40\x19\x7a\x75\xfc\xea\x65\x72\xdf\xaf\x48\xd1\x0a\x49\xe7\xe4\xca\xd6\x38\x0f\x82\x2a\x17\x93\x11\x97\x92\x8e\x2b\x48\xdc\x52\x1c\x9d\x9b\x02\xf0\xab\x03\xf5\xc0\x11\x18\x31\x17\x21\x5b\x69\x42\x0f\x0f\xcd\x09\x0e\x01\x9f\xba\x81\x04\xd4\xc7\x6e\x69\x92\xb0\xae\x4b\x9a\xe4\xa5\xd7\x24\xcd\xbd\xb7\xd5\xb1\xba\xc2\xf7\xbb\x20\x49\xde\xd9\xd8\x40\x57\xd9\x9e\xba\xca\xc9\xf0\xd1\x9d\xa0\xca\x1e\xee\x3b\x2a\x09\x3a\x04\xaf\xc4\xd2\x66\x4c\x22\x68\x0e\x7d\x58\x89\x15\xf0\x73\x10\x2c\x8b\xe5\xa3\xbb\x0b\xab\xb4\x2a\x4f\x3a\x04\xfe\x9d\x75\x60\x75\x2b\x68\xa5\x7f\x77\x2f\xcf\x30\x2b\xab\x24\x99\xe1\x67\xa5\x5a\x24\x71\xe1\x5c\x4c\x50\x28\x12\x6d\xfc\x32\xa8\x26\x31\xc3\x12\x31\x8e\x6a\x82\x01\xa0\xa9\x6f\x17\x27\x05\x7b\x5c\xcd\xf9\xfa\x60\x36\xbb\xb9\xc6\xc2\x0b\xc1\x8a\xeb\xd7\x54\x5a\xf1\xac\xe5\x88\xb5\x40\x0c\xac\xa3\xc6\x65\x4a\x6a\x77\x30\xa7\xdd\xe2\x1d\x77\xa0\xc9\xe5\x9e\x74\x17\xc7\x52\x5f\x1e\xa3\x1f\x03\x5b\x82\x5c\x37\xdf\x02\x4e\x70\x8d\x5b\xae\x03\xc9\x24\x45\xb3\xcd\xb3\x3c\x5c\x7f\x2d\xae\x8c\x75\x7d\x8f\x7d\x87\x13\xfa\xf0\xf9\xa1\x0e\x02\x59\xe8\x30\xa2\x26\xa4\x6e\x6b\xa0\xd8\x8c\xc7\x34\x26\x6f\x17\x94\xf0\xee\x9e\x29\x61\x44\x60\x1b\x57\x70\x10\x51\x4b\xbe\x82\x25\x67\xa9\x07\xe2\x33\x1b\x4e\xcb\xfb\xcf\xab\x29\xe6\xcf\x12\x3a\x02\x7a\xce\x21\x17\x4b\xa7\xdd\x46\x4c\xd6\x69\x2c\x39\x47\xbd\x44\xcd\x65\x36\x7f\xc0\xf9\xa9\x17\xe5\x97\x96\xce\x71\x45\x0c\x87\xbd\x13\x0d\x5b\x55\x26\x64\x3b\xde\x55\xb3\xd1\xda\x87\x60\x76\xac\x07\x3d\x3c\x68\x41\x66\xd2\x27\x5e\xbc\x40\x87\xa6\x8d\x03\x43\xb2\xbb\x5d\x25\xd7\xae\xd5\xf9\x7d\x93\x50\xb9\x35\xdf\x7a\x9d\xdf\x37\x18\x70\x1a\xcd\x4e\x2c\xdc\x7f\x91\x19\x9e\x13\xe0\x34\xa6\x15\x16\x15\x80\xd2\xaf\xcd\x94\xa1\x71\xab\x10\x61\x73\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xfb\xc3\x8f\xa7\x57\x90\xb4\x74\x64\xd9\xf2\xed\xf8\x5a\x09\xfc\x00\x4b\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xfa\xb9\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\xf7\x81\xa7\x78\xf2\x72\xba\xc0\x2d\xf1\xf7\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\xd0\x90\x47\xd7\x78\x58\x43\x42\xb9\xa2\xe8\x1c\x48\x4f\x4c\x19\xe6\xe1\xd8\xbb\x38\x0e\x9e\x01\xa5\x13\x4c\xf2\xb7\xab\x49\xba\xe2\x61\x84\x1a\x2d\x5b\xf7\xe1\x47\x1c\x86\x7c\xc7\x20\xc2\x11\x9d\x67\xd7\x33\x5e\x92\xcd\xab\x0a\xa5\xed\xf3\x4b\xdb\x66\x90\xf8\x44\x99\xbd\x75\x4c\xe9\x5c\x28\x48\x62\x72\xfc\x64\x31\x23\x65\x1b\xa1\x72\x5d\x4c\x0c\x18\x68\xd0\x7b\x1d\x46\x05\x66\x25\xd5\x7b\xc5\xa4\x02\x98\xd7\xeb\x43\x66\xf5\x7f\xd7\xa0\x08\x6b\x96\xfa\x0f\x2f\x23\x98\xd7\x00\x62\xbd\xa2\x6e\x0f\xc2\xaa\xbd\x96\x30\x01\x54\xd2\x92\xa0\x31\x29\x78\x4d\x00\x3b\xdc\x70\x66\xf4\x71\x47\xa9\xe0\x13\x48\x4c\xe4\xd8\x0c\x6d\xd3\x2e\x05\x8e\x50\x7b\xa1\xbb\x63\x24\x3d\xd7\xbe\x00\xb4\x98\x5e\x6b\x2a\xba\xe6\xf5\x3c\x1a\xd8\x86\x5f\x19\xc4\x19\xc2\x5d\xd1\x4e\x3d\x82\x4d\xfb\xf3\x25\xc9\x34\xdd\x52\x0d\xc9\x9c\x02\xfd\xc0\x09\x96\x92\x4e\xd9\xb0\xe1\xe5\x50\x37\x7b\xf2\x3b\xfd\xbf\x1b\x1f\xa5\x48\x01\xa0\xdb\xba\x26\x15\x48\xe6\xa7\x3e\x3f\xae\x5d\xb3\xa7\xa5\xfb\x97\x39\x44\xce\x3a\x83\xfc\x82\xa5\x85\x9b\x50\x65\xd6\x2b\x66\x99\xae\xd7\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4c\x2a\xf9\xb9\xed\x02\x18\x87\x98\x1e\x6c\x98\x80\xe5\xae\x1d\xbc\x76\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x51\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x61\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xfe\x7a\x05\x24\x23\x03\x20\xc8\xc6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xcd\x2f\x21\x3b\x82\x65\x4f\x0b\x14\xc8\x35\x77\xc0\x84\x57\x15\xbf\x03\xfe\x1b\xd3\x87\xc0\xfd\xb9\x39\x8f\xcb\x50\x2e\x55\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x41\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x46\x67\xf1\x7f\xfc\x41\x12\xb1\xa9\x57\xd1\xfe\xf9\xf2\xf4\xe3\xa6\x39\x15\x35\x17\x23\x53\x04\x3c\xcf\x4b\x25\x79\xab\xf7\x8f\x5b\xd3\x4c\xef\x84\x2a\xf3\x59\xfb\x39\x91\x6f\x04\x6f\x37\x35\xc3\x3e\xfd\xb2\xb3\x19\x66\x2e\x41\x20\xd3\xc8\x17\xb2\x50\x55\xec\x34\xce\xb0\x20\xb6\xb8\xa8\xd6\x0e\x65\x83\x8b\x4c\xb3\xe7\xeb\x7e\x66\x7c\x5d\xc6\xf5\x90\x6d\xd3\x54\xa4\x26\x4c\xe1\x0a\x5e\x9b\x6b\x23\xae\xbc\x37\x65\xb1\xbb\x3b\xe3\xc7\xff\xf8\xe9\x71\x4e\xe7\xa7\x9b\xc8\x71\x56\x3f\xd7\x42\xfa\xc9\xfd\x74\x0b\x05\x6e\xf0\x98\x56\x54\xeb\x2e\x8f\xf1\x7e\x17\x1f\xbf\xe2\x5c\x7d\xef\x71\x7d\x8f\xd1\x52\x23\xe8\x9c\x56\x64\xba\x71\x6c\xf4\xcb\xb6\x93\xbe\x09\x47\xae\x89\x73\x59\xe0\x2a\x26\xb7\xe5\x0b\x47\xc2\x0b\x08\xcc\x3c\xca\x82\xa4\x89\x9e\x2f\x78\xf9\xe6\x82\x28\x5a\x03\x8f\x05\x1a\x46\x78\x65\xe2\x61\x81\x71\x70\x98\x74\x8f\xe3\x43\xe5\xe1\x6d\x9d\x52\x36\x45\xbd\x42\x84\xad\x10\x84\xa9\x6a\x11\x04\x4e\x81\x58\xc3\x68\xce\xa0\xd5\x82\x62\x6d\xb5\xc3\x18\x7f\xdc\xa9\x37\x98\x2c\x67\x47\x8d\x17\x5a\x9d\x0c\xfc\x31\x93\x16\xc8\x62\x40\x83\x37\x25\x63\x01\x2f\x15\xc5\x3c\xb6\xa6\x52\x10\x6f\x08\xeb\xb6\xf0\x89\xf5\x8f\x0e\xf5\xd6\xee\xd5\x0e\x32\xe6\xe5\x71\x5d\xfe\xae\xa9\xb0\x9a\x70\x51\x0f\x9d\x1b\x64\xd8\x33\x3d\x23\xba\x75\x06\x79\xec\x1e\xd3\x61\x78\x9b\x4c\x79\x75\x56\x56\x24\x30\x2b\xfd\x02\xb0\xd2\x04\x2f\x51\xcb\x04\x29\xf8\x94\x01\x93\xbf\xfd\x16\x0c\x26\xef\xf5\xc1\x52\x9b\x74\x88\xb5\x55\xb5\x71\xdf\x22\x8d\x51\x3e\x27\x62\x46\xf0\x86\xa7\x30\x6d\x83\xbf\xb7\x6d\x22\x41\x1a\x41\x24\x4c\xa8\x09\xa1\x4b\xde\x8a\x82\xf8\x4e\x21\x2c\x25\x2f\x80\x95\xd8\x24\x09\x3a\xbe\x30\x0c\xa6\xe2\x84\x0b\x84\xd1\x94\xce\x09\x43\x57\x66\x37\x9c\x55\x78\x73\x9e\xac\xc0\xef\xe6\x5c\xec\xb8\x55\xdc\x27\x90\x22\xac\x10\x2e\x6b\x0a\x2c\x0d\x86\x79\xc0\xba\x25\xc3\x56\x83\x9f\xe8\x5d\x2a\x38\xa4\x13\xa2\x8b\x4d\x13\x4c\xbf\xe8\xbd\x90\x55\xe9\x80\x00\x7e\xba\xc0\xc4\x73\x00\x08\x5f\xfc\x1c\x15\x10\x3b\x77\xe5\x61\x22\xa6\xe7\x4b\x3a\x64\x09\x32\xf4\x35\xb0\xae\x51\xeb\x9c\x9a\xe1\xb9\x81\x4b\x74\x4b\x5c\x69\x35\x63\x53\x35\x52\x9b\xfd\x00\x20\x0a\xfb\x65\x12\x07\x5d\x44\x03\x08\x65\xc1\x35\xd6\x85\x37\x46\xbc\xbc\x6e\x48\x31\xe8\xb6\xa0\x5b\x70\xc7\xb4\xe1\x48\xc0\x36\xec\x4f\x20\x05\x8d\x4b\x44\x18\x2f\x71\xa9\x77\x6b\xd8\xc9\x10\xb7\x42\x55\x8f\x56\x04\x0c\xf3\x4e\x5e\x18\xb0\xc3\xbf\x89\xd8\x38\xb5\x68\x8d\x3b\x6e\x4a\xd5\xf1\xed\x5f\xc1\x17\x47\xd8\x0c\xb3\x02\x34\x79\x79\x72\x4b\x1a\x79\x22\xe9\xd4\xb8\xde\xfe\xf2\xd7\xbf\x82\x1f\xce\x2d\xce\xc9\xd5\xf9\xe9\xeb\x77\xe7\xc7\xf5\x66\x6a\xd9\x56\x9d\x72\x0d\x56\x8a\x08\xf6\x2d\xfa\xef\xc3\x7f\x7d\xf3\xeb\xf0\xe8\xbb\xc3\xc3\x1f\x5f\x0e\xff\xf6\xd3\x37\x87\xff\x3a\x86\xff\xf8\x8f\xa3\xef\x8e\x7e\x75\xff\xf8\xe6\xe8\xe8\xf0\xf0\xc7\xbf\xbf\x7b\x73\x33\x3a\xff\x89\x1e\xfd\xfa\x23\x6b\xeb\x5b\xf3\xaf\x5f\x0f\x7f\x24\xe7\x3f\x7d\xe1\x4b\x8e\x8e\xbe\xfb\xfd\x86\x1d\x8d\x24\xe5\x4c\x25\xe2\x4c\x22\xdf\xcc\x48\xb8\xd9\x08\x42\x6a\xb8\x41\x62\x58\x05\xd2\x2e\xa0\xd1\x52\xdb\x4e\xd3\xb2\xff\xd2\xf7\x8a\xeb\x1e\x9b\xea\xab\x46\x9a\xeb\xa7\xe2\x77\xc0\xec\x42\xb9\x56\x9c\x37\x8f\x38\x81\x1a\x77\x49\xe6\x44\x0c\x5c\x1f\xde\xea\x57\x8e\x22\xdf\x18\x42\x1e\xd6\xbd\x2f\x92\x3a\x2f\x72\x83\xb8\x79\x79\xca\x95\xbc\x01\xa6\x3a\x3b\x5a\x10\xdc\xc7\xe8\x23\x16\x94\xb7\xd2\x6a\xc8\x48\x1b\xe1\x9c\x81\x92\x61\x98\x10\xfc\x65\x0f\x81\x17\x93\x36\xb1\xa9\x90\x71\x4d\x7a\xea\xe1\xd2\xd2\x48\xf9\xa9\x3f\xf5\x97\xe4\xd9\xfa\x5b\x9b\x6e\x6a\x22\x36\x82\xcc\xdd\x30\x84\xe3\x12\x22\xca\xd4\xdc\xf0\xa3\x32\x16\xc1\xda\x2b\xda\x29\x34\x9b\x3a\x0b\x82\x29\x83\x46\xdd\x18\xe1\x42\x8b\x89\xbd\x42\x75\x26\x3a\x75\x8c\x60\xb0\x6e\xc6\xeb\x1e\x7c\x1a\x77\xcc\xe2\x85\x63\x2c\xdd\x5e\xb3\x3c\x1b\x4f\xb9\xff\x2f\x26\x3d\xa8\xa4\x0f\xdd\x77\xd4\xae\x7e\x1a\xd1\x0b\x73\x20\xe0\xaa\x1f\x16\x82\x2a\x5a\xe0\xea\x45\x04\x42\xd6\xbd\xa8\xa8\x5a\x6d\x70\x85\xef\x12\x04\xa9\x3b\x6e\xfa\x84\x2b\x74\x4b\x16\x77\x5c\x94\x4e\xfb\x0b\x01\xb3\x9b\xc6\xa2\xf5\xc6\x90\xca\x0d\x07\x00\xf7\x5a\x24\x9b\x50\x8d\xa8\x89\x40\x63\xe2\xd0\x65\x4b\x3f\x5e\x1c\xa3\x53\xb6\x30\x8a\x57\x84\xfd\xef\x23\x27\x41\x31\x58\xd0\x6e\x8d\x25\xd2\x3b\x0d\x56\xeb\x71\x7d\xc3\x2a\xaa\x2a\xdc\x7a\x68\x90\x36\x79\xbc\xe0\x71\x7a\xab\xc3\x06\x71\x61\x69\x6b\x41\x20\x09\x43\xf2\xbb\x29\x06\xd8\xbe\xec\x49\x6e\x0b\xad\xf5\x53\x46\xa4\x7c\xa3\x37\xec\xf6\xce\x0c\x06\x05\xdc\xf6\x05\x88\x6e\x3b\x7a\x28\xa2\x25\x93\x49\xd9\xd3\x2a\x01\x2f\xbb\x5f\x6e\xba\xa4\xa7\x0e\xeb\x02\xd6\x8e\xa1\xa0\xd6\x4d\x53\x25\xc3\x00\xaa\x09\x74\xea\x5f\x9c\x5e\x6e\x1a\x66\xb3\x1c\x57\x46\x85\x96\xdd\x18\xbb\xf2\xa0\xfd\x51\x82\x2d\x66\x79\x89\xc8\x2f\x2d\xae\x00\x39\x79\x23\x5a\xb2\x69\x65\xe1\x28\x83\x83\xa8\x3b\x2e\x6e\x4f\xfe\xfc\xd7\x97\x60\x73\xf8\xde\x0d\xa7\x1b\x5f\x51\xb1\xf9\xde\x51\x99\xde\x4b\xc5\xcf\xcb\xab\x70\x23\xbb\xb5\x74\x0e\x0d\x8b\x89\x35\x15\x39\xf4\x0e\xf0\x0b\x14\x85\x35\x88\xca\xeb\x8e\xcf\xe8\x1e\x76\xdd\xbd\x59\x34\x9b\x2b\x49\xf1\xc9\xd8\xbd\x76\x93\x41\x9f\x67\xe1\xdb\xcc\xaa\x48\xb3\x24\xbe\x9d\x00\xba\x70\x20\x83\x8f\x81\x22\x07\xa4\x39\x40\x6a\xe0\x86\x59\x34\x09\x74\x40\x59\x10\x8d\x91\x78\x11\xe7\x60\x03\xd6\x8e\x27\x95\xb9\x57\xbd\x96\xed\x4d\xea\xd4\x82\xa5\x2f\x7d\x05\x0c\xcb\xf9\xb4\xa9\x7a\x62\x58\x40\xa1\x48\xa5\xaf\x78\x66\x9d\x3f\x00\xcc\xaa\xb4\x19\x57\x1a\x36\x53\x2c\x94\x51\x98\xdd\xd4\x6c\xaa\x1b\x77\x3c\x30\x25\x41\x78\x8e\x69\x05\x68\x78\x70\x25\x71\xd9\x03\xc7\x98\xc1\x16\x9c\xc9\xb6\x86\x1e\x6d\x1a\x4a\x1b\x2f\xac\x36\x11\xe3\xdf\xa4\x86\xe4\xb1\x6a\x66\x9f\xa6\x83\xdf\x5c\x35\x7b\xbd\x60\xb8\xa6\x85\x5b\xc5\x53\xb3\x6c\x40\x24\xd9\xa3\x8f\x8f\xf7\xca\xea\xee\xd7\x75\xab\xf4\xd4\xc6\x28\x27\xdb\xb8\x19\x22\xc2\x3e\x70\x99\x04\x47\x21\xcc\xa9\x20\xf7\xb8\x50\xd5\x02\x22\x2a\xbd\x1f\x0d\x10\xa1\x90\x77\x6a\xe0\xe8\xd5\xe6\x8c\x27\x5c\xd8\x9d\x65\xf4\xd9\xde\xdb\x6f\x48\xdd\x00\x9b\xa1\x55\xe0\xa5\xa1\xfd\x55\xad\x60\x8e\xc8\x74\xe9\x2f\x36\x6e\x3e\x00\x25\x46\xe4\x91\x5d\x28\x84\xcb\x52\x22\xec\x8b\x29\x51\x65\x14\xef\x96\xd1\x5f\x5a\x52\x2d\x10\x2d\x09\x53\x1d\x70\xad\x3f\xc5\x96\xef\xc9\xca\x87\xcd\xc5\xfa\x59\x77\xbe\x8d\xba\x4f\x48\xe9\x2a\x10\x59\x7f\xf2\x03\x6b\x6a\xdc\xbf\x60\x26\x68\x5d\x3d\xc2\x4c\xd8\x92\x4e\x10\xc1\xce\x92\xa2\x0a\xc4\x32\x12\xe4\x48\xfb\x80\x30\xec\xfa\x8d\x64\x48\xa4\x4d\xbc\xaa\x58\xde\x4a\x11\x00\x48\xf3\x74\x9c\x09\xfa\x02\x44\xaf\x2f\xaf\x7f\x7e\x7b\xfa\x5f\xe7\x6f\x9f\x9c\x09\xb2\xa7\x2a\x6c\xee\xd5\x30\x4f\x8e\x25\xb8\x5a\xee\xc8\x72\x58\x7c\x49\xfe\x38\x0b\xdc\xea\x73\x32\x96\x4a\x88\x39\xd4\x98\x29\x9f\xee\x10\xfd\x51\xef\x3a\x0f\x84\x37\x9f\xac\x19\x92\xbe\x8a\xd7\xca\x5d\x5f\x12\x2c\xaa\x5d\x13\xd7\xda\xee\xde\x09\x47\xb2\x13\x7b\xa8\x37\xb5\x9f\xde\x4b\xee\xa7\x51\x8d\xae\xee\xc3\xac\x7b\x0a\x58\xb2\xfd\xed\x1c\x64\x86\x01\x2d\x90\x09\xbe\x62\xc4\xc8\xdd\xb2\xba\x60\x6e\x72\xfd\x17\xb1\x7b\x6a\xcc\x5b\x56\x9a\xdb\xcd\x0e\xc1\xf8\xbe\xc3\x94\x9e\x92\x54\x44\x39\xcf\x55\x9a\x82\x80\x9c\x9a\x0d\x4c\xaf\xe0\xf3\x82\x77\x1b\xc5\x1d\x0a\x9e\xb9\x33\xe4\x25\xb2\xfe\x64\x80\x70\xc5\xd9\xd4\xd2\x0b\x47\x35\xdb\xa5\xfb\xfb\x28\xc2\x60\x65\xb2\xa1\x66\x2e\xb6\xd7\x84\xe9\x8b\xd5\x69\xd2\x37\x6b\xb8\x5c\xba\x4d\x41\x0a\x2e\x4a\xe3\xd3\xd1\x13\x6f\xdc\x37\xc7\xbd\x13\x77\x0d\x9f\x11\x19\xbd\xb1\xd6\xea\xdd\x30\xbf\x8c\x43\x55\x8e\x69\xe0\x23\x03\xc3\xc7\x68\x3a\x51\xcd\x2d\x85\xca\x7b\xa2\x3c\x20\x7f\x10\xbc\x42\x4d\x85\x19\xb1\xe5\x40\xbc\x03\x36\xcb\x34\xef\xe5\xfa\xe7\x9e\xaf\x20\xab\xd2\x9b\xf8\xdb\x70\x7c\x78\xce\x65\x53\xd9\x00\x1b\x22\x15\x3e\x41\x67\xa3\x0f\xb0\x4d\xde\x91\x9a\x8b\x45\xd7\x49\xaf\xa2\xeb\x53\x80\x37\x16\xd6\xeb\x93\x72\xb4\xb9\x64\x21\x82\xce\x41\xbc\x30\xc7\xce\xa2\x74\x74\x4f\xde\xd2\x9a\x2a\x48\x16\xdb\x34\x2e\x54\x34\x2d\xc4\x93\xd0\x8b\x1a\x46\xf3\xa2\x2f\x90\x25\x32\xcc\x3a\x4b\xfe\x1e\x2c\x88\x09\x77\x38\xec\x62\x8a\xab\xc0\x84\x57\xf5\xbf\x18\x19\x4e\x05\x86\x80\x8d\x13\x20\xdc\x54\x5b\xb1\x5d\xc2\x81\xa3\x22\x4a\x5e\x6b\x6b\x40\xc0\xc4\x0e\x8c\x57\x49\x4f\xa5\x7f\xbd\x9c\x61\x01\x16\x75\xad\x2f\xa1\xfe\x7a\xe0\xa8\x8b\x7f\x53\x3f\x8e\xb6\x68\xdf\x92\x39\xa9\xba\x4d\x68\x3d\x32\x1b\x36\xbc\x79\xf9\xbf\x68\xd3\x34\xde\x52\x2c\x22\x9c\x9a\x28\x8b\x82\x69\xf7\xb1\x16\x4c\x9d\x3a\x29\xf5\xe1\xf6\xa7\x79\xd0\xcb\x5b\x6e\x48\xd1\xbf\xb2\xa3\xaa\x21\x81\xbf\x41\x1f\x9e\x8e\xaa\x3d\xa4\xce\x8f\xba\xd3\x1e\xd9\x55\x88\x1e\xcf\x5d\x88\x3e\xe1\x32\xd4\x62\xaf\xc0\x0c\xc4\x8f\x03\xfb\xe9\x23\xdf\x1d\xca\xcd\xef\xd2\x14\x8e\xe1\x68\x86\xe1\xde\x5e\x7d\xd0\x57\xa8\xd5\x11\xc2\x94\x58\x58\x00\xe8\xb5\xde\x6f\x7d\xa1\x1b\xaf\x3b\x44\x53\x0b\xa7\x11\x0b\x47\x93\x02\xa7\x52\x02\xa7\x10\x62\x66\xab\xd6\xf9\x09\x4e\xf6\xde\x62\x83\x49\xb0\x2a\x5d\x62\xab\xdc\x20\x0b\x47\x1e\xf1\x12\xdd\x01\xaa\xa0\x4f\x98\x60\x0a\x02\x5f\xe8\x6e\xdd\x76\x85\xce\xdc\xf5\xea\x82\x21\xd1\x4d\x5b\x87\x5a\x32\x27\x76\x06\xce\x28\x0b\x63\xde\xf6\x46\xb0\x7a\x5a\xcf\x6d\x51\xcc\xb8\x24\xcc\x82\xe1\x85\xfb\x01\xeb\x07\xa0\x4b\x73\x3d\x26\x55\x90\xb6\xc4\x1d\x64\x4e\xc4\x42\x41\x24\xd4\x13\x19\x5b\x07\xa8\x5c\x0a\x83\x05\x60\xe7\xe8\x86\x41\x66\xdb\xec\x00\x00\xba\x4c\x9c\xf3\x15\x46\xba\x95\x1d\x91\x97\x69\x29\x52\xb4\xe5\x23\x58\x82\x52\x49\x5b\xd1\x9c\xac\xa9\xd1\xb1\xe3\x03\xc7\x24\xbe\x87\xd2\xc0\x9d\x8d\x54\xf0\xba\x69\x55\x10\xa4\x75\x41\xdc\x98\xd5\x4f\x22\xab\xa8\x31\xc3\x53\x32\xf4\x1d\x19\x06\x09\x49\x91\x2a\x44\xe4\x85\x9a\x03\x2b\x8f\x9e\x13\x5e\x1e\xc5\x63\xe6\x51\x06\xdc\x3c\x4a\xc5\xce\xa3\xbc\xf8\x79\xd4\xdd\x4a\x5b\x39\xba\xde\x65\xb0\x74\x78\x6d\x5d\xef\x4f\x1d\x5e\xa7\x09\xc6\x9c\x5e\x20\x0d\xb6\x2d\x53\x89\x78\x4d\x95\xc3\xe7\x05\x7a\x02\xb0\x86\x86\x34\xa5\x56\xd0\x00\x3a\x12\xc3\xfd\x49\xee\x9b\x8a\x16\x54\x05\x1c\xce\x65\x8c\x15\x16\xd0\xd0\x72\x6d\x36\xd1\xda\xa5\xc9\x43\xfd\x47\x67\xf6\x59\x6c\xba\xef\x7b\x61\x38\xd2\xc8\x7d\x41\x88\x73\xb9\xec\xa5\xd9\x5e\x9a\x7d\xe1\xf3\xb5\x49\x33\x5b\x8f\xf9\xe9\x53\x81\xae\x4c\xc3\xa8\xe9\x52\x7f\x56\x6a\xc5\x7a\x3e\xd6\x88\xb0\xbe\x4d\xfa\x39\x85\x6a\xf2\x03\xf4\x9e\x7d\x6f\xaa\x7c\x0e\x4c\x1e\xd0\x31\xba\x60\x48\xf2\xda\x56\x24\xbd\x57\x72\x60\x34\x5e\x8c\x64\x3b\x96\xc4\xea\xbb\x5c\x12\x97\x31\x6c\xd3\xae\x1b\x22\x8c\xe8\x8b\xcc\x19\xd2\xd2\xca\x74\xea\x91\xc9\xbe\xee\xb8\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\xff\x0c\x3d\x59\xde\xc9\xef\xec\xba\x0f\x9b\xcd\xb9\x44\x62\x71\xe7\x41\x32\xe6\x53\x67\x6b\x5c\x2d\xb5\xdd\x83\xa2\xf6\x52\x59\xfb\xc1\x63\xe0\x64\x33\x68\x6a\x34\x15\xbc\x6d\x5c\x58\xb0\xe3\xfd\xd5\xa6\xf8\xa6\xf0\x21\xae\x27\x23\x08\xe2\x9a\xbc\x83\x7e\x47\xbc\x39\x0f\x9e\x07\xd2\xd9\x9d\x60\x51\x4a\x39\x58\xcb\xbe\x2e\x5a\x16\x91\xf3\x60\x12\x60\xb9\xe8\x28\x22\x09\x7a\x51\x91\x29\x2e\x16\x2f\xfa\xbd\x5a\xc3\x84\x6a\xbd\x96\xfa\xfa\xd5\xd7\xba\xe9\x9d\x2b\x2d\xbb\xa9\x63\x1f\xea\xd5\xc2\xd5\x6d\x50\xc0\x06\x50\x26\xed\xf0\x5d\xce\x85\xdd\x4a\x36\xf7\x7f\x63\xe7\x44\x74\x9a\xee\x9f\xff\xfa\xe7\xa1\x63\x3f\x80\x61\x3e\xc5\xb9\xe9\x91\x6d\x6e\x2f\x5d\xa3\xb7\xdb\xc6\x04\x95\x54\x36\xb0\x33\xc1\x03\xde\xe5\x3c\xf8\xee\xe6\xcb\xbd\x59\xdf\xa4\xdb\x0c\x91\x0d\xa6\xad\x06\x65\xd3\x27\x4f\x9f\xb9\xee\x37\x6d\xcf\x1d\x6f\xf0\x2f\x6d\x57\x51\xd6\x5e\x56\x46\xd9\x0e\x16\xd0\x4e\x22\x94\x58\x0d\x58\x5e\x23\x2f\x57\xbd\x35\x56\x7b\x03\x7a\x75\x27\x41\xfc\xd2\x49\x85\x17\x4e\xa2\xf6\x07\x51\x42\x1a\x0c\x71\x35\xb4\x36\xec\x45\xc7\x4d\xeb\x45\xa0\xd6\x42\xeb\x06\x2e\x59\xf7\x6d\x34\xc6\x75\x79\xbe\x97\x03\x19\x58\x99\xc4\x12\x00\x44\x58\x7e\x0a\x53\x47\x05\xf0\x22\x35\x9f\x03\xbb\xa7\xd6\x29\x26\x8a\x88\x3b\x2c\xca\x0d\xef\xfc\xad\xa6\xd7\xf4\x87\x0f\xbb\xad\x23\x05\x81\x8b\x73\x64\xd8\x4c\xa7\x2d\x16\x25\xe4\x53\x75\x7b\x62\x8f\xa8\x5d\xf7\x6c\x1d\x51\x6b\xb3\xa6\x03\x01\xb0\x79\x84\xd9\x3d\xe7\x58\xeb\x41\xfd\x37\x99\x58\x09\xe4\xb7\x2d\xe1\xb2\x20\x43\x7a\x8f\x9b\xd9\xc8\x45\xbc\x44\x14\xf6\xa4\x77\x4d\xbf\x69\x34\xe3\x55\x09\xca\xea\xb0\x22\x73\x52\xf9\xae\x69\x81\x2b\xe8\xb8\x55\x96\x70\xa9\xe0\x75\x6d\x73\xdf\x6d\x19\x79\x93\x27\xbf\xb1\xb1\x63\xf8\x01\x71\xf5\x6d\x8f\x6b\x01\x6e\x97\x63\xdd\x3d\x02\x3b\x23\x1c\x25\x98\x90\x4e\x29\xb0\xd7\x20\x9f\x20\xa2\xb7\x69\xc4\xf6\xdb\x02\x90\x62\x89\x7d\x71\x1b\xce\xc5\xa5\x2e\xb8\x78\xd7\xa9\xfd\x18\x71\x43\xdb\xa8\xd7\xa2\x95\x64\xa5\x48\x54\xc7\xab\x15\x09\xc4\xbf\xe4\x90\xa4\x0e\x25\xbf\x7d\xc0\xb3\xf0\x65\x0d\xf4\xb5\x0b\x19\xbc\x10\x6b\xe5\xf2\x98\x59\x2c\x71\x34\xbf\x5a\x92\xf3\x2c\x25\xb2\x6e\x9c\x40\x1b\xff\x61\x5a\x54\xbd\xe2\x05\xae\x80\x4b\x38\x76\x8b\xa1\x6c\x41\xd5\xe5\xbe\x04\x24\x0a\x58\x0f\x13\x3e\xab\x38\x2e\x1d\x47\x3a\x71\xe5\x10\xb0\x5a\xb2\xbf\x63\x63\x91\x86\xc4\xc4\xb4\xe4\x72\x3f\x1a\x41\x02\x2e\xab\x5e\xc3\x1c\x2a\x90\xc4\x36\xf6\xae\x0f\x23\xb0\x23\x0b\x39\x06\x6d\x57\x92\x1a\x70\x04\x64\x13\x10\xc7\xbe\x9e\xa5\x96\x95\x54\xa2\x17\x6f\xdd\xa4\xbf\x48\xa9\x72\x1d\xed\xb8\x54\x91\x49\xc5\xb9\xf6\x9c\x99\x07\xbf\xcf\x8c\xff\xe2\x96\xea\x99\x9a\x74\x42\xce\x6d\x09\xcf\x49\xd7\x34\x15\x8d\xdf\x65\x1f\x71\x45\x4b\x2f\x39\xb1\x48\x28\xf3\xea\x97\x0f\x0d\x83\x43\xd2\x08\x32\x5c\x3d\x28\xf1\x90\x03\xeb\xf1\x71\x0e\xcb\xe1\x67\xeb\xe3\x24\x6e\x5c\x84\x3e\x30\x38\x73\x8c\x94\x5a\xdb\xe2\xdd\x52\x10\x36\xe1\xc2\x38\x63\x9e\x7c\xc3\x5a\x82\xed\x6d\x5c\xc3\xa7\x9e\xc8\x25\x64\x7f\x36\x2e\x48\x0b\x3f\x84\x3d\x69\x3c\x98\x7d\xb7\x79\x87\x72\xdd\xbc\x5d\x28\x06\x60\x4b\x9b\xe9\x99\xb3\xf1\x7e\xd8\x00\x7f\xb7\xb5\x59\x94\x4b\x45\x30\x74\x82\x77\xba\xd1\x19\x6d\x8c\x10\xc3\xca\xfe\x79\x8c\x70\x80\x1c\x13\xfd\x42\x5f\x7d\xb2\xe1\xe5\xb7\x31\x78\xc4\x57\x26\x45\x85\xdf\x01\x69\xe5\x9b\x8b\xd7\xfe\x2c\xeb\xb7\x7e\x7f\x1d\x43\xfb\xad\x9f\x3f\x98\xf7\x4a\xa2\xa6\xb4\x44\x63\x5b\x1e\x94\x28\x74\xc8\xc8\x1d\xd2\x67\x40\xda\x14\x20\x4f\xfe\x61\x67\xd3\xb5\xef\x87\x67\x3b\x71\x14\xd1\x8b\x3f\xda\x04\x1c\x22\x1c\xd7\xd4\x98\xda\x62\xe7\xef\xaf\x0e\x1c\x63\xe7\xdd\x50\xdc\x0d\x87\xc3\x61\xcc\xfc\x39\x9f\xf0\xa0\xb7\xf2\xde\xcb\x52\xf3\x92\x4e\x16\x4b\xeb\xaf\xef\x9b\xae\x4b\xa0\x7b\x63\xb6\xb0\xe3\x7f\x46\xba\x60\x6c\x64\x2f\xa0\xb1\xfa\xcb\x9f\xe2\x44\x4d\xc8\xe5\xbf\x0d\xb1\xb3\xa6\x1b\x9e\x31\x62\x4c\x66\x78\x4e\xb5\x09\x30\x31\xe7\x5f\x9f\xac\x87\x56\xdf\x69\x34\xd1\xb2\xc0\xb2\x47\x18\x66\x29\x72\xdf\x70\x09\x27\x0a\x60\x89\x23\x0e\x19\x68\x7d\xea\x58\xe3\x67\x6b\x1a\x28\x9a\x18\xd1\x60\x4f\xe8\xd9\x18\x8f\x49\x8b\x70\xb3\x82\xc6\x58\x77\xc2\x0f\xf9\x70\x69\xc3\x47\x55\x3a\xbc\xb0\xa7\x0a\x5c\x26\x8c\x23\x32\x99\x90\x02\x4a\x12\x91\x66\x46\x6a\x22\x70\xd5\xef\x9a\x6c\x8b\x19\xc2\xf2\x5b\x6d\x81\x0b\x7d\x40\x8d\xb2\x5a\xe3\x8d\xcb\x0d\x20\xcb\xd8\x01\x36\x75\x49\xa3\x20\x9e\x46\xb5\x09\x18\xaf\x5f\xbc\x67\x57\x9c\xab\x77\x54\x82\xa6\x6b\x93\x52\x4c\xbc\xf3\xc5\xf1\x1a\x1f\xbf\xfb\xce\xa3\x5a\x9f\x8f\xa0\x88\x52\x2a\x3a\xb2\xf7\x6d\x1c\x70\x7d\x6d\xe8\xdb\xd0\x47\x20\x2d\x84\xb9\xe1\x94\xa9\x95\xb2\x42\x5a\xaf\x2b\x22\x28\xb7\xf4\xf3\x41\x12\xe9\xe3\x74\x4e\x4f\x8c\x63\xc5\x34\xcf\x3b\xbc\xf0\x79\xa8\x96\x62\x79\xc9\x49\x65\xe2\xa8\xf6\xbb\x31\x57\xb3\x15\x2f\x56\x5c\x4d\xea\x11\x2f\x97\x5e\x34\xe8\xd8\x13\xfb\x6c\x5f\xcb\x0d\x2a\x80\x67\x6b\x93\x92\x94\x84\x6d\x5c\x08\x05\x79\x96\x0e\xac\xd2\xb0\xd8\xbf\xa1\xbb\x14\x4e\xd8\x25\x07\x39\xb4\x8d\x33\x76\x11\x70\x41\xc2\x7c\x87\x27\x0a\xbc\x0c\xfa\xe8\x61\x60\x4e\xe1\x6c\x28\x38\x87\x08\x77\xd4\xb2\x5e\x4c\x6c\xf5\xfe\x15\x35\x6d\xae\x25\xb3\x2b\x91\x0e\x25\x45\x11\xee\x02\xe7\x8a\x23\xc2\x64\x2b\xec\x9e\xd8\x98\x11\x55\x3f\x25\x27\x26\xe4\x67\x87\xf3\xe1\xe2\x35\x7a\x89\x0e\xa1\xe8\x2f\x88\xfd\x09\xa6\x95\x27\x7b\x5a\x2e\x72\x0a\xa5\xea\xf5\x2b\x22\x87\xed\x21\x0b\x13\x5c\x49\x32\xd0\x77\x27\x5c\x8d\x76\xdc\x5a\x07\x71\x2a\x77\x43\x04\x10\x55\xc6\x81\x96\xbf\x06\xb1\x13\x7b\x7c\xc7\x9c\x57\x64\x63\x10\x87\x2f\x96\xb2\xad\x1b\xee\xc3\x93\xdc\x70\x61\x5c\x42\x9f\xdf\xfe\x92\x98\x23\x57\x13\x85\x4b\xac\xb0\xbd\xf9\xdc\x0f\x7e\xb3\x1b\x71\x7f\xff\x7d\xd9\x93\x72\xff\xd9\x02\x5b\xdb\xb6\x25\xd7\x74\xc3\xdb\x92\x33\xeb\x52\x0a\x8b\xd1\x5f\x9f\xc3\xef\x4d\xc5\x54\x40\x1b\x18\xaf\xab\xf3\x70\x19\x2b\x48\x06\x39\xb7\x91\xc4\x61\x60\x74\xcd\xb0\xec\x9b\x5b\x8c\x97\xee\xc6\x2e\x79\x98\x15\xef\x3b\xa6\xf7\x21\xf7\xdd\xf0\xb7\xdf\xd2\xcf\xf2\x58\x51\x50\xc8\xca\x84\x40\xad\x09\x75\xa5\x4f\x96\xa4\x73\xf2\x22\x2a\x41\x37\xf8\x7b\x54\x13\xcc\x24\x12\x04\x66\x1a\xac\xf8\x09\xcc\xb0\x71\x5f\x71\x43\x8f\x3b\xe2\xa5\x1f\xeb\x72\x94\xcf\xa9\x11\x31\x63\x35\x3c\x5b\x06\x4a\x2b\x2b\x7e\x07\xe7\xbb\xc2\x62\xea\x9c\x05\x72\x80\xc6\xad\x32\x7e\x47\x89\x6a\x7a\x0f\x95\x00\x7c\x99\x32\x98\x8d\x96\x05\x1f\x8c\x78\x29\x7d\xce\xbf\x67\xfc\xb1\x46\x33\x0f\x49\x80\xc0\x29\x1e\x33\x79\xbd\xe5\x80\xfc\x0a\x70\x8c\x22\x52\xd1\x29\x54\xa3\x0e\x67\x0b\xbc\x6f\xff\x33\xe4\x0e\x58\xfc\x3f\xc8\x66\x64\xc0\xdf\x47\xcf\x99\xcf\x02\xb7\xab\x23\x5d\x20\x0c\x5b\x96\xcd\x70\xd8\x36\x3c\xeb\x3f\xee\x1d\xae\xc8\x23\x63\x01\x5e\x0d\x97\xa6\x02\xb7\xd6\xec\xd6\x36\x6e\x78\x17\x3e\xb7\x64\x31\xbd\x38\x77\xf3\xed\xe6\x1a\x03\x90\x73\xa8\x04\x21\xe8\x7b\x3a\x16\x44\x8b\x1b\x46\x2a\x68\x92\x5e\x9f\x5d\x5f\x74\xbb\x4a\x7f\xa4\xe7\x2e\xf8\x30\xa2\x0b\x77\x00\x09\xd7\xef\x28\x05\x9d\x13\x81\xf4\x1d\xd2\x42\xf6\xb7\x9b\x64\x27\x11\xc6\x0b\x5f\x25\xc0\x16\x76\x84\xef\x61\x33\x19\x9c\xbe\xf5\x11\xd3\x98\x34\x82\xb3\xeb\x8b\xd7\xa6\x07\x94\x49\x85\xb5\x96\x87\xde\x03\x1f\x65\x38\x39\x18\xbc\x2b\x48\x90\x21\x2c\x7d\x45\x4a\x24\x9c\x24\xa8\x36\x2e\x7b\x81\x56\x0e\x83\xd1\x01\x02\x72\x57\xf0\xc3\xc1\x55\x6a\xa7\x03\x7e\xde\x63\x18\x08\x8a\x31\x44\x1d\xc7\x65\x27\x12\xac\xec\x97\xb4\x36\x58\xea\x7c\x82\xcb\x69\xf3\x3e\x94\x54\x7e\xaa\x13\x20\x07\xaf\x08\x2e\xff\x21\xa8\x22\xef\x59\x41\x02\x99\x12\xe9\xd9\x0b\x85\xbe\xcb\xaf\xe0\xe1\x16\x49\xe5\x7a\xc0\x70\x7d\x1a\x76\x99\x40\x26\x81\x33\xb3\x7f\x9f\x43\x2c\xc1\xf2\xa5\x5a\x6e\x84\x25\x55\x91\x8b\x75\x0a\xa4\xbd\x9a\x42\xbe\x88\x98\x70\x5a\x4f\x64\xf6\x24\xa3\x95\x59\x16\x4f\xd0\xfb\x6a\x8d\x06\x13\x16\x91\x92\xb6\x70\xb6\x01\x86\x4e\x89\x42\x52\xb5\xc5\xad\x1e\x85\xe7\x26\x3d\x73\x64\x59\x00\x73\x7d\x46\x8a\x6b\x94\x6f\xb3\x5f\xda\x75\x5b\xd6\x9f\xdb\x78\x85\xb3\x41\x78\x10\xc3\x5f\x8d\x97\xc6\xfb\x1f\xfa\x40\xf5\x15\xed\xc8\x51\xe7\x19\x2e\x6d\x84\x91\xc0\xac\xe4\xf5\x4a\xff\xf4\xc9\x24\xb8\x98\x45\xf4\xa3\x33\x89\x36\xb5\x0f\x63\x42\x32\x0f\x58\x94\x09\xf6\x61\x4c\x90\x78\xc9\xa2\x7c\xde\xf6\x61\x24\xee\x2c\x11\x04\x46\xe6\xa4\xca\x80\xc2\x01\x86\x2b\x3d\x09\x5e\xd4\xc3\x07\x46\xe0\x2f\x83\x14\x7a\x47\x64\x2b\xd8\x23\xc1\xb3\xe0\xdd\xae\xb8\x81\x45\x62\x3f\x6c\xfd\xe2\x9d\x1d\x75\x26\xc4\xd5\x8d\x05\x90\x75\xa3\x06\x28\xd5\xae\x8e\xba\x8d\xf2\x3e\xa2\xe5\x51\x7f\x90\xa6\x74\x58\x37\x6a\x70\xf4\xed\xe2\xa8\xfb\x45\xcf\xb7\x75\xf7\xda\x5e\xec\x61\xc2\xbd\x67\x0f\x13\x7e\x6c\x98\x70\xc0\xf1\x87\xc1\x8f\xd5\x03\xee\x3e\x57\xb0\x30\x30\xd1\xeb\x59\x24\x86\xa3\xb7\xc1\x6a\x36\x00\xc7\x9d\xa2\x73\xc7\xfd\x8b\x6e\x4d\xd8\xef\xa0\x57\x83\xd7\x1d\xc4\x0e\x47\x6d\xa8\xfe\x32\x61\x8b\xd7\xe1\x89\xcd\x6f\x2e\xdf\xdf\x84\x44\x7f\xd8\x95\x7f\x8b\x2e\xde\xb3\x2b\x37\xe0\xe3\x60\x8e\x97\xd7\xe9\xf1\x20\xc7\x91\x6f\x5a\x8f\x38\x7e\x8a\xf3\xf6\x65\x28\xe4\x65\x0c\x72\xa6\xc6\x97\x01\xc9\xab\x6f\x4f\x5a\xa1\x94\x8b\x3e\x00\x04\x03\x8e\x68\x2b\x86\xf6\xa9\x4f\x38\x06\x4c\x72\x2f\x5a\x03\x95\x21\xa9\x80\x32\x90\x10\x5d\x85\x48\x2c\x65\x26\x15\x2b\xa4\x0a\x8a\x31\x43\x1d\x61\xcd\x8a\xca\x65\x4a\x6e\xd6\x58\x2c\x00\xe2\x04\x08\x04\x8b\xdc\x3b\x0c\x33\xa1\x8f\xc0\x0e\x8e\x11\x24\x33\x82\xae\x57\x66\xdf\x95\x2e\xb6\xee\xbe\xd0\xdb\x18\x47\xd3\xba\xba\xc0\xae\x09\xd0\x72\x4a\xa2\x88\xa8\x6d\x11\x2f\xa2\x6c\xd1\x56\x49\xac\x2f\xdc\xcf\x4f\x1c\x00\x9b\x1b\x77\x32\xc1\xa5\xc3\xef\x1a\xcc\x79\x4d\xea\xb1\x81\x3d\xca\xd5\x92\xeb\x1e\xd4\x51\xe3\x69\x94\x8c\x5f\xf6\xa7\x30\x1e\xf0\x12\xf9\x1d\x26\x88\xfe\xd4\x4c\x2c\x6f\xa7\xb3\xd5\xae\xc5\xa0\x58\x3e\x39\x18\x88\x54\x49\xd5\x23\xbd\x28\x49\x63\xef\x63\x23\xf3\xb2\x2f\xf1\x33\x52\x88\x9f\x98\x85\x37\x95\x7a\x29\x25\xac\x9e\xb1\x1a\x20\xfa\xc4\x16\xd8\x86\x30\x7f\x1d\x84\xe5\x57\xf3\x4d\xa4\x43\xcd\x18\x99\xbe\x82\x9d\xb1\x91\xa6\x02\x57\x05\x14\xb9\x8e\xda\xbf\x6b\x42\xe0\x44\x4c\x89\x0d\x7e\x5f\x2b\x41\x0b\xb5\x1e\x3f\x6c\x7f\x97\x10\xcb\x39\x3c\xad\x9a\x19\x3e\x42\x1f\xa4\x8b\x20\x9b\xe3\xe3\x23\xae\x5f\x24\xf8\x21\xce\x63\x7c\xcd\xf6\x02\x88\x8c\xda\xac\x57\x73\xc0\xe2\xf0\x14\x77\x1d\x36\x1d\xbc\x9f\xd4\xf3\xcb\x3f\x23\xd9\x11\xa7\xfd\x2c\x64\xa1\xaa\xad\xa8\x3c\xd7\xa6\x69\x48\x85\x47\xd8\xeb\x3f\xbe\xb4\x50\xe9\x3a\xd7\xc5\xf3\x7c\xf5\x07\x08\x3e\x01\x30\xa0\x65\xbe\xda\x42\xcc\xc5\x61\x5b\x38\x7c\x08\x92\x71\x84\x6a\x3a\x9d\x29\x8f\xbd\xac\x70\xcb\x8a\xd9\x33\xda\x15\xdb\xe4\x75\x37\x2b\xec\x51\x4a\x18\xdd\x6a\x69\x5f\xa1\x06\x0b\x5c\x6b\xb5\xcb\x9e\x6f\x49\xa2\x22\x17\xcf\x92\xc5\x5d\xff\x29\x88\xe5\x88\xbf\xdd\x19\x06\xf8\x4b\x5f\x65\xcc\x76\x69\x01\xe8\x95\xa8\x65\x44\x39\x58\xcd\x61\x46\xb3\x0c\xed\x23\x04\xd9\x76\x65\x6c\x59\x55\x24\x2b\x49\xb6\x1c\x4e\xfe\x87\xe9\x85\xd3\x39\x0a\xcf\x68\xf2\xf8\x21\x65\xe7\xbf\xb1\x44\x98\xb8\x8f\x97\x5c\x8a\xc4\x86\xcc\x7c\x91\x1d\xf8\x0c\x74\x78\xbb\x88\xf4\xf8\x1b\xa9\x8a\xc3\x65\x6e\x31\x42\x3b\xad\x25\x3e\x13\x04\xaa\x9e\xe2\xea\xba\x21\xc5\x36\x1d\x98\x6f\xde\x5d\x9f\xf6\x7b\x03\xf7\xbc\x2d\x4b\x41\xe0\x7b\x84\x4b\x97\xfa\x79\x47\xc6\x33\xce\x6f\x23\x1b\x3b\x0c\x18\x19\x67\xed\xf8\xb8\xe0\x75\xc0\x72\x3a\x94\x74\x2a\x4f\xac\x60\x18\xea\x69\x3a\x42\x94\x55\x70\x5d\x3b\x7d\x88\x30\xe5\x4c\x96\x84\x01\xa3\xc2\x8f\x18\x36\x94\xa5\xde\xb4\x7a\xd7\xea\x94\x5c\x26\xb1\x5c\x25\x5f\x29\xab\x3b\x26\xb6\xec\xe7\xd2\xae\x79\x60\xa4\x4b\xe5\x3b\xfd\x36\x58\x9e\x35\x13\x00\xdc\xca\x94\xd8\x98\x91\x36\x51\xb7\x79\x7a\x7e\xe8\xba\x11\xfa\xee\xe8\x24\x94\xe7\x81\x5f\xd9\x27\x87\x1d\xe8\xbf\x44\xf6\x4f\x0f\xd2\x4b\xb1\x9c\x56\x95\xd1\x13\x46\xbc\x3c\x90\x61\x30\xb6\x23\x6d\xf3\xd8\x37\x03\x8c\xa7\x73\xd2\xeb\x7f\xac\x22\xa8\x9f\x43\xea\x21\xc4\x0e\x2b\xaa\xb8\xa3\x8a\xab\xe9\xbd\xee\x5b\xd8\x56\xd0\x3f\x53\x00\x93\x0d\xd7\x7f\x1d\x95\x77\x8d\x20\x51\xcf\x7b\x19\x07\x7a\x3d\xc2\xd7\xeb\xfd\x2d\x5a\x62\x8a\xae\xeb\x2f\x2e\x89\xba\xe3\xe2\xd6\xcc\x55\x88\xb3\x52\x1c\x7e\x99\xb2\xc5\xe3\xd2\xac\x50\x98\x6a\x95\xe9\xb4\x47\xef\x72\x48\xbb\xb2\xfd\xd0\xf7\xbf\xd3\x9a\x1e\x3f\x0d\x0b\x2d\xa5\x62\xfd\xff\xec\xbd\x7b\x73\x23\xb7\xb5\x20\xfe\xff\x7e\x0a\x94\xb2\x55\x92\x1c\x92\x33\x63\xe7\xb5\xb3\xf9\x25\x25\x4b\x9a\x44\xeb\x19\x8d\xee\x68\x6c\xd7\xfd\xc5\xd9\x1b\xb0\x1b\x24\x71\xd5\x0d\xb4\x01\xb4\x24\xfa\xe6\x7e\xf7\x2d\x9c\x03\xa0\xd1\x14\x45\x91\xdd\x90\x48\x4d\x84\x54\x65\x2c\xb2\x09\x9c\x06\x0e\xce\xfb\x61\x27\x7e\x82\x74\x2c\xb2\x3c\x25\xeb\xae\x88\x34\x7a\x9c\xa4\x2c\xb2\xed\x0c\x41\xd2\xa3\x86\x2e\x53\xd7\x3c\x63\x47\x59\x06\xa1\xf0\x1b\x2d\xdd\x0f\x5d\x4f\x98\x7d\x65\x6a\x58\x7e\xd9\x82\x01\x83\x7c\xf2\xf0\x2d\xa1\x05\xa7\xd0\x89\x93\xb4\x1f\xb4\xf8\xbd\x79\xe1\x77\x3f\x2d\x44\x14\x2d\xbc\xbe\xbb\x31\xe0\x73\x79\x9a\x0a\xc6\x77\x96\x7f\xda\xc2\x92\x77\x5f\xfe\xae\x2c\xb1\x70\x3a\x3e\x9d\x65\xa1\x6e\xfa\x86\x4b\xaf\x57\x3f\xdf\x50\x7d\xd5\xb4\xeb\x60\xc3\x4a\xe6\x4d\x77\x8e\xe8\x73\xb7\x8d\x43\x8a\x30\x6e\xd6\xb6\xa3\xf3\xd1\x19\xcb\x8b\xec\x4e\x1d\xe9\x77\xff\x76\x72\xfe\xc4\xe5\xc0\x3d\x4b\xb4\xbb\xbf\xaf\x41\xc2\x82\x53\xf3\xba\x67\x14\x80\x42\x75\xf4\xa0\x05\x75\x40\x14\x75\xde\x4a\x8a\x0c\xa1\x60\x14\xcd\xa7\xe4\x20\x2a\xee\xbe\x31\x3b\x3f\x13\xa4\x09\xa8\x46\x91\x60\x80\x38\x82\x89\x6e\x3e\x07\x07\x2a\x3f\xfd\xdb\xc9\xb9\x77\xf5\x05\xe8\x51\x91\x74\x98\xe7\x4c\x7e\x07\x3e\x98\xa1\xfd\x84\x36\xaa\xce\x0c\xa9\x8d\xb6\x9f\x77\x01\xd5\x33\xc6\x35\x80\x55\x6c\xca\xb5\x51\x73\x47\xcf\xe5\x24\x02\xd9\x19\x97\xc3\x23\x57\x6c\x4e\xfe\xfa\xdd\xe9\xbf\xff\xc7\xfb\x8f\xc7\x47\xef\xff\xe3\xc3\xd1\xf1\x5f\xcf\xce\x4f\x7f\xfa\xe9\xf2\xdf\x2f\x3f\x9f\x7e\xf8\xe9\xa7\xe3\x5a\x29\x26\xcc\x31\xf6\xe3\xbd\x64\xe6\xa7\x9f\xdc\x1d\xd3\x3f\xfd\xf4\x39\xab\x78\xf5\xd3\x4f\x17\xde\xcc\x09\x7c\xd4\x6e\x55\x87\xb2\xe0\x50\x7a\xac\xc9\x8e\x04\xf9\x0e\x8f\x1f\xde\xb2\x95\x77\xd9\xa3\x83\x06\x64\xfd\x77\x21\x97\x9b\xcb\x5a\x90\xe4\xe6\xe4\xc2\x73\x6f\xec\x7f\x52\x92\x09\x59\x76\x94\x68\x2e\xa6\x50\xed\x0f\x45\xd4\xe0\x78\x20\x63\x66\x6e\x18\xc3\xbc\xcd\x45\xd1\xaa\x7b\x3d\xb8\x1f\xad\xe8\x6b\x5c\x5b\x5a\x2b\xc0\xb4\x5a\xb3\xb8\x30\x25\x97\x08\x78\xcd\xd9\x0d\x88\xe9\x9a\x4f\x05\x2d\x22\xd7\x20\x74\x2a\xc4\x08\xb0\xe6\xf7\x1b\x42\xc2\xa3\x24\x4e\xec\xf9\xec\xdc\x64\xed\x28\x93\x3b\x11\x26\xad\xce\x18\x54\x5b\xd8\x58\x4e\x2e\xce\x4e\xc8\x9b\x4d\x37\x03\x74\x03\x17\x55\x72\xb9\x0c\x21\x82\x21\xca\x8a\x78\xdd\xda\xc4\xdf\x29\x79\xfc\xd4\x88\x5e\x8f\x73\x59\x52\x2e\xb6\xdb\x64\x62\x52\x17\xc5\x9c\xfc\x5c\xd3\x02\xa5\xd7\x0b\x99\xdf\xe5\x34\x7b\x7f\xf4\x1f\xfd\x69\xf4\xc7\x00\xf8\x9f\x46\x7f\xb4\xd4\x27\xdc\x8c\x3f\x8d\xf4\x75\x36\xfa\x63\x56\xd4\xda\x30\x45\xdc\x43\x1b\x97\x3e\x7d\xa0\x33\x45\xa0\x73\xd4\xad\x00\x90\x52\xd0\x73\x9f\x44\xa2\x43\xa3\x02\xc4\x77\xfe\x45\xd1\x8c\x5d\x30\xc5\x41\x35\x90\x22\x7f\xd2\x0e\x15\x1e\x83\x49\xee\x1a\x9d\x41\xd3\x6d\x84\x23\xec\x99\x60\x2c\x47\x4d\xcd\x81\xcd\xc8\xd4\x42\x0d\xe7\x3e\x02\xa5\x6a\x6c\xa5\x81\x4c\x31\x8a\x55\xdf\x48\xce\x0a\x06\x8d\xec\x3a\x75\x1e\x45\x17\x89\x0f\xd9\x15\x52\x0c\x05\x9b\x62\x08\xad\x0b\x25\xc1\x7a\x8a\xc8\x66\x7f\x61\x4a\x46\xe1\x9a\xda\xc8\x8a\xf0\xb2\x64\x39\xa7\x86\x15\x73\x72\xcd\xe9\x86\xeb\x83\x58\x01\x7d\x30\x90\x38\x1e\x08\x49\x24\xf8\x80\x6b\xc1\x9d\xbb\x66\x56\x1b\x92\xcb\x1b\xb1\xb9\x48\xe1\xba\xb2\x86\x44\x5c\xc1\x8b\x41\xab\x59\x0e\x6c\x2e\xa9\x00\x27\x5a\x5e\x82\x6e\x5a\x07\xea\xfa\xad\x49\x9d\x00\xbf\xec\xd0\xa1\xf3\x85\x2f\x6e\xec\x58\x82\xaa\x05\x94\xe5\x6c\x7a\x7b\x41\xc4\x87\x66\x62\x53\x3b\x3b\x8d\x51\xdf\x6f\xaf\x67\x0e\x98\x83\x87\x4c\x8c\x2d\x04\xab\x4c\xa4\xca\xf8\xb8\x98\x93\x19\x2d\x0c\x73\x15\x33\x69\x7c\x4a\x9b\x6e\xca\x25\x33\xf1\x41\x14\x52\x4c\x63\x59\x97\xdd\x56\x2c\x33\xd0\xbb\x89\x51\x51\x57\x08\x9d\x15\xe3\xe6\xb2\xee\x6c\xff\x88\xed\x1e\xdf\xbc\xf6\x9b\xde\x85\xe6\x74\x89\xa9\xea\x1a\x4d\x65\x64\xc1\x10\x53\xfa\x10\xa7\xa5\xdd\x89\xf6\x75\x3c\xfb\x73\x69\xb6\xd2\xc1\xea\xf6\xd9\x5d\x1c\x40\xb9\xcf\xe1\x95\xc1\x8e\x61\x0c\x85\x1e\x49\x96\xc4\xe2\x37\xd0\x9c\x61\x4e\xac\x54\x64\xd0\x83\xe6\x9a\x8a\x6d\xee\x14\xb3\x17\x4b\xf1\xaa\x60\xe4\x8f\x57\x6c\x3e\x00\x6c\x1f\xa0\x38\xff\x27\x52\x87\x08\x2a\x98\x1f\x62\x24\x2b\x0b\x80\x54\xe4\x8f\xfe\xbf\xfe\xf4\x84\xbd\x61\xfa\xb8\xe1\xf0\xa5\xb6\xd5\xae\xe5\x14\x2b\xd3\xf0\xa8\x98\x1c\x73\x07\xe8\x8a\xd6\x18\x89\xbb\x3c\x22\xa7\xd0\x35\x0d\x15\x48\x2c\x30\x6f\x35\x81\xf8\xe1\x8e\x96\xd5\x1f\xbd\x3b\xd5\xdd\x32\x6f\xb8\x8f\xe2\xf4\xce\xa5\xeb\x13\xc4\x06\xe4\x02\xba\xea\x35\x9f\x00\x29\x3e\x97\xa7\xb7\x2c\xab\xbb\x65\xbf\xf7\x72\x01\x5d\xb1\x0e\xd1\x94\x69\x4e\xef\x3b\x36\xf7\x5c\x11\x8f\xc1\xea\xe7\xa1\x1c\x60\x43\xa2\xa2\xfc\xc1\xd5\xc7\x78\xc5\x36\xef\x17\x89\xe3\xcc\xdb\x35\x00\x22\xd7\x9e\x2b\xdc\x4a\x2f\x15\x9d\xde\x72\x6d\xf4\xff\x46\x7a\x92\xc9\x72\xec\x99\x2a\x82\xe3\x71\x0d\x2b\x31\xb9\xd3\x77\xf5\x54\xba\x82\xd6\xeb\x6c\xfd\x0b\x6c\xeb\x80\x3f\xfa\x0d\x54\xac\x52\x4c\x83\xcf\x99\xda\xad\xd8\xd7\x2e\x41\x4b\x0a\xa8\x8b\xec\x3c\x12\xd8\x85\xb8\xd3\x52\x3e\x97\x07\x17\xc4\x5b\x87\xc7\x05\x47\x70\x6a\x35\xa5\x51\x4b\x14\xc0\x8f\xba\x91\x1d\x9c\xd8\x62\xca\xcf\x35\xbf\xa6\x05\x43\xf3\xeb\x0d\x2f\xf2\x8c\x2a\x0c\x6b\x44\xa2\x4f\xb4\x74\x39\xb0\xd8\x06\xad\x93\x03\x2b\x48\x03\xac\x41\x76\xed\xc2\x99\xa8\x32\x3c\xab\x0b\xaa\x88\xa5\x80\x53\xa9\x3a\xd5\xab\xe9\x85\x66\xcd\x4d\xed\xa4\x4d\xe1\x48\x81\x6f\x9f\x17\x01\x89\x11\xcf\xcc\x82\x28\x2e\x27\x28\x59\x2e\x90\x99\x03\xcc\x3a\x73\xb7\xbd\x13\x04\x72\xe2\x19\x4f\xa0\xe8\x71\x35\x94\x28\x24\x87\x6b\xc2\xa7\x42\x2a\x96\x1f\x46\x02\x48\xa0\x85\x23\xf2\x6d\x68\xde\xd8\xa5\xef\xb7\x95\xb8\xbc\x27\x19\xca\xca\xb8\x77\x73\x84\xca\x61\x53\x43\x7a\x27\x52\xb1\x6b\xa6\xc8\x81\xab\xeb\xc6\xae\x79\x66\x0e\x47\xe4\xff\xb7\x8a\x5e\x57\xe7\x5b\xd0\x20\x1d\x31\x0c\xed\x05\x5c\xf1\x7f\xaa\xc9\x6b\x72\x00\x4b\xc5\xda\xe3\xa1\x0f\x20\xd1\x73\x6d\x58\xd9\x1d\x9f\xb7\x95\x03\xd1\x39\x70\x31\xc5\x25\xf8\xc1\xeb\xb8\xcd\xe1\xa2\xb6\xb5\x80\xed\xa1\x63\xae\xec\xc5\x32\x03\x93\xe4\xda\xd1\xc5\x96\x7b\x35\x44\x6c\x78\x9e\x1a\xee\xc2\x7f\x42\x8c\x00\x51\x6c\x0a\xd4\x0b\x69\xcf\x96\x9b\xdf\x75\x8c\xc3\x34\xb2\x92\x85\x9c\xce\x2f\x2b\xc5\x68\x7e\x2c\x85\x36\x0a\x68\xf4\x53\x9a\x95\x3e\xdf\x07\x84\x9b\x77\xec\x72\x57\xa8\xcb\x08\x93\x13\xac\xcb\x24\xeb\xe9\x0c\x5b\x81\xc2\x0f\x09\xcd\x94\xd4\x3a\xbc\xd3\xa6\x2a\x1b\xd8\xf6\xf4\xc8\xf7\x05\xf5\xf6\xe5\xd0\x67\x14\xd6\x04\x6b\xfb\x0d\x9d\x3b\xaa\x44\xc7\x3c\x6f\x55\x50\xf4\xa0\x6f\x8a\x0e\x47\x96\x3b\xde\xbb\x0f\x56\x26\x38\x3a\x3f\xd9\x34\x94\x61\x7b\x2a\xef\x7d\x47\x1a\xb4\x0d\x57\x24\x34\x9c\x5d\x50\x28\x61\x97\xb1\xc4\xa0\xdd\xd2\x29\xbf\x66\x22\xec\xcc\x33\x69\x3b\x5a\xd2\xdb\xcb\x2b\x76\xd3\xe1\x97\xfe\x45\xbf\x63\x9b\x27\x49\x0c\xc1\x1a\xf6\xbd\xd0\xd4\x70\x3d\xe1\x74\x5c\x3c\x65\xef\x53\x28\x9a\x72\xc9\x0a\x96\x6d\x51\x6c\x7f\x1f\x03\x11\x4a\xef\x19\x49\x26\x5c\x2c\xe0\x58\x37\xd6\xd1\x54\x99\xf3\x9d\xde\xb8\x0e\x25\xf0\xdc\xb2\x90\x2d\x27\x6b\xe1\xfa\xe8\x86\xa0\x40\x8c\x82\xa8\xcb\x31\x53\x9e\x84\x75\x13\x8f\x5c\x51\x49\x92\x49\xa5\x98\xae\x24\x66\xab\x7a\xd4\x71\x84\xac\x3b\x3f\xea\x9c\xc2\xd2\x37\x1f\x04\xb6\xf4\xf4\xd6\xca\xbd\xba\x5b\x4a\x00\x8e\x16\x26\x2d\x4e\x8a\xa1\x40\x3e\xbb\x6b\xe1\xe8\xdc\xa5\x87\xde\xf0\xe8\x34\x88\x3f\xe9\x4a\x86\x9b\xd1\x27\x07\x0a\x47\xe7\x4c\x28\x1c\x69\xa2\x01\x09\x56\x08\xb8\x77\xef\x70\x8f\xc3\x37\x71\xf9\x36\x67\x40\xd7\x03\x54\xa7\x5d\xd9\x56\xd1\x08\x63\xf6\xe1\x1e\x60\x81\x72\xee\xd4\x91\x2b\x36\x87\xe9\x71\xc5\xee\xdd\xeb\x7a\x5e\x0b\x0f\x58\x9f\xfc\x2e\x1c\x43\xfb\x4a\xbd\x7e\xef\xb7\xb9\xf3\x24\x7d\xef\x38\x8e\x8e\xa6\xbb\x66\xb4\xf0\xf8\xaa\xb1\xc6\x21\x4e\xb6\xac\x71\x0d\x5d\x6e\x6c\x71\xbd\xd6\xee\x9d\x1d\x86\xa3\x8f\x89\xab\x19\xe9\x2e\x74\x0c\xd3\x3a\x66\x2f\x0a\x41\x23\x72\xd2\xfb\x7a\xe1\x58\x66\x06\x3b\x13\x03\x72\x2e\x8d\xfd\x27\xb2\x88\x9d\x48\xa6\xcf\xa5\x81\x4f\x76\xe2\x24\x71\x03\x76\xe9\x1c\x9d\xd5\xc2\x92\x61\x81\xec\xc6\x45\xb7\x59\x41\xc1\x9d\xd7\x32\x35\xf8\x4c\x10\xa9\xdc\x96\xf7\x04\x21\x68\xd2\xda\x01\x10\x3b\xe8\x5d\x9f\xef\x7b\x15\x71\x0b\x45\x7c\xcc\x8f\x06\x8c\x03\x04\x6a\x1e\xe3\x37\x50\x8a\xbd\x2a\x20\xe1\x3b\xaf\x61\xc3\xa8\xdd\x39\x6a\xd8\x74\xe3\x14\xc7\xc5\x51\x32\x35\x65\xa4\x02\xb7\x4e\x02\xcc\xed\x23\x48\xe0\xe8\x29\x4e\xc4\xc0\xf4\xbe\x46\x89\xd3\x4b\x1f\x71\x52\x90\x29\x41\xd7\x48\x23\xa3\xf6\xb8\xef\x11\x28\x28\x75\x95\x14\x0c\x24\xff\x15\xbc\xb7\xff\x4d\x2a\xca\x95\x1e\x91\x23\x1f\x61\x18\x7f\xe7\x82\x34\xa2\x69\x7a\x80\x52\xdd\x75\x2c\x50\x41\x98\xab\x69\x21\x27\x77\x84\xf1\x81\xab\xb7\x6f\x19\x76\x30\x2e\xef\x5d\xb1\xf9\x5e\xd7\xea\x4a\x38\x62\x8a\xb2\x77\x26\xf6\x9a\x90\xc2\x16\x15\x08\x32\x29\x14\x38\xdf\x83\xef\xf6\x1e\x4f\xee\xef\x25\x41\x36\x05\x93\x2e\x12\x88\x60\x3d\xaf\x6c\xeb\x4e\x95\xb4\xea\x77\xa5\x1a\xe4\xfb\x8e\xcd\xb7\xe6\x82\xf9\xd0\x82\xc2\xab\x30\xc6\xa9\xea\x8d\x64\xa9\x31\xff\xbe\x00\x1f\xfd\xcc\x99\x05\xe5\x35\x53\x68\x12\xec\xb4\x36\x1a\xc1\x2c\xaf\x09\xa1\xf6\x4d\xb9\x1d\xc0\x47\x58\xd8\xe2\xa1\xb7\x68\x14\x52\x5e\xd5\x95\xc7\x67\x08\xc3\xed\x7a\x63\xb8\xc8\x64\xe9\xec\x22\xf8\x9e\x60\x09\x77\x17\x73\xe8\x22\x9e\x90\xc6\x84\xab\x80\x31\x55\x2d\xab\x4f\x47\xff\x60\xbc\x99\xc1\xc0\xcb\x2c\xdb\x0f\xf6\xc0\x66\x7b\x57\x6e\x55\x27\x00\x7c\xac\x7d\xbc\x0b\xae\x0d\x34\x2d\x83\x63\x7d\x22\xd5\x98\xe7\x39\xd8\x22\x11\xb8\x90\xf0\xb5\x80\x38\x96\xd2\xb4\xec\x50\xdd\x88\xc6\xc2\xac\x4b\xf2\xe0\x17\x8d\x5d\x62\xdf\x74\x09\x4b\xc6\x01\x8b\xb8\xf6\x48\x76\xa2\xf0\x8a\x8b\x5b\xe3\x11\xc1\xee\x7e\xa7\x95\xc6\xcc\xbb\x0f\x2d\x4b\x12\x75\x51\x58\x69\x0f\x04\x31\x34\xcb\xa0\xa7\x0f\x48\xb2\x0b\x4a\x98\x5a\x22\x6d\xda\xc8\xd6\xa9\x51\x84\xeb\x6e\x01\x77\x7b\xcc\x0c\xf5\x7d\x2e\xc4\x42\x35\xa8\xf6\xe6\x9f\x89\x0b\x99\xb7\x2d\xda\x2b\xca\x42\x91\x03\xff\x1f\xe3\x79\xe7\xa4\x17\xd2\x5b\xc6\xeb\x21\xd9\xa5\x64\x0e\xfd\x05\x2e\x67\x4c\xdf\x1e\x5b\x80\xe5\x23\x57\x14\x06\xdf\x4e\x15\xc3\x2a\xc0\x40\x95\x80\x4a\xb9\xb6\x57\xb5\x60\xd7\xcc\x62\x6f\xce\xed\x1e\x8e\xeb\x8e\x35\xd3\x5c\x7c\xd6\x3f\xee\x58\xf5\xff\xbf\x13\x79\x2e\x8d\x77\x53\xfd\x63\xe0\x1c\xe6\x28\xc7\xdd\xf2\xb2\x2e\xb1\x6f\xb5\x31\x56\x87\xe1\x93\x09\x53\x1d\x9b\xf3\x91\x90\x7b\xd2\xb6\x5d\xb7\xbd\x35\x8e\x4a\x18\xaa\xa6\x90\x30\xed\xec\xd0\x5e\xe4\x9a\x16\x72\x4c\x0b\x52\x72\x61\x41\xeb\xb6\x13\x9f\xef\xcc\x13\xde\xd8\xfd\xb9\x02\x38\x90\x41\x5d\x67\x29\x34\x8e\x77\x8b\x90\x50\x2e\x78\x7c\xb2\xb0\x1b\x0b\x93\x03\x7d\x29\x98\xd6\x18\x1e\xfc\x81\x8b\x13\xe7\x5a\xec\xb4\xec\x3b\x4b\x1d\x6f\x69\x59\x15\x6c\x80\xee\xc7\x6f\x86\xbf\x48\xc1\x88\x4b\x7b\x18\x04\x14\x75\x79\x3c\x46\x92\x37\x28\xf0\x56\xa1\x2c\x99\xcf\xaf\xe9\x04\x41\x8b\xee\x06\x67\xab\x26\x5f\xbf\xfa\xfa\xd5\x9b\x6e\x24\xe6\xcc\xa5\x1e\x65\x54\xbb\xee\xb6\x77\x4f\x77\xe3\x24\x1e\x1c\xff\x24\x76\x77\xde\xb8\x7f\xbf\x76\xff\x7e\x43\xfe\xd9\x71\x36\x72\x41\x2e\x5a\xff\xda\x7f\x3a\xce\x36\xb4\xc8\x13\x1d\xd7\x9b\x41\x9b\xb7\x66\x54\x20\xe3\xb3\x7c\xde\xdd\x6f\x90\xf6\xf0\x15\x80\xcf\x64\xb2\x64\xb0\xf5\x5f\xff\xef\x6e\xb2\x26\xce\x0b\x11\xfa\x86\x48\xe1\x66\x7f\x73\x00\xdb\x75\x48\x6e\x20\xee\xa1\xa4\x57\xe8\xb0\x3a\xca\x4c\x4d\x0b\x0b\xf0\xc1\x37\xc3\x37\x87\x44\x8a\xd6\xe3\x9d\x40\xb8\xe6\xd2\xca\x6b\x7e\x27\x0e\xde\x74\xac\xf1\xb0\xb8\x9d\x5f\x2f\xd9\xce\xd6\x4e\xc2\xdb\x52\x31\x87\x57\x48\x4b\x93\x3d\x39\x3e\x12\xf3\x1b\x3a\x0f\x44\xd9\x8b\xeb\x53\x7e\xcd\xc8\x8c\x4f\x67\x50\x0d\xa1\x47\xbf\x54\x82\x71\xdf\x40\x63\xb9\x6f\x69\x89\x80\xcc\x09\xef\x28\xfd\x9d\x99\x7d\x0d\x11\x2d\xe8\xa3\x70\x85\x6e\x42\x9e\x5a\x48\x3e\x79\x03\x64\xe5\xf5\x42\xa1\x8f\x2d\x87\x39\x7d\xf3\xf5\xe6\x32\x45\xa0\xc9\x5b\x13\x2b\x02\x04\xad\x86\x07\x77\xb9\xd9\x22\x73\xe9\x81\xb5\x0f\x70\x2d\x60\x14\x81\x79\x06\x36\x7e\xe5\xb4\xe1\x86\xa3\x35\xbb\xd7\xcd\x2e\x7b\x21\xf3\x10\x20\x42\x9c\x3c\x0d\x81\x75\x9a\xec\xb5\xd9\xc0\x1e\x04\xda\x05\xeb\x8d\xab\xe1\xec\xf4\x3d\x2e\x85\x7d\x0f\x7f\xf9\x7b\xb5\x01\x27\xe4\x48\xe4\x4d\x36\x51\xc7\x5d\x62\x3f\xd7\xb4\x00\xe3\xf5\x14\xe2\x04\x55\x9a\xfd\x8a\xf2\x8e\xee\xf4\xb5\x6d\xa8\x79\xc7\xd7\xc6\x7b\xaf\xeb\x02\x22\x2d\x1f\x7e\xff\xa4\x98\xa0\x9b\x50\x2b\xd0\x3a\x43\xac\x55\x29\xb1\x77\xbd\xf0\xe2\xbf\x8b\xbc\x90\xce\x2e\xd1\xeb\x32\x9c\x4d\x96\xa4\xd3\x35\xb1\x5b\x64\xcc\x66\xf4\xda\x5e\x47\x28\xe3\x14\xdf\x54\x77\xc4\x20\x62\xf5\x89\xf6\x8e\x12\x2c\x1c\x09\xd4\x6d\x94\x79\xdd\xe3\x9a\x37\xef\x26\x0d\xbe\xdf\x8f\x8b\xdc\x2a\xf8\x3f\x5a\x9a\x44\x47\x95\xba\x8b\x80\xfa\xf5\x60\x61\x5f\xdd\xe7\xbf\x7d\x2a\xb9\xf5\xeb\x6e\x72\xeb\xa3\x0b\x97\xf8\x6f\x67\x1d\xa9\xb9\xb8\x4b\xef\xeb\x6f\x0f\x9a\x5d\x3f\x84\x08\xff\x3b\x04\x17\x2a\x63\x35\x41\xce\x1d\x6f\x98\x13\xef\x35\x37\x35\xc5\x02\x5c\x82\xdd\xb8\x94\xea\xe8\x58\x17\x8e\x28\x32\x72\x79\x91\xad\x1b\x5d\x19\xb3\x8c\xd6\xda\x5e\xea\xb2\xb2\xea\x37\xd1\x16\xfd\xbc\xc1\xf0\x9b\x83\x6f\xc8\x90\xbc\x3e\xb4\xb7\x5b\x20\x69\x01\x14\x8c\x05\x6e\x68\x6c\x83\x8a\x9e\x99\x59\x55\xdf\x9e\x73\x47\x2a\xc7\x5d\xf5\xce\x05\xb1\xf7\xf9\x89\x4d\x42\xe6\xec\x68\x32\xe1\x82\x9b\x79\xd7\x72\xf6\x69\xc4\xa7\xf3\x3b\x90\x44\x62\xd4\x4c\xde\x90\x1b\x57\x4b\x00\x70\xd9\x95\xc4\x8b\xc1\x7f\x65\xff\xe8\x65\xb8\x06\x66\x19\x64\x11\xa7\x71\x04\x79\xc0\x51\x1b\x8b\x77\x23\x97\x37\xef\x1a\xf5\x74\x59\x6b\x48\xfe\x2a\x85\x54\x6f\x51\x39\xc4\x5e\xf6\x41\x06\xb9\xf7\xb5\x1c\x7f\xc9\x8a\x3a\x8f\x3a\x60\x34\xd2\x53\x47\xf6\x39\x24\x67\x60\xbf\x7d\xfb\xd0\xca\xc1\xca\x0b\x45\x14\xf2\xc0\xf0\x56\x01\xd4\x3d\xa0\x7f\x69\x92\x3c\xb0\x72\x8e\x8e\xc0\xb6\x63\xd2\x7e\x0b\x9b\x4a\x2a\xc0\x9f\x27\xcf\x3d\xb2\x3b\xf2\x19\xc2\xbb\xb7\x7f\x95\x62\x38\x56\x5e\x24\xec\x7d\x86\x41\xe9\x8b\x17\xa0\xd3\xea\x4f\x71\x69\x10\xf7\x2c\xe3\x91\xb5\x71\xd0\x0f\x08\x2d\x24\x38\x91\x2c\x3b\xb2\x1f\xb1\xdc\x3d\x38\x91\xde\xd7\xb4\xe8\xfb\xe8\x04\xc6\x0c\xaa\x7d\x36\xe9\x2b\x83\xd6\x2d\x48\x71\x05\xfd\x81\xac\x71\xe9\x9e\xf8\x82\x21\x94\xdb\xba\x61\x51\x30\xfd\xf6\xf2\xfa\x02\x08\xde\x60\x7d\xc5\x40\xb2\x80\x83\x43\x5f\xda\x08\xee\x60\xdc\x5c\x9d\x3a\x77\xb3\x13\x96\xb8\xee\x1c\xf8\x69\xc5\x69\x0e\x25\x7b\x33\x5a\xc4\x7a\x87\xd5\x77\x78\xce\x14\x8a\x3b\x63\xd6\xaa\xc2\xd4\x35\xdf\x02\xc7\x8f\xcd\xec\x58\xb1\x09\x4a\x09\xe0\xe2\x7f\xc2\xe2\xb7\x7b\xe3\x3a\xbb\x62\xc6\x07\x66\x28\xa8\x92\x52\xd5\x86\x8c\x69\x41\x45\x66\xef\x22\x48\xb2\xdd\x0c\xf5\x13\x6f\xfa\x37\x12\x01\xc0\xd5\x3a\xbf\x0d\x76\x8c\x08\xf5\x7f\xf0\x15\xa2\xfc\x55\x2e\xb4\xb1\x50\x63\x62\x6b\xbf\xcd\x3b\x2a\xb4\x1c\x58\xaa\xeb\x17\xbd\xe3\xbc\xc0\xe5\xdd\x7f\x63\xfc\x8c\x93\x08\x18\x33\xae\x6c\x5c\x14\xbc\x22\xbb\xf4\x42\x5b\x26\xeb\xb9\x3a\xbd\x6d\x6e\xd1\xed\x25\xd9\x68\x0a\xd1\x7f\x0b\xd7\x63\xaf\x5d\xaf\xd1\x97\x80\xda\x1b\xe0\x29\xda\x5b\xe2\x2a\x79\xe2\xcb\x83\x80\x4e\x4d\xdf\x1d\x17\x39\xd4\x07\x5e\x04\x26\xcc\xda\x86\xca\x2a\x02\x1e\x22\x50\x73\xd3\x43\xb4\xdc\x1c\xfb\xd4\xe4\xf3\x8e\x8d\x7b\x5b\x44\xf4\xae\xf9\xa2\x2d\xa2\x40\x92\x0d\x2d\x7c\x95\x1f\x2b\x52\xf0\x89\xd5\xba\x72\xc9\x30\x2a\x02\xcd\xe3\x1d\x8d\x6f\xcc\xcb\x25\x8d\x89\xa8\x2b\xd7\x6e\x99\x5b\xc8\x81\x8f\x0e\x20\x86\x15\x05\x72\x87\xc6\x22\x66\x35\x61\x23\x1b\x93\x58\x57\xdb\xfe\x90\xb4\x5d\x13\x4b\x17\x8b\x17\xf2\x45\x9b\xc0\x73\x3a\x0f\xad\x65\xbb\xc6\xe0\x8e\x6b\x43\xa6\xfc\xda\x8a\x50\x77\xfc\x1f\xcb\x7c\x19\xe8\x7f\x9a\xb1\xa2\x22\x8a\xe5\x75\xc6\x7a\x44\x02\xea\x8e\x6a\x36\x21\x47\xb1\x41\x10\x6a\x66\x04\x76\xb9\xd7\xc2\xc5\x3d\xd7\x07\xb7\xbf\xa0\xc8\x27\x40\x61\x41\xc5\xe3\x13\xc2\xae\x99\x9a\x93\x4a\x6a\x0d\xb4\x1f\xe4\x05\x2c\x72\x08\xd1\x94\x13\x9f\x58\x03\x46\x15\xd8\x33\x67\x5f\xe8\xb4\xf8\x9e\x33\x4a\xec\x81\x51\x59\xf6\x96\x01\x76\xd7\x6b\xfd\xcd\xab\x37\x5d\xbd\xd6\xa9\xad\x7f\x17\xf0\xbf\xe0\x52\xee\xe5\x5a\x3e\x9b\x2c\xa3\x93\x61\x6f\x5b\x94\x67\x1d\xaf\x73\x57\xd7\x24\xec\x0c\x38\x87\xbf\x39\x8c\x1c\xd6\xdf\xbc\xfa\xfa\xd5\x9b\x03\xbb\xf7\x5f\x1f\xda\x53\x88\xdc\xca\x5f\x47\x6e\xe5\xf0\x4b\xf7\x16\x1d\x4a\x58\x91\x26\x68\xe7\xe0\xcd\xe1\x08\x72\x1a\xa0\x3e\xe9\x8d\x54\xb9\x4b\xf1\xf7\x15\x23\xed\x9b\x87\xf6\x9f\xbc\xf4\xc2\xe7\x00\x88\x56\xa0\x8e\xdd\xcc\x43\xe0\xd0\x00\x37\x3a\x37\xe4\xab\x52\x2a\xf6\x55\xb4\xc4\x73\x15\x0c\xee\x06\x77\x95\xb4\x1a\x5e\x75\x88\xdb\xed\x93\xec\xdc\x37\xd5\xf9\xbe\x10\xb5\x92\x56\x1b\xcc\x73\x2d\x8b\xba\xdc\x34\x0a\xbb\x9f\x40\xf4\xde\xe5\xad\xba\xa5\x5d\x6a\x25\x86\x39\x94\x2e\xe7\x78\x3c\x8f\x4b\xf9\x8e\x59\x21\xc5\x14\x7d\x95\xa1\x61\xe1\x86\xab\xae\x57\x59\x3d\x93\x22\x63\x95\xd1\xaf\xb4\x91\x8a\x4e\xd9\x2b\x07\xe4\x46\x8b\x6d\xaf\x64\xc1\x0f\x00\x6d\x3b\xf3\x0d\x9b\x02\xe1\x7b\x84\x42\xcb\x3e\xff\x1b\xe8\x25\xcd\xa0\xec\x24\xec\xba\x95\x96\xa2\x06\xc3\xa2\xeb\x76\x6f\xa9\x6a\x41\x87\x0e\x82\x7d\xb2\x41\xe9\x8d\x3e\x2d\xa8\x36\x3c\xfb\xb6\x90\xd9\xd5\xa5\x91\xdd\x0c\x7d\x29\x34\x8c\x65\xb0\xb4\x30\x41\x90\xa3\x1f\x2f\xc9\x09\xd7\x57\x44\x31\x2d\x6b\x95\xb9\x56\x65\x0b\x05\x19\x37\xad\x1d\x8b\xc3\x5e\xa6\x82\x19\x57\x72\x9f\x94\x34\x9b\xa1\xea\xef\xa2\x1e\xd8\x6d\x25\x75\xd3\x7c\xbd\x03\x4a\xe1\x88\x3b\x55\x1c\xfd\x78\x79\xf7\x95\xb9\x8e\x9a\x64\xa0\x0d\x11\x53\x69\xc0\x12\xdb\x44\xca\x0f\x8d\x62\xdd\xa4\xb2\xa5\x3b\x6d\x11\x1e\x8c\x52\x8a\xe5\x5c\x61\x21\x55\xf7\xae\x6c\xac\x47\x99\xe6\x23\x7a\xa3\x47\x99\x2c\xc9\xf1\xe5\x19\xc9\x15\xbf\xee\xda\x27\xa9\x1f\x29\xfb\x15\xbd\xd1\x0c\xc1\x1f\x5b\xf0\xed\xd7\x5d\xf6\x61\xcb\xbd\x42\xf1\x6d\xce\x4e\x3a\xfc\xbc\x6f\xfe\xf7\x44\x7f\xb6\xef\xde\x51\x9f\x4b\x95\x35\x87\x50\x78\x8b\xec\x84\x17\x0c\x0b\x76\x21\x26\x3a\xbf\xaf\x23\xfb\x70\xcd\xe7\xb2\x26\x37\x14\x0d\xdb\xc0\x67\xbb\xa7\x6f\x7e\xe6\xd5\x5b\x72\x2a\x74\xad\x58\x93\xa4\xbe\x08\x82\x15\xdc\x7d\x1f\x61\x5f\x5d\x08\x68\x83\xbb\x8e\x62\xda\xa3\xc4\x18\x8e\x53\xd4\xce\xf4\x5b\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x55\xc1\x33\x6e\xac\x3a\x2a\x26\x4c\x35\xa6\x62\xfc\x41\xa2\x2e\x4b\xbb\x72\x27\x49\x8a\x4c\x56\x30\x0a\x03\x7a\x6e\x19\xc3\x03\x20\x1e\xc9\xa3\x0f\xc4\x63\xa2\xf7\xd9\x84\x48\x4c\x3d\x68\x97\x29\xe7\x3a\x4c\x6e\x11\xda\xad\x2e\x3a\xf4\x5b\x6a\x46\x83\xc2\xef\xa4\xf2\x53\xbe\xca\xd9\xf5\x2b\x9d\xd3\x37\x03\x78\x2d\xc4\xcf\xf9\xc2\x1e\x50\x4d\xf6\xde\x6c\xdc\x28\xa0\x19\x97\xbc\xe4\x05\x55\xc5\x7c\x10\xef\x65\x33\xbf\x65\x95\x1e\x10\x30\x26\xbf\xde\x23\x07\x58\x0d\x1c\xc4\xf5\x82\xf9\x76\x7c\xa1\xab\x2f\x64\x40\x75\x6e\x76\xd7\x37\x30\x84\xf4\x0e\x0e\x21\xc0\x98\x68\xfe\x51\x14\x9d\x8b\x7b\xa4\xc2\x7e\x0f\x87\xaf\x1f\xa8\x6a\xe7\xc5\x9e\x48\x94\xdc\x58\xf3\x88\x6f\xc9\xc3\x85\x53\x01\x3e\x58\x1c\xed\x51\xcf\x62\xd7\xc8\x59\xf7\xf6\x83\x24\x48\x0a\xdb\x3e\x50\x0f\x07\x84\xd4\x0b\xfe\x73\xcd\xc8\xd9\x89\x67\xd4\x15\x53\x9a\x6b\xc3\x84\x21\x79\x4b\x42\xe7\x28\xb6\x1f\x1c\x95\xf4\x17\x29\xc8\xe9\xb7\x97\x6e\xa2\xce\xd7\x6c\xf7\x4e\xb7\x23\xb3\xa2\xbf\xd4\x8a\x59\x7d\x66\x6b\x2a\x97\x07\x60\x51\xcf\xb2\x9f\x93\x13\x6a\x28\xaa\x5b\xc8\x31\x64\xd3\xd3\x0b\xd4\xa2\x31\xd4\x73\xf3\xcd\xe3\xd2\x29\x45\x01\xa8\x8d\x34\xa1\xe8\x65\xec\xa1\x74\xdb\x8f\xa5\xea\x8f\xc5\x67\xd4\x7f\xec\x0a\x09\x34\xa0\x2d\x6b\x1e\xf6\x7d\xce\xbb\x5a\xf4\xf1\xe7\xdf\x7f\x3a\xdb\x82\xde\x92\x81\x4e\x3e\xfd\x20\xf3\x34\xca\xcb\x7e\x34\xa1\x17\xd1\xa0\x21\xf0\x31\x7e\x4e\x4a\xbb\x12\x39\x97\x82\x0d\xc8\x27\x46\x73\x62\x99\x95\xfb\xcf\x1f\x15\x37\x6c\xb4\xbf\x2d\x21\xd7\x1f\x62\x92\x8d\xf0\x93\xf9\x4d\x38\x8f\xda\x44\x42\x2f\x57\x20\xe9\x4e\x66\x1d\x17\x72\x4c\x1c\x49\xdd\xe6\xdb\x7f\xff\xe9\x2c\xd9\xcb\x7f\xff\xe9\xcc\xbf\xbb\xfd\x4f\x39\xd9\xcd\xd7\xde\x35\xc5\xfd\xdd\x82\xc6\xdc\x5f\x73\xf9\xe0\x72\x22\xe8\x1d\x6d\xfc\xf1\x55\xf1\xd1\x96\x95\xf0\x04\x25\x9c\x9c\xa2\xf7\x96\x58\xb8\xba\x99\x41\xb9\xe8\x5c\x1e\xb1\x4d\x5c\xed\x4c\x4d\x4f\xa6\x28\xea\x0d\x7a\xfb\xe5\x6f\x49\x59\x17\x06\xba\xdc\xc0\xd5\xb2\x77\x0d\x12\xc8\xfc\x25\x23\xae\xeb\xab\x95\x0e\x30\xd2\x24\x7f\xeb\xab\x27\x85\x5f\x2c\xff\xc1\x07\x2a\xe8\xd4\x3e\x0e\x1c\x9b\x94\xf8\x67\x74\xa7\x0f\xd0\xc1\x2f\xc2\x57\xf4\x9a\xf2\x82\x8e\x79\xc1\x0d\x68\x23\x87\x23\xbf\x97\x58\x6a\x06\x40\xde\x1a\xb1\xdf\x39\x95\x2e\xee\x84\x01\xdd\x13\xc9\x81\xfd\xee\xd5\x8d\x65\x8a\x87\x23\xe0\x90\xf0\xe0\x8c\xa9\x58\xeb\xeb\xbc\xb2\xbd\xf0\x9f\x1e\x49\x5b\xec\xaf\xa1\x45\x17\x0f\x76\xa3\x9b\x26\x60\xa9\xe9\x56\x35\x01\x0b\xc0\x52\x4d\x00\xbe\x70\xbd\x6c\xb7\xa0\x0c\xc0\xf2\x1d\x94\x01\xf8\x5d\x62\x65\xc0\xb2\xa5\x2f\x49\x19\xd0\x2c\x53\xcc\xf4\x50\x07\x80\x34\x76\xfc\x7d\x5f\x85\x60\xe7\xe8\x62\xfe\x42\x17\xe3\xd1\x20\x57\x92\x13\x6a\xa6\xf3\xc2\x7a\x68\x68\x8f\x5f\x2d\x54\xb9\x46\xe2\x75\xe9\xa4\x03\xdf\xe8\x1e\x7e\x6f\x49\x56\x97\xfa\xfe\x38\x7a\x33\xf4\x70\x69\xd2\xec\x8b\x9f\xcd\x6f\x0b\x8a\x3d\xf0\x31\xe9\x7c\xb5\x7b\xbe\x66\xc6\xaa\xd9\x64\x6b\xa5\x1d\xec\xea\xef\x2e\xdb\x81\x24\xc7\xac\x9a\x91\x77\x97\x4b\x18\x18\xd6\xef\xb0\xdb\xa5\x31\xbc\x64\x5f\x93\x82\x4f\x98\xe1\x5d\x3d\x23\x31\x0f\x3b\x46\x58\x5a\x0c\x2c\x14\x66\xf2\x0c\x0b\xb7\x2b\x38\x1e\x85\xf4\xed\x4d\x83\xde\xf3\x0c\x99\x4b\x29\x05\x37\x72\xe3\x5e\xe4\x24\x45\x1f\x03\xb7\xf4\xb6\x59\x83\x87\xc3\x1e\xea\x27\xbf\x9d\xe4\x43\xf4\x29\x25\x99\x2c\x0a\x96\xf9\x5a\x1a\x80\xa6\x3d\x76\x0e\xc7\x12\x13\xb9\x0b\x05\xd6\xa3\xab\x3f\x80\x91\xdc\x99\xc3\x5f\x21\xea\xbd\xfa\x74\x7a\x74\xf2\xe1\x74\x54\xe6\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\x5a\x2a\x75\xeb\x5d\x16\x12\x68\xd3\x8f\x50\xb5\xb8\xa2\x66\x96\x46\xbd\xb6\x33\x59\xf4\x69\x3a\xda\x7f\xaf\xb1\x5e\x00\x54\x64\x73\x71\x88\x4a\x4a\x33\x20\x8a\x42\xf0\x6d\xe8\x94\x3c\xa9\x8b\x02\xf1\xcc\xd2\x9e\x41\xec\x1f\x7e\xf5\xa2\xe4\x7a\x71\xaa\xb5\xb9\x5f\x94\xc6\xbb\x2b\xe4\xa1\xbf\x6c\xd9\x55\x67\x26\x09\x11\xa6\x81\xa4\x8d\x32\x97\xad\xcf\x31\xf6\xc1\xcc\x2c\x02\x5d\xb1\x39\x81\xaa\xf6\x56\x6d\xfd\x5e\x33\xd5\xbe\x82\xcc\x64\xb0\xeb\xaf\x6a\xcd\xd4\x08\xa7\x7f\xe6\x27\xdd\x47\x56\x86\xf7\xff\xc4\x26\xbb\x71\xce\x9f\xd8\x64\xd9\x31\xbb\x8f\xa1\x3b\x73\xc8\xaa\xb2\xa2\x78\x6d\x66\x98\xf9\x8b\xfd\xf3\x51\x4f\x59\x7a\xee\xd8\x07\xe1\x99\x1f\x74\xaf\xfa\xea\x29\x1a\xdb\x88\x1e\x5a\x15\x49\xdc\x04\x24\xf6\xa3\x39\xcc\xe8\xd9\x2d\xe5\x73\xab\x05\x2c\x96\x20\xe3\xd7\xac\x98\x07\x59\x1d\xf3\x66\xf2\x1a\x2b\x22\xd3\xec\xea\x86\xaa\x1c\xfa\x4d\x57\xd4\x70\x67\xe1\xe6\xdd\x05\x4b\x3b\x7c\x8f\x72\x57\x73\xd9\x35\x12\x71\x09\xd8\x1a\xdf\x98\x3b\x65\x06\x13\x42\x85\x2b\x2e\xed\x2a\xa8\x59\x1e\x49\x3b\x07\x5d\x78\x20\x4a\xab\xbb\x65\x4c\x59\x6d\xbf\x98\x93\x1b\x25\xbb\x56\x60\xf3\x63\xc3\xc0\x12\x79\xcd\xd4\x35\x67\x37\xaf\x6e\xa4\xba\xe2\x62\x3a\xb4\x2f\x3b\xc4\x2b\xa0\x5f\x59\x4c\xd4\xaf\x7e\x05\xff\xf4\x80\x2a\x51\x67\x8f\x60\xa1\xde\xdb\x4b\x21\x0e\xf7\x6e\x38\x60\x87\xe5\x6f\xdb\xa6\xea\x16\x06\x7b\x97\x64\x2c\x47\x2b\xcf\xb1\x15\xcd\xa5\xc6\x67\xec\x39\xb6\xe8\x35\xcd\xcb\x8e\x55\x8c\xc9\xce\x90\xeb\xae\xc6\x1d\x2e\xf2\x6e\x47\x97\xc4\xb8\x03\xab\xb7\x8d\x3b\xee\x33\x17\x04\x1a\xd2\x41\xa8\xf7\x4a\x40\xe1\x59\x9f\xe4\xd1\xce\xf1\x48\x60\xe1\xc1\xc5\x37\x73\x51\x38\x88\x13\xfb\x27\x70\x56\xf0\x50\xc8\x8a\x59\x92\x9c\x5d\x8d\xa4\x9a\x3e\x46\xd2\xc6\x22\xbe\x96\x73\xfd\x73\x31\x44\x08\x86\x55\xde\x20\xec\xf3\xb3\x5c\xbd\x64\x67\xac\xcc\xce\x78\xde\x81\x1e\x3b\x9c\x73\xf1\x98\x57\x8a\x7c\x91\x56\x9a\x2f\xca\xe5\xb6\x45\x9c\xe8\x6f\x8b\xd9\x35\x15\xbd\x91\xe8\x2a\x09\xb5\xd9\x5c\xc3\x4c\xd0\xc0\x91\xb3\x78\x5f\x21\x54\x61\xa0\x8a\x96\xcc\x30\xd5\x14\x8c\xcf\xa4\x10\x7d\xfa\xcd\x1a\x49\x3e\x56\x4c\x5c\x02\x13\x7e\x51\xab\x5f\xd4\xea\xd5\xe3\x45\xad\x7e\x51\xab\x53\xa8\xd5\x3b\x97\x30\xe4\xe9\x29\x16\x41\x74\x89\x80\x4d\x45\x07\xa7\xb3\x3c\x3f\x9e\xd9\x55\x7b\x96\x62\xc2\xa7\x1f\x68\xd5\x5b\x81\x0e\x33\x2d\x28\xc3\xe1\x63\x17\xd9\x00\xa5\xa9\x2a\x59\x41\x8b\x3e\x57\x46\x14\xb6\xff\xe9\x35\xb3\xbe\xcc\xc8\x5d\xb8\x64\x49\x20\x3d\xf0\x3b\x02\xa5\x2d\x6f\x94\xf6\x93\x31\x37\x8d\x24\xa1\x99\xc1\x7e\x60\xd8\x73\x95\x48\x41\x32\x57\xe1\x1d\xf4\x9f\xa8\x4f\x5d\x02\x9d\x4a\x10\x99\x19\x5f\x6a\x34\xb4\x0f\x7b\xfd\xfa\xf5\x6b\xec\x1d\xf3\xfb\xdf\xff\x9e\x48\x45\x28\xc9\x59\xc6\xcb\xbb\x0f\xc2\x53\xbf\x7d\xd3\xb1\xbd\x82\x1d\xff\x7e\xf4\xe1\x3d\xd4\x65\xa9\x8c\xc6\x0e\x8d\x08\x91\x9d\xb8\xb5\xa8\x1e\x90\xff\x73\xf9\xf1\xbc\x69\xfd\xd7\xfe\x16\xac\x26\x61\x3b\xbb\xc3\x13\xbb\x6f\x5f\xff\xee\x37\xbf\xe9\x31\x13\x18\x5c\xa4\xe2\xae\x9c\xb1\x2f\x31\x43\x2d\x3f\x56\x0c\x7b\xf2\x80\x00\xe1\x35\x58\x2c\x00\x66\x3a\xb7\x07\x21\x5e\x40\x29\xf9\x74\x66\x5c\x99\x58\x7b\xc5\x0b\x9e\x19\x14\x04\xb0\xb8\x96\x74\xd5\x9a\xe1\xd2\x23\x0c\x41\x7b\xef\x11\xc0\x92\xb3\x01\x29\xf8\x15\x23\x13\xfd\x17\x25\xeb\xaa\x69\xe4\x8b\x3d\x4b\x7c\xed\x23\x04\xa2\xc1\xfd\xce\x7d\x30\x77\x25\x93\xba\x57\x04\x4a\x2a\x22\x03\x40\x2c\x98\x1c\x5c\xe5\xd3\xa6\x31\x6c\x45\x79\x28\x76\x04\x69\x9b\x28\xcb\xb6\x65\xe4\xac\x63\x41\x39\x3b\x8e\x03\x47\xf1\x0d\x1c\x2a\x25\xff\x13\x91\x1c\x4a\xfc\x46\x1c\x1d\x4a\xe3\x5a\x9c\xf3\x85\x71\x9b\xc8\xc4\xce\xeb\x5f\x31\x2c\x7d\x6b\xf5\x35\x26\x42\xab\x45\x78\x7b\xa8\x62\x1b\xed\x8d\xfd\xa2\xe0\xda\x82\x06\x1d\x81\x1c\xc4\x9d\xd7\x5e\xf2\xa6\x61\x35\xb8\xf7\x1a\x6f\x44\x2d\xee\xac\x8a\x9d\x34\x7a\xac\x0c\x2c\x1d\x5e\x90\xfa\x2e\xb8\xcd\xda\x58\x20\xdd\x35\x99\x71\xcf\x7a\x2c\x08\x07\xd6\xbd\x6d\x7f\x74\xa4\x9a\x99\xda\x1d\x3d\x53\x4a\x2a\xfb\xae\x4c\x6b\xd7\x5f\xad\xa4\xea\x8a\xe5\x81\xff\x8d\xc8\x85\xdd\x14\xdf\xdf\xa6\x87\x89\xa7\xa0\x56\x0b\x43\x23\x3e\x9d\xc3\x6b\x3a\x85\x1d\x80\xdb\x1f\x8d\xf6\x91\xf0\x4a\x45\xb4\xa1\xca\x51\x43\xfb\x79\x3f\xca\xb3\xc5\xb8\xb5\x16\xdd\xf8\x40\x2b\x68\x81\x0d\x72\x26\x20\x00\xd8\x30\xe0\x9d\x1d\xf3\xa1\xee\x8c\xba\xf3\x96\x04\x16\x86\xbe\x06\x77\x1c\xc3\xce\x15\xd6\xfd\xef\xed\xc6\xf4\xb9\xe7\xbd\xcd\x24\x40\xa9\xfa\xfc\x7c\x01\x01\xae\xda\x35\xeb\x8d\xf4\xd4\xa8\x9f\x42\x9e\x48\xf9\x2d\x7b\x08\xe1\x38\x52\x9a\x85\x10\x9e\x76\x70\xce\x5a\x92\xb8\x41\xeb\x4f\xd1\xe3\x0e\xe1\xd8\x21\x01\x1c\xc7\xae\x89\xe1\x38\xce\x26\x40\xca\x17\x58\xb6\x63\x35\xb1\x52\xe5\x65\x0d\x7b\x76\x7d\x17\xdd\x9e\x04\x8d\x63\x2b\x72\x34\x8e\x14\xd2\x34\x8e\xfe\x32\x35\x8e\x3e\x61\xd0\x38\xd2\x12\x0e\x1f\x4c\x8d\x87\xe1\xc4\x0e\x94\x2c\x26\x01\x01\xc0\xeb\x09\x36\x15\x4f\x8c\x7b\xd3\x0b\x27\xd4\x20\xc9\xa0\x63\x2d\x8b\xda\xe0\xc2\xa9\xa6\x8e\xe5\x25\x78\x21\x56\x40\x4f\x8a\x5e\x42\xd2\xe2\x22\x91\xec\x05\xd2\x31\x8a\x2b\xfd\x57\xd8\xcd\x18\xfe\x3e\xae\x90\x54\x68\x9b\xd6\x05\xb2\x7d\xf7\xc7\xd6\x5d\x1f\xa9\xdd\x1e\xbb\xe6\xf2\x48\x59\x5c\xa2\xa3\xab\x23\xd8\x47\x53\xdc\x1d\x3f\x59\xa8\x2d\x78\x33\x63\x2e\xc9\x25\x52\x7e\xad\x90\x65\x59\x28\x68\xe4\xbe\xdf\x2a\x36\xf5\xd9\x96\xb7\x3c\xad\xbb\x27\xd3\xbc\xbf\x13\x41\x73\x72\x70\x1c\x6a\x66\xfb\x7c\xd9\x33\x61\x98\x9a\xd0\x8c\x1d\xc6\xce\x05\x56\xcd\x58\xc9\x94\xdd\x78\xf7\x9c\x2f\xc1\x3c\xa3\x22\x2f\x5c\xe9\x73\xbc\x45\x84\xdd\x1a\xa6\xec\x21\x35\xc1\x67\x9d\x84\xc7\x6d\x17\xcc\x02\xc8\xb7\xe1\xeb\x80\x85\xb7\xcd\x6b\x10\x0a\x2f\x1e\x89\x88\xf3\x34\xc7\xea\xfb\xa6\x59\x14\xd0\xb1\x83\xa9\x3b\x05\x3d\x96\x02\xa4\x62\x20\xf7\x73\x59\x2b\x0c\xb8\x0d\x71\x94\x99\x54\xca\xca\xe7\x00\x10\xd5\x44\xb1\x29\xd7\x06\xba\xc3\xf8\xae\x96\xd8\x61\x62\x6b\xf5\x78\x76\x2a\x92\x2f\x84\xec\xad\xa8\x74\xd4\x79\x0d\xa7\xd1\x55\x4a\x5e\xf3\xdc\x2b\x74\x31\x7f\xe6\x9a\x54\x54\x47\xf5\xd3\xa9\xd6\x32\xe3\xe0\x00\x6b\xb0\xa8\xf3\xfa\x68\x09\x05\x75\x31\x67\xc6\x6a\xf7\x82\xb5\x2a\xdf\xc6\x41\x86\x92\xd0\xaa\x2a\x3a\x67\xda\xf4\x46\x0b\x21\x73\x76\x51\x8f\x0b\xae\x67\x97\xbb\x12\x38\xb5\x0c\x26\x4c\x4e\xbe\x93\xd1\x74\x5f\x00\x55\x8f\xa0\x2d\xa1\x39\x68\x5c\x56\x5e\xb2\x0a\x26\x97\x02\x4c\x5d\x54\x6b\xbf\x6a\x4c\x6a\x24\xc8\x9d\x05\x33\xcc\x7f\xd5\x5d\x8e\x6e\xde\xdb\xf5\x9e\xb0\x3a\xb9\xfd\xf4\x7b\x51\xb5\x3e\xcf\x68\x51\xf4\xb0\x7c\xb4\x45\x6c\x2f\xbd\xa0\x09\xc0\xf7\xb1\xc0\x0b\xc3\xed\x5d\xf2\xbb\x0c\x29\x65\xc8\xbd\x46\xd8\x01\xb4\xbb\x88\xbb\xf4\xe0\x74\xd4\xe6\x5f\x0a\x7f\xba\x03\x2b\x90\xfb\x1f\x04\x0c\xc0\xf2\x5d\x78\x8f\x5f\xc2\xd9\x5e\xc2\xd9\x1e\x18\x5b\xd7\xe9\xc8\x4b\x38\xdb\xa6\x63\x17\xc3\xd9\x76\x2e\xe4\xdc\x1b\xae\x91\x3d\xd2\x7c\x08\xd5\x04\x31\xe8\xaa\xc6\x74\x9f\x20\xa5\xf6\x95\x82\x1f\xa8\x3b\xb0\xb5\x90\x6f\x7c\xaf\x23\x63\x14\x1f\xd7\xa6\x3b\x29\x4e\x1b\x6b\xd8\xc0\x03\xea\x29\xd3\x4e\x66\x18\xba\x23\xcb\x22\xe6\xe1\x8c\xfc\x81\xa3\x45\x92\x46\x4f\x55\x69\x14\x74\x17\x50\x5b\xf0\xc3\x7d\x4d\x72\x99\xd5\x25\x13\xa6\xc1\x90\x26\xd7\x05\xfd\x2c\x5b\xe4\xaa\x34\xcf\x39\x0a\x25\x17\x09\xf8\x6b\x2f\x72\x94\xcb\x1b\x61\xf9\xd1\xd1\x45\xa7\x0a\xbf\xed\xea\xbe\xcd\x5c\xb1\x19\xc3\x7f\x4c\xec\xe7\x74\x0c\x3d\xe9\x5d\xcb\xd5\x97\x90\xc9\xa5\x53\xa4\xb9\xa6\xcb\x3c\xb3\x46\x92\x5a\xb3\x95\x21\x91\x8d\x67\x35\xe9\xca\x2f\xd1\x99\xbb\xe1\x16\x7e\x89\xce\xec\xba\xf2\x4b\x74\x66\xb7\xe5\x5b\xf4\xec\x0c\x43\x2c\xad\x38\x57\xb8\xde\x9e\x2d\xfe\xe0\x22\x13\x7a\x1c\xd4\x6e\x45\x95\x9d\x34\x3c\x11\x8d\x1b\x8b\x85\x7f\x17\xec\x30\x48\x0b\x1b\x3f\x78\x94\x34\xe7\x99\x26\x28\x9b\x5f\x42\x04\xda\x0e\x44\x90\xc1\x5e\xf6\xb0\x09\xe2\x68\x57\x8b\x6b\x4a\x0f\x62\x37\x6e\x0c\xd1\x8d\x62\x84\x2b\x99\xbf\xc5\x06\xd4\x54\x08\x89\x22\xaa\x1e\x60\x03\x6f\x3d\x70\xc5\x2f\x40\x49\xad\x68\x86\x56\xb2\x9a\xe7\x40\x53\x9b\x0a\x95\x5d\x6b\xc7\xe1\x48\x82\x05\x24\x11\x26\x10\xc0\x06\xd8\xa2\x8b\x3e\x28\x41\x92\xa1\x85\x1d\xb4\xe2\x3f\x30\xa5\x7b\xf4\xb6\x6b\x46\xbb\xf1\x2e\xce\xea\xb1\x41\x67\x33\x56\x52\xf8\xcf\x77\x7e\x0b\x2c\x81\xb4\x5a\xa7\x61\xd8\xbe\x8e\xa9\x52\x13\x39\x19\xb4\x32\xb0\xf7\xae\xfb\x74\x74\xf3\x23\x91\x31\x83\xf8\xcb\x74\xd1\x3b\xdc\x88\x2c\x6e\xd8\x45\x2b\x38\xc8\x5e\x24\x90\x23\xed\xdd\xf2\xee\xa7\x26\x50\x1b\x98\x08\xee\xf0\x0e\x6d\x4e\x7a\x4b\x0d\x8e\x5d\x8b\x0a\xed\x1a\x0d\x3a\x08\x11\x03\x6d\x91\xbd\x27\x38\x2f\xd1\xa0\xed\xf1\x12\x0d\xfa\x12\x0d\x9a\x34\x1a\x34\x12\x76\x3c\xdf\x5a\x12\xd8\x19\xc7\x31\xf8\xe8\xce\x31\xf3\x7a\xbf\xb3\x38\xf8\xe0\x4c\x1f\x99\x29\x55\x3b\x01\x65\x7f\x34\xda\xc7\x14\x94\xc6\x44\x51\x9b\xc9\xf0\x0f\x84\x89\x4c\xe6\x76\x9e\xcf\x30\xbf\xd2\x06\x44\xf8\xc6\xcf\x13\xc3\x52\xfa\xb5\xe2\x24\x16\x98\x3b\x85\x44\xd5\x9b\x55\xf8\x5e\x8e\xef\xd2\x0b\xa6\xbd\x89\x7b\x23\xce\x86\x8e\x93\x6e\x8b\x33\x1f\xd1\xe4\xe4\x5a\xff\xbd\x26\x05\x2f\x39\xb4\x37\xc9\x81\xc2\x31\x6d\xfa\x39\xba\x08\x39\xc0\x29\x47\x59\x55\x0f\xdc\xf4\xa3\x92\x95\x52\xcd\x07\x61\x09\xfb\x65\x6b\x4d\xf7\xc4\x21\x08\xd1\x59\xad\x14\x13\xa6\x98\xf7\x2b\xf8\xde\x8c\x1d\x94\xa6\xfd\x09\xec\x88\x30\x1d\x10\xa4\x4f\x23\x86\x66\xb4\x69\x50\x13\x4f\x07\xae\xe6\xb0\x8b\xc0\x3b\x5d\x61\xbf\x41\x13\xc5\x68\x3f\x65\xe2\x9a\x5c\x53\xa5\xfb\xdd\x79\x92\x56\x7e\xce\xf9\x35\xd7\xb2\x73\x0c\x5a\x34\x51\xbc\x3d\x97\xc1\x83\x66\x6f\xaa\xac\x4d\x55\x1b\xc7\x4e\xfc\xf5\x65\xb7\x95\xb4\x42\x5a\xb8\xb6\x0b\x8a\xc6\x9b\xae\x0e\xca\x66\x54\xd4\x18\xa6\xc4\x5b\xf2\x7f\x0f\x7e\xfa\xf5\x3f\x87\x87\x7f\x3e\x38\xf8\xdb\xeb\xe1\xff\xfa\xfb\xaf\x0f\x7e\x1a\xc1\x7f\x7c\x75\xf8\xe7\xc3\x7f\xfa\x3f\x7e\x7d\x78\x78\x70\xf0\xb7\xef\x3e\xfc\xe5\xf3\xc5\xe9\xdf\xf9\xe1\x3f\xff\x26\xea\xf2\x0a\xff\xfa\xe7\xc1\xdf\xd8\xe9\xdf\xd7\x9c\xe4\xf0\xf0\xcf\xff\xb3\x37\xe8\x54\xcc\x3f\xf6\xa4\xc3\x38\x86\x09\xe5\x81\xf6\x8c\x49\xd0\x6f\x41\x4b\xe1\xc2\x0c\xa5\x1a\xe2\xd4\x6f\xa1\xa7\x74\xcf\x05\x3c\x7a\xa5\xbe\xff\x8d\x0c\x12\xf8\x52\x50\x10\x77\xe8\x82\x3f\x86\x0e\x98\x38\xe5\x02\x42\x42\x4e\xf8\xd6\xaa\x8d\xfa\xf5\xdb\x25\x56\x0c\x2b\x2b\xa9\xa8\x9a\x93\xdc\xb9\x1c\xe6\x8f\xd0\x46\xa6\x67\xa3\x6b\x00\x3d\xe7\x5d\x6e\xf5\x96\x5d\x96\x25\xcb\x79\x5d\x6e\xdb\x5b\x89\x50\xc4\x07\x7f\x63\x8f\x18\x22\x96\xe4\x24\x44\xc0\xbb\xc7\x9c\xcf\x78\x4c\xb3\x2b\x34\x22\x04\xcc\xe8\xe3\x59\x62\x71\xc9\xe1\xbd\x3d\x17\xea\x5a\x32\x2a\x82\xe7\x14\xc2\xb2\x65\xce\xf6\x75\x78\x16\x41\x4a\xe2\xac\xc4\x90\x2c\x97\xd3\x75\xe0\x16\x38\xb4\xaa\xd0\x07\x90\x5f\xb7\xd6\xc6\xbd\x07\x76\x93\x24\x8d\x09\xf8\x2f\xec\xbd\x95\xf5\xb7\x8d\xa6\x01\x10\x1f\xa3\x6f\x24\x98\x75\x5c\xa3\xab\x09\x29\x64\x16\x25\x6c\xb4\x44\x51\x40\xd4\x53\x4f\xe2\xfa\x46\x2b\x59\x74\xb5\xd0\xa0\x0e\x04\x2e\xb5\x42\x63\xbc\x35\xcf\xe8\xb8\x60\x68\x3a\x02\xbc\xe9\x8d\xa3\x76\xb1\x92\xde\xf2\xb2\x2e\x49\xad\xed\x9b\x49\xd1\x9e\xbb\x79\xb1\x1b\xbc\x9a\x78\x57\x4a\x2e\xe0\x47\x2d\x33\x5b\x77\xe7\xd5\x8c\x91\xcb\x70\x02\x8d\xd1\x17\xc3\x17\x9d\x4d\x47\xd7\xa0\xfa\x3b\xe8\x9c\x02\x2a\x27\x10\x66\x1b\xf4\x10\x4d\xa0\x9e\x43\xe7\xc6\x99\xe4\x2e\xc1\x10\xbc\x68\x53\x0c\xa0\x5f\xb3\xe8\x80\x6a\xe1\xf2\xa1\x9e\xeb\x3d\x7e\x76\x52\x7c\x4f\xd9\x3d\x95\xc4\x9e\x44\x4e\x4f\x2e\x9d\x87\xfc\xb2\xad\x89\x7b\x21\xc1\xad\x25\xef\x39\x7b\xf4\x92\x64\x37\xea\xf3\x8c\x02\x81\xed\x53\x66\xfd\x73\xb0\x7d\x3b\xe1\x31\x9b\x67\xae\x81\x10\x6f\x62\x14\x43\x9c\x1a\xde\x5d\x28\xc4\x33\xb4\xff\xe7\x6d\xe4\x3e\x7c\x69\xcc\x26\x18\xde\x8f\xbf\x01\xfb\xa2\xee\x56\x12\x08\xbd\x04\x05\x33\x50\x79\x88\x89\x30\x29\xe4\x28\x94\xf2\xda\x92\x90\x4e\x33\x7f\xaf\x5d\x80\x1d\xef\x78\x2d\xe8\x61\xab\xa2\xa4\x46\x83\x9f\x60\x2c\xc7\x2a\x49\x45\xb3\x03\xaa\x16\x1d\xdf\x7f\x7c\x48\x26\x8c\x9a\x5a\x61\xec\xba\x90\x0a\x3c\x22\x48\xc4\xd0\x94\xaf\x98\x45\x01\x68\xec\xa4\x64\x49\xb4\xa0\x95\x9e\x49\x03\x66\x63\x5a\xd1\x8c\x9b\xce\xe5\x6d\x8c\xa2\xd9\x95\x9d\x19\xa2\x98\xe0\xcd\xba\xbd\x46\x76\xe8\x72\xf4\x63\x5c\x6d\xd7\x95\x32\x33\x25\xeb\xe9\x0c\x0a\x0f\xe1\x53\x59\x41\x35\x56\xb9\xea\x16\x80\xb8\x74\x4d\x67\xe8\xd4\x24\x9f\x0b\x5a\xf2\xcc\x9f\x1f\x64\x91\x69\x2e\x5d\x80\x09\xc0\xd2\x75\xdb\x28\xb9\x60\x4a\x73\x6d\x98\x30\x18\xeb\x72\x5c\x50\x5e\x92\x03\xcd\x18\x39\xf5\x57\x1d\xbf\xb9\x44\x35\x1d\x9d\x5b\xdd\xd3\x0e\xe2\xe0\x19\xd7\x64\xd4\xd5\x91\xb6\x9f\x78\xa7\x5e\x14\x50\xda\xbd\x05\x84\xbb\x95\x4b\x5f\xf1\xb0\xc7\x65\x5c\xbe\x67\x52\x41\x86\x90\xb3\xcf\x5d\x33\x91\xcb\x26\xb0\xba\xd3\x5a\x47\x17\x67\x3a\x36\x88\x22\x4d\xab\x70\x75\xf8\xc2\x35\x41\x0d\x9d\x0b\x03\x45\xec\xb4\x9e\x15\xb8\x04\xe1\x22\xe7\xd7\x3c\xaf\x69\x81\xa2\x56\xe7\x6d\x3a\xbe\x3c\x43\x20\xf9\x74\x66\x86\x37\x0c\xdc\x89\x28\x6b\x37\x5c\xc4\xbf\x1a\xbf\x93\x32\xcb\x35\x08\x65\x86\x18\xd9\x8d\x20\x31\xe7\xc6\xb6\x9b\x76\x43\xe7\xd0\xcd\xdb\xa5\x3d\xb6\x22\xcd\xdd\x89\xb9\x65\x27\xb2\x9b\xcc\x50\x7a\x29\xcf\x21\x77\xc7\x8d\x3b\x02\x32\x9c\x51\x01\xaa\x2b\x78\xa1\x2d\xfe\x03\x4d\xbd\xbb\x6b\x5d\x29\x4e\x15\x30\xb8\x99\x0a\x05\x5f\x4d\xed\x8d\xeb\x68\x91\xd9\xb2\x55\xe4\xba\xb9\x8d\x9f\x59\x59\x15\xd4\x6c\x3d\xa0\xfb\xc7\xc8\x29\x1f\xc5\x0a\x5a\xd6\x41\x45\x3e\xa4\x85\x25\x19\x17\x3f\x1c\xbb\xd2\x65\x48\xd8\x93\x64\xc6\x7c\xf6\xe2\x87\x70\x1a\x0e\xaa\xb2\x4b\x69\x3a\x74\xd7\x1b\xb3\x1c\xe4\x01\x07\x71\x9f\x54\x4a\x79\x23\x98\xf2\xf7\xea\xe2\x87\xe3\x01\xe1\x23\x36\xf2\x7f\x85\x25\xbc\xb8\x64\xe4\x14\x8b\x53\xf8\x12\x39\xdd\x23\x0c\x65\x3e\xc2\x57\x8f\xfd\xd7\xf1\x9a\xff\xf8\xa3\xdd\x14\xfb\xed\x9f\x86\x7f\x74\x0c\x06\xfe\xfa\x87\x95\xda\x7a\x64\xd3\xfd\x63\x61\xb6\xb8\x1e\x00\x88\x3b\xf6\xaf\x7f\x5c\xc8\xfc\xb2\x62\xd9\x08\xb7\x5f\xff\xa3\x57\xd0\x2b\x21\x4c\x18\x35\x1f\x91\x0b\x09\x19\x32\x3c\x47\x82\x06\xef\xaa\xd8\x7f\xfa\x80\x0c\x40\x83\xe0\xf5\xcd\xa8\x61\x02\xa4\x5f\xd1\xbd\xf7\x39\xf1\x75\x35\x61\x59\x20\xf3\x14\xf6\xf9\x00\x5c\x75\x58\x5e\x7c\x40\x8c\xc4\x46\xdd\x5d\xb9\xad\x1d\x47\x82\xb0\x5b\xae\xa1\x8f\x08\x9e\x24\x20\x09\x75\xa5\x0d\xbc\xca\x61\x81\xb1\x78\x17\xfa\xe2\x54\xb2\x7b\xc4\x2d\xec\xe0\x57\x42\x9a\xaf\xc2\xe5\xf5\x19\x6b\xa0\x5b\x48\x42\xaf\x25\xcf\x49\xad\x41\xe6\x14\xa4\x16\x10\xb2\xd0\xa3\x84\xac\xc3\x9e\xf1\x9c\x94\x5c\x1b\x7a\xc5\x46\xe4\xd2\xaa\x23\x71\x18\x31\xe2\x94\x20\xe3\x42\x66\x57\x2c\x27\xb5\x30\xbc\xe8\x65\x99\x09\x70\xc3\xd6\x46\xaa\x0a\x14\x8d\xad\x33\x2b\xe5\x56\x8a\x0d\xbd\xc2\x84\x4f\xf5\xb0\x18\x23\x43\x0f\xbb\xda\x9c\xd5\x20\x5c\xd5\x19\x45\xd3\x6d\x95\xc3\x92\x2e\xf7\xb5\x27\x31\xba\x93\xa7\x6f\xf7\x53\xc2\xdf\xee\x0f\x40\x32\x3d\x22\xe7\xa0\xb9\x14\xdd\x2f\x25\x26\x4d\xa0\xb5\xdb\x45\xc8\x08\x96\x31\xad\xa9\x9a\x63\x62\x31\x37\x3e\xa7\xbd\xd6\x6c\x52\x17\xa0\x30\x76\xdf\x54\x2a\x6a\x0b\x30\x51\x2c\x93\x42\x1b\x55\x67\x80\x35\x94\x8c\x95\xbc\x62\xa2\x29\xf4\xd1\x83\x99\xc4\x19\xd3\x4d\x52\xa7\x15\xaf\x85\x24\xd9\x8c\x8a\x29\x0b\xa5\x84\x49\x49\x73\xc0\xe4\xef\x82\xf1\xa3\xfb\x66\xca\x80\x17\x74\x62\xac\x58\x68\x00\x41\xc6\x56\x4b\xf0\xd1\x48\xdd\x5f\xec\x53\x48\xf8\x2e\xa3\x80\x26\xc1\x8b\x2d\xa6\x1a\xf6\x8f\x28\x19\x82\xb6\xda\xd5\x60\x98\x20\x82\xa4\x64\x86\xe6\xd4\xd0\x5d\xa9\x21\xf0\x81\xce\x43\x64\x1a\xc6\xec\x03\xea\x46\xb1\xfc\x4e\x4d\xf0\xf6\x21\x59\xf1\xb8\xa0\xf5\xc5\x0f\xc7\xbd\xd6\x07\x83\x10\x60\x2b\x74\xc3\x32\x96\xca\xb8\xd0\x45\xb8\x55\x58\x3a\xc2\x57\x04\xb0\xa0\x79\x48\x90\x8d\xb3\x9c\xe4\x75\x6f\x6f\x76\x23\x22\xf4\x89\x9d\x4a\x12\x39\x65\xf1\x73\x57\x90\xe3\x73\x13\x8c\x9e\xb5\xb3\xd3\x97\x2a\xfa\x18\xb3\xc8\x84\xe1\x8a\x45\x05\xd7\x7b\x81\xe0\xf0\xad\x16\x48\x49\xdb\x98\x87\xa8\x39\x65\x46\x37\x69\x97\x28\x50\xf6\x5c\xd5\x38\x25\x09\xdf\x08\x34\x3f\x8f\x8d\xce\xd7\xb2\x74\x03\x7a\xad\x89\x78\xae\xa5\x13\x1c\xad\xc8\xbd\x75\x64\x4c\x17\x35\x47\x33\xcb\xe7\x3f\xc8\xbc\x7f\xf8\x5d\xda\x38\xd0\x16\x68\x4d\x71\x1b\xac\x01\xa5\xc1\xdd\x89\x0f\x40\x28\xb5\x6e\x15\xb7\x47\x49\x66\x46\xaf\x7b\x17\x80\xee\xec\x0b\x6b\xec\x15\x43\xef\x16\x43\x70\x87\x00\xee\xf0\x4d\x4f\xc0\xfa\x27\x20\xfa\xd1\x33\x11\xb1\x0d\x50\x92\x18\xb1\x47\x28\xf1\xea\x87\x65\xf1\x97\x49\xe2\xc3\x52\x63\x7b\x03\x99\x13\x5b\x5d\xba\x40\x48\x6c\x71\x65\x31\x19\xb7\x4c\xb8\xff\x79\x7d\xd5\x52\x53\x9d\x71\x25\xf8\x37\xb0\xa4\xd4\x81\x77\x78\x8c\x1c\x5a\xfb\xee\x5b\xed\xc7\x0f\x13\x03\x03\x5a\xf9\x72\x1b\x78\xef\x95\xce\x5c\x76\xa4\xb7\x5c\x31\x05\x99\x3a\x51\x69\x4b\x4b\x6a\x94\x2c\x0a\xa6\xe0\x08\x9c\x53\x63\x21\x01\xcc\x9e\x16\xc1\x30\xc0\xee\xfd\x38\xfc\xf0\x6e\xbe\x60\x6a\x13\xec\x26\x68\xd7\x54\x63\xa7\x6b\x1f\x01\x0f\xee\x4b\x9f\xd5\xb7\x0c\x9e\xfe\x24\xef\x47\xef\x0c\x3c\x12\x73\xdc\xfc\x93\x08\x39\xd1\x65\x46\xa6\x16\x54\xae\x09\x13\x74\x5c\x58\x75\x24\x42\xe0\x00\xe7\x82\x74\x6a\x64\xf4\xd4\x27\x36\xe9\xbf\x75\xe0\xc3\x8c\xa7\x5c\x6f\x6d\x14\x6f\x5b\x3f\x1c\x35\xb9\xb0\xce\x36\x93\xa0\x21\xb0\x1f\x0e\xeb\x5a\x4b\xb4\xf3\xa3\x16\xa0\x89\xbb\xcd\x2c\x7d\x83\xbe\x30\x25\xcb\x26\x48\x97\x4f\x00\xfd\x42\x78\x47\xff\x40\x7b\x9a\x5e\x76\x42\x1c\xe9\xd2\x12\x20\xcb\x17\x52\xc2\x52\xc4\x77\xa7\xe6\x3b\x04\xdd\x76\x00\x9f\x37\x01\x4f\xe1\x0f\xaf\x53\x84\x78\xe7\x31\xb3\xd4\xb9\x69\x3e\xd5\xff\x5e\x10\xbc\x1b\xf1\xfa\x4b\x52\x07\x1b\x32\xf7\x1d\x17\x79\x48\xe2\xf4\x45\x61\xad\x80\x76\x74\x71\x86\x50\xa7\x81\xe9\x1d\xf0\x84\xb9\x53\x78\xcd\x8c\xab\x7c\x58\x51\x65\xe6\xe8\xda\x1a\xb4\x20\x0e\xf5\x1c\x13\x2c\x9d\x34\xd2\xde\x5e\xa6\xe4\x28\x07\x47\xe0\xc3\x12\x5d\xdc\xec\xbd\x18\xb2\x6b\x3b\xd2\xb7\x4a\xa4\x1f\xad\x1d\x39\x6f\xda\xa1\x05\x27\xce\x33\xd9\x91\xc7\xca\x18\x27\x6d\x6e\xb6\xbb\xb2\xb6\x65\xb5\xba\x9d\xbb\x84\xa2\x2f\xd8\x2b\x9c\x1b\x52\xc6\x65\xc3\x82\x96\x09\x56\x7e\x3b\xd3\x80\xf0\x89\x15\xda\xa4\x18\x42\xe4\x63\x6f\xf0\x9a\xb0\x27\xa7\xe9\x8e\x5c\x7a\x33\x5a\xe0\x81\x30\x45\x50\x46\x4b\x37\x74\x90\x1c\x08\xd9\xdd\x40\xef\x07\xd0\x56\x5c\xeb\x10\x33\xda\xef\x89\x24\x19\xf7\x6f\x61\x45\x1a\xc9\x33\x36\xdd\x47\xbc\xc0\x8b\xc4\x5c\xe4\xf6\x52\x81\x88\x04\x46\x7d\x5d\x67\x19\x63\xc1\x65\xe8\xc8\x52\x7f\x95\xb6\xc5\x7b\xdc\x96\x97\xd4\x64\x33\xa6\x89\x96\xd0\xeb\x58\x1b\x5a\x14\x2c\x0f\xa1\x4e\x88\x28\x12\xb4\x0a\x17\x06\xd5\x1b\x8e\x48\x59\xe9\xbf\xc5\x91\x63\xc4\x79\x5d\xab\x82\x3a\xa7\xd2\xa4\x16\x19\xe6\x2f\x72\x33\x0f\x51\x26\x8b\x8a\x29\xd8\xa1\x35\xf8\xda\xfa\xab\x3e\x13\x8c\x18\x89\x6c\xca\x01\x99\x81\xf9\xcf\x91\xdd\xcf\xe8\x35\x6b\xa2\x3d\x5c\x97\x48\xcb\xa5\x43\xa9\xdb\x04\xb8\x1e\x95\xca\x1d\xa0\x86\x10\x0b\xec\x62\x3f\x0e\x06\xe7\x22\xb5\x2a\x13\xef\xc3\x41\xb4\xe9\x77\x54\x9c\xc3\xa0\xda\x68\x66\x42\x11\xef\xfe\x12\x2f\x71\xf1\xf3\xb4\x36\xb2\xa4\x86\x67\xe0\xa2\xe3\x93\x28\x48\xac\xc4\xc0\x0b\x4b\x69\x7c\x20\x3c\x8a\x48\x20\xb8\xb9\x73\x4b\x44\x06\x96\x2b\x4b\x8f\xb0\xf1\xd1\x5e\xbb\x53\x6e\x6f\xab\xdf\x96\x48\xf4\x4c\xf4\x9e\x9f\x7d\x45\x64\x62\x66\x8a\x31\xc2\xcb\x4a\x2a\x43\x85\x21\x39\x9f\x84\x1a\xdd\x3e\xc2\x70\x15\x4e\xa4\xb0\x07\xfd\x08\x71\xb5\xd1\x2a\xe8\x30\x2d\x0a\x79\xa3\x89\xb9\x91\xc1\xe5\xd0\xc4\x77\xb9\x9a\xc7\x83\x36\x30\x09\x64\x1c\xb7\xaa\x65\x75\x16\xaf\x22\x3e\x34\xb0\xb4\xe7\x86\x15\x85\xfd\x77\x15\x37\xea\x5d\xc7\x64\xe9\x9e\xf0\xa9\xc0\x32\xb4\x5c\x7b\xe7\x97\xab\xa1\x72\x90\x2b\x59\x55\x2e\xf8\xa1\x3c\x4c\xbf\x27\x10\xbc\xae\xae\x99\x86\x24\x13\x5f\xd7\xc5\xa2\xc2\x94\x09\xa6\xa8\x81\xf0\x3a\xd7\xcf\x15\x44\x92\x45\x20\xfb\x3a\x7d\x70\x24\xb4\x8b\x3c\x80\x74\x18\x7a\xb9\x1c\xc9\xfc\x33\xee\xdb\x04\xef\xc5\x05\xe2\x9b\xa7\x3b\x09\x10\xe8\xe0\x5b\x66\xe8\x21\xf9\x5e\x23\x5a\x04\xce\x1b\xea\xf0\xac\x65\x65\x73\xf5\xd6\xd1\xd0\x96\x00\xa8\xa3\xa2\x9a\x45\x50\xc5\x76\xa9\x50\x42\xae\xbd\xd7\x2d\x78\x8f\x95\xd4\xfa\xdc\xff\xe4\x09\x41\x7f\xb1\x59\x3d\x30\x5e\x6c\x56\x2f\x36\xab\x17\x9b\x15\x8c\x17\x9b\xd5\xe2\xf8\x52\x6c\x56\xa4\x61\x57\xbb\x4a\x9b\xce\x63\xd5\xa5\xcd\x60\x1f\x79\x9f\x09\x39\x97\xc6\x85\x18\x83\x06\x4b\xef\x75\x3a\x51\xe0\xd0\x37\x74\x3e\x12\xcc\xb8\x4e\x26\xde\xbf\xfb\xc9\xc3\xf4\x17\x65\xb5\x11\x67\xfa\x88\xe8\x86\x27\x64\xbe\xbd\x4d\xb4\x8a\x91\x28\x9a\x35\x11\xcf\xf0\xf9\xbe\x76\x71\xad\xf6\x7b\x28\x59\x18\x4f\x90\xb1\x11\xb9\x74\xb9\x2e\x0b\x8b\xdf\x6d\xb2\x90\x33\x43\x79\x9f\xde\x4d\xf1\xf0\xd2\xd0\xe7\x7b\xa4\xb3\xad\x49\x3b\x24\xe5\xb5\x09\x45\x97\x76\xcd\x14\xdb\x14\x71\x8b\xb2\x73\xe3\x9c\xfe\xe6\x81\xc7\x8a\xf0\x39\x9b\x90\x4f\x2c\x93\xd7\x4c\xe1\xe9\x9e\xde\x56\x54\x68\x2e\xc5\x3b\xca\x0b\x7b\xb6\xfe\x8c\x1b\x6f\x37\xa9\x35\x53\xed\x10\xc8\x28\x44\x23\x5c\x70\x87\x48\x16\x7b\xfb\x2b\x28\xa1\xbb\x89\x5d\xcf\x65\xd0\x55\x8a\x5d\x73\x59\x6b\x5f\xf9\xa0\x36\x28\x69\x68\xe3\x2c\x44\x33\x3e\x9d\xf9\x87\x7d\xc6\x2a\x44\x5d\xab\x3c\x5c\xe2\xde\x90\x69\x43\x4d\xad\xdb\xe5\xa7\x33\x08\x3c\xdc\xa1\xe8\xab\x80\x47\xbb\xa3\x84\xa4\x14\xd7\xb1\x02\xc5\xae\x32\xc4\xf7\x58\x1f\x03\xa7\x1e\xbb\xbb\xec\x4b\x7d\x34\x65\x4d\x32\x59\x56\xb5\x61\xd1\x9d\x77\xb7\x2b\x0d\xa9\xdf\x10\x99\x5a\xfd\x9f\x5e\x95\x54\xd0\x29\x1b\x06\xd0\x86\x4d\x95\x8f\x57\xc9\x28\x7d\x12\xb4\x22\xc9\x9b\xff\xc4\xe3\xd9\x55\xe7\x68\x8f\x64\x75\xf6\xc8\xa3\xd4\xda\x23\xe9\xeb\xed\x91\xc7\xaf\xb9\x47\x42\x09\xd4\x5d\x25\x40\x9f\x1c\x7c\x8b\x24\xc8\x09\x19\xab\x48\x50\x4a\x55\xd9\x09\x1b\x0e\x16\xae\x89\x2c\xb9\x31\xcc\xa7\x23\x06\x92\x32\x20\xdc\xb4\xaa\x63\x3a\x02\x0a\x0e\x4e\xcc\x1e\x64\xb7\x55\xc1\x33\x6e\xa2\xf6\x75\x1d\x0b\x48\x2c\x0e\x30\x20\xdc\x70\x8d\xa2\xbc\x20\xbc\xac\x0a\x16\x24\xf0\xa1\xab\x2e\xe4\x9d\x70\xe1\x6d\x32\xc8\x4d\x21\xec\x16\x5c\xb1\x08\xf0\x0b\xdd\xde\x70\xbc\xd0\xed\x7b\xc6\x0b\xdd\x4e\x4e\xb7\xb1\x76\x69\xff\x52\xc0\x2d\x7a\xed\x27\x75\xdd\x97\xe8\x98\x15\xe4\xe7\x9a\xa9\x39\xb1\x0a\x56\x53\x17\x44\x5a\x62\xa7\x79\x8e\xf5\x2b\x7c\x4c\xc7\x0e\x79\x08\x52\x0a\xe7\x10\x33\x72\x7a\x6b\xf5\x5b\xe8\x4a\x91\x9c\x4b\x2e\x2e\xd0\xee\x7d\x85\xa7\x10\x4e\x26\xd6\x4a\x31\x91\x2a\xfe\x04\x54\xcc\xa3\xf3\x93\x94\x06\x8c\x14\x69\x2a\x24\x5d\xaa\x0a\x79\x24\x21\x83\x90\xa3\x15\x7b\x8d\x67\x12\xbe\x01\x3e\x1e\xd2\x9a\x82\x37\x97\x5c\xb1\xf9\xc0\xa5\x7a\x12\x8b\x81\xd4\x3f\x9c\x08\x44\xcc\x9e\x47\xf1\xe7\x8a\x61\x1c\x47\xbf\x5e\xa5\xed\x91\x98\x21\xa6\x74\xd5\xe1\x18\xda\xd7\x4e\x36\x97\x3f\xa2\x34\x3c\x3a\x31\xcf\x27\xf6\x55\x53\x4d\xb5\x70\x67\x2c\xee\x38\xeb\x36\xe2\xbc\xfd\x20\x54\xa3\x0c\x68\x0e\x95\x42\x81\xe0\xa7\x41\x2f\x92\xda\x99\x80\xc3\x1f\xe3\x23\x6d\x56\x32\x02\x43\x22\x58\xdb\xf5\x0c\xaf\xd8\x7c\x5f\xbb\x36\x24\x52\xe8\x19\xaf\x40\x7c\x87\x60\x26\x39\x49\x7a\xc5\x71\xfc\x00\xe9\xb0\x1e\x18\xe4\x1b\x67\x62\x40\xce\xa5\xb1\xff\x9c\x42\x71\x0a\x20\x2f\x27\x92\xe9\x73\x69\xe0\x93\x9d\xc6\x02\xdc\xa4\xe7\x80\x03\x2e\xe6\x88\x43\xc4\x0f\xb0\x57\xac\x5f\x0d\xb5\x0a\xdd\x59\xfb\xac\xa3\x80\x2f\x5c\x93\x33\x41\xa4\x72\x47\x94\x10\x1c\x30\xcd\x23\x48\x08\x8c\xf7\x77\x37\x41\x81\xcb\xa0\x71\x38\x22\x55\x0b\x45\x9e\x04\x30\x07\x14\x78\x7d\xf0\x1b\xf0\x6e\x41\x2c\xac\x2f\x5d\x00\x45\xaf\x14\x35\x6c\x9a\x20\x88\xb7\x19\x25\x53\x53\xe8\x13\x94\xcd\x52\xdf\x86\x54\x82\x16\x8e\x84\xe2\x16\x8e\x47\xb8\xb2\x8f\x9a\x2d\xfc\x24\x0b\x80\xec\xfe\x1e\x4a\x7c\xec\xaa\xf5\x2c\x02\x11\xa5\xd8\x92\x56\x96\xde\xfc\x97\x15\x56\xe1\x7a\xfd\x37\xa9\x28\x57\x7a\x44\x8e\x88\xe6\x62\x5a\xb0\xd6\x77\xce\x59\x1c\x4d\x93\x08\x2c\x88\x65\xb1\xf2\xe1\x35\x2d\x18\xd6\x69\xa2\x82\x30\x34\x57\x41\x7d\xee\x05\xc5\x68\x40\x6e\x66\x52\xa3\xe4\x1b\x52\x0c\xf6\xae\xd8\x7c\x6f\x90\xc4\x15\x46\x62\xfe\x6c\xa7\x3e\x13\x7b\x4d\x23\xb8\x16\x25\x0a\xb2\x3f\x44\x3c\xee\xc1\x77\x7b\x4f\xa3\x8f\x3d\x03\x73\xd5\xb3\x48\x72\x72\xee\xc6\xe3\x82\x62\x88\xc0\xae\x39\xd7\x17\xe1\x5b\x8c\xf8\x81\x4a\xf7\xd1\x33\x4d\x78\x87\xab\x72\xb6\x73\x5e\x5c\xa8\x5b\x9c\xa8\x78\x46\x02\xe4\x42\xb0\x8e\x8c\x51\x7c\x5c\x1b\xa6\x77\x16\x13\xee\x05\x34\x2a\xeb\x16\xfa\xa7\xda\x93\xff\x61\xd9\x0f\xa2\x0a\x78\x5c\xa7\x42\x8e\xb3\xc9\x62\xec\x64\x54\x52\x37\xae\x8b\x20\x95\xab\xb0\x77\x27\x0b\xcf\xfe\x4d\x03\xa8\xae\x86\x7a\xff\x70\xaa\x26\x58\x53\x31\x5d\x49\xcc\x3a\x5b\xba\x31\x4e\x90\x9c\x51\x0d\x51\xf7\x13\x17\x14\x55\xd5\xaa\x92\x50\x0b\x9d\x8a\x3b\x97\x31\x49\xdd\x08\x57\x24\xc4\x17\x61\xc2\x82\x73\xe1\xe6\xda\xfb\x1e\xfa\x5f\x1e\x2d\x74\x7e\xc1\x90\x91\xa8\x8b\x84\x90\xcb\x5f\xae\x37\x9c\x3e\x5d\x09\x6d\x01\xa1\xe6\x3d\x82\x88\xd5\x05\xf7\x31\x88\x36\x0a\xa6\xb1\x9a\xad\x89\x63\xe6\x8d\x6c\xc3\x0f\xa5\x10\xb1\xe5\x45\xef\x16\xaa\x04\xf1\xb0\x16\x4d\xd8\xae\xe7\xd9\xcb\x53\x4c\xa0\xcf\xc6\x58\xd6\xc2\xa1\xac\xef\xd0\xf1\xb8\x1b\x68\x77\xc4\xd7\x9f\x0c\x60\xb9\x8b\x10\x95\x2d\xe1\x13\xbb\x2f\xae\x3a\x64\x8a\x7d\x69\x45\x54\x43\xc4\x9e\xc2\x43\x1a\xcf\x97\x53\x16\x92\x4b\x86\x27\x0a\x50\x0c\xf0\x1c\x97\x6f\xa5\x7b\xb9\xfe\xcc\x0e\xb3\xb6\x28\xb9\x60\x78\x53\xb5\xa1\x86\x41\xba\x90\x62\x93\x02\x6b\xd2\xb9\xdd\x2b\x65\xce\x27\x2e\xeb\xe2\x32\x8a\x5e\x1a\x60\x81\x52\x57\x47\x34\x6e\x42\xda\x1b\xbc\x54\xc7\xd1\xab\x37\xcb\xb0\xa1\x92\x43\x60\xa5\x2c\x81\x13\x74\xad\x24\x97\xe5\xfc\xe4\xfe\xe8\x49\x72\x20\x27\x13\x7b\x5c\xbe\x3f\x55\x1a\xd7\x50\x32\x9e\xff\xa1\x77\x4f\xf4\xc7\x62\xf2\xd0\x5a\xdb\xb7\x11\x69\xb5\x37\x6b\xf2\xca\x1f\x49\xce\xfb\x01\x58\x8a\x9c\x90\x77\xbc\x60\x7a\xae\x0d\x26\x8c\xf2\x12\xe9\x3e\xa6\xd4\x4a\x43\xb8\xc8\x8a\xda\x05\x20\x22\x17\xb0\x74\x77\xc7\x4e\x38\xb9\x18\xd7\x4c\xeb\xe5\x70\x9f\xc9\x7e\xa7\xd4\xef\x22\xa5\x84\x34\xe7\x70\xbd\x92\x9c\x56\xaf\xdd\x9a\x74\x2a\x85\xd9\xda\x8d\x49\xd6\xb6\x5f\xbf\xe3\x63\xc5\xc8\xf1\x8c\x0a\xc1\x8a\xa8\xc7\xa6\x0b\x77\xa1\xc6\xd0\x6c\x86\x5c\x87\x12\x4b\xf1\x0a\x66\xa5\x86\x99\xd4\x86\x94\x34\x9b\x71\x11\x9a\x73\x89\xd0\x6b\xb6\xa9\x9c\xfc\x0c\x9b\x03\x4c\xf4\x67\x0b\x40\xc7\x73\x4e\x45\x5c\x10\x0a\x8f\xb1\x93\xe6\x62\x03\x55\x31\x92\x40\xe8\x54\x82\xc6\x84\x77\xe6\x0e\x7d\xb3\x3d\x95\x82\xb3\x46\xeb\x0a\xf0\x77\x78\xb6\xfb\xca\xa7\xb7\x23\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x21\xb8\x8a\x8b\x48\xdc\x61\xee\x07\x56\xc4\x8a\x84\xc5\x7e\xa5\x97\x7b\x50\xac\xa2\x16\x49\xf0\x63\xbf\xa8\x85\x3d\xe2\x8f\xae\x7d\xf5\x5b\xf2\xee\x98\x18\xaa\xa6\xcc\xd8\x35\x88\xa8\xcb\x31\x53\x5d\xdb\xdc\xa6\x08\xb6\xc1\x2e\x25\x30\xcb\x37\x5f\x77\x9a\x43\x31\x9a\x7f\x14\x45\x67\x7f\x68\xaa\x0b\xe5\xe1\x68\xef\xf7\x49\x14\xec\x37\xa1\x85\x66\xe4\xc0\x3e\xf8\xea\x46\x71\xc3\x0e\x47\xe4\x93\xff\x15\x94\x0c\x00\x99\x79\x22\xfb\xc8\xa5\x98\x69\xe3\x26\xd5\xcc\x60\x9d\x67\xe1\x04\xb5\x0f\xf6\x52\x77\x96\x56\xf1\xc0\xc7\x52\x16\xac\x63\x19\x7c\xc4\xbd\x1f\x7f\x3c\xef\x6c\x4e\x6c\xe3\x77\x33\xdf\x7d\x68\x7e\x23\x55\x91\xdf\xf0\xdc\x25\x6b\x91\x03\xfb\xf0\x61\x3f\x94\xef\xe3\x8e\xe9\xe9\x7c\x49\xdd\x0a\x30\x8d\xdf\xe3\xe6\x86\xe7\x69\x4e\xb4\xc7\x05\x04\x20\xda\x38\xe0\x8d\x49\x16\x07\x08\x20\x01\xcf\x99\x30\x96\xb8\x2b\x4d\x0e\xe0\x17\xdd\x6b\x8f\x9e\x72\xec\x15\x03\xeb\x4a\x45\x32\x59\x8e\xb9\x68\x5a\x39\x35\xb8\x69\x05\x18\x4b\x6f\xbd\x97\x52\x33\x83\xfd\x17\xa0\x12\xa4\x34\x33\xa2\x79\x59\x17\x86\x0a\x26\x6b\x5d\x74\x2e\x41\xf2\x82\x9e\x77\xc6\xa4\x60\xb7\x48\xfb\xb6\xd5\xa8\xb2\x81\xa0\x2d\x19\x43\x75\x8f\xa6\x9b\xde\xa2\x68\xdc\x69\xad\xa6\xa4\x54\xfe\x2a\x88\xd6\xa1\x37\x0c\xbb\x65\x99\xab\x3c\x5b\x15\xf5\x94\x77\xac\xbe\x7f\x62\xdf\x22\xa3\x86\xe5\x6f\xc9\xbb\xe6\xe5\xa0\xae\x99\xff\x66\x44\x8e\x7d\x1c\xa8\x5b\x9e\x1c\x5f\x9e\x9d\xb8\x86\x6a\x42\x1b\x46\xb7\x21\xbb\xf7\x0b\x3a\x1b\x3a\xf3\xf5\x16\x94\x06\x5c\x38\x09\x89\x6d\xba\xda\x2d\xfa\x8c\xdc\x37\xae\x5b\x79\xe8\x3a\xdd\xaf\x01\x58\x6f\x92\xf0\xa2\x2f\x6d\x4d\x5f\x8a\x9b\x54\x47\x60\xe5\xac\x62\xc2\xf2\x3c\x11\xdf\x7f\xdc\xe7\xad\xa1\x89\x84\x33\x4e\x24\x57\xba\xc9\xda\x42\x65\x64\x03\x9d\xc9\x22\xd7\x84\xdd\x1a\x45\x2d\xdb\x2f\x2d\x83\x0f\xbf\x99\x10\x2a\xe6\xa3\x7e\x22\x66\x2f\x57\x7e\x5a\xf7\x7d\xef\x93\xd9\x6d\x0d\x2d\x7f\xd1\xd0\xe2\xa1\x59\xa6\x98\xe9\x51\x7a\x2e\xd5\x69\x05\x40\xda\xc7\xd5\xfa\xf8\x8e\x81\x15\xbf\xf5\x85\x2d\x5c\x28\x4e\x1f\xbb\xb1\x66\x42\x73\xc3\xaf\x5b\x1d\x55\xa1\x74\x2c\xd5\x3a\xd8\x21\x41\x98\x72\x04\x50\xb7\xaa\xba\x76\x5e\x18\x7d\xa2\x7c\x42\x84\x5c\x78\xab\xb8\xdc\x47\x08\xbf\x6c\x3d\xd2\x79\xd1\x10\xbb\x54\x62\x33\x72\x2a\xa0\x48\x24\x4e\x3e\x80\xfa\x74\xf8\xdf\x18\xbe\x64\xf7\x20\xb2\xc6\xc2\x2e\x74\xdf\x69\xb7\x7b\xdb\x23\x9b\x29\xc2\xf4\xfb\x56\xf5\x49\xe9\x3b\x3a\x8f\x44\x3b\x5f\xd0\xa5\x9f\x7b\xa1\xdd\x7d\x8f\x4d\x26\x2c\xb3\x77\x03\x3a\xfe\xf9\xf6\x75\x56\xad\xcd\x6b\x74\xfb\xf9\x22\xae\xed\x22\xac\x7d\xcb\x15\x46\xd1\x04\x4d\xc4\xef\x99\xd0\x86\x42\x5d\x4d\x78\x63\x2b\xa7\x59\xe1\xc9\xf5\x6c\x74\xd7\x09\x63\x23\x7c\x75\xce\x9e\x40\x94\x56\x0c\xcb\x98\xb2\x37\xa6\x98\x93\x1b\x25\xfb\x26\xba\x6d\xe8\x03\x96\xd7\x4c\x5d\x73\x76\xf3\xca\x55\xf9\x19\xda\x97\x1d\xba\xc2\x89\xaf\xc0\xdc\xf5\xea\x57\xf0\x4f\x0f\xa8\x12\x79\xdf\x1c\x97\x7d\x4b\xf6\xf6\x52\xd8\x05\x7a\x87\xfb\x4d\xa0\x71\x69\x27\x85\x2a\x8d\x4d\x00\x96\x5f\x70\x95\xb9\x0f\x9d\x41\x60\x1d\xd7\x98\xe3\x35\x91\x40\x6e\x2f\xbb\x9f\xc8\xc5\x8e\x10\x6d\xf1\xa4\x29\x4c\x55\x0b\xd1\x39\x27\xb3\xad\xfb\xe3\x32\x2d\xc5\x3f\x04\xd8\x70\x31\x34\x8a\xb1\xf0\xaa\xc6\xa9\x4f\x42\xfa\x66\xf1\x41\xb1\x79\x86\x4e\xbc\x9c\x1a\xaa\x99\xe9\xe3\x4c\x4e\x45\xea\x23\x50\xec\xfe\xc6\x54\xdf\x7d\x05\x31\x6a\x0c\xaa\x7b\xfb\x7e\x98\x64\xf8\x27\xa7\xfa\x8b\xd6\x93\x56\xe9\x77\xe7\xda\x9d\x93\x63\x15\x27\xe8\x70\x83\x36\x20\x5c\xbb\x41\x92\x6d\xe9\x88\xee\x2d\xbf\xff\xfe\xec\x24\x8d\x29\xa5\x99\xcf\x5b\x06\xe0\xbf\xdb\xdb\xef\x2e\x29\xc4\x96\xf1\x9f\xeb\xd8\x08\x6d\x9f\x6c\x2e\xbe\x7b\x7e\x1b\xbb\x33\xcd\x58\x13\x9c\x70\xc2\xf5\xd5\xb6\x28\xe3\x1d\x40\xda\x34\xf2\x2f\xc7\xa7\xc4\x7d\xba\x2a\x92\xa0\xd3\xd2\x4f\x13\x7d\xd0\xa6\xa1\x7f\x39\x3e\x5d\x78\xdd\x05\x33\xea\x51\x51\x78\x5b\x8f\x14\x3a\x14\x42\x75\xd4\x35\xd1\x16\x03\x6d\xb6\x12\xbd\x62\x39\x57\x18\x52\xe7\xdf\x32\x1f\x65\x9a\x87\x46\x71\xd3\x2b\x36\xe2\x32\x0a\xe5\xed\xb6\x05\xbd\xa2\xdd\xf4\xaf\xa6\x19\x6b\x02\x25\x73\xae\xaf\x9e\x9f\x25\xb9\xca\xcf\xbb\x15\x06\xfe\xd2\xc2\x4f\x16\xcd\x9d\x8e\x76\x3a\x21\x08\x6e\xf7\x5c\xd6\xe4\xc6\xf5\x6b\xef\x69\x66\xfd\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\x26\xab\x79\x11\x04\xab\x61\x3f\xba\xd1\x95\x96\x55\xc1\xf4\xdb\x2d\x87\xaa\xec\xc4\x55\x24\x29\x78\x7b\x45\x95\x01\xab\xe7\xb6\x51\x3b\x00\xe2\x45\x82\xe8\x03\xf1\x98\xb8\x7d\x36\xf1\x75\xa7\xda\xc1\xeb\x5c\x87\xc9\x9b\xc8\x6e\x90\xfe\x52\xe0\xef\x3b\x19\x34\x96\x57\x39\xbb\x7e\xa5\x73\xfa\x66\x00\xaf\xe5\xeb\x66\xb6\xf7\x80\x6a\xb2\xf7\x66\xaf\xfb\xca\x97\xbc\xe4\x05\x55\x05\xf6\x91\x09\x0d\x7a\xc2\xfc\x96\x43\x7a\x40\x20\x55\xef\xf5\x1e\x39\x90\x0a\x20\xca\xa8\x20\x05\xf3\x3d\x67\x1c\x25\x9d\xa3\x71\xa0\x47\x24\xf2\x4e\x5d\xa1\x6d\xc7\x63\x21\x63\xdb\xfa\x25\xcc\xbd\x3e\xe4\x64\xee\xd8\xcf\x79\x71\xd2\x88\x8f\x5c\x58\x19\x6c\x44\xbe\x77\x92\x9d\x93\xcd\x11\x6b\x73\x10\xc8\xf0\x89\x2f\x03\x3b\xbe\x24\x37\xce\x82\x43\xe6\x51\x1d\x2b\xe4\x6e\x24\xdf\x17\x82\x11\x5d\x9d\x45\x53\x6e\x3e\xb1\x4a\x6e\x4d\x4f\xc4\xe5\x17\x42\x6a\xb8\xb1\x1f\x48\xcd\x8d\x54\x73\x42\x0d\xa1\xc8\x19\xb2\xba\xa0\x8a\x28\x86\xc1\x31\x09\xd4\x36\xb7\xfa\x82\xb2\xf6\x59\x36\x11\x38\x71\xdd\x47\x67\x86\x0e\xf0\x0d\x1c\x37\xee\xe8\xa3\x3b\xb5\xfc\xea\x84\x2b\x4b\xa5\x21\x33\xfe\x4c\x70\x73\x1c\x16\xc3\x12\x54\x85\x14\x2e\x47\xc7\xae\xe8\xa2\x70\xa6\xdc\xb8\xb6\xc4\x08\x80\xfd\xda\xcf\xd6\x09\x14\x80\x00\x68\xaa\xcc\xf7\x75\xf3\xc6\xcf\x30\xb6\xa7\x41\x9c\x6d\xd8\x13\x41\xed\x96\x6a\xeb\xd4\x35\x00\x12\x1a\x6b\x60\x1c\x6d\xf3\x79\x3f\xc1\x11\xe2\x5c\x84\x0c\xce\x59\x22\x15\xd1\x86\x2a\x83\x77\x64\x7f\x34\xda\x1f\x81\x28\xbb\x3f\xda\xf7\x8a\x58\x11\x52\x88\x9d\xb4\xd7\x00\xe3\x53\x28\xfb\x14\x79\x68\x53\x8d\x11\x21\x1f\x7d\xa5\x54\x68\x01\xba\x90\xc5\x1c\x12\x94\x8b\x22\xbc\x03\x34\xaa\x69\xd3\x9e\x1e\x9e\x50\xf0\xe7\xd6\xe3\xf8\x25\x5d\x32\xf4\x94\x5f\xbb\x0e\x7a\x5b\x0b\xb3\x69\x5e\x31\x09\xa6\xc6\x3b\xe6\x0c\xa8\x9f\xde\x6f\xef\xdd\x90\x74\x27\x7a\x33\xc7\x07\xdc\x7b\x65\xb2\x2c\xb9\x21\x33\xaa\x67\xc1\x8a\xd7\xa4\x25\xf7\x63\x4d\x7d\x8d\xbf\x45\xad\x0d\x53\x93\x4e\xb4\x2b\x09\x33\xf7\x00\x2c\x18\x7b\xc3\xc7\xae\x8e\xb3\x68\x4c\x31\xc0\xe4\xf4\x8c\x2a\x66\x9f\xac\x80\xfb\x14\x7c\xc2\x0c\xef\x7a\x39\x5a\xfc\x3d\xac\xbc\xda\xb9\xd5\x00\x9e\xd8\xbd\xb5\x54\x48\x64\x4e\xe9\xf6\xed\x5c\x9c\x40\xf8\x2a\x40\xf1\xea\xd3\xe9\xd1\xc9\x87\xd3\x51\xd9\xc5\xc3\xb2\x65\xf6\xcb\x44\x5e\x49\xde\xb5\xa3\xc6\x90\x54\xd4\x74\xe9\x5b\xdb\x97\x71\x07\xb0\xb7\xcd\xb8\x03\x20\x9e\xe0\xf8\x0f\x50\xf5\x85\xfb\xe2\x3a\xec\x44\xe8\x6d\x64\x25\x0b\x39\xed\xd1\xf4\xb4\x1f\x9e\xfe\x0a\xeb\x58\x0c\xe9\xb0\x92\x5b\x73\x0b\x5a\xd4\xd9\xf6\xf1\x59\x18\xfc\xc9\x35\xc7\x13\xac\x5b\xa6\x47\x4d\xb9\x2f\xe0\x84\x9e\x85\xed\xe1\xce\xb1\xa1\xbd\x1e\x78\x17\xcb\x51\x8a\xb3\x13\x0c\xa1\x32\x58\xc5\x54\xc9\xb1\x7a\xd9\xae\x1a\x25\xb6\x82\x25\x5d\xed\x11\x56\x2a\xb8\xe8\x78\x91\x53\xa0\x87\x5f\xbf\x2d\xc2\x54\x8a\x0d\xa1\x44\x88\xd5\xbe\x27\xbc\x80\x72\x47\x8d\x64\x1f\x49\x34\x9d\x16\xf5\x3e\x6a\xef\x04\xc7\x99\x8b\xf9\xa2\xaf\xba\xd1\xcb\x43\x2c\x02\x36\x17\x2e\x8a\x6e\x99\x62\x50\x31\xca\x8a\xb1\xce\x6f\x46\xa7\xf0\xc2\x52\xb9\x3e\x95\x95\xe2\xd7\xbc\x60\x53\x0b\xc2\x8c\x8b\xa9\x6e\xfa\x5c\xb9\xf0\xbd\x4e\xcb\x42\x25\x2b\xd6\x48\x81\x21\x0c\xea\x03\x04\xe3\x85\x16\x10\x78\x35\xcf\x3f\x7e\x26\x82\x21\x08\x1d\x2f\x59\x4f\x53\x9d\x05\xb2\xa3\x60\xb2\x6d\xff\xf4\x76\xc4\xa9\x9d\x61\xc5\x3e\x84\x67\xd9\x55\xed\xe5\xa2\x43\x6f\x18\x32\x7b\x4a\xf4\xbc\x2c\xb8\xb8\x82\xc6\x30\x8e\x9d\xb8\x26\x8b\x8c\xd8\x2f\xfc\x05\x56\x8c\x16\xe9\xc5\x80\x27\x42\x65\x92\x42\x04\x30\x3b\x10\xb5\x00\x4a\x9e\xa5\x7a\x7f\xf5\xc4\x1e\x7d\x0b\x49\xf8\x77\xe7\xc8\xd8\x67\x7d\xb4\xbc\xa4\xd3\xad\xa5\xe6\xc2\xe2\x2d\x86\x2d\xc8\xc7\xe3\x33\x9f\x69\x71\x10\x9b\xf0\xf1\x59\xa9\x08\x55\x86\x4f\x68\x66\x0e\x49\x55\x17\x85\x33\x0a\x78\x21\xcf\x51\x89\x7b\xa2\x75\x3b\x01\xf9\xb9\x31\x3a\x42\xca\x8b\x96\xc5\xb5\x5d\xd5\x90\x4a\xe6\x68\x3b\xad\x2b\x17\x02\x8c\x05\xf4\xc8\xcd\x8c\x67\x33\x72\x51\x17\xc5\x85\x2c\x78\xe6\x03\xdf\xb9\x46\xf7\x44\x6e\xd9\x42\x47\xbe\x70\x54\xdc\xd0\xb9\x7e\x1b\xbf\x25\xa1\xf0\x19\xa1\xc6\xb0\xb2\x42\x64\xb6\x5b\xb3\xd8\x08\xb6\xf1\x50\x80\xb0\xc8\x2d\xa0\x40\xf2\x28\x2f\x02\x65\xac\xdd\x07\x1d\xf9\xf5\x90\x9c\xb3\x6b\xa6\xda\xf0\x09\xfb\x11\x4c\xad\xdb\x30\xc1\xd1\x81\x34\x5e\x6b\xb0\x23\x15\x32\xa3\xc5\xdd\xa3\x7e\x00\x76\x3e\x59\x98\x96\x6b\xb1\x6f\x88\xc3\xaa\xae\x2f\x72\x36\x39\x97\xe6\x02\xe7\x68\xbf\x0f\xbe\xc9\x3d\xab\xd2\xc2\xea\x18\x73\xbf\xba\x45\x87\x9c\xeb\xab\x5e\xaf\x10\xec\x5e\xf1\xf1\xf4\x45\xe6\x29\x33\x16\x9d\x87\x01\xa3\x1d\x0c\x16\xab\xe1\xbb\xdc\xbe\xac\xbb\x5f\x8a\xb9\x82\x97\x03\x87\xdc\x71\x81\x4b\x76\x43\x14\x2b\xa5\x41\x39\xd7\xc2\xeb\xdc\x02\x99\x2c\x19\xa1\xd7\x94\x17\x74\x5c\x40\xac\xb3\x9d\xdc\xcd\xd5\xd9\xda\x7a\x04\x3b\x00\x11\x64\xd2\xdf\x47\x8b\x2d\x01\xe7\x11\x7f\x5c\xb1\xf9\xf8\x92\x22\x58\x85\xcc\xae\x62\x59\x75\xa2\x64\x89\x8f\x60\x9e\x7e\x0e\xb9\x63\x34\xcf\x89\xe6\x53\xc1\x27\x3c\xa3\xc2\x90\x82\x1a\x26\xb2\xf9\x88\xb8\xf6\xb5\x3a\xf8\x3e\x14\x33\x8a\x87\x3c\x7f\x21\x55\x49\x0b\xbf\xc9\x63\x9a\x5d\xc9\xc9\x04\x66\x6d\x9e\x77\xa1\x6d\x8e\x58\xe1\x9e\x50\x2d\x05\x2e\xce\xb4\xa6\xd3\x1e\xc4\x0a\xfa\xd2\x5b\x01\xca\xa5\xa2\xe0\x29\xb9\x82\xb4\x9e\x50\xfa\x6a\xb3\x3e\xd9\x41\xf9\xe2\x76\x4d\xf1\xba\x80\xaf\xaa\x16\x86\x5b\xf2\xd7\xea\x58\x47\xc0\xc7\x7a\x27\x54\xd7\x2e\xe5\xda\xff\x41\xb9\x0d\x57\x94\x0e\x92\xd7\xae\xa1\xb7\x05\xc2\x77\x27\xc2\x6f\x91\xd4\x43\x9e\x53\xf7\x5d\x88\xf8\x08\x60\xb3\x7f\x71\x6e\xa1\x76\xc5\xd4\x1b\xe9\xf2\x00\x2a\xe5\x35\x48\xf1\xb7\xaf\xfe\x3e\xba\x8e\xe3\x16\xe0\xe7\x56\xe4\x38\xb4\xf0\x96\x4c\x4d\xb1\x6e\x1c\x23\x25\x15\x7c\xc2\xb4\xc5\x90\xb9\x45\x27\xe7\x8f\xd2\xb4\x64\xe4\xc6\x22\x12\x46\x0d\x2f\xbc\x5e\x47\xfa\xfa\x79\xc1\x03\x16\x9d\x68\x63\xda\x38\x50\xf2\x10\xce\x02\xda\x44\xdc\xb2\xac\x36\x70\xff\x20\xce\x92\x1c\x08\x69\x3f\xeb\x18\x6f\x75\x59\x8f\x51\x7c\x86\x65\x17\x5e\x0d\xd3\x12\x85\x34\xd1\xe9\x3e\xb8\xb3\xba\x1e\x57\xb8\xaf\x6c\x62\xe5\xa8\x37\xa3\x6f\xbe\xe9\xbe\x39\x98\x1d\x07\x6b\x6a\x96\xd5\x8a\x9b\xb9\x25\xbc\xec\xd6\x8c\x26\xfa\x2f\x4a\xd6\xd5\x31\x14\xf5\x75\x8c\x79\x46\xc1\x65\x80\xa9\x74\x78\x21\x9b\x4b\x61\x11\xf5\x19\xe6\xc6\x54\x41\xee\xd8\xb6\xbc\xee\x36\x79\xe2\x88\xb3\xbd\x31\xcd\xb5\xd4\x23\x72\x21\xb5\xe6\x16\x33\x43\x05\xff\x1e\xc9\x9b\x3b\x2e\x19\xd9\xf1\x85\xc8\x46\x04\x34\xe9\xdd\x96\x8e\xba\xbe\x57\xac\x11\x22\x46\xd9\xd5\xdf\x42\x73\x37\x43\x0c\x9d\xb6\xf2\xbf\x07\xf6\x24\xe2\xad\x68\xba\xbc\x6e\x31\x42\xc0\xed\xd2\xb6\x6f\xff\x27\x6f\x02\x23\x67\x8b\x48\xdb\xae\x1c\xe0\xea\xe4\x77\x3f\xb4\x6f\xd9\x8c\x5e\xb3\xa5\xac\xb7\x92\xf9\x68\x09\x07\x82\x6b\xd4\x7d\x41\xab\xda\x85\x54\xfc\x50\x87\x5d\x6b\x56\x42\x91\xe5\x7b\x44\x80\x65\x52\xce\x78\x4e\x0a\x29\xa1\x08\x6d\x5d\x11\x21\x73\x66\x2f\x00\x04\xc1\xd2\x42\x0f\xc8\xe5\x91\x7b\xb0\x8a\x96\xc4\xd6\x27\x20\xd9\x56\x2c\x5b\xf2\xc0\x93\x59\xa9\xa2\xae\xbf\x28\xd6\x74\xcf\x0c\x69\xe5\xb6\x4b\x57\x70\x02\xb2\xc9\xc0\x22\x37\xe3\xd3\x19\x53\xa4\x60\xd7\x0c\x02\x7f\x26\x7c\x4a\xb0\x09\x71\xe9\x5a\xd4\xf8\x78\x7b\xa9\xa0\x29\xaa\xe2\x79\x77\xc3\xd0\xa2\xb4\x66\x8f\xf4\x46\xaa\xab\x42\xd2\x3c\xaa\x09\xaf\x49\xc1\xaf\x18\x39\x61\x55\x21\xe7\xae\xaf\x8c\xc8\xc9\xa5\xa1\x86\x4d\xea\xe2\xb2\xc7\x51\xf4\xb3\xea\xe8\x4c\xf3\xad\x59\x75\xec\xe2\x0b\x56\x9d\xb3\xcb\xe3\xcb\xb3\x67\x9f\x39\xb8\x81\x8f\x0e\x36\xe1\x39\xc7\x83\xf0\x9f\xbb\x45\xd0\x0d\x49\x51\x77\xfd\x25\xc6\x3a\x5e\x48\x65\x68\xb1\x05\xc1\x39\x9b\xd1\xea\xa8\x36\xb3\x13\xae\x33\x4b\x41\xd2\xc8\xcf\x77\x66\x8d\xaa\xc8\x33\x70\xd6\x39\x65\x89\x70\x7f\x49\xdc\x73\xc7\x7f\x3d\xba\x20\xb4\xb6\x28\x6c\x78\x06\x42\xd1\x56\x5c\xbb\x24\xda\x9b\x4b\xec\xf8\x95\x74\x67\xdc\x9c\x0f\xec\x8b\x7f\x6a\x97\x76\x65\xd7\x92\x39\x97\x65\x53\xbe\x24\x74\x3e\xab\x84\x4e\x60\x1c\xdb\xd2\x1d\xb8\xe0\x86\x53\x23\xd5\x2e\xe4\x90\xb5\x80\x09\x61\xbc\xb5\x36\xb2\x74\x24\xe1\xcc\x3f\x01\x55\x37\x7a\xb9\x85\xef\x2c\xd6\xc4\x06\x43\xe0\x10\x1c\xcb\x99\x30\x4c\x4d\x68\xc6\x16\xea\x05\x0f\xc0\x06\x8e\x30\x71\xff\x4c\x67\x68\xfe\xe8\x42\xfe\x2b\xe0\x83\x7f\x7a\xfb\xc7\x28\x63\xf4\x4f\x41\xdb\x70\xf6\xf8\x58\xb1\x10\x2c\xeb\x6e\x55\x4f\x81\x3d\x3f\xa7\xe1\x0b\xfc\x67\xb1\x90\xfd\x80\x5b\xfb\x6f\x35\x2d\xf0\x48\xfa\x1c\x77\xff\xd7\x6c\xa1\xc2\xd6\x6f\x49\x1b\x31\xdd\xbe\x05\x2c\xc4\x7a\x34\x40\x99\xd1\x8e\x24\xdc\x66\x1a\x45\x85\xb6\x28\x96\xc6\x56\xb2\xef\xb4\xaf\x7d\x72\x60\xb2\xaa\x73\x32\x6f\x82\x72\x57\xa1\xd4\x95\xfb\x8f\x4e\xd3\xa4\xea\x00\x51\xd4\x22\xd6\x84\x70\xeb\x3f\x23\x52\xbf\x0f\x1d\x20\xfa\xed\xd6\xd6\x33\x8e\x81\x4e\x6d\x3d\x00\xdb\x81\x11\x6e\x40\xbc\xd5\xa8\x52\x90\xf7\x5c\x1b\xac\xaa\x8b\x0f\x43\x15\x3d\xac\x22\x6f\x75\xd4\x0b\x22\x15\xe1\xd5\x7f\xd0\x3c\x57\x6f\x51\xf2\xf4\x2e\x51\xd5\xbd\xa8\x23\xd7\x2e\x26\x0f\xea\x39\x7a\x23\xc5\x81\x99\x57\x3c\xa3\x45\x31\x27\x9f\x8f\x2f\x60\x05\x4d\xfe\xf0\xbb\xd7\xa0\xb4\x7e\xf3\xf5\xef\x5e\xf7\xbc\x42\x2f\x45\xe8\x17\xc6\xb3\x08\x61\x7e\x06\xe9\xd3\xbb\x56\xe2\xb6\x55\x90\x16\xda\x9c\x5a\xfd\xf0\x12\xeb\xb1\x5a\xe1\xc8\xb1\x3b\x24\x04\xf6\x76\x05\x51\x2f\xa5\x16\xf9\x52\xf9\x34\x1a\x2f\x95\x4f\x5f\x2a\x9f\xbe\x54\x3e\xbd\x7f\xc4\x76\xce\x6d\xf3\xa3\x18\x16\xe8\x2a\x79\x57\x6e\x42\x91\xe9\xe2\x4b\x17\x99\x3a\xa2\x5a\x57\xc2\x9b\xe2\x00\xe3\xaa\x3a\x7d\xda\x84\x34\xdd\x2f\x4e\xce\x2f\xff\xe3\xfd\xd1\xb7\xa7\xef\x61\x57\x5d\xf1\x1e\x7b\xbd\xb9\x48\xee\x3b\xd9\x1a\x89\xe9\x77\xde\xdb\xcb\xd3\x16\x0b\x19\xda\x82\x9c\xbf\xbb\xdc\x30\x39\xfb\x29\x0e\x6f\xd1\xa6\x29\x26\xdd\x4f\xe9\xb9\x65\xe0\xd8\x9f\x6a\xa6\xb6\xd3\xa6\x68\x67\xd2\x77\xbc\x6f\x97\xdd\xb6\xad\xfe\x16\x5f\x71\x77\xb6\x66\x60\xef\x86\x8c\xe4\x5f\x26\x8d\xd6\x1e\x11\x1e\xdb\xb3\x4f\xa0\x7d\x4a\xb4\xe8\xa7\x11\xab\x54\xdd\xc5\x7a\x75\x7c\x51\x51\x63\x32\xcb\x48\x50\xbc\x50\x56\xcc\xb3\x02\x1e\xd3\xda\x0b\x1b\xff\xba\xf7\xb8\x5a\xe8\x21\x7e\x5c\x50\x5e\x6e\x4b\x20\x58\x0a\x0c\xfe\xe7\x25\x06\xd9\xb4\xb2\xa1\x5b\x51\x77\xdd\x42\x6d\x16\x5b\xa8\xc3\x8a\xad\x80\x37\x10\xca\x2a\x9a\x75\x15\x45\xbb\x61\x45\xb3\x13\x43\x8f\x20\xcd\x47\xf8\x09\xf4\x77\x7f\x86\x82\x08\xc0\xbd\xa5\x6a\xd5\x61\xed\x6d\x13\xa7\x00\xc8\x62\xe3\x44\xba\x09\x4a\x12\xaa\x43\xca\x0d\xa6\xeb\x24\xe8\xb0\xb8\x93\x38\x4b\xbe\x48\x79\xe5\xc7\x27\x36\x97\x6f\xd3\x54\x5e\xcd\xa4\x91\x62\x37\xba\x42\x2c\x83\xa5\xcd\x5a\x2e\xe0\x89\xe3\x10\x19\x1b\xb1\x26\x2c\xe3\x1b\xa2\x3c\x17\xd2\x75\x5d\xec\x66\x8a\x4c\xdd\xb8\x82\xd8\xc5\x32\x88\x57\x17\x13\x5b\xfa\x92\xbb\xd5\x36\xa7\x7f\xd7\x83\xb3\x93\x2d\x70\x91\xe7\x10\x26\xf7\x85\xb6\x90\x7d\xa2\xb0\xb7\xfe\x35\xc0\xf2\x44\x3d\x81\xec\x44\xfe\x8c\xcf\x4e\x9c\x21\xc2\x37\xfc\xd1\x8e\x2e\x90\xfb\x09\xd5\x56\x74\x0a\xa9\xcc\x8d\x54\x5b\x6e\x94\xde\x86\x62\xa1\x8e\x92\xfb\xee\x4e\x73\xb4\x27\xa2\xe6\x6d\xd0\x36\xea\xd1\xb3\xf8\x5e\xf6\xa4\x3a\x01\x74\x4f\x83\x9e\xdb\x7c\xe4\x57\x18\x65\xb2\x8c\x7a\xf3\x90\x9b\x19\x43\x29\xf4\xf8\xf2\xec\x03\x9f\x22\x80\xfe\x5d\xc8\x84\x51\x53\x2b\x36\x9c\x52\xd3\x0d\x20\xae\x49\xb7\x68\xbf\x2d\x73\x21\xc4\xa1\x7f\x65\x4e\x74\x09\x9c\x28\xba\x61\xab\x38\xd2\x97\xc0\x90\x9e\x0f\x23\xda\x39\x9d\xe7\xa5\x41\x76\x6b\x78\xe2\x91\xe4\x7c\xfc\x64\xce\xd1\x69\x71\xb3\x11\x15\x68\x60\x3b\xee\xb9\xad\x88\x06\x4a\xfe\x27\xf0\x9b\xde\x52\x41\x98\x09\xe3\xfb\x80\x4d\xd2\xa2\xb0\x27\x2b\x05\x0b\x69\x79\xba\x49\x32\xc5\x2c\xcb\x92\x56\x2e\xe1\x34\x97\x37\xe2\x86\xaa\x9c\x1c\x5d\x9c\x3d\x3d\xd7\xe9\x5d\xe2\x1f\xef\xd1\x07\x99\x6f\x9d\xfe\x47\xa0\x80\x54\x01\x65\x44\xec\x1f\x63\x6e\x34\xd6\x76\x84\x4a\x8b\x26\x76\xb2\x58\xf1\x2a\x04\xfd\x43\x25\x8f\x71\x20\x0e\x09\x94\x16\x41\x64\x66\x68\xe1\x22\x95\xc6\xcc\xdc\x30\x26\xc8\xeb\xd7\xaf\x31\xbe\xe2\xf5\xef\x7f\xff\x7b\xc8\xe0\x26\x39\xcb\x78\x79\xf7\x41\x78\xea\xb7\x6f\xde\x74\x07\xe5\xdf\x8f\x3e\xbc\x27\x34\x03\x1b\x19\x19\x4b\x33\x73\x10\x01\xea\xc5\x8b\xea\x01\xf9\x3f\x97\x1f\xcf\xbd\x1c\xa2\x17\xbe\x05\xcc\x0e\xdb\xd9\xc3\x06\xe4\xaa\xc3\x70\xa8\xf5\xd3\x44\x40\x50\x33\x0b\x75\x4e\x28\x44\xa2\x45\xf5\x74\x1c\xbd\xec\x91\x50\x05\xcd\xeb\xf9\x74\x06\xc7\xc2\x05\xdc\xc2\x82\x67\xae\x41\x03\xc6\xc5\x60\x7a\xb4\x2f\xea\x89\xc5\x4b\xbc\x08\xd1\x79\x65\xbb\x65\x03\x4c\x68\x76\xa5\x52\x06\xc1\x46\xa2\x98\xae\x0b\x03\x0d\xbc\xc6\xcc\x01\xd1\x60\xac\x66\x9d\x31\x70\x37\x42\xd8\x1d\xe9\xdb\x36\x5d\xf0\x14\xd8\xa9\xaf\x05\xb7\x42\xd9\x24\x54\xa1\x46\x02\x0e\x0e\x57\x72\x4a\xb3\x19\x61\xc2\x40\xab\x0b\x44\x3d\xfb\x78\xe7\xa5\x67\x54\xe4\x96\xa6\x58\x56\x80\x60\x3c\xdb\xf8\xf3\x74\x91\xac\x17\x61\xc7\x5b\x35\xb4\x1a\x4e\x4a\x0b\x29\xa6\xf1\xc5\x6c\x04\xeb\xa8\x86\x50\x0f\x1a\x04\x89\x8d\x50\x51\xd8\x1e\x0c\x3a\x5f\xb5\xab\x72\xa4\xb1\xc0\xd6\x98\xf5\xb9\x7f\x49\xe2\x97\xd3\x44\x30\x13\x92\x61\x61\xeb\xcf\xaa\xd6\xe6\xdb\xda\x22\x64\x9f\xd9\xd2\xc6\x34\x13\x72\x7c\x07\x3a\x0c\x08\x76\x31\x56\xe0\x53\xcd\x32\xa6\xf1\xf2\xfe\x03\xcb\x8e\x98\xe6\xe9\x7f\xe0\xb1\xf5\x84\x42\x4e\x96\x01\xe2\x4b\xbd\x71\x61\x39\x39\xad\x8d\x1c\xd6\x55\x4e\x43\xd9\xeb\x8e\xe5\x02\x9b\x71\x54\x54\x33\x3a\x20\x53\x1a\x29\x8d\x77\xe1\x88\x2e\x8c\xb3\x6e\xc0\x2f\x7a\xaf\xbe\xe2\x8d\x2d\x4b\x72\x01\xa9\x70\x13\x8a\xc0\x8f\x05\x2d\x19\x14\xe8\x41\x70\x7b\x82\x90\xc9\x72\xcc\x85\xab\x7c\x37\x81\xd2\x80\x4c\xa1\x17\x12\xca\xde\x91\x82\x8e\x59\xe1\x00\x90\xaa\xf7\x2b\x7f\xe7\xcb\x29\x31\x65\xf9\x9b\x26\x74\x3a\x55\x4c\x6b\x7e\xcd\x5c\x8d\x41\xfe\x4b\x80\x06\x3a\x80\x9d\x7e\xf0\xf5\x17\x35\xb1\xca\xa1\x61\xdd\x7b\x20\xe1\x08\xdd\xc5\x2c\x7a\x37\x36\x84\x11\x21\xa7\x5a\x1a\xa6\x78\x06\xab\xba\xa3\xd6\x44\xd7\xd9\x8c\x50\x8d\xd9\x87\x43\x28\xb4\xd8\x7f\xd7\x9b\xb2\x2a\x58\xb9\x71\xc6\x68\xee\x4b\xcd\x59\xa5\xaa\xaa\x58\x3e\x22\xe4\xd8\x92\x9f\x09\xcf\xa8\xc1\x42\x62\x24\x67\x79\x5d\x15\x1c\x6d\x84\x3d\xc1\xf8\x3c\x63\x44\xaa\x9c\x41\x45\x49\x39\x81\xe0\xfb\xb0\x58\x24\x1b\x42\x85\x79\x6e\xd7\x1f\x73\xa3\xa8\x9a\xa3\x04\xe5\xce\xb2\x27\x10\x96\xfb\x64\x50\xbc\x0e\xd6\x02\x78\xa0\xd2\x0d\xe9\xde\x74\xc7\x8f\x24\x4c\x80\xf4\xb6\x0d\x36\xa3\x47\xfc\xa5\x1f\x69\x78\x92\x1d\x70\xb5\x2f\xdd\xcd\xee\x3b\x59\x6a\xb6\x64\x07\xc2\x06\xea\xfc\x5d\x52\x19\x0a\x80\x9a\x6c\xe6\x24\xc5\x36\xa9\x22\x04\xed\x47\xb4\x5f\x76\x0c\x0e\x57\x4a\x91\x7b\x12\x19\xf2\xe9\x99\x19\x59\x75\xd3\xd4\xb4\x28\xe6\x43\x76\x6b\x99\xbd\x25\x66\x20\x3d\x41\x4f\x35\x48\xc4\xaf\x85\x66\x66\x90\x00\x10\x20\x42\x95\xc2\x12\xb6\x9a\xec\xe1\xfb\x0b\x09\xfd\x10\xf6\x70\x31\xab\x62\x8f\x6b\x83\x49\x3a\x83\xe5\x3f\x49\xb1\x27\xd7\x4c\xcd\xdd\xba\xbd\xa7\x4b\x76\x55\x49\xd2\x3b\x42\x80\x42\x99\x6c\x76\x7a\x5b\x29\x2c\xd5\x92\x64\xce\x85\xeb\xb2\xb8\x04\x96\xf1\xf7\x9a\x52\x1b\xb1\x3d\x31\x02\x0e\x82\x49\x2c\xf1\x27\xc0\x25\x8e\xce\x4f\xfa\xb3\x07\x1c\xfd\x15\x9f\xf6\xe8\xa9\x06\xb5\x47\x7a\x9a\x83\xe3\x68\xc5\x9e\xbb\x16\x0b\xfe\x1b\xec\x8b\x8a\x85\xd5\x74\xb0\xe4\x50\x72\xc5\x1c\x9b\xa4\xc2\xb9\x20\xdc\xc3\xc9\x80\x54\x0c\xea\x37\x62\x99\x4a\x36\x87\xc5\x70\xfd\x34\x27\x9f\xf8\x52\xe2\x48\xc5\x49\x9b\x31\xb4\x2f\x9f\x70\x36\x7f\x58\x89\xa6\x4c\x4b\x8b\x70\x5c\xb1\xce\x8e\x9c\x65\xa3\x75\x8b\x2c\x26\x79\x4b\x0d\xdc\x01\xfb\x41\xa8\x81\x14\xd0\x9e\x42\x03\x55\x4d\x8c\x4c\x85\x6c\x24\x5d\x76\x64\x7b\xf8\x03\x7d\xb4\x2d\x4b\x48\x78\x48\x04\x6f\x3b\x56\xe1\x8a\xcd\xf7\x35\xde\x79\xcb\x21\x66\xbc\x02\xd5\x1c\x98\xbd\x9c\x24\xbe\xf8\x38\x7e\x80\xc2\xe6\x1e\x1c\xe4\x2c\x67\x62\x40\xce\xa5\xb1\xff\x9c\xde\x72\xed\x74\x98\x13\xc9\xf4\xb9\x34\xf0\xc9\xce\xe3\x03\x6e\xd5\x73\xc1\x06\x67\xfd\xe7\x90\x18\x07\x6c\x18\x14\x75\xd8\x12\x7f\xea\xbe\x9a\x73\xc0\x1c\xae\xc9\x19\x34\x41\xc6\xa3\x4a\x0a\x10\x64\x65\xfa\xca\xd6\x16\x1c\x6f\xaf\x83\xba\xec\x2e\x7b\xfc\x2e\x3c\x0e\x5b\xa4\x6a\x21\xcb\x13\x81\xe6\xc0\x02\x2f\x04\x7e\x03\x4d\x4f\xaa\x82\x66\x2c\xf7\x3d\x15\xa8\xdd\x55\x6a\xd8\xb4\x63\xfe\xf3\x7d\xa3\x64\x6a\x0a\x0e\x96\xac\x47\x9f\xa5\xbb\x23\xb5\x60\x86\x23\xa9\x78\x86\xe3\x51\x2e\xf1\xa3\x54\x53\x79\xf2\x25\x40\xee\x7f\x6f\xd9\xec\x63\x68\x15\xc9\x28\x51\x04\x26\x4a\xbf\x25\xad\x2c\x15\xfa\x2f\x2b\xe4\xc2\x85\xfb\x6f\x52\x51\xae\xf4\x88\x1c\xf9\x2e\x14\xf1\x77\xce\x8e\x14\x4d\x93\x0c\xb0\x0a\xf2\x31\x7f\xae\xf9\x35\x2d\x5c\xc5\x64\x2a\x08\xc3\x8e\x1e\x16\xc6\x45\xd5\x6a\x40\x6e\x66\x52\xa3\xc4\x1c\x4a\x6f\xec\x5d\xb1\xf9\xde\x20\x81\x3d\xd5\x8f\x98\xf2\xed\x9d\x89\xbd\xc6\xe7\xd8\xa2\x4f\x41\x6f\x80\xdc\xc3\x3d\xf8\x6e\xef\xa9\x74\xba\x84\x72\x3d\xcd\x73\x8e\xa5\xad\x2f\x92\x8b\xbb\x49\xc9\x47\xfa\xaa\x17\xcd\xe8\x5b\xab\x06\xc7\xe3\x99\xd1\xfc\xcd\x5c\xe2\x76\x18\xcf\x7d\x57\x19\x67\xb2\xba\x6b\xd1\x4a\x00\x08\xd8\xc4\x22\xfb\x99\xbd\x12\x2d\x23\x64\x2a\x33\x52\x12\x64\xf1\xc5\xda\x77\xf1\x48\xad\x7c\xa5\x6a\x36\x20\xb9\x14\xfb\xc6\xb9\x10\xe2\x9e\x50\x8b\xbd\x25\xf2\x25\xa7\x7e\xa0\x0f\x13\x80\x42\x15\x83\x16\x18\xbe\x1f\x96\xb3\x77\x62\xd7\x28\xf0\x55\x19\x1f\x2f\x6c\xff\x5c\x06\x48\xdf\x02\x46\x0e\x10\x57\xc6\x48\x48\xe0\x02\xd0\x1f\x37\x06\xa6\x41\xbc\x08\xa4\xb6\xff\x2b\x01\x14\xab\xd0\x1b\x78\x67\x53\x6c\x09\x4d\xb7\xbf\x30\x25\x13\xac\xbb\xc4\x40\x9e\xea\x36\xf5\x89\x6b\x6c\x46\x9f\x22\x0e\xcd\x68\x5d\xa5\x4f\xa0\x0c\x5f\xbb\xe0\x25\x68\x78\x16\xd5\x84\x56\x12\x11\x01\x22\x4a\xe1\x8b\x31\xec\xcb\x4e\x11\x99\x06\x5d\x76\x91\xcc\x6c\xe8\x80\x89\xbc\xc7\x29\xe4\x94\x07\xbc\x2a\x9f\x67\xac\xf1\x0c\xcb\x09\x40\xe9\x1d\xe5\x8f\x73\xa1\x42\x95\xe2\x5a\x60\xc1\x5e\x8c\xe1\x4b\xe7\x90\x4d\x86\x5a\x18\xe3\xfa\x81\x56\x09\x23\x4d\xc2\x9c\x90\x13\xac\x4a\x24\x9a\x74\x2c\x6b\xe3\x4b\x35\xbb\xef\x73\x6a\x28\x34\xa5\xc2\xb8\x89\xdd\x70\xe1\xa6\xb3\xc3\x26\x52\x91\xd3\x5f\x57\x8c\x80\x6e\x67\x1c\x0c\x08\xa3\xd9\xcc\x6a\x3b\x43\x0c\x6d\xb5\x7a\x9a\x57\xc8\x4e\xec\x41\xa1\x12\x24\x17\x05\x86\x14\x57\x28\x60\x84\xbf\x38\x51\xb4\xb6\x0f\xc2\xf0\xa9\x57\xda\x25\x74\x38\xf5\x4c\x34\x49\xf1\x09\x20\xf1\xee\x11\xdf\xc9\xd3\x19\xb8\x61\x47\xc0\x5a\x15\xed\x97\x8f\x51\x64\xb9\xfd\x59\xb8\xf4\x09\xa0\x58\xf2\xf6\x4d\x3d\x76\xcb\xc3\x5c\x44\x7a\x2d\xee\xac\x6f\x85\x9a\x44\x30\x60\x8b\x34\xfb\xd2\xd4\x1b\xfb\xa3\xaa\xf0\xd0\x06\x15\x32\x83\x9b\x4e\x64\x0e\x5b\xc2\x71\xa6\x30\xda\x45\x47\xaf\x59\xe8\x62\xca\x94\x92\xca\xbe\x3f\xd3\x9a\x70\x38\xa7\x92\xaa\x2b\x96\x07\x69\x7c\x44\x2e\xec\x46\x79\xcb\x5e\x02\x48\x94\x97\x22\x7c\x8f\x54\xfb\xea\x4e\x31\x07\x30\xf7\x47\xa3\x7d\xd7\xbe\x5d\xa1\x80\x8d\x7c\xc8\x7e\x9e\x8a\xe2\xa7\x31\xe3\x25\x33\xde\xb5\x68\xd3\x07\x5a\x69\x34\x8e\x5a\x31\x1a\xdc\x41\x92\x50\xdc\x11\x17\x25\x44\x7b\x17\x9b\x68\x46\x62\xe3\x44\x5a\x87\x63\x3a\x67\x63\x82\x50\x20\x1c\xa9\x1d\x8c\x09\x9d\x8b\xf7\x39\x16\x1d\x0e\x39\x7a\x98\xd6\x5b\x9d\xd0\xce\x5c\xf6\x48\xaa\x59\x1c\x8f\xe5\x22\x82\x74\x05\xae\xc9\x47\x6f\xad\x58\x2f\xe5\xc6\x60\xe5\xe1\x14\xda\x90\x1f\x3b\x94\x73\xb3\x38\x76\x2d\x07\x67\x71\x9c\x4d\xb0\xbd\x70\x5b\x08\x71\xec\x31\x4e\xab\x0a\x0a\x48\xaf\xc6\x92\x8b\x63\x7b\xc9\x39\x8b\x63\x2b\xc9\x3a\x8b\x23\x45\xf2\xce\xe2\xe8\x9f\xcc\xb3\x38\xd2\xd8\x53\x70\x3c\x16\x71\x02\x11\x81\xfb\x16\xc0\xb1\xb1\xc6\xa9\x1b\x20\xf0\x83\x29\xac\x8a\x18\x43\x42\x9a\xe4\xc4\x39\x24\x4b\x74\xac\x65\x51\x1b\x04\x21\xfd\x22\xb1\xcc\x08\x2f\xe9\xbd\x50\x69\x04\xc5\xc5\xe5\x22\x49\x14\x34\x09\x14\xcf\x52\xae\xf5\x78\x9e\x97\xd4\xbe\xd4\x5d\x75\xbd\xa4\x6f\x19\x80\x63\x37\x1a\x07\xe0\xd8\x89\xf6\x01\x1e\x94\xf4\x4d\x04\x70\xec\x52\x9d\xef\xf6\x48\x7a\x49\xfb\xb7\x15\xf0\xe3\x91\xbc\x67\xa1\x83\x32\xca\x4a\xf3\xd0\x55\xb3\x65\xa0\x80\xf2\xfd\x46\xa3\xfd\xc4\xc7\x00\x61\x1f\xce\xfe\x76\xad\x74\x4e\x91\xc7\x72\x46\xfb\x8a\x06\x47\x17\x67\x09\xed\xbf\xd1\xac\xf7\x58\x80\xe3\x27\x5e\x6c\xc0\xeb\x8c\xd6\x06\x9f\xa1\xf9\x36\x8e\xfc\x3f\x69\x76\xd4\xd5\x79\x4a\x22\x6e\xef\xbe\xcd\xe9\xce\x8b\xbf\xb3\x92\x62\xdc\x73\x2e\xc2\x40\x23\x5d\x09\x89\x46\xa6\x74\xb2\x18\xd6\x42\xf5\x99\x7e\xfd\xd3\x54\xc9\xee\xdb\xa7\x76\xd4\xaa\x04\xbb\xdf\xa3\x3b\xd6\xe2\x68\x61\xcb\xfe\x27\xbf\x89\xce\x65\x89\xce\x84\xc8\xaf\x51\xc9\xfc\x2d\x06\x59\x51\x21\xa4\xc1\x18\xea\x01\xba\xe7\xf5\xc0\x05\x2a\x44\x05\x75\x45\x4e\x6a\x9e\x63\x36\x66\xa8\x8c\xb9\xff\xaf\x95\x56\x01\x1b\x78\x91\x06\x9d\xc8\x23\x65\x42\xd0\x8a\xff\xc0\x54\x9f\xde\xdd\xcb\x46\x0b\xb9\xdc\xfc\x1e\x93\x74\x36\x63\x25\x85\xff\x7c\xe7\x37\xc8\x12\x6d\x97\x9b\x0c\xce\x12\xa6\x4a\x2b\xf8\x0e\x5a\x55\xae\xf6\xae\xdf\x24\xc8\x93\x6b\xc6\xa3\x84\xd5\x86\x33\x7f\xb4\xed\xbc\x68\xa9\xff\xf6\x8a\x82\x85\x12\x02\x0d\x7c\x75\xeb\xe0\x8e\xb2\x92\xc4\x35\xee\xff\x8e\x6f\xdd\x63\x06\x16\xe2\x78\x0e\xd6\xe8\xae\x56\xe8\x41\x90\xd2\xdb\xd6\xe3\x64\x80\xbd\x58\xa1\x1f\x1e\x2f\x56\x68\x37\x5e\xac\xd0\x6b\x8f\x47\xb3\x42\x47\x22\x9d\xe7\xb0\x4b\xcc\xc8\x71\xa7\x38\x6f\x4b\x6e\xba\xc8\x8f\xd0\x27\xe5\x0d\xc0\xde\xfa\x2b\x55\xdb\xbd\xbf\x3f\x1a\xed\xa3\x83\x7f\x14\x9c\x58\xb5\x99\x0c\xff\x40\x98\xc8\x64\x6e\xe7\xf9\x0c\xf3\x2b\x6d\x40\xdd\x69\x2c\x7a\x31\x2c\xa5\x5f\x2b\x0e\x11\x80\xb9\xd3\xca\x8d\x09\xd9\x96\xaf\x8e\xf8\xee\x31\x85\xf3\x84\xec\xa5\x11\xee\x3d\xe4\xfe\x28\xdc\x81\x32\xe5\xa4\xfc\xa6\xee\x63\xc1\x4b\xee\xb2\x14\x2d\x3d\x65\xda\xa4\x4a\x3e\x21\xe4\x00\x27\x1f\x65\x55\x3d\x70\x0b\x8d\x4a\x56\x4a\x35\x1f\x84\xc5\xec\x97\xad\xd5\xdd\x13\x87\xa0\x5c\x64\xb5\x52\x4c\x98\x62\xde\xaf\x00\xff\xb2\xf1\x4c\xb4\x0c\x7f\x52\x3b\xac\x64\x04\xe4\x4a\x13\xa7\xdb\x8c\x36\xc5\x3b\xf6\xcb\xa0\x3b\x23\xec\x36\xf0\x7b\xd7\x4a\x65\xd0\x58\x40\xed\xa7\x4c\x5c\x93\x6b\xaa\x74\x2a\x0a\x43\x1e\x4b\xaf\xc8\xf9\x35\xd7\x8f\x98\x82\x7d\xe9\x84\x16\xf4\x35\xca\xda\x54\xb5\x71\xec\xce\x93\x08\x76\x5b\x49\x2b\x8a\x06\xd2\xb0\xa0\x9e\xbd\xe9\x6b\xf2\x8e\x47\x45\x8d\x61\x4a\xbc\x25\xff\xf7\xe0\xa7\x5f\xff\x73\x78\xf8\xe7\x83\x83\xbf\xbd\x1e\xfe\xaf\xbf\xff\xfa\xe0\xa7\x11\xfc\xc7\x57\x87\x7f\x3e\xfc\xa7\xff\xe3\xd7\x87\x87\x07\x07\x7f\xfb\xee\xc3\x5f\x3e\x5f\x9c\xfe\x9d\x1f\xfe\xf3\x6f\xa2\x2e\xaf\xf0\xaf\x7f\x1e\xfc\x8d\x9d\xfe\x7d\xcd\x49\x0e\x0f\xff\xfc\x3f\x13\xbe\x04\x15\xf3\x8f\xc9\x78\x02\x8e\xe1\xa3\xc8\x35\xed\xb9\x1f\x37\xd3\x94\x0b\x33\x94\x6a\x88\x8b\xbc\x85\x34\x9c\x64\x4b\x79\xd4\x7c\x3c\x1a\xd3\x48\x55\x81\x83\x06\xf5\x7b\xc7\x89\xc8\xe3\x6a\xd8\x8f\xe6\x9e\xc6\xba\xd3\x09\xfd\x30\x38\xe1\x3d\x2e\x18\xf7\xe5\x8b\xf7\x65\x9d\xf1\xe5\x47\xe0\x5f\x22\x3a\xbc\x84\xdf\x93\xe7\x1f\x7e\x8f\x67\xf9\x12\x7b\xff\x12\x7b\xff\x12\x7b\xdf\x7b\xa6\x1d\xf5\x92\xbe\xc4\xde\xfb\xf1\x1c\xbc\x1d\x2f\xb1\xf7\x6b\x8c\x17\xaf\xc7\xca\xf1\xe2\xf5\x68\x8d\x7f\x71\xaf\xc7\x4b\xec\x7d\xc7\x45\x5e\x62\xef\x57\x8d\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x0e\x30\x2d\x8b\xbd\x47\xe4\x5f\x16\x81\xef\xec\x4d\x4d\xf8\xfd\xbf\x60\xf4\xbd\xb6\xe8\x97\xb1\xa3\x2c\x93\xb5\x30\x9f\xe5\x15\xeb\x19\x9b\xb8\x60\xfd\xbd\x33\xbb\x25\x43\xf7\x59\x83\xef\x3e\xbc\x93\xa6\xe1\x2f\xb2\xbf\x06\xad\x73\xce\x44\x0a\x6f\x4e\x7a\xe6\xe8\x61\xf3\x12\xa2\x95\xb8\x45\xce\xf2\xe6\x0b\xc7\x39\x8d\x45\x9a\x11\x39\x22\x8a\x65\xbc\xe2\xae\xa8\x26\xc5\xcf\x13\x00\x02\xf4\xc1\xb5\x27\x9d\x5b\xaa\xc1\x8a\x49\x60\x55\xa1\x6d\xa9\x8a\x6c\xa4\x4e\xca\x5b\x00\x34\x85\xf1\xcb\xbe\x12\xea\x3c\xa0\xe1\xdc\x70\xcd\x88\x9e\xc9\xba\xc8\x89\x62\xff\xe9\x95\x2e\xb7\x23\x9f\x63\x18\x62\x47\x72\x1a\x60\xa2\x57\x77\x27\x41\x2b\x6e\xef\x33\xdb\xad\x2a\x89\xec\xb6\xe2\xd8\x01\xfc\x92\x65\x52\xe4\x3b\xe9\x96\xb9\x03\x64\xa3\x18\x41\x4c\x0e\xd6\x80\x0e\x7d\xa7\xae\x69\xc1\x73\x2b\xa3\xf9\x90\x6f\x24\xa3\x29\xae\x1d\x52\xe2\x70\xab\x74\x83\x51\x84\x56\x95\x92\x34\x9b\x31\x1d\xc1\x8b\xd6\x08\xd7\x7f\xbe\x5f\xc3\xde\x78\x54\x45\x3d\xe5\x02\x4d\x1a\xb0\xaa\x97\x60\xa5\xf1\x69\x34\xee\xa5\x17\x41\xfe\x1c\x81\x63\x7f\x9e\x00\x18\x54\xa6\x8c\x9a\x43\xb6\x8e\x8c\x81\xc0\x9d\xe1\x93\xf8\x0f\x4d\x64\x91\x83\xbc\x41\x05\xf9\xc3\x6b\x52\x31\x95\x21\x59\x4a\xe2\xc0\xd3\xd0\x77\xca\xc2\x51\x58\x8d\xd9\x8a\x32\xf7\x2f\xff\xf5\x6f\xc8\x4c\xd6\x4a\x8f\x4e\x22\x02\xf0\x06\x3e\x4b\x81\x2d\x22\x6f\xe2\xa2\x0d\x29\x18\xd5\x86\xbc\x79\x4d\x4a\x2e\x6a\x93\xae\xbe\x63\x2a\x6b\x4b\x64\x67\xf9\xdd\x6f\x7a\xce\xf6\x08\xd5\x22\x93\x50\x92\xd8\xaa\x02\xff\x1d\x4c\x2b\xce\xa3\x08\xbd\xed\x49\x25\xb9\x30\x8b\x86\x16\x27\x71\xa5\xe4\x56\xe0\xc9\xdc\x09\x7e\x90\xd8\xc4\xf0\x73\x2d\xc7\x73\xd3\x49\x74\x4a\x71\xe8\x6e\xf9\x76\x07\x8e\x7f\x73\x1f\xe2\x11\x4b\x14\x43\x66\x56\xe9\x05\xbb\xac\x9e\x51\xc5\x5c\xd7\xcc\x7d\x4d\x0a\x3e\x61\xdd\x3b\xd8\x9d\xd8\x85\xa1\xa6\xe4\xdb\xb0\x2e\xd7\x24\x0f\x1f\x07\xd3\x2c\x17\x43\xa3\x18\x0b\x20\x83\xae\x0f\x1e\x64\x52\x48\x31\x8d\xbb\xb7\x76\x01\xa5\xa7\x88\xdf\x4f\xb0\x1f\x12\xc5\xa6\x5c\x1b\xd5\xcd\xed\x37\xec\xce\x30\xfb\x6a\x01\x53\x25\xeb\xce\xc5\x37\x53\x91\x2d\x00\xc2\x9b\x78\x7d\xa0\x87\xeb\xe5\xda\xbd\xe6\xb0\x63\x75\x0e\xc7\x60\x8d\x8e\x73\xf5\x26\x3b\x8a\xd1\xfc\xa3\x28\x3a\xfb\x4c\x53\x6d\xb4\x87\x03\xed\x69\x20\x55\x4d\x24\xc4\xd6\xcd\x58\xb8\xbe\xbe\x75\x32\x98\xea\x80\x86\xb0\x1c\x35\x1d\xfb\xf3\x21\x84\xad\x47\x9e\xc2\x1e\x1d\xde\x23\x59\x64\x42\x0b\xdd\xb3\xe7\x75\x1f\x5b\x8b\xbf\xbe\xdb\x3f\x20\x84\xa3\x4d\xd0\x5d\x3d\x7c\xa9\x48\x59\x17\x86\x57\x45\x73\x58\x9f\xfc\x0f\x9c\x18\xdc\xdd\x56\xd8\x28\xae\x34\x8a\xe4\xa0\x1a\x38\xc7\x5b\x4b\x98\x31\x20\xec\x20\xc0\xc0\x84\x81\xee\xfc\x90\x7c\xcc\x2a\xaa\x68\xc0\x94\x4c\x96\x25\xed\x51\xb6\x1d\xe3\x8b\x28\xe4\x50\xa0\x10\x63\x45\x67\x45\x8b\x66\x87\xa2\x60\xf3\x6d\x5d\x6b\xc3\x04\x15\x9d\x43\x26\x53\xe1\x0c\x42\x41\xe4\x4d\xa8\x22\x30\xe5\xd7\x4c\x2c\xde\x67\x67\x8e\xf8\x96\x66\x57\x4c\x74\xb7\x6f\x7e\xaf\xfd\x19\xe7\x73\x41\x4b\x9e\xd1\xc2\xd2\x03\x25\xaf\xb9\x25\x07\x2c\x5f\x58\x57\x0f\x9c\x09\x1f\x9b\x90\xfa\xe6\xd5\xa8\xd8\x6d\xeb\xe0\x6a\xcd\x3a\x87\xf8\xa7\x3a\x36\x0b\xc3\x63\xf1\x3c\x8d\x11\x1d\x8a\x5f\x67\xcc\xeb\xc5\x76\xbd\x6d\xed\x37\xbe\x5f\x92\x1d\xf7\xd8\x1c\xd1\x28\x90\x6a\x43\x38\x2a\xf6\x1f\x2b\x2c\xaf\x9a\xfb\x04\xbb\xc5\xbb\xe0\xda\x93\xf7\xe3\x37\x1d\xf7\x43\x8d\x3b\x09\x99\x29\xd0\x4e\x8d\xf3\x36\x63\xf9\x44\x73\xa9\xc9\xb7\xd0\x95\xe3\x84\x81\x19\xe5\xa9\x95\x86\x4f\xdf\x9e\x3c\xa0\x30\x58\xa8\x13\x2b\x0b\x4b\x7d\x75\xec\x96\x96\x55\xc1\xf4\xe8\xea\x0f\xe0\xad\x73\xf4\xeb\x95\x1a\xe7\xaf\x3e\x9d\x1e\x9d\x7c\x38\x1d\x95\x5d\xe8\xe6\x96\x35\x13\x5e\xd2\x69\x37\x3d\x7e\x48\x4a\x29\xb8\x91\xaa\x0b\x83\xed\xab\x98\x4c\xf4\x67\xbb\x6f\x5b\x26\xd2\x08\x85\x37\xa4\x34\x3d\xf8\x11\x21\x9d\xdd\xc4\x0b\xcc\xf6\x9e\xcc\x65\x4d\x6e\x28\xf6\xf7\x82\xab\xd4\x5d\x3c\xfe\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\xa6\xaf\xe9\x22\x08\x96\xab\xfa\x9b\xe0\x79\x2b\xdc\x5a\x6c\xec\x05\xfd\x64\xe0\xf1\xee\x70\x9c\xba\x7b\xf1\x96\xec\xb1\x5b\xf3\x9b\xbd\x01\xd9\xbb\x9d\x68\xfb\x8f\x30\x13\xbd\x37\x22\x67\x65\x55\xf0\x8c\x9b\x62\x6e\x6f\x14\x53\x2a\x38\xfa\xf1\x07\x0b\x79\x06\xdd\x21\xd9\xd0\xc1\xae\x8d\x54\x74\xca\xfc\x45\xfe\x95\x1a\x77\x15\x7b\x7a\x33\x40\xb8\x84\xdb\x46\x66\x00\x22\x78\x14\x80\xf4\xe3\x47\xfd\x1a\xa1\x74\x25\xa5\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\xea\x96\xed\x7d\x32\x57\x6c\x0e\x09\x72\x5b\x3e\x1b\x07\x46\xcb\x64\x6b\x24\x44\x26\xc0\xe7\x56\xdb\xf9\xf4\xed\xc9\xf7\xba\x8f\x5b\x2d\xb2\x88\xbc\x62\x26\x7b\x95\xb1\x6a\xf6\xca\xad\xfc\xaf\x7a\xfe\x51\x3c\xcb\x9d\x3d\xe9\x34\xa1\xe7\x99\xdb\xc6\x28\x0f\x07\x8a\xca\x99\x2c\x0a\x96\x79\xc7\xe1\x31\xab\x66\xe1\x81\x67\x7d\xf2\x7d\x72\x62\x7a\x66\xc2\xec\x9e\x33\xc2\x8e\x4a\xca\xce\xf1\x54\xa9\x50\xcf\xc2\xd0\xe6\x33\xf0\x49\x3f\x36\x13\x11\x2f\x35\x4e\x2b\x44\x3c\x4f\x72\xd5\x55\x9c\x79\x16\xc6\xe8\x4f\xfe\x4b\xcd\x0c\x48\xb1\x5c\x10\x2c\xb0\xf9\xc1\x4a\xd5\xbb\x60\x75\xde\x09\x54\xea\x63\xf4\xc6\x1c\xec\x1e\xe5\x74\x52\x61\x42\x00\x04\x54\xfc\x28\x1c\x9a\xd6\x66\xc6\x84\xe1\x19\x86\xbc\xb8\xa4\xf1\x58\x16\x22\x67\x13\x34\x3e\xe6\x3d\x62\x36\xe5\x35\x53\x8a\xe7\x4c\x93\xde\xc2\x50\xec\x74\xe2\xc5\xb3\x46\xad\x5e\xe1\x92\x29\xa2\x13\xfb\x06\xec\xa7\x8c\xaa\x48\x1f\xa4\xbf\x1b\xe1\xf9\x3b\x11\x98\xff\x18\x21\xf9\xbb\x18\x8c\x9f\x28\x9c\xb1\x7f\x00\x7e\xfa\x90\xf2\x9d\xf1\xa8\xb4\xc4\x4e\xf8\x24\x99\xd8\x49\xf3\x92\xf7\x28\xef\xba\x03\x24\x3d\x8d\xe0\x09\xfb\xb0\xf1\x24\x3a\xa3\x05\x3b\xfb\xb8\x2d\xdf\x87\x5b\xbe\xed\xff\xb8\x74\x1f\x56\x4c\x69\xae\xa1\xe4\x87\x77\xc5\x19\x43\xb3\x99\xf3\x46\xf8\x20\x08\x29\xc8\x77\xe1\xde\x10\x21\xf3\xae\xb1\x8d\xb1\x03\xc4\xc3\xb0\xda\x09\xe2\xc1\xff\xb2\xa2\xa6\xa6\xd4\xb0\x9b\x8e\xfa\xfb\xb0\x11\x1b\xbb\xfe\x1e\x0c\xe3\x2f\xbe\x8d\xa5\x8e\x85\xfe\xfe\x8b\x90\xeb\x7f\x67\xee\xc7\xf7\x58\x8c\xee\xf1\x55\xa4\x60\x03\x30\xe3\x56\x5c\xc7\x38\x02\x1d\xbe\x9d\x74\x13\x46\xdc\xad\x4b\x82\x7f\x6e\x2e\x8f\x45\x70\x90\x34\xcf\x15\xd3\xda\x8b\xcb\x9e\xc0\x1d\x5d\x9c\x91\xbf\xe0\xe3\x5b\xdb\xbd\x4a\x49\x83\x66\xd0\x13\x59\x52\xde\x39\xe1\xad\xb5\x07\x8b\x93\xfa\xcd\x88\x35\x59\xbf\x09\x17\xe1\x59\xe2\x1e\xb6\xda\x6c\xd3\x96\xbc\x56\x2c\x27\xce\x71\xb5\xb5\x5d\xda\x39\x0b\xd1\x1d\x9b\x0d\x39\xb0\xdf\xbd\xba\x51\xdc\xb0\xc3\x51\x63\x2d\x5a\x30\x25\x75\xb7\xed\x3e\xa2\x09\xea\x8b\x34\xdc\x44\xe1\x37\xbe\x64\x59\x63\xac\xf1\xc8\x0f\xe2\x78\x48\x5b\xeb\xb1\xaa\xd0\x1c\x72\x19\xa2\x6c\x52\xb0\x04\x81\xae\x1a\xaa\x92\xa1\x55\x68\x40\xde\xcb\x29\x17\x9e\xbd\x48\x97\x4d\x34\xa1\xdd\xcd\x33\x2f\xf6\x91\x3b\xe3\xc5\x3e\xf2\x62\x1f\x79\xb1\x8f\xdc\x3f\xb4\x2e\x4e\x05\x1d\x17\xdd\x53\xc7\xdb\xd9\xf5\x61\x3a\xf2\xae\xa0\x53\xc2\xe0\x8f\x57\x39\xd7\xf6\x5f\x72\x79\xf9\x1e\x42\xb0\x6b\xe1\x4d\xe7\x80\x9b\x4e\xfa\x0a\xf5\xa4\x91\x97\x6e\x8f\x8d\xa1\x98\xf3\xa1\x47\x05\xb5\x64\x8c\xac\x01\x85\x70\x91\xdb\x5d\x63\xba\x55\x31\xc2\x3d\x01\xfc\x8c\x86\xaa\x94\x98\x74\x3d\x66\x96\x5a\x65\x57\x17\x51\x14\xb4\x54\xf6\x33\x11\x7d\x94\x44\xf9\x48\x34\x67\x4a\x35\x64\x01\xa4\x3e\xa8\x70\x91\xca\x79\x1d\xcd\xe7\xa5\x71\x2f\x84\x5c\xba\x83\x84\xef\xa8\xd6\x32\xe3\x4d\xde\x02\xc4\xde\x34\x22\x7a\x0e\x22\xfa\xd6\x36\x19\xf5\xe0\x34\x1b\x82\xea\xf7\x12\xcd\xc4\x23\xb6\x7b\x82\xea\x58\x13\xe1\xc2\xef\xdb\xd6\x36\x01\xaf\x5a\x9f\x8e\x06\xa9\x88\x44\x03\xc9\xe2\x3e\x06\x82\xb0\x18\x77\xee\x4b\xe2\x3a\xdc\xeb\x6c\x71\xc2\x01\x51\xa0\x5c\x2f\xc1\x5a\xae\x03\x49\x82\x62\xe9\x5b\x39\xad\xee\x15\xc4\x93\x18\x78\x51\xdf\x68\x27\x4e\xe1\x67\x2e\x82\x1d\x68\x75\x25\xab\xba\xc0\xb4\xfd\xb0\x69\xc9\x42\xc8\x37\x89\x46\x45\xd8\x9e\xde\x66\xdb\x57\xf3\x88\x4a\x4d\x6e\xfb\x42\xc6\x55\x2f\x37\x2f\x6f\xea\xef\x28\x58\x27\xc9\x78\xee\xa7\x4b\x60\xf1\xdc\x7e\x75\xd3\x54\xd5\x4c\xbb\x5b\x97\x5b\x55\x50\x5b\x16\x9c\xd7\xbf\xfb\xcd\x6f\x7a\x08\x43\x5c\xb1\xcc\x48\xc8\x3c\x74\x95\xa5\x43\xc4\x2c\x55\x0c\x74\x7f\x2c\x3d\xea\xed\xcb\x98\x79\x66\x7a\xc5\x75\x6c\xaf\xfc\xe9\x56\xca\x9d\xa6\x28\xb8\xd1\xbf\x9c\x69\xaf\x00\xcd\x64\x51\xf3\xd0\x2a\xe1\x6c\xcb\xad\x12\xb6\xda\x20\x61\x9b\x6d\x11\xb6\xd7\x0c\x61\x8b\x2d\x10\xb6\xdd\xf8\x60\x2b\xed\x0e\xb6\x1e\xd0\xfd\xf4\x0d\x0d\x92\xd4\x25\x4c\x51\x93\xb0\x6f\xcb\x82\x9e\xf5\x0c\xd3\xd4\x32\xec\xdd\x94\xe0\x29\x5a\x11\x24\xb2\x71\xf6\x6f\x3b\x90\xb6\xe6\xd4\xb6\x5b\x0c\xec\x90\xe8\x8d\x63\x37\xdb\x09\x6c\xa5\x89\xc0\xb6\x5b\x07\x6c\xb1\x61\x40\xba\xc2\x75\xa9\x9a\x03\xf4\x2f\x58\x97\x96\x70\x6c\xa9\xfc\xff\x23\x16\xfd\x7f\x92\x52\xff\x8f\x5d\xe0\x7f\x37\x93\xdb\xfa\x16\x0c\xef\x5d\x26\x5c\x27\xaa\x13\x9e\x2a\x06\x64\x17\xcc\xe2\x0d\x24\x4b\xdd\x0b\xbe\x0b\x24\xde\x03\xa8\x1e\x02\x7e\xe2\x8a\x62\x4f\xcf\x3a\x71\x06\xd6\x93\xd8\x60\x49\x6f\x5b\x39\x42\x22\x3b\x09\xbc\x49\xcc\xe5\x08\xc0\xc7\xcb\x85\x88\xe8\xf0\xf1\xd3\x07\x42\x87\xa5\x1f\x08\x85\xf6\x5b\xb7\x63\xc1\xd0\x2f\x51\xc1\xeb\x8c\x5d\x8c\x0a\x7e\xaa\x0a\x26\x5f\x5e\x60\x66\xfe\x12\x98\x19\x8f\x1d\x0c\xcc\xd4\xad\x86\xf3\xde\x21\x0a\x6c\x17\x54\x4b\x39\xb6\x42\xaa\xaf\x1c\xd8\xd0\xe0\xa3\x8b\xb3\xce\xab\x67\x8a\x41\x57\x00\x5a\xe8\xd1\x32\x9d\xd3\x87\x1f\x39\x0d\xd7\xeb\x9a\xd4\x18\x56\x56\x9d\x4b\x7a\xbd\xc4\x65\x2e\x19\x2f\x71\x99\x2f\x71\x99\x2f\x71\x99\xf7\x8f\x5d\x8e\x2e\x9a\xd5\x25\x15\x43\xcb\x4f\x21\xa8\xb3\x95\x4e\xb2\x20\xa6\x8f\x88\xe3\x80\xbd\x88\x16\x96\xf2\x85\x02\xcf\xb5\xe0\x3f\xd7\xac\xf1\x74\x04\x95\x6d\x07\xe2\xc0\x00\x8e\xdd\x39\x2e\xd4\x64\x17\xf8\x6c\x26\xef\xd4\x07\x74\x7b\x19\x8e\xce\xb3\xc6\x7e\x47\x06\x8b\xb7\x1c\x93\x66\xc6\x50\xd9\xbe\x58\x50\xb6\x5b\x36\x5d\x47\xc8\x81\x8e\xf6\xf3\x0e\xc7\x9a\xa0\x45\x51\xfb\xee\xae\x43\xca\x98\x91\x92\x2b\x25\x95\x8b\x54\x8b\x5f\x1f\x13\x9f\xf8\x74\x66\x98\x42\x0b\x29\xa6\x67\x74\x27\x9f\x97\xcc\xb8\x5b\x00\xb7\xc8\x48\x42\x05\x16\x7a\xb5\xff\xed\x8b\x7c\xc0\xd6\x78\x09\x64\xcc\x66\xf4\x9a\xcb\xba\x47\x51\xb5\x4b\x94\xa7\xf6\xdc\x94\xa0\x2b\xcc\x65\x1d\x62\x51\x6a\x6d\x37\x23\x9c\x82\xbe\x8b\x07\x9d\x97\x3e\x6f\x26\x05\xb3\x79\x2e\xbd\x33\x7a\xc8\x6e\xb9\x36\x77\xf7\xdc\xa3\x80\x8b\x7d\xda\xca\x65\xbe\xd6\x95\xe5\xbe\x3f\x74\xae\x09\x9c\xe2\x0a\xb7\x80\x68\x9b\x40\xae\x2f\xe1\xab\x87\x0c\x20\xae\xb9\x10\xd6\x47\x27\x25\xcd\x66\x5c\x24\xa8\x87\xfb\x43\x0b\xb0\x96\x25\x64\x44\x8e\x8a\xa2\xc9\x63\xd2\x21\x75\xd0\x5b\x46\xda\x2f\x65\x0f\xa9\x13\x38\x16\x73\x15\xcb\x21\xce\x0a\x45\x2c\xc8\x4f\xd4\x7c\xe4\x16\x18\x5d\x97\x37\x54\xb1\x51\x26\x4b\x72\x7c\x79\x46\x72\xc5\x3b\xb6\xfb\xda\x72\xfe\x39\x1e\xf1\x45\x37\xd7\xf5\x97\x66\xef\x79\xb1\xf5\xec\x94\xad\x27\xa4\x30\x14\x3c\x9b\x9f\x9d\xa4\x4d\x8b\xc0\x39\xbd\xa0\xa9\x43\x4a\x84\xfd\x9c\x7c\x4b\x35\xcb\xc9\x07\x2a\xe8\x14\x1d\x56\x07\x97\x17\xdf\x7e\x38\xb4\x08\x0f\xce\xb8\xb3\x93\xa5\x79\x13\x97\xf1\xe4\xe7\xdb\x2a\xaf\x4e\x16\xb7\x2e\x99\x6c\x7f\x67\xd6\x8e\xdb\xb7\xb5\xca\xf3\x24\x88\xad\x17\x3d\x9c\xc0\x4b\xaa\xf1\x5f\x2c\x36\x1b\xc3\x44\x05\xdf\x19\x52\x2f\xb2\xd4\xeb\x32\xbf\x7a\xea\x0d\xb8\xeb\x8d\xb4\xfa\xe3\x15\x9b\x6f\x4c\xbd\x87\x70\x82\x3d\x17\xc7\xf7\x28\xe9\xfd\x2d\x89\xa2\x48\x99\x55\x10\xae\x17\x35\xb7\x46\x64\x5c\xeb\x5c\x2f\x8d\xa2\x86\x4d\xe7\x27\xac\x2a\xe4\xdc\x62\xf1\x45\x14\xb8\x83\x8f\x8e\x51\x94\x56\x63\x9a\x11\x55\x17\xd0\x78\x21\xbf\xd3\x8e\x51\x30\x96\x37\x64\x9e\x0b\x6d\x68\x51\xd8\x03\x84\xf9\x57\x42\xb4\xb6\x70\xb0\xae\x18\x30\x44\x38\x1f\x7c\xaa\xdd\x8e\xf8\xfc\xa1\xd3\x5e\x5f\x10\x80\xe5\x1f\xc6\xb7\x4d\x22\x21\xd7\x8e\x79\xec\x22\x30\x20\x45\xfb\x54\x17\x96\x41\x17\x79\xbb\x7d\x33\xaa\x1c\x0e\x15\xb0\x35\x04\xd0\x3f\xfb\x92\xce\x04\x28\x99\x6e\x85\x42\x44\x3f\x5f\x6b\x7d\xec\x10\x7d\x33\x43\x09\xd4\x4e\x4c\x68\x55\x15\x1c\xab\x0c\x48\xe5\x82\x70\x23\x7f\xf2\xdd\xc7\xd6\x21\xb5\x1b\x8a\xa1\x9b\x89\x9d\x43\x72\xcd\xd4\x78\x1d\xfb\xdb\xa6\x12\x25\xad\x38\x84\x33\xad\x4d\xc2\xba\x0a\x8d\x47\x17\x67\xb8\xd0\x32\x0f\xbf\xff\x12\x11\xc2\x1d\xb5\x0f\xe8\xc1\x74\x34\xe7\x06\x08\x9d\xa3\x8e\x2e\xce\xb0\x21\x9b\x6b\x1e\xd5\xb8\x06\xac\xc6\x4e\x31\xf9\xb2\xe9\x79\x4b\xa7\x76\x46\x43\xa4\x60\x9b\x74\x4f\xb5\x10\x30\x51\x97\x0c\x1b\x53\x05\x60\x08\x17\xb0\x4e\x80\xa2\xf1\x40\xa0\x55\x79\x44\xf6\xf6\x62\x9d\x10\xcb\xb3\xa8\x08\x6e\x20\x75\x7b\x5f\xb5\x9e\xb2\x74\xad\x79\xb1\x75\x39\xfc\xe6\x51\xcf\x1b\x46\x39\x77\xe0\x98\x09\x22\x77\x84\x14\x9f\xdc\x7e\x7f\xff\xe9\xfd\xa3\x23\xe8\x79\x7b\x39\xd7\x1e\x88\x41\x6b\xd3\x8a\x2a\xc3\x69\x41\x6a\x55\xf8\xf0\x42\xac\x44\xe2\x32\x02\x67\xf4\x3a\x6a\xbd\x34\x22\xe4\x2b\xc4\x4a\x87\x0c\x48\xca\xc0\x28\xea\x5a\x91\x4d\xea\xa2\x18\x90\x09\x17\xd4\x32\x32\x56\x91\x28\xc8\x6b\x6d\x88\x2f\xb9\xc8\x98\xdd\xa6\xa1\xc7\x4b\x02\x90\x7b\xb3\x51\xa0\x69\x10\xa3\x19\xbb\x5c\x10\x14\x4b\xdf\x32\xb0\x0b\x4f\xa4\x22\xc7\x45\xad\x0d\x53\x9f\xa4\x65\xc3\x4d\xba\x09\x99\x28\x59\x12\x1a\x7f\xfd\x2d\x17\xf9\x46\x99\x50\x9f\x80\xb5\x67\x54\x10\xc6\x21\x30\xca\x2e\x0d\xf1\xd0\x16\xd9\x9b\x4b\x75\xa0\xeb\x6c\x66\xb7\x68\xaf\x92\xb9\xde\xb3\xd4\x79\x0f\xdd\x8d\x7a\xef\xd0\xfe\xb5\xf8\xae\x98\xbd\x11\xfd\xee\x15\xad\xf8\xde\xe1\x80\xc0\x86\x43\x70\x9e\x5c\x3f\x1a\xef\x0b\xbd\x47\x7e\xc3\xc0\xd4\xd7\xe9\x16\x7d\x8a\x67\x80\x8b\x21\x9a\xd0\xb7\x9b\x19\x37\x98\xaf\x63\x6f\x0a\xfa\x00\x42\xaf\x99\x45\x46\x4a\xc8\x91\x77\xa2\xd9\xab\x55\x32\xea\xe3\x75\xd9\x35\x53\x73\x33\x73\x0d\x2c\x3c\x15\x7d\x39\x39\xb8\x19\xbd\x4e\xcd\x91\x32\x7f\x42\xcd\x75\x03\x9a\x70\xe7\x84\xf6\xbf\xda\x5f\x64\x49\x0d\x0f\xfe\xd7\x3e\x0f\x10\xc2\x3a\x9d\xc5\x0f\xf6\x97\xed\x73\xc0\x8f\x90\x99\x04\x72\xf8\xfe\xbd\x0b\x4f\xc1\x0d\xff\x8e\x0b\xf0\x7a\x83\x3c\xe4\x6b\x01\xb8\x43\x5b\x7a\x52\x00\xe1\xbf\xec\x29\xdd\x55\xba\xd6\x55\x94\x56\xc0\xe8\xf5\xcc\xfb\xa6\x5a\x39\x81\x53\x56\x3f\xc8\x7c\xf9\x25\x6e\x21\xc9\x59\xf4\x70\x88\x25\x6e\xcc\x9c\x6e\x2e\xa7\x39\xcd\xab\xa5\x5a\xe8\xea\x33\x5d\x71\x7e\xf7\x41\xd2\xd8\xe9\x80\xec\x47\xdf\x7c\x6e\x02\x23\xc8\xa4\xa0\xd3\x06\x17\x81\x88\xa3\x64\x7f\x7c\xf9\x83\x7f\x05\x4d\xee\x29\x3d\xfc\xa0\xea\xf4\x90\xb2\x34\x6c\x76\xe9\xde\x27\xee\x75\x65\x3c\xac\x31\x85\xc9\xef\xc7\xa6\x75\xe2\xbe\xcc\x4a\x53\xfd\x7d\xfb\xef\x4d\xeb\x34\xc2\x04\xdf\x39\xce\x9b\x42\x20\xdb\x04\x64\xb8\xcb\x1f\x5a\x68\xf2\x00\xbc\xf7\x20\xed\x15\x9b\xdf\x48\x95\x3f\x8c\xb0\x47\x81\x98\xf9\x9f\x78\x65\xde\x07\x83\xa1\x39\x5e\x2e\x75\xec\x74\x46\xd5\x95\xc0\x17\x74\xcc\x8a\x87\x41\xbf\x47\x31\xf8\x40\x2b\xfb\x3a\x4d\xca\x26\x5a\xa4\x5c\x94\x19\x6a\xa7\x98\xe7\xe3\x33\xd2\xa4\x9a\x52\xc1\x7f\xc1\x3c\xd7\xcc\x52\x0a\xa9\xf8\x2f\xcb\x51\xed\x00\x7d\xfa\x68\xe3\x2a\x58\x66\x0e\x1d\xd6\x2f\x25\xd9\x0f\x5c\x0b\x9a\xe7\x1c\x45\xb0\x8b\x07\x30\x78\xf5\x7e\x71\x71\xb5\xc9\x49\xc3\xf3\x98\x66\xd3\x38\xf6\x1e\xf1\x98\x57\x90\x85\x87\x6f\xee\xea\x30\xba\x35\xd8\x53\xad\x56\x24\x8a\xac\xfc\x7d\x49\x39\x72\xed\xe5\x6d\xbc\xee\xd9\x5d\x87\x4d\xd4\xc9\xd6\x96\x96\xda\xf7\x0b\xb3\x3d\xc1\xbd\xea\xb5\xe1\xac\xa4\xbc\xeb\x8e\xe1\xe8\x71\x64\x25\x35\xb5\xe2\x66\x29\xa7\x5e\xfd\x43\x2e\xbe\xab\xc7\xec\x07\xa6\xb4\x3d\x8f\x4d\x7f\x2e\x20\xe3\xec\xe8\xe2\x6c\xe9\xb6\xa4\xe1\xc8\xf7\x1a\x32\xc0\x6e\xe6\x20\xb7\xe2\x22\xa9\x05\x2d\xc7\x7c\x5a\xcb\x5a\x17\xf3\xd8\x83\x42\xc9\x15\x17\xf9\x88\x90\x33\x34\xab\x8a\x7d\x43\xa8\x90\x62\x5e\xba\x47\x45\x56\xd4\x39\x6b\xcd\x78\x1f\x2b\x93\x84\x5e\x4b\x9e\x13\x5a\x1b\x59\x52\xc3\x33\x92\x49\xa6\x32\x28\xa2\x1a\xcf\x5f\x6b\x46\x68\x6b\xc6\xe6\xb7\x59\xad\x8d\x2c\x49\x49\x95\x9e\xd1\xa2\xb8\x0f\x25\x12\x48\x07\x60\x4e\xbb\xf7\x5b\xbb\x2b\xf7\x7e\x79\xbd\x62\x1f\x1e\xbe\x0e\xb0\x70\xaf\xeb\x60\x81\xeb\x35\xc1\xf5\xfd\x48\xbd\xc6\x1c\xae\x02\xee\xd2\xbe\x1c\x2d\xfc\xfc\x3c\x63\xa4\xaa\xc7\x05\xd7\xa0\xc2\x03\xe1\x9a\x93\x31\x9b\x71\x97\x7a\xf3\x30\xc5\xba\xf7\x88\x1f\xda\xe7\x55\x24\xe3\xc1\x1d\x5a\x41\xe1\x57\xfe\xd6\x71\xc0\xb3\x92\x4e\xd7\x10\xed\xef\xb9\xbe\xef\x2d\xd9\xa7\x62\x1e\xf8\x29\x34\x53\xd5\x03\x22\x95\x4b\x24\xf6\xba\x9f\x72\x5f\x85\x16\xc1\x8a\x7c\x74\x3b\xea\xf2\xa2\xdd\x35\x80\x2a\x03\x4c\x4d\xa4\x2a\xed\xbe\x73\x45\x26\xb5\x00\x6b\xf8\x3d\x7a\x21\xc4\xf0\x01\xff\x71\xc6\x4c\x5a\x68\x19\x88\x01\x1c\x9b\xf0\x80\x11\xaa\xc9\x0d\x2b\x0a\x0c\x23\xc2\xce\xaf\x51\xd9\xe6\xa6\x96\x65\x13\x4a\x38\x5e\xae\x5b\xe6\x7c\xca\xb4\x21\x07\x97\x7f\x3d\x3a\x04\x81\x08\x8c\x75\x73\x62\xe8\x74\xb4\x10\x1f\x8e\xc1\xa4\x56\xdc\xca\x6b\x10\xcb\x32\x6a\x68\x21\xa7\x18\x81\x66\x49\x8a\xfd\x7d\x55\xd0\x39\xa4\x71\x55\x54\x41\xae\x60\x86\x06\x4b\xa2\x6a\x71\x5f\x9b\xf1\xc7\xe3\x94\x0f\xd3\xa4\x55\x3d\xb5\x57\xb8\x87\x1f\xa6\x39\x0f\xf4\x09\x7e\x5c\x16\xac\x58\x55\xd0\x7b\x0c\x56\x77\xe8\x45\x53\xfa\xd0\xea\x2d\x60\xd8\x90\x82\x85\x39\x46\xe4\x12\xf1\xa9\xa4\x26\xc3\xf8\x90\x7f\x94\xcc\xd0\x9c\x1a\x3a\xb2\xca\xfd\x3f\xda\x25\x92\x64\x91\xdb\x89\xee\x3f\xe8\x7b\x60\x46\x51\x5c\x3e\x4c\xe3\xde\x5b\xd5\x22\x3c\x0e\x0a\x97\xbf\xb7\x2b\x2d\x64\x3d\xc9\x1b\xbc\xfe\xe9\xad\xd5\xad\x57\xba\xf2\x5b\xb0\x2e\xfe\xa8\x6d\x7b\x2a\xda\x6f\xe2\xb0\xb5\x64\xc2\xe8\x11\x1c\x4d\xfc\x09\xf8\x13\x8e\xce\x4f\xee\x37\xc7\x3e\x6c\x48\x7a\xc0\x70\xb4\xbe\xcf\xe6\x68\x05\xec\xde\x65\xe3\xbe\x69\xfb\x12\x7d\xa1\x0c\x28\xc3\x84\xc5\x1b\xa8\x08\x5c\x09\x1e\x5e\xb1\x2c\x9e\x73\x53\xca\xa5\x51\x0a\xef\x37\xb6\xad\xe5\x11\x5e\xc7\x0f\xfc\x50\x65\x9d\x61\x78\x8d\x7b\x1f\x5a\xcf\x2d\xfc\x60\xf5\x9b\xfb\xaa\xdb\xe0\x99\x40\x59\x05\x6f\xf9\x0f\xc7\xb0\xae\x1b\x7d\x4d\x63\xa1\x7f\xd5\x0d\x00\x7d\xd0\x09\x18\xb0\xa0\x15\xc4\x7b\xc5\xe6\xfb\x4e\xd3\xb5\x37\x68\xc6\x2b\xac\xdf\xe4\x7c\x82\x0f\x1d\x3f\x8e\x1f\x68\xc1\xf3\xb0\x00\xde\xa5\x33\x31\x20\xe7\xd2\xd8\x7f\x4e\x6f\xb9\x36\x68\x63\x38\x91\x4c\x9f\x4b\x03\x9f\x24\xd9\x29\x04\x30\xe5\x3e\x39\x33\x08\x3a\x80\xe0\xba\x47\xc6\x12\xb7\x1f\xd8\x43\xa1\x91\xf7\xec\xd3\x67\xc2\x0a\x34\xf8\xca\x0f\x2c\x11\x8a\xc2\x69\xb7\x80\x2f\x96\x20\xa4\x18\xfa\x1c\xad\xbb\x2b\xb8\x7d\x94\xaa\xb5\x8d\x9d\x17\x73\x0b\x61\x7a\x03\x7c\xc3\xb5\xe7\x4b\x41\x0c\xa1\xde\x34\xfc\xa0\x5d\xba\x64\x6a\x0a\xbe\xdd\xec\x01\x5f\xe4\xba\x16\xf9\xb5\xec\xf0\x6b\x5b\xdf\x3b\xd9\xdc\x3b\xfc\x08\x78\xd2\xfb\x7b\xed\x73\x64\x03\x7c\x8c\xa6\x42\xaa\x5f\xa2\xe1\xee\xbf\x2c\x71\x87\x23\xfd\x6f\x28\xa8\xa8\x47\xe4\x88\x68\x2e\xa6\x05\x6b\x7d\xe7\xdc\xed\xd1\x34\x2b\x96\xaa\x20\x4b\xf1\xe7\x9a\x5f\xd3\xc2\xb2\x19\xc8\x0a\x09\xa5\x58\xe4\xe4\x0e\xb3\x1d\xb8\xc2\x89\x96\x20\x06\x31\x76\xef\x8a\xcd\xf7\x06\x2b\xd3\x64\x62\x8c\xde\x3b\x13\x7b\x4d\x8d\xa1\x16\x96\x06\x9e\x06\x92\xf1\x1e\x7c\xb7\xd7\x9d\x6f\xaf\xe4\x50\xeb\x5b\x19\xc9\xc3\x28\xb7\x59\xee\x9d\xbe\xe2\xcb\xc3\x92\xd6\x41\x12\x2f\x5f\x1e\xe8\x43\xb0\xab\x09\x46\xa0\x08\x96\x02\x97\x84\xfd\x34\xae\xe8\x6c\x35\x96\x2b\x5e\x55\x4d\xb9\xed\xba\x9a\x2a\x9a\x33\x32\x55\xb4\xba\xe7\xd2\x6e\x26\x9d\xa2\x88\xbb\x6c\xc9\x15\x6a\xd9\xee\xeb\x40\xf7\x9c\xf5\x0a\xab\xc3\xca\xdf\xdd\xb0\xf1\x4c\xca\x2b\xa8\x8c\x03\x78\xf7\x88\x26\xb5\x1f\x71\xad\x93\xe6\x33\x6f\xee\xd0\x24\x67\x86\xf2\x02\x42\x04\x3f\xbe\xff\xe0\x82\x08\xbd\xac\xe6\xa1\x5c\x4e\x33\x12\xe8\x86\x34\x77\x71\xb2\x9f\xd8\x35\x67\x37\xce\x72\x76\x1f\x89\x1a\x92\x29\x13\x10\xa0\xb6\x22\xcc\x74\x48\x34\xcf\xd9\x29\xa4\x5a\xdf\x3f\x51\x0f\x27\xd9\x3d\x30\x3f\x44\x2b\x56\xf3\xba\x07\xf9\xdc\x1a\x3c\x2e\x58\x50\x2e\xa4\x5a\x51\x59\x7e\xbd\x32\x6b\xeb\x95\x50\x0b\x59\xca\xbf\xf9\xcd\x37\x2b\xf8\xca\x2d\x2f\xeb\xf2\x2d\xf9\xdd\x6f\x7f\xfb\xcd\x6f\xef\x7f\x8c\x0b\x7c\xec\xcd\xfd\xef\xe7\x6e\xdb\xf1\xa7\x93\x1d\xd8\xef\x3c\xc4\x7b\xaf\x76\xc0\xaf\x31\xd5\x84\xf2\xa2\x56\x2e\x5d\x62\x4d\xed\xf1\x5d\xfc\x1b\x70\x9e\x36\x69\xb5\xd4\xcf\xe8\xe3\x8c\x5d\xfc\xf1\x84\x0b\xa6\xc9\x4c\xde\x90\x5a\x28\x96\xc9\xa9\xe0\xbf\xb0\x1c\x8b\xe5\x6a\x0c\x80\x83\x56\xf2\x1e\xc5\x09\x13\x79\x25\xb9\x30\xc0\x62\x67\x54\xe4\xc5\xaa\x58\xa5\x35\xde\x34\xbe\xc1\xbd\xb6\x0c\xb8\xd1\x46\x1b\xf6\xa1\xf9\xc5\xc2\x76\xd9\x77\xf6\xae\x66\xe4\x72\xb8\x6d\xbd\xde\x14\x09\xe3\xe5\x0a\x9b\xcb\x12\x18\x37\x33\x09\xa0\xa9\x03\x3e\xfb\xb9\x66\x6a\x0e\x79\xbb\x8d\xe2\x16\x45\x14\x7f\x6e\xca\x37\xfa\x77\x74\x42\x25\xbd\xd7\x27\x40\x96\x98\x64\x22\x51\xab\x09\x70\x5b\x80\x0a\x7e\xc3\x30\x4c\xc7\x7b\x7d\xc9\x11\x11\x75\x51\xac\x58\xe9\x9e\x49\x84\x5c\xe5\x39\xc6\xb1\x96\xfd\x61\x3d\xc3\xc0\xba\x26\x28\x1c\xdb\x33\x44\xc5\x2f\x9e\x48\x8b\xda\x34\x9c\x78\x4b\x06\x2a\x1c\x5d\xcc\x54\x38\x36\x48\x5f\x58\x3f\x75\x61\xbd\x92\xd0\x6b\x98\xaf\x70\x6c\x92\xdb\xb0\x66\x21\xe7\xc7\x34\x68\xe1\xd8\x28\x06\x6e\x3d\xe3\xd6\x12\xd0\xd7\x8c\x73\x7f\x44\x43\x17\x8e\xc7\x30\x77\xe1\xd8\x68\x1f\xd7\x31\x7d\xe1\xe8\xb2\x8b\x4f\x60\x06\x73\xef\xfc\x94\xc6\xb0\x07\x96\x4c\x6c\x12\xc3\xb1\xb6\x61\xcc\x01\xb7\x51\xc0\xea\x06\xc1\xaa\x1b\x06\xaa\xf6\x08\x52\xed\xfc\xd3\x35\x8c\x67\x38\x36\xc3\xe8\x27\x34\xa4\xf9\x05\x9f\xcc\x9c\x86\xe3\xa9\x8d\x6a\x38\xd6\xe6\xa7\x9b\x19\xd8\xe2\xc9\x1f\x40\xd7\x2e\x85\xae\x14\xe3\xe2\x5a\x62\xbf\xcf\x8d\x94\x88\x4f\x77\x7e\xb8\xa0\x4b\xdc\x00\x1b\x75\xca\x44\xd0\xbe\x62\x9d\x6a\x26\xe5\x15\xa9\xf5\xc3\x1e\xb5\x95\xef\xfd\x40\x7a\x6c\x12\x25\x78\x93\x1b\xf6\xa9\x2e\xd8\x8f\xdc\xcc\x3e\x36\x25\x57\xe0\x9a\x99\xba\x2a\x60\x2f\xa2\x2f\x2c\x5e\x7e\x6a\x94\x93\x33\x83\x24\x36\x93\x65\xc9\x44\x8e\xd1\x96\x25\xbd\x5a\x8d\xf0\xda\xaa\xb7\x98\x55\x50\x14\xa8\xc2\xc1\x52\xec\xb6\xa2\xa2\x51\x56\xae\x2d\xa3\x5e\x85\xc2\x6b\x22\xf0\xba\x32\xd9\xda\x79\xa6\x1b\xcb\xdb\x8b\x79\xa5\x51\x62\x68\x2b\x7f\x94\x8c\x59\x21\xa1\xa6\x14\x66\x4e\x60\x96\xd1\xda\xa9\x96\x67\x13\xff\x2b\x27\x39\xb9\x3e\x45\x4c\x4c\x9b\x42\xf3\xba\xe0\x19\x0b\x2c\x53\xae\x53\xcc\xe7\x93\x93\xa6\xd7\x13\xd0\xd7\xe1\x7d\x6b\xf2\xbd\x0d\x78\x5e\x0f\x7e\x47\x2b\xfe\xb0\x29\x10\x47\x87\x93\xf7\x53\xc7\x67\x7f\xed\x3f\x5b\xe7\xf4\xfd\xc3\x2f\xe7\xbf\x6a\xf4\x38\xff\xa6\xd4\x54\xea\xe3\x6f\x53\xd4\x46\x06\x0e\x67\xbf\xc0\x5a\x32\xaa\x2c\xb3\x07\x4b\xfe\x90\x1c\x7f\x3a\x3d\xfa\x7c\x3a\x20\xdf\x5f\x9c\xc0\xbf\x27\xa7\xef\x4f\xed\xbf\xc7\x1f\xcf\xcf\x4f\x8f\x3f\x5b\xe1\xf9\xab\x07\x41\x80\x46\xce\x45\x81\xa7\x6f\x25\x14\xd9\x26\xe6\x54\xcc\xc9\xa4\x36\x96\x22\x37\xc0\xb4\xa0\xa4\x68\x42\xa4\x79\xbe\x4e\xb2\xe3\x17\x87\x83\xad\x33\x0f\x07\xba\x68\xb5\x8d\xf6\xcc\xf5\xce\x76\x79\xfd\x0f\xbf\xd9\xd3\x20\xf9\xda\x79\x9a\x9b\xe2\x78\xb7\x14\xce\xff\xf1\xe0\xbc\xef\xa4\x22\xec\x96\x96\x55\xb1\x46\x86\xdc\x7e\x25\x73\xbd\xef\x72\x75\xed\x7f\x3f\xbc\xed\xf0\x93\x57\x85\x9c\xee\x87\x14\x5f\x46\x0a\x39\x25\xba\x1e\x87\xfc\x6d\x10\x04\xd7\x9a\xed\x2b\x3f\x4d\x2b\x19\x75\x10\x92\xbc\xa3\x59\xd7\x06\xae\x35\x67\x3c\xc1\x26\x70\xbd\xd2\x19\x2d\x58\x6b\x26\xfb\xc1\xa6\x00\x7d\xf5\x6a\xf9\x1b\x7a\x4d\x85\xab\x85\x19\xd7\xa1\x14\x37\xbc\xc8\x33\xaa\xf2\x3b\xe4\x02\x44\x3f\xbc\x4d\x80\x39\xd8\x18\x50\x80\xe0\xd8\x2c\x8d\x85\x20\x1f\xb6\x58\x5d\x33\x55\xd0\x0a\xf3\x00\xa1\xa3\x25\xc4\x2d\xaf\x01\xe2\x09\xab\x18\xd4\x11\xc0\x26\x5e\x8c\x30\x91\x15\x12\x2a\x5d\xa2\xd4\x39\x68\x1f\x0b\x46\x39\xfb\x86\x3b\xeb\xe6\x87\x7f\xe1\xec\x15\x12\xca\x52\x53\x1d\xcc\x52\xbb\xb7\x1a\xad\xcf\x3f\x7e\x70\x1e\x34\x06\x06\x2d\x9b\x91\x3d\x57\x44\x62\x6f\x40\xf6\x42\xe1\xd1\xdc\x69\xe4\x7b\x5f\x3d\x5c\xd2\x39\x4c\x10\x57\x0e\x00\x85\xdd\x45\x3a\x0c\x01\xce\xb8\x50\x0b\x60\xb7\x8f\xd1\x58\x1b\xf4\xa6\x28\xaf\x15\x29\x9d\xab\x05\xde\xa1\xbd\xd0\xc3\x33\xc5\x2f\x7a\x07\xea\xa6\x42\x47\x6f\x88\xf7\xbe\x6a\x4d\x6f\x7c\x75\x72\x22\xa4\x3b\x3c\xc5\x2c\x36\xae\x4a\x05\x88\xc7\x65\xeb\xee\x85\x18\x97\xb8\x2a\x31\x57\xa4\xa2\x8a\x09\x13\x80\x7f\x78\x5a\xd7\xc4\x19\x8c\x31\x5f\xed\xad\x77\x2b\x57\x5e\xa2\x28\xac\x61\x4d\x5b\xc5\x65\xf8\xc5\x71\x41\xb5\x5e\xe2\xf0\x04\x1e\x60\x27\x76\xb5\xe9\x2d\xef\x75\x31\x1f\xd0\xca\x74\x46\xaf\x57\xbc\xea\x1a\x40\x1b\xaa\xa6\xcc\xac\x0e\x48\xa0\x62\xfe\x71\x65\x13\x88\xe1\xda\xad\xe1\x86\x1d\x2c\x46\x5c\x98\xa1\x54\x43\xfc\xc9\x5b\x62\x54\x7d\x9f\xdd\xc1\xf0\x92\xc9\xda\x5c\xb2\x4c\x8a\xe5\x49\xc3\xee\xb9\x64\x11\x16\x1b\x64\x52\xbb\x20\x9f\x23\x2f\x7e\xc7\x9d\x69\xbc\x39\xaa\x91\xcd\x7d\x60\x4f\xbb\xb8\xe8\xc7\xf7\x1f\xfa\x1c\x36\x81\x0a\x52\xab\x4f\xf2\x07\xc7\x93\xc5\x34\x40\xea\x20\x5f\xf9\xb3\x0f\xb5\xd9\xfc\x47\xc7\x21\x60\x64\xf5\xd3\x6e\x33\x56\x17\x7a\xbc\xf7\xfd\xb5\xa1\xa6\xbe\x83\x0d\x0f\xb1\x22\x47\xdf\x2f\xb1\x90\x83\x53\xef\x2f\x61\xaa\xd8\x67\x15\xd7\x90\x43\x8d\x0e\x8b\x68\xc2\x73\x3e\xa3\x64\x44\xdc\x0f\xed\x95\x35\x8a\x72\x34\x87\xd1\xcc\xd4\xf4\xae\xcb\xdd\xfe\xd8\x65\xa3\x2c\xaf\x1c\xbb\xc2\x20\xb6\xca\x08\x96\x31\x65\xf4\x7b\xaa\xcd\xf7\x55\x4e\xef\xa9\x21\xb0\x90\x65\xa2\x0d\xdc\x29\xd4\x69\x6f\x04\xcb\x2d\x13\x72\x5b\x82\xf3\x91\x1b\x4b\xdd\x6b\x9c\x71\xc9\x84\x0f\x60\xa5\xbf\x63\xf6\xe7\x43\xbb\xd4\x72\xa8\x3f\x49\xbb\x27\x47\x4b\x69\x54\x3b\x99\xe7\x21\x68\x2d\x47\x53\x30\x1b\x11\xec\x76\x99\x54\xd9\x1f\xe2\x82\x51\xb1\x3c\xd9\xb2\x05\xeb\x31\x3e\xb7\x39\x4e\xb9\x05\xc8\xcd\x8c\x5b\x75\x0b\x6b\x2d\x68\xe2\x85\xd8\x9c\x15\xec\x9e\x92\x0b\x3d\xf3\x7f\xdc\x0a\x27\x6e\x81\xbe\xa1\xd3\x17\xed\xe9\x82\xc7\xdb\xe9\x96\x2e\x2b\xb7\xd1\xd2\x9c\xec\x13\x6c\x15\x8b\x2f\x0c\xc2\xdb\xb8\x90\xd9\x15\x16\x35\x87\xa2\x66\xfc\x17\xa6\x56\x08\x19\xe0\x45\xe4\x22\xe7\x59\x08\x57\xa8\x94\x9c\x2a\xa6\x5b\x5b\x8d\x35\x60\x35\xce\x6e\xd7\xb4\x7b\x1e\xd6\x95\xaa\xf1\xed\xd4\xc2\x95\xbd\x78\x9a\x14\x25\xaf\x97\x43\xfe\x66\xcb\x97\x7e\x57\x45\xc7\xfa\x92\xd0\x15\xc3\x19\x68\x68\xe9\x92\xac\x5f\x7d\x77\x7f\xea\x71\xd2\xfc\xa1\x55\x09\xd0\xf8\x04\xf7\x7d\x6f\x56\x3e\xb5\x22\x55\x7a\x5d\x57\xc0\x03\x29\xd1\x64\x7d\xd5\x29\x80\xbc\xce\x6c\x49\x73\x2a\x92\x87\xc9\xac\x51\x0d\x78\x93\xe0\x97\x75\xbb\x47\x6d\xe4\xf6\x16\x9b\xb4\x4d\x69\xdd\x96\x46\x99\x72\xb5\x53\x30\x3e\x6e\x22\xd5\xbd\x6a\x5b\x3a\xe0\x57\x27\xd0\x3f\x38\x91\x95\x69\xef\x0f\x44\x6f\x33\x6e\x4f\x41\xc3\x4f\x06\x84\x92\x19\xd7\x46\x2a\x17\x21\x62\x19\xa0\x51\x54\x68\xfc\xfe\x5e\x5e\xd1\x37\xb4\xfd\x38\x80\x40\x68\x55\x31\xaa\xbc\x9f\xde\xb1\x33\xaa\xc1\x88\x9a\x49\x95\x2f\x05\xcc\x9b\x64\x96\x8a\x63\x4b\x97\x4f\x50\x3b\xa4\xa0\xda\x7c\x0e\x30\x58\x99\x62\x4d\x6a\xdc\x96\x98\xdc\x2b\x36\x6f\xe3\x6b\x58\x4a\xd1\x7c\x29\x09\x15\xce\x50\x75\xdf\x12\x6b\xe1\xd7\xc3\x72\x49\xf3\x6e\x28\x00\x76\x7a\xaf\x9b\x20\xec\x45\xaf\xf8\x34\x90\x97\x4c\xeb\x95\x09\xe5\x0b\x95\x6c\xa0\xe3\x14\x09\x1d\xa7\xdc\xcf\x3d\xb3\x47\xc1\x01\x73\x2b\x7c\x65\xe6\xf9\xfd\xa8\x46\x40\x4c\x40\x33\x48\xb8\x56\xbd\x8e\xac\x9a\x51\xbd\xee\xcb\x84\x5b\x14\x72\x78\xd6\xbe\x0e\x6b\x42\xa3\x18\xd5\xab\x6a\x73\x6c\x12\x04\x3d\x56\x9c\x4d\xc8\x31\x2d\x59\x71\x4c\x75\xca\x9d\x07\xf2\xb0\xca\x54\xc3\x46\xd3\x11\xd9\xff\x14\x85\xc9\x9c\x4b\xf3\x81\x99\xfd\x6e\x7b\xb3\x1e\x21\x78\x54\x12\xd0\x5b\x1d\x79\xf8\xc2\xf7\xbc\xea\xbd\x21\x5c\x71\xb1\x77\xe2\x4a\xaf\xae\x4b\x73\xdf\x35\x6e\x5f\xe0\x5a\x81\x79\x32\xeb\x7a\x91\x1f\xa8\x75\x71\xdf\xe5\x5d\xe7\xda\x6e\xe9\xc2\x6e\x72\x55\x1f\x78\xfb\x30\xc5\xe5\x52\x53\xcf\x9d\x8d\xf8\xdc\x52\xa7\xc1\x57\x14\xc7\xc6\x63\x27\x2a\xae\xad\x92\x97\x52\x30\xda\x6e\xfd\x28\x77\xa8\xf7\x7e\xbf\x42\xf2\x1f\xae\xe6\xf3\x7d\x6b\x53\xe5\xe0\x7f\xb3\x18\xf0\x94\xe1\x72\x27\x7e\x55\x67\x80\x09\xfd\x6f\xe0\x2f\xf4\xee\x07\xc8\x5a\xf8\x71\x60\x24\xa9\x14\xbb\x86\x3c\x0a\x01\xf9\xa1\x8c\x08\xa6\xed\x45\x39\x5c\xb1\xfc\x9a\x2a\xdb\x7a\xea\xda\xc3\xaa\xf4\x83\x6a\x32\x79\xf8\x68\xfd\x43\xab\x0e\x18\xc7\xba\x5a\xe1\x1a\x5a\xf7\x06\xea\xe0\xc3\x3a\xd5\x06\x93\x3d\x28\x60\x6e\x38\xdf\x72\xc3\xf3\xe2\x58\x68\x55\x63\x7f\xf2\x09\xe8\x39\x46\x5a\x64\x96\x2a\x67\xd0\x85\x09\xc9\x7c\x68\x94\x17\x1b\x99\x3f\x2d\xd2\x40\x88\xb9\x6f\x63\x78\xaa\xd7\xaa\x6b\x9e\x6e\xcf\x1f\x2c\x0a\xb7\xf6\x7c\x3b\x50\xe1\xee\x41\x04\x7a\xdc\x92\x57\x38\x1e\xc2\xba\xed\xe3\xdb\x3a\xd5\x4e\x57\xe2\xd8\x23\x15\x1b\xd4\x4c\x5d\xb3\xbc\xe5\x61\x74\xdd\xd0\xda\x9f\x45\xfe\xe8\x66\x7e\xb7\xed\xe4\xbf\xfe\xfb\x7f\xfc\xbf\x00\x00\x00\xff\xff\xe0\x67\x7b\x8a\xc4\xcb\x0b\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x23\xb9\x95\x27\x0c\xff\xef\x4f\x81\x90\x7b\x5e\x49\x63\x91\xaa\xb2\xc7\x7e\x3d\xb5\xb3\xe3\xd0\x56\x55\x77\xeb\xe9\x2e\x95\x42\x92\xdb\x8f\xa3\xdd\x6b\x83\x99\x87\x24\x46\x99\x40\x0e\x80\xa4\x8a\xde\xde\xef\xfe\x04\x0e\x80\xbc\xf0\x22\x91\x09\x48\xcc\xaa\x4e\x38\xc2\x5d\x22\x93\xc0\x49\x5c\x0e\xce\xf5\x77\x68\xc1\x7e\x00\xa9\x98\xe0\x6f\x08\x2d\x18\x7c\xd2\xc0\xcd\x5f\x6a\x7c\xff\x47\x35\x66\xe2\x7c\xf1\xfa\x57\xf7\x8c\xa7\x6f\xc8\xdb\x52\x69\x91\xdf\x80\x12\xa5\x4c\xe0\x1d\x4c\x19\x67\x9a\x09\xfe\xab\x1c\x34\x4d\xa9\xa6\x6f\x7e\x45\x08\xe5\x5c\x68\x6a\x3e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x34\x03\x3e\xbe\x2f\x27\x30\x29\x59\x96\x82\xc4\xce\xfd\xd0\x8b\x57\xe3\xd7\x7f\x1c\xbf\xfa\x15\x21\x9c\xe6\xf0\x86\x24\x59\xa9\x34\x48\x05\x72\xc1\x12\x70\x8f\xa9\xb1\x28\x40\x52\x2d\xa4\x1a\x27\x42\x82\x30\xff\xc9\x7f\xa5\x0a\x48\xcc\x60\x33\x29\xca\xe2\x0d\xd9\xf8\x8c\xed\xd7\xd3\x44\x35\xcc\x84\x64\xfe\x6f\x42\x46\x44\x64\x39\xfe\xdb\xbd\xab\x1d\xfe\xd6\x0e\xef\x26\x08\xbf\xcf\x98\xd2\xdf\x6d\x7f\xe6\x7b\xa6\x34\x3e\x57\x64\xa5\xa4\xd9\xb6\x17\xc1\x47\xd4\x5c\x48\x7d\x55\x93\x65\xc8\x48\xd4\xa2\xf9\x6f\xf7\x20\xe3\xb3\x32\xa3\x72\x4b\x6f\xbf\x22\x44\x25\xa2\x80\x37\x04\x3b\x2b\x68\x02\xe9\xaf\x08\xf1\x63\xd9\xce\x47\x84\xa6\x29\xae\x17\xcd\xae\x25\xe3\x1a\xe4\x5b\x91\x95\x39\xaf\x06\x37\xcf\xa4\xa0\x12\xc9\x0a\x8d\x6b\x72\x37\x07\x9c\x35\x22\xa6\x44\xcf\x81\xbc\xbd\xfd\xa1\x7a\x94\x90\xff\x52\x82\x5f\x53\x3d\x7f\x43\xc6\x66\x01\xc6\x29\x53\x45\x46\x97\x86\x84\xc6\x53\x76\x35\xdf\xd9\xef\x1a\x9f\xeb\xa5\xa1\x57\x69\xc9\xf8\xec\xb1\xf1\xdd\x4b\xec\x46\xc2\xa2\xb1\x4e\xcd\xe1\x7f\x58\xfb\x7c\xd7\xe1\xfd\xeb\x53\x33\x32\xd1\x73\xaa\x89\x9e\x33\x45\x04\x07\x22\xa1\xc8\x68\x02\xea\x11\x82\x36\x3c\x62\x29\xba\x59\xff\x62\x0b\x49\xcd\x2e\x35\xd5\xa5\x1a\x17\x73\xaa\xd6\xa7\xf8\x7a\xe5\xd3\x0d\xdd\xd9\x07\x17\xaf\x69\x56\xcc\xe9\x6b\xf7\xa1\x4a\xe6\x90\xd3\x7a\x0f\x88\x02\xf8\xc5\xf5\xe5\x0f\xbf\xbb\x5d\xf9\x82\xb4\x67\x67\xe3\xee\x27\x4c\x99\xa9\x42\x46\x41\x3c\xa7\xc0\xb5\x5b\x16\x40\xfe\xb1\xf1\x37\xb7\x05\x24\xff\x18\xaf\x51\x2e\x26\xff\x05\x89\x6e\x7c\x2c\xe1\xbf\x4b\x26\x21\x6d\x52\x64\x26\xc8\x73\x9f\x95\x8f\xcd\xfc\x37\x3e\x2a\xa4\x61\x0b\xba\x71\xe4\x6d\x6b\xb0\xbf\xd6\xe7\x2b\x6f\xfb\xf3\x68\xe5\x5b\x42\xcc\x24\xb9\xb7\x4e\x0d\x2f\x04\x85\x3b\xd4\xed\x41\x48\xdd\xcc\xda\x9d\xcb\x94\xd9\x2e\x12\x14\x70\xcb\x1d\x71\x53\x71\xf7\x96\xe3\xb5\xce\xcd\x14\x81\x54\x86\x45\x94\x59\x6a\x98\xe8\x02\xa4\x26\x12\x12\x31\xe3\xec\x9f\x55\xef\x8a\x68\x81\xc3\x66\x54\x83\xd2\x04\xcf\x35\xa7\x19\x59\xd0\xac\x84\x33\x42\x79\xba\xd6\x77\x4e\x97\x44\x82\x19\x97\x94\xbc\xd1\x23\xfe\x44\xad\xd3\xf2\x41\x48\x20\x8c\x4f\xc5\x1b\x32\xd7\xba\x50\x6f\xce\xcf\x67\x4c\xfb\xeb\x21\x11\x79\x5e\x72\xa6\x97\xe7\xc8\xe9\xd9\xa4\x34\xac\xf7\x3c\x85\x05\x64\xe7\x8a\xcd\x46\x54\x26\x73\xa6\x21\xd1\xa5\x84\x73\x5a\xb0\x11\xbe\x0c\xc7\x2b\x62\x9c\xa7\xbf\x96\x6e\x9b\xa8\x95\x81\x37\x9e\x07\xe2\x39\xf4\x9e\x8b\x65\x38\xb6\xdd\x9c\xb6\x43\xfb\xb2\xf5\x9a\x98\x8f\xcc\x34\xde\xbc\xbf\xbd\x23\x9e\x22\x77\xd4\x71\x89\xea\x47\x37\xcc\x90\x5f\x2d\x33\xb3\x8c\x4f\x41\xda\x5f\x4e\xa5\xc8\xb1\x57\xe0\x69\x21\x18\xd7\xf8\x47\x92\x31\xe0\x9a\xa8\x72\x92\x33\xad\x70\x5b\x83\xd2\x66\x21\xd7\x3b\x7e\x8b\xd7\x29\x99\x00\x29\x8b\x94\x6a\x48\xd7\x1f\xb9\xe4\xe4\x2d\xcd\x21\x7b\x4b\x15\xbc\xf8\xda\x99\x35\x52\x23\xb3\x20\x3b\xaf\x5e\x53\x58\x58\xff\xc1\xda\xa9\x27\xc4\xdf\xee\xfb\x2c\xf7\x56\x46\x43\x52\x48\x32\x2a\xad\x80\x42\x34\x64\x19\xf9\xf8\xfd\x07\x32\x17\x0f\xe6\x20\x31\xae\x34\xcd\x32\x3c\x98\x4e\x88\x58\xeb\x1a\xef\x80\x84\x72\x92\x53\x4e\x67\x40\x68\x51\x28\x32\x15\x92\x50\x32\x63\x0b\xe0\x9e\x01\xac\xae\xc5\xd6\xf7\xdb\xc6\xd9\x88\xbd\x91\x36\xde\xaa\xfe\x5b\x47\xf0\xca\x37\xdb\x78\x9d\x69\x6b\xf2\xd9\x7e\x13\x6b\xda\x45\xdd\x05\x1e\x29\x4e\x4a\xae\xb4\x2c\x71\x97\xa4\xe4\x1e\x96\xee\x74\xe5\xb4\x20\x4a\x0b\xf3\xe1\x03\xd3\x73\x42\x9b\x27\x8b\x6a\x3c\x2e\x93\xf5\xd7\x32\x4d\x81\x26\x93\x25\x31\xd2\x28\xb2\x33\x2d\x44\x86\xbc\x0e\xfb\x33\x6c\x8d\x48\xd0\x92\xc1\x02\x08\x95\x13\xa6\x25\x95\xcb\x6a\x6f\xad\x9f\x83\x47\xe7\x1f\xe7\xa5\x21\x1c\x6d\x9f\x3d\xf2\xd8\xce\x26\xf6\x3a\x71\xb2\x59\x5a\xc9\xc7\xdd\x27\xfa\xfa\xd2\xed\xe0\x5a\xd8\x56\x6e\x07\x83\x22\x66\xa7\x3a\xb1\xa8\x92\xda\x91\x00\xb7\x35\x53\x22\x64\xb5\xb7\xc8\x64\xb9\x71\x8c\xc6\x56\x27\x13\x30\x6c\x50\x52\x6e\xa6\x7e\xe3\x11\xea\x30\xb1\x8f\x6d\x46\xd3\xc4\x03\xdf\xb4\xf3\x9b\x7d\x53\x29\xe9\x66\xea\x09\x61\x1a\xf2\x2d\x3d\x93\xd5\x69\x6e\xce\x67\xf5\xb1\x21\x70\xc1\x52\x30\x13\xab\x29\xb3\xbb\xcc\xf0\x04\x3a\x11\xa5\xb6\xf3\xe9\x1e\x49\xc9\x82\x51\x42\x67\x33\x09\x33\xdc\xff\x5b\x87\x7d\x62\x4e\x6c\xdb\x7e\xec\xeb\x36\xb2\x4a\xcd\xa3\x4f\x18\xf6\xfb\xe8\x03\x7c\x13\xf3\x68\x3e\xb0\x2e\x37\xb7\xdb\x53\x6b\x68\x1b\x4d\xcc\x9c\xf8\xa9\x15\xf2\xd1\x87\x77\x59\x5b\xdb\x9e\x58\x61\xdb\xda\xeb\xbc\x42\x88\xfb\x76\x62\xce\x4c\x7d\x01\x18\xce\x81\x0f\xd6\x2c\x7d\x02\xa4\x00\x39\x15\x32\x37\x87\x87\x13\x4a\x12\x2b\xca\x56\x7c\x0b\x19\x2e\x4f\x1e\x9b\x4e\xb2\xeb\xfa\xdb\xb6\xcb\x2e\xb0\x6d\x44\x0a\xaa\xe7\x4f\x3c\xb6\xdb\x52\xd9\xd6\x9c\xb4\x27\x1f\x7e\x82\xf1\xad\xf5\x5d\xdf\x5b\xd1\xfb\x36\xd3\x10\xbd\x53\xbc\xb2\x76\xe9\x75\x17\xce\xbd\xda\x6e\xe8\xc3\x07\x50\xca\xc8\x0b\x28\x84\x4a\xfa\x40\x80\x27\xc2\xf0\x94\xff\xe7\xf6\xe3\x95\x1d\x7d\x13\x77\x5d\x6f\x97\x9a\xb0\xbc\xc8\x20\x37\xb2\x28\xf9\xf1\x03\x95\x6a\x4e\x33\x90\x3f\xe1\xad\xf8\xe3\x9f\x79\xde\xfe\x24\xa1\xdb\x0f\x76\xb3\x19\x21\x53\x41\x6a\xd8\x5f\x0a\x19\x5d\x5a\xc2\x52\x48\x44\x6a\xae\x05\x21\x49\x61\x94\x85\xbc\x28\x35\x10\x6a\xbf\xc5\x77\x60\x7c\xb6\x0b\xe5\x7b\xad\x06\x31\x22\x55\x4e\xf5\x1b\x32\x59\xea\xa7\x4e\x1b\x21\x9f\x46\xe9\xae\x6c\xa7\x49\xcc\xd3\xcc\xc7\xb6\x9d\x58\x50\xb3\xe3\x27\xdf\xd2\xc8\xdb\x94\x71\x90\xd7\x42\xea\x5d\xf8\xa4\x51\xec\x66\xb0\x2e\x8e\x36\x9b\x9f\x32\xc6\xf5\xef\x7e\xfb\xc8\x93\x29\x14\x99\x58\x9a\xfd\xf3\xf4\xf1\xdc\xf1\x7d\x76\x66\x25\xbb\xf6\xb7\x2b\xfb\xd8\xb1\x3f\x6b\x1a\x8c\xd1\xd3\x26\xed\xb3\x53\x47\x3c\xd6\xbb\x55\x0a\xf4\xc1\xee\xdb\xeb\x4b\x6f\xeb\xb9\x81\x29\x48\xe0\x89\xe7\x73\xd5\x9f\x5a\x10\x4a\xbe\x2b\x27\x20\x39\x68\x50\x0d\x4d\x60\x59\x80\x37\xac\x81\xfd\x81\x04\x49\x4a\xcd\x32\xf6\xcf\x4d\xe6\x88\x4d\x6f\x15\xfd\xa6\x7d\x42\xa6\xf2\x8f\x3d\x21\x59\xf9\xc7\x9e\x92\xaf\x6c\xdb\xe7\xea\x7e\x7a\x17\xda\xd6\x5a\x27\x34\x82\x38\x8d\xa1\x5a\x99\xb4\xbd\x14\xd1\x39\xf9\xd3\xdb\x7c\x03\xa5\xd7\x68\x3c\x6f\x19\x9f\xb7\x11\x4c\x4e\xb6\xf9\x25\xc6\x46\xe1\x1f\xa3\x49\xfc\xc7\x9f\xc6\xb6\xcb\xd3\x31\x79\x9f\x17\x7a\xe9\xcd\x40\xec\x89\xce\x99\x22\x5c\xe8\x75\x41\x30\xfa\x34\x2d\x36\x1b\x21\x9f\x9c\xa9\x8b\xeb\x4b\x6f\xde\x7e\xc1\xa5\x55\x05\x24\x3d\x10\xf4\x6f\x5b\x64\xb4\xc4\xfc\x29\x83\x2c\x25\xcc\xc8\xf0\x86\x58\x32\xc9\x44\x72\xef\x2c\xf9\x37\xef\x88\x12\x96\xe7\x18\x45\xcf\x48\xfe\x89\xe0\xaa\xcc\x81\xb0\xa7\x98\xc8\x20\xd9\x0f\x92\x7d\xb3\x0d\x92\xfd\x20\xd9\xb7\x9a\x75\xd2\xf5\x81\x39\xae\x10\xb2\x95\x3d\xe2\x73\x03\x83\x7c\xac\x0d\x0c\x12\xdb\xc0\x20\x07\x06\xf9\x54\xc7\x4f\xbe\xe5\x4e\x92\xee\x93\x7d\x3d\xc5\x3b\x06\xcf\xc1\xe0\x39\x18\x3c\x07\xae\x0d\xd7\xa7\x6b\xc3\xf5\x39\x5c\x9f\xed\xf6\xd9\x5d\x9f\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xd0\x6c\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xb0\xa5\x0d\x92\x7d\xc7\x4e\x07\xc9\x7e\x90\xec\xb7\xb5\xc1\x73\x30\x78\x0e\x06\x06\x39\x30\xc8\x81\x41\x6e\x69\x7d\xf4\x1c\x24\x19\x50\xbe\x59\x9d\x5f\x49\x6e\xc4\xe7\x50\x00\x64\x53\xe6\x52\xfb\xdc\xaf\xc9\x04\xe6\x74\xc1\x44\x29\xc9\xc3\x1c\xb8\xcf\x4b\x25\x33\xd0\xca\xec\x02\xd0\xb0\x49\x03\x7c\x82\xbd\x3d\xce\xd2\x46\x04\x38\x9d\x64\x1b\x3b\x7e\x8a\x7b\xb9\x5f\x3e\xee\x29\x99\x08\x61\xde\x6e\x7d\xc6\x50\x7b\xf1\xda\x40\x84\xa4\x96\x6d\x3a\xd7\xe6\xc4\x96\xb7\x37\xef\x9e\x35\x9d\x65\x63\x27\x97\xd5\xd8\x04\x5d\x38\x98\xf6\x67\xae\x3c\xf3\xe9\xc7\x07\x0e\x29\x66\x81\x9f\x11\xa6\xcd\x03\x86\xb1\xb0\x84\xe9\x6c\x59\x91\xf7\x79\xe7\xc9\xbc\xbd\x79\xb7\xbb\x9b\xcb\xaf\xd2\xd6\xae\x23\x7a\xb4\x06\x7f\xd5\xe0\xaf\xaa\xda\x20\xb4\x75\xec\x74\x10\xda\x06\xa1\x6d\x5b\x8b\x2f\xb4\xf5\xdd\xbf\x33\x78\x65\xc8\xe0\x95\xf1\x8f\x0d\x5e\x99\x27\x1f\x1f\xbc\x32\x83\x57\x66\xf0\xca\x3c\xde\x06\xf9\xd5\xb5\x41\x7e\x1d\xe4\xd7\x76\xfb\xec\xe4\xd7\xc1\x2b\x33\x30\xc8\x81\x41\xd6\x6d\x60\x90\x03\x83\x6c\xb5\xcf\x31\x9f\x63\xb0\x70\x0f\x16\xee\xc1\xc2\x3d\x5c\x80\xc3\x05\x38\x5c\x80\x4f\x75\x3c\x58\xb8\x7d\x1b\x2c\xdc\x83\x85\xbb\xd5\x06\x0b\xf7\x60\xe1\x1e\x2c\xdc\x83\x85\x7b\x4b\x1b\xe4\xd7\x8e\x9d\x0e\xf2\xeb\x20\xbf\x6e\x6b\x83\x85\x7b\xb0\x70\x0f\x0c\x72\x60\x90\x03\x83\xdc\xd2\xfa\x68\xe1\x7e\xe2\xf0\xee\xb2\x4b\x9b\xf6\x6a\x27\x36\xfb\x48\xf7\x31\x79\x4b\x39\x61\x3c\xc9\xca\x14\xf0\x9b\x29\x50\x5d\x4a\x50\x67\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x94\x50\x05\xca\xf5\xb1\x71\xa8\xaa\xdf\x0d\xdf\x3e\xfe\x9a\x8f\xf3\x91\x47\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x9b\x0c\x96\xec\x30\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7c\xed\x6d\x5b\xf0\x91\x2d\xf7\xe4\xe5\xf2\xd4\x95\x32\x22\x13\xaa\xe0\x0f\xff\xb6\x56\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\x8d\x4f\x3c\x7d\xcd\xd4\x43\x6c\xdf\xe4\x3b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\xa5\xed\xe3\x56\x4b\xaa\x61\xb6\x6c\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x4b\x09\x33\xaf\x81\x6e\x1c\xe2\x61\x0e\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x95\xff\xe3\xc7\xd9\xf0\xf5\x53\xeb\xbb\xa9\x82\x92\x6f\xbb\x5e\x90\x7e\x3e\xdf\x59\x0f\xd9\xbb\x0a\x08\x66\x75\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xed\x7f\x65\xd9\xb6\xdd\x51\x3b\xc8\x6a\x4f\xcb\x68\xa3\x06\x8e\xcd\x36\xaf\xde\x2e\xa2\x99\x2b\xc6\x78\x0d\x32\x67\x4a\x6d\x4b\x8a\x6a\x93\xfe\xd4\x2d\xb6\xc3\xed\xb5\x22\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x42\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xe3\xf6\xde\xe1\xee\xdb\x41\x82\xde\x55\x7e\x1e\x59\x3a\x9f\x7c\xca\xbd\xc3\x85\x7d\x85\x8d\x45\xb2\x9a\x6d\x77\x79\x1b\x87\x7f\x5a\x88\xd8\x47\x32\xd9\x59\x2e\xe9\x22\xb3\x5e\x8b\x8c\x25\xcb\x9b\x32\x03\x32\x17\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x33\x32\x29\x35\x49\x05\x58\xb3\xa1\x43\x97\x6a\xfe\x7c\xa7\xf1\xad\xa7\xfc\x61\x6e\x8b\x11\x9a\x8e\x09\x2d\x8a\x0c\x33\x27\x85\x11\x3c\x1e\xe6\x2c\x99\xdb\x1a\xac\x05\x4d\x60\xd3\x63\xbb\xcb\xa5\x3b\xe9\x6a\x64\x2f\x7d\x8d\x78\xb3\xf7\xe4\xa9\x5d\x47\xf6\x54\xdc\x88\x2d\x0b\xf6\x8d\x14\x65\xb1\xe3\xe3\xdd\xf6\x00\xb1\x25\xc3\xec\x40\xe6\x3a\xd2\x2b\x22\x96\xff\xd2\x39\xc9\xed\x52\x2b\x67\x81\x75\x1e\x99\x31\xa6\x3f\xe6\x65\xa6\x59\x91\xe1\x4f\x2c\x02\x96\x22\x54\x42\x7d\xc1\x9d\x11\xca\x97\xde\xe7\xee\x4a\x18\x42\x4a\xe8\xcc\xf4\xa8\xb1\x3c\xaa\x98\xee\x4c\xb5\xad\x91\x58\xe6\x46\xfe\x6a\xd8\x80\x15\xaa\xfb\x7c\x59\x53\x41\x1e\x58\x96\x19\xe5\x87\x66\x99\x78\x80\x74\x4c\x8e\x8e\x56\x2f\xa0\x44\xc8\x06\xdd\xc8\xea\x8e\xfe\xb5\xf5\x94\xe1\x6b\xf5\x8b\xed\xa6\xc8\xed\xab\x85\x90\xfd\x34\x11\xb2\xbf\xce\x45\x50\x95\xba\xaf\x1c\x54\xa3\x8c\x29\x3d\x72\x54\x6a\x91\xb3\x64\xa7\x4e\xb8\xe0\xde\x11\xf1\xe7\x9b\xef\x9f\x7d\x83\x5e\xb5\x87\x73\x35\x39\x41\x9b\x3d\x5a\x50\xa9\x19\xcd\x48\x29\x33\x65\xf7\x28\x35\x0a\x8b\xf4\x55\x50\xe7\x14\xe3\x3c\x12\x50\xc8\x2e\x08\xf9\x57\xbb\x2b\xdd\x66\xb0\xac\x4c\xf0\x6c\x49\xa8\xdd\x0a\xd3\x32\xcb\xce\xc8\x94\x71\x6a\x2e\x32\x28\x7c\x0e\xef\x0e\xa6\x99\xba\xdd\x32\x9e\x80\x99\xa6\x51\xe5\x9b\x40\xca\xcd\xc8\x86\x65\x56\x3c\x2d\x3d\x73\x65\x3f\xad\xa5\x4a\x39\x52\x0c\x7f\x4b\xe8\x24\x03\xd4\x34\x9c\xcc\x79\x23\x32\x74\x29\x56\x7e\x0f\xac\x15\x4a\x9b\x5f\xff\x2f\xc6\x77\xd5\xd6\x6d\xbb\xc1\xab\x3d\xa1\x9c\x00\xd3\x73\x90\x38\xf4\xd2\xf0\x5f\xb3\xd9\xeb\x43\x75\xa2\xca\x64\x6e\xa6\xe8\xa8\x10\xa9\x3a\x32\xdc\xf9\x48\x41\x22\x41\xab\xa3\x53\xf3\xd7\xea\xbb\xe2\x7c\x35\x7f\x77\x4e\x0b\x76\x74\x7a\x46\x70\xc2\xb1\x40\xa9\xd0\xf3\x5f\xf8\x39\xf2\x13\xd6\xaa\xe7\xfd\x54\x6b\x9d\xa2\x9b\x66\x0f\xae\xb2\xa6\x28\x6c\x51\x4a\x73\x7f\x6a\xc0\xb4\x73\x73\x52\x70\xcf\x35\x7c\xd0\x2b\x17\x29\x21\x17\x9c\x80\xf5\x1a\x82\x26\x39\x50\xee\x9e\x86\x05\xc8\xa5\x9e\xa3\x23\x51\x55\x5c\x74\x58\xb9\x1d\xa2\x11\xea\xb6\x71\xd5\x1c\x2b\xf3\x2b\x54\x1f\x37\x5b\xfc\x79\x75\x85\x8e\xff\xf5\x78\xf5\x4a\xaa\xef\xe0\x5f\xf6\x7a\xa0\x10\xd6\x69\x2d\x7e\x30\xbf\x6c\xaf\x83\xfd\xc8\x5e\x26\x15\x3b\xfc\xfe\x7b\x5b\xec\xd9\x4d\xf8\x77\x8c\xa7\xaa\x02\x56\x4d\xed\x2d\xe1\x16\x6d\xe3\x4a\x21\x85\xbf\xd8\x55\x5a\x57\xba\x76\x55\x94\x9e\xa0\xb1\xa1\x95\xf7\x41\x91\xc6\x7a\xd1\x2d\x29\xd9\xb0\xdd\x33\xeb\x9d\x37\x62\x65\x46\x27\x90\x29\x67\x40\x84\x06\xf9\xe4\xe2\xfb\x0f\x55\xe9\x76\x09\xf4\x09\xa3\xf8\x33\xa8\xcf\x3b\x84\xf9\xac\x95\xc8\x5f\x6f\xbb\xab\x39\x38\x15\xfb\x39\xb1\xc8\x2d\x68\x7b\x56\x73\x5a\x98\xa3\x6a\xfb\xb0\xce\x95\x15\xc7\xc9\xf7\x38\xd3\x4f\x9f\xb8\xbd\xd4\xc3\xdd\x4b\x3e\x6f\x1a\x64\xa7\xf3\xb6\x5b\x28\xd1\x1e\x1d\x3e\x66\xca\xab\x5b\x6b\x9a\x57\x36\xb4\xd3\x0b\x9d\x26\x97\xd0\xa6\x43\x21\x05\x65\xc1\x75\x2c\xc0\x91\xf4\x9f\xd7\x5d\x44\x5e\x82\x7d\xf4\xf3\x11\x51\x90\x41\xb2\xa9\x26\xfb\xa6\x87\x35\xe4\x45\xf6\xd4\xc9\x23\x7b\xeb\xf2\x39\xe3\x37\x40\xd3\xe5\x2d\x24\x82\xa7\x3b\x72\xe9\x6e\xca\xd2\x07\xc6\x59\x5e\xe6\x84\x97\xf9\x04\x70\x2d\x94\x1d\x14\x39\x8e\x35\xa8\x50\xc2\xe1\x21\x5b\x3a\x2e\x93\x92\x42\xa4\x9e\xf1\x4c\x8c\x56\x4f\xd3\x5d\x2f\x9d\x07\xa6\xe7\x58\xb6\x82\x2f\xcd\x50\x4c\xd7\x37\xa2\x24\x89\xa4\xca\x08\x8d\x67\x38\x34\xd3\xe6\x16\x9d\x00\xba\xd8\x59\x0a\x66\xcb\xd0\x05\x65\x99\xd1\x72\x76\xbd\x16\xdf\xc1\x94\x96\x99\x46\xfb\xd0\x2b\x72\x62\x08\xf7\xca\xfd\xa6\x6e\x8d\xde\xa1\x84\xe0\xe6\xbf\x16\x76\x09\x5f\xee\x74\x0f\x3f\xdf\x2e\x40\xe8\xbe\xed\x0a\x88\xee\x5b\x41\x4b\xb5\xab\x99\xa9\xb5\x1b\x2e\x79\x6a\x0e\x61\x53\x9a\x6f\xdc\x23\x4c\xb9\x9e\x77\x9b\xd5\xc7\xa1\xbc\x36\x50\x2d\xc5\x4c\x82\x52\xef\x80\xa6\x19\xe3\xf0\x02\x9b\xfa\x6e\x0e\x24\xa7\x9f\x70\x63\x6b\x96\x83\x11\xb6\x9a\xdb\x9a\x36\x5f\x5f\x0b\x92\xd3\x7b\xa8\xe8\x24\x13\x98\x0a\xb9\x43\x48\x87\x6f\x4c\x35\x37\x93\xdd\xb4\x53\xca\x32\x48\xc7\x48\x49\x63\x2c\xb3\xd9\xa5\xc8\x32\x90\x76\x1f\x9a\xbf\x19\x2f\x81\x68\xb1\xe3\x60\x85\x14\x68\x9a\xb0\x03\x34\xa5\x19\x94\x16\xa8\xe9\xd2\xde\x38\x78\xd8\x08\x25\xd7\x2b\xf3\xff\xfe\x53\x82\x46\xf8\x1d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x94\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x93\x2b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x3b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xf3\xde\x6d\x9d\xf5\x3f\xbc\x7a\xb5\xa3\xe8\xfc\xfc\xa7\x56\x02\xda\x66\x9e\x75\xc3\x5f\x55\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xac\x64\x6a\x4e\x26\xa0\x1f\x00\x38\x81\x4f\x16\x5e\x6e\xc7\xf1\xfe\x09\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xba\x3f\x0b\xb0\x60\x8a\x09\xfe\x2d\x53\x5a\xc8\xe5\xf7\x2c\x67\x4f\xd4\xb4\xf0\xad\x3b\xf7\xa9\xaf\x53\x91\xa5\xe4\xc6\x6e\x81\x5b\xb0\x33\x23\x01\xdd\x1f\x5a\x58\xdb\x08\x31\x1c\x61\x42\x93\xfb\x5d\x6f\xb5\xbd\x57\x75\xdb\x7a\x75\xb8\x45\x5f\xbf\xea\xcb\xb2\x7a\x41\xed\x39\x97\x12\x55\x82\x6a\x24\xbc\x3b\xec\xc1\x7a\xff\xc9\x4e\x77\x6b\x69\x1f\xe6\x42\x01\x3e\x40\xa8\x7c\x5a\x26\x6c\xbe\x86\xf7\x89\x32\x55\x71\x5a\x8c\x57\xe1\xa0\x08\x9d\x4e\xdb\x4f\xa4\x7b\x48\xca\xb6\x5d\x6a\x92\x97\x4a\x93\x9c\xea\x64\x6e\xad\xd3\x22\xad\xa4\xd7\x63\xe5\xb4\xcc\x7d\x96\x76\x67\xf7\xd8\xfe\x8e\x2c\x62\xe9\x7c\xff\xa9\x30\x97\xc7\x53\x2e\xef\x76\x6b\xad\xf3\x6a\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\xbf\xb8\x7a\xb7\xfb\xa9\xe9\x62\x94\xd9\xdb\x2c\xd3\xdd\x47\x62\xda\xc5\x23\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x75\x46\x28\xb9\x87\xe5\x99\x95\x3c\x1a\xa0\xa8\xe6\xe1\xbd\x08\x91\x90\x39\xf1\x14\x4c\x8f\xd8\xa1\x1d\x63\xf7\xd9\xee\xb0\x31\xfd\xe0\xfb\xf8\x6f\x7d\x1b\x19\x42\xf7\xfc\x85\x9f\xa0\x3d\x7e\xb6\xff\xd9\xb1\xed\x1e\x96\xfb\xfd\x60\x65\x27\x99\x55\x70\x5a\xbc\xdd\x23\xe6\x83\x4a\x7b\xa8\xb6\xc5\x7e\x8e\xf5\x66\xeb\x60\x50\xb4\xcd\x4f\x62\xd0\xeb\xed\x79\x50\x9a\xe3\xb6\xec\xb4\x66\x5a\x8e\x95\xdd\xbf\x86\xc3\xcc\x59\x61\x73\xfa\x9c\xb7\x71\xff\x4d\x6c\xdb\x0f\x34\x63\x69\x35\xa4\xe5\x3e\x97\xfc\xcc\xc8\xd6\xe6\x3f\x78\xfd\x58\x89\xff\x9d\x00\x75\x25\x34\x7e\xf2\x62\x6b\x60\x5f\xeb\xa5\x57\xc0\x8e\xea\x9c\x56\xc8\x56\xd1\x5e\x61\x53\xd6\xdc\x4c\x7b\x5c\xe5\x3a\xd2\x53\x91\x4b\x4e\x84\x74\x53\xb7\xf7\xa0\xa6\x33\x37\xb0\x1d\x12\x2f\xd2\x89\x75\xd6\xa2\xfb\x6b\xe3\x98\x6e\x85\x84\x6c\x2d\x50\xc4\xe1\xdd\xd0\x28\x0b\xda\x6f\xd0\x5c\x51\x64\xa8\x9d\x39\xa5\x89\xfa\xd0\xaa\x1d\xbd\x22\xcd\x96\x83\x9c\xa1\x17\x3b\xd9\xd9\xeb\x5a\x11\xdd\xe1\xe2\xb3\x6d\xef\xeb\xaf\x39\x60\x87\x8d\x1c\xc5\x97\x14\xad\x1b\x94\x57\xac\x19\xba\xa3\xc4\xb3\xd7\xa9\x6a\x0c\xd7\xb2\x91\xff\x1f\x73\xa9\xe3\xa6\xfb\xbf\xa4\xa0\x4c\xaa\x31\xb9\x20\x8a\xf1\x59\x06\xad\xef\x9c\x09\xa0\xd1\xcd\x5e\x83\x17\x66\x50\x73\xf7\x2e\x68\xe6\x0c\x31\x94\x13\xb0\xe6\x78\x43\xc7\xaa\xf8\x76\xe6\x24\x6c\x73\x15\x55\xf1\x0f\x47\xf7\xb0\x3c\x3a\xdb\x1a\x66\xbe\xb9\x35\x4f\xea\xd1\x25\x3f\xb2\x22\xcc\xda\x59\xab\xe4\x1d\x0c\xb2\x38\xc2\xef\x8e\x62\xca\x86\x7b\xca\x2a\x5d\x9d\x09\xed\x41\xf7\x38\x26\xad\x5d\x9d\xd3\x62\xdf\x4d\xed\x03\x3b\x3b\xe8\x68\x77\xab\xc6\x25\x17\x01\xad\x05\x29\x15\x58\x35\x1a\x99\x1d\x01\xaf\x8b\xa1\xe6\x85\x56\x2f\x0e\x0f\xa8\x3b\xf5\x46\xa1\x31\x2a\x3e\xe3\xb3\x3f\x17\x29\xd5\x3b\xe5\x14\xd9\xd6\xfd\x6c\xdf\xd8\x01\x49\x89\x23\x9a\x9d\x3c\x65\x33\x52\x50\x49\x73\x35\x26\xd7\xae\xdc\x00\xee\x6b\x36\x6d\xba\x6f\xdc\x3c\xdf\x2d\x0b\x20\xff\x73\xff\x01\xed\x1b\x3e\xf3\x39\xe8\x26\x14\xe7\xf4\xd3\x6d\x29\x67\x7b\x4c\x3f\x09\x16\x5a\x9a\x96\xe8\xda\x26\x84\x1b\xb5\x09\x22\xa4\x92\x39\xa4\x65\x06\x29\xa1\x13\xb1\x80\x96\x9f\xac\xfa\xd9\x9e\x43\xa3\xa1\x62\xcf\xdf\xfc\x60\x38\x9c\x27\xca\x08\x59\x13\x25\xb2\x52\x57\xf6\xac\x13\xf8\xf4\x86\xfc\x1e\xe3\xb7\x28\x29\x40\x26\xc0\x35\x9d\xc1\xaa\xe1\xd1\x3e\xf7\xfa\xd5\xbf\x9c\xee\x4b\x00\x8a\x33\x66\x7c\x67\x06\x7e\x65\x76\xe7\x07\xfa\xe9\xcf\xbc\x76\xd2\x30\x45\x76\x34\x42\xd5\xed\x62\xe5\x45\x70\x94\x2c\x29\x33\x34\x31\x63\x5c\x5c\xe3\x75\x26\x4b\x22\x45\x89\x91\x71\xa4\x2c\xf6\x1d\xab\x69\x2e\xfb\xed\xef\xff\x65\xdf\x9f\xbf\xff\x44\xf3\x22\x83\x37\xbe\xee\x8b\xb5\xf5\x19\x7d\x42\x0b\xf2\xbb\x57\xff\x72\x66\xa3\x04\xe0\xa1\x61\x7b\xaa\xf7\x11\x35\x9b\xa8\x2c\x08\xcb\x6d\x9e\x0c\x64\x4b\xec\x68\x5f\x09\xce\x5c\x71\x6d\x16\xa2\x34\x95\x5a\x9d\x11\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x56\xcc\x9d\x68\x68\x84\x07\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x93\x8a\xd7\xbf\x7b\xf5\x2f\xeb\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x09\x00\x27\xf7\x2c\xcb\x20\xdd\x57\xc4\x7e\x6a\x22\xa7\xa5\xd4\x73\x90\x67\x04\xb8\xf2\x9e\x08\xf3\xee\x2b\xef\x8d\xb4\xc8\x92\xf3\xfd\x25\x50\x6a\xfd\xa1\xe8\xdc\x68\x38\x3b\xdc\xb4\x1b\xc1\x4c\x93\x5c\x28\xbd\x79\x3a\xf6\x1a\x8c\xf2\xe5\xc7\xe9\xbe\xe2\xf5\xa8\x83\x31\x77\xfd\xd7\x1d\x84\xf3\x96\xf4\xc1\xb8\x1e\x09\x39\xb2\xdd\xbc\x21\x5a\x96\xfb\x08\x7c\x79\x8b\x85\xf4\xf0\x06\x28\x1b\x0c\x6e\x6d\x13\x7c\x76\x6c\xbc\x3b\xbb\x4d\xc5\x03\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x11\x16\xde\xf6\x0c\xad\x70\x1e\x33\x0f\xe6\xe9\xff\xff\xfa\x91\xdf\x57\xa5\x5e\xb9\x09\xb6\xf3\x76\xc7\x5a\x2b\xd6\x6d\xd4\x1a\x0c\x80\x38\x5b\xa1\x75\x4f\x0a\x36\xbc\x59\xc5\x55\xa7\xc2\x86\x07\x9b\x4d\x60\x1e\xb0\x44\x6d\xb8\xe2\x6a\x06\xbc\xf7\x55\xb6\xe5\xaa\xb2\xef\x58\xc7\x7e\x68\x0c\xbb\x34\x6c\x58\x6d\xe3\xc3\x7b\x0e\x9d\x01\x55\x7a\xd3\x12\x0e\x5c\xfb\xc9\xf6\x78\x86\xef\x6a\x6b\xab\x8e\x46\x77\xc1\x19\xaf\xfc\x64\x98\xbc\x3e\x01\x72\x74\x03\x36\x8a\xc9\x66\x24\xb4\x94\x96\xa3\xca\x7f\x6d\x16\x3b\x48\x9f\xd9\x79\xda\xbc\x0b\xee\x59\xfd\xd1\x6e\x8c\x46\x76\x9e\xf3\x00\xba\x2b\xa8\x0a\x89\xb2\xf1\x5d\xbb\xbb\xa1\xc1\x65\x9f\xb8\x23\xec\x5f\x66\xac\x0a\x48\xc6\x12\x90\xab\xd8\xa4\x41\x6b\x57\x41\x73\xcb\x45\xf6\x40\x97\xea\xa8\x37\xaa\x79\x0e\x9a\x3e\x9e\x94\xbe\xda\xba\x0b\x04\xb7\x9a\xf2\x94\xca\xd4\xbd\xd1\xb1\xaa\x46\xdf\x87\x23\x7c\xc0\xf0\x24\x3e\x15\x6f\xc8\x5c\xeb\x42\xbd\x39\x3f\x9f\x31\x3d\xbe\xff\xa3\x1a\x33\x71\x9e\x88\x3c\x2f\x39\xd3\xcb\x73\x8c\x36\x62\x93\x52\x0b\xa9\xce\x53\x58\x40\x76\xae\xd8\x6c\x44\x65\x32\x67\x1a\x12\x5d\x4a\x38\xa7\x05\x1b\x25\x82\x2f\x80\xa3\xff\x62\x9c\xa7\xbf\xf6\x24\x3d\xaf\x0e\xdf\x62\x13\xe8\x50\x91\x0b\x18\x95\xfc\x9e\x8b\x07\x3e\x42\xf3\x9e\xda\x8b\x61\xec\x16\xb5\xea\x5b\xc0\x1a\xee\x13\xd4\x5a\x88\x3d\x6c\x82\xcf\xbe\xb2\x66\x8a\x46\x94\xa7\x23\x1b\xaa\xf5\xbc\x0b\xdc\xc5\xad\x3a\xaa\xc3\x41\x77\xa7\xae\x9b\x35\x88\x26\x9a\x2d\xa0\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x12\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\x2e\xf6\x08\x1d\xf4\xed\xd6\xb0\xe5\x3b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x95\x86\xdc\x5e\x05\x76\xb4\x6c\x49\xb4\x5c\xda\xf0\x48\x79\x4f\x98\xf6\x31\x87\x46\xbd\xbf\xc7\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5f\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xfe\x6d\x9f\x7d\x34\x45\x60\xcd\x3d\xbd\xed\xed\xf0\xdc\x69\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8e\x25\xb1\xb9\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x5e\x74\x9a\x14\xb2\x9e\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x9e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x50\xdf\xb8\xad\xde\xeb\x72\xc6\x45\xf5\xf1\xfb\x4f\x90\x94\xbb\x62\xb2\xad\xb7\x50\xb7\xbb\x6d\x46\xda\xf3\x66\x6a\x17\xbd\x6c\xa9\x37\x1c\xc2\x7f\xe1\x84\x4a\x81\xeb\xe5\xa4\x4b\x45\x35\x53\xd3\x7d\x1d\xc1\xbe\x99\x55\xad\xd6\x1d\x1a\xa1\x5c\xd5\x89\xa9\xc2\xe2\x50\x66\xb0\xf9\xd9\x4c\x23\xe7\x4c\xe6\x42\xa8\x7d\xcc\x44\xcd\x46\xed\xa6\xc3\x77\x58\x30\x61\x03\x94\x10\x73\x40\x92\xdc\xb0\x4d\x77\xc5\x37\x88\xb2\xae\xc1\xfa\x67\x6c\x5f\x5d\xdd\x37\x34\xf7\x55\x9b\xc3\x07\xe2\x98\xc1\xd1\xbd\x65\xfe\x98\xa1\xb0\xae\x34\x51\x65\x6e\x48\x79\x00\x36\x9b\x6b\x75\x46\xd8\x78\x6f\x7b\x91\x6f\xe6\x18\x01\x4d\xe6\x8d\x57\xc8\x01\x74\xab\x58\x76\xf3\xec\x35\x7d\xa0\x27\x8f\x42\x1a\x3d\xdd\x1c\xbe\xc3\x59\x25\x37\xac\x1e\x89\x8d\xdb\xe0\x8c\x80\x4e\xc6\xa7\xfb\xc7\x55\xd8\x56\x83\xd7\x99\x59\x9c\x2c\x09\xd3\x60\x2e\x63\x54\xfd\xa5\x28\x67\x76\xae\xc1\xa7\x88\xe1\x1c\x54\xd9\xf7\x18\xf6\x96\xa6\xfb\x9b\x24\x7c\x3b\xb2\x8b\x76\x64\x4e\x0c\xce\x6d\x99\x7b\xe8\x65\x5c\x01\x74\x80\x43\x85\x38\x21\x41\x15\xc2\x9a\xc9\x56\x5d\xe3\xff\x63\x4f\x07\x78\xb3\x99\xa1\x4e\xd4\x69\xbd\xb5\xe6\x6c\x36\xf7\x3b\x8b\x3a\xf9\xa0\xbd\x23\xbb\x6d\xb0\xee\x61\x21\xb6\x75\x0c\x0e\xb1\x2d\x0e\x17\x6c\x24\xbd\xd7\xc7\xb3\x71\x24\x34\xc8\xbc\x5a\x36\x3c\x35\x78\xad\x38\xb7\xb4\x2f\xe2\xee\x0e\x2b\x79\xd5\x99\x8a\x13\x73\xca\x09\x33\x1a\xa4\xe1\x53\x23\x51\x9c\x8e\xc9\x05\xe1\x65\xc5\x96\x1f\x23\x8c\x8b\x8a\x2e\xd7\x91\x21\x56\x89\xba\xaf\xae\xdc\x3a\xe4\x2a\xb5\xad\x5b\x34\x66\xb3\x8d\xdc\x0c\xc0\xd3\x65\x57\x1e\xeb\xc4\xae\x51\xc7\x0e\xc2\xc4\x02\xdf\x87\x7f\x8b\xee\x7d\xac\xc2\xa2\x5b\xbe\x52\x47\xf5\x82\xcc\xcf\x9a\x72\x7c\xc5\x03\xda\xec\xc6\xce\x45\xd7\x5d\x41\xe2\xec\x0c\x12\x69\x5e\x49\x50\x80\xf9\xe6\xb6\x32\xcb\x15\x84\x46\x6b\xb6\x5b\xf7\xe5\x64\x89\xdf\xee\x19\x7b\xbf\xbd\x85\x32\xd7\xba\x05\xb1\xd9\xba\xc5\x62\xb8\x75\x5b\xdd\xbd\x71\xa2\xd5\x23\x10\x86\xc3\xc5\x89\x61\xdf\x32\x40\x9c\xd3\x63\x5b\x38\x87\xad\xdb\xfe\x51\xf0\xdb\xfa\x89\xb6\x1c\xb1\x58\x84\x6d\x1d\xe2\xe8\x37\xb7\xb5\xe0\xb6\xe7\x09\xab\xdf\xdc\x02\xe2\x63\x37\xb5\xae\x21\xf8\x9b\x5b\x7c\x46\x61\xda\xcd\x0b\x44\xe9\x6f\x6e\x3b\xc5\xee\x9f\xb5\x03\xf7\xc9\x37\xda\x32\xa6\xef\x83\x6e\xd9\xba\x45\x5e\xf1\x6e\x01\xff\x9b\xdb\xf3\xac\xf7\xc5\xcb\xa5\x04\x6c\x6e\x07\x4e\x14\xd8\x93\xa8\xed\x04\x7d\xa3\x0d\x31\xdf\xeb\xb3\xc6\x8f\x23\x51\xd3\x20\xc1\xc2\xec\xf9\xa8\x72\xa7\x60\x9f\x39\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xf6\xb6\x73\xf6\x44\x48\x36\xc4\xe6\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xc5\x3b\x47\x3d\xe1\x6b\xeb\x8c\x3c\xa0\x8a\x60\xdd\xa1\x83\x8a\xf0\x64\x1b\x54\x84\x41\x45\x78\xba\x0d\x2a\xc2\x7a\x1b\x54\x84\x41\x45\x08\x6a\x83\x8a\xf0\x64\x1b\x54\x84\x27\xdb\xa0\x22\xd4\x6d\x50\x11\xfa\xaf\x22\x84\x66\xc8\x6e\x6e\xd6\xdf\x12\xcd\xed\xf3\x17\xeb\x6e\x5c\xf5\xf3\xa0\x72\xe3\xc3\xdc\xdb\x0e\x1f\x23\x45\xdf\x3a\x51\xe3\x0e\x9d\x44\x2e\xd9\x5b\x52\x3e\x03\xf2\x7a\xf4\xfa\xd5\xde\x49\x15\xcd\x16\x12\x9b\xde\x6c\xfb\x82\x46\xad\xb7\xe8\x3b\x63\x5b\xfc\x42\xff\x42\x7a\x1c\x67\xaf\xe2\x2a\x5a\xca\xe7\x96\xf8\x9a\xaa\x22\x41\x0e\x7a\xff\x84\x08\xdf\x9a\x8e\x69\x96\x43\x15\xf4\x66\xd9\xba\x4b\xe3\xa9\x93\x62\x05\x77\x01\x12\x66\x5b\x76\xdd\x76\x9d\xde\x36\x01\x6a\x93\xcd\x27\x60\xde\xb8\x6b\x28\x91\x26\x4a\xe4\x60\xe1\xda\xfc\xd5\x61\x5e\x17\xfc\x36\x20\x27\x30\x9e\x8d\x49\x5a\x82\x83\x41\xb0\x59\x27\xa7\x67\x8d\xe0\xcc\xae\xb1\x44\x46\xe0\x91\xf8\x1f\x33\xb1\x2e\xa6\x13\x16\xc0\x75\x49\xb3\x6c\x49\x60\xc1\x12\x5d\xad\x00\x26\x67\x31\xad\x02\xe6\x3a\x58\x15\x0d\x55\x3f\x47\x6b\xfc\xab\x9b\x78\x12\xae\x27\xae\xd1\xd1\x9d\xa7\xaf\x14\x04\xb0\x33\x34\xde\x6a\x49\xd2\x66\x34\x1b\x90\x86\xff\xc4\x83\xfb\xf1\xa6\x6b\xec\x0e\x89\x24\x8f\x04\xcb\x20\x31\x55\x03\x17\x30\x23\xa4\x0b\xe9\x59\x9f\xc1\x0d\x21\x33\x1b\xf0\x3f\xf6\xce\xcd\x6f\x37\x3d\x87\xbc\x0b\x86\xc8\xa6\x66\x68\xbb\x13\x85\xc8\xc4\x6c\xd9\xdc\x78\xae\x6e\x7f\x8d\x76\x4e\x89\x2a\x27\x4e\xb9\x35\x67\xff\x6a\x65\xa7\x0e\xc1\x1e\x5b\xdb\x10\xec\xb1\xd6\x06\x4b\xee\x60\xc9\xdd\xa3\x9f\xc1\x92\x3b\x58\x72\x07\x4b\xee\x60\xc9\xed\xda\x06\x4b\xee\x5e\x44\x0d\x96\x5c\x32\x58\x72\xb7\xb6\xc1\x92\xeb\xda\x10\xec\xb1\xb1\x0d\x2a\xc2\xbe\x6d\x50\x11\xc2\xfb\x19\x54\x84\x41\x45\x18\x54\x84\x41\x45\xe8\xda\x06\x15\x61\x2f\xa2\x06\x15\x81\x0c\x2a\xc2\xd6\x36\xa8\x08\xeb\x1d\x47\x0b\xf6\x78\x06\x72\x63\x12\x5a\x88\x34\x3a\x9c\x4b\x21\xd2\x47\xd0\x5c\xac\x2f\x3c\x11\xa3\x4c\x24\x14\x6b\x09\x32\xfb\x13\x17\x83\xa2\x68\x6e\x43\x01\xce\xc8\x3f\x05\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x03\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x07\x34\x98\x5d\xda\x80\x06\x33\xa0\xc1\x0c\x68\x30\x2f\x8b\x06\x33\xa7\xca\x95\xb8\x40\xa1\x68\x3b\x38\x4c\x83\x63\xdf\x81\xcc\x07\x6c\x98\xa7\xda\x9a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\xaf\xdb\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\x91\x3d\x3c\x82\x4c\x99\xab\x30\xb3\x72\x9a\xdd\x0c\x77\x65\x88\x3d\x01\x5c\x69\xcf\x44\x40\x4f\x87\x47\x5d\x69\xbf\x4a\xb4\x50\xa5\x66\xc4\x56\x4b\xfc\xf9\xec\x30\x58\xe2\xd8\x0b\x47\x44\xbb\x30\xa5\xef\x82\x2c\x86\xb1\xcc\x7b\x68\x7e\xbb\xdd\xab\xa6\xec\xf6\x16\xdb\xa4\xe1\x0b\x75\xfe\x77\x09\x72\x49\xc4\x02\x64\x6d\xac\xf2\x37\xad\x72\x31\xda\x88\x85\xef\xea\xd0\x86\xab\xa6\x97\x53\x8b\x32\xc5\xcb\x2c\x3b\xb3\xbd\xaf\xb2\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\xf4\xac\x62\xed\xf6\x16\xd7\x3c\x11\xd1\x38\xf1\x4c\xd6\xc3\xbe\x54\xc6\xdd\xde\x9e\xd3\xbf\x44\x62\xfb\x98\x48\x64\x3f\x13\x89\xe8\x6b\x22\x71\xfd\x4d\x24\xba\xcf\x89\xc4\xf4\x3b\x91\x17\xaf\xf4\xbb\xbd\x45\x37\x2b\xc6\x76\x45\x91\x67\x63\x30\xe4\xa5\x2b\x0a\x6f\x6f\x2f\x53\x6b\x78\x7b\x7b\x86\x5d\x10\xd3\x3d\x45\x9e\x75\x0f\x1c\xa4\xa6\xf1\xf6\xd6\x4b\xa7\xd5\xa3\x84\x3d\x7b\x1d\xe4\xed\x2d\xba\x0f\x88\x3c\x83\x1f\x88\xc4\xf6\x05\x91\xe7\x39\xb2\xcf\xec\x13\x7a\x81\x01\x3a\x55\x6f\xde\xde\x9e\x83\xe7\x1c\xb4\xe2\xf3\x63\x64\x1d\xb0\x16\xf4\xf6\x76\xf8\x2a\xd1\xdb\x5b\x64\xe9\x3c\xb4\xb2\xf4\x53\x84\x46\x61\x15\xcf\xe3\x7e\x25\xad\x73\xf1\x1d\x2c\xe3\x06\x7f\x46\x38\xb9\x1f\x5a\xd4\x79\xf5\x53\xbb\x1a\x76\xb5\xd4\x8e\xbe\x36\x2b\xb0\x3b\x1f\x81\xab\x88\x9d\x65\xc1\x34\x4c\x80\x68\x7a\x0f\x18\x71\x21\xb0\x1c\x09\x4b\xc1\xd6\xad\xb1\x5b\x1d\xc7\x37\x5b\xbc\x54\x90\x1a\x42\x32\x21\xee\xcb\xc2\x1f\x15\x4c\x2b\x8e\x71\x30\x19\x4f\x44\xee\xf3\xa7\x6d\x36\x9d\x39\xf1\x8e\x17\x8c\x6c\x9d\x31\xfb\x39\x92\x83\x97\xb4\x33\xaa\xfe\xa3\x65\xe4\xfb\x07\xa1\x8a\xfc\x03\xd5\x1f\x4e\x4e\xf0\x87\xa7\xff\x08\x0f\xcd\xac\x96\xc0\xfa\xe5\x44\x89\x1c\x76\xa5\x48\x79\x7b\x75\x1e\x9b\xdd\x60\x82\x7c\x6d\x94\xe6\xc4\x1d\x5b\x7f\xfa\x09\xe5\x9a\x9d\x56\xa6\xe8\x31\xc1\xfd\x85\xba\x5f\x2a\xf8\xb1\xb6\x54\x7b\xae\xef\x3b\x08\x8f\xc8\xac\x56\xae\x8e\xec\xb1\x1e\xee\xb1\x2b\xfb\x6e\xab\xf0\x55\x35\xe3\xac\x8c\x17\x3c\xee\x9d\x8f\x1d\x70\x2a\xef\x54\xc8\x09\x4b\x53\xc0\x42\x9b\xd5\xab\x4e\x84\x87\xc6\xa8\x8f\x9c\xe1\xfb\xad\xbd\x13\x4e\xcc\x45\xa6\xc4\xd9\xea\x38\x09\xe5\x1e\xfc\x00\xb4\xad\xd6\xd9\x1a\x96\x30\x65\x96\x45\x41\xb0\xfa\xd5\xbb\xf0\xf0\xe7\xba\x27\x22\xa7\x08\x30\xd5\xf3\xbb\x62\x95\xc0\xe1\xba\x88\x7e\x5d\x70\xa1\x87\x1b\x63\xb8\x31\x56\x6e\x8c\xb5\x83\xf7\x7c\x97\xc6\xda\x50\xc3\xbd\xd1\xf3\x7b\x83\xd3\x1c\x54\x41\x13\xf8\x8c\x3c\xcc\xd6\xfc\x6f\xf3\xd6\x3c\xf9\xaa\x51\x4e\x1b\x64\x1e\xd5\x2b\xe0\xa1\x6a\xf0\xc6\xc2\x7e\x53\x1f\x0a\x55\xf2\x46\xad\xd5\x06\x31\x96\x6f\xae\x46\xfd\x05\x53\xe2\xd5\x7c\xc1\x41\xa1\xf3\x15\xaa\xd8\xd3\xc6\xe0\x38\x56\xf8\x6b\x23\x04\x4d\xed\x66\xe1\xe9\x2a\x28\x4d\x3d\x22\xfa\x81\x73\xa0\x5c\x91\x23\x1f\x14\x7b\xac\xea\x27\x76\x2c\xaa\xfc\x58\xab\xca\x5b\x55\x14\x9d\xfc\x9f\xff\x7b\xda\x2a\x69\x55\x13\x34\x78\xf9\x77\x6e\x83\x97\x3f\xa8\x0d\x5e\xfe\xc1\xcb\x1f\xa3\xaf\xc1\xcb\x3f\x78\xf9\x37\xb6\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\xe0\xe5\x5f\x6f\x83\x97\x7f\xf0\xf2\x37\xda\xe0\xe5\xef\x4e\xd6\xe0\xe5\xdf\xb3\x0d\x5e\xfe\x98\x5e\xfe\xda\x70\xd1\x37\xeb\x5b\xd3\xa4\xe5\x32\x59\x51\xfb\xd4\x54\xb3\xa4\x46\x8f\xf2\x4f\xd9\x7f\xf5\xcb\x14\xd7\x34\x93\x3d\x8f\x21\xae\x69\xec\x5b\xb3\xa7\x46\xb2\xc3\x6d\xb5\xba\x55\x76\xb9\xb5\x91\x9f\xd5\x20\x37\x98\xdb\xbb\x51\x59\xa7\x96\xf5\xed\xa8\xdf\x79\x30\x03\x35\x17\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd5\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x65\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x7b\xe4\x4a\xcd\x17\x63\x0a\xf7\x07\xcd\x32\xf1\x10\x2e\x6d\x44\x39\xd7\x91\xcb\xd6\x04\x9e\xb6\x87\xbd\xab\xde\xac\xe4\xfe\x86\x69\xb6\x43\xc1\x9c\x1d\xdb\x50\x30\xe7\xe9\x36\x14\xcc\x79\xbc\x60\x4e\x23\xb2\xa9\x59\x39\xa7\xeb\x6c\x63\xbd\x9d\x03\x54\xce\x21\xe4\x2f\x73\x40\xbe\x21\xc1\x86\x23\x95\x99\x66\x45\x8d\x88\xa6\xec\xca\x67\xd6\x10\x37\x75\xc8\x3a\x6d\x2e\x66\x68\xa4\xc9\xbc\x23\x01\x2b\x3c\x10\xa9\x40\xdc\x35\x85\x37\x9b\x45\x94\x41\x3f\xb0\x2d\x2b\xe3\x2d\x74\x16\xd8\x87\x7d\xfe\xf8\x1f\x01\xb7\xce\x3b\x14\x7b\xda\xf1\x76\x8a\x9c\x18\x69\x29\x5b\xba\xa8\xb3\xd6\xf5\xd3\x12\xb3\x3a\x0f\x6b\xbd\x08\x0b\xf0\x2a\xda\x8c\x2d\x80\xd7\x32\xda\x89\x3a\x3d\xf5\xba\xe2\xaa\xec\xd9\x79\xcc\x10\x99\xb5\xfb\xbd\xba\xaf\xac\xb9\x22\x2b\x76\x1e\x77\x83\x8c\xf9\x1f\x0d\x59\xec\x3f\x9f\x96\x32\x3b\x0f\x6d\x59\x9b\x87\x5b\x6a\x6c\xab\x5a\xba\xec\xd8\x77\x4f\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\x75\x08\xd8\x8f\x03\x40\x7e\xfc\x92\x0a\x46\xf5\x32\xf8\xa7\x77\x76\xa6\xe7\x40\x8b\xef\x75\xb0\xcf\x00\x17\x1f\xd4\xcf\x2f\x0a\x2e\xfe\x40\xc1\x3c\xbf\x40\xd4\xf8\x1e\x04\xef\x1c\x32\x70\xe7\x17\x87\x1a\xdf\xa3\x40\x9d\x5e\x06\xe9\xf4\x2d\x40\x67\x80\x61\x0f\x6a\x9f\x27\x0c\x7b\xd4\x20\x9c\xd8\x7c\xa4\x87\xc1\x37\x3d\x0c\xbc\xe9\x6b\xd0\x4d\x44\x49\xf9\x79\x82\x6d\x22\xb1\x80\xe7\x09\xb2\x89\x97\x1a\x1d\xf3\x54\x1e\x1a\x3e\xa3\x17\xb9\xd0\x7d\x86\xcd\xe8\x55\x02\x74\xbf\x92\x9f\x0f\x91\xf8\xdc\x1b\x98\x8c\x03\x42\x64\xc4\x11\x03\x23\x08\x7f\xcf\xc1\xef\xe3\xc9\x62\x51\xe1\x30\xa2\xf2\xfc\xc3\xc3\x60\x7c\xb1\x6c\x3f\x22\xfc\xc5\xc0\xf9\xb7\xb6\xbe\x73\xfe\xe7\x86\xbb\x38\x2c\xd4\xc5\xc0\xff\x77\x6a\x51\x61\x2d\x9e\xd9\x73\xfa\x92\x70\x16\xfd\x80\xb2\x78\x31\x18\x8b\xfe\x40\x58\xbc\x18\x7c\xc5\xe0\xb1\x1e\x3c\xd6\xed\x36\x78\xac\x07\x8f\xf5\x3e\xfd\x0c\x1e\xeb\xc1\x63\x3d\x78\xac\x07\x8f\x75\x60\x1b\x3c\xd6\x1d\x89\x1a\x3c\xd6\x9b\xdb\xe0\xb1\x1e\x3c\xd6\x83\xc7\x7a\xad\x0d\x1e\xeb\x20\x02\x7b\xea\xb1\x8e\x03\x09\x11\xf3\x44\xf6\x09\x0a\xa2\x0f\x30\x10\x2f\x05\x01\xd1\x3b\xf8\x87\xc1\x04\xbd\x1b\x75\x71\xa0\x1e\x62\x1e\xe1\x7e\x43\x3c\xf4\x19\xde\xa1\xa7\xd0\x0e\xcf\x03\xeb\xf0\x9c\x90\x0e\xc1\x67\x36\xea\x69\x2d\x44\x7a\xc1\x35\xf3\x29\x64\xfb\x9f\xd3\xd6\xe9\x7c\x87\x7f\x4c\xc0\x9e\xb1\xd6\x81\x69\xe6\xc9\xcb\x32\x03\xe5\xd2\xc4\xe9\x42\xb0\x94\x14\xa5\xd6\x36\xf3\xd6\x9d\x4f\xbf\xf1\x69\x6e\x33\xe5\xcf\xc8\x3f\x05\x87\x33\x02\x3a\x19\x9b\xcd\x8d\x39\xe8\x42\xcf\x41\x9a\xc7\x4f\xd4\xe9\xe9\xfe\x6b\x12\x24\x9f\x85\x99\xf6\x0a\x09\x53\x90\x9f\x05\xb2\x02\x7a\x9e\x1d\x7c\x81\xb4\x0e\x6f\x4b\x3d\x86\x08\xb8\x2f\xec\xf1\xd3\xc2\x65\xbd\xe3\xb1\xb7\x69\xe7\x5d\x6f\x48\xc4\x37\x68\x6d\x20\x68\xb8\x39\xb6\x60\x1c\x9c\x91\x49\xa9\x09\xd3\x08\x0c\x90\xcc\x85\x50\x5d\xb9\x8b\x4b\x52\xc6\x17\x59\x30\x61\xcd\xe9\x82\x03\xa2\x0e\x08\x59\xf1\xc0\x06\x51\x56\x95\xa8\x7f\xc6\xba\x2a\x5b\xb9\x50\xba\xde\x21\xde\x38\x6b\x06\xaf\xee\x9c\x99\x04\x43\x91\x26\xaa\xcc\x0d\x29\x16\x50\x45\x59\x08\x80\x8e\xc3\x4e\x8d\x88\x45\x93\x79\xe3\x15\x72\x00\x6d\x5d\x73\x3e\xcb\xb9\x71\x88\x9b\x3a\xd3\x89\xcf\x79\xed\x38\xb6\xe9\x0c\x94\x3e\xdb\x8a\x38\xb2\x7d\x2f\x58\x9e\x70\xda\xd5\x28\x95\x88\xbc\x28\x35\x18\x39\xbe\xcc\xcd\x6e\x62\x1a\x23\x56\x90\x19\x49\x51\xce\xec\x84\x7b\x90\x07\x3b\x11\x35\x82\x08\x4f\x89\x2a\x27\x5a\xd2\x44\x77\xbf\xfd\x8f\xec\xf2\x1d\x55\x81\x45\x48\x0b\x9b\x56\x38\x21\x64\x4e\x55\x33\xe2\xa6\xbe\x5e\x9f\xc0\xc9\xf9\x1f\x01\x17\xac\x19\xf8\x44\x35\x04\x9d\x39\x9b\xcd\xfd\x9e\x33\x4a\x32\x9a\x16\x5a\x7b\xf5\x73\x07\x98\x30\x07\xd8\x1d\x25\x94\x5a\xea\x8d\x6f\x67\x3c\x25\x7f\xc1\x6f\x21\x5d\x4d\xbb\xc6\xed\x60\x6d\x07\x34\x4d\x8d\x3c\x02\x72\x64\x0f\x92\x20\x53\xe6\x34\xa5\x95\x93\xed\x66\xb8\x2b\x87\xec\x07\x48\xc0\xca\x8e\x0b\xe8\xc9\xce\x7c\xc7\x0e\x62\xb8\xda\x56\x5e\x25\x9a\xd2\x72\xe3\xa6\x79\x4c\x2e\xac\x60\xe4\xd9\x98\xd1\xe0\xcf\xd6\x60\xb0\xd6\x4f\xb5\x9d\x99\x1e\x04\x45\xc4\xf1\xd7\xc6\x40\x96\x20\x11\xdd\xab\xd1\x10\x26\xc8\xcb\x94\xff\x79\x01\xa4\x09\x72\x18\xb4\x09\x32\x94\x9e\xe9\x57\x2c\x0f\x19\x4a\xcf\xf4\x2c\xb6\x87\x0c\xa5\x67\x86\xd2\x33\xdd\x5b\x1f\x62\x7f\xc8\x50\x7a\xa6\x07\xb1\x40\x64\x28\x3d\xb3\x4b\x1b\x4a\xcf\x0c\xa5\x67\xd6\xdb\x50\x7a\x66\x28\x3d\xd3\x68\x43\xe9\x99\xee\x64\xf5\x2e\x9e\x88\xf4\x38\xa6\x88\x0c\xa5\x67\x22\x97\x9e\x89\x97\x25\x4d\x9e\xe1\xe4\x1e\x1a\x21\x83\xf4\x25\x5d\x9a\xf4\x1c\x29\x83\xf4\x2d\x67\x9a\xf4\x2e\x6f\x9a\x1c\x28\x77\x9a\xf4\x09\x39\x83\x1c\x16\x3d\x83\xf4\x31\x3f\xef\xf3\xa8\x5c\x14\x15\x51\x83\x3c\xc7\x5d\x71\x78\x64\x0d\xf2\xa5\x5f\x17\x11\x11\x36\xc8\x70\x63\xec\xd2\x3e\x87\x1b\xe3\xb9\x11\x37\xc8\xc1\x51\x37\xc8\x70\x6f\x74\x6d\x51\x91\x38\xc8\xcb\x78\x98\x5f\x12\x91\x83\xf4\x06\x95\x83\xbc\x24\x32\x07\xe9\x15\x3a\x07\x79\x49\x84\x0e\x32\x78\xf9\x07\x2f\xff\xce\x6d\xf0\xf2\x0f\x5e\xfe\x18\x7d\x0d\x5e\xfe\xc1\xcb\xbf\xb1\x0d\x5e\xfe\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\x7a\x1b\xbc\xfc\x83\x97\xbf\xd1\x06\x2f\x7f\x77\xb2\x06\x2f\xff\x9e\x6d\xf0\xf2\xc7\xf4\xf2\xc7\x41\x13\x21\xcf\x70\x6a\xfb\x84\x2a\x42\x7a\x82\x2c\x42\x5e\x10\x5d\x84\xf4\x11\x61\x84\x0c\xe6\xf6\xce\x54\xc6\x41\x1d\x21\xcf\x70\xd4\xfb\x8d\x3e\x42\x7a\x8e\x40\x42\xfa\x8b\x42\x42\x9e\x0d\x89\x84\x3c\x33\x1a\x09\x89\x75\xae\x6d\x8a\x6a\x5f\x70\x7e\x2c\x35\x6b\x99\xb5\xad\x0a\xff\x8f\x26\xce\x87\x69\xb6\xee\xd0\x48\xca\x67\x40\x5e\x8f\x5e\xbf\x7a\x15\x9e\xbb\xcb\xb8\x86\x19\x84\x58\x2f\xa7\x42\xe6\x54\x63\x4f\xbf\xfb\x6d\xa7\x7e\xa2\xb3\xed\x6d\x70\x0f\xfd\x83\x41\x71\x36\x91\x36\x0c\x45\x4b\xfa\xdf\x82\x49\x82\x5a\x81\x39\xad\x39\x68\xd2\xd9\x37\xd0\x00\xde\xd0\x2c\x87\x33\xcf\xfb\x6d\x4c\x84\x0f\x00\x70\x68\x2c\x29\x11\xdc\x89\x6c\x86\xdd\x75\xdd\x7b\xdd\x5f\x39\x01\xaa\x10\xf9\x60\x02\xe6\xb5\x3b\x8e\x4f\xb5\x85\xf9\x29\x04\xe3\xda\x1b\x7a\xcc\x3b\x83\xdf\x10\x0e\x43\x28\x2d\xc1\x5a\x50\xeb\x18\xa7\xb2\x48\xa9\x86\xd3\x10\x55\x51\x2d\x95\x86\x1c\xa1\x64\x8c\xa4\x47\x31\xf8\x87\x68\xb9\xc4\x00\x90\x05\x70\x5d\xd2\x2c\x5b\x12\x58\x30\x17\xbf\x63\x86\xc7\xe8\x25\xa6\x55\xd0\xcc\xff\x65\x0e\xc8\x41\x24\xd8\xc0\xa4\x32\xd3\xac\xc8\x6a\x14\x12\xbb\xfc\x99\x35\xc9\x4d\x1d\xe8\x4e\x9b\x9f\x19\x1a\x69\x32\xef\x48\xc0\x0a\x37\x44\x2a\x0c\x03\x92\x0a\xef\x38\x8b\x33\x83\x1e\x61\xa3\x2a\xa8\xca\x56\x67\x31\x7f\xd8\xe7\x8f\x04\x12\x70\xff\xbc\x43\x01\xa8\x1d\x79\xa7\xc8\x89\x91\x9b\xb2\xa5\x8b\x3f\x6b\x5d\x44\x2d\x81\xab\xf3\xb0\xd6\x9f\xb0\x00\xaf\xac\xcd\xd8\x02\x78\x2d\xad\x9d\xa8\xd3\x53\xaf\x35\xae\x4a\xa1\x9d\xc7\x0c\x91\x5e\xbb\xdf\xb0\xfb\x4a\x9d\x2b\x52\x63\xe7\x71\x37\x48\x9b\xff\xd1\x90\xca\xfe\xf3\x69\x79\xb3\xf3\xd0\x96\xb5\x79\x10\xa6\xc6\xb6\xaa\xe5\xcc\x8e\x7d\xf7\x04\x45\x26\x1c\x10\x24\x86\x47\x36\x1a\x10\xc8\x33\x17\x4c\x7a\x01\x00\x90\x03\x80\x7f\x0c\x85\x7b\x86\xc2\x3d\xed\x36\x14\xee\x19\x0a\xf7\xec\xd3\xcf\x50\xb8\x67\x28\xdc\x33\x14\xee\x19\x0a\xf7\x04\xb6\x1e\x85\xec\xf4\x32\x5c\xa7\x6f\xa1\x3a\x43\xe1\x9e\xa0\x36\x14\xee\x19\x0a\xf7\x0c\x85\x7b\x1a\x6d\x28\xdc\x13\x72\x34\xe3\x25\x49\xc7\x3c\x95\x87\x06\xd2\xe8\x45\x56\x74\x9f\x01\x34\x7a\x95\x0a\xdd\xaf\x34\xe8\x43\xa4\x40\xf7\x06\x30\xe3\x80\x60\x19\x43\x9d\xa7\x9d\x5a\x54\x60\x8c\xa8\x3c\xff\xf0\x80\x18\x5f\x2c\xdb\x8f\x08\x84\x31\x70\xfe\xad\xad\xef\x9c\xff\xb9\x81\x2f\x0e\x0b\x7a\x31\xf0\xff\x9d\x5a\x54\x80\x8b\x67\xf6\x9c\xbe\x24\xb0\x45\x3f\x40\x2d\x5e\x0c\xd0\xa2\x3f\x60\x16\x2f\x06\x64\x31\x78\xac\x07\x8f\x75\xbb\x0d\x1e\xeb\xc1\x63\xbd\x4f\x3f\x83\xc7\x7a\xf0\x58\x0f\x1e\xeb\xc1\x63\x1d\xd8\x06\x8f\x75\x47\xa2\x06\x8f\xf5\xe6\x36\x78\xac\x07\x8f\xf5\xe0\xb1\x5e\x6b\x83\xc7\x3a\x88\xc0\x9e\x7a\xac\xe3\x80\x43\xc4\x3c\x91\x7d\x02\x85\xe8\x03\x20\xc4\x4b\x81\x41\xf4\x0e\x08\x62\x30\x41\xef\x46\x5d\x1c\xd0\x87\x98\x47\xb8\xdf\x60\x0f\x7d\x06\x7a\xe8\x29\xc8\xc3\xf3\x00\x3c\x3c\x27\xb8\x43\xf0\x99\x8d\x76\x5a\x69\xa9\x45\x2e\x4a\xae\x6f\x41\x2e\x58\x02\x17\x49\x62\xfe\xba\x13\xf7\xb0\x67\x56\x7f\xeb\x88\x5e\x3c\xd2\x2d\x61\x3c\x65\x09\xda\x26\x1f\xe6\xa0\xe7\x2e\x6d\x0e\x9f\x23\xd4\x3e\x48\x34\x3e\x59\x9f\x50\xa4\xd3\xdc\xb1\x98\xd9\x8d\x5d\xef\xbb\x04\x76\x86\x26\x42\x64\x40\xf7\x71\x45\x3b\x99\x11\xe4\x9e\x8c\x3a\x8c\x67\x7d\xef\x44\x89\x7a\x74\x32\x81\x4c\xf0\x99\xcb\x21\x77\x5c\x67\xdf\x5d\xf8\xb6\xee\xce\xb9\x6a\x93\x52\x4a\xe0\x3a\x5b\xe2\x34\xa7\x29\xa4\x04\xcd\x53\xb9\x58\xec\xbf\xc9\xef\x90\x1d\x79\x1d\x9e\x6a\x92\x01\x35\xef\xc1\xa1\x7e\x11\xc3\xd0\x28\xb9\xee\x40\x7b\xe5\x5b\xb6\x20\x02\x9d\xd6\x7f\xff\x1b\xbb\xd3\x1d\xdd\x3e\x0d\x5e\x2f\x43\x29\x2d\x41\x23\x5f\x63\x3e\x90\x41\x2e\x45\x49\x1e\xa8\x55\xa5\x64\xc9\x91\xa5\xe2\x44\x75\x58\xe4\x00\xa5\xa3\xbb\x31\x7e\x84\xf7\xd2\x9e\x3f\x0b\x31\x8e\x53\x39\xeb\x24\x3a\xc5\x90\x25\x2e\xe4\xac\xb4\x9a\xa2\x3b\x8a\xc0\xb5\x5c\x22\x1e\x46\xb7\x7b\xe1\x6e\xde\x3a\x21\x39\x9d\xc1\xb1\x22\x6f\x3f\xbc\x33\xb7\x0e\x46\x20\xb1\xa9\x95\xd9\xdd\x2d\x54\x48\xb1\x60\x69\xd7\x6b\xe8\x07\x2a\x19\x9d\x64\x46\xeb\x9d\x82\x04\x6e\x24\xe9\xaf\x4e\x7e\xb8\xb8\xf9\xfb\xd5\xc5\x87\xf7\xa7\xa8\xff\xc2\xa7\x82\x72\xc3\x0e\x4a\x55\x23\xf3\x38\x0a\x8f\x15\x01\xbe\x60\x52\x70\x33\x0b\x68\x37\xa4\x64\xe1\x3a\xed\x44\x51\x1d\x38\x22\x41\x89\x6c\x01\xa9\xc5\xd2\xa8\x08\xac\xc3\x77\x8a\x52\x7b\x0b\xaa\x8f\xbd\x29\x79\x32\xa7\x7c\x06\xe9\x98\xbc\x13\xa5\x79\xb1\xaf\xbe\xc2\x97\x90\x90\x96\x09\x74\xd3\x71\xac\x09\xde\x9e\xdc\xaf\xce\xbc\xcc\x62\x6e\x7f\x8c\xbd\x21\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x5a\x72\x4d\x3f\xbd\xb1\x58\x1c\x47\x5f\x35\xbe\x3a\xea\x1e\xb8\x56\x48\x61\x5e\xc5\xca\x82\xf6\xed\x33\xa6\x41\xd2\x8c\x1c\x35\x47\x18\x93\xf7\x86\x2e\x48\x9b\x6b\x6b\xc1\x68\x60\x01\x12\x6d\xab\x6e\x65\xcf\x88\x84\x19\x95\x69\x06\xaa\x9b\x51\x48\x4c\xab\x2b\xdc\x9a\x5a\xdc\xae\x82\xca\x66\xcc\x85\x1e\x87\x32\x6e\xdf\x3e\x08\x04\x3b\x99\x8a\x37\x64\xae\x75\xa1\xde\x9c\x9f\xd7\x52\xd0\x98\x89\xf3\x54\x24\xea\x5c\x53\x75\xaf\xce\x19\x37\xcc\x6f\x94\x52\x4d\x47\x0d\xae\x7b\x6e\x65\xe3\x51\x22\xf2\x9c\xf2\x74\x44\xdd\x39\x1e\x55\x3b\xfb\xfc\xd7\x4e\x7a\x1c\xd1\xea\x29\xc6\x47\x74\xa4\xe6\xd0\x69\xe5\xc2\x14\xc5\x00\x05\x31\x50\xc8\x8c\xac\x10\xba\xb9\x3c\x14\xc3\x7e\x5f\xf1\x67\xbb\x14\x63\x72\x25\xb4\xc3\x2b\x72\x11\x95\x78\xdb\xe2\x2a\xc7\x64\xe1\xef\xaf\xee\x6e\xfe\x7a\xfd\xf1\xf2\xea\x6e\xe0\xe4\x03\x27\xc7\x36\x70\xf2\x81\x93\x77\x18\xb8\x2f\x9c\x1c\xf8\xe2\x50\x5c\xdc\x2b\xc5\x0d\x8e\x55\x6d\x55\x97\x28\x50\x85\x79\x57\xfb\xa0\xdb\x16\x8d\xb2\xd3\x0f\xb6\x63\x5a\x93\xfd\x9e\x2f\x7e\xa0\xed\x88\x13\xbe\x71\x0a\x89\x7b\xc0\x6a\xe8\x6f\xc3\x26\x30\xd8\xf3\x15\x1a\x17\xd6\x49\x21\xb5\x2d\x3c\x66\xcb\x0c\xdd\xdd\xe0\x1d\xcf\xdc\x7d\x45\xf3\xca\x56\xbb\x69\xc9\x43\xac\x98\x1f\xac\x43\x55\xb9\x43\x49\xf9\x92\x14\x92\x71\x8d\x5b\xe9\xe2\xf6\xed\xe5\x25\x49\xe6\x54\xd2\x44\x83\x54\x04\x3e\x25\x50\x68\x72\xfc\x3f\x8f\xbb\x8f\x19\xc1\xd7\x81\xd6\xeb\x3e\xac\xcc\x3e\x82\x5b\xc0\x30\xb5\xc8\x57\x48\x58\x30\x51\xaa\x6c\x59\x79\x08\x36\xf3\xd1\x55\x06\x4a\x28\x0f\xa1\xc0\xec\x0b\x6f\xde\xdd\x38\xe0\x8a\xd0\xb9\x49\x80\x0c\xb1\xb5\x1f\x56\xf4\x74\x44\xc4\x10\x40\x03\xc6\xdf\x20\xba\xee\x2e\x86\x06\x8c\xdb\x49\x80\xdd\x26\x8c\x06\xd0\xd1\x16\x63\x03\x3a\x7a\x67\xf3\xba\x50\xd8\x38\x0a\x98\x9a\x58\x9c\xec\x6b\x29\xf2\x48\xdc\xec\x16\x01\x0b\xab\x3c\xbb\x4d\x47\xf5\xd8\x05\xaf\xb7\x14\x01\xa7\xd2\x56\x99\x6e\xe6\xf3\xc0\x6c\xb7\x28\x51\x33\x71\x02\xaf\x13\xc1\xa7\x6c\xf6\x81\x16\xdf\xc1\xf2\x06\xa6\x61\xbe\xfa\xf6\x7c\xa3\xdb\xd2\x85\xff\xe2\x05\x6a\x44\x2e\x3b\x58\x98\xeb\x32\x5a\xd0\x51\xac\xd0\xfc\xf0\xb0\xfc\x78\x51\xf4\x51\x22\xe8\x5b\x0b\xe9\xb2\x85\xeb\x74\xd9\x58\x09\x16\x51\x02\x33\xc3\x24\x51\xdf\xe2\x47\x47\x37\x25\x53\x77\x3d\x44\x09\x32\xbf\xab\xd1\xce\x99\x22\x30\x9d\x42\xa2\xd9\x02\xb2\x0a\x21\x3d\x3d\x23\x93\x52\x7b\x6c\xf2\x09\x4d\xee\x1f\xa8\x4c\x15\x49\x44\x5e\x50\xcd\x26\x2c\x63\x7a\x49\x58\x8c\xfa\x5a\x2e\x54\xc0\x01\xae\xfb\x18\x6b\xae\x34\xc5\xab\x50\x38\x43\xa0\x59\x6d\x1b\x43\x41\x7d\x82\x9c\xe5\xa6\x1e\x68\x3c\x0a\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\x31\x6a\x60\xec\x6a\xcc\x49\x04\x37\xf2\xbf\x3a\x17\x0b\x23\x0b\xc2\xc3\xf9\x83\x90\xf7\x8c\xcf\x46\xe6\xc5\x47\x96\x59\xa9\x73\x8c\x6d\x39\xff\x35\xfe\xa7\x4f\xa7\x88\xf8\x8c\xee\x37\xe4\xe8\x28\xb0\x2f\x51\xd8\x30\xce\xc8\xa7\xf2\x16\x03\x84\x96\x2d\xd1\xa9\xba\x50\x8c\xe8\xc3\xb4\x42\x3e\xe5\xdd\xf3\x4e\x0b\x88\x34\xcd\xfb\x07\x56\xac\xb7\xe7\x2a\x33\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\x2b\xc7\x0a\x0b\x91\xbe\x21\xaa\x2c\x0a\x21\xb5\x22\x39\x68\x9a\x52\x4d\xc7\xe6\x40\x9c\xb5\xff\xc4\x10\xb0\x33\xf2\x8f\xea\x43\x8b\x47\xf0\xe3\xf1\x7f\x7c\xf7\xfe\xaf\xff\x79\xfc\xd3\x3f\x9a\xdf\xa1\xb8\x66\xb3\x8b\x1a\x0f\x04\xbe\x82\x2a\x20\x19\x73\x91\xc2\x15\x52\x87\x7f\xaa\x56\xc0\x8f\xfb\x42\x53\x5d\xaa\xf1\x5c\x28\x7d\x79\x5d\xfd\x59\x88\x74\xf5\xaf\xc0\x1c\xa7\x1e\xca\x3d\xb8\xb6\xd7\x54\x77\x47\x98\x27\x51\xa5\x1f\x5a\xb0\x1f\x40\xaa\xce\x35\x5b\x9a\xad\x75\x1e\x5c\xaf\x15\x14\x7e\x32\x87\x9c\xe2\x3f\xbf\xf6\x53\x60\xee\xe3\x07\xc9\xb4\xc6\x18\x30\x57\xa0\x42\x4c\xcf\x3c\x6b\xb5\x4a\xd5\xe2\x75\x70\x81\xb6\xa8\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x1a\x6e\x65\x2d\xe4\xf3\xe2\xfa\x92\x2c\xec\x0c\xf7\x68\x72\x9e\x8f\x5d\x67\x10\x5d\xdd\x0a\x66\xd8\x5f\x57\x54\xb9\x65\x6a\xa8\x6e\x4e\x61\x46\xca\x43\x17\xe8\xc6\x32\x1f\x9b\x8e\xfb\x9e\x2f\xcc\xb8\x8a\x4c\x81\xea\x52\x02\x99\x51\xed\x0b\xf8\x00\x37\x3a\x79\x60\x8a\x4a\x0f\x79\x66\x78\x0a\xf7\x88\x14\xa1\x2c\xd7\x74\xb2\x10\x59\x99\xe3\xe5\xd6\x13\xee\x1d\x5f\x77\x8d\xa2\xca\x79\x05\xd8\x45\x51\xb4\x0e\x03\xb9\x30\xcc\x7e\x81\x39\xc7\xf6\x19\x34\x3d\x62\x99\xa6\x76\x6d\x26\xa5\xa9\xd4\x51\xea\xf2\x91\x1a\xc0\xcb\x5b\xba\xeb\x00\x0f\x6b\xe5\xca\x5f\xdc\x77\x51\x37\x5b\x3c\x8d\x5c\x64\xc5\x1c\x33\x87\x66\x95\x1e\xbc\xf1\xb4\x9f\x55\x10\x0e\x8a\xfd\x13\x2d\x6c\x19\xcb\x99\xb6\x6a\xe5\xeb\xdf\xfe\xb1\x41\x68\x8f\xee\x86\x67\x53\x73\xa2\xec\xd8\x4d\xba\x92\xd9\xae\x8f\xa8\x49\x55\x72\xb4\x7f\x2e\x0e\xd2\x44\x2a\xc0\x99\x4c\x31\xad\xda\x8c\x50\x9f\xa0\x05\x95\x55\x94\x50\x39\xc9\x98\x9a\xc7\x29\x61\x7d\x39\xad\x56\xc7\xf4\xaf\x00\xc3\x8e\xb5\x2c\xa1\x4a\xe8\xaa\x65\x0f\x33\x17\x2b\x54\x46\x20\x61\x9b\x89\xb9\x5d\x37\xaf\x76\xe7\x5f\x63\xee\x56\x1d\x0d\x3f\xfe\xd5\xb3\xcd\xc3\x94\x66\xea\xe5\x26\x82\x72\x02\x52\x0a\x59\xb9\xa1\x24\xe8\x52\xf2\x3a\xc9\xfd\x5a\xa4\x24\x91\x60\xa1\x09\x7b\xa4\xac\x93\xa6\x51\x04\xe7\x2c\xb0\xbb\x22\xbe\x90\x1d\xed\x7a\x33\xb4\x35\xef\x37\x2b\x1a\xd8\x8b\xcb\x7a\xf3\xda\x60\x89\x31\x04\x41\xd3\x3e\x38\x26\x54\x15\x91\x33\xdb\xd2\x97\x3c\x74\xa7\x01\x07\x3c\x1e\x8f\x8f\x2d\x95\x42\xda\xab\xd4\x5a\x14\xcd\xe7\xbd\xba\x16\x6a\xa1\xea\x19\xcc\xf0\xbc\x61\x54\x76\x4b\x84\xb9\x42\x7e\xaa\xbc\x8b\x35\x96\xac\xfe\x19\x28\x53\xbe\x12\xd9\xd7\xbd\xb6\x81\x79\x2a\xfd\xe2\x55\x8c\xfe\x8d\x4d\xd5\xaf\xea\xa9\x59\xe1\xc7\xe2\xd3\x18\x95\x03\x94\x0e\x35\x14\x9f\xd8\x2e\xc7\x49\x51\x9e\xb9\xee\xc7\x39\xe4\x42\x2e\xab\x3f\xa1\x98\x43\x0e\x92\x66\x23\xa5\x85\xa4\x33\x38\xab\x06\xb7\x3f\xab\xfe\xb2\x3f\x6c\x91\xb7\xfe\x6b\x1b\xdd\x51\x67\x5e\x39\x7b\xdf\x17\xa8\xcb\xf9\x75\xeb\x89\x02\x55\x6d\xab\x67\xe0\x3f\xc7\x55\xc0\x9c\xf5\xb9\x55\xb3\x88\x2e\x75\xcb\x8d\xd4\x59\x2d\x70\x60\xdc\x87\x15\xf2\xd4\x71\x7f\xf8\x10\x21\x29\x5b\x30\x15\x03\x46\x6b\x83\x7b\x82\x39\xbb\x86\x28\x75\x51\x6a\x57\xf9\xba\xb2\xa0\x7c\x2a\x84\xc2\x68\x91\xaa\x78\x62\xcb\x34\xf8\x3a\xd4\xf3\x82\x32\x86\x06\xc9\xdf\x90\xff\x7d\xf2\xb7\xdf\xfc\x3c\x3a\xfd\xd3\xc9\xc9\x8f\xaf\x46\xff\xfe\xd3\x6f\x4e\xfe\x36\xc6\x7f\xfc\xeb\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xc7\xef\x3e\x7c\x73\x77\xfd\xfe\x27\x76\xfa\xf3\x8f\xbc\xcc\xef\xed\x5f\x3f\x9f\xfc\x08\xef\x7f\xda\xb1\x93\xd3\xd3\x3f\x7d\x15\x4c\x3a\xe5\xcb\x8f\x81\xdc\xdb\xb6\x51\xb4\xc2\xe5\xab\x3d\x46\x72\xb5\xb5\xae\x42\xc6\xf5\x48\xc8\x91\xed\xfa\x0d\x2a\x29\x81\x03\xf8\xed\x15\xfb\xfc\xdf\x78\xae\x59\xdf\x66\x95\x50\xd8\xa3\x03\xfe\x5c\x82\x86\x82\x44\x82\x7e\x89\x30\x19\x3b\x92\xd7\x0c\x57\x50\x3d\xbe\xb4\x1b\xf4\x97\x10\x39\x53\xd5\x4f\xc6\x75\xad\x35\x29\xa3\x5e\x8d\x6b\x25\x88\x12\x6b\x47\x74\xcf\xdd\x43\x20\xa0\x3a\x19\x22\x6d\x42\xda\x10\x69\xb3\x85\x94\x21\xd2\x26\xa8\x7d\x96\x91\x36\xb7\x96\x27\xfd\x22\xc3\x6c\xd6\x13\xcc\x4c\xa7\xf7\x9d\x0b\xce\x74\xce\xdc\xd9\x96\xe9\x96\xd3\x62\xef\xde\x80\x2f\xba\x06\x57\xc7\x4c\x75\xf3\x66\x0f\x2d\x48\x21\x8a\x32\xa3\x7a\x4b\x16\x45\xa4\xbc\xb7\x9e\x79\xce\xfe\x32\x07\xee\x44\x3f\x17\xc3\xcf\x38\xc9\xcb\x4c\xb3\xa2\x63\x42\x40\xa5\x5a\x56\xe0\x90\x84\x2a\x25\x12\x46\x7d\x22\xb8\x03\xb6\x52\xda\xbf\x32\x5a\xe6\x35\xbd\xc7\x1c\x9a\x04\x52\xe0\x49\x47\xcb\xe1\x0f\x16\x8c\xd2\xcf\xed\x64\x69\xee\xa1\xf7\x7c\xe1\xee\x24\x92\x96\x36\xc1\x15\x6a\x5f\x69\x94\x71\xbf\xac\x6c\x46\x73\x2e\x5d\xb6\x42\x23\xa9\x11\x25\xc8\xca\x88\x58\x81\x67\x57\x21\x90\x98\xfe\x61\xd9\x74\xb7\x0b\x2f\x58\x39\x08\x17\xc5\xab\x6c\x84\x20\x1d\x6b\x4d\x06\xaf\xc3\x44\xdb\xb2\x77\xe7\x11\x7a\x94\xc0\x11\x2e\x95\xc7\x95\xc8\x9f\x43\x1a\xef\x8b\x24\xde\x13\x29\xfc\x79\x24\xf0\x7e\x4a\xdf\xd1\x24\xef\x38\x52\x77\x1c\x89\x7b\x8f\xb8\xf6\x98\x52\x76\x1c\x09\xfb\x39\xec\x6b\x85\x84\x29\xfb\xd4\x87\xb4\xe5\x8f\xde\x7d\xa1\xe1\x13\x9a\x6a\x0a\x09\x05\xf0\x0a\x79\xd8\x7b\x60\x81\x26\xf3\x21\xe3\x9c\x54\x76\xd1\xb8\x17\xf6\xed\x26\x4b\xd9\x70\x5b\x93\xe1\xb6\xde\xa3\x0d\xb7\xf5\x70\x5b\xbf\xc8\x6d\xed\xb8\xd5\x97\x7f\x55\x47\x46\x5a\x42\x0c\xb9\x43\x19\xa0\xde\xb6\xa1\xec\x90\x33\x3f\x27\xda\x57\x75\x14\xeb\x18\xcf\x73\x1c\xb9\xdb\x89\x6b\x33\xd9\x2a\xe8\x42\x0b\xcb\xf6\xc8\x9c\xcd\xcc\xf6\xcc\x60\x01\x99\x53\xab\x49\x4e\x39\x9d\xd9\x12\x26\x5a\x54\x25\x7c\x85\xc4\x0a\xa5\x92\x75\x44\x4f\x5f\xc1\x04\x44\x0b\x96\xe1\x32\x99\xa0\x29\x7e\x29\x45\x96\x19\x79\x25\x63\xf7\x40\xde\x41\x91\x89\xa5\xab\x42\xc2\x53\x72\xab\xa9\x86\x69\x99\xdd\x82\xee\x14\xde\x1d\xc4\x71\x90\xe0\xeb\x32\xcb\xae\x45\xc6\x92\x4e\xde\xbf\x18\x5b\xf1\x12\x37\x60\x51\x66\x19\x29\x90\x90\x6e\xfb\xf0\x23\xc7\xab\xfc\x22\x7b\xa0\x4b\x75\x46\xae\x60\x01\xf2\x8c\x5c\x4e\xaf\x84\xbe\xb6\x46\xa4\x6e\xfd\x36\x31\x41\x6c\xe7\x84\x4d\xc9\x1b\x2c\xbf\xa8\x89\xa6\x33\x8c\x2d\xf6\x61\xc4\x67\x66\x43\x35\x07\x25\xc2\x30\xca\x07\xa6\x0e\x69\xdb\x0b\x3f\xa5\xbf\xc6\xd1\xcd\xd5\xd9\xf9\xd4\x06\xed\xd5\x8c\x4d\x21\x59\x26\xd9\xc1\x18\xe6\x45\x82\xe9\xb5\x75\xb1\x97\x06\x3b\x51\x4b\xa5\x21\xf7\x78\xf6\x68\xd2\x65\x9c\x48\x50\x85\xe0\x0a\xa5\xbc\x9a\x4b\x54\x2f\x42\x30\x49\xa6\x63\x52\x47\x44\x8b\x6f\x67\xc5\x20\x54\x25\x28\x84\xd2\xb7\x9a\x4a\xdd\x55\x3e\x89\xa5\x0b\x5c\x7b\x42\xcc\x49\x4e\x68\x96\x41\x4a\x58\x9e\x43\xca\xa8\x36\x72\x3b\x9d\x6a\xac\x62\xd0\x60\xf5\xca\xc6\xec\x37\xf2\x46\xe6\x94\xa7\x19\x48\x32\xa5\x2c\x53\xdd\x33\x07\xda\xd0\x5c\x46\x3e\x07\x99\x33\x8e\xde\x0b\x1b\x75\x8a\xd1\xdf\xe6\xaf\x24\x11\x32\x75\xf5\x02\x98\x56\xfe\xab\x20\x26\x6a\xda\x47\x94\xec\x1a\xdb\x7b\x35\x68\x97\x4c\x32\x91\xdc\x2b\x52\x72\xcd\x32\xfb\xf2\x42\xdc\xa3\xfe\x92\x21\x3b\xe9\x3c\x74\x77\x2e\x55\xfd\x73\x54\x1d\xb0\x91\xa1\x4a\x9d\xff\xba\xfe\x0a\x3f\xe8\x48\x5c\x04\x2d\x3a\x86\x0e\x0d\x9f\x20\x89\x56\x6a\xe7\xfd\x27\x48\x5a\x85\xae\x1c\x90\xaa\xd9\x51\x0e\x3c\x39\x92\xdf\xd1\xb6\x9e\xd5\xed\x0e\x00\xad\x6e\xb6\xd8\x21\x3d\x6f\xdd\x22\xb8\x92\xbd\x7e\x4d\x32\xc6\xa1\xbd\x30\x8a\xa5\xd0\x5e\x1c\xeb\xf6\x74\x4a\x2e\x49\x99\xc4\x1a\x43\x4b\x8f\xfa\x15\x4c\x9a\xa7\x05\xcb\xf0\x08\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\x56\x98\x7e\x61\xaf\xc5\xb1\x83\xce\xae\x5e\x4a\xb1\xbc\xc8\x96\xf8\x1e\xc7\xe9\x19\x61\x3a\x46\x8c\x90\xb9\x0d\x65\xc9\xfd\xac\x38\xa8\xef\x33\xa2\x04\xd1\x92\xfa\xd2\x7a\xf6\x53\xf3\x90\x96\xa5\xbb\xd0\x4f\x8e\x7f\x3e\x3e\x23\xa0\x93\x53\xf2\x20\xf8\xb1\xc6\xe9\x1b\x93\x3b\x41\xca\xe0\x9c\x27\x52\x13\xb2\x14\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x96\x78\xdd\x10\x51\xda\x0c\x3d\x23\x5a\x04\x40\x94\x37\xdb\xfb\x4f\x4c\x3b\xf0\x0d\xc3\xbf\x5f\xe1\x6e\xb2\x57\x16\xa1\x46\x19\x59\xc0\xf9\x1c\x68\xa6\xe7\x36\x9b\x81\x0b\x3e\xfa\x27\x48\x81\x30\xe6\xdc\x7d\xf3\xc5\x95\x89\x8f\x18\xc8\xf4\x4c\x15\xd5\xcc\xb5\xf7\x0d\x74\x16\x89\xc8\x2a\x3f\xfa\xf6\xee\xee\xfa\x1b\xd0\x4d\x2e\xcf\xf1\x43\xf2\xcd\xfb\x3b\x9f\xc3\x82\x86\x7e\x90\x53\x21\xf3\x1e\xb0\xf7\x38\xc1\xb5\x23\x52\x08\xd9\x87\x5b\x66\x2e\x54\xd0\x72\x92\x67\xb8\x62\xbe\x15\x4a\x5b\x5f\x8e\xd5\x4d\x38\x26\x36\x8a\x76\x42\x86\x4f\xdf\xbf\xbc\x1e\x93\xbf\x8a\xd2\x4c\xc8\x84\x4e\xb2\x65\x55\xc8\x48\x41\x68\xd1\x53\x42\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x5b\xa0\x29\x48\x85\x0c\x1a\x68\xa4\xf2\xac\x11\x8e\x7b\x83\xb6\xa8\x4b\xf9\xb6\x54\x5a\xe4\x64\xee\x5e\xbb\x0d\x71\xee\x0e\xe7\xd8\x1e\x57\x07\x27\x2b\xa1\xb0\x4c\xdc\xfd\xe6\x8b\x63\xd1\x6b\xdc\xcb\xce\xbb\xfb\x7c\x62\xc5\xd4\xe6\xb4\x39\x07\x87\x05\x2a\x75\xbc\xcd\x6c\xd5\x68\x71\xaf\x51\xca\xfb\xc6\xcb\x19\x20\x61\xe0\xe7\xab\x1d\xa1\xb3\x27\xb8\xa7\x78\x69\x08\x24\x5a\xa8\x3d\x79\xb6\xb2\xff\x46\xa0\x75\x9b\xcf\xda\xa0\xbb\x5b\xcf\x37\x75\xce\x54\x85\x16\x90\x50\x2e\x38\x4b\x68\xc6\xfe\x09\x29\x29\x0b\xc1\x5d\x6e\x1d\x4a\xb6\x09\x55\x30\x42\xcf\x3b\xd7\xae\x16\x71\x8d\x76\x6d\xb8\x83\x16\x02\xc5\x3d\x0c\x9e\x33\xec\xde\x52\x1d\xb3\xf6\x7d\xb4\xf2\xf2\x81\xd0\xed\xcd\xb6\xe6\x50\x6f\x2d\x56\x9c\x1d\x4f\x3e\x0b\x71\x92\x44\x02\x5e\x58\xc7\x36\xd3\x82\xd0\x24\x41\x3c\x6f\x7b\x5d\x21\xe3\x55\x20\x17\xe1\xfb\x2b\xda\xbc\x1a\x11\xb0\x6f\xb2\x97\x8d\x39\x90\x84\x97\xf9\x04\x64\x0d\x0c\x29\xf5\xfa\x9c\x46\xb1\xba\xb8\x61\xed\x70\xde\x4b\xeb\x65\x0c\xca\x67\x40\x5e\x9b\x91\xff\xf0\xfb\xdf\xff\xee\xf7\x11\xc6\x31\xaf\x57\x95\x08\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\x45\xb8\xf9\xd0\xee\x23\x25\xc9\xc6\x4e\x91\x8d\x9a\x20\xfb\xac\xe9\xb1\x08\xdc\x18\xcc\x65\x63\x1f\x89\x5b\xa4\xca\x6c\xc2\x52\x59\x88\x7a\xa7\x93\x34\xaa\xe1\x1a\x35\x2a\x7c\x77\x36\x9d\x79\x86\x61\xf5\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x9a\xde\x5a\xe5\x80\x48\x5a\x4a\x5b\x95\xb6\x72\x5e\xd5\xb6\x7c\xe7\xb4\x42\x1a\xbe\x20\xe5\x5f\x41\x22\x78\x1a\xa2\x02\xc4\x12\x69\x1d\x25\x51\xcf\xdc\xad\xed\xd3\x9b\x88\xeb\xab\xc4\x0d\x86\x9a\x64\xe8\x8a\x92\x6a\x55\xe3\xf0\x49\x8b\x06\x81\xbd\xfd\xe1\xdf\xba\x3b\xc8\x92\xe2\x56\x24\xf7\x11\x4d\x64\x81\x0c\xec\x9d\x39\x69\x89\xf5\x05\xde\xbd\xbd\xb6\xc4\x99\x95\xb9\xfa\x78\x57\x43\xbf\x18\x29\x9c\x92\xef\xbd\x6f\xea\x5b\xe7\x2d\xa4\x3c\x25\xf7\x50\x84\x69\x97\x86\x61\xfa\x30\xc2\x76\x14\xe1\xd8\x95\xec\x46\x94\x39\x9b\x5e\x6d\x19\x81\x8f\xfe\xb3\x12\x71\x58\x05\xa0\x86\x73\x1e\x1d\x81\x4e\x09\x99\x52\x96\x11\x8a\x56\x79\xcd\x72\x20\x0f\x73\xe0\xd6\xd8\x5f\x47\x4b\x7c\x41\x0c\xe7\x4b\xb5\x36\x1e\xfb\x90\xf0\x37\x7b\x5b\x0d\x43\x51\x31\xbe\x6c\x35\xc0\xf1\x6c\xd9\x42\x35\x1b\xd4\x80\x5d\xda\xa0\x06\x74\x54\x03\x0a\x09\xb7\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\xb6\x84\xdb\x4c\x60\x2a\x24\xac\xc6\xdb\x34\xe2\x60\x5c\xe4\x7c\x40\x64\xf0\xc5\xf5\x65\xe5\xfb\x12\xad\x58\x17\x8b\x5c\xac\xca\x64\xee\xdd\xa4\x1c\x94\x3a\xc7\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x9e\xd5\x68\x42\xe6\x75\x81\xdb\x0f\x41\x27\xd6\x6f\xee\xc3\x8a\x1c\x4e\xac\x9f\xae\x69\x90\x3b\xbf\x9e\xd8\x44\x52\x35\x07\xcc\x9d\x85\x4f\x4c\x2b\x3b\xa8\x45\x63\xf5\x33\x6e\xe4\x85\x99\xa4\x09\x90\x02\x24\x13\x46\xc4\x28\xb9\x4e\xc5\x03\x27\x13\x98\x31\xae\xfc\x8a\x85\x90\xe4\xb7\x04\x46\x12\x31\x55\xd5\xee\x1e\x93\x9b\x56\xe5\x38\x87\x2e\x96\x88\x9a\x67\xba\x29\x3a\x8b\x34\x25\x28\xbc\xe0\x36\x28\x69\x96\x2d\xeb\x8d\xd7\x04\x08\xdd\x32\x43\xdd\x37\x84\x9d\xd9\x93\x92\xe3\x8b\xa6\x90\xd1\xa5\xcd\x20\x9f\x32\x8e\xd6\x5f\xa9\x4e\xc7\xe1\xa1\x59\x9d\x09\x14\xb2\xd1\xe7\xd6\x9d\xc1\x14\x91\x40\x93\x20\x1c\xe3\x21\x06\xec\xa9\x36\xc4\x80\x0d\x31\x60\x43\x0c\xd8\x7a\x1b\x62\xc0\xda\x6d\x88\x01\xdb\x4e\x50\x9f\x9d\x76\x43\x0c\xd8\x60\x95\x59\x6f\x43\x0c\x58\xa7\x36\xc4\x80\x3d\xd9\x7a\xc7\xa2\x87\x18\xb0\x1d\xda\x10\x03\xb6\x63\x1b\x62\xc0\x86\x18\xb0\x21\x06\x6c\x88\x01\x0b\x68\x43\x0c\xd8\xfe\xaf\x37\x38\x7f\xba\xb7\x21\x06\x6c\x88\x01\xdb\xb3\x0d\x31\x60\x2b\x6d\x88\x01\x1b\x62\xc0\x1e\x6b\x43\x0c\xd8\x10\x03\xe6\xda\x60\x6d\x5c\x6b\x43\x0c\xd8\x86\x36\xc4\x80\xed\x37\xce\xa0\x06\x84\x75\xf6\x2c\x6a\x80\xd2\xa2\xb8\x65\xb3\x00\x5c\xc8\x58\xc7\xe0\xb6\xa2\xc4\x81\x46\x2a\x57\x6c\x57\xd9\x0f\xbd\x1d\x4b\x39\xc8\xbe\x66\x44\x58\xe3\x26\x99\x80\x51\x11\xcc\x6b\x15\x21\xb7\xc9\xe5\x14\x1d\xc8\x0d\x24\x37\x73\x2a\x3c\x4c\x20\x6b\x95\x75\x68\x8b\xcf\xfe\x76\x63\xdc\xe8\x2e\xdd\x29\x68\xcc\x47\x42\xb9\xad\x8c\xea\xca\x64\x9b\xeb\xfd\x5a\xa4\xca\x57\x92\xe0\x82\x8f\x2c\x58\xeb\xd8\x10\x3c\x16\x6a\x1c\x60\x0d\x0e\x44\x66\xb3\x31\x72\xd7\x52\x4c\x0e\x86\xce\x76\x8d\xf1\x47\x2c\x71\x01\x7a\x62\xda\x42\x5c\xb3\x04\x76\x44\x5a\x6b\x07\x86\x61\xb1\x66\x0f\xc1\xc5\x1c\xc3\xae\x82\x02\x0f\x89\xe6\xb6\x77\xe4\x94\x47\xa9\x54\xe7\x85\xb0\xff\x57\xc7\x4d\x35\x02\xa6\x3a\xfb\x51\x0e\x0c\x2f\x17\x12\x25\x75\xb0\x08\xa9\x9e\x44\x98\x45\x88\x8a\x8a\x29\x2b\xf5\x34\x1a\xaa\x9f\x91\x50\x7d\x8c\x82\x3a\x44\x04\xd4\xc1\xa3\x9f\xe2\xb8\xd5\x23\xb8\xd4\x23\x49\xa4\xcf\xe0\x9e\x72\x81\xf4\x77\x73\x09\x6a\x2e\xb2\xce\x0c\x27\x16\xb3\xf9\xc0\x38\xcb\xcb\x1c\xab\x50\x18\x9e\xc2\x16\x55\xb0\xbf\xf2\x2c\xc3\x5d\xf7\x36\xe2\x00\xcb\x55\xa4\x80\x65\xc0\x29\xcb\xcc\xd6\x42\xb0\xd0\x39\x5d\xa0\x50\x5a\x26\x09\x40\x1a\x22\x96\x36\xad\xd5\xbf\x1b\x57\x14\x5a\x8c\x7e\xa6\xc8\xeb\xb0\xab\x26\x4c\xef\x69\x98\xf3\x7e\xf7\xdb\x4e\x7d\xcc\x64\x11\xe7\x96\xfe\xe6\xe6\xfa\x6d\xeb\x96\xc6\x0f\xbe\xc5\x63\xfc\x76\x0e\xc9\xfd\x8d\x0b\xa5\x39\xdc\xcd\x1c\x6e\x66\x0a\x32\x31\xc5\x10\x0c\x42\xad\x28\x6d\x1f\xb2\x90\x7a\xc5\x05\x3a\xc3\x55\x04\xb9\x60\x09\x8c\x5f\xc0\x50\x11\x4b\xf9\x0f\x3f\x08\x04\xdd\x04\xf8\xe2\x7d\x11\xbb\x6e\x2d\x39\x95\x87\xa1\x61\xa3\x72\x94\x62\xd0\x68\x46\x93\x6a\x6d\x66\x9b\x0f\x5d\x10\x19\x27\x0a\xa0\x52\x68\x66\x4c\xcf\xcb\xc9\x38\x11\xf9\xb9\x61\x1d\xf6\xff\x26\x99\x98\x9c\xe7\x54\x69\x90\x46\xc7\x71\xd7\xfa\x28\x31\x14\x30\x3e\x1b\xe7\xe9\xe9\xf8\x57\x41\x34\x5c\x3a\x5b\xb9\x4b\xc3\xda\x62\x24\x98\x80\xe1\xfb\x42\xae\x58\x0b\xcc\xa4\x84\x6f\xd2\xe0\xfb\x3b\xb4\xa8\x48\x60\x58\xf2\x41\x42\x92\x07\xae\x4d\x22\x38\x04\x62\x32\x95\x7e\x84\x1d\x3f\x5b\xc8\x71\x94\xb3\x1a\x29\xd4\xb8\x47\x61\xc6\xbd\xd1\x85\xfa\x12\x5a\x1c\x2d\xac\x38\x56\x48\x71\x94\x70\xe2\x18\xa1\xc4\xf1\xc2\x88\xe3\x84\x10\xc7\x0f\x1f\x7e\xb6\xd0\xe1\xcf\x22\x6c\x38\xa2\x7f\x2c\x52\xb8\xf0\x4b\x84\x0a\xf7\xd7\x06\x43\x22\x84\x07\xbf\x5c\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x03\x84\x02\xbf\x84\xff\xff\xd9\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\xcf\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x22\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x41\x46\x97\xb7\x61\x81\xa0\xb1\x56\xe2\x6a\x2d\x58\xd4\x9a\xad\xdb\x71\x0d\x73\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\xfa\xe7\xb9\x26\xbd\x31\x8f\x5b\x5c\x95\x9e\xec\x9a\x6f\xc5\x03\x11\x53\x0d\x9c\x9c\x30\xee\x77\xce\x69\xc3\x4a\x53\xbb\x47\x82\xfd\x1d\xa6\xd7\xd7\xaf\xfc\x20\x5f\x9e\xdf\x03\x3d\x43\x4a\xf5\xda\xf3\xe5\x68\x7c\xda\xf5\xe5\x1e\x9c\x96\x59\xdb\xfd\x65\x5d\x62\x71\x7c\x5f\xaf\xc7\xe4\x83\x13\x27\x5e\x23\x3d\x15\x2b\xa2\x3c\x25\x0e\x9f\xeb\xcb\xdb\x27\xc1\xa1\xee\x6d\xe5\xa6\x8a\x4d\x6f\xc7\xb3\xd8\x1b\xd8\x48\x99\x82\x50\xf3\x14\x0a\xa0\x83\xd1\xb5\x37\x46\xd7\x03\x45\x60\x7f\x79\xda\xd6\xcb\x47\x5c\x0f\xda\xd6\x2f\x45\xdb\x6a\xc0\xe2\x7d\x23\x69\x02\xd7\x7d\x12\xde\x3c\x03\xa9\x13\x01\x6b\x19\xae\x62\x17\x1c\xc0\x26\x8e\xd5\xa0\x87\x88\xef\x37\x2d\xb3\x6c\x69\x6d\x88\x2d\x04\xcc\xee\x5b\xeb\x6e\x0e\x6b\xd0\x81\xe8\x4a\xdd\x40\x5d\xad\x9b\x14\x52\x38\x89\x44\x96\x9c\x1b\x11\xc3\x1d\x27\x43\xbc\xd1\x45\x14\xf0\xee\xe6\x74\xda\x02\x36\x74\x41\xe8\x18\xe8\x39\x07\x52\xe7\x2f\xb5\x09\x31\xa3\x4e\x85\x4c\xd8\x24\x5b\x92\x39\xcd\x8c\xb2\xe4\x82\xb4\xef\x59\x96\xb9\x6e\x02\x82\xc2\x41\x5b\xd7\xb3\x95\x68\x32\xc1\x67\x38\x19\xd4\x12\x02\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x4a\x4f\x67\x50\x54\x7c\x63\x74\xa6\x08\x67\xd9\x99\x9f\xf2\x36\x04\xe6\xfa\x9e\xaf\x4d\xca\x0a\x52\x87\x5e\xf9\xc0\x14\x9c\x61\x9f\x9d\x69\xb2\xb4\xf8\xaa\xfd\x76\xdf\xd8\xcf\x0a\x29\x16\x2c\xad\x63\xf4\xcd\xb6\xc0\xf8\xf8\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x51\x14\x8f\x1d\x43\xb3\x11\x9d\x76\x7c\x1b\x3f\xc8\x53\x96\x50\x0d\x0a\x73\x12\x5a\xd0\xb6\x0b\x46\x3b\x53\x62\xde\xa7\xb1\xa3\xc8\x09\x17\x44\x60\x66\x61\xc9\x99\x5e\xa2\x47\x6f\x5e\x6a\x92\x8a\x07\x7e\x1a\x72\x30\x6d\x98\x03\x25\x13\xd0\xb4\x4e\x0e\xf4\x22\x99\x22\xc0\xe9\x24\x33\x67\x0f\x23\xfe\xef\x36\x6e\x00\x32\x05\xaa\x4b\x09\x64\x46\x75\x00\x97\xd8\x20\xcd\xdb\xf5\x7c\x7c\xdb\x31\xe5\xfc\x75\x53\x52\x72\x05\x81\x82\x6c\x34\x15\xa0\x63\xc6\xab\x39\xd1\xa2\xd4\x3d\xb9\x47\xb6\x99\x8e\x6c\xe6\x4e\x43\x49\x64\x39\x28\x22\xca\x00\x4b\x5e\x4b\xfd\x73\xc3\xc5\xd4\xf0\x06\xbb\xd3\xc6\xd6\xd5\x6d\x1a\x63\x87\x5d\x35\xa4\xf2\x06\x3e\x81\x0f\xb7\xb2\x19\xd4\xef\xae\x6e\xff\xfe\xfd\xc5\xff\x7a\xff\x7d\xb7\x85\x7f\x4f\x93\x79\x13\x5b\x9c\x13\x8a\x17\x05\x32\xf9\x39\x5d\x00\xa1\xa4\xe4\xec\xbf\x4b\x17\xf2\x76\x52\x8d\xd7\x91\xad\x46\x49\xef\x09\x12\x7c\xcd\x2d\xd1\x89\x73\xc4\x58\xd3\xef\x99\x42\xa0\x6a\x24\xc2\x05\xfe\x0b\x05\x64\x2a\x45\xbe\xa2\x68\x91\xab\x2a\xb8\x6e\x69\x6e\x18\x6a\x55\xb3\x39\xc8\x6e\x12\xf9\xbb\x8f\xef\x6f\x31\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x31\xb9\xe0\x4b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x1a\xe3\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xcd\x32\xeb\x34\xb2\xd5\x5f\xd9\x24\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x8c\x25\x24\x07\x39\x03\x52\x50\x9d\xcc\x49\x4e\x97\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x5a\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\x6f\x37\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xfc\xf5\xab\x3f\xfe\xf6\xf7\x1d\xd5\xeb\x88\x07\xb7\x6b\xe8\x53\x40\xc8\x53\x3b\xfc\xcb\x6f\x30\x0c\xba\x6e\x21\xc3\xb8\x1d\x62\x77\x3e\x72\x43\xc5\xf8\x2c\x0b\x36\x80\x04\x9b\x01\x43\x8d\x80\xa3\xfa\x0d\xae\xbb\xda\x02\xc3\x2d\x81\x2d\x1a\xba\x9b\x52\xe2\x59\xc1\x6a\x09\xce\xdb\xbd\x1c\x43\x16\xbc\xa1\xd8\x5d\x5e\x7b\x2e\x15\x62\x3f\x42\x6d\xa2\x32\x4c\x59\xf4\x11\x3b\xac\x8d\x77\x38\x23\xaf\xc8\x7f\x90\x4f\xe4\x3f\xd0\x0a\xf6\x87\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x0b\xa5\x2f\xaf\x23\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x99\x30\x67\x8e\x80\x4f\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xb9\xec\xee\xd0\xe0\x82\xcb\x69\x3b\xfa\xff\x85\xf6\x37\x0e\xfc\xad\x50\xfa\xca\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x73\x16\xc0\x1c\xfa\x73\x62\xc3\xe2\x44\xe3\x6d\xdd\xc7\xb6\xd6\x8a\x4d\x1f\x2d\x32\x4e\x49\x69\x94\xa5\x29\x44\x3a\x46\xfd\x26\x80\x0a\x33\x1b\x69\x43\x18\x78\x44\x35\x1a\x5b\x7d\xad\xf2\x0e\xe3\x81\x33\x1c\x2b\xa1\xbc\xab\x0c\x6b\x9b\x84\x29\x48\x69\xf3\x84\x27\x4b\x9f\x6e\x14\xbc\xdb\x82\xb8\x5c\x21\x85\x16\x89\xe8\x0c\x9b\x12\x73\xab\x5c\x3b\x5a\x70\xee\xd1\x57\x5b\x79\xc7\xff\xfc\xee\xfa\x8c\xdc\xbd\xbd\x3e\x23\x42\x92\xdb\xb7\x61\xc1\x4f\x4d\x13\xcc\xd1\xdd\xdb\xeb\xa3\x83\xae\x40\x23\x87\xe9\xee\xed\x75\x87\x4e\xd6\xc3\x67\x73\x5a\x8c\xee\x61\xd9\x51\xba\x8b\x21\x61\x8e\xaa\x8d\x15\xe5\x85\xec\x34\xe7\xb4\xd8\xbb\x37\x09\x34\x65\xbd\x46\x72\xf1\x59\x87\x15\xa5\xf1\x20\x5d\x72\xb1\x80\xd4\x6a\xcd\x7e\x14\xe0\x69\x21\x98\xd1\x91\x06\x9c\x97\xc7\xda\x80\xf3\xb2\x7f\x1b\x70\x5e\x36\xb5\x01\xe7\x65\x8f\x36\xe0\xbc\xd8\x36\xe0\xbc\xb4\x09\xe9\x63\x8e\xd1\x80\xf3\xf2\x64\x1b\x70\x5e\xb6\xb6\x01\xe7\x65\xaf\x36\xe0\xbc\xac\xb7\x01\xe7\xe5\x91\x36\xe0\xbc\x54\x6d\xc0\x79\x19\x70\x5e\x3e\x5f\xae\x3d\xe0\xbc\xac\xb6\x01\xe7\x65\xc0\x79\x19\x70\x5e\x9a\x6d\xc0\x79\xd9\xd2\x06\x9c\x97\x01\xe7\x65\xc0\x79\x79\xbc\x0d\x38\x2f\x9d\xdb\x80\xf3\xb2\x5f\x1b\x32\x0f\xf7\x6c\x03\xce\xcb\x80\xf3\xb2\xda\x06\x9c\x97\x27\x5b\x3f\xcc\xe3\x03\xce\xcb\x80\xf3\xf2\x68\x1b\x70\x5e\x06\x9c\x97\x47\xdb\x80\xf3\xd2\xa1\xf5\xce\xe8\x3a\xe0\xbc\x0c\x38\x2f\x8f\x8d\x31\x68\x5b\xfb\xb5\x01\xe7\x65\xc0\x79\x59\x6b\x03\xce\xcb\x7a\x1b\x70\x5e\x06\x9c\x97\x01\xe7\x65\xc0\x79\xa9\xda\x80\xf3\xf2\xa5\xdb\x9d\x24\x28\xf6\x4f\xb8\x16\x19\x4b\x96\xc1\xd9\x3e\x37\xa0\x44\x29\x13\x73\x63\x63\xb7\xa4\xc0\x7e\x2b\x8b\x42\x90\x90\xdd\x33\x08\x85\x9b\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\xe7\x98\x82\x5e\xc0\x29\xf8\x17\xbc\xea\x1e\x41\x30\xf2\xe5\xb3\xed\xf4\x75\x33\x96\x06\x6b\xed\xcd\x17\xe9\x43\x3a\x67\x13\xf6\xa8\xda\x45\x5a\x54\xcc\x96\x6d\xdd\x5c\xb4\x28\x32\x16\x92\x18\x4b\xc8\x6d\x89\xd2\x05\x38\x17\xb8\x7a\x43\x92\xa2\x3c\x23\x39\xe4\x42\x06\x24\x46\x44\xd0\xe0\x5a\x5b\xa5\x0f\xeb\x74\x63\x09\xf2\x93\xaf\x05\xce\xff\xd2\xea\x0b\x35\x4a\x55\xb5\x56\xcc\xb3\xc3\xa0\x58\xb3\xcb\xe9\x6a\x30\x2a\xd3\x2d\x2b\xd0\x95\xd0\x37\xee\x70\x1f\x6c\xbd\x22\x47\x2c\xf8\x29\x3c\x18\x6a\xd5\x5b\x91\x17\xa5\x86\xd6\xc5\x66\xa7\xd8\x2a\x1d\x4c\x85\x32\xf4\xc3\x64\x83\x26\x82\x4f\xd9\xcc\x69\xdf\xe7\x39\xe5\x74\x06\xa3\x6a\xb6\x47\x35\xd4\xc3\x79\xe7\x8b\xfa\x60\xa9\xa0\x49\x46\x59\xf7\xc0\xc1\x58\x6c\xe2\x2d\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x7c\x56\x85\x8d\x33\xcb\x37\xc6\xfe\x2b\xfb\xe3\xb3\x00\xed\x91\x6a\xb4\x55\xa0\x62\xb4\x61\xa7\x86\x29\x8c\x56\x4d\x4c\xa1\x00\xa3\x11\x58\x03\x6a\x77\xb9\x7f\xc9\x69\xce\x12\x7f\xc2\x2e\xb2\x4c\x24\xd6\x26\xd3\xd6\x2a\x63\x90\x6c\x94\xdd\x3c\x2f\x35\x9d\x64\x30\x26\x97\x16\xa2\x42\xf0\x6c\x69\xce\x9f\x02\xed\x43\x14\xdc\xe6\x0f\xd3\x24\x43\xe2\x5f\x03\x63\x5f\x37\x0a\xe5\xb8\xa9\x2c\xa6\x06\x70\xc3\xca\x04\x07\x02\x5c\xcb\xa5\xd9\x7f\xd7\x22\xbd\x35\x5b\xb0\xf5\x74\x30\xd4\x46\x60\xc8\x6b\x8c\x70\xd7\xc0\x50\xd7\x38\x01\xaa\xe1\xc1\xa9\x71\x03\x53\x6b\x17\x82\x45\x0a\x6a\x66\xfc\xb4\xb6\x45\x21\xd2\xf1\x06\xd6\x44\xc4\x34\x90\x02\x33\xe2\xb5\x48\x8d\xd0\x24\xc1\xf2\xa7\xea\x8c\x5a\x03\xe2\xa5\x21\xee\x1e\x2d\x7e\x54\xd7\xd2\x14\x5d\x50\x96\x99\x03\x1c\x48\xc0\x3a\xea\x62\x98\x57\x26\x92\xaf\xc2\x05\xe7\xf7\x69\xb3\xb8\xb4\xae\x56\x66\x58\x32\x17\x0a\x38\xf2\x4b\x5a\x65\xf0\x54\xf9\x05\x8e\xc5\xa4\xf6\x2e\x0e\x8d\x22\xbe\x9c\x12\xc8\x0b\xbd\x3c\x23\xb0\x00\xb9\xd4\x73\x8c\x36\xa8\x70\x43\x91\xad\x31\x45\x72\x9a\x36\x76\xc7\x19\x11\xde\x00\x1d\x38\x3c\xde\x0f\x4e\x27\x2b\x33\x6d\x35\x34\xa6\xaa\x34\x8a\x43\xef\x9a\xd8\x70\x36\x24\x94\x69\xc6\x84\xa3\x21\x08\xa5\x9a\xb3\x6e\xc0\xb5\x24\xe2\x59\xf8\x1e\xa9\x68\xa4\x8e\x98\x2d\x91\xd3\x4f\x68\x9e\xa4\xb9\x28\xb9\xb6\x38\x35\x56\x63\xa8\xa4\x3c\x9b\x60\xf3\x82\xf1\x72\xcf\x2a\xdb\x93\x38\x57\x3b\x4d\x3d\x34\xc5\x75\x8c\x3c\x65\xaa\x35\x48\xfe\x86\xfc\xef\x93\xbf\xfd\xe6\xe7\xd1\xe9\x9f\x4e\x4e\x7e\x7c\x35\xfa\xf7\x9f\x7e\x73\xf2\xb7\x31\xfe\xe3\x5f\x4f\xff\x74\xfa\xb3\xff\xe3\x37\xa7\xa7\x27\x27\x3f\x7e\xf7\xe1\x9b\xbb\xeb\xf7\x3f\xb1\xd3\x9f\x7f\xe4\x65\x7e\x6f\xff\xfa\xf9\xe4\x47\x78\xff\xd3\x8e\x9d\x9c\x9e\xfe\xe9\xab\xee\xde\xc7\x50\x57\x7b\x3c\x47\x7b\x24\x37\xfb\xb3\x38\xd9\x1d\x8f\x3d\xf8\xe1\x77\x57\xe0\xda\xf1\x77\xde\x89\xc7\x8e\xbf\x0c\xb6\xc9\x5c\x4e\xeb\xf1\x99\x22\x22\x67\x5a\x43\xea\xee\xde\x06\xf6\xcd\x8a\x3d\xc8\x31\x2c\x84\xad\xa2\x78\x7b\x37\x30\x58\x6a\x33\x52\x67\xb2\xaa\xfb\x15\x2d\x60\x9c\xb0\xbc\xc8\x20\x07\xae\x91\xf1\x8c\xbc\x6e\x8b\xe6\xc4\x71\xfd\x06\x89\x35\x78\xc0\xa7\x04\x20\x75\x44\x0e\xbc\xb1\xd1\x06\xde\x38\xf0\xc6\xa7\x5a\xb0\x4d\x3c\x06\x63\xbc\x69\x12\xe1\x6c\x59\xca\x4b\xca\x68\x21\xaf\x20\x12\xc4\x14\x03\x25\x16\x2c\x2d\x69\xd6\x44\x92\xf5\xe0\xa2\xdd\x38\x00\x9a\x76\xda\xa1\x21\xe8\xa6\x85\x05\x64\x15\x11\xd6\x4c\x3f\x26\x7f\xb1\xe1\x3c\x4d\x45\xb3\x6d\x50\xef\xe6\x90\xdb\xf4\xba\x6d\x44\x08\xa7\xea\x1e\xab\x15\x92\xaa\x68\xa3\x3a\x09\xc3\xec\xb6\x6e\x53\x71\x51\x71\x8d\x6c\x79\x46\x14\x68\x9b\x63\x33\x87\x95\x65\xa2\x8a\x1c\x5d\x64\x0f\x74\xa9\x8e\x2a\x9f\x24\xe3\x4c\xaf\x14\x1f\xe8\x44\x03\x62\xc3\x9a\x0e\xa7\xc2\xc8\xbc\x58\x55\x61\x3a\x85\xa4\xa3\x36\x6b\x31\x38\xd6\x69\x73\xf1\xe8\x9a\xf1\xd2\xbc\xad\x9f\x55\x48\x89\xe0\x9d\x06\x82\x4f\x4c\x93\x92\x6b\x96\x19\x61\x9d\x48\x98\x95\x19\x6d\x1a\x02\xdd\x9b\xf9\x30\xb9\x74\x4c\x3e\xf2\x04\x9a\x0f\x77\xb3\x54\xaf\x0c\x60\x84\x87\x0c\x34\xa4\x67\xd8\x75\xfb\xd5\x95\x0d\x34\x6b\x9d\xfc\x6a\x29\x3b\x0d\xef\xe7\xb2\x0a\x24\x1a\xdb\x03\x55\x45\x39\x90\x94\x4d\xa7\x66\x64\x54\xb6\xb9\x90\x39\x5d\xa7\x8a\xf2\xb4\xd3\xe8\xe6\xe4\x62\x7a\x49\x13\xe5\x17\x2b\xbb\x1c\x29\x96\x42\x42\xe5\x51\xb3\x26\xc8\x45\xa6\xe7\xa2\x9c\xcd\xeb\x5d\x11\x36\xe5\x44\x69\x0c\xaf\x32\x93\xa9\xbc\xe5\x62\x65\xb3\x29\x23\xb3\xf0\x04\xac\x68\x25\xc0\x32\x8c\x07\xda\x71\xec\xb5\x10\x00\x1b\xd3\x6d\xd7\xdc\xe7\x5c\x61\x0c\x1f\xa4\x8d\x04\x39\x0e\x9f\x74\x84\x17\x1e\x93\x4b\x0b\x78\x71\xd6\xee\xb5\x35\x25\x76\x32\x1a\x31\x6c\x3e\x1a\xb3\x63\x00\xdf\xca\x00\xac\x4a\x31\x43\x5c\x62\xdb\x39\xe5\x4b\x9f\xd1\x81\x31\x66\x36\x13\xad\x4a\x32\xc9\xba\xd9\xd0\xab\xb3\xf4\xe2\x65\x76\x5a\x27\xf4\xa6\xcc\x0e\xe7\xbd\xbc\x69\x16\xf8\xc8\x5c\x01\x1e\x69\x28\xf2\x59\x3d\x73\x48\xee\xed\xc9\x4b\xc1\xb2\x37\x70\x38\xb7\xa1\xa7\x6b\x2e\xca\x2c\xb5\xa8\xba\x35\x77\x46\x4e\x6b\x43\x28\x2d\x19\x54\x02\x01\xa3\x21\x20\xf4\x08\xeb\xc6\xbe\x85\x4c\xcd\xf6\xb6\x2c\x19\x3b\xb6\x56\x6d\x9f\xee\xe2\x48\x42\x2e\x9f\x08\x6e\xef\xc9\x33\x77\x73\xe7\x94\xf1\xae\xa2\x5d\xfd\x0e\x6c\xc6\x85\x44\xa3\xf5\x94\x70\xd1\xa6\xa1\x7d\xe4\x57\xa8\xe8\x2c\x73\x54\x71\x48\x1b\xa5\x9d\x7a\x39\xed\xf8\x0f\x73\x30\xda\x5a\x9b\x96\xae\x6c\xbb\xb1\xa2\xd2\x70\xc4\xb1\x21\x46\x69\x49\x11\x26\xd9\xe5\x53\xc8\xae\x1b\xdf\x08\xdd\x17\x9a\xe4\x42\x69\xf2\xdb\x57\x8d\x39\x0e\xb2\xa3\x8d\x08\x9e\x44\x74\xf8\x55\x62\x0a\x22\x5d\x50\xcc\x85\xea\xda\xeb\x65\x0a\x5c\xb3\x84\x66\x0d\x42\xcd\x25\x31\x15\x72\xc2\xd2\x14\x30\xb4\x1d\x0b\x42\xa0\xca\xd9\x51\xd3\x45\xd1\xb5\x1e\xa0\x11\x03\x52\x6f\xac\x0f\x7f\xbe\xbd\x43\x1f\x66\x5b\xde\xab\x75\xfe\x6e\xa2\xd1\xc2\xbc\x82\x36\x4c\xa1\xb9\x9f\xad\x38\xdb\x1a\xe9\xcb\x08\xe9\x33\xef\x63\x76\x4a\xc3\xd0\x33\x17\x0f\xeb\x7c\x84\x19\x91\x8d\xa7\x9d\x13\x1e\x7b\x10\xc7\x67\x37\xfe\x81\x62\xef\xec\xe0\x7d\x88\xe6\xba\xad\x72\x23\xcd\xc6\xa6\x2e\x33\x92\xde\x03\x37\xac\x6c\x7d\xe1\xa7\x15\x86\x16\x93\x68\xee\x0a\x81\x86\xc2\xd3\x4c\x35\x53\xe6\x34\xdb\x8b\x11\xdd\x4d\x85\x70\x15\xdc\xaa\xb8\xe7\x23\xb7\x39\x8f\xcc\x65\xed\x99\x7d\x18\xa6\x75\x04\xc7\x67\x04\xeb\x88\x99\xd5\xb7\x22\x0d\xb1\x71\xad\x84\x3b\x54\x42\x8f\x4d\x99\xc1\xfb\x36\xb5\x32\x0f\x0a\x3c\x66\x5d\xdb\xab\xfa\x65\xc4\x39\x98\x33\x49\xb5\xe8\x6e\xef\x8a\x13\xeb\xe0\xc9\xe8\x97\x0b\xbb\xb5\x29\x24\x64\xf6\x3a\x9e\xb3\x82\x4c\x40\x3f\x00\xf0\xcd\x72\x5a\x0a\x27\xea\xd4\x1b\x6a\x02\x89\xa8\x43\x43\x6d\x88\xed\x98\x5c\xb7\x8e\x39\x5e\xee\xe1\xc8\x6e\x97\xfc\xcd\x2a\x8b\x42\xc5\xcb\xb3\x19\xcf\xc2\x36\xbc\x2b\x06\x48\x85\x85\x73\x55\x2f\x0b\xa8\x6d\xac\xbd\x73\xf0\xeb\x5d\x09\x1d\xf6\x86\xc1\xaf\x66\xe4\x3b\x67\x30\x78\x96\xb7\x8c\x14\x49\xe2\xe2\xb8\x7b\x74\x0a\xdb\x57\xad\x9b\x3b\xb7\xf5\x2b\xe6\xdc\x0a\xc1\x6b\xb0\xef\xd0\x9d\x53\xe9\x14\xbf\xff\x3d\x01\xeb\xa8\x8a\xa0\x57\xf8\x16\x07\xf2\x32\x0a\xe8\x65\x3c\x9c\x6b\x12\x0d\xeb\x9a\x3c\x12\x16\xd2\x0d\xdd\x35\x72\xa4\xb9\x82\xa4\x94\x4c\x2f\x8d\x2e\x00\x9f\x3a\x19\xac\x63\x9c\x95\xdb\x36\x19\x2d\xa7\x8a\x27\x91\x88\xc2\x56\xf0\x58\x29\x8f\x5d\x5b\x5c\x4a\x8e\xb6\xe2\x6e\x3b\xfa\x72\x6a\x56\xc4\x9a\x47\xd0\x51\x82\x41\xcb\xab\x84\x79\xa7\x8b\x95\xb1\xfe\xbb\x64\x0b\x9a\x19\x36\x5c\xff\xe2\x1a\x33\x34\x9b\x3f\x7a\xce\xc8\x76\x4d\xd5\x7d\xed\xde\x85\x51\x21\xd2\xda\x9b\x7b\xee\xa7\x0e\x3f\x82\x4f\xfa\x33\x8c\x6a\x47\x2e\x75\x2d\xd9\x82\x65\x30\x83\xf7\x2a\xa1\x56\x84\x39\x74\x64\xc4\xc5\x16\xba\x70\x67\x4a\x91\xa9\xca\xf6\x44\x7d\x7e\x3a\x1a\x61\x66\x94\x71\xac\xed\x1c\x20\xad\xba\x41\x95\x4d\x90\x67\x5a\x91\x82\x4a\xb3\x0b\x7d\x22\xbc\xf5\x67\x4c\x84\xc8\x5c\x31\xa0\x6c\x59\xd3\xc5\xba\x87\xb0\xa2\x01\x5d\xfc\x9d\xc3\xc3\xdf\x0d\x15\x8a\x4c\x33\x3a\xab\xfd\x29\xe6\x62\x5b\x95\x27\x83\x73\xf3\xb7\x4e\x34\x56\xba\x29\xcd\x3d\xf6\x40\x97\xaa\x46\x2d\x68\x9a\xdd\xbb\xdf\x28\xaf\x4f\x91\x9f\x50\x45\xaa\xb1\xbb\xf9\x7b\x4c\xfb\xed\x29\x1a\xf7\xdf\x5e\x5c\xff\xfd\xf6\xaf\xb7\x7f\xbf\x78\xf7\xe1\xf2\xaa\x73\x67\x57\x42\x83\x0d\x6d\x69\x38\x75\x93\x2a\x9d\xc6\xac\x42\x95\x91\x35\x16\x6a\x8c\x71\xab\x08\x99\xcb\x53\xf1\x10\x18\xdc\x6f\xf6\x14\xd0\x6e\xd6\x13\x5a\x14\x17\x32\x17\xf2\x5a\x8a\x29\xcb\x3a\x4b\xfc\xb1\x4e\xf0\x0a\x39\x3e\xcc\xf7\xc2\x7d\x5c\x5f\x37\x16\xc5\x71\x3d\x9b\xa4\x71\x65\x30\xc4\x0a\x34\xdd\x74\x0f\x2b\x5a\x75\xe7\x1f\xab\x55\x12\xbb\x1f\xa2\x83\xee\x99\x83\x63\x64\x19\x32\x3a\xfe\x3c\x86\x69\x20\x13\x09\xcd\xb0\x4a\x74\xd8\xc6\x27\x91\x15\x93\x55\xba\x1a\x98\x1e\xd4\x6f\x67\x92\x09\x9a\x5a\x1f\x96\x65\xfe\x29\xf8\xda\x65\x5e\xec\xc2\xac\x85\x20\x42\xee\x2c\x9e\x02\x8e\xe7\x41\x48\x0a\x09\x95\x54\xb3\x32\xbc\xb0\x25\xdb\x82\x86\xfc\xd0\xce\x01\x71\x6f\xd9\x82\xcb\x0a\x3d\x73\xd5\x30\xee\x80\xb1\x29\xda\x53\xd0\xce\x69\x14\xf5\x65\x61\x0d\x9c\xdf\xfb\x65\x08\x28\x2f\x1b\x49\x79\xc6\x4e\x7a\xb2\x3b\xed\xfc\x54\x3b\xd2\x26\x83\xdf\x33\x33\x83\xd3\x9a\x49\xfb\x6d\xe3\x65\x10\x9b\x11\x1e\xb8\x1f\x7f\xc0\x42\xe6\x9e\xff\x47\x30\x4e\x55\x4b\x4c\x46\x8d\xa3\x55\x48\x18\xad\x1f\xaf\x50\x7d\xff\xa6\xe4\x9a\xe5\xe0\x11\x46\x47\x2b\x32\x91\xb4\x5f\x1f\xab\xaa\x9e\x4f\x94\x8d\x4e\xc8\x9f\x39\x9e\x57\x0e\x29\x19\x11\x2e\xea\x25\x02\x3e\x15\x32\x41\xc3\xc3\x41\x37\x78\x42\x0b\x3a\x61\x19\x0b\x61\xe6\xb1\x36\x38\x96\xc7\x6c\xd0\x83\x31\x40\x69\x7a\x9e\x4a\x51\xd8\x9b\xd8\x43\x7f\x85\x67\x65\xb6\x21\x66\x9a\x95\x9c\x9c\x25\xaa\x45\xc8\x4c\x52\xae\xeb\xf8\xbd\xb5\x8d\xf3\x4b\x94\x41\x62\x08\x01\x34\x8d\x57\x68\xf6\x22\x35\x3c\xa3\xb9\x6c\xc1\xe7\xaa\x6f\x45\x6b\xde\xfa\x97\x6b\x60\xcc\x90\xeb\x8f\xb7\x97\xff\xef\xca\xb9\xe9\x2e\xda\xd9\xd6\xef\x92\x15\x86\x1f\x44\xdb\x36\x37\xae\xce\xf7\xb0\x71\xbe\xec\x8d\x53\x19\x88\x0e\x8e\xb7\x7d\x53\x36\x3d\xce\x8c\x37\x48\x23\x79\x90\xac\x73\x5d\x41\x53\xb6\x7b\x6d\x06\xe8\x4a\x20\xe6\x11\xae\x19\x86\x4b\x37\xac\xb5\x5a\xd8\x52\xd6\x4e\xec\x0a\x2b\xc5\xd0\xbc\x5d\xa7\x34\x53\x9f\xeb\x15\x19\x62\xda\x29\xa4\x48\x3e\x88\x92\xc7\x01\xf0\x0e\xd8\x71\x15\x21\x24\x05\x2e\xb4\xb3\xa6\xa0\x2e\x21\xa6\xf8\x2d\xb1\x39\x6b\x8d\xda\x1c\x2d\x39\x27\x40\xcc\xba\x6b\x88\x56\x55\xfc\x8a\x97\xc3\xad\xfe\x52\xaa\xb5\xc0\x48\x27\x57\xd5\x29\x6c\xd3\x80\x48\x06\x09\x34\xb5\x81\x34\x54\xcf\x2d\x68\x7c\x4e\xd5\x3d\xa4\xf6\x83\x40\xc0\xcc\x0a\x1c\x13\x43\xe1\xfc\x4c\xdf\x99\xc9\xf5\x98\x25\x68\x10\xb6\x41\xb6\x88\xa0\x19\xa2\x8a\x1d\xf4\x34\x04\x30\x76\xb3\x08\x1f\x79\xb6\xbc\x11\x42\x7f\x5d\xd5\xc4\x3f\xf4\xc9\xf8\x4b\x15\x0a\xdb\x34\x62\xa2\x5d\x9a\x22\xc9\x23\xdc\x38\xc8\x17\xa7\x15\xd5\xe1\x25\x2e\xcc\xca\xfd\x42\xb9\xa2\x2c\xf9\x85\xfa\x46\x8a\xb2\xb3\x0c\x17\x53\xdf\xfc\xe6\xf2\x1d\x5e\x7c\xa5\xc3\x54\xe6\x5a\x2e\x0b\xc1\xb8\xf6\x16\xaf\x88\x4e\x9b\x3f\x3b\xf4\xea\x26\x67\x0b\x06\xaa\x25\xe4\x03\x5d\x12\x9a\x29\x51\x99\xd4\xf8\x26\x77\xab\xf7\xe5\x9a\xaf\x27\x42\xcf\xd7\x9c\xb8\x5d\x53\x77\x4c\x5b\x1f\xef\xac\x01\xcd\x5c\x07\xc4\x30\xbe\x36\xac\x46\x54\x97\x42\x42\x02\x29\xf0\xe4\x73\x3d\x11\x87\x46\x0a\xc6\x53\x75\x25\xb8\x61\xaf\x87\x3e\x57\x97\x95\x7d\xd2\xad\x46\xf3\x14\xa1\x29\xdb\x39\x11\x29\xa2\x6a\x23\x73\x2d\x55\x48\xe4\xe9\xe5\x14\xbd\x9e\x76\xd3\x7d\x57\x4e\x20\x33\x8b\xcd\xb2\xcc\x47\xdb\xdb\xd0\x04\x96\xd3\x19\x10\xaa\xab\x43\xa8\x05\x01\xae\x4a\xe9\xf6\x4d\xc7\xac\x2a\xd3\xaa\x84\x30\xf7\x6a\x7f\xbe\x7c\x47\x5e\x91\x13\xf3\x6e\x36\x62\x70\x4a\x59\x86\x40\xdd\x3e\x56\xb7\xa9\x03\x4c\x7d\x4e\x59\xd0\x14\x20\x1f\x21\x42\xda\xab\xe5\x8c\x70\x41\x54\x99\xcc\x1b\x19\x07\x95\x45\xd8\x55\x6d\x0a\x02\x22\x19\xd8\x4e\xbc\xfb\xf0\xcf\x0a\x3a\x87\xc8\xc6\xbc\x0e\xff\xfc\x82\xd7\x61\x53\x45\x34\xc7\xbf\xbd\x60\xf6\xac\xe6\xa0\x69\x4a\x35\x75\xd7\xa4\x7f\x60\xd8\xb5\xc3\x65\x19\x70\x59\x2a\xf8\x9e\xf1\xf2\x93\xad\x8b\xd2\x0b\xb7\xc7\xed\x7b\xa4\x88\x24\x7e\xa1\x45\xc3\x6f\xe7\x3d\x14\x11\x52\x34\x2e\x5b\xc7\xe8\x6c\x8b\xd6\x8d\xb7\x04\xb5\xd8\x9b\x98\x45\x49\x79\x2a\xf2\x35\x22\xa7\x42\x12\xa0\xc9\xbc\x33\x35\x8d\xa8\x91\xe1\x60\xba\xf6\xcb\x76\x08\x61\xfa\x6a\x34\xdb\xfe\xf7\x98\x0c\xcb\x54\xb5\x73\x6d\x76\x6c\x46\x27\x90\x39\x58\x5c\x8b\x95\x1e\xf1\x84\x45\xb2\x81\x4b\x11\x31\x24\xe6\x46\xd8\x48\x2e\x5a\x4d\x84\xe9\xfe\xb3\x98\x87\xa8\xc1\x17\x77\x2e\xba\xa4\x9e\x07\xb4\x81\x7e\x0e\xf3\x50\x06\x08\x88\x64\x75\x1e\x8c\xb4\xd9\x9e\x07\x94\xbf\xfa\x3e\x0f\x0a\x92\x44\xe4\x45\x4f\x22\x25\xef\x6c\x14\xbe\xa1\x68\xd7\xa8\xc8\xf6\xc3\x34\x28\xdc\xd9\x55\xbb\xa2\xda\xde\x83\xbe\xe4\xd5\xff\xaf\x71\x9d\x23\xb7\x5b\xbd\xe3\xdd\xe8\xc1\x11\x99\xd5\x88\xae\xc3\x5f\xe2\x8d\x37\x84\x61\xb6\xda\x8b\x87\x61\x36\x10\xf3\x29\x9a\xe7\x5b\x21\x91\x5f\x42\x30\xa6\x51\x02\x70\x5e\x81\x23\x0a\x50\x41\xf5\xfc\xcc\x65\xac\x2e\xc0\xb3\xe7\x7b\x6b\xf1\x3a\x46\x8e\xe3\x09\xf2\xec\xa6\x8e\x59\xb5\x48\xfa\x51\x63\x37\x37\xc5\x6b\xda\x67\xae\x3e\xde\x35\x71\xf4\x29\x5f\x5a\x8c\xc8\x00\x54\x33\xdb\xfa\x27\x56\x3c\x67\x4c\xe7\xea\x2a\x3e\x77\x48\x67\x50\x7f\x9b\x23\x3a\x5f\xee\x94\xee\x16\xe5\xb9\x1a\xe3\x19\x95\x84\xd5\x80\xcf\xf5\x31\x22\xac\x5c\xf0\x11\x70\x57\x67\x8f\x0c\x20\x7f\xb1\x14\x79\x2d\x3b\xf1\xa0\x85\xaa\x69\x04\xa1\x59\x16\x25\x26\x61\x93\x15\xc4\x9f\x82\x0a\x4a\x7e\xdd\x1a\xd0\xae\x69\x1a\x32\xfa\x13\x16\x8c\xcf\xdb\x12\x91\x19\x8d\xe2\x33\xb7\x43\xcc\x72\x45\xdf\x4a\x48\x6d\x9c\xd4\x6d\x01\x49\x5f\x6e\x8b\x6f\x3e\xdc\x5e\xb4\x29\x43\x59\xd8\x15\xce\x00\xfc\x9e\xd0\x34\x67\x4a\xa1\xc3\x07\x26\x73\x21\xee\x83\x86\x3c\xf1\xa9\xb6\x33\xa6\xe7\xe5\x64\x9c\x88\xbc\x91\x75\x3b\x52\x6c\xa6\xce\x1d\x47\x19\x99\x89\x3b\x25\x8c\x67\x55\xa6\x32\x5a\x0b\x11\x0b\xac\x3b\x94\x5c\xf3\xe5\x49\x52\xbd\x3d\x6e\x3d\xcc\x4f\xa9\x42\xb3\xd7\xa7\x07\xab\x9b\xe0\xe6\x3d\xb8\xd4\xb1\xbe\xab\xc2\xaa\x0d\xae\xec\xac\x2d\xef\xde\xac\xd4\xe1\xbc\x38\x1b\xe7\xd1\x2a\xaf\x07\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\x6f\x6b\x92\x9a\x58\x7a\x6c\xda\x42\x84\x6a\xe7\xdc\xa3\x7b\xfb\xd8\xfc\xd2\x87\x65\x1e\xc7\x2a\x2e\x73\x91\x65\x66\x21\xa9\x03\x5e\x6b\x44\x77\xa2\x6a\xd2\x46\xb4\xb3\x98\xbb\x46\x59\x68\xbe\x05\x5e\x24\x61\x4c\xc1\xe2\x9e\x99\xcb\xc0\x61\x66\x98\x0d\x84\x63\x53\x92\xb3\x4f\x86\xc2\xe6\x88\x6d\x90\x58\x74\xfc\x6f\xfe\x3a\xa0\x80\x35\xc1\xe0\x83\x0a\x33\xfd\xcc\xac\x50\x73\x10\x9f\x1c\xad\xcd\xb5\x65\xbe\xb8\x02\x6d\x14\x35\x3b\x6f\x4d\xef\x83\x51\xac\x64\x19\xe1\x30\x84\x78\x86\x49\xd3\x3b\x1c\x95\x53\x04\x9e\x07\xf4\x14\x3b\x9a\x8c\x0c\xe2\x85\xb7\x97\xf2\x1c\x93\x0d\xe9\x3b\x2f\xe6\x41\x26\xbb\x7b\x91\x9f\xd1\x57\x45\xfa\xe2\xaf\x0a\xe4\xfa\x4d\xac\xdf\x83\xe1\xac\x34\xf1\x86\xd9\x7a\xf0\xd2\xb5\x48\xd7\x60\x88\x11\xcc\x98\xd1\xac\x7b\x21\xd7\xcb\x69\x13\xba\x93\x0b\x67\x1e\xb1\x15\xc4\x6d\x9c\xfe\x27\x48\x4a\x0d\xa9\x43\x23\x77\x26\x65\x8b\x64\xdc\xa6\xa6\x33\x05\x3e\x49\x7f\x02\x18\xa0\xa4\xce\xea\x52\x6c\x4e\xd7\xa9\xf0\x5d\xcf\xc8\x7f\x21\x97\x54\x1e\x50\x2b\x63\x0b\xe0\xa0\xd4\x75\xf5\xf3\xae\x53\x81\x71\xd4\x09\xe5\x5e\xb7\x32\x67\xda\x59\xb8\x1d\xea\xb8\xc3\xf1\x98\x00\x29\xa8\xa4\xb9\xb9\x83\x15\x71\xcb\x33\x81\x19\xb3\x69\x81\x8d\x4b\xb1\x82\x2d\xef\x06\xaa\x8b\x8a\x0d\xd3\x24\x67\xb3\xb9\x3d\x2d\x84\x92\x4c\xf0\x19\xf1\x71\x63\x99\xa0\x29\x41\xc6\x22\x24\x79\xa0\x32\x37\xb2\x00\x4d\xe6\x18\x84\x46\x39\x49\x4b\x73\x1e\x08\x82\x6c\x2f\x47\x4a\x53\x0d\x0e\x0c\xaf\xb3\x0d\xce\x4f\xd3\x01\x4a\xc4\x3e\x77\xf9\xfb\x03\xe3\xe9\x98\x93\x16\xc5\x0a\xf2\xfe\x13\x24\xd5\xb1\xb6\x88\xd3\x79\x8e\x80\x81\xc2\x1f\x67\x8f\x16\x17\x2c\x0c\xf6\x44\x55\x76\x6f\xd8\x17\xd9\xe4\xad\x9b\x70\xe6\xb5\x4f\xfb\xa7\xd1\x47\xdb\x8b\xa0\xbc\x13\xab\x51\x34\x09\xd1\xb1\x85\xbc\x37\x27\xd7\x62\x04\x09\x59\x55\xeb\x0f\x22\xcb\xd3\x81\x90\xd9\x42\x68\x72\x72\x7c\x7e\x7c\xba\xb6\x17\x8e\x55\x33\xcd\xc0\x66\x44\xd7\x2f\xa4\x58\x5e\x64\x4b\x7c\x87\x63\x5b\xf2\x3b\x10\xc0\xd0\x07\xac\x56\xe5\x2f\xd5\x1c\xb2\xec\x8c\x28\x23\xfe\x52\x5f\x43\xc4\x7e\x6a\x1e\xd2\xb2\x4c\xac\x99\xec\xe4\xf8\xe7\xe3\x33\x02\x3a\x39\x25\x0f\x82\x1f\x6b\xeb\xf0\x20\x77\xa8\x43\x06\xd1\x54\x11\xb1\x14\x25\xe1\x00\xee\xec\x54\xc5\xaa\x12\x6a\xd4\x9f\xd2\xca\xe8\x16\x74\x03\xb2\x2c\x4c\x9e\x7b\xff\x89\x69\x23\x8a\xe8\x12\xcd\x14\xaf\xac\xa6\x00\x88\x43\x4f\x15\xde\x74\xe7\x73\xa0\x99\x9e\x2f\x2b\xed\xe5\x9f\x20\x05\xd6\x27\xe5\xee\x9b\x70\x19\xaa\x07\x69\xa3\xfd\x4d\xe0\x34\x02\x46\x29\xe1\x6e\x2e\x41\xcd\x45\x76\xf0\x34\xce\x0f\xae\xdc\x5b\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\x59\x99\xc5\xd5\x57\x10\x78\xca\x24\xa4\x4e\x58\x72\x25\x2f\xe6\x74\x81\x92\x82\x91\xe7\x20\x0d\x51\x4d\x9a\x3a\xd1\xef\xc6\x15\x85\x55\xda\xdd\xeb\x9e\x84\x6d\x76\xc4\x8e\x9c\xc9\x22\xce\x2d\xfd\xcd\xcd\xf5\xdb\xd6\x2d\x8d\x1f\x7c\x8b\xc7\xf8\xed\x1c\x92\xfb\x9b\xb0\x6a\xae\x3d\x09\x2d\x28\x84\x3c\xa4\x60\x60\x86\x8f\x26\x15\x5c\x0b\xa9\x09\x2f\xf3\x09\x48\x6f\x50\x98\xe1\x2a\x82\x5c\xb0\x04\xc6\xe4\xca\x7e\xe7\x9d\xf3\xbe\xfa\x30\xe5\x33\x20\xaf\xcd\x81\xf8\xc3\xef\x7f\xff\xbb\xdf\x87\xf3\xe8\x70\x20\xd5\x38\x20\xaa\xee\xc5\xfb\x22\x76\xdd\x5a\x72\x36\x19\x9b\x1d\xa5\xa8\xd4\x65\x34\xa9\xd6\x66\xb6\xf9\xd0\x85\x59\x25\x15\x00\xd9\xe0\xae\x30\xac\xc3\xfe\xdf\x24\x13\x93\xf3\x9c\x2a\x0d\xd2\xe8\x38\xee\x5a\x1f\x21\xdc\x30\xe3\xb3\x71\x9e\x9e\x8e\xc3\xbc\xe0\x5e\xad\x5e\x2b\x29\xd7\x82\x99\xd9\x52\x1e\xce\x4c\xca\xc1\x4d\xf0\xc4\x53\xf9\x86\x1c\x75\xab\x26\x66\x96\xe0\x1b\x88\x93\x89\xf6\xed\xdd\xdd\xf5\x37\xa0\x9b\x0c\x9b\xe3\x87\xe4\x9b\xf7\x77\x55\xb9\x71\xb3\xbb\x6c\x52\xd3\xc0\xb5\x43\xb8\xf6\x5c\x84\xd5\x9b\x8f\xed\x77\xb1\xac\x04\x6b\xa3\x71\x0e\x89\x59\xe8\xb3\x56\x65\x5b\x1f\x87\x78\x79\x3d\x26\x7f\x15\x25\x8a\x5c\x74\x92\x2d\xc9\x03\xb5\x88\x06\xdd\x20\xa5\xeb\x76\x64\xc8\x38\x32\x5c\xcb\xec\xea\x6f\x81\xa6\xb6\x56\x25\x9a\x76\x0e\x7e\x56\x1b\x34\x45\x5b\xb6\xb7\xa5\xd2\x22\x27\x73\xf7\xaa\x76\x0e\xeb\x82\xfe\x56\x36\xb2\x47\x10\x7d\x3f\x8a\x48\x28\xac\xb6\xe4\x7e\xf3\x45\xe8\x42\x6b\x5c\xc8\xce\x73\xa3\x1a\x10\x25\x49\x73\xaa\x9c\xa0\x8f\x26\x4c\xe6\x78\x54\x67\x93\x58\xdd\xa2\x54\x15\x21\x91\x2a\x8b\x10\x64\x52\xe6\x50\x06\x77\x12\xee\x84\x8c\x53\xa3\xc4\x34\x1e\xe8\x5e\xb3\x2d\x6e\x85\x04\xe2\x5c\x6d\x6e\x73\xd9\x00\x1c\x43\x68\x28\x2a\x21\xf1\xc6\xe4\xaa\x80\x2a\xe5\x82\xb3\xc4\xba\x33\x48\x59\x08\x4e\x44\xa9\x8b\x52\xa3\x29\x28\xa1\x0a\x46\x0b\x2a\x99\x61\xa8\x66\xfc\xfa\x87\x25\x37\xa7\x5d\x0b\x81\x76\x92\xca\xe9\x6c\x29\x0e\x27\x33\x92\x34\x43\x7c\x01\x8c\xc8\x2b\xbc\xb6\x38\xe1\x3b\x9a\xf4\xda\x06\x43\x6c\x0d\xf1\x79\x3c\xb5\x8e\xea\x39\x46\xf6\xa1\x2f\xcb\x07\x86\x22\xe3\x34\x6a\x43\x0f\x12\x6f\xa2\x6a\xb1\x81\x2c\x01\xfd\xed\x42\xae\xe8\xc1\x86\xc2\xf5\x39\x8c\x14\x6b\xf2\xfc\x6a\xb5\x7b\x2d\x3f\x02\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\xfd\xfb\xd5\xc5\x87\xf7\x21\x5d\x07\xd7\x8e\x8f\x59\x3d\x3e\x5a\xfd\xf8\x67\xa8\x20\xef\x9b\x4a\xe6\xd0\x9f\x30\x93\x5b\xa4\xa6\x09\x4a\xe6\x74\x80\x46\x3d\xe4\x30\x94\x3a\xb2\x62\x34\x35\x8c\xe7\xa0\x1c\xc7\x45\x15\xbc\x83\x8c\x2e\x6f\x21\x11\x3c\x3d\x78\x74\xf6\x55\xc5\x6c\x94\x25\xa8\x2a\x03\x0d\x2b\x88\x59\xbe\x10\xac\x2b\x5e\xed\xe3\x03\x9a\x21\x0d\xf6\xfd\x3a\x7b\xad\x49\xff\x3c\xd7\xa4\x37\xe6\xf1\x02\x24\xc3\x88\xa0\x3e\xec\x9a\x6f\xc5\x83\xab\xe8\x7e\xc2\xb8\xdf\x39\xa7\x0d\x2b\x4d\xed\x1e\x09\x47\x53\xd3\x82\xbc\x7e\xe5\x07\xf9\xf2\xfc\x1e\x2e\xd2\xa7\xd7\x9e\x2f\x47\xe3\xd3\xae\xaf\x3a\x6c\xa9\xed\xfe\x0a\x89\x1f\x22\x2b\x6c\xfc\xf5\xb8\xca\x53\x7b\x8d\xf4\x54\xac\x88\xf2\xd4\x87\x9c\x7d\x79\xfb\x44\x27\xc5\xad\x48\xee\x23\x99\x5d\xef\xde\x5e\xdb\xde\x56\xe2\x59\xec\x0d\x6c\xa4\x4c\x41\xa8\x79\x0a\x05\xd0\xc1\xe8\xda\x1b\xa3\xeb\xb1\x4d\xeb\xa2\xd9\x9b\xbd\x0d\xa8\xc7\x83\xb6\x55\x37\x2f\xf8\xc8\x76\x05\x94\x41\xdb\xda\xd2\x06\x6d\x6b\x8f\x66\x93\x48\x30\x18\xf4\x1b\x49\x13\xb8\xee\x93\xf0\xe6\x19\x08\x49\x4b\xe9\xca\xca\x55\x32\x5c\xc5\x2e\x38\x40\x6a\xf9\x87\x7b\x15\x20\x33\xf3\x26\x36\x3c\x1a\x6d\x88\x75\x60\x71\x29\x03\xc4\xbc\xbb\xb9\xeb\xda\x89\xb8\xde\xc9\xbc\x89\xba\x5a\x37\x29\x2a\x30\x74\x5f\x35\xc4\x1d\x27\x43\x3c\x96\x5a\x07\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x99\xe9\x72\x95\xa1\x6d\x8c\x70\x55\x7a\xaf\x26\xc4\x8c\x3a\x15\x32\x61\x93\x6c\x49\xe6\x34\x33\xca\xd2\x03\xd3\x73\x42\xc9\x3d\xcb\x32\xd7\x4d\xf7\x89\xba\x05\x97\xab\x69\x25\x9a\x4c\xf0\x19\x4e\x06\x75\x39\x19\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x46\x48\xcb\xf0\x8e\xef\x4a\x9e\xe2\xcc\xc1\x8f\xd8\xc2\x6d\x8f\xee\xf9\x76\x72\x2d\xf9\xa8\xe7\x20\x1f\x98\x02\x5b\x48\xae\x33\x4d\x96\x96\x76\x19\x39\xfb\x59\x05\xa1\xe2\x32\x07\xcd\xb6\xc0\x54\xd6\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x59\xa0\x06\xc7\xd0\x6c\x44\xa7\x1d\xdf\xc6\x0f\x56\xd9\x06\x4a\x8b\x82\xb0\x3c\x87\xd4\xe8\xc7\xd9\x92\x2c\x18\xed\x4c\x09\x82\x42\xd4\x3b\x8a\x9c\x70\x41\x44\x61\xae\xae\x92\x33\xbd\x44\x8f\xde\xbc\xd4\x24\x15\x0f\x3c\x20\xdf\xea\xce\x85\x39\x50\x32\x01\x4d\x9d\x0d\xdc\x1c\x82\x0a\x13\x1d\xe1\xce\xcd\xd9\xc3\x24\x81\xbb\x8d\x1b\xa0\x82\x49\x9f\x51\x1d\xc0\x25\x36\x48\xf3\x76\x3d\x1f\xdf\x76\x4c\x39\x7f\x5d\x20\x0e\x73\x3f\x90\x0d\xcd\x89\x16\xa5\xee\xc9\x3d\xb2\xcd\x74\x64\x21\x2e\x1a\x4a\x22\xcb\x41\x11\x51\x46\xaa\x37\xf1\xda\x0d\x17\x53\xc3\x1b\xec\x4e\x1b\x9b\xd2\x29\xeb\x54\x75\x38\xc6\x16\xdb\x02\xde\xef\xf2\x70\x1b\xf8\x95\x93\x72\x3a\x05\x89\x37\x1d\x12\xbc\x16\x76\x5f\xd5\xf1\xf2\x77\x58\x37\xe3\xad\x0b\xf8\x02\x7d\x86\xb5\x03\x1c\x98\xc4\x96\x21\x1d\xc8\x26\x96\xe9\x95\xa0\x10\x0b\x9e\x93\xf7\x1f\xbf\xee\xb6\x45\x63\x54\x16\x08\x4b\x59\xc5\xf7\xfc\xc8\xbb\xc5\x24\xc6\xdd\x0f\x9b\x50\x5f\xdc\xb6\x48\x32\xa1\x5c\x7a\x34\xae\x4b\x32\xa7\x9c\x83\x37\x46\x31\x8d\x96\xec\x09\x00\x27\xa2\x00\x1b\x94\xd7\x89\x18\x4a\x14\xe3\xb3\x0c\x08\xd5\x9a\x26\xf3\xb1\xa1\x8e\xfb\xbd\x50\xe7\x21\xbb\x4f\x94\x96\x40\x73\xbb\x27\x24\xe4\x94\xd9\xe1\x09\x4d\xa4\x50\x8a\xe4\x65\xa6\x59\x51\x75\xd6\xcd\x8a\x08\x88\x08\xa1\x6c\x5a\xaa\x5f\x2b\x4c\x2b\xa9\x13\x9e\xcf\x6a\x0a\xdd\xeb\x8b\x66\xb1\x22\x34\x9d\x9d\x99\x6f\x21\x2f\xf4\xb2\x4a\x4c\xec\xa6\x03\x4d\x99\x54\x9a\x24\x19\x03\xae\xdd\x9b\x59\xc8\x41\xa4\xe1\xcc\x8b\xd3\xdc\xcd\x88\x72\x53\xc2\x53\x54\xbe\x0b\xad\x6c\xfe\x5d\x45\x84\xef\x2a\x65\xca\xd9\x3a\x54\xb7\xec\x3f\xea\x2b\xd3\xd8\x8d\xe3\x67\x04\xb7\x8e\x17\x70\x2c\x45\xee\xa3\x06\x09\x8d\x3a\xdb\x75\xee\x64\x18\x5f\xc1\xf2\x31\xfe\x5c\x9f\xb5\x30\x07\x6a\xdd\x02\x53\x61\xd6\xb8\x0e\x6e\x28\x0e\x0b\x73\x0e\x20\x01\x23\x8a\xd2\x88\x4c\xe6\xc5\x79\x4c\x43\x96\xfb\x00\x4a\xd1\x19\x5c\x77\x0c\x47\x88\xc1\x70\x6a\x43\x1b\xc6\x31\xd4\xdb\x66\x0e\x16\xe8\x4a\x8b\xc6\x27\xcd\x24\xaf\xa6\xf2\x98\xdb\x17\xe9\x44\x81\x57\x9a\x1e\x24\xd3\x1a\x70\x97\x62\x25\x27\x0c\x40\x5b\x05\xef\x6c\x27\x97\x75\x1a\xcf\x4d\x7a\x73\x3c\x23\x7e\xf0\xd4\xa6\x69\x4d\x80\x4c\x24\x83\x29\x99\x32\xcc\x1b\xc3\x8c\xaa\x33\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x92\x19\x66\x71\x39\x25\xf8\xdf\x5e\xfd\xfb\x1f\xc8\x64\x69\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xcc\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfe\xed\xfd\x24\xe8\xe8\x21\x7f\x3c\x4f\x61\x71\xde\xd8\x42\xa3\x4c\xcc\xba\xf5\xfa\x36\x46\x36\x71\x90\x9d\x6d\xc3\x89\x16\x19\x4b\x96\x87\x3a\xd3\xbe\x78\x09\x99\x8b\x07\x6b\xcc\x59\x3f\xaa\x0d\xa8\x97\x42\x14\x65\x86\x13\x47\xbe\xae\xf0\xf9\x4a\x05\xab\xd0\x47\xa1\x46\xc2\x06\xb7\x43\x27\xaa\x1b\x76\xe5\xce\x71\x29\x8c\x9e\x4c\xe1\x80\x27\x9c\xcf\xad\xaa\x43\xd2\xd9\x1a\xf7\x35\xcd\xb2\x09\x4d\xee\xef\xc4\xf7\x62\xa6\x3e\xf2\xf7\x52\x0a\xd9\x7e\xe7\x8c\x9a\x3b\x7d\x5e\xf2\x7b\xac\xa2\x5b\x83\xd1\x8a\x99\x8b\x29\xf4\xf8\x01\x8d\xb7\xeb\x44\x8c\x7f\x4b\x0b\x0f\xea\x45\x12\x6f\x83\xab\x47\x86\x4f\xac\x36\xb4\x71\x02\x86\xe6\xae\x09\xf8\xd0\x7a\x0f\xd5\x3c\xda\xbf\x7d\xf5\x6f\x7f\xb4\xcc\x85\x08\x49\xfe\xf8\x0a\x53\x8e\xd5\x99\xbd\x00\xf0\x06\x36\xa2\x56\x4e\xb3\xac\xab\x97\xa0\xc9\x02\xbe\xee\x5c\x9c\xba\x07\x47\x5e\x1f\xec\x74\xef\xac\x32\xde\xdd\xfd\x15\xf5\x45\xa6\x15\x64\xd3\x33\x8b\xf6\x52\x99\xb5\x8e\x51\xba\x3a\x76\x57\x5e\x77\xa4\xa0\xc3\x2b\x6d\x0b\x91\x95\x39\xbc\x83\x05\x4b\xba\x39\x30\x5b\xab\xd2\xea\xcd\x9b\xe9\x33\xa6\x10\x04\x68\x92\x89\xe4\x9e\xa4\xee\xcb\x46\xa8\xfc\x6a\x55\xed\xee\xb3\xd0\x35\x69\x20\x20\x59\x60\xeb\xfb\xb7\xd2\x04\x72\x5a\x14\x15\x42\x89\xa4\x0f\xad\xc9\x40\xd6\x84\xe8\xa8\x81\x6e\xc4\x60\x67\x7a\xa8\x2b\x7d\xe4\xde\xc8\x5c\x53\x9d\xbb\xe8\x9c\x5b\x10\xee\x89\xaf\xa9\xef\xee\xc7\x6c\x6d\x88\xba\x43\x7f\x1a\x0a\xfc\xb7\xc5\x5b\x58\x43\xc6\xaa\x20\x87\xaa\x8d\x61\x25\x48\xb3\x7d\xf0\x96\xe9\x6e\xbe\x8c\xe0\x0c\x0d\xcb\x91\x68\xcd\x0b\xaf\x9c\xd0\x39\xd5\x4e\x3f\xf2\x5e\x76\x4a\x0a\x90\x8a\x29\x23\x3a\xfd\x80\x07\xea\x6d\x46\x59\xde\x70\xdf\x1d\x6a\x12\xd6\x23\xea\x73\x5a\x8c\xee\x61\xd9\x71\xc3\x05\x1e\x97\x6d\x01\xfe\x39\x2d\x3a\xde\x03\x58\xba\x36\xfc\x1a\xe8\x78\x39\x5f\x8b\xd4\xd1\x81\xd7\x83\x2d\x49\xfc\x2c\x6a\x6c\x44\x19\xe8\xd0\x57\xce\x0f\xf5\xc2\xb5\x6f\x1c\xf3\x49\x75\xe5\xd8\xa7\xbe\xa4\x8b\x06\xdf\xef\x73\xbd\x67\x2a\xe2\x23\xb1\xd3\xa0\x48\x27\xbc\x9d\xdc\xce\x68\x5f\x47\x2d\x83\x96\x3d\x99\x0d\xd5\xd7\x19\x9a\xc6\xb6\x28\x40\x00\x01\xe6\x28\xba\x41\xc9\xf1\x9b\xe3\x83\xde\x71\x76\x65\xa4\x28\xe8\x0c\x35\xd3\x3e\x2c\xd0\x2a\x4d\x4d\x0c\xda\xb9\x78\xb0\xdf\xdb\xe8\x92\xc2\x3d\x05\x69\x0d\x64\x3e\x17\x41\xab\x63\x23\x07\xfd\x8e\x70\xda\xb5\xc5\x2a\x7c\xa0\x4b\x42\xa5\x28\x79\x50\x1a\x34\x3a\x46\x2a\xc7\xd9\x87\x95\x97\xbd\x12\x1c\xbc\x93\x3e\x64\x94\xbb\x1a\xc3\x9c\x29\x1b\xaf\xc0\x38\x79\x3d\x7e\xfd\x2a\x98\xf6\x1b\x48\x4a\xa9\xd8\x02\x6e\x5c\x8d\xf3\x86\x53\xe5\x72\x7a\x2d\x94\x62\x93\x0c\x13\xb7\xb4\x20\xef\x6d\x01\xf8\xf5\x17\xad\x02\x47\xf0\x8d\x85\x6c\xa2\x95\x06\x50\x78\x62\x4f\x70\x33\xe0\xd3\x0c\x10\x10\xf5\xd1\x2f\x49\x12\xd7\x75\x45\x92\xbc\xaa\x24\x49\x7b\xef\x1d\xf4\x5d\x7d\xe1\xfb\x3e\x70\x92\x0f\xce\x37\x50\x57\xb6\x67\xbe\x72\x32\x7e\xf4\x20\x99\x76\x87\xfb\x81\x29\x20\x27\x68\x95\x58\xd9\x8c\x41\x00\xcd\x4d\x1b\x56\x60\x05\xfc\x18\x00\xcb\x72\xf5\xe8\xf6\x61\x95\xd6\xf9\x49\x1d\x81\xff\xe0\x0c\x58\xf5\x0a\x3a\xee\x5f\xdf\xcb\x73\xca\xd3\x2c\x88\x67\x54\xb3\x92\x2d\x83\xb0\x70\x2e\xa7\xa4\xc9\x12\x9d\xff\xb2\x51\x4d\x62\x4e\x15\xe1\x82\xe4\x40\x31\x40\xd3\xdc\x2e\x9e\x0b\xb6\xb0\x9a\xe3\xd1\x60\x37\xbb\xbd\xc6\x9a\x17\x82\x63\xd7\xef\x98\x72\xec\xd9\xf0\x11\xa7\x81\xd8\xb0\x8e\x9c\xa6\x21\xa9\xdd\x8d\x39\xad\x17\x6f\x5c\x07\x4d\xae\x52\x52\x5f\x1c\x2b\xb4\x3c\x07\x1d\x67\xae\x04\xb9\x19\xbe\xc4\x38\xc1\x0d\x66\xb9\x3a\x48\x26\xc8\x9b\x6d\xdb\xea\xeb\x56\xd7\xe2\xda\xbb\x6e\xa6\xb8\x22\x38\x80\x86\xa7\x5f\xf5\xac\xc1\x0b\x7d\x8c\xa8\x75\xa9\xbb\x1a\x28\x2e\xe3\x31\x0c\xc9\xdb\x3b\x25\x2a\x73\xcf\x0c\x38\x48\xea\xfc\x0a\x3e\x44\xd4\x81\xaf\x50\x25\x78\xe8\x81\x78\x62\xc3\x19\x7e\xff\xb4\x98\x62\x7f\x16\x40\x08\xca\x39\x27\x42\xae\x9c\x76\xe7\x31\xd9\x24\xb1\xc4\x7c\xeb\x15\x68\x2e\xbb\xf9\x1b\x98\x9f\x66\x51\xfe\xbb\x64\x0b\x9a\x81\xc5\xb0\xf7\xac\xe1\xa0\xc2\x84\x2a\x27\x7d\x55\x1b\x9d\x7e\x88\x6a\xc7\xe6\xa0\x87\xad\x1a\x64\x24\x79\xe2\xe8\x88\x9c\xd8\x31\x8e\x2d\xc8\xee\x61\x85\x5c\xb7\x56\xef\x3f\x15\x01\x95\x5b\xe3\xad\xd7\xfb\x4f\x05\xc5\x38\x8d\xa2\x17\x0b\xf7\xbf\x60\x4e\x17\x80\x98\xc6\x2c\xa3\x32\xc3\xa0\xf4\x5b\x3b\x65\x64\x52\x6a\x02\x7c\xc1\xa4\xe0\xb9\x39\x7e\x08\x3e\x63\x38\x93\x04\x04\x83\x4f\x40\x91\xaf\x4e\x7e\xb8\xb8\xc1\xa4\xa5\x53\x87\x96\xef\xde\xaf\x54\x88\x0f\xb0\xf2\x0e\x8d\xee\xfa\xb8\xdf\x88\x7f\x77\xb3\x5d\x50\x3e\xf1\x73\x61\xde\x2d\x2f\x75\x49\x33\x84\x7e\x4e\xb2\xd2\xdc\x85\x07\xdb\xd9\xf1\x6d\xe0\x21\x96\xbc\x98\x26\x70\x07\xfc\xfd\x8e\x75\x3a\xae\x31\x0e\xea\xdb\xc6\x7e\x5d\x83\x21\xef\x5c\xe3\x61\x03\x08\xe5\x9a\xa0\x73\xac\x2a\x60\xca\x66\x1e\x8e\xbb\x8b\xbb\x85\x67\x60\xe9\x04\x9b\xfc\xed\x6b\x92\xae\x59\x18\xb1\x46\xcb\xc1\x6d\xf8\x1d\x0e\x43\xbc\x63\xd0\xc1\x10\x1d\x67\xd7\xa7\x5c\xbd\xc5\xa5\xd9\x8f\xe2\xb0\x8d\x7e\x5b\x69\xb2\x66\x23\xbc\xbb\xba\x6d\x16\xf4\xb0\xce\x3f\xb1\xf7\x4a\x5e\xd7\x5d\xd4\x55\x6f\xb0\x22\x5e\xe5\x40\x05\x39\xb3\xe2\x34\x22\xcf\x56\xf2\xf5\xbb\xab\xdb\x3d\xc7\xf2\xbb\xd9\x0a\xc3\x13\xaa\x6c\x8c\xf4\xbb\xab\x5b\x1b\xb7\xb6\x1f\xed\x9d\x1d\x29\xdd\x7d\x10\x08\xe0\x86\xd8\x5a\x1d\x38\x76\x38\x97\xbb\xa8\xe2\x41\xcc\xe2\xa3\xcf\xd7\x52\x43\x2e\xaf\x09\x4d\x53\x89\xe1\xcc\x5d\xce\x72\x0b\xd1\x8e\x16\x45\x15\x95\x8a\x45\x62\xa8\x82\xe6\xab\x37\xf6\x00\x0a\x3e\x1d\xd7\xcf\xb6\x77\x65\x91\x31\x1b\x7e\xda\x1c\xa2\x2e\xa1\x93\x8b\x45\x17\xfe\x14\xe2\x61\xec\xec\x5f\x0c\x92\x0f\xa2\x62\xce\x89\xae\xe5\x69\x63\xef\x52\x09\x4a\x64\x8b\xba\x78\x7e\xf0\xee\x74\xec\x08\x43\x12\xab\xdd\xe9\x2b\xd0\x3e\xd3\xce\x04\xae\x25\x83\xf5\x5d\x49\x6e\xcc\xdb\x95\xc8\xce\x2a\x12\xd8\x02\x30\x65\xc9\x55\x08\xee\x30\x32\x0e\xe3\xf3\x6e\x89\x9e\xdb\xac\x1b\xaa\xf1\x64\x52\xe9\x45\x01\x7c\xf3\x80\x57\x3c\xc8\x11\x59\x41\xa6\x4f\xdf\x5d\xdd\xda\x9b\xd4\x4e\x97\xc3\xf3\x56\x1b\xf7\x4e\xe7\x4b\x8e\x1c\xbe\x4c\x52\x88\xdb\x26\x5a\x4e\x69\x55\xd2\x94\x6d\x9c\xe0\x63\x15\x08\x91\x7a\xe3\x42\x13\xc2\x12\x81\x03\x2c\x07\x41\x48\xa5\xed\xd8\x10\x9f\xf6\xfa\xc8\x64\xe1\x68\x07\x79\xd7\xa8\x77\x85\x02\x2a\x93\x79\x97\x8d\x1d\xfb\xb2\xb0\x94\x90\x54\xd8\x0c\xb1\xa9\x90\xe8\x81\x1f\xa1\xa8\x93\x09\x71\x5f\x16\xcf\x23\xdd\xb8\x81\x0b\xaa\xe7\xcf\x76\x89\xb4\xc6\x18\xe4\x9b\xee\x7b\x36\xe5\xaa\x4b\x9e\x4b\xa0\xf2\x05\xda\xaa\x5c\x38\x72\x8d\xd4\xb6\xff\x65\xd4\x32\x83\xbd\xcd\x4a\xa5\x41\x7e\xcd\xa4\xd2\x47\xfb\xf6\xf4\x03\xcd\x98\x03\x4e\xb6\x21\x2c\xc7\xcd\xee\xfe\xc2\xf4\xdc\x15\xea\x3d\x3e\x6b\x7f\x65\xfe\x76\x64\x1c\x13\x21\xc9\xf1\x95\xe0\xb0\x77\xf0\xd0\x8a\x06\x5a\x09\x3e\xd5\x95\xbe\x55\x66\x73\x93\xa8\x20\xb3\xa0\x2a\xf8\x45\xe7\x73\x76\xe7\x6a\x27\x1b\x7a\xbc\xa4\xa0\x40\x13\x8a\x45\x27\xb1\xef\x79\x5d\xb0\xd8\x16\x47\xb3\x85\x9e\x85\xd3\x79\x97\x8d\xa5\xdd\x73\xf0\x46\x75\x35\x2d\xb6\x2f\x40\x17\xd5\x76\xef\x73\x86\x88\x21\xe0\xca\xc9\x7c\xcf\xf8\xfd\x9e\x87\x3c\xec\x84\xbc\x5f\x1b\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\x89\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xbb\x2a\x1b\x0c\xe0\xea\xcc\x86\xb9\x78\x0b\xb7\x5a\x72\x4d\xb1\xd6\xf6\x3b\x91\xdc\x83\x24\x99\xa1\x79\xdf\xcd\x57\xe7\xb1\xb6\xaa\x2a\xef\x9d\xd6\xd2\x35\x22\x03\x8a\x39\xe4\x20\x69\x56\x19\x40\x5f\x74\xd1\xbf\x77\xb7\x77\x45\x46\x33\x89\xd3\x96\x47\x74\x85\x72\x45\x3a\x26\xef\x37\x3d\x95\xd3\xa5\x2f\xfc\xce\x38\xfa\x0e\x3f\x31\xa5\xf7\xbf\x61\x0a\x91\x36\x31\x52\x4b\x05\x72\x54\x61\xe6\x12\xea\x8a\x2f\xfa\x7c\xda\x14\x26\xe5\x6c\xc6\xf8\x6c\x6c\xc5\x03\x14\x43\xea\x02\xb1\xb5\x2d\xec\x61\x0e\xfb\x46\xc8\x24\x12\x28\xc6\x0f\xa3\xb2\x62\x43\x26\x58\xb3\xf7\x5c\xa4\xb6\xf3\xc9\xd2\x5a\x60\xfd\x9e\xac\x80\x94\xc8\x25\x27\x42\xba\xba\x18\x34\x4d\xc9\xde\x61\x3a\x1b\x56\x04\xfb\xaa\xe7\xd7\x12\x57\xd6\xfe\xf9\x63\x55\xff\xaa\xb1\x40\xaa\x9c\x18\xd9\xb7\x94\xfb\xd6\xba\xee\x2a\xa3\x74\x92\x4f\x42\x65\xd1\x0b\x5e\x6f\xcf\xb7\x4d\x24\x02\x4a\x34\xe4\x85\x90\x54\x2e\x57\xd3\x4d\xcc\x4d\x62\xb6\xaf\x59\xa0\x95\xb9\xbd\x16\xa9\x11\x12\xf6\x26\x63\xc3\xb6\x5d\x30\xa3\x76\x6e\xda\xb9\x1b\xcf\x13\x5e\x6d\x5c\x10\xbf\x66\xa4\x03\x15\x2a\x99\x43\x5a\x22\xfa\xd4\xac\xa4\x92\x72\x0d\x86\x7f\xba\x10\xd6\x65\x2b\x90\xa3\x42\x6a\xa8\x60\xdb\x96\x98\x37\x8a\xc5\x9d\xcd\x27\x58\x57\xba\x4b\xb8\x89\x13\x8e\x4d\x47\x0d\x38\x88\xbb\x39\x10\x23\x49\x66\xa0\x71\xf2\x61\xc1\x12\xed\x07\x99\xe2\x22\x6c\xd8\xfa\x09\x2d\x2d\xd4\xc3\xfe\x01\x40\xd7\xc2\xd5\x51\x4d\xc0\xdc\x49\x5a\xd5\x53\xeb\xb2\x1e\x59\xa7\xb8\x92\x3b\x7f\xb2\x37\x11\x5c\x1f\xcc\x27\x8e\x24\x1a\x45\x3a\x33\x4d\x7c\xbb\x47\x18\x73\xb5\xc6\x1b\x56\x62\xcf\xa1\x02\x0c\x30\xdd\x53\x1e\x3a\xa5\x2a\x84\xd8\x7a\xa8\x9c\x1d\x2c\x09\xe8\x42\xce\xca\x1c\x93\xe6\x9d\x6e\x0b\x5c\xcb\x65\x21\x58\x57\xbf\xbd\x39\x6a\xe8\x66\x3c\x56\xe4\xed\x87\x77\x4d\xc0\xb7\x66\x99\x3e\x0f\x07\xd8\x6d\x90\x1f\xe2\x06\x28\x90\xcb\x29\xa1\x95\xd0\xd7\x89\xa2\xfa\xa2\x76\x36\x1f\xe7\xfa\xad\x08\xf4\x16\x58\xc6\x0b\x23\xc1\xa2\x9c\xde\xa8\xeb\x93\xcc\x29\x9f\x19\x56\xf5\x4e\x94\xe6\xc5\xbe\xfa\x0a\x5f\x42\x42\x5a\x26\x1d\x83\x4b\x11\x30\xda\xa1\x22\x7d\xe5\xc3\xbc\x5c\x01\x31\xa3\x8b\x82\x4a\x68\xe1\xa7\xa6\x39\x7b\x56\xca\x7d\x43\xd8\x18\xc6\xe4\xe8\xab\xc6\x57\x47\x48\x71\x27\x6a\x0a\x29\xcc\xab\x38\x10\x26\x7c\xfb\x8c\x69\xe4\x1f\x47\xcd\x11\xc6\xe4\xbd\xa1\x0b\xa3\xa6\xab\xb5\x6d\xe0\xea\x4c\xea\x95\x3d\x23\x12\x66\x54\xa6\x19\x74\x04\x10\x11\xd3\x4a\xc9\xb0\x40\x95\x6e\x57\x21\x63\x44\x5c\x01\x2e\xf4\x38\x8e\xeb\x7b\x57\x44\x3b\x4d\xd5\xbd\x3a\xb7\xea\xcc\x28\xa5\x9a\x8e\x68\x61\xed\x41\x4c\xf0\x73\x6b\xea\x1e\xb9\x22\xe5\x23\xea\x4e\xef\xa8\xda\xd9\xe7\xbf\x76\xf0\xab\x23\x5a\x3d\xc5\xf8\x88\x8e\xb0\x6c\x77\x67\xfb\xcd\x01\xd2\xee\xa2\x07\xce\x04\x95\x63\x0a\x28\xbb\x1f\x83\x4d\xbf\xaf\xb8\xb2\x5d\x8a\x31\xb9\x12\xda\x57\xd7\x4f\xeb\x44\xc3\x80\xe2\xec\x4d\xc6\xfd\xfe\xea\xee\xe6\xaf\xd7\x1f\x2f\xaf\xee\x06\xfe\x3d\xf0\x6f\x6c\x03\xff\x1e\xf8\x77\x87\x81\xfb\xc2\xbf\x81\x2f\x0e\xc5\xbb\x2b\x7b\xd7\x26\x03\xe3\x4a\xb5\xd7\xc0\x44\xf1\x2f\x28\xd1\xfe\x3d\x5f\xfc\x40\x8d\xea\x58\x48\x50\xa8\xa0\x18\x8d\x75\x53\x90\xb2\x7b\x00\x2d\x81\x75\x4c\xe7\x67\x9b\x69\x7f\xc0\x3c\xf9\x88\x79\xa2\x41\xb1\xf3\x57\x8d\x02\x20\x9b\x96\x3c\x24\xee\xfb\x03\x5d\xda\xfa\x48\xf6\x50\x52\xbe\x24\x85\x64\x5c\xe3\x56\xba\xb8\x7d\x7b\x79\x49\x92\x39\x95\x34\x41\x07\x15\x7c\x4a\xa0\xd0\xe4\xf8\x7f\x1e\x36\x4d\x3e\xb0\x9a\x6a\xbc\x95\xd9\x47\x70\x0b\x18\xa6\x16\xf9\x0a\x09\x0b\x26\x4a\x95\x2d\xab\xb2\xfd\x9b\xf9\xe8\x3a\x9a\x42\x60\x92\xd8\xd2\xbb\x99\x36\x0f\xb8\x22\x74\x6e\x12\x20\x03\x86\x3f\xb0\xe8\xe9\x88\x88\x21\x80\x06\x8c\xbf\x41\x74\xdd\x5d\x0c\x0d\x18\xb7\x93\x00\xbb\x4d\x18\x0d\xa0\xa3\x2d\xc6\x06\x74\xd4\xce\xa2\x39\x3c\x27\xfb\x5a\x8a\x3c\x12\x37\xbb\xb5\x06\x6d\x1f\x5b\xb1\xe9\xa8\x56\x51\x57\x4d\xf1\xc8\xa9\xb4\x75\xed\x14\xa3\x4e\xe7\x85\xee\x98\xf7\x41\x62\xd5\x8d\x8f\x53\x62\xdd\x46\xcd\x7f\xa0\xc5\x77\xb0\xbc\x81\xc0\x2a\x51\xed\xf9\xc6\xf8\x0b\x45\x28\xb9\x87\xa5\x0d\xae\x7c\xeb\x07\x0b\x2b\x94\xd5\xc3\xb2\xfb\xf7\xd0\x0d\x8c\xde\xb7\x78\xf5\xf2\xef\x21\x00\x2a\xc1\xb7\xb5\x62\xea\x66\x09\x51\xff\x30\x6b\xda\xab\xf2\xf1\x61\x92\xa8\x6f\x31\xcb\xd3\xd9\xd6\x94\x4c\xdd\xf5\x10\x61\xe2\x56\xe1\x72\x60\x3a\x85\x44\xfb\x14\x7c\xbb\x9b\xcf\x30\x4b\x33\x2d\x6d\x8d\x4f\x9a\xdc\x3f\x50\x99\x2a\x92\x88\xbc\xa0\x9a\x4d\x58\xc6\xf4\x32\x2c\x3f\xdf\x37\xbc\xe1\x2b\x80\x71\xcb\x14\xc9\x25\x57\x9a\xe2\x55\x28\x9c\x21\xd0\xac\x76\x8d\xf2\x8b\x60\xc0\x96\x9b\x62\x26\x10\x95\xe1\x85\xf9\x0d\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\xbc\x23\xf6\x76\xbb\xed\x59\x5e\x46\x2c\x8c\x2c\x08\x0f\xe7\x2e\x4f\x70\x64\x5e\x7c\x64\x99\x95\x3a\xc7\x2c\x94\xf3\x5f\xe3\x7f\xfa\x74\x8a\x88\xcf\x32\x7c\x43\x8e\x8e\x02\xfb\x12\x3e\x68\x29\xee\xa9\xbc\x75\xc1\x74\x4d\xd1\xa9\xba\x50\x88\x45\x04\x46\x3e\xe5\x71\x10\x9c\x16\x10\x69\x9a\xc3\xe0\x6c\x6c\x6b\x59\xaa\x72\x5a\x84\x19\xaa\xea\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\xab\xaa\x4a\x67\xfa\xc6\xe3\x7b\x28\x92\x83\xa6\x29\xd5\x74\x6c\x0e\xc4\x59\xfb\x4f\x55\xd0\x04\xce\xc8\x3f\xaa\x0f\x33\x3a\x81\x4c\xfd\x78\xfc\x1f\xdf\xbd\xff\xeb\x7f\x1e\xff\xf4\x8f\xe6\x77\x28\xae\xa1\xe1\xb4\xf9\x40\xe0\x2b\x60\xac\x14\x17\x29\x5c\x21\x75\xf8\xa7\xd3\xf4\x2e\x92\x44\x94\x5c\xbb\x2f\x10\xdc\x7d\x3c\x17\x4a\x5f\x5e\x57\x7f\x16\x22\x5d\xfd\x2b\xa0\x84\x1f\xe9\xa7\xdc\x83\x6b\x1b\x00\xf6\x68\x5b\x3c\xe9\x87\x16\xec\x07\x90\x2a\x08\x1f\xd0\xb7\x76\xc6\x86\xed\xd5\x6f\x63\x95\xcc\x21\xa7\xf8\xcf\xaf\xfd\x14\x98\xfb\xb8\x2a\xbf\xc1\x11\x45\xdf\xdc\x81\xed\x9a\xbe\x47\x8b\xd7\x41\x1a\xa7\x6d\x11\x39\x7f\xb5\x82\x91\x27\x0c\x67\xc4\xcd\x96\xe5\x00\x95\xfc\xe8\xad\x14\x75\x18\xe4\xc5\xf5\x25\x59\xd8\x19\xee\xd1\xe4\x3c\x1f\xbb\xce\x20\xba\xba\x15\xcc\xb0\xbf\xae\xa8\x72\xcb\xd4\x50\xdd\x9c\xc2\x8c\x94\x87\x2e\xd0\x8d\xc7\xea\x37\x9d\xbe\xe7\x0b\x33\xae\x6a\x95\x9a\xf4\xf2\x24\x0f\x84\xf5\x21\xfd\xe4\x99\xa1\xba\x22\x96\x45\x0f\x65\xb9\xa6\x13\x0b\x91\x72\xd5\xd5\x8b\xe0\x5b\x9f\x75\xd7\x28\xaa\x9c\x57\x80\x1b\xd0\x3c\xd5\x61\x20\x17\x86\xd9\x2f\x30\x57\xe6\xde\xc7\xae\x16\x12\x16\xc0\x75\x15\x74\xed\xea\x7e\x51\xa9\x59\x1c\x9d\xc4\x51\xa4\x2a\x4b\x77\x1d\xd6\x61\xad\x5c\xf9\x8b\xfb\x2e\xea\xf6\xae\x44\x63\xeb\x45\x56\xcc\xa9\x79\xeb\x59\xa5\x07\x6f\x3c\xed\x36\x7a\xc2\xcc\x9d\x62\xff\x84\x95\xda\x2d\xaf\x7f\xfb\xc7\x06\xa1\x3d\xba\x1b\x9e\x4d\xcd\x89\xb2\x63\x37\xe9\x4a\x58\x8d\x67\xbb\x9a\xe4\x2a\xe1\xd5\xcf\x85\xb3\x29\x7c\x37\x01\xce\x64\xfa\x89\x29\x7d\x66\xcb\x06\xfa\x13\xb4\xa0\xb2\x8a\x12\x2a\x27\x19\x53\xf3\x50\x76\x6f\xdb\xe5\xb4\x5a\x9d\x95\x32\x8a\x15\x4e\x72\x2d\x7b\x98\xb9\x58\xa1\x32\x02\x09\xdb\x4c\xcc\x6d\x94\xc2\xda\x9d\x7f\x8d\x09\x12\x75\x7c\x74\x10\xa6\xde\xe3\xf3\x60\xa1\x63\x5f\x6a\x22\xd6\x30\x14\x25\xe8\x52\x1a\x9e\x95\x5a\x3e\x71\x2d\x52\x97\xd3\x12\x4f\xf8\x8b\xa1\xac\x93\xa6\x51\xa4\x6b\x51\xc5\x66\x2b\xe2\x0b\xd9\xd1\xae\xb7\x1d\xa0\xe7\x2a\xe9\xdd\x33\x89\x28\xc6\x35\xc7\x84\x24\x64\xb6\x1e\x3b\x22\xcd\xba\xd4\x00\x0f\x3d\x6f\x06\x3c\x1e\x8f\x8f\x2d\x95\xc2\x55\x3b\xb5\x16\x45\xf3\x79\xaf\xae\x85\x5a\xa8\x7a\x06\x33\x3c\x6f\x18\x95\xdd\x12\x59\x48\x56\x37\x55\xde\xc5\x1a\x4b\x56\xff\x0c\x94\x29\x9f\xa9\xf2\x75\xaf\x6d\x60\xcd\x7c\x9a\x56\xf0\xc1\x1b\x82\xa0\xb9\xfe\x7b\x27\xfc\xa8\xaa\x58\x3f\x28\x1d\x6a\x28\x3e\xb1\x5d\x8e\x93\xa2\x3c\x73\xdd\x8f\x73\xc8\x85\x5c\x56\x7f\x56\x59\x40\x23\xa5\x85\xa4\x33\x84\x1d\xb7\x83\xdb\x9f\x55\x7f\xd9\x1f\xb6\xc8\x5b\xff\xb5\x8d\xee\x48\x4a\x29\x81\xeb\x6c\x59\xe3\xf9\x7e\x71\xba\x9c\x5f\xb7\x9e\x28\x50\xd5\xb6\x7a\x06\xfe\x73\x5c\xe7\x2d\xa2\xcf\xad\x9a\x45\x74\xa9\xbb\xf2\x40\x67\xb5\xc0\x81\x71\x1f\x56\xc8\x53\xc7\xfd\xe1\x43\x84\xa4\x6c\xc1\x94\x08\x80\x7e\xad\x3a\x5a\x77\x4f\x78\xfc\x3c\x57\x88\xd2\xa6\xa3\x57\x16\x94\x4f\x05\x16\xa5\xae\x0e\xfb\x8a\x69\xf0\x75\xa8\xe7\x05\x65\x0c\x0d\x92\xbf\x21\xff\xfb\xe4\x6f\xbf\xf9\x79\x74\xfa\xa7\x93\x93\x1f\x5f\x8d\xfe\xfd\xa7\xdf\x9c\xfc\x6d\x8c\xff\xf8\xd7\xd3\x3f\x9d\xfe\xec\xff\xf8\xcd\xe9\xe9\xc9\xc9\x8f\xdf\x7d\xf8\xe6\xee\xfa\xfd\x4f\xec\xf4\xe7\x1f\x79\x99\xdf\xdb\xbf\x7e\x3e\xf9\x11\xde\xff\xb4\x63\x27\xa7\xa7\x7f\xfa\x2a\x98\x74\xca\x97\x1f\x03\xb9\xb7\x6d\x23\xb7\x59\x18\xd7\x30\x83\xfd\xd3\x53\xb7\xf7\x18\xc9\xd5\xd6\xba\x0a\x19\xd7\x23\x21\x47\xb6\xeb\x37\xa8\xa4\x04\x0e\xe0\xb7\x57\xec\xf3\xef\xf1\x97\xde\xd4\xb7\x59\x25\x14\xf6\xe8\x80\x3f\x97\xa0\xa1\x20\x91\xa0\x5f\x22\x4c\xc6\x8e\xd4\x28\xab\xe7\xa0\xb3\xd0\x23\xf6\xa5\xdd\xa0\xbf\x84\xc8\x19\xef\x34\xb2\xeb\x5a\x6b\x52\x46\xbd\x1a\xd7\x4a\x10\x25\xd6\x8e\xe8\x9e\xbb\x87\x80\x10\x33\xdf\x86\x48\x9b\xce\x6d\x88\xb4\xd9\x42\xca\x10\x69\x13\xd4\x3e\xcb\x48\x9b\x5b\xcb\x93\x7e\x91\x61\x36\xf1\x91\xf5\x3b\x66\xee\xc4\x04\xd5\x07\xbe\xe8\x1a\x5c\x1d\x33\xd5\xcd\x9b\x3d\x10\x8a\xab\x28\x33\xaa\xb7\x64\x51\x44\xca\x7b\xeb\x99\xe7\xec\x2f\x16\xc2\xe6\xde\xa2\xda\x28\x8d\xaf\x99\x97\x99\x66\x45\xc7\x84\x80\x4a\xb5\xb4\xa9\x05\x86\xf9\x53\xa5\x44\x62\x11\x7f\x2a\x90\xbc\x8c\x2a\xed\x5f\x19\x2d\xf3\x9a\xde\x63\x0e\x4d\x02\x29\xf0\x7d\xb1\x98\x7c\xfb\xc1\xa2\x05\xfa\xb9\x9d\x2c\xcd\x3d\xf4\x9e\x2f\xdc\x9d\x44\x52\x0f\x58\x59\xfb\x4a\xa3\x8c\xfb\x65\x65\x33\x9a\x73\xe9\xb2\x15\x1a\x49\x8d\x28\x41\xd6\xa0\x3c\xe8\xcd\x11\xd3\x3a\x04\x12\xd3\x3f\x2c\x9b\xee\x76\xe1\x05\x2b\x07\xe1\xa2\x78\x95\x8d\x10\xa4\x63\xad\xc9\xe0\x75\x98\x68\x5b\xf6\xee\x3c\x42\x8f\x12\x38\xc2\xa5\xf2\xb8\x12\xf9\x73\x48\xe3\x7d\x91\xc4\x7b\x22\x85\x3f\x8f\x04\xde\x4f\xe9\x3b\x9a\xe4\x1d\x47\xea\x8e\x23\x71\xef\x11\xd7\x1e\x53\xca\x8e\x23\x61\x3f\x87\x7d\xad\x90\x30\x65\x9f\xfa\x90\xb6\xec\x11\x57\x89\x86\x4f\x68\xaa\x29\x24\x14\xc0\x2b\x40\x6f\xef\x81\x05\x9a\xcc\x87\x8c\x73\x52\xd9\x45\xe3\x5e\xd8\xb7\x9b\x2c\x65\xc3\x6d\x4d\x86\xdb\x7a\x8f\x36\xdc\xd6\xc3\x6d\xfd\x22\xb7\xb5\xe3\x56\x5f\xfe\x55\x1d\x19\x69\x09\x31\xe4\x0e\x5e\xd2\xd1\x92\x11\x50\x9b\x66\xcf\xa3\x58\xc7\x78\x9e\xe3\xc8\x5d\x4e\x5c\xd0\x39\xc3\x51\xaf\xcb\x2c\xeb\x52\xe7\xc2\xb6\x18\x0b\x70\x89\xd3\x5e\x94\x59\xe6\x6a\x23\x74\x9b\xfd\x8f\x1c\x2f\xb0\x8b\xec\x81\x2e\xd5\x19\xb9\x82\x05\xc8\x33\x72\x39\xbd\x12\xfa\xda\x9a\x4e\xba\xf5\xdb\x44\xc2\xb0\x9d\x13\x36\x25\x6f\x32\xaa\x41\x69\xa2\xe9\x0c\x23\x6a\xeb\xea\x9d\x42\xb6\x06\xad\xeb\x93\x1f\xd0\xa2\x15\xbe\x37\x7f\xed\x01\xe4\x47\x87\xd9\xab\x19\x9b\x42\xb2\x4c\xb2\x70\x36\xf1\xbd\xef\xc9\x47\x9c\x7b\xf1\x00\xe3\x94\x36\x20\x54\x7f\x86\x65\xc0\x0a\xa1\xf4\xad\xa6\x52\x1f\xba\x16\xd8\xb5\x27\xc4\x4c\x76\x42\xb3\x0c\x52\xc2\xf2\x1c\x52\x46\xb5\x11\x04\xe9\x54\x83\x24\xb4\x59\x6f\x56\xd9\x20\xf0\x46\x22\xc2\x9c\xf2\x34\x03\x49\xa6\x94\x65\xaa\x7b\x28\xfa\x4a\x5d\x5b\x85\x89\x99\x8c\x5b\x00\x7c\x0c\x63\xf4\x08\xf3\x34\x49\x84\x4c\x31\x86\x56\x78\x24\x76\x7c\x89\x10\xfe\x64\xda\x47\x14\x15\x72\xca\xe9\x0c\x72\x57\xb5\xbe\x4d\xd6\x24\x13\xc9\xbd\x22\x25\xd7\x2c\xb3\x2f\x2f\xc4\x3d\x0a\xc4\x19\x9e\xd4\xce\x43\x77\x67\x00\xd5\x3f\x47\xd5\x21\x1c\x19\xaa\xd4\xf9\xaf\xeb\xaf\xf0\x83\x8e\xc4\x45\x50\xcb\x62\x28\x65\xf0\x09\x92\x10\x01\xb1\x6d\xbd\xff\x04\x49\x75\x2b\x28\xdc\xe1\x88\xcc\x69\x21\xfe\x11\x83\x37\x92\x23\xcb\xb6\x48\x01\x3d\xb1\x82\x68\x02\xb0\x8f\x9b\x2d\x76\x8c\xc8\x5b\xb7\x08\x4c\xb9\x99\xb7\x7f\x66\x8c\x43\x7b\x61\x94\x2d\x89\x09\xcd\x4a\x09\xe6\xcf\xb5\x9a\xdf\x1e\x46\x2a\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\xfe\xff\xd8\x7b\xf7\xe6\x36\x72\x6b\x5f\xf4\xff\xf3\x29\x50\x4e\xea\x48\xda\x21\x25\x7b\x92\x49\x65\x4f\xed\x7b\x53\xda\xb2\xc6\x56\xc5\x96\x79\x25\xcd\xe4\xa4\x26\xb3\x27\x60\x37\x48\xe2\xa8\x1b\xe8\x00\x68\x49\x4c\xcd\x87\xbf\x85\x85\x47\xa3\x49\xca\x36\x01\x48\xa4\x9d\xee\x54\x4d\x2c\x8a\x6a\xbc\x17\xd6\xe3\xb7\x7e\x4b\x02\x9e\x5f\x2e\xa5\x22\xb5\xa9\x52\x51\x74\x83\x92\xb4\x6e\xa0\x06\x3d\x29\x0e\xca\x11\xa2\x2a\x07\xe8\x44\xdf\x91\xa6\x6c\x0e\xcc\x8a\x65\x8c\x1e\x21\xc9\x91\x12\xb8\xa4\xd6\x4f\x06\x9f\xea\x2f\x29\xd1\xda\x2a\x38\x87\x07\xbf\x1e\x8c\x10\x51\xc5\x11\xba\xe7\xec\x40\xc1\xf4\x1d\xa3\x1b\x8e\xda\xe4\x24\x1a\xd4\x75\x64\xc9\x5b\xc4\x08\xb1\x67\xcb\x17\xca\xd2\xd7\x0d\xe2\xad\x49\xf9\x5a\x60\x95\xc2\x74\x1d\x3e\xe7\x0f\x54\x59\x36\x07\x2d\xbf\x5f\xc2\x6e\x32\x57\x16\xc2\x12\x55\xf4\x8e\x9c\x2c\x08\xae\xd4\xc2\xc0\xe3\x19\x67\xe3\x7f\x11\xc1\x81\x17\x9b\xd9\xdf\xa4\x76\x23\x2d\x46\x19\x3e\x09\xf1\xca\xf5\x0e\x65\x41\xc6\x64\xb6\x2e\xdd\xa3\xaf\xbd\x37\x24\x5a\x25\x42\xab\xf2\xe8\xed\xcd\xcd\xe4\x0d\x51\xa1\x94\x67\xf0\x21\x7a\x73\x7e\xe3\x92\x22\x82\x5a\x51\x7b\x20\xde\xf3\xa0\x35\xc7\xa8\xe1\x62\x1f\x6e\x99\x05\x97\x49\xcb\x89\x9e\xe0\x8a\x79\xcb\xa5\x32\xc1\x01\xc5\xb5\xd8\x66\x90\x29\xc7\xfb\x08\x7f\x97\x0f\x7e\x31\x39\x46\x7f\xe3\xad\x9e\x90\x29\x9e\x56\x4b\x74\x8f\x99\xf5\x76\xa7\xc1\x72\xf5\xf3\x42\x77\xe5\x85\xbe\x41\xf4\xce\x7f\x4b\x70\x49\x84\x04\x01\x4d\x70\x72\x76\x6d\xb6\xe3\x1e\xf4\x2d\xeb\x52\x9e\xb5\x52\xf1\x1a\x2d\xec\xb0\xfb\x9c\xd9\xf6\x70\x1e\x9b\xe3\x6a\xf9\x49\x05\x69\x8c\x10\xb7\x7f\xf3\xd5\x89\xe8\x35\xe9\x65\xe6\xdd\x7e\x3e\x35\x6a\x6a\x38\x6d\xd6\x63\x6e\x98\x2f\xad\x6c\xd3\x5b\x35\x1b\x90\x32\x03\x00\x1d\x65\x04\xa1\xa3\x34\x36\xed\xd5\x17\x41\xf4\x20\xf9\x4d\xf9\x70\xed\x28\x1b\x76\x1b\x3d\x09\x7e\x1b\x59\x58\x9e\xdd\x7c\x26\x72\x94\x56\x2a\x7c\xf5\xe5\x41\x85\xe6\x02\x33\xce\x68\x81\x2b\xfa\x2f\x52\xa2\xb6\xe1\xcc\x26\x6b\x81\x66\x5b\x60\x49\xc6\x10\xca\x65\x46\x9c\xcb\x80\x3e\x59\x4b\x07\xc5\x39\xa8\x7b\x80\xc6\xd2\xe2\xde\xf4\x3a\x4f\x57\xb3\xc2\x8c\x93\xb9\xc0\xc3\x67\x2d\x42\xdb\x5b\xac\x3c\x3b\x1e\x7d\x11\xea\x24\xca\x94\xc9\xbf\x4e\x96\xa5\x38\xc2\x45\x01\x04\xd1\xe6\xba\x02\xc1\x2b\x89\xb8\x4b\xdf\x5f\xd9\xe6\x55\xab\x80\xfb\xa6\x7b\x99\x20\xb6\x40\xac\xad\xa7\x44\x74\x4c\x83\x42\xad\xcf\x69\x16\xaf\x8b\x6d\xd6\x34\xe7\xc2\x7e\x4e\xc7\xc0\x6c\x4e\xd0\x2b\xdd\xf2\x1f\xbf\xfd\xf6\xf7\xdf\x66\x68\x47\x0f\xcf\xb5\x82\x19\xba\x38\xbd\x3c\xfd\xe5\xfa\xc7\x33\xe0\x2f\x4f\x7d\x7d\xa6\xac\xcb\xdc\x39\x97\x59\x33\x2e\x9f\x34\xdf\x12\x98\x00\x93\xa5\x6c\xee\x23\x71\x0d\xbd\xd2\x9b\xb0\x95\x86\xf3\xdc\xda\x24\xd6\xbb\x6d\x5c\xcc\x32\x43\x9e\x54\x18\x27\xd3\x02\x6b\x2f\x24\x95\xac\x08\x69\xb2\x59\xfc\xd7\xfa\x6d\xbd\xfa\x32\xa8\x6c\x85\x29\x33\x0e\x1e\xa6\xbe\x2f\xdf\x96\x1a\x87\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x7a\x01\x78\xdb\x1f\xff\x10\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x31\x9d\xd3\x2b\x73\xf9\xe1\xa6\xe3\x12\xd1\x5a\x38\xee\xc2\xba\x6f\x6d\xb4\x10\xb3\x12\xdd\x92\x26\xcd\xba\xd4\x02\xd3\xe1\xd2\xfa\xb0\x34\xf0\xbd\x0b\x1b\x44\x36\xf9\xba\x46\x10\x38\x38\x99\xd1\x88\xd3\x4a\xca\x04\x71\x6f\x08\x04\x5a\x23\x64\x86\x69\x85\x30\x78\xe5\x15\xad\x89\xa9\x7f\x0d\xce\xfe\x0e\x88\xf0\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x30\xc6\xdf\x6d\xed\x35\x4c\xa5\x59\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\x26\x6b\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\xa1\xd8\x09\x50\xd3\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x50\xe1\xca\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x3d\x8d\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\x0b\x03\x73\xd3\x35\x4b\x0a\xe7\x77\x13\x5b\x08\x2c\x17\x04\x92\x31\xc9\x03\x55\xd2\x34\x6a\xe8\x3d\xdd\x8c\x6b\x7d\x61\x2e\x70\x41\x50\x43\x04\xe5\x5a\xc5\x68\x99\x2a\xf9\x3d\x43\x53\x32\xa7\x4c\xba\x15\x4b\xe9\x92\xdb\x12\x80\x24\xa2\xd2\x97\x80\x3e\x46\x57\xbd\x52\x64\x96\xae\xaa\xe0\x9d\xcc\xb4\x53\x34\xca\x34\x25\xa0\xbc\xc0\x36\x68\x71\x55\x2d\xbb\x8d\x17\x32\x4e\x3e\x32\x43\xf1\x1b\xc2\xcc\xec\x61\xcb\x60\xa0\x25\xa9\xf0\xd2\xa4\x24\xcf\x28\x03\xef\xaf\x90\x47\xc7\xe9\xd0\xac\xe8\x0e\x72\x11\xbc\xf3\xd1\x9d\x41\x25\x12\x04\x17\x49\xc4\xb8\x03\x06\xec\x53\xcf\x80\x01\x1b\x30\x60\x03\x06\x6c\xfd\x19\x30\x60\xfd\x67\xc0\x80\x3d\xde\xa1\x7d\x0e\xda\x0d\x18\xb0\xc1\x2b\xb3\xfe\x0c\x18\xb0\xa8\x67\xc0\x80\x7d\xf2\xd9\x3b\x11\x3d\x60\xc0\x3e\xe3\x19\x30\x60\x9f\xf9\x0c\x18\xb0\x01\x03\x36\x60\xc0\x06\x0c\x58\xc2\x33\x60\xc0\xb6\x1f\xde\x10\xfc\x89\x7f\x06\x0c\xd8\x80\x01\xdb\xf2\x19\x30\x60\x2b\xcf\x80\x01\x1b\x30\x60\x1f\x7b\x06\x0c\xd8\x80\x01\xb3\xcf\xe0\x6d\x5c\x7b\x06\x0c\xd8\x86\x67\xc0\x80\x6d\xd7\xce\x60\x06\xa4\xbd\xec\x49\xcc\x00\xa9\x78\x73\x4d\xe7\x09\x44\x83\xb9\x8e\xc1\xb5\xef\x89\x65\x21\x94\xb6\x7a\xab\x34\x1f\x3a\x3f\x16\x30\x94\xe9\x03\x11\xa2\x74\xba\x9b\x64\x4a\xb4\x89\xa0\x87\xd5\xa4\xdc\x26\x17\x33\x08\x20\x07\x24\x69\xfa\x54\x58\xb1\xa6\xdb\x09\xea\x04\xf4\xd5\x67\x77\xbb\x51\xa6\x6d\x97\xf8\x1e\x04\xf3\x51\x60\x66\x4a\x6d\xda\xba\xcb\xfa\x7a\x9f\xf0\x52\xba\xd2\x04\x8c\xb3\xb1\x61\xff\x3c\xd6\x1d\x3e\xe6\xf2\x38\xc1\x1b\x9c\x48\x7a\x66\x30\x72\x13\xc1\xa7\xe9\xc4\x67\xf0\x16\x09\x15\x39\xbf\x52\xda\xb3\x14\xf4\xce\xce\x90\x3b\x7b\x82\x7c\xca\x80\xd6\xc9\x79\x87\xef\x29\x4a\x67\x3f\x11\x3a\xfb\x88\xce\xd9\x05\x32\x67\xe7\xa8\x9c\x3c\xe1\xde\x0c\xa1\xde\x4c\x9a\xd2\x13\x84\x4d\x2c\xc0\xfb\x66\x21\x88\x5c\xf0\x2a\x5a\xe0\xe4\x12\x36\xef\x29\xa3\x75\x5b\x03\xdd\xbe\x96\x29\xf4\xce\x83\xd0\xa5\x13\x19\x16\x9b\x6e\x22\xe1\xc0\xcb\x5f\x12\xa8\x77\x8c\x69\xa5\xb7\x16\x90\x58\x2e\xf0\x1d\x28\x4b\x6d\x51\x10\x52\xa6\xa8\x4b\xa1\x17\xf5\xf7\xc7\xbe\x87\x86\x8c\x9c\x4a\xf4\x2a\xed\xaa\x49\xd3\xc7\x03\x37\xd3\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\x78\xec\xee\x66\x4e\x77\x7f\x24\xb9\x3e\x72\x28\x06\xa9\xd6\x7d\x5f\x07\xd5\x06\x78\x3f\x34\x37\x87\x55\x24\xe2\x8e\x16\xe4\xf8\x19\x0c\xe8\x5c\x46\x69\xfa\x41\x40\xe0\xbe\x86\x81\xef\x8b\xda\x75\x6d\xba\xe3\x3d\xdf\x81\xef\xc4\xf6\x14\xc0\x8c\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\x7c\x8a\xc2\x9c\xaa\x45\x3b\x3d\x2e\x78\x7d\xa2\x45\x87\xf9\xcf\xb4\xe2\xd3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xb8\x36\x3d\xe8\x11\xe3\x75\x4a\xb4\xdc\xe7\x62\xc5\x8a\xd5\x93\x92\xbe\x49\x93\xef\xef\xd4\xea\x09\x89\x70\xd9\x9d\x40\x65\x07\xa9\x8d\x32\x38\xaa\x73\x0a\x95\xfd\x80\xc3\x3e\x19\x14\x36\xcb\x59\xcd\x04\x81\xdd\x23\xf8\xeb\xde\xd8\x42\xfb\x02\x79\xdd\xc3\x9a\xfb\x19\x60\xae\x39\x20\xae\xf9\xe0\xad\xfb\x5a\x9a\xfe\xc9\x20\xad\x5f\x04\x9c\x35\x63\xdc\x26\x13\x8c\xf5\x39\x20\xac\xfb\xeb\x83\x41\x19\x60\xab\xcf\x07\x59\xcd\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x88\xea\x73\xc4\xa5\x9f\x2c\x26\x9d\x21\x1e\x9d\x33\x16\x9d\x2d\x0e\xfd\x64\x50\xd4\x74\x18\x6a\x56\x9f\xc2\xb3\xc0\x4f\x73\x42\x4f\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x00\x8a\xb9\x56\xe2\x72\x0d\xc4\x68\xdc\xd6\xfd\x78\xfb\x02\x4b\xe4\xaa\x20\x59\xea\x11\x17\x84\xb6\x2a\x30\xc4\x8f\xcd\xf8\xa2\x8b\x91\xa1\xed\xb9\x28\xee\xb9\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\x7f\x3a\x26\x8a\x80\x82\x22\x49\x4d\xdf\x0f\xf7\xb8\xe1\xfb\xd8\x93\x5d\xf3\x96\xdf\x23\x3e\x53\x84\xa1\x43\xca\xdc\xce\x39\x0a\xbc\x34\x5d\x78\x24\x39\xde\xa1\xdf\xfa\xea\xa5\x6b\xe4\xeb\x8b\x7b\x40\x64\x48\xca\xbd\x8e\x7c\xd9\x3e\x7e\x3a\xf4\x65\xbf\x38\x6b\xab\x7e\xf8\xcb\x84\xc4\xf2\xc4\xbe\x5e\x1d\xa3\xf7\x56\x9d\x78\x05\xfd\xf1\xa2\x08\xb3\x12\x59\xde\xa8\xaf\x6f\x9f\x24\x43\xb0\xfb\xc6\x8d\xc7\x4c\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\x7f\x0b\x14\xd0\xc1\xe9\xba\x37\x4e\xd7\x1d\x21\x83\xbf\x3e\x6b\xeb\xf9\x91\xc0\x83\xb5\xf5\xef\x62\x6d\x05\x74\x6d\x6f\x04\x2e\xc8\x64\x9f\x94\x37\x27\x40\xba\x04\xb5\x4e\x87\xf3\xe2\x82\x11\x62\x12\x9a\x3a\x32\x3e\xe0\x9d\x9b\xb5\x55\xb5\x34\x3e\xc4\x1e\x33\x63\xfc\xd6\xba\x59\x90\x35\x4a\x3b\x08\xa5\x6e\xe8\x5d\x67\x9b\x34\x82\x5b\x8d\x44\xb4\x8c\x69\x15\xc3\x1e\x27\xdd\x79\x6d\x8b\x48\xc2\xe2\xdd\xe9\xb8\x47\xb8\x67\xc1\xd1\x00\xf4\x5c\x10\xd4\xe5\xd5\xf4\x3b\xa2\x5b\x9d\x71\x51\xd0\x69\xb5\x44\x0b\x5c\x69\x63\xc9\x82\x87\x6f\x69\x55\xd9\xd7\x24\x80\x95\x89\x32\xa1\x67\xa3\xd1\x54\x9c\xcd\x61\x32\xb0\xe9\x08\x79\x68\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc9\x5b\xe1\xfa\x99\x84\xd6\x0e\x5a\xa7\x12\x31\x5a\x8d\xdc\x94\xf7\xa9\x19\xd7\xf7\x7c\xe7\x52\x96\xa4\xb4\xac\x8a\xf7\x54\x92\x11\xbc\x33\xba\x4f\xa6\x2f\xfc\x8e\x08\x41\x4b\x62\xf6\x8d\xf9\xac\x11\xfc\x8e\x96\x1d\x76\x5c\x6f\x0b\xc0\x6d\x47\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\x39\x06\xf5\xd8\x0a\x34\x83\xe8\x34\xed\x1b\xfc\x20\x2b\x69\x81\x15\x91\x80\x95\xef\x51\xae\xde\x51\x1c\xdd\x13\x3d\x9e\x60\x47\xa1\x43\xc6\x11\x87\x8c\xb7\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\xec\x28\xe5\x60\x1a\x98\x03\x46\x53\xa2\x70\x97\xb4\xe6\x54\x32\x89\x08\xc3\xd3\x4a\x9f\x3d\xc0\x90\xdf\x6c\xdc\x00\x68\x46\xb0\x6a\x05\x41\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x37\x43\x2d\x93\x24\x51\x91\xcd\x66\x02\x44\x66\x62\xea\x13\xcd\x5b\xb5\x27\xf7\xc8\x63\xae\x23\x93\x51\x12\x18\x89\xb4\x26\x12\xf1\x36\xc1\x93\xd7\x33\xff\x6c\x73\x39\x2d\xbc\xc1\xef\xb4\xf1\x89\x0d\x9b\xe6\xd8\x61\x97\x81\x56\xbe\x21\x0f\xa5\x03\x5e\x99\x1c\xdf\xd7\x97\xd7\xbf\xbc\x3b\xfd\xef\xf3\x77\x71\x5b\x00\x64\x1d\x0b\x75\xe7\x96\xd1\x7f\xb6\x04\xe1\x9a\xb3\x39\xc2\x55\x98\x02\x33\x02\x47\x67\xf0\x01\x48\xc5\xbc\xc9\x32\x91\x7a\xad\xbe\x04\xa2\x04\xc3\x1a\x1c\xf3\x39\x32\x82\x62\x51\x20\x09\xe8\x8f\x3e\x12\xc6\x8d\x01\xf0\xa7\x3d\xf2\x06\x46\x94\x3e\xe3\xc6\x20\xa4\x0c\x61\x24\x29\x9b\x57\xc9\xb6\x60\xb2\x47\x24\xd5\x1f\x32\xee\x46\x30\x89\x75\x8b\xa4\x3b\x45\x7a\x7d\x88\xb7\x2a\xf3\x39\x04\xba\xcb\xcc\xb9\x00\xc8\x43\xc3\x25\x71\x2e\x00\xa3\xe3\x5e\x4c\x10\x2e\x4b\x91\xa4\x47\x5b\x61\xe3\x6d\x74\x43\x10\x60\x9a\x35\xa1\xdf\x11\x7a\x89\xfe\x0b\x3d\xa0\xff\x02\x87\xc0\x1f\xe3\x9b\xca\x63\x6e\xe7\x40\x34\x2f\xb8\x54\x17\x93\x4c\x0b\xfd\xd7\x05\x56\xf0\x46\xbd\x1e\x8a\xa3\x29\xb5\x96\x19\x79\x50\x44\x68\x8d\xd8\xae\x61\xea\xcc\x25\x39\x17\x74\x07\xbf\x94\xdd\x9d\x1a\x67\xbd\x98\xf5\x81\xd0\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x96\x8b\xb0\x1f\x35\x56\xc5\xa2\x2f\xee\x53\x5a\x7d\xaf\xf7\x5e\x70\xfd\x97\x1c\x2e\x4a\x93\xce\xb6\xa0\x09\xc2\x61\x7f\x4e\x6c\x1a\x64\x2e\xdf\xd6\xfd\xd8\xd6\x5a\x71\x6f\x82\x1a\x66\xf5\xb6\xa0\x72\x44\xc3\xcb\x63\x74\x8e\x8b\x45\x42\x2f\xf4\x6c\x94\x81\x32\xd0\xf0\xd2\x74\x63\x81\xef\xf4\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4d\xc1\x8f\x09\x32\x23\x42\x98\x94\xc9\xe9\xd2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x89\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\x87\xd7\x93\x11\xba\x39\x9b\x8c\x10\x17\xe8\xfa\x2c\x0d\x07\x12\x5a\xa3\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x3a\xc7\xcd\xd9\x24\xe2\x25\xeb\x48\xc2\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x40\xb6\xf0\xf9\xcf\x40\xb6\x30\x90\x2d\x0c\x64\x0b\x03\xd9\xc2\x40\xb6\xb0\xbf\x40\xff\x81\x6c\xe1\x93\xcf\x40\xb6\xf0\xe8\x33\x90\x2d\x6c\xf5\x0c\x64\x0b\xeb\xcf\x40\xb6\xf0\x91\x67\x20\x5b\xf0\xcf\x40\xb6\x30\x90\x2d\x7c\xb9\x52\x7b\x20\x5b\x58\x7d\x06\xb2\x85\x81\x6c\x61\x20\x5b\x08\x9f\x81\x6c\xe1\x91\x67\x20\x5b\x18\xc8\x16\x06\xb2\x85\x8f\x3f\x03\xd9\x42\xf4\x33\x90\x2d\x6c\xf7\x0c\xe9\x3f\x5b\x3e\x03\xd9\xc2\x40\xb6\xb0\xfa\x0c\x64\x0b\x9f\x7c\xf6\xc3\x3d\x3e\x90\x2d\x0c\x64\x0b\x1f\x7d\x06\xb2\x85\x81\x6c\xe1\xa3\xcf\x40\xb6\x10\xf1\xec\x9d\xd3\x75\x20\x5b\x18\xc8\x16\x3e\xd6\xc6\x60\x6d\x6d\xf7\x0c\x64\x0b\x03\xd9\xc2\xda\x33\x90\x2d\xac\x3f\x03\xd9\xc2\x40\xb6\x30\x90\x2d\x0c\x64\x0b\xfe\x19\xc8\x16\xbe\x76\xbf\x93\x20\x92\xfe\x8b\x4c\x78\x45\x8b\x65\x72\x9e\xc9\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x67\xc9\xfb\x57\xc1\xc4\x85\x49\xfc\xc2\xce\xc1\x53\x4c\xc1\x5e\x24\xf2\xbb\x01\x5e\xc6\x23\x08\xe0\x25\x0a\x0b\x65\xa6\x2f\xce\x59\x9a\x6c\xb5\x87\x03\xd9\x87\x44\xc2\x90\x7b\xc4\xef\x22\xc5\xbd\xb0\xa5\x8f\x6e\x2e\xdc\x34\x15\x4d\x49\xc9\x44\xe8\xba\x05\xed\x82\xd8\x10\xb8\xfc\x0e\x15\x4d\x3b\x42\x35\xa9\xb9\x48\x48\x8c\xc8\x60\xc1\xf5\xb6\xca\x3e\xac\xd3\x95\xe9\x90\x9b\x7c\xc5\x61\xfe\x97\xc6\x5e\xe8\x08\x62\xfc\x5a\x51\x27\x0e\x93\xb0\x66\xeb\x65\xab\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x30\x9d\x5b\x26\x72\xc1\xbb\x0b\xed\xb3\x73\x27\xd1\xf9\x86\x4f\x21\xfe\x29\x1b\xfd\x12\x3f\xa6\xa8\x0e\xe1\x4a\x10\x5c\x2e\xa1\x1b\x05\xe0\xf5\x3a\xff\xdf\x17\x98\xb6\x59\x54\x98\xc6\x83\xfc\x72\x1d\xe9\x33\xe8\x05\xd2\xfb\xb5\x03\xbf\x43\x1e\x99\x5f\xac\x91\x87\x78\x53\x73\xc6\x8f\xdd\xaf\xcc\x1f\x8f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x66\xdc\x19\x93\xae\x24\x0d\xd1\xda\xbb\x71\x76\xc6\xeb\xe8\x4b\x86\x6b\x5a\xb8\x53\x71\x6a\x36\x21\xe5\x6c\xc5\x02\xcc\xd1\x65\x6d\x98\xd6\x75\xab\xf0\xb4\x22\xc7\xe8\x42\x6d\x2c\x95\x9f\x96\xb3\x8c\xb2\x60\x55\x13\x71\xaa\x1b\x15\x68\xd8\x54\x86\x79\x81\x30\x2d\x7e\x38\x23\x88\x30\x25\x96\x7a\xff\x4d\x78\x79\xad\xb7\x60\xef\xdb\xc9\x84\x0c\x89\xf0\xd4\x1c\xd0\xd4\x44\x58\x6a\x1e\x30\x69\x3a\x90\x34\x2f\x88\xb4\x73\xf7\x1b\x3e\x99\x30\x3b\xa7\xb7\x2d\xf4\x15\xb0\x41\x34\x21\x3e\x4b\xec\x81\x6e\x71\xc2\x4b\xad\xe0\x08\x62\xe4\x93\x3f\xa3\xc6\xd9\x77\xa1\x3b\x77\x0b\xde\x39\xac\x3a\xcd\x07\xdf\x61\x5a\xe9\x03\x9c\xd8\x01\x9f\xdd\x9c\x29\x4a\x93\x29\xae\x60\x81\xf4\xfb\xb4\x59\x6c\x0a\x56\x2f\x8b\xab\x58\x70\x49\x18\xc8\x4b\xec\xb3\x6d\x7c\x2e\x80\x15\x31\xa5\xb9\x8b\x53\x11\xbf\x17\x33\x44\xea\x46\x2d\x47\x88\xdc\x11\xb1\x54\x0b\x40\x06\x08\x6e\xd0\x22\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x8c\x10\x77\xce\xe2\xc4\xe6\xe1\x7e\xb0\xf6\x53\x5b\x29\x63\x4d\x81\xfe\x9d\x94\x0e\x6a\x9e\x0c\xbb\x26\x37\xe9\x09\x4a\x15\x9a\x39\x49\x4b\xf4\x53\xd1\x9a\xc6\x51\x41\xa2\x8c\x67\xe1\x1d\xf4\x22\x48\xf3\xd0\x5b\xa2\xc6\x0f\xe0\x4a\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x95\xdc\x69\xf7\xcf\xe6\x63\x2c\x38\x9b\xd1\xb9\x8d\x82\x9d\xd4\x98\xe1\x39\x19\xfb\xee\x8c\x3b\xf5\xe6\x64\x77\xe8\x0c\x5c\x3a\x1a\x89\x49\x8e\x9c\x62\xac\x14\x11\xec\x3b\xf4\x3f\x87\x7f\xff\xdd\xaf\xe3\xa3\x3f\x1f\x1e\xfe\xf4\x72\xfc\x9f\x3f\xff\xee\xf0\xef\xc7\xf0\x8f\xff\x38\xfa\xf3\xd1\xaf\xee\x87\xdf\x1d\x1d\x1d\x1e\xfe\xf4\x97\xf7\x6f\x6e\x26\xe7\x3f\xd3\xa3\x5f\x7f\x62\x6d\x7d\x6b\x7e\xfa\xf5\xf0\x27\x72\xfe\xf3\x67\xbe\xe4\xe8\xe8\xcf\xbf\x8d\x8f\x14\xa6\x86\xc5\xf3\x05\xc5\x33\x85\xc4\x9f\x24\x20\x6e\x65\xec\xce\x0f\xbf\xbd\x02\xd7\x8e\xbf\x8d\x24\x7c\xec\xf8\x8b\x64\xff\xc9\xc5\xac\x6b\x9f\x4a\xc4\x6b\xaa\x94\xf5\x16\xe0\x90\xa7\x66\xc5\x77\x63\x05\x16\x9d\x19\x05\x8a\xca\x90\x2f\xa5\x73\xf9\x44\x77\xcb\xdf\xaf\xe0\xad\x62\x88\xd6\x4d\x45\x6a\xc2\x14\x08\x9e\xb1\xb3\x6d\xc1\xf5\x77\xdc\x8d\xa0\xc0\x8c\x71\x85\xc8\x43\x41\x48\x69\x3b\x39\xc8\xc6\xe0\x19\x64\xe3\x20\x1b\x3f\xf5\x24\xfb\xaf\x33\x39\x32\x43\x9f\xf5\x5a\x34\x4a\xcb\x05\x73\xc4\x9c\xfa\x0c\x5f\xf7\x1c\x07\x7c\x86\x48\x2c\x97\x65\xd7\x88\xa5\xc7\xc4\xb1\xde\x4a\x04\xf9\xe1\x56\x2a\x49\x87\x95\x31\xb6\x28\x67\xfb\xc1\x85\xde\x5b\xee\xab\xb6\xda\xa5\xf3\x3a\x60\x16\xd7\xba\x3d\x78\x34\x75\x8f\x1c\xa8\x7b\x41\x8a\x5b\xe3\x42\x2e\x89\x01\x59\x10\x73\x07\xc5\x69\x00\x01\x4d\xfe\x82\xb7\x55\xa9\xdb\xb0\xd3\x41\xcc\x02\x3d\x50\x75\xfc\xd1\x35\x8c\x6a\xf7\x2b\xa5\x87\xb7\x67\x56\xef\xa1\x40\x97\x59\xf0\xfb\x50\x95\x80\x39\xd5\x0a\xc3\x02\xb3\x32\x1a\x7f\xbf\x07\x61\x65\x0c\x98\xf4\x1d\x85\x82\x4d\xe3\xfb\x10\x5c\xbc\xf6\x50\x7d\x2d\x87\xb1\x05\xea\xe3\x5b\xc2\xf4\x01\x5a\x5f\xf8\x99\xa7\x74\xa0\x02\x34\xba\x14\xa6\x02\x00\x55\x62\x45\xa5\xd6\x36\x0d\xd4\x0d\x3c\x2a\x0d\x97\x92\x4e\x2b\xd2\xc1\x70\x5e\xd8\xcd\xf9\x42\x0b\x0f\x77\x5b\xa4\x51\x2c\x66\xf0\xed\x65\x50\x00\xf4\xac\x9e\xf1\x32\x45\x8d\x5b\xf1\xe8\x7b\x21\x6c\x10\x9c\x50\xc2\xa3\x34\x32\x18\x04\xb0\x5e\xd7\xfe\xaa\x7e\x1d\xae\x7c\x7d\x26\xb1\xe2\xf1\x2a\x5d\x1e\x77\xbe\xeb\xc6\x7e\x79\x69\x7b\x9b\x42\x90\x0a\x8c\x1c\xb9\xa0\x0d\x9a\x12\x75\x4f\xc8\x4a\x52\x42\xb7\x6f\x0e\xe5\x91\x43\x29\x27\x76\xa2\x43\x2a\x18\xc4\xc7\x31\x9a\xf4\x8e\x39\xc4\xbc\xd3\x89\x46\x2e\xd8\x77\xab\x22\x0a\x98\x50\x9d\x98\x71\x22\x6c\xc3\x58\x21\x06\x98\x16\xb1\xf4\x83\x25\xa0\xfd\xac\x8d\x39\x79\x78\x97\x5c\xa5\x8d\x30\x79\x68\x5a\x8f\xb2\xde\xfc\x27\x19\x65\xa6\x60\x89\x85\x15\xed\xd1\x29\xec\x5f\xb5\x76\xee\xec\xd6\xf7\xc2\xb9\x17\x65\x0e\xc4\x77\xea\xce\x39\x55\xa8\xe6\x52\xa1\x6f\xbe\xfd\x16\x11\xe3\x8b\x31\x20\x93\x64\x17\x34\xca\xc6\xc0\x94\x85\x83\x29\x1f\xed\x22\xca\x46\xbd\x88\x3e\x12\xf9\x88\x23\x1b\xcb\x0c\x7c\x92\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\xa8\x08\x63\x8e\xb3\xd2\xe5\x21\x5e\xf7\x3b\x64\xd1\x30\xee\xe4\x98\xdf\x21\xde\x18\x6a\xe9\x47\x8b\xa7\x75\x56\x61\xcb\xc0\x19\x10\xb7\xcb\x2f\x66\x7a\x95\x4c\x62\x0a\x18\x8e\x80\xd5\x59\xed\xa2\x4b\x19\x31\xdd\xf9\x67\x4b\xef\x70\xa5\x45\x73\xf7\x17\x13\x48\x22\x08\xff\xe8\x0b\x84\x50\x81\xbc\x98\x08\x7a\x47\x2b\x32\x27\xe7\xb2\xc0\x46\x99\xd8\xb5\x1b\xfe\xf4\x91\x7e\xc1\x7e\x10\xbc\x92\xe8\x7e\x41\xd4\x82\x08\x84\x5d\xe2\x12\x40\x7c\xe6\x98\x32\x54\x73\x91\x02\x03\xb1\x8d\x4a\x93\x39\x45\x95\x44\x0d\x16\x7a\xed\x5d\x86\x94\x01\x1a\x4d\x39\xaf\x2c\x4b\x7c\xb5\xec\xfa\x45\xe3\xf1\x12\x10\x73\xe7\xbf\x30\x72\xff\x8b\xee\x85\x44\xb3\x0a\xcf\x7d\x62\x14\x5c\x31\xab\x9a\x5d\x72\xd2\xd6\xa3\x13\x0d\x14\xe8\xad\xbe\x51\xee\xf1\x52\x76\xe9\x6c\x5d\xdb\x34\x41\xb6\xbf\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xe6\x08\xf8\x47\xce\x4e\x27\xbf\x5c\xff\xed\xfa\x97\xd3\xd7\xef\x2f\x2e\xa3\x5f\x76\xc9\x15\x31\x71\x94\xc0\xb5\x64\x1d\x4e\x76\x15\x3c\x54\xf7\x98\xcb\x63\x00\x49\x00\x97\x1a\x2b\xf9\x7d\x22\x92\x4c\xef\x29\x82\xe3\xfc\x18\xb8\x69\x4e\x45\xcd\xc5\x44\xf0\x19\xad\xa2\x75\xef\x5c\x27\x78\xa5\x3b\x0e\x53\x72\x6a\x3f\xee\xc4\xbd\xa1\xf7\x59\x87\x2e\x06\x82\x9a\x02\x89\x8c\x7e\x4d\x7c\x0c\xab\x97\x02\x68\x12\x12\x57\xba\x18\x7f\x88\x76\xba\x67\x76\x4e\x9e\xa0\xbb\x11\xf9\xe7\x39\x8c\xf4\x8a\x17\xb8\x82\xc2\x75\x69\x1b\x1f\x65\x36\x11\x56\xfb\x15\x24\x7b\x62\xb7\x9d\x51\xc5\x71\x69\xbc\xdb\x46\xf8\x97\xc4\x15\xb5\x70\xca\x0e\x40\xe4\x92\x3a\x72\x63\x12\xed\xa0\x3d\x97\x9d\xda\x08\xe2\x22\xa4\xab\xcd\x73\x53\xcb\x23\xa9\xc9\xf7\x7d\xc0\xa1\x1d\x65\x8f\x47\x21\xf5\xcc\xf9\x66\xec\x01\xa3\x33\xf0\x6c\x80\xc7\x51\x9b\xcc\xcb\xc6\xb8\x1a\xdf\xb9\x65\x48\xa8\x78\x95\xc9\x8c\x85\x97\xec\xc9\xee\x34\xf3\xe3\x77\xa4\xc9\x12\xba\xa5\x7a\x06\x67\x9d\x90\x76\xdb\xc6\xe9\x20\x26\x55\x28\x71\x3f\xfe\x08\xb5\x15\x9d\xfc\xcf\xe0\x26\xf2\x4b\x8c\xc6\xc1\xd1\x6a\x04\x19\xaf\x1f\xaf\x54\xcb\xfb\xaa\x65\x8a\xd6\xc4\x51\x4f\x8d\x57\x74\x22\x61\x7e\x7d\x20\x3d\xd1\x7b\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x2e\x80\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\xa8\x9b\x14\xf4\x07\x70\x2b\x65\x79\x52\x0a\xde\x98\x9b\xd8\x71\x42\xa4\xa7\x00\xf4\x73\x8f\x43\x8a\x7f\xeb\x13\xea\x75\x64\x2e\x30\x53\x1d\xe9\xc0\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x81\xec\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x6c\xe6\x67\x6e\x70\x41\xf2\x31\x9a\x7c\xb8\xbe\xf8\x3f\x2b\xe7\x26\x5e\xb5\x33\xcf\x7e\x73\x19\x6b\x79\x90\x6d\xdb\x5c\x91\x9a\xdf\x0d\x1b\xe7\xab\xdf\x38\xde\x41\xb4\x73\x22\xc6\xab\x36\x8c\xfd\x52\x16\x74\x0d\xd5\x49\xba\xce\xc4\x73\x16\xf5\xdf\x1a\xe4\xa4\x62\x41\x90\xfe\x0a\x53\x14\x57\xd5\x32\xf4\x91\x2a\x6e\x6a\x1c\x66\x29\xd4\x1d\xde\xae\x33\x5c\xc9\x2f\xf5\x8a\x4c\x71\xed\x34\x82\x17\xef\x79\xcb\xf2\x30\x3b\x26\xec\x38\xdf\x11\x54\x12\xc6\x95\xf5\xa6\x80\x2d\xc1\x67\xf0\x5b\x64\x00\xd2\x01\x69\x73\x4f\xcf\x49\x50\xb3\x6e\x02\xd5\xca\x23\x49\x9c\x1e\x6e\xec\x97\x56\x12\xb9\x59\xaf\xea\xf0\xd2\xb3\x04\x4c\x81\x20\xb8\x34\x90\x16\xac\x16\x86\x4d\xb4\xc6\xf2\x96\x94\xe6\x83\x44\x26\x25\xcf\x9a\x04\x19\x73\x6e\xa6\x6f\xf4\xe4\xba\x04\x59\x70\x08\x1b\xf8\x1d\x50\x2b\xa5\x98\x62\x3b\x3d\x0d\x09\x82\x5d\x2f\xc2\x07\x56\x2d\xaf\x38\x57\xdf\xfb\x62\xa9\xbb\x3e\x19\x7f\xb5\xe1\x88\xbe\x13\x13\xfc\xd2\x18\xba\x3c\x86\x8d\x03\x72\x31\x28\xf1\x9a\x2a\x16\xf5\x82\xfc\xbb\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xc9\xf6\x98\x12\xcb\x86\x53\xa6\x9c\xc7\x2b\x63\xd0\xe6\x07\x4b\x6b\x18\x4a\xb6\x64\x06\x33\x84\xde\xe3\x25\xc2\x95\xe4\xde\xa5\xc6\x36\x05\x39\x5d\x04\x55\xff\x7a\xca\xd5\x62\x2d\x74\x8a\x59\x7c\x28\x67\xbd\xbd\x51\xc0\xd9\xd7\x41\x53\x28\x5b\x6b\x56\x41\x0a\x71\x23\x48\x41\x4a\xc2\x8a\x2f\xf5\x44\xec\x9a\x42\x0e\x4e\xd5\x25\x67\x5a\xbc\xee\xfa\x5c\x5d\x78\xff\xa4\x5d\x8d\xf0\x14\x81\x2b\xdb\x06\x11\x31\xd0\x2d\x82\x70\x6d\x65\x0a\x06\xf4\x62\x06\x51\x4f\xb3\xe9\xfe\xd2\x4e\x49\xa5\x17\x9b\x56\x95\xde\x81\xb4\xc4\xca\x00\x02\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x68\x3c\x7c\xb2\xe4\x44\xfa\xc2\xdc\x58\xa2\x1f\x2e\x5e\xa3\x97\xe8\x50\x8f\xcd\x60\xf7\x66\x98\x56\xc0\xe0\xe8\x50\xb3\xa1\x0d\x30\x83\xdc\x30\x9e\x82\x30\xba\xb0\x72\x04\x71\x61\xae\x96\x11\x62\x1c\xc9\xb6\x58\xb8\x39\xa0\x9c\x79\x8f\xb0\xa5\xf3\x4f\xca\x7a\x1d\xc4\x4e\xbe\xfb\xf0\x07\x49\xa2\xc1\xaa\x39\xaf\xc3\x1f\x9e\xf1\x3a\x0c\x4d\x44\x7d\xfc\xfb\x0b\x66\xce\x6a\x4d\x14\x2e\xb1\xc2\xf6\x9a\x74\x5f\x18\x76\xed\x70\x59\x26\x5c\x96\x92\xbc\xa3\xac\x7d\x30\x48\xb7\xbd\x08\x7b\x5c\x9f\x43\x8f\xe0\x78\xc1\x42\xf3\x20\x6e\xe7\x22\x14\x19\x92\x25\x2e\x7a\xc7\x68\xf4\x88\xd5\x0d\xb7\x84\x63\x1b\xd3\x86\x10\x66\x25\xaf\xd7\x3a\x09\x74\x68\xb1\x09\x82\xa8\x97\xfd\x31\x1c\x4c\xf7\xfc\x7b\x07\x84\x2a\x72\x47\xaa\x6c\xbe\xfd\x77\xfa\x6d\x7a\x72\xdc\xce\x85\xd7\xa3\x0a\x4f\x49\x65\x39\xd8\x0c\x89\x66\xc6\x13\x96\xc9\x07\x2e\x78\x46\x48\xcc\x15\x37\x48\x2e\xec\x27\x42\xbf\xfe\x8b\x98\x87\xac\xe0\x8b\x1b\x8b\x2e\xe9\xe6\x01\x7c\xa0\x5f\xc2\x3c\xb4\x09\x0a\x22\x5a\x9d\x07\xad\x6d\xf6\xe7\x01\xf4\xaf\x7d\x9f\x07\x49\x8a\x82\xd7\xcd\x9e\x20\x25\x6f\x0c\x0a\x5e\xf7\xe8\x73\x51\x91\xfd\x2f\xe3\x24\xb8\xb3\x2d\x83\x80\x95\xb9\x07\x5d\x2d\x84\xff\x1d\x5c\xe7\x20\xed\x56\xef\x78\xdb\x7a\x32\x22\xd3\xb7\x68\x5f\xf8\xef\x78\xe3\x0d\x30\xcc\xde\xf3\xec\x30\xcc\x80\x9e\x15\x83\x7b\xbe\x07\x89\xfc\x1a\xc0\x98\xda\x08\x80\x79\x25\xac\xa4\x6c\x0e\x01\xab\x91\xcd\x1d\xbd\x23\x4e\x3c\xdf\x1a\x8f\xd7\x01\x48\x1c\xd7\x21\x27\x6e\x3a\xcc\xaa\xa1\x6d\xcd\x8a\xdd\xdc\x84\xd7\x34\xdf\xb9\xfc\x70\x13\x92\xb6\x62\xb6\x34\x84\x44\xf0\x27\x3b\xbf\x4e\xbf\x18\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2e\x43\x27\x08\xae\x52\xd9\x5e\xcc\xb3\xc9\x0b\xe2\x4e\x81\xe7\x2d\x5d\xf7\x06\xf4\x8b\x5d\xa5\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x42\xcf\xa0\xa2\xb8\xba\x6e\x48\xb1\x2f\xb7\xc5\x9b\xf7\xd7\xa7\xfd\x9e\x81\x2e\x6c\x59\x9a\x09\xfc\x1e\xe1\xb2\xa6\x52\x42\xc0\x87\x4c\x17\x9c\xdf\x26\x35\x79\xe8\x98\xfb\xe6\x54\x2d\xda\xe9\x71\xc1\xeb\x80\xc4\x6f\x2c\xe9\x5c\x9e\x58\x89\x32\xd6\x13\x77\x84\x28\xab\x7c\xa6\x30\x78\x0b\x99\x92\x36\x82\x90\x3c\x78\x54\xf8\xd1\xc3\xd6\x83\xfc\x14\x0f\xcd\x5e\x9f\x1e\xa0\xd2\x86\xcd\xbb\x73\xad\x63\x7d\x57\xa5\x95\xa1\x59\xd9\x59\x8f\x8c\x3d\xa4\x85\xb6\x51\x9c\x8d\xf3\x68\x8c\xd7\x9d\x4f\x92\x55\xfa\x0b\x22\x93\x10\xb0\x39\xcf\xdc\xdb\xae\x4b\x1d\x69\x1a\x30\x77\xe2\x47\x33\xdd\x21\xbc\x7d\x00\xa5\x7c\xed\x9f\x1e\xe4\x62\x32\x3f\xad\x2a\xbd\x90\x58\x5f\x13\x07\x32\x44\x77\x82\x69\xb2\xc0\x77\x46\x14\x48\xbd\xe2\x64\x36\x23\x05\x18\x0b\xe1\x28\xe0\x22\x49\x13\x0a\x86\x81\x2c\x2c\x8f\xa2\xb8\x69\x1b\xa3\x9a\x3e\xe8\x1e\x86\x2d\x86\x18\x54\x56\x42\xe0\x7f\xf3\xaf\x13\x2a\x1b\x22\x00\x1f\x78\x82\xce\x91\x5e\xa1\xb0\x11\x97\x1c\xad\xf4\xb5\xa5\x7f\x71\x49\x94\x36\xd4\xcc\xbc\x85\xd1\x07\x6d\x58\x89\x36\xc3\x61\x48\x89\x0c\xa3\x30\x3a\x9c\x55\x52\x24\x9e\x07\x88\x14\xdb\x3e\x69\x1d\xc4\x29\x6f\xcf\x15\x39\x46\x1b\xd2\x77\x9e\x2d\x82\x8c\x3e\x3f\x8a\xfc\x84\xb1\x2a\xb4\x2f\xf1\xaa\x44\xa9\x6f\xcb\xfa\x43\xa1\xd1\x64\xc6\x13\x78\xcb\x16\x65\x9b\x22\xda\xdb\x31\xf1\x07\x79\x88\xd7\x44\x7b\x53\x75\xfe\x40\x0a\xbf\x45\x24\xdc\x63\x75\x0d\x1c\x63\x1c\x1a\x69\x95\x2f\x64\x9e\x7c\x6b\xed\x89\x4e\x6f\x47\xb8\x2f\x42\xf4\xcc\x4e\x38\x75\x6a\xb2\xf9\x51\x2b\xce\xfd\x45\x90\xce\xdb\x1e\x50\x89\xeb\x1f\xf5\xcd\x45\xd9\xdc\x92\x99\x70\xe1\x19\x7e\x93\xba\xe5\xfa\x01\x15\xec\x38\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x10\x0f\x6d\x52\x37\xbb\x01\x49\x5a\x37\xd5\x12\xc6\x70\x60\x8a\xd6\x25\x72\x9e\x39\x64\x9d\x2f\x0a\x23\x17\xa4\xaa\x46\x48\xea\x7b\x1a\x3b\x3e\x6e\xf3\xa9\xfe\x92\x12\x6d\x61\xec\xf9\xc3\x83\x5f\x0f\x46\x88\xa8\xe2\x08\xdd\x73\x76\xa0\x8c\x67\x16\xdd\x80\xb2\x9b\xd4\x27\xdf\x89\x25\x6f\xa1\xae\xba\x59\x36\x4f\xe1\x5e\x60\xad\xa7\xb5\x46\x99\x30\xec\x00\xa4\x4a\xa8\x13\xae\x9f\xf3\x07\xaa\xb4\xcc\x54\x2d\xd8\x53\x2f\x8d\x4a\x43\xa0\x28\x1c\xd6\xa6\xf7\x1d\x39\x59\x10\x5c\xa9\xc5\xd2\xab\x59\xa6\x64\xb5\x44\x2d\xb3\xbf\x49\x17\xf6\x7b\x90\xdf\xb6\xbf\x99\x66\xb6\x72\xfe\xcd\x42\x10\xb9\xe0\xd5\xce\xf3\xcd\x5c\x39\xe5\x82\x33\xa9\x65\x8a\xb6\x05\x6c\x1f\xa5\x4f\xf5\xb1\x25\x9d\x0d\x45\x34\x87\x53\x26\x88\x41\xad\xea\xad\x05\x05\xa0\x17\xf8\x4e\xcb\x1b\xd9\x16\x05\x21\x65\x8a\x0e\x15\x2a\x6f\xbf\xcf\x59\xf0\x79\xf7\xb5\x95\xf5\x33\x17\x4d\x9e\x5b\xfa\xcd\xd5\xe4\xac\x77\x4b\xc3\x07\x6f\xe1\x18\x9f\x2d\x48\x71\x7b\x95\x56\xe3\x68\x4f\x62\xa0\x0d\x17\xbb\x54\x0c\x74\xf3\xd9\xb4\x82\x09\x17\x0a\x31\x5f\x42\x5d\x9f\xad\x39\xac\x22\x11\x77\xb4\x20\xc7\xae\xbc\xba\x8b\x22\xba\x9a\x5c\x98\xcd\x09\x7a\xa5\x0f\xc4\x1f\xbf\xfd\xf6\xf7\xdf\xa6\xcb\xe8\x74\xee\xc5\x3c\xbc\x8b\x76\xe0\xfb\xa2\x76\x5d\x9b\xee\x6c\xf2\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\xee\x13\x49\x08\xda\xe0\x57\xd5\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\xe2\xa4\xe4\x85\xbd\xd6\xc7\xc0\x50\x4a\xd9\xfc\xb8\x2e\x8f\x12\x8a\x6e\x22\x9b\x35\xb1\xa0\xd2\xb9\x71\x56\x02\x22\x2e\x4a\xe6\xcb\x41\x50\xe9\x43\x79\xd3\x25\x4c\xca\xce\x7d\x85\xc8\xf5\xf2\x3b\xf4\xe2\x45\xd4\x5b\xf4\x12\xbc\x21\x79\x52\x66\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\x08\x9f\xde\x5d\x26\xfb\x62\x90\xda\x29\x52\x7b\xc1\xd3\xaa\x30\xe6\x76\x10\x1b\x51\xa2\xb8\x56\x9f\x18\x29\xf4\x42\x8f\x7a\xf5\x9e\x1c\x60\xea\x62\x62\xca\x61\x68\x95\x0b\x4f\xab\x25\xba\xc7\x26\xf5\x3a\x8e\x85\xb6\x7b\x5e\xe8\x6e\xbc\xd0\x52\x4b\xef\xea\xb7\x04\x97\x44\x48\xb0\x86\x08\xde\x7d\xf0\x23\xe8\x53\xb6\x65\x3b\x6b\xa5\xe2\x35\x5a\xd8\xa1\x9a\x39\xec\xca\x5c\x1a\xdd\xc8\x1c\x41\x70\x06\x49\x24\x48\x63\xac\x25\xfb\x37\x5f\x85\x2d\xb4\x26\x85\xcc\x3c\x07\x05\x44\x30\x2a\xc2\xa9\xb2\x8a\x3e\x54\x9f\xa6\x56\x46\x81\x05\x90\x66\xa5\x67\x29\x44\x80\x32\x15\x23\x40\xe9\xb5\x85\xdd\x4b\xd2\xa3\x25\x79\xca\x1a\xa0\x2c\x95\x8a\x51\x76\x52\x75\x64\x63\x02\x76\x73\x19\xa4\x80\xee\x68\x2a\x7d\x1a\x72\x24\x0b\x0e\x79\x51\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\x21\xde\xaa\xa6\x55\xe0\x0a\x2a\xb0\x24\xe3\x3b\x2c\xa8\x16\xa8\xa6\x9e\xbb\x87\x6c\x30\x7d\xda\x15\xe7\xe0\x27\xf1\xd1\x31\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\xe3\xcc\xcf\xbc\xc2\x6b\x8b\x93\xbe\xa3\xd1\x5e\xfb\x60\x90\xa9\xac\xb7\xc8\x67\xd6\x61\xb5\x00\x08\x52\x01\x91\x44\x8b\x60\x03\xc1\xa9\xcd\x86\x3d\xc8\x10\xc8\x6a\xc5\x26\x8a\x04\x08\x0c\x72\xb1\x62\x07\xeb\x1e\xae\xcf\x61\xa6\xa0\xf8\xd3\x9b\xd5\x61\x55\xf6\x29\xd1\xba\xfd\xc5\xe9\xe5\xe9\x2f\xd7\x3f\x9e\xfd\x72\x79\xfa\xfe\x3c\xe5\xd5\xc9\x15\x15\x73\xd6\x54\xcc\x56\x55\xf1\x89\x6a\xce\xea\x47\x16\x0b\xb2\x3f\xf1\xf0\x6b\xe8\x4d\xc8\x9e\x64\x6d\x00\xca\xe6\x4e\xf3\x4f\xa3\xd3\x42\x2b\x4e\x53\x2d\x78\x76\x2a\x71\x28\xa3\x8a\xe2\xea\x35\xa9\xf0\xf2\x9a\x14\x9c\x95\x3b\x87\x91\x5e\x7a\x61\x23\x4d\x87\xac\xdb\xba\x0f\x3e\x58\x60\x89\x5c\x75\xc2\x29\x99\x71\x41\x20\x6a\xc2\xb4\x44\x6a\xba\xf8\xb1\x19\x9f\x7a\xc6\xb2\xe0\xf7\x5c\xdc\x56\x1c\x97\xf2\xa4\xe1\xe6\x3f\xe3\x8a\xce\x48\xb1\x2c\x2a\xf2\x1b\xdf\xff\x71\x92\x9a\xbe\x1f\xee\xf1\x86\x08\x0a\xd0\x85\x7d\xd8\x35\x6f\xf9\x3d\xe2\x33\x45\x18\x3a\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\x69\x9f\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x07\x44\x86\xa4\xdc\xeb\xc8\x97\xed\xe3\xa7\x43\x5f\xf6\x8b\xb3\xb6\xea\x87\xbf\x4c\x48\x2c\x4f\xec\xeb\xd5\xb1\x4f\xa8\x79\x05\xfd\xf1\xa2\x08\xb3\xd2\x61\x63\xbe\xbe\x7d\xa2\x8a\xe6\x9a\x17\xb7\x99\xdc\xae\x37\x67\x13\xf3\xb6\x15\x3c\x8b\xb9\x81\xb5\x96\xc9\x11\xd6\xdf\x02\x05\x74\x70\xba\xee\x8d\xd3\xf5\xa0\x2b\x35\xb5\xad\x03\xf5\x60\xb0\xb6\xba\xc7\x29\x3e\xa2\x5f\xaa\x61\xb0\xb6\x1e\x79\x06\x6b\x6b\x8b\xc7\xa0\xdd\x21\x73\xf4\x8d\xc0\x05\x99\xec\x93\xf2\xe6\x04\x08\x2a\x5b\x61\xeb\x5f\x79\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x73\x3d\x92\x59\x5b\x55\x4b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\x9b\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\x87\xea\xcc\x84\xc5\xbb\xd3\x71\xb8\x82\x48\xd2\xb9\x9e\x2e\x5b\x4c\x16\x19\xb6\x1f\x57\x23\xac\xeb\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\xa5\x7b\xaa\x16\x08\xa3\x5b\x5a\x55\xf6\x35\xf1\x13\x75\xed\x4a\xc0\x1b\x8d\xa6\xe2\x6c\x0e\x93\x81\x2d\x78\xfc\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x33\xe0\xc7\x5d\xe0\xdb\xeb\x53\x8c\x5a\x9e\x04\x53\x61\xea\xa3\x7b\xbe\x9f\x05\x88\x3e\xa8\x05\x11\xf7\x54\x12\x53\xf1\x2a\xba\x4f\xa6\x2f\xfd\x7a\x57\xe6\x33\xcf\xf5\x60\x53\x9c\xf4\xb6\x80\x9c\xbb\xe8\xb6\x7e\x84\xf7\x3a\xd1\xca\x38\x1b\x33\x32\x37\x19\xe5\x56\xa0\x19\x44\xa7\x69\xdf\xe0\x07\x7d\x7e\xb2\x54\xbc\x41\xb4\xae\x49\xa9\xed\xe3\x6a\x89\xee\x28\x8e\xee\x09\x64\xaf\x77\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\x2c\x21\x31\xe4\xc6\xc2\x1c\x30\x9a\x12\x85\xad\x0f\x5c\x1f\x02\x4f\xde\x0c\xbc\xcc\xfa\xec\x01\x86\xfc\x66\xe3\x06\xf0\x7c\xce\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x97\x48\x18\xbb\x1f\x14\x6c\xfa\x44\xf3\x56\xed\xc9\x3d\xf2\x98\xeb\xc8\xe4\xe2\x07\x46\x22\xad\x89\x44\xbc\xcd\x44\x8c\xff\xca\x36\x97\xd3\xc2\x1b\xfc\x4e\x1b\x1f\xa9\x4a\x1a\x55\x1e\x35\xc7\x16\x7b\x84\x65\xdc\x26\x0c\x06\x44\x7b\xd3\x76\x36\x23\x02\x6e\x3a\xe8\xf0\x1a\xec\xde\x17\x1c\x72\x77\x58\x9c\xf3\xd6\x02\xbe\x88\x1a\x01\xc9\xb9\xcd\x7a\x7f\xa4\x49\xcb\x06\x08\xf5\x44\x05\x91\x40\x5a\xcd\xd0\xf9\x87\xef\xe3\xb6\x68\x0e\x0a\xf4\xb4\xdc\x3a\x18\xe7\x07\x16\x87\x49\xcc\xbb\x1f\x36\xd1\x53\xd8\x6d\x51\x54\x5c\xda\x3c\x4e\x58\x97\x62\x81\x19\x23\xce\x19\x45\x15\x78\xb2\xa7\x84\x30\xc4\x1b\x62\x40\x79\x51\x9d\xc1\x48\x52\x36\xaf\x08\xc2\x4a\xe1\x62\x71\xac\x7b\xc7\xdc\x5e\xe8\x12\x26\xed\x27\x52\x09\x82\x6b\xb3\x27\x04\xa9\x31\x35\xcd\x23\x5c\x08\x2e\x25\xaa\xdb\x4a\xd1\xc6\xbf\x2c\xce\x8b\x48\x20\x75\x5d\x9a\xfc\x39\xb7\x56\x90\x56\xd2\x65\x66\x8e\xba\x1e\xda\xe1\xf3\xb0\xaa\x0a\xb8\xce\x46\xfa\xb7\xa4\x6e\xd4\x12\xe9\xa9\xad\xa2\x73\x63\x66\x54\x48\x85\x8a\x8a\x12\xa6\xec\xc8\x0c\x37\x1a\xf4\x61\xe4\xd4\x69\x66\x67\x44\xda\x29\x61\x25\x18\xdf\x8d\x92\x08\x32\x10\x7d\x27\xdc\xab\x4a\x2a\xad\xaf\x43\x8e\xe2\xd6\xce\x95\xd0\x30\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x05\x81\xf5\xb1\x36\x21\x91\x34\xb9\x02\x75\x2e\xdc\xb9\x1e\xf5\x92\xa3\x3b\xdb\x02\x52\x61\xd6\xa4\x0e\x6c\x28\x46\xee\xf4\x39\x20\x05\xd1\xaa\x28\xce\x28\x64\x9e\x5d\xc6\x28\x2c\xe6\x44\x9d\xb9\xf1\xc7\x66\xef\xe6\x90\x36\x61\xe5\xf4\xd0\x41\xd4\x2d\x0e\xac\xc3\x84\x97\xc0\x26\xd1\x31\x7e\x6c\x2a\xe7\x6e\xc6\x15\x69\x7b\xdd\x3c\x52\x23\xde\x59\x54\x26\xc3\xcb\x77\x54\x36\xb8\x20\x12\x1d\x5e\x4c\xce\x46\x68\x72\xf1\xda\xa6\x71\xf1\xd9\x2a\xbb\x5e\xec\xb4\xd8\x4b\xd0\x9c\xdd\xc7\x0a\xd8\xfb\xea\x34\x41\x97\x02\x9a\x2d\xdb\xdf\x89\x37\xca\xa2\x67\x66\xfd\x26\x00\x0b\x8d\xd6\x4d\x05\x75\x22\x91\x6c\xc1\x32\xb2\x81\x0b\xbd\xb5\x8d\x3d\x62\x0f\x2d\xe9\x08\x8e\x2c\x19\x7d\x64\x10\xc7\xb4\xe2\x87\x6b\xd7\x1c\x62\xd9\x6e\xa2\xac\x1e\x00\x0a\xb3\xb2\xbf\xf2\x1c\x31\x90\x6b\x66\xa1\xe2\xf1\xb7\x7b\xa4\x3b\x2c\x30\xa2\xde\x13\x29\xf1\x9c\x4c\x22\x71\x40\x39\xce\x5e\xe7\xe1\x06\x00\x51\x27\xaf\x17\xc4\x50\x61\x29\x1e\x7c\x12\x66\x57\x86\x5e\x9b\xda\x0c\x24\xaa\x07\xee\x6c\xdd\x0b\xaa\x14\x81\xeb\x01\x6a\x3d\xc1\xd6\x5d\xa5\xf7\xec\x67\x75\x46\xb5\x67\x27\x3d\x6c\x4f\xeb\xfd\xac\x34\xf9\x91\x53\x82\xa6\x82\x92\x19\x9a\x51\x48\xd8\x84\x54\xc6\x91\xa9\x53\x80\x01\x30\x8f\xa5\x24\x02\x86\x6d\xfd\x71\x6e\xf8\x71\xfd\xf9\xab\x1d\xbf\x12\x2d\x2b\x70\x50\xc4\x13\xd8\xc7\xe8\x0c\xcd\x21\x7d\xd2\x7a\x9f\xfe\xf0\xf2\x3f\xff\x88\xa6\x4b\x6d\x28\xc1\x99\x54\x5c\xe1\xca\x75\x00\x55\x84\xcd\xf5\x2a\x82\xae\x13\x77\x61\xf7\x18\xac\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x77\x1e\x28\x26\x27\x25\xb9\x3b\x09\xb6\xd0\xb8\xe2\xf3\xb8\xb7\x9e\x79\xc2\xa7\xb6\x29\x63\x01\x11\xb9\x4f\x34\xaf\x68\xb1\xdc\xd9\x7d\x6a\x5d\x61\x68\xc1\xef\x8d\x17\x75\xfd\xa8\x06\x64\x30\x0d\x6f\xda\x0a\x26\x0e\x7d\xef\x19\xfc\x5a\x49\x56\xc9\x91\x52\xbd\xf3\x81\xb4\x03\xf4\x82\x6d\x76\xe5\xaa\xb7\xb9\xc3\xae\x9b\xdc\x52\x53\xd8\x60\xb7\xaf\x54\x12\xed\x06\xff\x1e\x57\xd5\x14\x17\xb7\x37\xfc\x1d\x9f\xcb\x0f\xec\x5c\x08\x2e\xfa\x63\xae\xb0\x56\xa6\x17\x2d\xbb\x85\x3a\xbb\x1d\x5d\x2d\x9f\x5b\x30\x2f\x30\x4b\xf6\x27\x36\xaa\x33\x6e\x94\x86\x40\xd4\xd9\x02\xce\xf9\xdd\xb5\x4c\x1e\x68\xe7\xe1\x66\x88\xe8\x3e\xc7\x6b\x38\xe1\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\xb9\xfe\x72\x64\x2e\x00\x50\x7d\xb5\x8d\x53\xe3\xaa\x8a\xd5\x69\x42\x11\xf0\x7d\x74\xf9\xea\x3d\x38\xf2\x6a\x67\xa7\xfb\xb3\x7d\x35\x37\x37\x7f\x03\x4d\x8c\x2a\x49\xaa\xd9\xc8\xf0\xc1\x78\x7f\xf2\x01\x98\x35\x07\xf6\xca\x8b\xe7\x12\xda\xbd\xb7\xe4\x8e\x57\x6d\x4d\x5e\x93\x3b\x5a\xc4\x21\x07\x7a\xab\xd2\x7b\x9b\x8b\x8f\x55\x54\x82\x2e\x39\xad\x78\x71\x8b\x4a\xfb\xcb\x20\x47\x65\xb5\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x3a\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x7d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x8c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\x7f\x1b\xa2\x93\x35\x53\xdd\x57\x54\xf3\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\x1f\x37\xc8\x80\x42\x48\x4b\x4e\xea\xcd\x0b\xf3\xe8\x8f\x1a\x2b\x6b\x1f\x39\xef\x05\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xbb\x9a\x84\xf5\x54\x96\x1a\x37\xe3\x5b\xb2\x8c\xdc\x70\x89\xc7\xe5\xb1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x09\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x65\xc6\xa2\xeb\x76\x0a\x67\x0a\xbe\xfe\xb4\xf4\x60\x59\x95\xa7\x5d\xdf\x55\x3f\x76\x2b\xde\xbf\xaa\xf4\x27\xfe\xae\x32\xdf\xfa\x9a\x6e\x28\x18\xdf\x97\x7a\x41\xf9\xce\x67\x92\xc3\x49\xd8\x44\xb8\xd6\xec\xce\xe8\xdf\x63\x3d\x4f\x98\x39\xd2\x81\xcd\x6c\x3d\x54\xc7\xa6\xde\x40\x42\x07\xf4\x51\xb4\x8d\xa2\x83\xef\x0e\x76\x7a\x39\x9a\x95\x11\xbc\xc1\x73\x30\x69\xf7\x61\x81\x56\xfb\x14\xd2\xdb\x2e\xf8\x7d\x28\x32\x1b\xfb\x2d\x2d\x31\x1d\x47\xfa\x82\x27\xad\x8e\xc1\xfa\xba\x1d\x61\xcd\x72\x53\x25\xe2\x1e\x2f\x11\x16\xbc\x65\x49\xc4\x05\x10\xca\xf4\xa1\xee\xf7\x2b\x83\xbd\xe4\x8c\x38\x58\x4d\x4a\x2b\x37\x3d\xd7\x37\x20\x8c\x28\x43\xaf\x8e\x5f\xbd\x4c\xee\xfb\x15\x29\x5a\x21\xe9\x1d\xb9\xb2\xe5\xd3\x83\x30\xe8\xc5\x6c\xc2\xa5\xa4\xd3\x0a\x52\x2d\x15\x47\xe7\xa6\xb6\xfc\xfa\x40\x3d\xd4\x0b\x46\xcc\x45\x48\x84\x9a\xd0\xc3\x43\x73\x82\x43\x88\xb6\x6e\x20\x01\xa7\xb5\x5f\x2a\x28\xac\xeb\x8a\x0a\x7a\xe9\x55\x50\x73\xef\xed\x74\xac\xae\xa6\xfe\x3e\x48\x92\xf7\x36\xa8\xd0\x15\xcd\xa7\xae\x28\x33\x7c\x74\x2f\xa8\xb2\x87\xfb\x9e\x4a\x82\x0e\xc1\x9d\xb1\xb2\x19\x93\xb8\x9f\x43\xe7\x57\x62\x71\xfd\x1c\xdc\xcd\x62\xf5\xe8\xee\xc3\x2a\xad\xcb\x93\x2e\x67\xe6\xde\x7a\xbe\xba\x15\xb4\xd2\xbf\xbb\x97\x17\x98\x95\x55\x92\xcc\xf0\xb3\x52\x2d\x93\xd8\xab\x2e\x66\x28\x14\x89\x16\x71\x10\x04\x21\x17\x58\x22\xc6\x51\x4d\x30\x40\xaa\xf5\xed\xe2\xa4\x60\x8f\x06\x3a\x5f\x1f\xcc\x66\x37\xd7\x58\x78\x21\x58\x71\xfd\x9a\x4a\x2b\x9e\xb5\x1c\xb1\xa6\x8b\x01\x62\xd5\xb8\x4c\x21\x63\x08\xe6\xb4\x5b\xbc\xe3\x0e\xe6\xbc\xda\x93\xee\xe2\x58\xe9\xcb\x53\xf4\x63\x64\xab\x9b\xeb\xe6\x4d\x64\x79\x83\x3f\xaf\x83\xb5\x25\xe1\x4f\xcc\xb3\x3a\x5c\x7f\x2d\xae\x8d\x75\x73\x8f\x7d\x87\x13\xfa\xf0\xe9\xa1\x8e\x02\x59\xe8\x50\xdd\x06\x04\x63\xcb\xab\xd8\x1c\xe5\x34\x92\x70\x17\xcd\xf0\x7e\xa2\x39\x61\x44\x60\x1b\x90\x70\xa0\x6e\x1b\xd2\xc7\x92\xb3\xd4\x03\xf1\x89\x0d\xa7\xe5\xfd\xa7\xd5\x14\xf3\x67\x09\x1d\x01\x3d\xe7\x90\x8b\x95\xd3\x6e\x43\x2d\x9b\x34\x96\x9c\xa3\x5e\x21\xd3\x33\x9b\x3f\x60\xe9\xd5\x8b\xf2\xcf\x96\xde\xe1\x8a\x18\x7a\x7c\x27\x1a\x76\xaa\x4c\xc8\x76\xba\xaf\x66\xa3\xb5\x0f\xc1\xec\xd8\x8c\x96\x78\xd4\x82\xcc\xa4\x4f\xbc\x78\x81\x0e\x4d\x1b\x07\x86\x16\x7b\xb7\x4a\xae\x5d\xab\xf3\x87\x26\xa1\x28\x6c\xbe\xf5\x3a\x7f\x68\x30\x00\x3c\x9a\xbd\x58\xb8\xff\x26\x0b\x7c\x47\x80\x85\x9c\x56\x58\x54\x90\x46\x72\x6d\xa6\x0c\x4d\x5b\x85\x08\xbb\xa3\x82\x33\x00\x55\x01\x5d\x94\x96\x4c\x82\xcc\x88\x20\xac\x20\x12\xfd\xf6\xf0\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8f\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\xee\x6c\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x15\x0e\x48\x03\x50\xf6\x69\x63\xd7\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x7c\xa1\x2c\x5d\xc3\x0a\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xdd\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\xbf\xe0\x52\x9d\x56\x14\xcb\x6d\xfd\xd8\x69\x5b\xfd\x6d\xd7\x2c\x64\xfb\x31\x5b\xd5\x11\x57\x1e\x62\xa0\x7b\x66\x60\x4e\x17\x13\x8b\x45\x77\xbb\x92\xb2\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd9\x13\x83\x38\x9a\xa1\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x16\xbc\xb2\x79\xd7\x0e\xcd\x30\x25\xea\x9e\x10\x86\x2e\x26\x30\xe7\x7a\x2a\x0d\x2f\xe3\xe6\x99\xb7\xca\x31\x53\x62\x69\x0f\xf4\xd6\xbd\x09\xd6\x0c\x56\x61\xdb\xa3\x9b\x10\x7f\x8a\x8f\x3c\x8d\x11\xdd\xf6\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\xde\xfa\x05\x75\x6c\x3a\x78\xca\xef\x08\xac\x77\x59\x8a\xc8\x2c\xed\x9d\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xec\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x96\xc7\x2d\xdf\xad\x78\x31\x39\x7b\xce\x1b\xf1\x07\xeb\x5d\xd2\x4d\x1f\x48\x44\x9b\xa2\xcb\xeb\xd8\x76\xe9\xbb\x5c\x86\x80\xce\x2c\xc2\xd1\x1e\xeb\x5c\x5f\x74\x05\x1b\x9f\x5b\xa9\x40\xcc\xb4\xab\xaf\x34\x4b\x2b\x6e\x81\x23\xe0\xf9\x69\x78\x79\xbc\x3a\xd5\xf6\x2f\xe2\xa7\x1b\xe2\x7f\xc6\xe0\x0c\x4b\x55\x2e\x79\xeb\xac\x65\xa3\x5c\x2c\x81\xe9\x47\x42\x29\xac\x05\x01\x66\xcc\xb2\xad\x0c\x98\x18\xdf\xe3\xed\x81\xdc\xd0\xf0\x3f\x82\xd9\xfe\x47\xe7\xdd\xee\x8a\x0a\xc2\x17\x26\x5c\xa8\x7f\x18\xc7\x97\xd4\x17\x36\x24\x0e\x41\xe6\x0f\x35\xd5\xb7\x82\xe8\xd9\x3f\xbc\x6a\x0e\x7f\xb5\x6d\xc2\xa3\x56\x1f\x02\x57\xde\x67\xb6\xaf\x2d\x5c\x2b\x6f\x8c\xcb\x73\x63\x5f\xb6\x9d\xa1\xdd\xed\xff\xc9\xc5\xeb\x1d\x8a\x8f\x86\x96\x5f\xb6\xf8\xf8\x41\x6e\x5d\x7d\x20\xeb\x04\x42\x91\xd2\xbc\x33\x18\x03\x2d\xb7\x75\x49\xed\x5f\x03\x71\x18\x57\xa8\x11\x44\x12\xa6\x46\xfd\x70\x44\x3f\x2d\x13\xb4\x87\xfe\x28\x46\xfa\xe7\x59\x5b\x6d\x6b\x21\x71\x11\x30\x0f\x79\x9a\x26\xec\x49\x56\x20\x14\x83\xef\x30\xad\xc0\x3d\x17\xd0\xe8\xae\x75\xc0\x66\x8f\x6d\xd9\x83\x8a\xe3\x12\x42\x83\xe8\x56\x5f\xed\x15\xaa\xb9\x16\x9c\x26\x0d\xe4\xec\x74\xf2\xcb\xf5\xdf\xae\x7f\x79\xff\xe1\xf5\x0f\xef\xb6\x66\x1b\x33\x29\xf4\xa4\xdb\xe2\x23\x84\x11\x23\xf7\xd0\x73\x06\xc6\x69\x61\xe3\x01\x9e\x85\x52\xdf\x21\xd7\x36\x99\xd2\xc4\xc6\x0d\x34\x65\xd6\x56\xfa\x4b\x5b\xf6\xa0\xa6\x8a\xce\x31\xbc\xac\x73\x89\x4c\x05\xc1\xb7\xbc\x55\xe8\xae\xad\x18\x11\x78\x4a\x2b\xaa\x2d\x08\x44\xee\x08\x33\x78\x48\xfd\x07\xba\x93\x61\x31\x5f\xba\x6d\xe3\x61\xad\x67\x5b\x45\x52\x4f\xaa\x6e\x19\x17\xd6\xdd\x68\xd9\x34\xe1\x97\x8d\xa0\x77\xb4\x22\x73\xe2\x69\xea\x62\xd8\x92\xfb\x30\x1c\x5c\x35\x0b\x3c\xae\xc8\x1d\x31\x74\x57\x54\x9a\x1d\xb5\xe0\x8c\x0b\x13\x97\x33\xc4\xed\xd6\x16\x05\x02\x20\x73\x58\x5d\x69\x63\x93\xec\x7b\xed\xb2\x6e\x6d\xb2\xed\xb3\x09\xab\xed\x91\x2c\x69\xb2\xea\xda\x23\x01\xdc\x0a\x84\xd9\xe2\x93\xad\x41\xd5\x9b\xfd\x83\x9d\x7d\x0e\x6f\x77\x32\xc6\x1e\x16\x8c\x0c\x68\x77\xec\x2a\x4d\x01\x21\x4e\xcc\x9c\x6f\x6d\x9e\xb8\x2e\x7d\xb0\x14\x5c\xcf\xad\x63\x86\x6d\xf7\x4b\x48\xb9\x9a\xa2\x9e\x1d\x2c\x14\x1a\xe1\x64\x62\x89\x1a\x22\x80\x3d\x21\x64\x0b\x4b\x38\x48\xbc\x0f\x11\xd9\xd4\x26\x2b\x7d\xbe\x39\xc2\x50\x6c\x1e\x51\x25\xd1\xeb\xcb\x6b\x24\x48\xc1\x45\xb9\xb5\x0b\xe0\xaf\xe6\x5a\xd8\x10\x48\xc6\x40\x56\x66\xd2\xf8\x2c\xb3\xe1\xd6\xa6\xdf\xc5\x7a\xf5\x6b\x98\xd8\x8e\x71\x4d\xba\x2a\x42\xff\x70\xa3\xfc\x07\x0c\xf3\x1f\xb2\x9d\x96\xbc\xc6\x94\x6d\xad\x31\x8e\x21\x33\x70\xf2\xd1\xbd\xdf\x51\xd2\x6d\xff\xf6\x7f\x48\xa2\xdc\x26\x3a\x95\xdf\xff\x7f\xaf\x2f\xff\xd1\xf1\xbb\xd1\x4a\x5f\xf1\xe1\x75\x14\xd1\x40\xcf\x1e\xe8\x07\xea\xdd\x3b\xe3\xb7\x99\x67\xf9\xd4\xe3\xa7\x25\x6c\x1e\x3f\xd9\x7a\x5b\x3b\x71\x40\x19\xba\xfa\xfe\x0c\xbd\x7a\xf5\xcd\xef\x61\x49\x1c\xb6\x17\x2b\x54\x6b\xcd\xe0\x8f\x7f\x40\xc5\x02\x0b\x5c\xa8\x08\x00\xff\x95\x4b\xde\x83\xd2\x1e\xab\x47\x32\x24\x7f\xb3\xb9\x69\xe6\xce\x88\xf2\xed\x6e\x2d\x9e\x20\x9c\x31\x69\xab\xea\x9a\x14\x82\x6c\x9b\x82\x91\x26\x9e\x2e\x56\xda\x7e\xcc\xb9\x1e\x84\x50\xa1\x14\x97\xfd\x32\xeb\xea\xed\x04\xa4\x12\x5d\xb1\x84\xa6\xad\x2a\x83\xd1\x5a\xba\xdb\x06\x46\x2b\x83\xe4\x3f\x2a\x1d\x41\x49\x8c\xb2\xdb\xbb\x82\x24\xf1\x5d\x73\x27\xb0\xc1\x52\x76\x90\x98\x3b\x5a\xb6\xb8\x82\x6e\x41\x1c\xc9\xf2\x6f\x60\x63\x52\x5a\xd9\x5b\xdb\x11\x6c\xdb\x9d\x2d\xd9\xd9\x3a\x55\xea\xc4\xcc\xc9\x6f\xac\xd5\x4f\xd9\x7c\x0c\x9f\xe8\x6e\xda\xf1\x8c\x39\x1b\xe3\xf1\xb6\xe9\x4f\x5f\x54\xb0\xe1\x1d\x2f\x70\xf5\x01\xbc\xf3\x57\x6e\xb7\x39\x29\x20\x11\x61\xbc\x9d\x2f\x60\x7a\x45\x8d\x1d\xf9\x77\x45\x14\xb8\x4d\x6c\xea\x6e\x4c\x54\xc1\xef\xec\xd2\x86\x06\xc2\xba\xec\xfd\x9d\xfd\x8c\x01\x87\x94\x18\x40\x2c\x4e\x3a\x47\x30\xfa\x32\xd0\x2b\xed\xcc\x46\x22\x27\xfa\x3a\x3f\x01\xf5\xc3\xc1\xf9\x4c\x30\x66\x04\x88\x8f\xb2\x35\x32\x1b\x17\xb7\xf7\x58\x94\x12\x15\xbc\x6e\xb0\xa2\x60\x01\x2d\x63\xb1\x7e\x2e\x83\xcc\xde\x06\x5a\x2d\x39\x46\x17\x4c\x2a\x0c\x32\xd0\x11\x15\xe9\x15\xee\xc8\x05\x40\x79\x31\x3c\x8f\x0b\x22\x08\xc2\x22\x0e\x73\x89\x2b\xb8\xf1\x0a\x22\xf4\xde\xaf\x96\xe8\x5e\x70\x16\x49\xf2\xb1\xa5\x50\xd2\xea\xd2\x1d\x25\xf7\x27\xd6\x27\x3a\xd6\x83\x1b\x9b\x2d\x2c\x4f\xe0\x24\x9c\xfc\x06\xfe\xef\xcb\x89\x2e\xac\x38\xf9\x6b\xdc\xc4\x07\x6f\xbe\x82\x08\x3e\x65\xb4\x63\x2f\x7b\x56\x65\xe3\x9d\x55\x26\x6c\x85\x21\xfa\x2f\x23\xc7\x03\x9f\xc2\x94\x54\x9c\xcd\x83\xda\x4a\x11\x36\xce\x05\xa3\xaa\xe7\xa7\x00\x98\x17\x29\x5a\x03\x00\x40\x5c\x94\xc0\x5a\x47\x4d\x6a\x4d\xaf\x75\x28\x82\x1f\xf0\xe5\x61\xb6\x6d\x98\x92\xf6\x5a\x07\xc6\x15\xd9\xf9\xdd\x0c\xf1\x84\xab\x43\xa2\x38\x5a\x60\x5b\xb2\xdf\x92\xfa\x51\xe9\x90\xf8\x08\x17\xda\xc4\xda\xfe\xa8\x68\x55\x47\x79\xe2\x3f\x43\xa8\x63\x28\x8f\xc0\x34\xd1\x4a\x0e\x66\xab\xfd\x04\x47\xa1\xa8\x7b\xf4\x68\x56\x75\xdf\xb2\xf9\x96\xd1\x7f\xb6\x04\xe1\x9a\x6b\xbd\xaf\x4a\x49\xbb\x5d\x5d\xc9\x1a\x2f\xc1\x16\x85\x49\x7b\xe7\x98\x6c\x11\x86\x5a\x20\x72\x04\x90\x7d\x1a\x94\x7b\x1a\xa1\x77\xfd\xfa\x4f\x23\x3d\xce\x6b\x53\x7b\xc5\x7e\xb4\xbd\x05\x0d\x14\x69\xbc\x15\x05\xb1\x56\x45\x6d\x69\x7e\x36\x4c\xab\xde\x7b\xda\x24\x65\x06\x79\xa2\x97\x14\x52\x6e\x5b\x01\x3b\xcd\x04\x74\xb6\x5f\xe2\xe9\x12\xcd\xb4\x3a\x6b\x11\x8b\x0b\x3a\x5f\x10\xa9\x5c\xfc\xea\x04\x88\x69\x4c\xf2\x33\x2e\x16\xbe\xbb\x20\x7f\x03\x4a\xcb\x0e\xf2\x58\xe3\x87\xed\x69\x8a\xc0\xb7\x66\xb9\xcd\x8d\x89\x2d\xdb\xda\xdd\xfd\xab\x9b\x49\x1e\xa3\x77\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf5\x69\x03\x92\x53\x00\x83\xa2\x19\x96\x0b\xca\x59\xea\x2e\x2b\x0c\x44\xac\x68\x85\x56\x5e\xaa\x25\x58\xaf\x65\xa9\xf5\x43\x81\x04\xa9\xf9\xdd\xf6\xa8\xb1\x64\xd8\x59\x1a\xf3\xb3\x9e\xe4\x71\x60\x6f\x7c\x21\x46\xc4\xa9\xe7\xaf\xd5\xfb\xa5\x58\xb9\x2d\xcc\x06\xd4\xda\xbf\xab\xb2\x2d\x5a\xd6\x25\xab\x47\xdc\x1c\x3b\x02\x08\x45\xa4\x94\xa7\x98\x07\x58\xcc\x77\xc6\xf2\x70\x2a\xe6\xad\x11\x97\xf6\x7e\x07\xa4\x4a\xc3\x69\xbc\x95\xb0\x06\x0c\x3d\x90\xe8\xec\xfd\xeb\x90\x54\x5f\xd9\x1a\x01\x26\x14\x66\x4a\x2e\xc4\x35\xf7\x63\x5e\x48\x39\xa8\x18\x1e\xa7\x1e\xd5\xa3\xc2\x4b\x16\x2d\xe6\xab\x3b\xe7\x8c\xf7\x1d\x74\x4e\x1a\xca\x9a\x56\x59\xe5\x3b\xa8\x9d\x5c\x2c\x30\x9b\x6b\x6d\xe7\x35\x6f\xf5\xc0\x7e\xfb\x5b\x18\x84\x20\x65\x5b\x44\xa6\x03\x1a\x67\xbf\x39\xb9\xbf\x75\x89\x39\xb6\x48\x3b\x5c\x4a\xb2\xc0\x8d\x9b\x9a\x70\xf6\xe4\x92\x29\xfc\xf0\x1d\xa2\xc7\xe4\x18\xbd\xf8\x6d\xf0\xab\x17\xd0\xe3\xa8\xde\x34\x82\xeb\xa1\x58\xa2\x6b\x18\x7d\x45\x15\x10\x82\xbc\x08\x5b\x38\x46\xe7\xba\x5f\x90\xe7\xea\xd7\x36\xe0\x2e\x9e\x76\x2b\x3b\x42\x82\xcc\xb1\x28\x2b\x12\xc9\x15\xc9\x67\x3e\x25\xd3\xb8\xa6\xed\xae\x22\x0f\x54\x2a\x69\xa3\xb6\xc7\x79\xc0\xca\x9f\x7b\x77\x28\x2c\x6f\xf5\x4d\xa1\x85\xdf\xb8\xc4\x0a\x8f\x03\xa9\x7b\x62\xbc\xb4\xe3\x82\xd7\x35\x66\xe5\x18\xdb\x73\xdc\x5d\x2a\x27\xbf\xb1\x25\x6e\xc6\xd8\x7f\x8b\xb2\x31\x1e\xcb\x05\x89\x5a\xb9\x01\x29\x08\x8f\x9d\xcb\x5d\x09\xec\x73\x2f\x9f\xcd\x52\x1c\xa3\x4b\xae\x3a\x73\xca\xdf\xb6\xb0\xca\x39\x45\xf8\xf9\xe5\xcd\xd5\xdf\x26\x1f\x2e\x2e\x6f\x06\x49\x3e\x48\x72\x78\x06\x49\x3e\x48\xf2\x88\x86\xf7\x45\x92\x13\x76\xb7\x2b\x29\xee\x1c\x6f\x9b\xb2\x23\x6d\x40\x4f\xad\xa5\x59\xed\x3c\xc1\x6a\xd7\x24\x69\xe7\xec\xee\x47\xac\x4d\x7e\x0b\x9f\xb3\x19\x2c\x1b\x12\x4c\xed\x17\x8c\x3b\xe2\xec\x8b\x67\x49\xdb\x21\xc7\x59\x46\x8e\x9f\xa4\xbc\xe7\x30\x8e\xb5\x69\xc9\x53\x72\x76\xdf\xe3\xa5\xf1\x02\x9b\x43\x89\xd9\x12\x35\x82\x32\x05\x5b\xe9\xf4\xfa\xec\xe2\x22\x40\x3a\x20\xf2\x50\x90\x46\xa1\x83\xff\x67\xb7\x14\x67\xe0\xe8\xdb\x87\x95\xd9\x46\x71\x4b\x68\xa6\x53\xf9\x1a\x41\xee\x28\x6f\x65\xb5\xf4\x58\x95\xcd\x72\x74\x9d\x09\x2f\x91\xe0\xc3\xe0\x18\x69\xb1\x79\x0b\xca\x15\xa5\x73\x93\x02\x99\xd0\xfc\x8e\x55\x4f\xdb\x89\x1c\x0a\x68\x42\xfb\x1b\x54\xd7\xcf\x57\x43\x13\xda\x8d\x52\x60\x1f\x53\x46\x13\xfa\xd1\x57\x63\x13\x5e\xd4\x67\x40\xd8\xbd\x24\xfb\x5e\xf0\x3a\x93\x34\xbb\x36\xc1\x15\x07\xdc\xdc\x74\x54\x0f\x1c\xfa\x2f\x54\x8f\xac\x49\xdb\x55\xaa\xd5\x86\x35\x00\x0d\x12\x67\x27\xa9\x92\x7d\x9e\x62\xf2\xc8\xe6\xef\xbf\xc7\xcd\x5f\xc8\xf2\x8a\x24\xd6\xe4\xee\xcf\x37\xa9\x48\xa1\x95\x31\x74\x4b\x96\x86\xb0\xef\xcc\x35\x96\x56\x96\x3c\xcb\xf4\xa1\x0c\x2a\x98\x7b\xc6\x7a\x88\x49\xef\xc8\xb3\x98\xfa\xb9\x25\x09\x34\x77\xee\x59\x21\x61\x24\xb0\x84\x60\x7f\xe8\x35\x4d\x5b\x3d\x94\x47\x3c\xb8\x27\x4d\x13\x75\x4f\x3e\xbd\xc7\x3d\xf9\x10\x56\xfd\x67\xb7\x78\xab\xfe\xb3\x53\xf4\xd5\x6a\x57\xf2\x61\xb1\xfa\xcf\x3e\x21\xb3\xfa\x4f\xc6\x53\x94\x82\xda\x5a\x7d\x1c\x28\x39\xf3\xa9\xbc\xb6\xb9\xb6\xa1\xea\xe4\x2f\x14\x64\xca\xc0\x80\x9c\x72\x50\x76\x6b\x05\x64\x9a\xe6\x34\x2a\x52\xf3\xe4\xc3\xb7\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x36\x8f\x65\xe6\xd0\x55\xdf\x39\x6e\x46\x89\x6a\xa2\x70\x89\x15\x3e\xd6\x07\x62\xd4\xff\xd1\x66\x16\xfe\xc3\x7f\x58\xe1\x29\xa9\xe4\x4f\x07\xff\xf5\x97\xf3\xbf\xfd\xbf\x07\x3f\xff\x23\xfc\x1d\xa8\x6b\x06\x1e\x1e\x7c\x21\x71\x08\x50\x4d\x92\xf1\x92\x5c\x42\xef\xe0\x47\x6b\xe9\x9d\x1a\x84\x90\xfd\x05\x54\xf4\x3a\x36\xe4\x02\xfe\xc7\x86\x97\xab\x3f\x45\x16\x34\x70\xcf\x1e\xea\x3d\xb0\xb6\x09\x44\xfd\xe6\xc9\xa7\xfd\xe0\x86\xfe\x48\x84\x4c\xe2\x76\x77\x4f\xbf\x12\x83\x79\xab\xdb\xc6\xb2\x58\x90\x1a\xc3\x3f\xbf\x77\x53\xa0\xef\x63\x5f\x73\x91\x41\xe9\x34\x7d\x07\x8e\x7a\x64\x97\x2f\xee\x5e\x25\x59\x9c\xe6\xc9\x28\xf9\xfd\x0a\x66\x9e\x30\x98\x11\x3b\x5b\x46\x02\x78\xfd\xd1\xe7\xa3\x78\x2a\x81\xd3\xc9\x05\xba\x33\x33\xbc\x47\x93\xf3\x74\xe2\xba\x22\xd9\xcd\xad\x64\x81\xfd\xbd\xef\x95\x5d\xa6\xc0\x74\xb3\x06\x73\x14\x9d\xd3\xea\xd3\xcb\xf1\x3a\x67\x77\xba\x5d\x99\x2d\xb7\x6b\xf5\xd9\x43\x99\x99\x6a\x2b\xea\x77\x34\xa9\x22\x57\xbf\xc4\xd0\x5b\x5e\xc6\x46\x11\xdc\xb3\xcf\xb6\x6b\x16\x53\xce\x19\xc0\x01\xad\xaa\x3f\x0c\xe8\x54\x0b\x7b\x93\x33\x69\xbe\x03\xae\x47\x72\x47\x98\xf2\x70\x72\x5b\x65\x1d\x0b\x45\xf3\xd8\x24\xb6\x47\x5d\x56\x66\x07\xf0\x30\x5e\xae\xfa\xd9\x63\x17\xdd\xf3\xda\xa0\xa6\x4f\xab\x66\x81\xf5\xa8\xe7\xde\x0e\xde\x78\xda\x0d\x7a\x42\xcf\x9d\xa4\xff\x22\x2b\x05\x3b\x5f\x7d\xf3\xa7\x84\x74\xd2\xf5\x27\xe3\xc5\xf9\x44\x66\x4e\x96\x1d\xbb\xc9\x56\x02\xc6\xb1\xc7\xcd\x24\x5f\xc2\xdc\x7d\x2f\x5d\x4c\xc1\xd8\x5c\x62\x3a\xb8\xa8\x47\x41\xa1\x77\x76\x87\xee\xb0\xf0\x28\xa1\x76\x5a\x51\xb9\x48\x15\xf7\xe6\xb9\x98\x75\x99\xb1\x5d\xea\x3a\x30\xad\xb8\x1a\x37\x9d\xee\xa1\xe7\x62\xa5\x97\x19\xba\xf0\x98\x8b\xb9\xcf\x30\xdf\x85\xf3\x4d\x62\x7a\x98\x83\xf1\x64\xf3\x60\xa8\x4d\x9e\x6b\x22\xd6\xf8\xef\x05\x51\xad\xd0\x32\xcb\x66\x57\x4c\x78\x69\xa8\x58\x32\x2a\x7f\x39\x8c\x75\x14\x3a\x45\x60\xce\x12\x5f\xd7\xe4\x57\xb2\xb3\x5d\x6f\x9f\x41\x1b\xee\xb5\x77\x27\x24\xb2\x38\xd7\xac\x10\x12\xa4\xc2\x8a\xde\x99\x6d\xe9\xf2\x87\x1c\xb5\x80\x6e\xf0\xe0\xf8\xf8\xc0\xf4\x92\x0b\x73\x95\x1a\x8f\xa2\xfe\x7c\xaf\xae\x85\x4e\xa9\x7a\x02\x37\x7c\x48\x07\x63\x97\xc8\x94\xd3\xb0\x53\xe5\x42\xac\xb9\x74\xf5\x2f\xc0\x98\x72\x59\x53\xdf\xef\xb5\x0f\xcc\xe7\x76\xad\x96\x93\xfd\xce\x10\xbc\xb8\xdf\x5b\xe5\xc7\xf0\x23\xdb\x3c\xb1\x54\x47\xf1\xa1\x79\xe5\x71\xd1\xb4\x23\xfb\xfa\xe3\x9a\xd4\x5c\x2c\xfd\x8f\xbe\xf8\xe6\x58\x2a\x2e\xf0\x1c\x4a\x46\x99\xc6\xcd\x9f\xf9\x9f\xcc\x1f\xf6\xba\xb7\xfe\xd7\x06\xdd\xd1\x65\x66\xf9\x5a\x2c\x5f\x9d\x2d\xe7\xd6\x6d\x4f\x0c\x28\xbf\xad\x9e\x40\xfe\x1c\x78\xc0\x9c\x89\xb9\xf9\x59\x84\x90\xba\xad\x09\x3b\xea\x14\x0e\xc0\x7d\x18\x25\x4f\x1e\xec\x8f\x1c\x42\xa8\xa4\x77\x54\xf2\x84\xb2\x1d\xfe\x45\xeb\xe1\x09\x47\xd1\xc4\x5b\xd5\xb4\x90\xdb\x59\x63\xe5\x3d\x28\x0f\x0d\x97\x80\x16\xb1\x87\x7d\xc5\x35\xf8\x2a\x35\xf2\x02\x3a\x86\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\xc9\x5d\xc7\x6c\xf9\x21\x51\x7a\x9b\x67\x6c\x37\x0b\x65\x8a\xcc\xc9\xb6\xcc\x79\x1f\x7b\x63\xa6\x50\x5b\xef\x2a\xa4\x4c\x8d\xb9\x18\x5b\x2e\x2d\x30\x52\x12\x1b\x70\xdb\x2b\xf7\xf9\xbf\x72\x52\x33\xc8\x54\x76\x4a\xe1\x1e\x1d\xf0\xa7\x52\x34\x0c\xc3\xcf\x73\xc0\x64\x4c\x4b\x41\x2d\xf5\x03\xd9\x91\xdb\x7c\x6d\x37\xe8\xbf\x03\x72\xc6\x05\x8d\xcc\xba\x76\x96\x94\x36\xaf\x8e\x3b\x23\xc8\x71\xaf\xd9\xef\xdd\x92\x04\x88\x99\x7b\x06\xa4\x4d\xf4\x33\x20\x6d\x1e\xe9\xca\x80\xb4\x49\x7a\xbe\x48\xa4\x8d\xe1\x1d\xfc\xf7\x84\xd9\xe4\xaf\x8a\x16\x99\xb9\x93\xb3\x20\x1a\x61\x77\xb1\xe0\xea\x9c\xa9\x6e\xce\xed\xa1\x38\x6a\x78\xd3\x56\x58\x3d\x92\x45\x91\x29\xef\x6d\xcf\x22\x67\x40\xb4\x6b\x54\x3f\x8b\xe1\xa7\x0c\xd5\x6d\xa5\x68\x13\x99\x10\xe0\x4d\x4b\x4f\xa6\x8b\xb0\x94\xbc\xa0\xd8\x25\x82\xc3\x6f\x2a\x2c\x95\x1b\x32\x78\xe6\x15\xbe\x25\x01\x21\x6f\x6c\xb6\x36\x90\xf7\xba\xb9\x9d\x2e\xf5\x3d\x74\xce\xee\xec\x9d\x84\xca\xd6\x24\xb8\x92\x2e\x56\x9a\xa5\xdd\xaf\x2b\x9b\x51\x9f\x4b\x9b\xad\x10\x24\x35\x82\x06\xe9\x9d\x88\x18\xa2\x39\x7c\xd6\x41\x20\x21\xfd\xc3\xd2\xc3\x46\x75\x23\xd9\x38\x48\x57\xc5\x7d\x36\x42\x92\x8d\xb5\xa6\x83\x77\x30\xd1\xbe\xee\x1d\xdd\xc2\x1e\x25\x70\xa4\x6b\xe5\x79\x35\xf2\xa7\xd0\xc6\xf7\x45\x13\xdf\x13\x2d\xfc\x69\x34\xf0\xfd\xd4\xbe\xb3\x69\xde\x79\xb4\xee\x3c\x1a\xf7\x16\xb8\xf6\x9c\x5a\x76\x1e\x0d\xfb\x29\xfc\x6b\x8d\x20\x33\xfa\xb0\x0f\x69\xcb\xae\xc2\x0f\x52\xe4\x01\x5c\x35\x8d\x20\x0d\x61\xa5\x23\x42\x73\x11\x58\x60\x6c\x1c\x32\xce\xbd\x5f\x34\xef\x85\x7d\xbd\xc9\x53\x36\xdc\xd6\x68\xb8\xad\xb7\x78\x86\xdb\x7a\xb8\xad\x9f\xe5\xb6\xb6\xd2\xea\xeb\xbf\xaa\x73\x57\xd7\xad\xf1\x7c\x67\x15\x10\xce\xfa\x54\x76\x20\x99\x9f\x85\xba\x7f\xad\x9e\x48\xa4\x1f\x2b\x14\xb2\x1e\x74\xa1\xb8\x11\x7b\x86\x6b\x5a\x20\x53\x7d\xcd\x98\xd5\xa8\xc6\x0c\xcf\x81\x06\x5b\x7f\xcf\x1e\x31\xc4\x85\xaf\x6a\x15\xd5\x93\x15\x4e\x40\xf0\x60\x39\x5e\x63\xf8\xa5\xe0\x55\xa5\xf5\x95\x8a\xde\x12\xf4\x9a\x34\x15\x5f\xd6\x96\xa6\xa9\x44\xd7\x0a\x2b\x32\x6b\xab\x6b\xa2\x12\x0a\x55\x47\x4a\x1c\x5f\xd1\xc7\xb0\xaf\xef\x6a\x2b\x42\x71\x1f\x28\x76\x83\x1a\x43\x03\x1f\xf5\x9a\x0f\x0c\xae\xf2\xd3\xea\x1e\x2f\xe5\x08\x5d\x92\x3b\x22\x46\xe8\x62\x76\xc9\xd5\xc4\x38\x91\xe2\xde\x1b\x72\x82\x98\x97\x23\x3a\x43\xdf\x55\x58\x11\xa9\x90\xc2\x73\xc0\x16\x77\x05\x7e\xb8\xe8\x35\x8a\xb8\x16\x94\xf7\x74\xfb\x42\x3d\xe6\x79\x56\x4e\xbe\x8f\x54\xfd\x81\xd6\x7d\xcd\x9f\x67\xaf\xab\x51\x39\x1e\xfd\x9d\x71\x42\x1b\xfa\x7e\x43\xe7\x6d\xd8\xe8\xbd\x38\x31\x25\x03\x5d\x55\x64\x70\xe9\x52\x86\x04\x91\x0d\x67\x92\xf4\xca\x37\x74\x03\x81\x9a\x97\x71\xa7\x3e\xab\xc7\x37\xda\x30\x48\x35\x09\x1a\x2e\x15\x54\x39\x88\xd5\x4f\x72\xd9\x02\x13\xd7\x11\x28\x7c\x81\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x33\x45\x04\xc2\xa1\xa8\xf7\xe5\x53\x7d\xde\x88\xa9\x87\xe1\x4a\x69\xc4\x1b\x6b\x7d\x9a\x59\x09\x79\xb4\x94\x41\xf4\xc2\xa0\x4e\x6d\xe1\x8f\xae\xf0\xc6\x4a\x29\x8d\x24\x21\xaa\x9f\x0f\xa0\xd9\x05\xdb\x7b\x15\xb4\x8b\xa6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\xd5\xc9\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x3f\xc7\xfe\x80\x8d\x75\xaf\xe4\xc9\x6f\xba\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x03\x29\x52\xf4\xf9\x7e\xb0\xe5\x81\x14\x61\xa5\x4f\x47\xe3\xac\x77\x94\x25\x4f\xce\x14\x77\x34\x4f\x26\xfc\x55\x2e\xcc\x53\x02\x69\x75\xf8\xe4\x86\xf4\x9c\xd9\x45\xa0\xd2\xce\xbc\xf9\xb1\xa2\x8c\xf4\x17\xc6\xd7\x7f\xf3\x8b\x63\xc2\x9e\xd6\xc8\x45\x25\x15\xa4\x50\x5c\x2c\x1d\xeb\x57\x72\xd7\x5c\x5f\x74\xdf\xa0\x70\xf2\xe1\xc1\xc9\xc1\xd1\xda\x1e\x39\x90\x90\x7e\x61\xae\xc5\x63\x4b\x9d\xed\x07\x25\x69\xdd\x54\x4b\x18\xc7\x41\x39\x42\x54\xe5\xc0\x08\xe9\xdb\xd0\x94\x09\x87\x59\xb1\x54\xdf\x23\x24\x39\x52\x02\x97\xd4\x1a\x08\xf0\xa9\xfe\x92\x12\xad\xbd\xd0\x0f\x0f\x7e\x3d\x18\x21\xa2\x8a\x23\x74\xcf\xd9\x81\x82\xe9\x3b\x46\x37\x50\x5c\x31\x1d\xd6\xeb\x3a\xb2\xe4\x2d\x54\x18\x37\x4b\x68\xea\xe9\x56\x4b\xb8\x6e\x10\x6f\x6d\xfd\x55\xac\x52\x28\xca\xc3\xe7\xfc\x81\x2a\x4b\xbe\xa1\xe5\xf7\x4b\xd8\x4d\xb6\xe2\x37\xd6\xc6\xc8\x1d\x39\x59\x10\x5c\xa9\x85\xc9\x66\x60\x9c\x8d\xff\x45\x04\x07\x1a\x73\x66\x7f\x93\xda\x8d\xb4\x90\x72\xf8\x24\x84\x97\xd7\x3b\x94\x05\xc8\x94\xd9\x19\xe0\x1e\x7d\xed\xbd\x21\xd1\x2a\x11\x5a\x95\x47\x6f\x6f\x6e\x26\x6f\x88\xea\xd7\x73\xd6\x1f\xa2\x37\xe7\x37\x2e\x87\x05\x1c\xfd\x44\xcc\xb8\xa8\xf7\x40\xbc\xe7\x01\xd7\x8e\x51\xc3\xc5\x3e\xdc\x32\x0b\x2e\x93\x96\x13\x3d\xc1\x15\xf3\x96\x4b\x65\x62\x39\xc6\x36\x61\x90\xd8\xc8\xfb\x09\x19\x2e\x7d\xff\x62\x72\x8c\xfe\xc6\x5b\xa8\x44\x86\xa7\xd5\xd2\x17\x32\x92\x24\x0d\x45\xad\x9f\x17\xba\x2b\x2f\xf4\x0d\xa2\x77\xfe\x5b\x82\x4b\x22\x24\x08\x68\x82\x93\x93\xa1\xb3\x1d\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x61\x87\xdd\xa7\x38\xb7\x87\xf3\xd8\x1c\x57\x4b\x27\x2b\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x49\x2f\x33\xef\xf6\xf3\xa9\x51\x53\xc3\x69\xb3\x01\x0e\x43\x54\x6a\x65\x9b\x29\x9a\x97\xe9\xba\xc8\x90\x2f\x80\x32\xe6\x0c\xa0\x34\xf2\xf3\xd5\x17\x41\xb0\x27\xf9\x4d\xf9\xd2\x10\x50\x36\xa8\x3d\x7a\x12\xb8\x3d\xb2\x28\x4a\xbb\xf9\x8c\x0f\x3a\xde\x7b\xbe\xe9\xe5\xb4\xab\x0b\x5e\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\xd9\xdc\x3a\xd0\x6c\x0b\x2c\xc9\x18\x22\xef\xcc\x88\x73\x19\xb0\x5d\x6b\xe9\xa0\x38\x07\x75\xcf\x17\x89\x36\xbd\xce\xd3\xd5\xac\xa8\xf0\x64\xea\xf6\xf0\x59\x0b\xa8\xf7\x16\x2b\xcf\x8e\x47\x5f\x84\x3a\x89\x32\x11\x2f\xac\x73\x9b\x99\x3a\xa1\xc0\xe7\x6d\xae\x2b\x10\xbc\x92\x88\xbb\xf4\xfd\x95\x6d\x5e\xb5\x0a\xb8\x6f\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4a\x44\x47\x0c\x29\xd4\xfa\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xe6\x04\xbd\xd2\x2d\xff\xf1\xdb\x6f\x7f\xff\x6d\x86\x76\xf4\xf0\x5c\x2b\x98\xa1\x8b\xd3\xcb\xd3\x5f\xae\x7f\x3c\x03\xba\xf9\xd4\xd7\x67\x4a\x92\xcd\x9d\x22\x9b\x35\x41\xf6\x49\xd3\x63\x81\xb8\x31\x59\xca\xe6\x3e\x12\xd7\xd0\x2b\xbd\x09\x5b\x69\x28\xea\xad\x4d\x12\x94\xd8\xd6\x66\x54\xfa\xee\x0c\x83\x79\x5a\x60\xed\x85\xa4\x92\x15\x21\x4d\x36\x8b\xff\x5a\xbf\xad\x57\x0e\x08\x95\xad\x30\x55\x69\x7d\xf0\xaa\xf3\xe5\xdb\xa0\x15\xf4\xe1\x2b\x32\xfe\x25\x29\x38\x2b\x53\x4c\x80\x5c\x2a\xad\xed\x49\xd6\x33\x77\x6d\xde\xe9\x5c\xc4\xdd\x55\x62\x1b\x03\x4b\x32\x75\x45\x91\x5f\xd5\x3c\x72\xd2\xb0\x41\xc0\xdb\xfe\xf8\x87\xf8\x00\x59\xd1\x5c\xf3\xe2\x36\xa3\x8b\x2c\x51\x80\xbd\xd6\x27\xad\x30\xb1\xc0\x9b\xb3\x89\xe9\x9c\x5e\x99\xcb\x0f\x37\x1d\xf5\x8b\xd6\xc2\x71\x57\x0d\xfe\xad\x8d\x16\x62\x56\xa2\x5b\xd2\xa4\x59\x97\x5a\x60\x3a\x18\x61\x1f\x45\x08\xbe\x77\x61\xeb\x76\x98\xf4\x6a\x23\x08\x1c\xfa\xcf\x68\xc4\x69\x15\x80\x82\xe0\x3c\x04\x02\xad\x11\x32\xc3\xb4\x42\x18\xbc\xf2\x8a\xd6\x04\xdd\x2f\x08\x33\xce\xfe\x0e\x2d\xf1\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x20\xe1\xdf\x6d\xed\x35\x4c\x65\xc5\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\xd5\x6c\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\x91\xf3\x09\xc8\xe0\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x30\x17\xcb\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x9b\x90\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\xcb\x13\xeb\xa6\x6b\x96\x14\xce\xef\x26\xb6\x10\x58\x2e\x08\xe4\xce\x92\x07\xaa\xa4\x69\xd4\xb0\xb1\xba\x19\xd7\xfa\xc2\x5c\xe0\x82\xa0\x86\x08\xca\xb5\x8a\xd1\x32\x55\xf2\x7b\x86\xa6\x64\x4e\x99\x74\x2b\x96\xd2\x25\xb7\x25\x00\x49\x44\xa5\xaf\xdd\x7d\x8c\xae\x7a\x95\xe3\x2c\xbb\x58\xc1\x3b\x99\x69\xa7\x68\x94\x69\x4a\x40\x79\x81\x6d\xd0\xe2\xaa\x5a\x76\x1b\x2f\x24\x08\x7d\x64\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\xa5\xc9\x20\x9f\x51\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\xa3\x3b\x83\x4a\x24\x08\x2e\x92\x78\x8c\x07\x0c\xd8\xa7\x9e\x01\x03\x36\x60\xc0\x06\x0c\xd8\xfa\x33\x60\xc0\xfa\xcf\x80\x01\x7b\xbc\x43\xfb\x1c\xb4\x1b\x30\x60\x83\x57\x66\xfd\x19\x30\x60\x51\xcf\x80\x01\xfb\xe4\xb3\x77\x22\x7a\xc0\x80\x7d\xc6\x33\x60\xc0\x3e\xf3\x19\x30\x60\x03\x06\x6c\xc0\x80\x0d\x18\xb0\x84\x67\xc0\x80\x6d\x3f\xbc\x21\xf8\x13\xff\x0c\x18\xb0\x01\x03\xb6\xe5\x33\x60\xc0\x56\x9e\x01\x03\x36\x60\xc0\x3e\xf6\x0c\x18\xb0\x01\x03\x66\x9f\xc1\xdb\xb8\xf6\x0c\x18\xb0\x0d\xcf\x80\x01\xdb\xae\x9d\xc1\x0c\x48\x7b\xd9\x93\x98\x01\x52\xf1\xe6\x9a\xce\x13\x78\x21\x73\x1d\x83\x6b\xdf\x13\x4b\x1a\x29\x6d\xb1\x5d\x69\x3e\x74\x7e\x2c\x69\x29\xfb\x42\x44\x58\x70\x93\x4c\x89\x36\x11\xf4\xb0\x9a\x94\xdb\xe4\x62\x06\x01\xe4\x80\xc9\x4d\x9f\x0a\x47\x13\x48\x7b\x65\x1d\xfa\xea\xb3\xbb\xdd\x28\xd3\xb6\x4b\x7c\x0f\x82\xf9\x28\x30\x33\x95\x51\x6d\x99\x6c\x7d\xbd\x4f\x78\x29\x5d\x25\x09\xc6\xd9\xd8\x90\xb5\x1e\xeb\x0e\x1f\x73\x79\x9c\xe0\x0d\x4e\x64\x66\x33\x18\xb9\x89\xe0\xd3\x9d\xb1\xb3\x4d\x00\x7f\x44\x0b\x0b\xd0\xe3\xb3\x1e\xe3\x9a\xe9\x60\x24\xd3\x5a\x1f\x18\x06\xc5\x9a\x1d\x05\x17\xb5\x02\xdb\x83\x02\x77\xc9\xe6\xb6\x35\x72\xca\xb1\x54\xca\x93\x86\x9b\xff\x74\xb8\xa9\x00\x30\x15\x1d\x47\xd9\x31\xbd\x5c\x0a\x4a\x6a\x67\x08\xa9\x3d\x41\x98\x65\x40\x45\xe5\xd4\x95\xf6\x14\x0d\xb5\x9f\x48\xa8\x7d\x44\x41\xed\x02\x01\xb5\x73\xf4\x53\x9e\xb0\x7a\x86\x90\x7a\x26\x8d\xf4\x09\xc2\x53\x16\x48\x7f\xb3\x10\x44\x2e\x78\x15\x2d\x70\x72\x09\x9b\xf7\x94\xd1\xba\xad\xa1\x0a\x85\x96\x29\xf4\xce\x83\xfd\xa5\x13\x19\xf6\xba\x37\x88\x03\x28\x57\x51\x12\x28\x03\x8e\x69\xa5\xb7\x16\x90\x85\x2e\xf0\x1d\x28\xa5\x6d\x51\x10\x52\xa6\xa8\xa5\xa1\xb7\xfa\xf7\xc7\xbe\x87\x86\xa3\x9f\x4a\xf4\x2a\xed\xaa\x49\xb3\x7b\x02\x77\xde\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\xd2\xec\xee\x66\x4e\x77\x33\x25\xb9\x98\x72\x28\x06\xa9\x5e\x94\x7e\x0c\x99\x0b\xb5\x12\x02\x9d\xc3\x2a\x12\x71\x47\x0b\x72\xfc\x0c\x8e\x8a\x5c\xc6\x7f\xfa\x41\x40\x10\x26\x80\x81\xef\x8b\xda\x75\x6d\xba\xe3\x23\x0c\x81\x8f\xca\xf6\x14\x40\xa3\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\xbc\x41\x33\xa7\x6a\xd1\x4e\x8f\x0b\x5e\x9f\x68\xd1\x61\xfe\x33\xad\xf8\xf4\xa4\xc6\x52\x11\xa1\x6d\x1c\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xe5\x36\x0d\xeb\x11\x27\xc1\x94\x68\xb9\xcf\xc5\x8a\xb7\x40\x4f\x4a\xfa\x26\x4d\xbe\xbf\x53\x8b\x8a\x24\xc2\x92\x77\x02\x49\x1e\xa4\x36\xca\x10\x10\xc8\x29\x54\xf6\x03\x76\xfc\x64\x90\xe3\x2c\x67\x35\x13\xd4\x78\x8f\x60\xc6\x7b\x63\x0b\xed\x0b\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xc9\xa0\xc3\x5f\x04\x6c\x38\x63\x7c\x2c\x13\x5c\xf8\x39\xa0\xc2\xfb\xeb\x83\x41\x19\xe0\xc1\xcf\x07\x0d\xce\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x28\xf0\x73\xc4\xff\x9f\x2c\xf6\x9f\x21\xee\x9f\x33\xe6\x9f\x2d\xde\xff\x64\x90\xdf\x74\xb8\x6f\x56\x9f\xc2\xb3\xc0\x7c\x73\x42\x7c\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x80\xa0\xb9\x56\xe2\x72\x0d\x2c\x6a\xdc\xd6\x7d\x5c\xc3\x02\x4b\xe4\x42\xdd\x96\xe2\xc5\xc5\xd2\xad\x0a\x8c\x30\x44\x9c\xf5\xf8\xa2\xa3\xd6\x68\xff\x22\xd7\x68\x6f\xdc\xe3\x86\x57\x65\x4f\x76\xcd\x5b\x7e\x8f\xf8\x4c\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\xf7\x3a\xf2\x65\xfb\xf8\xe9\xd0\x97\xfd\xe2\xac\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\x75\x8c\xde\x5b\x75\xe2\x15\xf4\xc7\x8b\x22\xcc\x4a\x64\xf9\xb9\xbe\xbe\x7d\x92\x0c\x75\xef\x1b\x37\x1e\x9b\xde\xc7\xb3\x98\x1b\x58\x6b\x99\x1c\x61\xfd\x2d\x50\x40\x07\xa7\xeb\xde\x38\x5d\x77\x84\xc0\xfe\xfa\xac\xad\xe7\x47\x5c\x0f\xd6\xd6\xbf\x8b\xb5\x15\xd0\xe2\xbd\x11\xb8\x20\x93\x7d\x52\xde\x9c\x00\xe9\x12\x01\x3b\x1d\xce\x8b\x0b\x46\x88\x49\x1c\xeb\x48\x0f\x81\xdf\x6f\xd6\x56\xd5\xd2\xf8\x10\x7b\x0c\x98\xf1\x5b\xeb\x66\x41\xd6\xa8\x03\x21\x94\xba\xa1\x77\x9d\x6d\xd2\x08\x6e\x35\x12\xd1\x32\xa6\x55\x0c\x7b\x9c\x74\xe7\xb5\x2d\x22\x09\x8b\x77\xa7\xe3\x1e\xb1\xa1\x05\xa1\x03\xd0\x73\x41\x50\x97\xbf\xd4\xef\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\x25\x0b\xd2\xbe\xa5\x55\x65\x5f\x93\x00\x0a\x27\xca\x84\x9e\x8d\x46\x53\x71\x36\x87\xc9\xc0\xa6\x23\xe4\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x85\xeb\x67\x12\x2a\x3e\x68\x9d\x4a\xc4\x68\x35\x72\x53\xde\xa7\xc0\x5c\xdf\xf3\x9d\x4b\x59\x92\xd2\xb2\x57\xde\x53\x49\x46\xf0\xce\xe8\x3e\x99\xbe\xb8\xaa\xfd\x66\xdf\x98\xcf\x1a\xc1\xef\x68\xd9\x61\xf4\xf5\xb6\x00\x7c\x7c\x74\x5b\x3f\xc2\x7b\x9d\x68\x65\x9c\x8d\x19\x99\x63\x50\x8f\xad\x40\x33\x88\x4e\xd3\xbe\xc1\x0f\xb2\x92\x16\x58\x11\x09\x39\x09\x3d\x6a\xdb\x3b\x8a\xa3\x7b\xa2\xc7\x13\xec\x28\x74\xc8\x38\xe2\x90\x59\xd8\x32\xaa\x96\x10\xd1\x5b\xb4\x0a\x95\xfc\x9e\x1d\xa5\x1c\x4c\x03\x73\xc0\x68\x4a\x14\xee\x92\x03\x9d\x4a\x26\x11\x61\x78\x5a\xe9\xb3\x07\x88\xff\x9b\x8d\x1b\x00\xcd\x08\x56\xad\x20\x68\x8e\x55\x82\x94\xd8\xa0\xcd\x9b\xf5\xfc\xf8\xb6\xa3\xd2\xc6\xeb\x66\xa8\x65\x92\x24\x2a\xb2\xd9\x4c\x80\xc8\x8c\x57\x7d\xa2\x79\xab\xf6\xe4\x1e\x79\xcc\x75\x64\x32\x77\x02\x23\x91\xd6\x44\x22\xde\x26\x78\xf2\x7a\xe6\x9f\x6d\x2e\xa7\x85\x37\xf8\x9d\x36\x3e\xb1\x61\xd3\x1c\x3b\xec\x32\xd0\xca\x03\x7e\x02\x07\xb7\x32\x19\xd4\xaf\x2f\xaf\x7f\x79\x77\xfa\xdf\xe7\xef\xe2\x16\xfe\x1c\x17\x8b\x90\x5b\x9c\x21\x0c\x17\x05\x08\xf9\x05\xbe\x23\x08\xa3\x96\xd1\x7f\xb6\x16\xf2\x76\xe8\xdb\x8b\x14\xab\x59\xd2\x7b\x92\x14\x5f\x7d\x4b\x44\x49\x8e\x1c\x6b\xfa\x8e\x4a\x20\xaa\x86\x4e\x58\xe0\x3f\x97\x04\xcd\x04\xaf\x57\x0c\x2d\x74\xe9\xc1\x75\x4b\x7d\xc3\x60\x63\x9a\x2d\x88\x88\xd3\xc8\x5f\x7f\x38\xbf\x86\x1c\xfc\x46\x18\x62\x77\x48\x2e\x80\x77\x42\xeb\x26\x75\xd0\xf4\xa7\x3c\x46\xa7\x6c\x69\x7e\x69\x84\x59\xa4\x8a\x52\x51\xa9\x08\x28\xa7\xd6\x90\x74\xf0\xc0\x17\x2f\x8f\xe1\x7f\x2f\x10\x2e\x4b\xa1\x2d\x4d\x9f\xa3\x51\xac\x66\x99\x45\xb5\x6c\xec\x57\x3a\xad\x82\xc9\x65\x44\x41\x1a\x47\xd4\x0b\xdf\xf3\xd2\xae\x04\x28\x81\x80\xdf\x31\xda\xad\x54\x02\x2b\x32\xa7\x05\xaa\x89\x98\x13\xd4\x60\x55\x2c\x50\x8d\x97\xa8\xe0\x42\xb4\x8d\xa1\x18\x29\xb1\xc2\x71\x2d\x7f\xcf\x05\xaa\x9d\x74\xd6\xd2\x4c\xab\xe4\xd7\x9b\x81\xa0\x9d\xc8\x0e\xff\x49\xa5\x6c\x89\x3c\x79\xf5\xf2\x4f\xdf\x7c\x1b\x69\x5e\x67\x3c\xb8\xb1\xd0\xa7\x04\xc8\x53\x1f\xfe\xe5\x36\x18\x80\xae\x7b\xcc\x30\x76\x87\x98\x9d\x0f\xd2\x50\x52\x36\xaf\x92\x1d\x20\xc9\x6e\xc0\x54\x27\xe0\xb8\x1b\xc1\x24\xd6\x17\x98\xee\x09\xec\xf5\x21\xde\x95\x92\xcf\x0b\xd6\x69\x70\xce\xef\x65\x05\x32\x67\x81\x61\x77\x31\x71\x52\x2a\xc5\x7f\x04\xd6\x84\x77\x4c\x19\xf6\x11\xd3\xac\xc1\x3b\x8c\xd0\x4b\xf4\x5f\xe8\x01\xfd\x17\x78\xc1\xfe\x18\xdf\x54\x1e\x1f\x53\x0e\x18\xff\x82\x4b\x75\x31\xc9\xb4\xd0\x7f\xd5\xf7\x95\x7e\xa3\x5e\x0f\xc5\xd1\x94\x5a\x77\x04\x79\x50\x44\x68\x33\xd0\xae\x61\xea\xcc\x25\x79\xd4\x74\x07\xbf\x94\xdd\x9d\x0a\x2e\xb8\x98\xf5\xd1\xff\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x0a\x9d\xb0\x1f\x35\x5c\xc4\x3d\x71\x9f\xd2\xea\x7b\xbd\xf7\xba\x1a\x1b\xa8\xe4\x90\x00\x61\x72\x38\x17\x34\x41\x38\xec\xcf\x89\x4d\xc3\x89\xe6\xdb\xba\x1f\xdb\x5a\x2b\x3e\x7d\xf0\xc8\x58\x23\x25\x28\x4b\xd3\xf0\xf2\x18\xec\x9b\x84\x5e\xe8\xd9\x28\x03\x65\xe0\x23\xa6\xd1\xb1\xb1\xd7\x7c\x74\x18\x0e\x9c\x96\x58\x05\x66\xb1\x3a\xac\x79\x04\x99\x11\x21\x4c\x9e\xf0\x74\xe9\xd2\x8d\x92\x77\x5b\x92\x94\x6b\x04\x57\xbc\xe0\xd1\xb4\x29\x39\xb7\xca\xc4\xf6\x05\xe6\x1e\x62\xb5\x3e\x3a\xfe\xc3\xeb\xc9\x08\xdd\x9c\x4d\x46\x88\x0b\x74\x7d\x96\x06\x7e\x0a\x5d\x30\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x0e\xd3\xcd\xd9\x24\xe2\x25\xeb\xf0\xd9\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x5e\x33\xb9\xb8\xac\x43\xdf\xd3\x7c\x94\x2e\x35\xbf\x23\xa5\xb1\x9a\x5d\x2b\x84\x95\x0d\xa7\xda\x46\x1a\x78\x5e\x3e\xf6\x0c\x3c\x2f\xdb\x3f\x03\xcf\xcb\xa6\x67\xe0\x79\xd9\xe2\x19\x78\x5e\xcc\x33\xf0\xbc\xf4\x3b\xb2\x8f\x39\x46\x03\xcf\xcb\x27\x9f\x81\xe7\xe5\xd1\x67\xe0\x79\xd9\xea\x19\x78\x5e\xd6\x9f\x81\xe7\xe5\x23\xcf\xc0\xf3\xe2\x9f\x81\xe7\x65\xe0\x79\xf9\x72\xa5\xf6\xc0\xf3\xb2\xfa\x0c\x3c\x2f\x03\xcf\xcb\xc0\xf3\x12\x3e\x03\xcf\xcb\x23\xcf\xc0\xf3\x32\xf0\xbc\x0c\x3c\x2f\x1f\x7f\x06\x9e\x97\xe8\x67\xe0\x79\xd9\xee\x19\x32\x0f\xb7\x7c\x06\x9e\x97\x81\xe7\x65\xf5\x19\x78\x5e\x3e\xf9\xec\x87\x7b\x7c\xe0\x79\x19\x78\x5e\x3e\xfa\x0c\x3c\x2f\x03\xcf\xcb\x47\x9f\x81\xe7\x25\xe2\xd9\x3b\xa7\xeb\xc0\xf3\x32\xf0\xbc\x7c\xac\x8d\xc1\xda\xda\xee\x19\x78\x5e\x06\x9e\x97\xb5\x67\xe0\x79\x59\x7f\x06\x9e\x97\x81\xe7\x65\xe0\x79\x19\x78\x5e\xfc\x33\xf0\xbc\x7c\xed\x7e\x27\x41\x24\xfd\x17\x99\xf0\x8a\x16\xcb\xe4\x6c\x9f\x2b\x22\x79\x2b\x0a\x7d\x63\xc3\x6b\x51\x03\xef\xf5\x1e\x85\x24\x25\x7b\xcf\x28\x14\xae\x82\x89\x0b\xa9\x14\x84\x9d\x83\xa7\x98\x82\xbd\xa0\x53\x70\x03\xbc\x8c\x47\x10\x8c\x5d\xf9\x6c\x33\x7d\x71\xce\xd2\x64\xab\x3d\x1c\xc8\x3e\xa4\x73\x86\xb4\x47\x7e\x17\x29\xee\x85\x2d\x7d\x74\x73\xe1\xa6\xa9\x68\x4a\x62\x2c\x42\xd7\x2d\x68\x17\xc4\x86\xc0\xe5\x77\xa8\x68\xda\x11\xaa\x49\xcd\x45\x42\x62\x44\x06\x0b\xae\xb7\x55\xf6\x61\x9d\xae\x4c\x87\xdc\xe4\x2b\x0e\xf3\xbf\x34\xf6\x42\xc7\x52\xe5\xd7\x8a\x3a\x71\x98\x84\x35\xbb\x98\xad\x82\x51\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x70\x67\xac\x55\x67\xbc\x6e\x5a\x45\x7a\x17\x9b\x99\x62\x63\x74\x50\x99\x2a\xd0\x77\x93\x0d\x5a\x70\x36\xa3\x73\x6b\x7d\x9f\xd4\x98\xe1\x39\x19\xfb\xd9\x1e\x77\x54\x0f\x27\xd1\x17\xf5\xce\x52\x41\x8b\x0a\xd3\x78\xe0\x60\x2e\x31\x71\x06\xbd\x00\x1a\xb0\x0e\x50\x0f\xb9\x69\x7e\x9a\x47\x1e\x36\x4e\x8d\xdc\x38\x76\xbf\x32\x7f\x3c\x4a\xb0\x1e\xb1\x02\x5f\x05\x18\x46\x1b\x76\x6a\x9a\xc1\x68\xcc\xc4\x92\x34\x44\x5b\x04\xc6\x81\x1a\xaf\xf7\x2f\x19\xae\x69\xe1\x4e\xd8\x69\x55\xf1\xc2\xf8\x64\xfa\x56\x65\x8e\x2e\x6b\x63\xb7\xae\x5b\x85\xa7\x15\x39\x46\x17\x86\xa2\x82\xb3\x6a\xa9\xcf\x9f\x24\xca\x41\x14\xec\xe6\x4f\xb3\x24\x53\xf0\xaf\x89\xd8\xd7\x8d\x4a\x39\x6c\x2a\xc3\xa9\x41\x98\x16\x65\x9c\x11\x44\x98\x12\x4b\xbd\xff\x26\xbc\xbc\xd6\x5b\xb0\xf7\xed\x64\xaa\x8d\x44\xc8\x6b\x0e\xb8\x6b\x22\xd4\x35\x0f\x40\x35\x1d\x9c\x9a\x17\x98\xda\x85\x10\x0c\x53\x50\x98\xf1\xd3\xdb\x16\x0d\x2f\x8f\x37\x88\x26\xc4\x67\x89\x3d\xd0\x2d\x4e\x78\xa9\x95\x26\x41\x8c\x7c\xf2\x67\xd4\x38\x10\x2f\x74\xe7\x6e\xc1\xe3\x87\x55\xa7\x4d\xe1\x3b\x4c\x2b\x7d\x80\x13\x3b\xb0\xce\xba\x98\x16\x95\xc9\x14\xab\xb0\xe0\xfc\x7d\xda\x2c\x36\xad\xab\x97\x19\x56\x2c\xb8\x24\x0c\xe4\x25\xf6\x19\x3c\x3e\xbf\xc0\x8a\x98\xd2\xdc\xc5\xa9\x28\xe2\x8b\x19\x22\x75\xa3\x96\x23\x44\xee\x88\x58\xaa\x05\xa0\x0d\x3c\x6f\x28\x88\x35\x2a\x51\x8d\xcb\x60\x77\x8c\x10\x77\x0e\xe8\xc4\xe6\xe1\x7e\xb0\x36\x59\x5b\x29\x63\xa1\x51\xe9\xd3\x28\x76\xbd\x6b\x72\xd3\xd9\xa0\x54\xa1\x99\x93\x8e\x06\x01\x95\x6a\x4d\xe3\x88\x6b\x51\xc6\xb3\xf0\x0e\x7a\x11\xa4\x8e\xe8\x2d\x51\xe3\x07\x70\x4f\xe2\x9a\xb7\x4c\x19\x9e\x1a\x63\x31\x78\x2d\xcf\x24\xd8\x3c\x23\x5e\xee\x49\x75\x7b\x94\xe7\x6a\xc7\xa5\xa3\xa6\x98\xe4\xc8\x53\xc6\x4a\x11\xc1\xbe\x43\xff\x73\xf8\xf7\xdf\xfd\x3a\x3e\xfa\xf3\xe1\xe1\x4f\x2f\xc7\xff\xf9\xf3\xef\x0e\xff\x7e\x0c\xff\xf8\x8f\xa3\x3f\x1f\xfd\xea\x7e\xf8\xdd\xd1\xd1\xe1\xe1\x4f\x7f\x79\xff\xe6\x66\x72\xfe\x33\x3d\xfa\xf5\x27\xd6\xd6\xb7\xe6\xa7\x5f\x0f\x7f\x22\xe7\x3f\x7f\xe6\x4b\x8e\x8e\xfe\xfc\xdb\xf8\xe8\x63\x6a\xa8\x3d\x5f\xa0\x3d\x53\x98\xfd\x49\x82\xec\x56\xc6\xee\xfc\xf0\xdb\x2b\x70\xed\xf8\xdb\xe8\xc4\xc7\x8e\xbf\x48\xf6\xc9\x5c\xcc\xba\xf6\xa9\x44\xbc\xa6\x4a\x91\xd2\xde\xbd\x01\xf7\xcd\x8a\x3f\xc8\x0a\x2c\xa0\xad\xc2\x70\x7b\x07\x1c\x2c\x9d\x1b\x29\xba\x5b\xfe\x7e\x05\x0f\x18\x43\xb4\x6e\x2a\x52\x13\xa6\x40\xf0\x8c\x9d\x6d\x0b\xee\xc4\xe3\x6e\x04\x85\x71\x78\x90\x87\x82\x90\xd2\x76\x72\x90\x8d\xc1\x33\xc8\xc6\x41\x36\x7e\xea\x49\xf6\x89\xe7\x10\x8c\x57\x61\x27\xac\x2f\x4b\x3a\x4d\x19\x3c\xe4\x9e\x22\x81\xcf\x00\x28\x71\x47\xcb\x16\x57\x21\x93\xac\x23\x17\x8d\x93\x00\xe0\xda\xe9\x43\x43\x20\x4c\x4b\xee\x48\xe5\x3b\x61\xdc\xf4\xc7\xe8\xaf\x06\xce\x13\x1a\x9a\x7d\x87\x7a\x5c\x40\x6e\xd3\x70\xfb\x8c\x10\xd6\xd4\x3d\x90\x2b\x5d\xf2\x68\xa3\x2e\x09\x43\xef\xb6\xb8\xa9\x38\xf5\x52\xa3\x5a\x8e\x90\x24\xca\xe4\xd8\x2c\xc8\xca\x32\x61\x89\x5e\x9c\x56\xf7\x78\x29\x5f\xf8\x98\x24\x65\x54\xad\x14\x1f\x88\xea\x03\x70\xc3\xea\x17\xce\xb8\xd6\x79\xa1\xaa\xc2\x6c\x46\x8a\x48\x6b\xd6\x70\x70\xac\xf7\xcd\xe2\xd1\x15\x65\xad\x1e\xad\x9b\x55\x52\x22\xce\xa2\x1a\x22\x0f\x54\xa1\x96\x29\x5a\x69\x65\x1d\x09\x32\x6f\x2b\x1c\x3a\x02\xed\xc8\x1c\x4c\xae\x3c\x46\x1f\x58\x41\xc2\x2f\xc7\x79\xaa\x57\x1a\xd0\xca\x43\x45\x14\x29\x47\xf0\xea\xfe\xd0\xa5\x01\x9a\xf5\x4e\xbe\x5f\xca\xa8\xe6\xdd\x5c\x7a\x20\xd1\xb1\x39\x50\x1e\xe5\x80\x4a\x3a\x9b\xe9\x96\xc1\xd8\x66\x5c\xd4\x78\xbd\x57\x98\x95\x51\xad\xeb\x93\x0b\xe9\x25\x21\xcb\x2f\x54\x76\x79\x21\x69\x49\x0a\x2c\x5e\x84\x35\x41\x4e\x2b\xb5\xe0\xed\x7c\xd1\xed\x8a\xb4\x29\x47\x52\x01\xbc\x4a\x4f\xa6\x74\x9e\x8b\x95\xcd\x26\xb5\xce\xc2\x0a\x62\x54\x2b\x4e\x8c\xc0\xb8\xc7\x91\x6d\xaf\x41\x00\x0c\xa6\xdb\xac\xb9\xcb\xb9\x02\x0c\x1f\x29\x83\x04\x39\x46\x1e\x54\x86\x01\x1f\xa3\x0b\x43\x78\x31\xea\xbf\xb5\x37\x25\x66\x32\x02\x0c\x9b\x43\x63\x46\x02\xf8\x56\x1a\xa0\x3e\xc5\x0c\x78\x89\xcd\xcb\x31\x5b\xba\x8c\x0e\xc0\x98\x99\x4c\x34\x9f\x64\x52\xc5\xf9\xd0\xfd\x59\x7a\xf6\x32\x3b\xbd\x13\x7a\xd5\x56\xbb\x8b\x5e\x5e\x85\x05\x3e\x2a\x5b\x80\x47\xe8\x1e\xb9\xac\x9e\x05\x29\x6e\xcd\xc9\x2b\x89\x11\x6f\xc4\xf2\xdc\xa6\x9e\xae\x05\x6f\xab\xd2\xb0\xea\x76\xd2\x19\x24\xad\x81\x50\x9a\x6e\x60\x41\x10\xd1\x16\x02\x50\x8f\xd0\x38\xf1\xcd\x45\xa9\xb7\xb7\x11\xc9\xf0\x62\xe3\xd5\x76\xe9\x2e\xb6\x4b\x20\xe5\x0b\xce\xcc\x3d\x39\xb2\x37\x77\x8d\x29\x8b\x55\xed\xba\x31\xd0\x39\xe3\x02\x9c\xd6\x33\xc4\x78\xbf\x0f\xfd\x23\xbf\xd2\x8b\x68\x9d\xc3\xe3\x90\x36\x6a\x3b\xdd\x72\x9a\xf6\xef\x17\x44\x5b\x6b\xfd\xbe\xc4\x8a\xed\x60\x45\x85\x96\x88\xc7\xba\x33\x52\x09\x0c\x34\xc9\x36\x9f\x42\xc4\x6e\x7c\xad\x74\x9f\x2a\x54\x73\xa9\xd0\x37\x2f\x83\x39\x4e\xf2\xa3\x8d\x11\x9c\x44\x08\xf8\x79\x35\x05\x98\x2e\x30\xe4\x42\xc5\xbe\xf5\xa2\x24\x4c\xd1\x02\x57\x41\x47\xf5\x25\x31\xe3\x62\x4a\xcb\x92\x00\xb4\x1d\x0a\x42\x80\xc9\x19\x69\xe9\x82\xea\xda\x35\x10\x60\x40\xba\x8d\xf5\xfe\x87\xeb\x1b\x88\x61\xf6\xf5\xbd\xce\xe6\x8f\x53\x8d\xee\xf4\x10\x94\x16\x0a\xe1\x7e\x36\xea\x6c\xaf\xa5\xaf\x03\xd2\xa7\xc7\xa3\x77\x4a\xe0\xe8\x59\xf0\xfb\x75\x39\x42\xb5\xca\xc6\xca\xe8\x84\xc7\x3d\xc0\xf1\x99\x8d\xbf\x23\xec\x9d\x69\x7c\x1f\xd0\x5c\xd7\x3e\x37\x52\x6f\x6c\x6c\x33\x23\xf1\x2d\x61\x5a\x94\xad\x2f\xfc\xcc\x73\x68\x51\x01\xee\xae\x14\x6a\x28\x38\xcd\x58\x51\xa9\x4f\xb3\xb9\x18\x21\xdc\xd4\x70\x5b\xc1\xcd\xe3\x9e\x5f\xd8\xcd\xf9\x42\x5f\xd6\x4e\xd8\xa7\x71\x5a\x67\x08\x7c\x66\xf0\x8e\xe8\x59\x3d\xe3\x65\x8a\x8f\x6b\x05\xee\xe0\x95\x1e\x93\x32\x03\xf7\x6d\x69\x74\x1e\x50\x78\xf4\xba\xf6\x57\xf5\xeb\xc0\x39\xe8\x33\x89\x15\x8f\xf7\x77\xe5\xc1\x3a\xb8\x6e\xec\x57\x08\xbb\xb7\x29\x04\xa9\xcc\x75\xbc\xa0\x0d\x9a\x12\x75\x4f\x08\xdb\xac\xa7\x95\xe4\x50\x1e\x39\x47\x4d\x62\x27\x3a\x68\xa8\x81\xd8\x1e\xa3\x49\xef\x98\xc3\xe5\x9e\xce\xec\x76\xc1\xbe\x5b\x15\x51\x60\x78\x39\x31\xe3\x44\xd8\x86\xb1\x02\x40\x2a\x0d\xce\xe5\x07\x4b\xc0\xda\x58\x1b\x73\xf2\xf0\x2e\xb9\x4a\x1b\x61\xf2\xd0\xb4\x7e\x67\x1d\x06\x4f\x32\xca\x4c\x48\x12\x8b\xe3\xde\xa3\x53\xd8\xbf\x6a\xed\xdc\xd9\xad\xef\x85\x73\x0f\x82\x17\x88\xef\xd4\x9d\xe3\x6d\x8a\x6f\xbf\x45\xc4\x04\xaa\x32\xd8\x15\xee\xc9\x43\x79\x99\x85\xf4\x32\x1f\xcf\x35\xca\xc6\x75\x8d\x3e\x02\x0b\x89\x63\x77\xcd\x8c\x34\x97\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\x28\x87\x75\x8e\xb3\x72\xdd\xef\x46\x2f\xa8\xe2\xba\x88\x78\x63\x2a\x78\xac\x94\xc7\xee\x3c\x2e\x2d\x03\x5f\x71\xdc\x8e\xbe\x98\xe9\x15\x31\xee\x11\x08\x94\x00\x68\x79\xb5\x63\x2e\xe8\x62\x74\xac\x7f\xb6\xf4\x0e\x57\x5a\x0c\x77\x7f\x31\x81\x0c\xcd\xf0\x8f\x9e\x12\xd9\xae\xb0\xbc\xed\xc2\xbb\x64\xdc\xf0\xb2\x8b\xe6\x9e\xb8\xa9\x83\x8f\xc8\x83\xfa\x02\x51\xed\x20\xa5\x26\x82\xde\xd1\x8a\xcc\xc9\xb9\x2c\xb0\x51\x61\x76\x8d\x8c\x38\x7d\xa4\x5f\xb0\x33\x05\xaf\xa4\xf7\x3d\x61\x97\x9f\x0e\x4e\x98\x39\xa6\x0c\x6a\x3b\x27\x68\xab\xb6\x51\x69\x12\xe4\xa9\x92\xa8\xc1\x42\xef\x42\x97\x08\x6f\xe2\x19\x53\xce\x2b\x5b\x0c\xa8\x5a\x76\xfd\xa2\xf1\x10\x56\x70\xa0\xf3\x5f\x18\xb9\xff\x45\xf7\x42\xa2\x59\x85\xe7\x5d\x3c\x45\x5f\x6c\xab\xfa\x64\x72\x6e\xfe\xa3\x13\x0d\x95\x6e\x5a\x7d\x8f\xdd\xe3\xa5\xec\x58\x0b\x42\xb7\x7b\xfc\x8d\xf2\xea\x08\xe4\x09\x96\xc8\xb7\x1d\x17\xef\xd1\xcf\x37\x47\xe0\xdc\x3f\x3b\x9d\xfc\x72\xfd\xb7\xeb\x5f\x4e\x5f\xbf\xbf\xb8\x8c\x7e\xd9\x25\x57\xc4\x40\x5b\x82\xa0\x6e\xe1\xd3\x69\xf4\x2a\xf8\x8c\xac\x63\x2e\x8f\x01\xb7\x0a\x94\xb9\xac\xe4\xf7\x89\xe0\x7e\xbd\xa7\x08\x8e\xf3\x9e\xe0\xa6\x39\x15\x35\x17\x13\xc1\x67\xb4\x8a\xd6\xf8\x73\x9d\xe0\x95\xee\x38\x98\xef\xa9\xfd\xb8\xbb\x6e\x0c\x8b\xe3\x7a\x36\x49\x70\x65\x50\xe0\x0a\xd4\xaf\x89\x87\x15\xad\x86\xf3\x0f\xe4\x6a\x17\xe3\x0f\xd1\x4e\xf7\xcc\xce\x39\xb2\x74\x37\x22\xff\x3c\x87\x6b\xa0\xe2\x05\xae\xa0\x4a\x74\xda\xc6\x47\x99\x0d\x93\xd5\x7e\x05\x9c\x1e\xd8\x6d\x67\x54\x71\x5c\x9a\x18\x96\x11\xfe\x25\x71\xb5\xcb\x9c\xda\x05\x59\x0b\x49\x1d\xb9\x31\x7c\x0a\xd0\x9e\x23\x21\x69\x04\xf1\x5a\xcd\x4a\xf3\xdc\x94\x6c\x4b\x6a\xf2\x7d\x3f\x07\xc4\x8e\xb2\x47\x97\x95\x7a\xe6\x7c\x33\xf6\x80\xd1\x19\xf8\x53\xc0\xcf\xa9\x0d\xf5\x65\x63\x1c\x9c\xef\xdc\x32\x24\x94\x97\xcd\x64\x3c\xc3\x4b\xf6\x64\x77\x9a\xf9\xf1\x3b\xd2\x24\x83\xdf\x52\x3d\x83\xb3\x4e\x48\xbb\x6d\xe3\x74\x10\x93\x11\x9e\xb8\x1f\x7f\x84\x42\xe6\x4e\xfe\x67\x70\x4e\xf9\x25\x46\xe3\xe0\x68\x35\x82\x8c\xd7\x8f\x57\xaa\xbd\x7f\xd5\x32\x45\x6b\xe2\x18\x46\xc7\x2b\x3a\x91\x30\xbf\x3e\x90\xbe\x9e\x4f\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x8e\x87\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\x28\x8f\x19\xf4\x07\x30\x40\x65\x79\x52\x0a\xde\x98\x9b\xd8\x51\x7f\xa5\x67\x65\xf6\x29\x66\xc2\x4a\x4e\xd6\x13\xd5\xeb\xc8\x5c\x60\xa6\x3a\xfc\xde\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x68\xf6\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x45\x6b\xce\xdc\xe0\x02\x8e\x19\x34\xf9\x70\x7d\xf1\x7f\x56\xce\x4d\xbc\x6a\x67\x9e\xfd\x2e\x59\xa1\xe5\x41\xb6\x6d\x73\x65\xeb\x7c\x0f\x1b\xe7\xeb\xde\x38\xde\x41\xb4\x73\xbe\xed\xab\x36\x8c\x38\x53\x16\x74\x0d\xd5\x49\xba\xce\xc4\x53\x53\xf6\xdf\x1a\x02\x74\x05\x41\xfa\x2b\x4c\x51\x80\x4b\x07\xde\x5a\xc5\x4d\x29\x6b\xab\x76\xa5\x95\x62\x08\x6f\xd7\x19\xae\xe4\x97\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\xf7\xbc\x65\x79\x08\xbc\x13\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x33\xf8\x2d\x32\x39\x6b\x41\x6d\x8e\x9e\x9e\x93\xa0\x66\xdd\x04\xaa\x95\xc7\xaf\x38\x3d\xdc\xd8\x2f\xad\x5c\x03\x46\x5a\xbd\xaa\x4b\x61\x9b\x25\x20\x19\x04\xc1\xa5\x01\xd2\x60\xb5\x30\xa4\xf1\x35\x96\xb7\xa4\x34\x1f\x24\x12\x66\x7a\x72\x4c\x80\xc2\xb9\x99\xbe\xd1\x93\xeb\x38\x4b\xc0\x21\x6c\x40\xb6\xc0\xa0\x99\x62\x8a\xed\xf4\x34\x24\x08\x76\xbd\x08\x1f\x58\xb5\xbc\xe2\x5c\x7d\xef\x6b\xe2\xef\xfa\x64\xfc\xd5\x43\x61\x43\x27\x26\xf8\xa5\x31\x74\x79\x0c\x1b\x07\xe4\x62\x50\xc9\x3f\x55\x2c\xea\x05\xf9\x77\x95\x8a\xa2\x65\xa7\xf2\x8d\xe0\x6d\xb4\x0e\x97\xd3\xde\x7c\x73\xf1\x1a\x2e\xbe\xd6\x72\x2a\x33\x25\x96\x0d\xa7\x4c\x39\x8f\x57\xc6\xa0\xcd\x0f\x96\xbd\x3a\x94\x6c\xc9\x44\xb5\x08\xbd\xc7\x4b\x84\x2b\xc9\xbd\x4b\x8d\x6d\x0a\xb7\xba\x58\xae\xfe\xf5\x94\xab\xc5\x5a\x10\x37\x36\x75\x47\x3f\xeb\xed\x8d\x02\x6a\xe6\x0e\x10\x43\xd9\x5a\xb3\x0a\x58\x5d\x1a\x41\x0a\x52\x12\x56\x7c\xa9\x27\x62\xd7\x4c\xc1\x70\xaa\x2e\x39\xd3\xe2\x75\xd7\xe7\xea\xc2\xfb\x27\xed\x6a\x84\xa7\x08\x5c\xd9\x36\x88\x88\x81\x55\x1b\x84\x6b\x2b\x53\x90\xa7\x17\x33\x88\x7a\x9a\x4d\xf7\x97\x76\x4a\x2a\xbd\xd8\xb4\xaa\x1c\xda\xde\x40\x13\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x22\xb3\xaa\xf4\xe3\x13\xc2\xec\xd0\x7e\xb8\x78\x8d\x5e\xa2\x43\x3d\x36\x83\x18\x9c\x61\x5a\x01\x51\xb7\xc3\xea\x86\x36\xc0\xcc\xe5\x94\x25\x4d\x01\xc8\x11\xc4\x85\xb9\x5a\x46\x88\x71\x24\xdb\x62\x11\x64\x1c\x78\x8f\xb0\xad\xda\x94\x44\x44\x32\x88\x9d\x7c\xf7\xe1\x0f\x92\x44\x43\x64\x73\x5e\x87\x3f\x3c\xe3\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\xbe\x30\xec\xda\xe1\xb2\x4c\xb8\x2c\x25\x79\x47\x59\xfb\x60\xea\xa2\xec\x45\xd8\xe3\xfa\x1c\x7a\x84\x0a\xb7\xd0\x3c\x88\xdb\xb9\x08\x45\x86\x14\x8d\x8b\xde\x31\x1a\x3d\x62\x75\xc3\x2d\x81\x0d\xf7\x26\x64\x51\x62\x56\xf2\x7a\xad\x93\x33\x2e\x10\xc1\xc5\x22\xba\x37\x01\x6a\x64\x38\x98\xf6\xf9\xf7\x0e\x08\x41\xfa\x6a\x36\xdf\xfe\x3b\x48\x86\xa5\xd2\xef\x5c\x93\x1d\x5b\xe1\x29\xa9\x2c\x2d\xae\xe1\x4a\xcf\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x7f\x11\xf3\x90\x15\x7c\x71\x63\xd1\x25\xdd\x3c\x80\x0f\xf4\x4b\x98\x87\x36\x41\x41\x44\xab\xf3\xa0\xb5\xcd\xfe\x3c\x80\xfe\xb5\xef\xf3\x20\x49\x51\xf0\xba\xd9\x13\xa4\xe4\x8d\x41\xe1\xeb\x1e\x7d\x2e\x2a\xb2\xff\x65\x9c\x04\x77\xb6\xd5\xae\xb0\x32\xf7\xa0\x2b\x79\xf5\xbf\x83\xeb\x1c\xa4\xdd\xea\x1d\x6f\x5b\x4f\x46\x64\xfa\x16\xed\x0b\xff\x1d\x6f\xbc\x01\x86\xd9\x7b\x9e\x1d\x86\x19\x30\xe6\x63\x70\xcf\xf7\x20\x91\x5f\x03\x18\x53\x1b\x01\x30\xaf\x84\x01\x0b\x50\x83\xd5\x62\x64\x33\x56\xef\x88\x13\xcf\xb7\xc6\xe3\x75\x00\x12\xc7\x75\xc8\x89\x9b\x0e\xb3\x6a\x98\xf4\xb3\x62\x37\x37\xe1\x35\xcd\x77\x2e\x3f\xdc\x84\x3c\xfa\x98\x2d\x0d\x47\x64\x02\xab\x99\x79\xf6\x4f\xad\x78\x4a\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xe1\x48\x0b\x65\xe8\x04\xc1\x55\x95\x05\x93\xb0\xc9\x0b\xe2\x4e\x81\xa7\x92\x5f\xf7\x06\xf4\x6b\x9a\xa6\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x82\x94\x06\x27\x75\xdd\x90\x62\x5f\x6e\x8b\x37\xef\xaf\x4f\xfb\x3d\x03\x5d\xd8\x16\xce\x20\xf0\x7b\x84\xcb\x9a\x4a\x09\x01\x1f\x32\x5d\x70\x7e\x9b\xd4\xe4\xa1\x4b\xb5\x9d\x53\xb5\x68\xa7\xc7\x05\xaf\x83\xac\xdb\xb1\xa4\x73\x79\x62\x25\xca\x58\x4f\xdc\x11\xa2\xac\xf2\x99\xca\xe0\x2d\x04\x2e\xb0\x78\x2a\xb9\x70\xf0\xa8\xf0\xa3\x87\xad\x07\xf9\x29\x1e\x9a\xbd\x3e\x3d\x50\xdd\x04\x36\xef\xce\xb5\x8e\xf5\x5d\x95\x56\x6d\x70\x65\x67\x3d\x32\xf6\xb0\x52\x87\x8d\xe2\x6c\x9c\x47\x63\xbc\xee\x7c\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\xde\x76\x5d\x0a\xb9\xf4\xe8\xac\xc7\x08\xd5\xcf\xb9\x87\xf0\xf6\x81\xfe\x4b\x07\xcb\x3c\xc8\x55\x5c\xe6\xb4\xaa\xf4\x42\x62\x4b\xbc\x16\xa0\x3b\xc1\x34\xe9\x33\xda\x19\xce\x5d\x6d\x2c\x84\xa3\x80\x8b\x24\x4d\x28\x18\xde\x33\x7d\x19\x58\xce\x0c\xbd\x81\xa0\x6d\x8c\x6a\xfa\xa0\x7b\x18\xb6\xd8\x27\x89\x85\xc0\xff\xe6\x5f\x27\x14\xb0\x46\x00\x3e\xf0\x9c\xe9\x23\xbd\x42\x61\x23\x2e\x39\x5a\xe9\x6b\x4b\xff\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2b\x72\x8c\x36\xa4\xef\x3c\x5b\x04\x19\x7d\x7e\x14\xf9\x09\x63\x55\x68\x5f\xe2\x55\x89\x52\x3f\xe4\xfa\xdd\x19\xcf\x4a\xc8\x37\x4c\xd7\xc1\x4b\x13\x5e\xae\xd1\x10\x03\x99\x31\xc5\x55\x7c\x21\xd7\x8b\x59\x48\xdd\xc9\xb8\x75\x8f\x98\x0a\xe2\x06\xa7\xff\x40\x8a\x56\x91\xd2\xb2\x91\x5b\x97\xb2\x61\x32\xee\xf7\x26\xba\x07\x2e\x49\x7f\x4a\x00\xa0\x24\x47\x5d\x29\x36\x6b\xeb\x78\x7e\xd7\x11\xfa\xbf\x20\x25\xa5\x23\xd4\xaa\xe8\x1d\x61\x44\xca\x89\xff\xf3\xd8\xa9\x00\x1c\x75\x81\x99\xb3\xad\xf4\x99\xb6\x1e\x6e\xcb\x3a\x6e\x79\x3c\xa6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x99\x92\x39\x35\x69\x81\xc1\xa5\xe8\x69\xcb\xe3\x48\x75\xc1\xb0\xa1\x0a\xd5\x74\xbe\x30\xa7\x05\x61\x54\x71\x36\x47\x0e\x37\x56\x71\x5c\x22\x10\x2c\x5c\xa0\x7b\x2c\x6a\xad\x0b\xe0\x62\x01\x20\x34\xcc\x50\xd9\xea\xf3\x80\x80\x64\x7b\x39\x96\x0a\x2b\x62\xc9\xf0\xa2\x7d\x70\x6e\x9a\x76\x50\x22\xf6\xa9\xcb\xdf\xef\x98\x4f\x47\x9f\xb4\x2c\x5e\x90\xf3\x07\x52\xf8\x63\x6d\x18\xa7\xeb\x1a\x08\x03\xb9\x3b\xce\x8e\x2d\x2e\x59\x19\xdc\x13\x53\xd9\x8e\x70\x5f\x74\x93\x33\x3b\xe1\xd4\x59\x9f\xe6\x47\x6d\x8f\xf6\x17\x41\xba\x20\x56\x50\x34\x09\xd8\xb1\xb9\xb8\xd5\x27\xd7\x70\x04\x71\xe1\xab\xf5\x27\x75\xcb\xf5\x03\x28\xb3\x39\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x30\xcd\xc0\x64\x44\x77\x03\x92\xb4\x6e\xaa\x25\x8c\xe1\xc0\x94\xfc\x4e\x24\x30\x74\x80\x55\x5f\xfe\x52\x2e\x48\x55\x8d\x90\xd4\xea\x2f\x76\x35\x44\xcc\xa7\xfa\x4b\x4a\xb4\x85\x71\x93\x1d\x1e\xfc\x7a\x30\x42\x44\x15\x47\xe8\x9e\xb3\x03\x65\x02\x1e\xe8\x06\x6c\xc8\xa4\x3e\xf9\x4e\x2c\x79\x8b\x18\x21\xf6\xec\xf8\x62\x55\x05\xd6\xe6\x4f\x6b\x74\x74\x43\xba\x41\xaa\x2a\x4d\x9f\x3b\x7f\xa0\x4a\xab\x22\xaa\x05\x37\xc5\x4b\x63\x29\x10\xe0\xa1\xc7\x12\x6e\xba\x93\x05\xc1\x95\x5a\x2c\xbd\xf5\xf2\x2f\x22\x38\xd4\x27\x65\xf6\x37\xe9\x3a\xd4\x1e\xa4\x8d\xee\x6f\x02\xa7\x56\x30\x5a\x41\x6e\x16\x82\xc8\x05\xaf\x76\x9e\xc6\xf9\xde\x96\x7b\x2b\x38\x93\x5a\xa6\x68\x13\xdb\xf6\x51\xfa\x0c\x3a\xa3\xb3\xd8\xfa\x0a\x1c\x4e\x99\x20\xa5\x55\x96\x6c\xc9\x8b\x05\xbe\x03\x4d\x41\xeb\x73\xa4\x4c\x31\x4d\x42\x9b\xe8\xf7\xc7\xbe\x87\x3e\xed\xee\xd5\x9e\xc0\x36\x23\xb9\x23\xe7\xa2\xc9\x73\x4b\xbf\xb9\x9a\x9c\xf5\x6e\x69\xf8\xe0\x2d\x1c\xe3\xb3\x05\x29\x6e\xaf\xd2\xaa\xb9\xee\x09\xb4\xa0\xe1\x62\x97\x8a\x81\x6e\x3e\x9b\x56\x30\xe1\x42\x21\xd6\xd6\x53\x22\x9c\x43\x61\x0e\xab\x48\xc4\x1d\x2d\xc8\x31\xba\x34\xbf\x73\xc1\x79\x57\x7d\x18\xb3\x39\x41\xaf\xf4\x81\xf8\xe3\xb7\xdf\xfe\xfe\xdb\x74\x19\x9d\x4e\xa4\x9a\x87\x44\xd5\x0e\x7c\x5f\xd4\xae\x6b\xd3\x9d\x4d\xce\x66\xdb\x53\x30\xea\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\x5e\x49\x49\x08\xda\x10\xae\xd0\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\x42\xdb\x38\xf6\x5a\x1f\x03\xdd\x30\x65\xf3\xe3\xba\x3c\x3a\x4e\x8b\x82\x3b\xb3\x7a\xad\xa4\x5c\x8f\x66\xe6\x91\xf2\x70\x7a\x52\x76\xee\x82\x47\xae\x97\xdf\xa1\x17\x71\xd5\xc4\xf4\x12\xbc\x21\x79\x32\xd1\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\xdc\xb8\xde\x5d\x26\xa9\x69\x90\xda\x29\x52\x7b\xc1\xd3\xea\xcd\xe7\x8e\xbb\x18\x51\x02\xb5\xd1\x18\x23\x85\x5e\xe8\x51\xaf\xb2\xad\xc3\x21\x5e\x4c\x8e\xd1\xdf\x78\x0b\x2a\x17\x9e\x56\x4b\x74\x8f\x0d\xa3\x41\x1c\xa5\x74\xf7\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x6f\x09\x2e\x4d\xad\x4a\x70\xed\xec\xfc\xac\x06\x7d\xca\xb6\x6c\x67\xad\x54\xbc\x46\x0b\x3b\x54\x33\x87\x5d\x41\x7f\xa3\x1b\x99\x23\x08\xb1\x1f\x89\x04\x69\x8c\xb5\x64\xff\xe6\xab\xb0\x85\xd6\xa4\x90\x99\xe7\xa0\x1a\x10\x46\x45\x38\x55\x56\xd1\x07\x17\x26\xb5\x32\x2a\xda\x25\xd6\x3d\x59\xaa\x8a\xa0\x4c\x95\x45\x10\x08\x29\x7d\x28\x93\x5f\x92\x1e\x84\xcc\x53\xa3\x44\x3f\x2c\x31\xbc\x66\x9e\xbc\x15\x12\x90\x0d\xb5\xd9\xcd\x65\x00\x38\xba\xa3\xa9\xac\x84\xc8\x39\x93\x7d\x01\x55\xcc\x38\xa3\x85\x09\x67\xa0\xb6\xe1\x0c\xf1\x56\x35\xad\x02\x57\x50\x81\x25\x19\xdf\x61\x41\xb5\x40\xd5\xed\x77\x7f\xd8\x32\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\x2b\x80\x91\x79\x85\xd7\x16\x27\x7d\x47\xa3\xbd\xf6\xc1\x20\x53\x43\x7c\x91\xcf\xac\xc3\x6a\x01\xc8\x3e\x88\x65\x39\x60\x28\x08\x4e\x6d\x36\xec\x41\xe2\x4d\x56\x2b\x36\x51\x24\x40\xbc\x9d\x8b\x15\x3b\x58\xf7\x70\x7d\x0e\x33\x61\x4d\x9e\xde\xac\xb6\xc3\x72\x2d\x60\x86\x2e\x4e\x2f\x4f\x7f\xb9\xfe\xf1\xec\x97\xcb\xd3\xf7\xe7\x29\xaf\x4e\xae\x1d\x9f\xb3\x7a\x7c\xb6\xfa\xf1\x4f\x50\x41\xde\x3d\xb2\x58\x90\xfd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xf5\x90\xd3\x58\xea\xd0\x8a\xd3\x54\x0b\x9e\x9d\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xbc\x26\x05\x67\xe5\xce\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x06\x9a\xac\x30\x66\xb9\x42\xb0\xb6\x78\xb5\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbf\xc8\x35\xda\x1b\xf7\x78\x43\x04\x05\x44\xd0\x3e\xec\x9a\xb7\xfc\xde\x56\x74\x3f\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\xd9\xd4\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x87\x45\xfa\xec\x75\xe4\xcb\xf6\xf1\xd3\xa1\xaf\x0e\xb6\xd4\x0f\x7f\xa5\xe0\x87\xd0\x8a\x18\x7f\x75\xec\xf3\xd4\x5e\x41\x7f\xbc\x28\xc2\xac\x74\x90\xb3\xaf\x6f\x9f\xa8\xa2\xb9\xe6\xc5\x6d\x26\xb7\xeb\xcd\xd9\xc4\xbc\x6d\x05\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xb7\x40\x01\x1d\x9c\xae\x7b\xe3\x74\x3d\x30\x69\x5d\xb8\xfa\x6e\x6b\x07\xea\xc1\x60\x6d\x75\x8f\x53\x7c\x44\xbf\x02\xca\x60\x6d\x3d\xf2\x0c\xd6\xd6\x16\x8f\x49\x22\x01\x30\xe8\x1b\x81\x0b\x32\xd9\x27\xe5\xcd\x09\x10\x54\xb6\xc2\x96\x95\xf3\x3a\x9c\x17\x17\x8c\x90\xd2\xc8\x0f\x3b\x14\x82\xe6\x7a\x24\x06\x1e\x0d\x3e\xc4\x0e\x58\xdc\x8a\x04\x35\xef\x66\x61\x5f\x6d\x55\x5c\x17\x64\xde\xd4\xbb\xce\x36\x69\x3c\x19\xba\xab\x1a\x62\x8f\x93\xee\x3c\x94\x5a\x27\x2c\xde\x9d\x8e\xc3\x15\x44\x92\xce\xf5\x74\xd9\xca\xd0\x06\x23\xec\x4b\xef\x75\x1d\xd1\xad\xce\xb8\x28\xe8\xb4\x5a\xa2\x05\xae\xb4\xb1\x74\x4f\xd5\x02\x61\x74\x4b\xab\xca\xbe\x26\x7e\xa2\xae\x89\xcd\xd5\x34\x1a\x4d\xc5\xd9\x1c\x26\x03\xdb\x9c\x8c\x87\x86\x14\xba\xcd\xa2\x22\x98\xb5\x8d\xe9\xa7\xd6\x8f\x96\xbc\xcd\x90\x96\xe1\x02\xdf\x5e\x9f\x62\xd4\xd2\x8f\x98\xc2\x6d\x1f\xdd\xf3\xfd\xe4\x5a\xf4\x41\x2d\x88\xb8\xa7\x92\x98\x42\x72\xd1\x7d\x32\x7d\xe9\x97\x91\x33\x9f\x79\x0a\x15\x9b\x39\xa8\xb7\x05\xa4\xb2\x46\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\xb9\x21\x6a\xb0\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xb3\x0d\xa4\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x4b\x74\x47\x71\x74\x4f\x80\x14\xa2\xdb\x51\xe8\x90\x71\xc4\x1b\x7d\x75\xb5\x8c\xaa\x25\x44\xf4\x16\xad\x42\x25\xbf\x67\x09\xf9\x56\x37\x16\xe6\x80\xd1\x94\x28\x6c\x7d\xe0\xfa\x10\x78\x4e\x74\xa0\x3b\xd7\x67\x0f\x92\x04\x6e\x36\x6e\x00\x4f\x93\x3e\xc7\x2a\x41\x4a\x6c\xd0\xe6\xcd\x7a\x7e\x7c\xdb\x51\x69\xe3\x75\x89\x3c\xcc\xfb\xc1\x6c\xa8\x4f\x34\x6f\xd5\x9e\xdc\x23\x8f\xb9\x8e\x0c\xc5\x45\x60\x24\xd2\x9a\x48\xc4\xdb\x4c\xf5\x26\x5e\xd9\xe6\x72\x5a\x78\x83\xdf\x69\xe3\x23\x55\x49\xa3\xaa\x0e\xe7\xd8\x62\x8f\x90\xf7\xdb\x3c\xdc\x80\xbf\x72\xda\xce\x66\x44\xc0\x4d\x07\x1d\x5e\x83\xdd\xfb\x3a\x5e\xee\x0e\x8b\x73\xde\x5a\xc0\x17\x51\x23\xa8\x1d\x60\xc9\x24\x1e\x69\xd2\x92\x6c\x42\x99\x5e\x41\x24\x70\xc1\x33\x74\xfe\xe1\xfb\xb8\x2d\x9a\xa3\xb2\x40\x5a\xca\x2a\x8c\xf3\x03\x8b\xc3\x24\xe6\xdd\x0f\x9b\x58\x5f\xec\xb6\x28\x2a\x2e\x6d\x7a\x34\xac\x4b\xb1\xc0\x8c\x11\xe7\x8c\xa2\x0a\x3c\xd9\x53\x42\x18\xe2\x0d\x31\xa0\xbc\xa8\xce\x60\x24\x29\x9b\x57\x04\x61\xa5\x70\xb1\x38\xd6\xbd\x63\x6e\x2f\x74\x79\xc8\xf6\x13\xa9\x04\xc1\xb5\xd9\x13\x82\xd4\x98\x9a\xe6\x11\x2e\x04\x97\x12\xd5\x6d\xa5\x68\xe3\x5f\x16\xe7\x45\x24\xc0\x08\x21\x4d\x5a\xaa\x5b\x2b\x48\x2b\xe9\x12\x9e\x47\x5d\x0f\xed\xf0\x79\x58\xac\x08\x5c\x67\x23\xfd\x5b\x52\x37\x6a\xe9\x13\x13\xe3\x6c\xa0\x19\x15\x52\xa1\xa2\xa2\x84\x29\x3b\x32\x43\x39\x08\x7d\x18\x39\x75\x9a\xd9\x19\x91\x76\x4a\x58\x09\xc6\x77\xa3\xa4\xc9\xbf\xf3\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x19\x97\xfd\x87\x5d\x65\x1a\xb3\x71\xdc\x8c\xc0\xd6\x71\x0a\x8e\xe9\x91\xfd\x28\xe8\x42\x50\x67\xbb\xcb\x9d\x4c\x93\x2b\x50\x3e\xc6\x9d\xeb\x51\x8f\x73\xa0\xb3\x2d\x20\x15\x66\x4d\xea\xc0\x86\x62\xe4\x4e\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xd9\x65\x4c\xa0\xcb\xbd\x27\x52\xe2\x39\x99\x44\xc2\x11\x72\x08\x9c\xce\xd1\x06\x38\x86\x6e\xdb\x2c\x88\x21\xba\x52\x3c\xf8\x24\x4c\xf2\x0a\x8d\xc7\xda\x0c\x24\xaa\x07\xce\x68\xba\x17\x54\x29\x02\xbb\x14\x2a\x39\x01\x00\x6d\x95\xbc\xb3\x9f\x5c\x16\xd5\x9e\x9d\xf4\xb0\x3d\xad\x7e\xb0\xd2\xa4\x69\x4d\x09\x9a\x0a\x4a\x66\x68\x46\x21\x6f\x0c\x32\xaa\x46\xa6\x0a\x01\x06\xdc\x2e\x96\x92\x08\x18\xb6\x75\x0b\xb8\xe1\xc7\xf5\xe7\xaf\x76\xfc\x4a\xb4\xac\xc0\x41\x89\x4e\xe0\x16\xa3\x33\x34\x87\x2c\x2e\x6b\x04\xff\xe1\xe5\x7f\xfe\x11\x4d\x97\x5a\x5f\x03\x43\x4c\x71\x85\x2b\xd7\x01\x54\x11\x36\xd7\xab\x08\x22\x37\x4e\x6e\xf4\xf8\xa9\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x47\x0f\xe4\xe3\x49\x49\xee\x4e\x82\x2d\x34\xae\xf8\x3c\xee\xad\x67\x39\xb2\x89\x93\xfc\x6c\x1b\x4e\x34\xaf\x68\xb1\xdc\xd5\x99\x76\xc5\x4b\xd0\x82\xdf\x1b\x67\xce\xfa\x51\x0d\xa8\x5e\x1a\xde\xb4\x15\x4c\x1c\xfa\xde\xf3\xf3\xb5\x92\xac\x52\x1f\xa5\x3a\x09\x03\x69\x07\x41\x54\xdb\xec\xca\x9d\x63\x53\x18\x5d\x37\xb9\x25\x9e\xb0\x31\x37\x5f\x87\x24\xda\x1b\xf7\x3d\xae\xaa\x29\x2e\x6e\x6f\xf8\x3b\x3e\x97\x1f\xd8\xb9\x10\x5c\xf4\xc7\x5c\x61\x7d\xa7\x2f\x5a\x76\x0b\x55\x74\x3b\x32\x5a\x3e\xb7\x98\x42\xc7\x1f\x10\x8c\x2e\xaa\x33\x6e\x94\x86\x1e\xd4\xa9\x24\xce\x07\xd7\xb5\x4c\x1e\x68\xe7\x68\x63\x88\xe8\x3e\xc7\x26\xe0\x93\xde\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\x29\xc7\x72\x64\x2e\x00\xb8\x81\xb5\xaa\x55\xe3\xaa\x8a\x8d\x12\x84\x22\xe0\xfb\xe8\xe2\xd4\x7b\x70\xe4\xd5\xce\x4e\xf7\x67\x9b\x8c\x37\x37\x7f\x03\x7b\x91\x2a\x49\xaa\xd9\xc8\xb0\xbd\x78\xb7\xd6\x01\x68\x57\x07\xf6\xca\x8b\x67\x0a\xda\xbd\xd1\x76\xc7\xab\xb6\x26\xaf\xc9\x1d\x2d\xe2\x02\x98\xbd\x55\xe9\xbd\xcd\xb9\xe9\x2b\x2a\x81\x04\x68\x5a\xf1\xe2\x16\x95\xf6\x97\x01\x54\x7e\xb5\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x3a\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xdf\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\xc7\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\xbf\x0d\xdf\xc2\x1a\x33\x96\xa7\x1c\xf2\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\xef\xbe\xcc\x10\x0c\x4d\xcb\x91\xe8\xcd\x0b\xf3\x41\xe8\x1a\x2b\x6b\x1f\xb9\x28\x3b\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xbb\x9a\x84\x75\x44\x7d\x8d\x9b\xf1\x2d\x59\x46\x6e\xb8\xc4\xe3\xf2\x18\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc2\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x27\x31\x63\x33\xea\x40\xbb\xbe\x72\x7e\xec\x16\xae\x7f\xe3\xe8\x4f\xfc\x95\x63\xbe\xf5\x35\x5d\x34\x30\xbe\x2f\xf5\x9e\xf1\x9d\xcf\x24\x4e\x93\x90\x4e\x70\x3b\xd9\x9d\xd1\xbf\x8e\x7a\x0e\x2d\x73\x32\x03\xd3\xd7\x3a\x9a\x8e\x4d\x51\x80\x84\x0e\xe8\xa3\x68\x1b\x45\x07\xdf\x1d\xec\xf4\x8e\x33\x2b\x23\x78\x83\xe7\x60\x99\xee\xc3\x02\xad\xf6\x29\xe4\xa0\x5d\xf0\x7b\xf3\x7b\x83\x2e\x69\xec\xb7\x48\xd9\x11\x99\x2f\x78\xd2\xea\x18\xe4\xa0\xdb\x11\xd6\xba\x36\x5c\x85\xf7\x78\x89\xb0\xe0\x2d\x4b\x4a\x83\x86\xc0\x88\x0f\x9c\xbd\x5f\x19\xec\x25\x67\xc4\x05\xe9\x53\x5a\xb9\xe9\x38\xcc\xa9\x34\x78\x05\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x7a\x47\xae\x6c\x8d\xf3\x20\xa8\x72\x31\x9b\x70\x29\xe9\xb4\x82\xc4\x2d\xc5\xd1\xb9\x29\x00\xbf\x3e\x50\x0f\x1c\x81\x11\x73\x11\xb2\x95\x26\xf4\xf0\xd0\x9c\xe0\x10\xf0\xa9\x1b\x48\x40\x7d\xec\x97\x26\x09\xeb\xba\xa2\x49\x5e\x7a\x4d\xd2\xdc\x7b\x3b\x1d\xab\x2b\x7c\xbf\x0f\x92\xe4\xbd\x8d\x0d\x74\x95\xed\xa9\xab\x9c\x0c\x1f\xdd\x0b\xaa\xec\xe1\xbe\xa7\x92\xa0\x43\xf0\x4a\xac\x6c\xc6\x24\x82\xe6\xd0\x87\x95\x58\x01\x3f\x07\xc1\xb2\x58\x3d\xba\xfb\xb0\x4a\xeb\xf2\xa4\x43\xe0\xdf\x5b\x07\x56\xb7\x82\x56\xfa\x77\xf7\xf2\x02\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x65\x12\x17\xce\xc5\x0c\x85\x22\xd1\xc6\x2f\x83\x6a\x12\x0b\x2c\x11\xe3\xa8\x26\x18\x00\x9a\xfa\x76\x71\x52\xb0\xc7\xd5\x9c\xaf\x0f\x66\xb3\x9b\x6b\x2c\xbc\x10\xac\xb8\x7e\x4d\xa5\x15\xcf\x5a\x8e\x58\x0b\xc4\xc0\x3a\x6a\x5c\xa6\xa4\x76\x07\x73\xda\x2d\xde\x71\x07\x9a\x5c\xed\x49\x77\x71\xac\xf4\xe5\x29\xfa\x31\xb2\x25\xc8\x75\xf3\x2d\xe0\x04\x37\xb8\xe5\x3a\x90\x4c\x52\x34\xdb\x3c\xab\xc3\xf5\xd7\xe2\xda\x58\x37\xf7\xd8\x77\x38\xa1\x0f\x9f\x1e\xea\x28\x90\x85\x0e\x23\x6a\x42\xea\xb6\x06\x8a\xcd\x78\x4c\x63\xf2\x76\x41\x09\xef\xee\x99\x13\x46\x04\xb6\x71\x05\x07\x11\xb5\xe4\x2b\x58\x72\x96\x7a\x20\x3e\xb1\xe1\xb4\xbc\xff\xb4\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x72\xda\x6d\xc4\x64\x93\xc6\x92\x73\xd4\x2b\xd4\x5c\x66\xf3\x07\x9c\x9f\x7a\x51\xfe\xd9\xd2\x3b\x5c\x11\xc3\x61\xef\x44\xc3\x4e\x95\x09\xd9\x4e\xf7\xd5\x6c\xb4\xf6\x21\x98\x1d\x9b\x41\x0f\x8f\x5a\x90\x99\xf4\x89\x17\x2f\xd0\xa1\x69\xe3\xc0\x90\xec\xee\x56\xc9\xb5\x6b\x75\xfe\xd0\x24\x54\x6e\xcd\xb7\x5e\xe7\x0f\x0d\x06\x9c\x46\xb3\x17\x0b\xf7\xdf\x64\x81\xef\x08\x70\x1a\xd3\x0a\x8b\x0a\x40\xe9\xd7\x66\xca\xd0\xb4\x55\x88\xb0\x3b\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xdb\xc3\x1f\x4f\xaf\x20\x69\xe9\xc8\xb2\xe5\xdb\xf1\xb5\x12\xf8\x01\x56\xc6\x10\xbc\x6e\x1f\xf7\x1b\x72\x63\xd7\xdb\x05\xf4\x13\x37\x17\x7a\x6c\x75\xab\x5a\x5c\x01\xf5\x73\x51\xb5\xfa\x2e\xdc\xd9\xce\xce\xef\x03\x4f\xf1\xe4\xe5\x74\x81\x5b\xe2\xef\xd7\x34\xea\xb8\xe6\x38\xa8\x67\xc1\x7e\x5d\xa3\x21\x8f\xae\xf1\xb0\x81\x84\x72\x4d\xd1\x39\x90\x9e\x98\x32\xcc\xc3\xb1\x77\x71\x1c\x3c\x03\x4a\x27\x98\xe4\x6f\x57\x93\x74\xcd\xc3\x08\x35\x5a\x76\xee\xc3\x8f\x38\x0c\xf9\x8e\x41\x84\x23\x3a\xcf\xae\x67\xbc\x24\xdb\x57\x15\x4a\xdb\xe7\x97\xb6\xcd\x20\xf1\x89\x32\x7b\xeb\x98\xd2\xb9\x50\x90\xc4\xe4\xf8\xc9\x62\x41\xca\x36\x42\xe5\xba\x98\x19\x30\xd0\xa8\xf7\x3a\x8c\x0a\xcc\x4a\xaa\xf7\x8a\x49\x05\x30\xaf\xd7\x87\xcc\xea\xff\xae\x41\x11\xd6\x2c\xf5\x1f\x5e\x46\x30\xaf\x01\xc4\x7a\x4d\xdd\x1e\x85\x55\x7b\x2d\x61\x02\xa8\xa4\x25\x41\x53\x52\xf0\x9a\x00\x76\xb8\xe1\xcc\xe8\xe3\x8e\x52\xc1\x27\x90\x98\xc8\xb1\x19\xda\xb6\x5d\x0a\x1c\xa1\xf6\x42\x77\xc7\x48\x7a\xae\x7d\x01\x68\x31\xbd\xd6\x54\x74\xcd\xeb\x79\x34\xb0\x0d\xbf\x32\x88\x33\x84\xbb\xa2\x9d\x7a\x04\xdb\xf6\xe7\x73\x92\x69\xba\xa5\x1a\x93\x3b\x0a\xf4\x03\x27\x58\x4a\x3a\x67\xe3\x86\x97\x63\xdd\xec\xc9\x6f\xf4\x7f\xb7\x3e\x4a\x91\x02\x40\xb7\x75\x4d\x2a\x90\xcc\xcf\x7d\x7e\x5c\xbb\x66\x4f\x4b\xf7\x93\x39\x44\xce\x3a\x83\xfc\x82\x95\x85\x9b\x51\x65\xd6\x2b\x66\x99\xae\x37\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4a\x2a\xf9\xa9\xed\x02\x18\x87\x98\x1e\x6c\x99\x80\xe5\xae\x1d\xbc\x71\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x49\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x65\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xe1\x7a\x0d\x24\x23\x03\x20\xc8\xd6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xed\x2f\x21\x3b\x82\x55\x4f\x0b\x14\xc8\x35\x77\xc0\x8c\x57\x15\xbf\x07\xfe\x1b\xd3\x87\xc0\xfd\xb9\x3d\x8f\xcb\x58\xae\x54\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x51\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x26\x67\xf1\x7f\xfc\x83\x24\x62\x5b\xaf\xa2\xfd\x73\x41\x24\x6f\x45\xb1\x75\x3e\xa7\xfd\xf3\xd5\xd5\xc3\x4d\x73\x2a\x6a\x2e\x26\xa6\x86\x78\x9e\x97\x4a\xf2\x4e\x6f\x3f\xb7\x25\x32\xbd\x13\x8a\xd4\x67\xed\xe7\x4c\xbe\x11\xbc\xdd\xd6\x8a\xfb\xf8\xcb\xce\x16\x98\xb9\xfc\x82\x4c\x23\x5f\xca\x42\x55\xb1\xd3\xb8\xc0\x82\xd8\xda\xa4\x5a\xb9\x94\x0d\x2e\x32\xcd\x9e\x2f\x1b\x9a\xf1\x75\x19\xd7\x43\xb6\x4d\x53\x91\x9a\x30\x85\x2b\x78\x6d\xae\x8d\xb8\xf6\xde\x94\xc5\xee\xae\x9c\x9f\xfe\xe3\xe7\xa7\x39\x9d\x1f\x6f\x22\xc7\x59\xfd\x54\x0b\xe9\x27\xf7\xe3\x2d\x14\xb8\xc1\x53\x5a\x51\xad\xfa\x3c\xc5\xfb\x5d\x78\xfd\x8a\x73\xf5\xbd\x87\x05\x3e\x45\x4b\x8d\xa0\x77\xb4\x22\xf3\xad\x43\xab\x9f\xb7\x9d\xf4\x45\x3a\x71\x4d\x9c\xcb\x02\x57\x31\xa9\x31\x9f\x39\x12\x5e\x40\x5c\xe7\x49\x16\x24\x4d\xf4\x7c\xc6\xcb\xb7\x17\x44\xd1\x0a\x7c\x2c\x4e\x31\xc2\xa9\x13\x8f\x2a\x8c\x43\xd3\xa4\x3b\x2c\x1f\xab\x2e\x6f\xcb\x9c\xb2\x39\xea\xd5\x31\x6c\x85\x20\x4c\x55\xcb\x20\xee\x0a\xbc\x1c\x46\xf1\x06\xa5\x18\xf4\x72\xab\x5c\xc6\xb8\xf3\x4e\xbd\xbd\x65\x29\x3f\x6a\xbc\xd4\xda\x68\xe0\xce\x99\xb5\xc0\x35\x03\x06\x80\xa9\x38\x0b\x70\xab\x28\xe2\xb2\x0d\x85\x86\x78\x43\x58\xb7\x85\x4f\xac\x7b\x75\xac\xb7\x76\xaf\xf4\x90\xb1\x4e\x8f\xeb\xf2\x37\x4d\x85\xd5\x8c\x8b\x7a\xec\xbc\x28\xe3\x9e\xe5\x1a\xd1\xad\x33\x48\x83\xf7\x90\x10\x43\xfb\x64\xaa\xb3\xb3\xb2\x22\x81\x55\xea\x17\x80\x95\x26\xf6\x89\x5a\x26\x48\xc1\xe7\x0c\x0a\x01\xd8\xdf\x82\xbd\xe5\x9d\x46\x58\x6a\x8b\x10\xb1\xb6\xaa\xb6\xee\x5b\xa4\x2d\xcb\xef\x88\x58\x10\xbc\xe5\x29\x4c\xdb\xe0\x1f\x6c\x9b\x48\x90\x46\x10\x09\x13\x6a\x22\xf0\x46\xc7\xf7\x9d\x42\x58\x4a\x5e\x00\xa9\xb1\xc9\x31\x74\x74\x63\x18\x2c\xcd\x19\x17\x08\xa3\x39\xbd\x23\x0c\x5d\x99\xdd\x70\x56\xe1\xed\x69\xb6\x02\xb7\x9d\xf3\xd0\xe3\x56\x71\x9f\x7f\x8a\xb0\x42\xb8\xac\x29\x90\x3c\x18\xe2\x02\xeb\xd5\x0c\x5b\x0d\xbe\xa2\x77\xa9\xe0\x90\x8d\x88\x2e\xb6\xcd\x4f\xfd\xac\xf7\x42\x52\xa6\xc3\x11\xf8\xe9\x02\x0b\xd1\xe1\x27\x7c\xed\x74\x54\x40\xe8\xdd\x55\x97\x89\x98\x9e\xcf\xe9\x90\xe5\xd7\xd0\xd7\xc0\xa6\x46\xad\x6f\x6b\x81\xef\x0c\xda\xa2\x5b\xe2\x4a\xab\x19\xdb\xaa\x91\x92\x98\x1a\xf0\xbd\x7e\x99\xbc\x43\x17\x10\x01\x3e\x5a\xf0\xac\x75\xd1\x91\x09\x2f\xaf\x1b\x52\x8c\xba\x2d\xe8\x16\xdc\x11\x75\x38\x0e\xb1\x2d\xfb\x13\x48\x41\xe3\x51\x11\xc6\xc9\x5c\xea\xdd\x1a\x76\x32\x84\xbd\x50\xd5\x63\x25\x01\xbb\xbe\x93\x17\x06\x2b\xf1\x2f\x22\xb6\xce\x4c\xda\xe0\xcd\x9b\x53\x75\x7c\xfb\x27\x70\xe5\x11\xb6\xc0\xac\x00\x4d\x5e\x9e\xdc\x92\x46\x9e\x48\x3a\x37\x9e\xbb\x3f\xfe\xe9\x4f\xe0\xc6\x73\x8b\x73\x72\x75\x7e\xfa\xfa\xfd\xf9\x71\xbd\x9d\x5a\xb6\x53\x9f\x5e\x83\x95\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\x5b\x76\x34\x92\xd3\x33\x95\xc7\x33\x89\xbb\x33\x23\x5f\x67\x23\x08\xa9\xe1\x06\x89\x21\x25\x48\xbb\x80\x26\x2b\x6d\x3b\x4d\xcb\xfe\xa4\xef\x15\xd7\x3d\x36\xd7\x57\x8d\x34\xd7\x4f\xc5\xef\x81\x18\x86\x72\xad\x38\x6f\x1f\xb0\x02\x35\xee\x92\xdc\x11\x31\x72\x7d\x78\xa7\x5f\x39\x89\x7c\x63\x88\x98\xd8\xf4\xbe\x48\xe6\xbd\xc8\x0d\xe2\xe6\xe5\x39\x57\xf2\x06\x88\xee\xec\x68\x41\x70\x1f\xa3\x1f\xb1\xa0\xbc\x95\x56\x43\x46\xda\x08\xe7\x0c\x94\x0c\x43\xa4\xe0\x2f\x7b\x88\xdb\x98\xac\x8b\x6d\x85\x8c\x6b\xd2\x33\x17\x97\x96\x85\xca\x4f\xfd\xa9\xbf\x24\xcf\x36\xdf\xda\x74\x5b\x13\xb1\x11\xe4\xce\x0d\x43\x38\x2a\x22\xa2\x4c\xc9\x0e\x3f\x2a\x63\x11\x6c\xbc\xa2\x9d\x42\xb3\xad\xb3\x20\x98\x32\x68\xd4\x8d\x11\x2e\xb4\x98\xd0\x2d\x14\x77\xa2\x73\x47\x28\x06\xeb\x66\x9c\xf6\xc1\xa7\x71\xc7\x2c\x5e\x38\xc6\xb2\xf5\x35\xab\xb3\xf1\x9c\xfb\xff\x62\xd6\x43\x5a\xfa\xc8\x7f\xc7\x0c\xeb\xa7\x11\xbd\x30\x07\x02\xae\xfa\x71\x21\xa8\xa2\x05\xae\x5e\x44\x00\x6c\xdd\x8b\x8a\xaa\xd5\x06\x57\xf8\x2e\x41\x90\xba\xe7\xa6\x4f\xb8\x42\xb7\x64\x79\xcf\x45\xe9\xb4\xbf\x10\x6f\xbb\x6d\x28\x5b\x6f\x0c\xa9\xdc\x70\x00\xaf\xaf\x45\xb2\x89\xf4\x88\x9a\x08\x34\x25\x0e\x9c\xb6\xf2\xe5\xe5\x31\x3a\x65\x4b\xa3\x78\x45\xd8\xff\x3e\xf0\x12\xd4\x92\x05\xed\xd6\x58\x22\xbd\xd3\x60\xb5\x1e\xd7\x37\xac\xa2\x8a\xca\x6d\x46\x16\x69\x93\xc7\x0b\x1e\xa7\xb7\x3a\x68\x11\x17\x96\xf5\x16\x04\x92\x30\x1c\xc1\xdb\x42\x88\xed\xcb\x9e\xe5\xb6\xd0\x5a\x3f\x65\x44\xca\x37\x7a\xc3\xee\xee\xcc\x60\x50\xc0\x6d\x5f\x80\x27\xb7\x63\x97\x22\x5a\x32\x99\x8c\x3f\xad\x12\xf0\xb2\xfb\xe6\xb6\x4b\x7a\xea\xa0\x32\x60\xed\x18\x06\x6b\xdd\x34\x55\x32\x8c\xbf\x9a\x38\xa9\xfe\xc6\xe9\xe5\xb6\x51\x3a\x4b\x91\x65\x54\x68\xd9\x8d\xb1\xab\x2e\xda\x1f\x25\xd8\x62\x96\xd6\x88\xfc\xb3\xc5\x15\x00\x2f\x6f\x44\x4b\xb6\x2d\x4c\x1c\x65\x70\x10\x75\xcf\xc5\xed\xc9\xb7\x7f\x7a\x09\x36\x87\xef\xdd\x78\xbe\xf5\x15\x15\x9b\x2e\x1e\x95\x28\xbe\x52\x3b\xbd\xbc\x0a\x37\xb2\x5b\x4b\xe7\xd0\xb0\x90\x5a\x53\xd0\x43\xef\x00\xbf\x40\x51\x50\x85\xa8\xb4\xf0\xf8\x84\xf0\x71\xd7\xdd\x9b\x65\xb3\xbd\x92\x14\x9f\xcb\xdd\x6b\x37\x19\x33\x7a\x16\xbe\xcd\xac\x8a\x34\x4b\xe2\xdb\x09\x90\x0f\x07\x32\xf8\x18\x18\x76\x40\x9a\x03\x22\x07\x6e\x98\x65\x93\xc0\x26\x94\x05\x10\x19\x09\x37\x71\x0e\x36\x20\xfd\x78\x56\x99\x7b\xd5\x6b\xd9\xde\xa4\x4e\x2d\x58\xf9\xa5\x2f\xa0\x61\x29\xa3\xb6\x55\x4f\x0c\x89\x28\xd4\xb8\xf4\x05\xd3\xac\xf3\x07\x70\x5d\x95\x36\xe3\x4a\x43\x86\x8a\x85\x32\x0a\x73\x2c\xbe\xa0\xa3\x91\x29\x09\xc2\x77\x98\x56\x00\xa6\x07\x57\x12\x97\x3d\x6c\x8d\x19\x6c\xc1\x99\x6c\x6b\xe8\xd1\xb6\xa1\xb4\xe9\xd2\x6a\x13\x31\xfe\x4d\x6a\x38\x22\xab\x66\xf1\x71\x36\xf9\xed\x55\xb3\xd7\x4b\x86\x6b\x5a\xb8\x55\x3c\x35\xcb\x06\x3c\x94\x3d\xf6\xf9\x78\xaf\xac\xee\x7e\x5d\xb7\x4a\x4f\x6d\x8c\x72\xb2\x8b\x9b\x21\x22\xec\x03\x97\x49\x70\x14\xc2\x94\x0c\xf2\x80\x0b\x55\x2d\x21\xa2\xd2\xfb\xd2\x08\x11\x0a\x69\xab\x06\xcd\x5e\x6d\x4f\x98\xc2\x85\xdd\x59\x46\x9f\xed\xbd\xfd\x86\xd4\x0d\x90\x21\x5a\x05\x5e\x1a\xd6\x60\xd5\x0a\xe6\x78\x50\x57\xfe\x62\xeb\xe6\x03\x4c\x63\x44\x1a\xda\x85\x42\xb8\x2c\x25\xc2\xbe\x16\x13\x55\x46\xf1\x6e\x19\xfd\x67\x4b\xaa\x25\xa2\x25\x61\xaa\xc3\xbd\xf5\xa7\xd8\xd2\x45\x59\xf9\xb0\xbd\x58\x3f\xeb\xce\xb7\x51\xf7\x09\x29\x5d\x01\x23\xeb\x4f\x7e\x64\x4d\x8d\xfb\x17\xcc\x04\xad\xab\x47\x98\x09\x3b\xd2\x09\x22\xc8\x5d\x52\x54\x81\x58\x42\x83\x1c\x59\x23\x10\x86\xdd\xbc\x91\x0c\x07\xb5\x89\x57\x15\xab\x5b\x29\x02\x3f\x69\x9e\x8e\x72\x41\x5f\x80\xe8\xf5\xe5\xf5\x2f\xef\x4e\xff\xfb\xfc\xdd\xb3\x13\x49\xf6\x54\x85\xed\xbd\x1a\xe6\xc9\xb1\x04\x57\xab\x1d\x59\x0d\x8b\xaf\xc8\x1f\x67\x81\x5b\x7d\x4e\xc6\x32\x11\x31\x87\x1a\x33\xd5\xd7\x5d\x42\x40\xd4\xbb\xce\x03\xe1\xcd\x67\x1b\x86\xa4\xaf\xe2\x8d\x72\xd7\x57\x14\x8b\x6a\xd7\xc4\xb5\x76\xbb\x77\xc2\x91\xec\xc5\x1e\xea\x4d\xed\xc7\xf7\x92\xfb\x6a\x54\xa3\xeb\xfb\x30\xeb\x9e\x02\x92\x6d\x7f\x3b\x07\x89\x65\xc0\x2a\x64\x82\xaf\x18\x31\x72\xbf\xaa\x2e\x98\x9b\x5c\xff\x45\xec\x9e\x9a\xf2\x96\x95\xe6\x76\xb3\x43\x30\xbe\xef\x30\x23\xa8\x24\x15\x51\xce\x73\x95\xa6\x20\x20\xa7\x66\x03\x51\x2c\xf8\xbc\xe0\xdd\x46\x71\x87\x7a\x69\xee\x0c\x79\x89\xac\x3f\x19\x21\x5c\x71\x36\xb7\xec\xc4\x51\xcd\x76\x6c\x01\x3e\x8a\x30\x5a\x9b\x6c\x28\xb9\x8b\xed\x35\x61\xfa\x62\x75\x9a\xf4\xcd\x1a\x2e\x97\x6e\x53\x90\x82\x8b\xd2\xf8\x74\xf4\xc4\x1b\xf7\xcd\x71\xef\xc4\x5d\xc3\x67\x44\x46\x6f\xac\x8d\x7a\x37\xcc\x2f\xe3\x50\xd4\x63\x1e\xf8\xc8\xc0\xf0\x31\x9a\x4e\x54\x73\x2b\xa1\xf2\x9e\x28\x0f\xb8\x23\x04\xaf\x50\x53\x61\x46\x6c\x35\x11\xef\x80\xcd\x32\xcd\x83\x5c\xff\xd4\xf3\x15\x24\x65\x7a\x13\x7f\x17\x8e\x0f\x4f\xd9\x6c\x0a\x23\x60\xc3\xc3\xc2\x67\xe8\x6c\xf2\x03\x6c\x93\xf7\xa4\xe6\x62\xd9\x75\xd2\xab\xe8\xfa\x14\xe0\xad\x85\xf5\xe6\x9c\x1e\x6d\x2e\x59\x88\xa0\x73\x10\x2f\xcd\xb1\xb3\x28\x1d\xdd\x93\x77\xb4\xa6\x0a\x72\xcd\xb6\x8d\x0b\x15\x4d\xfb\x62\x84\x5e\xd4\x30\x14\x88\x2c\xa1\x17\x8b\x76\x4e\x1a\x3c\x27\x72\xfc\xa2\x2f\x9e\x25\x32\x34\x3d\x2b\xde\x1f\x2c\x88\x09\x7e\x38\x24\x63\x8a\xe3\xc0\x04\x5b\xf5\x4f\x8c\x8c\xe7\x02\x43\xf8\xc6\x89\x13\x6e\x4a\xb7\xd8\x2e\xe1\xc0\x6d\x11\x25\xbd\xb5\x6d\x20\x60\x9a\x47\xc6\xc7\xa4\x27\xd6\xbf\x5e\x2e\xb0\x00\xfb\xba\xd6\x57\x52\x7f\x75\x70\x94\x1a\xb0\xad\x57\x47\xdb\xb7\xef\xc8\x1d\xa9\xba\x2d\x69\xfd\x33\x5b\x36\xbc\x7d\x2d\xc1\x68\x43\x35\xde\x6e\x2c\x22\x5c\x9c\x28\x8b\xba\x69\xf7\xb1\x16\x53\x9d\x72\x29\xf5\x51\xf7\x67\x7b\xd4\x4b\x82\x0e\xd3\x9b\xcc\x1f\xc7\x94\x56\x02\xef\x83\x3e\x3c\x1d\xef\x7b\xc8\xc3\x1f\x75\xc3\x05\x27\xa9\x24\x0d\x61\xa5\x2b\xca\x1c\xf1\xae\x27\xf2\x12\xa2\x8f\x78\x0a\xb5\xb4\x2b\x30\x03\x39\xe3\x30\x7e\xfa\x6c\x77\xa7\x6f\xfb\x2b\x34\x85\x99\x38\x9a\x97\xb8\xb7\x29\x1f\x75\x11\x6a\x2d\x84\x30\x25\x96\x16\xf7\x79\xad\x37\x56\x5f\xba\xc6\xab\x0c\xd1\x84\xc4\x69\x74\xc4\xd1\x54\xc2\xa9\x44\xc2\x29\x34\x9a\xd9\x6a\x7c\x7e\x84\xc9\xbd\xb7\xd8\x60\x09\xac\x8b\x91\xd8\xda\x38\xc8\xa2\x90\x27\xbc\x44\xf7\x00\x26\xe8\xd3\x2c\x98\x32\xc2\x17\xba\x5b\xb7\x5d\x79\x34\x77\x8f\xba\x18\x48\x74\xd3\xd6\x8f\x96\xcc\xa4\x9d\x81\x69\xca\xa2\x97\x77\xbd\x11\xac\x7a\xd6\xf3\x56\x14\x0b\x2e\x09\xb3\x18\x78\xe1\xbe\xc0\xfa\x71\xe7\xd2\xdc\x83\x49\x75\xa7\x2d\xdd\x07\xb9\x23\x62\xa9\x20\x00\xea\xe9\x8f\xad\xdf\x53\xae\x44\xbf\x02\x8c\x73\x74\xc3\x20\xb3\x6d\x52\x00\xe0\x5b\x66\xce\xe7\x0a\x23\xdd\xc9\x8e\xc8\xcb\xcf\x14\x29\xda\xf2\xd1\x32\x41\x81\xa5\x9d\xa8\x48\xd6\xc2\xe8\x38\xf5\x81\x99\x12\x3f\x40\x41\xe1\xce\x34\x2a\x78\xdd\xb4\x2a\x88\xcd\xba\xd8\x6d\xcc\xea\x27\x51\x5c\xd4\x98\xe1\x39\x19\xfb\x8e\x8c\x83\x3c\xa4\x48\x15\x22\xf2\x42\xcd\x01\x91\x47\x5f\x12\x4c\x1e\xc5\x43\xe5\x51\x06\xb8\x3c\x4a\x85\xcc\xa3\xbc\xb0\x79\xd4\xdd\x4a\x3b\x39\xba\xde\x53\xb0\x72\x78\x6d\x35\xf0\x8f\x1d\x5e\xa7\x09\xc6\x9c\x5e\xa0\x1a\xb6\x2d\x53\x89\x78\x4d\x95\x83\xe5\x05\x7a\x02\x70\x8d\x86\xe4\xa6\x56\xd0\x00\x28\x12\xc3\xfd\x49\x1e\xfe\x7f\xf6\xfe\x86\xbb\x8d\xdb\xda\x17\x87\xbf\x0a\x96\x72\xd7\xb2\x94\x92\xb4\x9d\xa4\x2f\xc7\xb7\x4f\xbb\x14\x49\x6e\x75\x13\xdb\x3a\x96\x92\xac\x3e\x4d\xef\x09\x38\x03\x92\x38\x9a\x01\x26\x00\x46\x32\x7b\x7b\xbe\xfb\x7f\x61\x6f\x00\x83\x21\x29\xd9\xc2\x40\x22\xe5\x6a\xba\x56\x63\x91\xc3\xc1\x1e\x60\x63\x63\xbf\xfe\x76\x53\xf1\x82\x9b\x08\xf9\xb9\x4c\x31\xb7\x22\xf0\x5a\x69\x4d\x70\x5e\xfb\xea\x78\xe8\x1a\xe9\xed\x3b\x97\x92\x1e\x68\x2f\x10\x59\x8d\x7d\x28\x18\xf3\x9e\x96\x27\x69\xf6\x24\xcd\x3e\xf1\xfa\xdc\xa4\x99\xeb\xe2\xfc\xf0\x15\x40\xef\x71\x60\xd2\x74\x15\x3f\x6b\x1d\x66\x03\x8a\x6b\x42\x34\xdf\xd5\xfa\x1c\x42\x0f\xfa\x11\x79\x27\x5e\x63\x6f\xd0\x11\x96\xff\x4c\xc8\xa9\x20\x5a\xd6\xae\x8f\xe9\x07\xa3\x47\xa8\xf1\x52\xa2\xdb\xa9\x66\x4e\xdf\x95\x9a\xf9\x42\x61\x57\x6d\xdd\x30\x85\xa2\x2f\xb1\x54\xc8\x4a\x2b\x24\xea\x9e\x21\xc2\xae\xa5\xba\xac\x24\x2d\xf5\xf3\x46\xe2\xff\x8d\x03\xc4\xde\xf3\x2f\xdc\xba\x8f\x9b\xbb\x43\x88\xa4\xa6\x9b\x47\x35\x98\x0f\x5d\xa4\xf1\x7e\x65\xec\x5e\x06\x6a\xaf\x82\xb5\x1f\x33\x06\x24\x37\x4c\xa2\x26\x73\x25\xdb\xc6\x47\x03\x3b\xb4\x60\x6b\x8a\xdf\x35\x6b\x48\xda\xc9\x88\x62\xb7\x58\x6e\xd0\x27\x24\x98\xf3\xe0\x79\x60\x9d\xdd\x09\x16\xa5\xd6\xa3\x8d\x98\xed\xaa\x15\x09\xa5\x0e\x58\xf7\x2a\x55\x07\x2c\xc9\xc8\x5e\xc5\xe6\xb4\x58\xee\xf5\xa9\xda\x80\x9f\xea\x3c\xe0\xf6\xf8\xb5\xc7\x3a\x52\xe7\x1b\xd2\xde\xd5\x83\x0f\x5d\x6e\xe1\xe8\xc6\xe4\x5f\xcc\x23\xd3\xee\xf5\x7d\xa9\x85\x63\x25\x57\xf2\x7f\x67\xe7\x44\x72\x75\xee\x6f\xff\xf0\xdb\xb1\x07\x3d\x80\xd7\x7c\x88\x7d\xd3\x83\xe8\xdc\x5e\x95\x46\x8f\xdb\xa6\x8c\x94\x5c\x37\xc0\x99\xe0\xea\xee\x4a\x1d\x02\xb9\xf9\x4a\x6e\x36\x0f\xe9\x99\x21\x71\xc0\x61\xab\xc1\xc5\xfc\xc1\xab\x66\xce\xfb\x43\xbb\x7d\x27\x1b\xfa\x6b\xdb\xf5\xa1\x75\x87\x15\x2a\xdb\xd1\x02\xba\x49\x84\xc6\xac\x11\x36\x6c\xe2\xe1\x6a\x59\x63\x9d\x1a\xd0\xab\x3b\x09\x12\x96\x4e\x1b\xba\xf4\x12\xb5\xff\x12\x25\x54\xbf\x30\xdf\x79\xeb\x8e\x54\x74\x88\xb6\x41\x04\x5a\x2d\xb4\x6e\xe0\x90\xf5\xdf\x26\xa7\xb6\xae\xce\xf7\x6a\x20\x83\x1a\xac\x27\x81\x3c\x08\x07\x4b\x81\xdd\x57\x20\x4d\xa4\x96\x57\x80\x09\x6a\x75\x8a\x99\x61\xea\x9a\xaa\xf2\x8e\x67\xfe\x56\xab\x6a\xfa\xaf\x0f\xdc\xd6\x61\x81\xc0\xc1\x79\x86\x18\xa8\xf3\x96\xaa\x12\xca\xa8\x3a\x9e\x78\x4a\xa4\xdd\x74\x6d\x3d\x91\xd6\x15\x4b\x47\x02\xe0\xee\xa1\x64\x7f\x9d\x50\xab\x07\xf5\x9f\x84\xb1\x12\x28\x6b\x5b\x49\xc7\x82\xc2\xe8\xa7\x74\x99\x3b\xb9\x88\x57\xf0\xc1\x1e\xf4\xac\xe9\x0f\x4d\x16\xb2\x2a\x41\x59\x1d\x57\xec\x8a\x55\x81\x34\x2b\x70\x15\x9f\xb6\xc6\xe1\x2c\x15\xb2\xae\x5d\xc9\xbb\x6b\x3e\x8f\xe5\xf1\x77\x36\x76\x10\x16\x90\x56\xaf\x7a\x10\x0b\x70\xba\x4c\x2c\x79\x0c\x38\x23\x7e\x4b\x30\x21\xbd\x52\xe0\x8e\x41\x39\x23\xcc\xb2\x69\x02\xfb\x6d\x21\x63\x62\x05\x74\x71\x1b\xce\xc5\x15\x12\x7c\xbc\xeb\xd0\x7d\x4c\x24\xa2\x35\xda\xb5\x68\x35\x5b\x6b\x2d\xd5\xc1\x69\x25\xe6\xdf\xbf\x95\x50\x9b\x0e\x8d\xc2\x43\xc0\xb3\x08\xcd\x10\xec\xb1\x0b\x85\xbb\x10\x6b\x95\x7a\x22\x5c\x0a\x71\x32\xac\xda\x20\xe7\xd9\x90\xc8\x3a\x3a\x81\xee\xfc\xc3\x61\x51\xf5\x4a\x16\xb4\x02\x04\xe2\x54\x16\x23\xd9\x82\xaa\xab\xb4\x44\xd8\x09\xd4\xbe\x26\x7c\x56\x49\x5a\x7a\x64\x75\xe6\x9b\x28\x50\xb3\x62\x7f\xa7\xc6\x22\x11\xbb\x04\x47\xf2\x25\x1f\x8d\x62\x11\x84\x55\x6f\x60\x09\x7d\x4b\x52\x07\x7b\xd3\x4f\x23\x70\x6f\x16\x43\x0b\x3a\x52\x06\x0d\xe0\x71\xc7\x66\x20\x8e\x43\x17\x4c\x2b\x2b\xb9\x26\x7b\xdf\xfb\x49\xdf\x1b\xd2\x1b\x3b\xd9\x71\x69\x12\x6b\x89\x73\xf1\x1c\xce\x43\xe0\x33\xf4\x5f\x5c\x72\x3b\x53\xb3\x4e\xc8\x79\x96\x08\x50\x74\x4d\x53\xf1\x74\x2e\xfb\x91\x56\xbc\x0c\x92\x93\xaa\x01\xcd\x61\xc3\xf2\x91\x71\xb4\x49\x1a\xc5\xc6\xeb\x1b\x25\x3d\xe5\xc0\x79\x7c\xbc\xc3\x72\xfc\xd1\xae\x3a\x03\x19\x97\x90\x1f\x04\xec\x39\xc1\x4a\xab\x6d\xc9\x6e\x29\x98\x98\x49\x85\xce\x98\x07\x67\x58\x87\xab\xbd\x8d\x63\xf8\x30\xe0\xb7\xc4\xa0\xcf\xe8\x82\x74\x79\x86\xc0\x93\xe8\xc1\xec\xbb\xcd\xbb\x74\xd6\xbb\x8f\x0b\x2d\x04\x5c\x43\x34\x3b\x73\x2e\xde\x0f\x0c\xf0\x9d\xeb\xe8\x62\x7c\x05\x02\xa2\x08\x5e\xdb\x41\x17\xbc\x41\x21\x46\x8d\xfb\x79\x8a\x70\x80\xd2\x12\xfb\xc0\xd0\xb3\xb2\x91\xe5\xab\x94\x7c\xc4\x97\x58\x99\x22\xaf\x01\xab\xf2\x2f\xa7\xc7\x61\x2f\xdb\xa7\xbe\x3e\x4f\x41\xfb\xb6\xd7\x57\xf8\x5c\xcd\xcc\x9c\x97\x64\xea\x9a\x8a\x32\x43\xf6\x05\xbb\x26\x76\x0f\x68\x57\xf9\x13\x30\x3f\xdc\x6c\xfa\xf1\xc3\xeb\x39\x22\x0e\x12\xa8\xf8\xda\xd5\xdd\x30\xe5\x21\xa6\xa6\xdc\xb5\x48\x7f\xf7\xfe\x99\x07\xea\xbc\x1e\xab\xeb\xf1\x78\x3c\x4e\x99\x3f\xef\x13\x1e\xf5\x56\x3e\x78\x59\x6a\x59\xf2\xd9\x72\x65\xfd\xed\x79\xd3\x91\x04\xba\x37\x15\x4b\xf7\xfe\x8f\x48\x17\x4c\x8d\xec\x45\xe8\x55\xbf\xfb\x26\x4d\xd4\xc4\x10\xfe\xdb\x10\x3b\x1b\xc8\x08\x40\x11\x53\xb6\xa0\x57\xdc\x9a\x00\x33\xdc\xff\x76\x67\xdd\xb4\xfa\x5e\xa3\x49\x96\x05\x0e\x34\x02\x01\xa5\xd8\x87\x46\x6a\xd8\x51\x90\x96\x78\x26\xa1\xf0\xac\x8f\x18\x8b\x7e\xb6\xa6\x81\x56\x8b\x09\x03\xf6\x84\x9e\x8b\xf1\x60\xfd\x83\x9f\x15\x32\xa5\x96\x88\xf0\xca\xfb\x2b\x0c\x9f\xd4\x1f\xf1\xd4\xed\x2a\x70\x99\x08\x49\xd8\x6c\xc6\x0a\x68\x64\xc4\x9a\x05\xab\x99\xa2\x55\x9f\x34\xdd\x16\x0b\x42\xf5\x2b\x6b\x81\x2b\xbb\x41\x51\x59\xad\xe9\x9d\xbb\x0c\x10\x07\xd4\x01\x36\x75\xc9\x93\x52\x3c\x51\xb5\x89\x80\xae\xf7\xde\x89\xf7\x52\x9a\x37\x5c\x83\xa6\xeb\x2a\x50\x30\xde\xb9\x37\xd9\xe0\xe3\xf7\xdf\x85\xac\xd6\xc7\x23\x28\x92\x94\x8a\x0e\xe3\x7d\x1b\x1b\xdc\x1e\x1b\xf6\x34\x0c\x11\x48\x97\xc2\xdc\x48\x2e\xcc\x5a\x33\x22\xab\xd7\x15\x09\x48\x5b\xf6\xfa\x41\x33\x1d\xe2\x74\x5e\x4f\x4c\x03\xc3\xc4\xeb\x0d\x5d\x86\xf2\x53\x87\xac\xbc\xe2\xa4\xc2\x38\xaa\xfb\x6e\x2a\xcd\x62\xcd\x8b\x95\xd6\xc9\xfa\x4c\x96\x2b\x0f\x1a\x75\xa0\x89\x7d\x90\xaf\xd5\x01\x0d\xa4\x67\x5b\x93\x92\x95\x4c\xdc\xb9\xff\x09\x09\xe0\x1c\xd4\x0c\xcb\xc5\xfe\x37\x3a\x4b\x61\x87\xbd\x95\x20\x87\xb6\xb1\xc7\x4e\x23\x08\x48\x98\xef\x78\x47\x81\x97\xc1\x6e\x3d\x0a\x80\x29\x52\x8c\x95\x94\x10\xe1\x4e\x5a\xd6\xd3\x99\xeb\xf9\xbf\xa6\xa6\x5d\x59\xc9\xec\x1b\xab\x43\x23\x52\x42\xbb\xc0\xb9\x91\x84\x09\xdd\x2a\xc7\x13\x77\x06\x42\xb5\x57\x29\x19\x86\xfc\xdc\xeb\xfc\x70\x7a\x4c\x5e\x90\x7d\x68\x15\x0c\x62\x7f\x46\x79\x15\x30\x9e\x56\x5b\xa3\x42\x83\x7b\xfb\x88\xc4\xd7\x0e\x29\x0b\x33\x5a\x69\x36\xb2\x67\x27\x1c\x8d\xee\xbd\xad\x0e\xe2\x55\xee\x86\x29\xc0\xa7\x4c\x4b\x5a\xfe\x1c\xc4\x4e\xea\xf6\x9d\x4a\x59\xb1\x3b\x27\x71\x84\x1e\x29\xdb\x3a\xe1\x7e\x78\x90\x13\x2e\x8e\x4b\xd8\xfd\xdb\x5f\x12\xdc\x72\x35\x33\xb4\xa4\x86\xba\x93\xcf\xdf\xf0\x6f\xcb\x88\x4f\xe7\xdf\xa7\x5d\x43\xce\x3f\xd7\x57\x6b\xdb\xb6\xe4\x06\x32\x82\x2d\xb9\x70\x2e\xa5\xb8\x85\xfd\xf9\x09\xdc\x8f\x7d\x56\x21\xdb\x00\xbd\xae\xde\xc3\x85\x56\x90\x8e\x8a\x6b\x13\xf1\xc2\xc0\xe8\x5a\x50\xdd\x37\xb7\x84\x2c\xfd\x89\x5d\xca\xb8\xfc\x3d\x10\x66\xf9\x50\x06\x32\xc2\xe9\xb7\x72\x5b\x1e\x2b\x0a\xfa\x57\x61\x08\xd4\x99\x50\xef\xed\xce\xd2\xfc\x8a\xed\x25\x15\xe8\x46\xbf\x27\x35\xa3\x42\x13\xc5\x60\xa6\xc1\x8a\x9f\xc1\x0c\xa3\xfb\x4a\x22\x2a\xee\x99\x2c\xc3\xbb\xae\x46\xf9\xbc\x1a\x91\xf2\xae\x08\xaf\x85\xa9\xb4\xba\x92\xd7\xb0\xbf\x2b\xaa\xe6\xde\x59\xa0\x47\x64\xda\x1a\xf4\x3b\x6a\x52\xf3\x0f\xd0\x00\x20\x74\x27\x83\xd9\x68\x45\xf4\xc1\x99\x2c\x75\x28\xee\x0f\x40\x3f\xce\x68\x96\x31\xf6\x0f\x38\xc5\x53\x26\xaf\xb7\x1c\x50\x5f\x01\x8e\x51\xc2\x2a\x3e\x87\x1e\xd6\xf1\x6c\x81\xf7\xed\x97\xb1\xf4\x89\xc5\xbf\x10\x57\x91\x01\xbf\x4f\x9e\xb3\x80\x28\xe0\x56\x47\xfb\x40\x18\x75\xe0\x9a\xf1\x6b\xbb\xf0\x6c\xf8\xb8\xb7\xb9\x12\xb7\x8c\x4b\xf0\x6a\xa4\xc6\xbe\xdd\x56\xb3\xdb\x38\x38\x02\x2c\x7c\x6c\xc9\x52\xa8\x38\xf1\xf3\xed\xe7\x9a\x42\x22\xe7\xd8\x28\xc6\xc8\x6b\x3e\x55\xcc\x8a\x1b\xc1\x2a\x18\x92\x9f\x1f\x9d\x9f\x76\x5c\x65\x3f\xb2\x73\x17\x7d\x98\x40\xc2\x35\xa4\x84\xdb\x67\x94\x8a\x5f\x31\x45\xec\x19\xd2\x42\xf5\xb7\x9f\x64\x2f\x11\xa6\xcb\xd0\x1c\xc0\xf5\x73\x84\xef\x81\x99\x30\x4f\xdf\xf9\x88\x79\x4a\x19\xc1\xd1\xf9\xe9\x31\x52\xc0\x85\x36\xd4\x6a\x79\xe4\x1d\xc0\x50\xc6\x93\x43\xc1\xbb\x42\x14\x1b\xc3\xd2\x57\xac\x24\xca\x4b\x82\xea\xce\xdd\x2e\xc8\xda\x66\x40\x1d\x20\xc2\x74\x05\x3f\x1c\x1c\xa5\x6e\x3a\xe0\xf6\x1e\xc2\x40\xd4\x83\x21\x69\x3b\xae\x3a\x91\x60\x65\x3f\x65\xb4\xd1\x0a\xf1\x03\x5c\x4e\x77\xa7\xa1\xe4\xfa\x36\x22\x40\x0e\xbe\x67\xb4\xfc\x49\x71\xc3\xde\x89\x82\x45\x32\x25\xd1\xb3\x17\x0b\x7d\x5f\x5f\x21\x63\x16\x19\x8a\xf5\x40\xe1\xf8\x44\x18\x99\x48\x26\x81\x33\xb3\x7f\x9e\x43\x2c\xc1\xc1\xa4\x3a\x6c\x84\x15\x55\x51\xaa\x4d\x0a\xa4\x3b\x9a\x62\xbc\x88\x94\x70\x5a\x4f\x64\xf6\x24\xa3\x93\x59\x2e\x9f\xa0\xf7\xd5\x06\x0d\x26\xee\x1d\xa5\x5d\xbb\x6d\x4c\x0c\x9d\x33\x43\xb4\x69\x8b\x4b\xfb\x16\x01\x92\xf4\xc8\x63\x64\x41\x9a\xeb\x23\x52\x5c\x93\x7c\x9b\xfd\x8e\xae\xdb\xb2\xfe\x3c\xe3\x15\xde\x06\x91\x51\x0c\x7f\x3d\x5e\x9a\xee\x7f\xe8\x27\xaa\xaf\x69\x47\x1e\x31\x0f\x21\xb4\x09\x25\x8a\x8a\x52\xd6\x6b\xf4\xd9\x9d\xc9\x68\xb1\x48\xa0\xa3\x33\x89\xee\x6a\x1f\xa6\x84\x64\x6e\xb0\x28\x07\xd8\x87\x29\x41\xe2\x15\x8b\xf2\x71\xdb\x87\x89\x79\x67\x03\x93\xc0\xd8\x15\xab\x32\x64\xe1\x00\x94\x95\x9d\x84\x20\xea\xe1\x03\x14\xf8\xab\x49\x0a\xbd\x2d\xb2\x95\xdc\x23\x25\xb3\xe4\xbb\xbd\x97\x98\x16\x49\xc3\x6b\xdb\x07\xef\xec\x5b\x67\xca\xb8\xba\x70\x09\x64\xdd\x5b\x43\x2a\xd5\xae\xbe\x75\x9b\xe4\x7d\x24\xab\x6f\xfd\x83\xc6\x8e\x61\xdd\x5b\x83\xa3\x6f\x17\xdf\xba\xdf\xeb\x7c\x5b\x67\xaf\xa3\xe2\x29\x4d\xb8\x77\x3d\xa5\x09\xdf\x77\x9a\x70\x04\xe6\x47\xc1\x8f\xd5\x4b\xdc\x7d\xac\xc9\xc2\x00\x40\x6f\x67\x91\x21\x34\x6f\x43\xcd\x62\x04\x8e\x3b\xc3\xaf\x3c\xe4\x2f\xb9\xc4\xb0\xdf\xb3\x5e\xeb\x5d\xbf\x11\xbb\x3c\x6a\x84\xfa\xcb\x94\x5b\xbc\x29\x9f\x18\xef\x79\xfb\xee\x22\x06\xfa\xa3\xbe\xeb\x5b\x72\xcf\x9e\x5d\x39\x01\xef\x27\xe7\x78\x75\x9d\xee\x2f\xe5\x38\xf1\x49\x9b\x33\x8e\x1f\x62\xbf\x7d\x5a\x16\xf2\x6a\x0e\x72\xa6\xc1\x57\x13\x92\xd7\x9f\x3e\x68\x85\x86\x1c\xf4\x51\x42\x30\xe4\x11\x6d\xc5\xd0\x3e\x0c\x05\xc7\x90\x93\xdc\x8b\xd6\x40\x43\x48\xae\xa0\xfb\x23\x44\x57\x21\x12\xcb\x05\x96\x62\xc5\x50\x41\x29\x66\xa8\x07\xac\x59\x53\xb9\xb0\xd3\x66\x4d\xd5\x12\x52\x9c\x20\x03\xc1\x65\xee\xed\xc7\x95\xd0\x07\x60\x07\xa7\x08\x92\x05\x23\xe7\x6b\xb3\xef\x3b\x16\x3b\x77\x5f\xec\x6d\x4c\x83\x69\x5d\x5f\x60\x3f\x84\x83\x81\x35\x4c\xd5\xae\x77\x17\x33\xae\x57\xab\x66\xce\x17\x1e\xe6\x27\x2d\x01\x5b\xa2\x3b\x99\xd1\xd2\xe7\xef\x62\xce\x79\xcd\xea\x29\xa6\x3d\xea\xf5\x4e\xeb\x21\xa9\xa3\xa6\xf3\x24\x19\xbf\xea\x4f\x11\x32\xc2\x25\x0a\x1c\xa6\x98\xfd\x14\x27\x56\xb6\xf3\xc5\x3a\x69\x29\x59\x2c\xb7\xbe\x0c\x44\xaa\xb4\xe9\x81\x5e\x20\x0e\x2f\xc4\xcd\x52\x91\x78\x6f\x5f\xe2\x47\xa4\x10\x3f\x30\x0a\xef\x50\xe8\xa5\x21\x61\xf5\x8c\x4d\x00\xc9\x2d\x2c\xb0\x0d\x61\x7e\x1c\x85\xe5\xd7\xeb\x4d\xb4\xcf\x9a\x41\x99\xbe\x96\x3b\xe3\x22\x4d\x05\xad\x0a\xe8\x6d\x9d\xc4\xbf\x1b\x42\xe0\x4c\xcd\x99\x0b\x7e\x9f\x1b\xc5\x0b\xb3\x39\x7f\xd8\xdd\x37\x20\x96\xb3\x7f\x58\x35\x0b\x7a\x40\x7e\xd0\x3e\x82\x8c\xdb\x27\x44\x5c\x3f\x49\xf0\x43\x9c\x07\x7d\xcd\xee\x00\x48\x8c\xda\x6c\x56\x73\xc0\xe2\x08\x10\x77\x5d\x6e\x3a\x78\x3f\x79\x00\x92\x7f\x44\xb2\x23\x4d\xfb\x59\xea\xc2\x54\x5b\x51\x79\xce\x71\x68\x28\x85\x27\x34\xe8\x3f\xa1\xa3\x50\xe9\x89\xeb\xe2\x79\xa1\xe9\x03\x04\x9f\x20\x31\xa0\x15\xa1\xad\x42\xca\xc1\xe1\x46\xd8\xbf\x29\x25\xe3\x80\xd4\x7c\xbe\x30\x21\xf7\xb2\xa2\xad\x28\x16\x8f\x88\x2b\xb6\x89\xeb\x8e\x2b\x1c\xb2\x94\x28\xb9\xb4\xd2\xbe\x22\x0d\x55\xb4\xb6\x6a\x97\xdb\xdf\x9a\x25\x45\x2e\x1e\x25\x8a\xbb\xfd\x29\x88\xe5\x84\xdf\xee\x0c\x02\xfc\xdb\xd0\x5c\xcc\x91\xb4\x84\xec\x95\xa4\x65\x24\x39\x50\xcd\x61\x46\xb3\xbc\xda\x8f\x10\x64\xdb\x95\x77\xcb\xaa\x22\x39\x49\xb2\xe5\x70\xf2\x4f\x48\x85\xd7\x39\x8a\x80\x68\x72\xff\x21\x65\xef\xbf\x71\x40\x98\xb4\x9f\x2f\xb9\x12\x89\x8d\x91\xf9\x12\x09\xf8\x48\xea\xf0\x76\x33\xd2\xd3\x4f\xa4\x2a\x2d\x2f\x73\x8b\x11\xda\x79\xad\xe9\x91\x62\xd0\xec\x94\x56\xe7\x0d\x2b\xb6\xe9\xc0\xfc\xcb\x9b\xf3\xc3\x3e\x35\x70\xce\xbb\xb6\x14\x0c\xbe\x27\xb4\xf4\xa5\x9f\xd7\x6c\xba\x90\xf2\x32\x71\xb0\xfd\x08\x91\x71\xd1\x4e\x27\x85\xac\x23\x94\xd3\xb1\xe6\x73\xfd\xdc\x09\x86\xb1\x9d\xa6\x03\xc2\x45\x05\xc7\xb5\xd7\x87\x98\x30\xde\x64\x19\xf0\xc2\xa4\x08\x6f\x0c\x0c\xe5\xa0\x37\x9d\xde\xb5\x3e\x25\x6f\x07\xa1\x5c\x0d\x3e\x52\xd6\x39\x26\xb5\xdb\xe7\x0a\xd7\xdc\xf0\xa6\x2b\x5d\x3b\x03\x1b\xac\xce\x1a\x06\x00\xb7\x32\x25\x2e\x66\x64\x4d\xd4\x6d\xee\x9e\xbf\x76\x64\xc4\xbe\x3b\x3e\x8b\xe5\x79\xe4\x57\x0e\xc5\x61\xcf\xec\x2f\x89\xfb\xe9\xb3\xe1\xad\x58\x0e\xab\x0a\xf5\x84\x33\x59\x3e\xd3\x71\x30\xb6\x03\x6d\x0b\xb9\x6f\x98\x18\xcf\xaf\x58\x8f\xfe\x54\x45\xd0\x5e\xfb\x3c\xa4\x10\x47\xfd\xff\x1d\x54\x5c\xcd\x3f\x58\xda\xe2\xb1\x22\xfa\xb0\xef\xa5\x18\x6f\xfe\x3a\xa9\xee\x9a\x40\xa1\x5e\xf0\x32\x8e\xec\x7a\xc4\x8f\xb7\xfc\xad\x5a\x86\xbd\xd6\xed\x17\x6f\x99\xb9\x96\xea\x12\xe7\x2a\xce\xb3\x32\x12\xee\x1c\xc2\xe2\x69\x65\x56\x24\x2e\xb5\xca\xb4\xdb\x93\xb9\x1c\xca\xae\x1c\x1d\xf6\xfc\xf7\x5a\xd3\xfd\x97\x61\x91\x95\x52\x2c\xfb\xe0\x07\x28\xc7\x22\x9b\x4b\xb2\xd6\x55\xa4\xc9\xfd\x14\x65\x91\x6d\x57\x08\x92\x01\x18\xba\x4c\x5d\xf1\x82\x1d\x16\x05\xa4\xc2\xdf\x69\xe8\x61\xec\x7a\xcc\xec\x2b\x53\xc3\xca\xf3\x1e\x0d\x98\xe4\x53\x86\x6f\x09\xad\x38\x85\x06\x9c\xa4\x7f\xa3\xe5\xef\xbb\x03\xbf\xfb\xc7\x42\x46\xd1\xca\xeb\xbb\x1d\x03\x31\x97\x87\x41\x30\x5e\x1b\xfe\x61\x81\x25\xd7\x5f\x7e\x5d\x97\x58\x59\x1d\x5f\xce\xb2\x82\x9b\x7e\xc7\xa1\x3f\x0d\x3f\xdf\x50\x7d\xd9\xb5\xeb\x60\xe3\x46\x96\x5d\x77\x8e\xe8\x73\x37\x8d\x63\x8a\x34\xde\xad\x6d\x47\xf2\xd2\x19\x7b\x16\xd9\x99\x3a\xd4\xaf\xff\xf3\xf8\xed\x03\xc3\x81\xfb\x23\xd1\xce\xfe\x33\x0d\x1a\x16\xac\x9a\xb7\x3d\xa3\x04\x14\xaa\xa3\x1b\x2d\xa9\x23\xa2\xa8\x8b\x56\x52\x3c\x10\x2a\x46\xd1\x7d\x4a\xf6\x23\x70\xf7\x3b\x1f\xe7\xa7\x82\x74\x09\xd5\xa8\x12\x8c\x90\x47\xb0\xd0\xcd\xd7\xe0\x00\xf2\xd3\x7f\x1e\xbf\xf5\xa1\xbe\x40\x3d\x1a\x92\x8e\xf3\x9c\xcb\x6f\xdf\x27\x33\xf4\xef\xd0\x46\xb5\x85\x21\xad\xd1\xf6\xf3\x14\x52\xfd\xc1\xf8\x09\xc4\x2a\x36\xe7\xda\xa8\xa5\x93\xe7\x72\x16\x91\xec\x9c\xcb\xe1\x96\x4b\xb6\x24\x7f\xfd\xee\xe4\x6f\xff\xf5\xfd\xbb\xa3\xc3\xef\xff\xeb\xcd\xe1\xd1\x5f\x4f\xdf\x9e\xfc\xfc\xf3\xf9\xdf\xce\x2f\x4e\xde\xfc\xfc\xf3\x51\xab\x14\x13\xe6\x08\x1b\xef\x9e\x33\xf3\xf3\xcf\x6e\x8f\xe9\x9f\x7f\xbe\x28\x1a\xde\xfc\xfc\xf3\x99\x77\x73\xc2\x39\x6a\xa7\x2a\x01\x16\x1c\xa0\xc7\xba\xea\x48\xd0\xef\x70\xf9\xe1\x2d\x7b\x75\x97\x03\x3a\x68\x40\xd5\x7f\x8a\xb8\xbc\xbb\xae\x05\x45\x6e\x4e\x2f\x7c\xeb\x9d\xfd\x0f\x2a\x32\xa1\xca\x8e\x12\xcd\xc5\x1c\xd0\xfe\x50\x45\x0d\x81\x07\x32\x65\xe6\x9a\x31\xac\xdb\x5c\x55\xad\xd2\xf1\xe0\x7e\xb2\xaa\xaf\x71\x2d\x8e\xad\x02\xd3\x6b\xcd\xe2\xd2\x94\x5c\x21\xe0\x15\x67\xd7\xa0\xa6\x6b\x3e\x17\xb4\x8a\x42\x83\xd0\xa9\x10\x33\xc0\xba\xdf\xdf\x91\x12\x1e\x15\x71\x62\x73\x67\x17\x26\xeb\x67\x99\xac\x65\x98\xf4\x3a\x63\x50\x6d\x69\x63\x25\x39\x3b\x3d\x26\x2f\xef\x3a\x19\x60\x1b\xb8\xac\x92\xf3\x4d\x0c\x11\x1c\x51\x56\xc5\x4b\xeb\x0e\xbf\x06\x79\xfc\xd0\x8c\xde\x4e\x4b\x59\x53\x2e\xb6\xdb\x64\x62\xd6\x56\xd5\x92\xfc\xda\xd2\x0a\xb5\xd7\x33\x59\xae\x9f\x34\x7b\x7f\xf4\x1f\xfd\x69\xf2\xc7\x40\xf8\x9f\x26\x7f\xb4\xd2\x27\xec\x8c\x3f\x4d\xf4\x55\x31\xf9\x63\x51\xb5\xda\x30\x45\xdc\x4d\x77\x86\x3e\xfd\x48\x67\x8a\x20\xe7\xa8\x1b\x01\x28\xa5\x60\xe7\x3e\x88\x46\x87\x4e\x05\xc8\xef\xfc\x8b\xa2\x05\x3b\x63\x8a\x83\x69\x20\x45\xf9\xa0\x1d\x2a\x3c\x07\x93\xd2\x35\x3a\x83\xee\xda\x48\x47\x98\x33\xc1\x58\x89\x96\x9a\x23\x9b\x91\xb9\xa5\x1a\xd6\x7d\x02\x46\xd5\xd4\x6a\x03\x85\x62\x14\x51\xdf\x48\xc9\x2a\x06\x8d\xec\x92\x3a\x8f\x62\x88\xc4\xa7\xec\x0a\x29\xc6\x82\xcd\x31\x85\xd6\xa5\x92\x20\x9e\x22\x1e\xb3\xff\x64\x4a\x46\xe9\x9a\xda\xc8\x86\xf0\xba\x66\x25\xa7\x86\x55\x4b\x72\xc5\xe9\x1d\xc7\x07\xb5\x02\xfa\x60\xa0\x70\xdc\x17\x92\x48\x88\x01\xb7\x82\xbb\x70\xcd\xa2\x35\xa4\x94\xd7\xe2\xee\x2a\x85\xeb\xca\x1a\x0a\x71\x05\xaf\x46\xbd\x66\x39\x30\xb9\xa4\x01\x9e\xe8\x45\x09\xd2\xac\x0e\xb4\xf5\x7b\x0f\x75\x0a\xfc\xa6\x45\x87\xce\x17\x1e\xdc\xd8\x1d\x09\xaa\x15\x00\xcb\xd9\xf5\xf6\x82\x8c\x0f\xcd\xc4\x5d\xfd\xec\x34\x66\x7d\x3f\xbd\xfe\x70\xc0\x1a\x3c\x3c\xc4\xd8\x4a\xb2\xca\x4c\xaa\x82\x4f\xab\x25\x59\xd0\xca\x30\x87\x98\x49\xe3\x55\xba\xeb\xa4\x9c\x33\x13\x2f\x44\x25\xc5\x3c\xd6\x75\xd9\x87\x86\x15\x06\x7a\x37\x31\x2a\xda\x06\xa9\xb3\x6a\xdc\x52\xb6\xc9\xfe\x8f\xd8\xef\xf1\xf5\x0b\x3f\xe9\x29\x32\x27\x25\xa7\x2a\x35\x9b\xca\xc8\x8a\x21\xa7\x0c\x11\x4e\x1b\xbb\x13\x3d\xd3\xf1\xd3\x1f\x4b\xb3\x95\x04\xaf\xdb\x85\xdb\x38\xc0\x72\x17\xe1\x95\xc1\x8f\x61\x0c\x85\x1e\x49\x56\xc4\xe2\x37\xd0\x9c\x61\x49\xac\x56\x64\x30\x82\xe6\x9a\x8a\xdd\x3d\x28\x66\x37\x96\xe2\x4d\xc5\xc8\x1f\x2f\xd9\x72\x04\xdc\x3e\x42\x75\xfe\x4f\xa4\x0d\x19\x54\xf0\x7c\xc8\x91\x6c\x2c\x01\x52\x91\x3f\xfa\x7f\xfd\xe9\x01\x7b\xc3\x0c\x09\xc3\xe1\x4b\x6d\xab\x5d\xcb\x09\x22\xd3\xf0\x08\x4c\x8e\xb9\x05\x74\xa0\x35\x46\xe2\x2c\x4f\xc8\x09\x74\x4d\x43\x03\x12\x01\xe6\xad\x25\x10\xdf\x9c\xe8\x59\xfd\xc9\x87\x53\xdd\x2e\xf3\x8e\xfb\x28\x4f\xef\xad\x74\x7d\x82\xd8\x88\x9c\x41\x57\xbd\xee\x13\x10\xc5\x6f\xe5\xc9\x07\x56\xb4\x69\xd5\xef\x83\x42\x40\x97\x2c\x21\x9b\x32\xcf\xea\x7d\xc7\x96\xfe\x54\xc4\x65\xb0\xf6\x79\x80\x03\xec\x44\x54\x54\x3f\x78\xfb\x32\x5e\xb2\xbb\xf7\x8b\xc4\xeb\xd4\xfb\x35\x80\x22\xd7\x9e\x2b\xec\x4a\xaf\x15\x9d\x7c\xe0\xda\xe8\xff\x8d\xf2\xa4\x90\xf5\xd4\x1f\xaa\x48\x8e\xe7\x35\x44\x62\x72\xab\xef\xf0\x54\x52\x49\x1b\xb4\xb6\xfe\x05\xb6\xb5\xc0\xef\xfc\x04\x2a\xd6\x28\xa6\x21\xe6\x4c\xed\x54\x3c\xd3\xae\x40\x4b\x0a\xc0\x45\x76\x11\x09\xec\x42\x9c\x34\x94\xaf\xe5\xc1\x01\x71\xd7\xe1\x72\xc1\x12\x9c\x58\x4b\x69\xd2\x53\x05\xf0\xa3\x34\xb1\x83\x0f\xb6\x9c\xf2\x6b\xcb\xaf\x68\xc5\xd0\xfd\x7a\xcd\xab\xb2\xa0\x0a\xd3\x1a\x51\xe8\x13\x2d\x5d\x0d\x2c\xb6\x41\x4b\x0a\x60\x05\x6d\x80\x75\xcc\xae\x5d\x3a\x13\x55\x86\x17\x6d\x45\x15\xb1\x12\x70\x2e\x55\x12\x5e\xcd\x20\x36\xeb\x76\x6a\x92\x35\x85\x57\x0e\x7e\xbb\x58\x25\x24\x66\x3c\xb3\x08\xaa\xb8\x9c\xa1\x66\xb9\x22\x66\xf6\xb1\xea\xcc\xed\xf6\x24\x0a\xe4\xcc\x1f\x3c\x41\xa2\xc7\x68\x28\x51\x4a\x0e\xd7\x84\xcf\x85\x54\xac\x3c\x88\x14\x90\x20\x0b\x27\xe4\xdb\xd0\xbc\x31\xa5\xef\xb7\xd5\xb8\x7c\x24\x19\x60\x65\xdc\xbb\x39\x41\xe5\xb8\xa9\x13\xbd\x33\xa9\xd8\x15\x53\x64\xdf\xe1\xba\xb1\x2b\x5e\x98\x83\x09\xf9\xff\x5b\x43\x2f\x35\xf8\x16\x2c\x48\x27\x0c\x43\x7b\x01\x07\xfe\x4f\x35\x79\x41\xf6\x61\xa8\xd8\x7a\x3c\xf0\x09\x24\x7a\xa9\x0d\xab\xd3\xf9\x79\x5b\x35\x10\xc9\x89\x8b\x39\x36\xc1\x8f\xde\xc6\xed\x16\x17\xad\xad\x15\x6e\x0f\x1d\x73\xe5\xa0\x23\x33\x1c\x92\x5c\x3b\xb9\xd8\x0b\xaf\x86\x8c\x0d\x7f\xa6\x86\xbd\xf0\xdf\x90\x23\x40\x14\x9b\x83\xf4\x42\xd9\xb3\xe5\xe6\x77\x89\x79\x98\x46\x36\xb2\x92\xf3\xe5\x79\xa3\x18\x2d\x8f\xa4\xd0\x46\x81\x8c\x7e\x48\xb7\xd2\xc5\x4d\x44\xb8\xe7\x4e\x5d\xed\x0a\x75\x15\x61\x72\x86\xb8\x4c\xb2\x9d\x2f\xb0\x15\x28\xfc\x90\xd0\x42\x49\xad\xc3\x3b\xdd\xd5\x64\x03\xdf\x9e\x9e\xf8\xbe\xa0\xde\xbf\x1c\xfa\x8c\xc2\x98\xe0\x6d\xbf\xa6\x4b\x27\x95\xe8\x94\x97\x3d\x04\x45\x4f\xfa\x5d\xd9\xe1\xd0\x9e\x8e\x37\xce\x83\xd5\x09\x0e\xdf\x1e\xdf\x35\x95\x61\x7b\x26\xef\x4d\x4b\x1a\xac\x0d\x07\x12\x1a\xd6\x2e\x18\x94\x30\xcb\x08\x31\x68\xa7\x74\xce\xaf\x98\x08\x33\xf3\x48\xda\x8e\xd6\xf4\xc3\xf9\x25\xbb\x4e\xf8\xa5\x7f\xd1\xef\xd8\xdd\x8b\x24\xc6\xe0\x0d\xfb\x41\x68\x6a\xb8\x9e\x71\x3a\xad\x1e\xb2\xf7\x29\x80\xa6\x9c\xb3\x8a\x15\x5b\x54\xdb\xbf\x8f\x89\x08\xd0\x7b\x46\x92\x19\x17\x2b\x3c\x96\x76\x74\x74\x28\x73\xbe\xd3\x1b\xd7\x01\x02\xcf\x0d\x0b\xd5\x72\xb2\x15\xae\x8f\x6e\x48\x0a\xc4\x2c\x88\xb6\x9e\x32\xe5\x45\x58\x9a\x7a\xe4\x40\x25\x49\x21\x95\x62\xba\x91\x58\xad\xea\x59\xc7\x09\xb2\xf4\xf3\x28\xb9\x84\x65\x68\x3d\x08\x4c\xe9\xc9\x07\xab\xf7\xea\xb4\x92\x00\xbc\x7a\x9c\xb4\xfa\x50\x4c\x05\xf2\xd5\x5d\x2b\x4b\xe7\x36\x3d\xf4\x86\xc7\xa0\x41\xfc\x49\xaa\x18\xee\xae\x21\x35\x50\x78\x25\x57\x42\xe1\x95\x27\x1b\x90\x20\x42\xc0\x8d\x73\x87\x73\x1c\xbe\x89\xe1\xdb\x9c\x03\x5d\x8f\xd0\x9c\x76\xb0\xad\xa2\x53\xc6\xec\xcd\x03\xc8\x02\xe3\xdc\x99\x23\x97\x6c\x09\x8f\xc7\x11\xd3\xbb\xd7\x0d\xdc\x16\x9e\xb0\x21\xf5\x5d\x78\x8d\xed\x2b\x0d\xfa\xbd\x9f\xe6\xe4\x87\x0c\xdd\xe3\x78\x25\xba\xee\xba\xab\xc7\xc7\x97\x9d\x37\x0e\x79\xb2\xe7\x8d\xeb\xe4\x72\xe7\x8b\x1b\x34\xf6\xe0\xea\x30\xbc\x86\xb8\xb8\xba\x2b\xdf\x86\x8e\x69\xfa\x14\xb7\x17\x85\xa4\x11\x39\x1b\xbc\xbd\xf0\xda\xe4\x06\x3b\x15\x23\xf2\x56\x1a\xfb\x9f\xc8\x23\x76\x2c\x99\x7e\x2b\x0d\x7c\xb2\x13\x2b\x89\x13\xb0\x4b\xeb\xe8\xbc\x16\x56\x0c\x0b\x3c\x6e\x5c\x76\x9b\x55\x14\xdc\x7a\x6d\x32\x83\x4f\x05\x91\xca\x4d\xf9\x40\x12\x82\x25\xad\x1d\x01\x71\x80\xde\xf5\xf9\xbe\xd1\x10\xb7\x54\xc4\xcb\x7c\x6f\xc4\x38\x42\x00\xf3\x18\xbf\x01\x28\xf6\xa6\x82\x82\xef\xb2\x85\x09\xa3\x76\xe6\xa8\x61\xf3\x3b\x97\x38\xae\x5e\x35\x53\x73\x46\x1a\x08\xeb\x64\xe0\xdc\x21\x8a\x04\x5e\x03\xd5\x89\x98\x98\xc1\xdb\x28\x73\x79\xe9\x3d\x3e\x14\x74\x4a\xb0\x35\xf2\xe8\xa8\x03\xf6\x7b\x44\x0a\x6a\x5d\x35\x05\x07\xc9\xff\x0b\xd1\xdb\xff\x21\x0d\xe5\x4a\x4f\xc8\xa1\xcf\x30\x8c\xbf\x73\x49\x1a\xd1\x63\x06\x90\xd2\xac\x07\x16\xa8\x20\xcc\x61\x5a\xc8\xd9\x9a\x32\x3e\x72\x78\xfb\xf6\xc0\x0e\xce\xe5\xbd\x4b\xb6\xdc\x4b\x45\x57\xc2\x2b\x96\x28\x7b\xa7\x62\xaf\x4b\x29\xec\x49\x81\xa0\x93\x02\xc0\xf9\x1e\x7c\xb7\x77\x7f\x7a\xff\x20\x0d\xb2\x03\x4c\x3a\xcb\xa0\x82\x0d\xdc\xb2\xbd\x3d\x55\xd3\x66\xd8\x96\xea\x98\xef\x3b\xb6\xdc\x5a\x08\xe6\x4d\x8f\x0a\x6f\xc2\x18\x67\xaa\x77\x9a\xa5\xc6\xfa\xfb\x0a\x62\xf4\x0b\xe7\x16\x94\x57\x4c\xa1\x4b\x30\x69\x6c\x74\x82\xd9\xb3\x26\xa4\xda\x77\x70\x3b\xc0\x8f\x30\xb0\xe5\x43\xef\xd1\xa8\xa4\xbc\x6c\x1b\xcf\xcf\x90\x86\x9b\xba\x63\xb8\x28\x64\xed\xfc\x22\xf8\x9e\xe0\x09\x77\x1b\x73\xec\x32\x9e\x50\xc6\x84\xad\x80\x39\x55\x3d\xaf\x4f\x62\x7c\x30\x9e\xcc\xe0\xe0\x65\xf6\xd8\x0f\xfe\xc0\x6e\x7a\x6f\x9d\xaa\x24\x02\x7c\xae\x7d\x3c\x0b\xae\x0d\x34\xad\x43\x60\x7d\x26\xd5\x94\x97\x25\xf8\x22\x91\xb8\x50\xf0\xb5\xc2\x38\x56\xd2\xf4\xfc\x50\x69\x42\x63\xe5\xa9\x1b\xea\xe0\x57\x9d\x5d\xe2\x99\x49\x49\x4b\xc6\x0b\x06\x71\xed\x91\xec\x83\xc2\x2b\xae\x4e\x8d\x67\x04\x3b\xfb\x49\x23\x4d\x99\x0f\x1f\xda\x23\x49\xb4\x55\x65\xb5\x3d\x50\xc4\xd0\x2d\x83\x91\x3e\x10\xc9\x2e\x29\x61\x6e\x85\xb4\xe9\x33\x5b\x52\xa3\x08\xd7\xdd\x02\xf6\xf6\x94\x19\xea\xfb\x5c\x88\x15\x34\xa8\xfe\xe4\x9f\x8a\x33\x59\xf6\x3d\xda\xb7\xc0\x42\x91\x7d\xff\x8f\xe9\x32\xb9\xe8\x85\x0c\xd6\xf1\x06\x68\x76\x39\x0f\x87\xe1\x0a\x97\x73\xa6\x6f\xef\x58\x80\xe1\xa3\x50\x14\x26\xdf\xce\x15\x43\x14\x60\x90\x4a\x20\xa5\x5c\xdb\xab\x56\xb0\x2b\x66\xb9\xb7\xe4\x76\x0e\xa7\x6d\x22\x66\x9a\xcb\xcf\xfa\x65\xcd\xab\xff\xff\x3b\x96\x6f\xa5\xf1\x61\xaa\x5f\x46\x2e\x60\x8e\x7a\xdc\x07\x5e\xb7\x35\xf6\xad\x36\xc6\xda\x30\x7c\x36\x63\x2a\xb1\x39\x1f\x09\xb5\x27\x7d\xdf\x75\x3f\x5a\xe3\xa4\x84\xa1\x6a\x0e\x05\xd3\xce\x0f\xed\x55\xae\x79\x25\xa7\xb4\x22\x35\x17\x96\xb4\xb4\x99\xb8\x58\x7b\x4e\x78\x63\xf7\xe7\x2d\xc4\x81\x0e\xea\x3a\x4b\xa1\x73\x3c\x2d\x43\x42\xb9\xe4\xf1\xd9\xca\x6c\xac\x3c\x1c\xe4\x4b\xc5\xb4\xc6\xf4\xe0\x37\x5c\x1c\xbb\xd0\x62\xd2\xb0\xaf\xad\x74\xfc\x40\xeb\xa6\x62\x23\x0c\x3f\x7e\x3d\xfe\xa7\x14\x8c\xb8\xb2\x87\x51\x60\x51\x57\xc7\x63\x24\x79\x89\x0a\x6f\x13\x60\xc9\x7c\x7d\x4d\x12\x05\x3d\xb9\x1b\x82\xad\x9a\x7c\xf5\xfc\xab\xe7\x2f\xd3\x44\xcc\xa9\x2b\x3d\x2a\xa8\x76\xdd\x6d\xd7\x57\xf7\xce\x45\x3c\x78\xfd\x8b\xd8\xd9\x79\xe9\xfe\xfb\x95\xfb\xef\xd7\xe4\x5f\x89\x4f\x23\x67\xe4\xac\xf7\x5f\xfb\x9f\xc4\xa7\x8d\x2d\xf3\x44\xcb\xf5\x72\xd4\x3f\x5b\x0b\x2a\xf0\xe0\xb3\xe7\xbc\xdb\xdf\xa0\xed\xe1\x2b\xc0\x39\x53\xc8\x9a\xc1\xd4\x7f\xf5\xbf\xd3\x74\x4d\x7c\x2e\x64\xe8\x1b\x22\x85\x7b\xfa\xcb\x7d\x98\xae\x03\x72\x0d\x79\x0f\x35\xbd\xc4\x80\xd5\x61\x61\x5a\x5a\x59\x82\xf7\xbf\x1e\xbf\x3c\x20\x52\xf4\x6e\x4f\x22\xe1\x8a\x4b\xab\xaf\xf9\x99\xd8\x7f\x99\x88\xf1\xb0\x3a\x9d\x5f\x6d\x98\xce\xde\x4c\xc2\xdb\x52\xb1\x84\x57\xc8\x2b\x93\xbd\x38\x3e\x14\xcb\x6b\xba\x0c\x42\xd9\xab\xeb\x73\x7e\xc5\xc8\x82\xcf\x17\x80\x86\x30\xa0\x5f\x2a\xc1\xbc\x6f\x90\xb1\xdc\xb7\xb4\x44\x42\x96\x84\x27\x6a\x7f\xa7\xe6\x99\x86\x8c\x16\x8c\x51\x38\xa0\x9b\x50\xa7\x16\x8a\x4f\x5e\x82\x58\x79\xb1\x02\xf4\xb1\xe5\x34\xa7\xaf\xbf\xba\xbb\x4e\x11\x64\xf2\xd6\xd4\x8a\x40\x41\xaf\xe1\xc1\xfa\x69\xb6\x7a\xb8\x0c\xe0\xda\x8f\x9c\x5a\x70\x50\x84\xc3\x33\x1c\xe3\x97\xce\x1a\xee\x4e\xb4\x6e\xf6\xd2\xfc\xb2\x67\xb2\x0c\x09\x22\xc4\xe9\xd3\x90\x58\xa7\xc9\x5e\xff\x18\xd8\x83\x44\xbb\xe0\xbd\x71\x18\xce\xce\xde\xe3\x52\xd8\xf7\xf0\x9b\x7f\x50\x1b\x70\x42\x0e\x45\xd9\x55\x13\x25\xce\x12\xfb\xb5\xa5\x15\x38\xaf\xe7\x90\x27\xa8\xf2\xcc\x57\x54\x77\xb4\xd6\xd7\xb6\x93\xe6\x89\xaf\x8d\xfb\x5e\xb7\x15\x64\x5a\x7e\xfc\xfd\xb3\x72\x82\xee\x52\xad\xc0\xea\x0c\xb9\x56\xb5\xc4\xde\xf5\xc2\xab\xff\x2e\xf3\x42\x3a\xbf\xc4\xa0\xcd\x70\x3a\xdb\x50\x4e\xd7\xe5\x6e\x91\x29\x5b\xd0\x2b\xbb\x1d\x01\xc6\x29\xde\xa9\x6e\x89\x41\xc5\x1a\x92\xed\x1d\x15\x58\x38\x11\xa8\xfb\x2c\xf3\x62\xc0\x36\xef\xde\x4d\x1a\x7c\xbf\x9f\x56\x4f\xab\x10\xff\xe8\x59\x12\x89\x26\x75\x8a\x82\xfa\xd5\x68\x65\x5e\xdd\xe7\xbf\x7d\x28\xbd\xf5\xab\x34\xbd\xf5\xde\x95\x4b\xfc\x6f\xb2\x8d\xd4\x6d\xdc\x8d\xfb\xf5\xb7\xfb\xdd\xac\x1f\x40\x86\xff\x9a\xc0\x05\x64\xac\x2e\xc9\x39\x71\x87\x39\xf5\x5e\x73\xd3\x52\x04\xe0\x12\xec\xda\x95\x54\x47\xcb\xba\xb2\x44\x91\x93\xcb\xab\x6c\x69\x72\x65\xca\x0a\xda\x6a\xbb\xa9\xeb\xc6\x9a\xdf\x44\x5b\xf6\xf3\x0e\xc3\xaf\xf7\xbf\x26\x63\xf2\xe2\xc0\xee\x6e\x81\xa2\x05\x58\x30\x56\xb8\xa1\xb1\x0d\x1a\x7a\x66\x61\x4d\x7d\xbb\xce\x89\x52\x8e\x3b\xf4\xce\x15\xb5\xf7\xf1\xa9\x4d\x42\x96\xec\x70\x36\xe3\x82\x9b\x65\x2a\x9c\x7d\x1e\xf5\xe9\xed\x1a\x25\x91\x1a\xb5\x90\xd7\xe4\xda\x61\x09\x00\x2f\x3b\x48\xbc\x98\xfc\xe7\xf6\x8f\x41\x8e\x6b\x38\x2c\x83\x2e\xe2\x2c\x8e\xa0\x0f\x38\x69\x63\xf9\x6e\xe2\xea\xe6\x5d\xa3\x9e\x94\xb1\xc6\xe4\xaf\x52\x48\xf5\x0a\x8d\x43\xec\x65\x1f\x74\x90\x1b\x5f\xcb\x9d\x2f\x45\xd5\x96\x51\x07\x8c\x4e\x7b\x4a\x3c\x3e\xc7\xe4\x14\xfc\xb7\xaf\x3e\x36\x72\xf0\xf2\x02\x88\x42\x19\x0e\xbc\xdb\x08\x4a\x4f\xe8\xdf\x58\x24\x0f\x47\x39\xc7\x40\x60\x3f\x30\x69\xbf\x85\x49\x25\x0d\xf0\xcf\x83\xd7\x1e\xd9\x19\xb9\x80\xf4\xee\xed\x6f\xa5\x98\x8e\x5b\x37\x12\xf6\x3e\xc3\xa4\xf4\xd5\x0d\x90\x34\xfa\x43\x6c\x1a\xe4\x3d\x7b\xf0\xc8\xd6\x38\xea\x47\x84\x56\x12\x82\x48\xf6\x38\xb2\x1f\xb1\xd2\xdd\x38\x93\x3e\xd6\xb4\x1a\xfb\x48\x22\x63\x01\x68\x9f\x5d\xf9\xca\xa8\xb7\x0b\x72\x6c\x41\xbf\x20\x9f\xb0\xe9\x1e\x78\x83\x21\x95\xdb\xda\x61\x51\x32\xfd\xf6\xea\xfa\x02\x09\xde\x61\x7d\xc9\x40\xb3\x80\x85\xc3\x58\xda\x04\xf6\x60\xdc\x5c\x9d\xba\x70\xb3\x53\x96\xb8\x4e\x4e\xfc\xb4\xea\x34\x07\xc8\xde\x82\x56\xb1\xdd\x61\xed\x1d\x5e\x32\x85\xea\xce\x94\xf5\x50\x98\x52\xeb\x2d\xf0\xfa\xa9\x7b\x3a\x22\x36\x01\x94\x00\x0e\xfe\x27\x04\xbf\xdd\x9b\xb6\xc5\x25\x33\x3e\x31\x43\x01\x4a\x4a\xd3\x1a\x32\xa5\x15\x15\x85\xdd\x8b\xa0\xc9\xa6\x39\xea\x67\xde\xf5\x6f\x24\x12\x80\xa3\x25\xbf\x0d\x76\x8c\x08\xf8\x3f\xf8\x0a\x51\xfd\x2a\x17\xda\x58\xaa\xb1\xb0\x75\xd8\xe4\x1d\x56\x5a\x8e\xac\xd4\xf5\x83\xae\x05\x2f\x70\x78\xf7\x6f\xcc\x9f\x71\x1a\x01\x63\xc6\xc1\xc6\x45\xc9\x2b\x32\xa5\x17\xda\x26\x5d\xcf\xe1\xf4\xf6\x4f\x8b\xb4\x97\x64\x93\x39\x64\xff\xad\x6c\x8f\xbd\x3e\x5e\xa3\x87\x80\xda\x1b\xe1\x2a\xda\x5d\xe2\x90\x3c\xf1\xe5\x41\x41\xa7\x66\xe8\x8c\x8b\x12\xf0\x81\x57\x89\x09\x4f\xed\x53\x65\x0d\x01\x4f\x11\x98\xb9\xf9\x29\xda\xec\x8e\x7d\x68\xf1\xb9\xe6\xe3\xde\x96\x10\x5d\x77\x5f\xf4\x55\x14\x28\xb2\xa1\x95\x47\xf9\xb1\x2a\x05\x9f\x59\xab\xab\x94\x0c\xb3\x22\xd0\x3d\x9e\xe8\x7c\x63\x5e\x2f\xe9\x5c\x44\xa9\xa7\x76\xcf\xdd\x42\xf6\x7d\x76\x00\x31\xac\xaa\xf0\x74\xe8\x3c\x62\xd6\x12\x36\xb2\x73\x89\xa5\xfa\xf6\xc7\xa4\x1f\x9a\xd8\x38\x58\x3c\x90\x07\x6d\x82\xc8\xe9\x32\xb4\x96\x4d\xcd\xc1\x9d\xb6\x86\xcc\xf9\x95\x55\xa1\xd6\xe2\x1f\x9b\x62\x19\x18\x7f\x5a\xb0\xaa\x21\x8a\x95\x6d\xc1\x06\x64\x02\xea\x44\x33\x9b\x90\xc3\xd8\x21\x08\x98\x19\xe1\xb8\xdc\xeb\xf1\xe2\x9e\xeb\x83\x3b\x5c\x51\xe4\x33\x90\xb0\x60\xe2\xf1\x19\x61\x57\x4c\x2d\x49\x23\xb5\x06\xd9\x0f\xfa\x02\x82\x1c\x42\x36\xe5\xcc\x17\xd6\x80\x53\x05\xe6\xcc\xf9\x17\x92\x06\xdf\x73\x4e\x89\x3d\x70\x2a\xcb\xc1\x3a\xc0\xee\x46\xad\xbf\x7e\xfe\x32\x35\x6a\x9d\xdb\xfb\x77\x06\xff\x0b\x21\xe5\x41\xa1\xe5\xd3\xd9\x26\x39\x19\xe6\xb6\x27\x79\x3e\x25\xea\x9c\x1a\x9a\x84\x99\x81\xe0\xf0\xd7\x07\x51\xc0\xfa\xeb\xe7\x5f\x3d\x7f\xb9\x6f\xe7\xfe\xab\x03\xbb\x0a\x51\x58\xf9\xab\x28\xac\x1c\x7e\xe9\xde\x22\x01\xc2\x8a\x74\x49\x3b\xfb\x2f\x0f\x26\x50\xd3\x00\xf8\xa4\xd7\x52\x95\xae\xc4\xdf\x23\x46\xda\x37\x0f\xed\x3f\x79\xed\x95\xcf\x11\x08\xad\x20\x1d\xd3\xdc\x43\x10\xd0\x80\x30\x3a\x37\xe4\xcb\x5a\x2a\xf6\x65\x34\xc4\x63\x55\x0c\xd6\x93\xbb\x6a\xda\x8c\x2f\x13\xf2\x76\x87\x14\x3b\x0f\x2d\x75\xbe\x29\x45\xad\xa6\xcd\x1d\x9e\x73\x25\xab\xb6\xbe\x6b\x16\xf6\x30\x85\xe8\x7b\x57\xb7\xea\x86\x76\xa5\x95\x98\xe6\x50\xbb\x9a\xe3\xe9\x32\x86\xf2\x9d\xb2\x4a\x8a\x39\xc6\x2a\x43\xc3\xc2\x3b\x8e\xfa\x69\xc8\xea\x85\x14\x05\x6b\x8c\x7e\xae\x8d\x54\x74\xce\x9e\x3b\x22\xef\x34\xd8\xf6\x20\x0b\x7e\x04\x6a\xfb\x95\x6f\xd8\x14\x08\xdf\x23\x00\x2d\xfb\xfa\x6f\x90\x97\xb4\x00\xd8\x49\x98\x75\xab\x2d\x45\x0d\x86\x45\xea\x74\x6f\x09\xb5\x20\xa1\x83\xe0\x90\x6a\x50\x7a\xad\x4f\x2a\xaa\x0d\x2f\xbe\xad\x64\x71\x79\x6e\x64\x9a\xa3\x2f\x87\x85\xb1\x89\x96\x1e\x27\x08\x72\xf8\xd3\x39\x39\xe6\xfa\x92\x28\xa6\x65\xab\x0a\xd7\xaa\x6c\x05\x90\xf1\xae\xd8\xb1\x78\xd9\xcd\x54\x31\xe3\x20\xf7\x49\x4d\x8b\x05\x9a\xfe\x2e\xeb\x81\x7d\x68\xa4\xee\x9a\xaf\x27\xb0\x14\x5e\x71\xa7\x8a\xc3\x9f\xce\xd7\x5f\x99\xeb\xa8\x49\x06\xfa\x10\xb1\x94\x06\x3c\xb1\x5d\xa6\xfc\xd8\x28\x96\xa6\x95\x6d\x9c\x69\xcb\xf0\xe0\x94\x52\xac\xe4\x0a\x81\x54\xdd\xbb\xb2\xa9\x9e\x14\x9a\x4f\xe8\xb5\x9e\x14\xb2\x26\x47\xe7\xa7\xa4\x54\xfc\x2a\xb5\x4f\xd2\x30\x51\xf6\x05\xbd\xd6\x0c\xc9\x9f\x5a\xf2\xed\xd7\x29\xf3\xb0\xe5\x5e\xa1\xf8\x36\xa7\xc7\x09\x3f\x1f\x5a\xff\x3d\xd3\x17\xf6\xdd\x13\xed\xb9\x5c\x55\x73\x48\x85\xf7\xc8\xce\x78\xc5\x10\xb0\x0b\x39\xd1\xc5\x7d\x9d\xd8\x87\x6d\xbe\x94\x2d\xb9\xa6\xe8\xd8\x86\x73\x36\xbd\x7c\xf3\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x91\xfa\x2a\x09\x56\x71\xf7\x7d\x84\x3d\xba\x10\xc8\x06\xb7\x1d\xc5\x7c\x00\xc4\x18\x5e\x27\x68\x9d\xe9\x57\x64\x8f\x7d\x30\xdf\xec\x8d\xc8\xde\x87\x99\xb6\xff\x11\x66\xa6\xf7\x26\xe4\xb4\x6e\x2a\x5e\x70\x63\xcd\x51\x31\x63\xaa\x73\x15\xe3\x0f\x32\x75\x59\xda\x95\x3d\x49\x72\x54\xb2\x82\x53\x18\xd8\x73\xcb\x1c\x1e\x08\xf1\x4c\x1e\x7d\x20\xee\x93\xbd\x4f\x67\x44\x62\xe9\x41\x1f\xa6\x9c\xeb\xf0\x70\xcb\xd0\x6e\x74\x91\xd0\x6f\xa9\xbb\x3a\x16\x7e\x2d\x95\x7f\xe4\xf3\x92\x5d\x3d\xd7\x25\x7d\x39\x82\xd7\x42\xfe\x5c\xae\xcc\x01\xd5\x64\xef\xe5\x9d\x1b\x05\x74\xd7\x39\xaf\x79\x45\x55\xb5\x1c\xc5\x73\xd9\x3d\xdf\x1e\x95\x9e\x10\x70\x26\xbf\xd8\x23\xfb\x88\x06\x0e\xea\x7a\xc5\x7c\x3b\xbe\xd0\xd5\x17\x2a\xa0\x92\x9b\xdd\x0d\x4d\x0c\x21\x83\x93\x43\x08\x1c\x4c\xb4\x7c\x27\xaa\x64\x70\x8f\x5c\xdc\xef\xe9\xf0\xf8\x81\xaa\x75\x51\xec\x99\x44\xcd\x8d\x75\xb7\xf8\x96\x3c\x5c\x38\x13\xe0\x8d\xe5\xd1\x01\x78\x16\xbb\x26\xce\xd2\xdb\x0f\x92\xa0\x29\x6c\x7b\x41\x3d\x1d\x90\x52\x2f\xf8\xaf\x2d\x23\xa7\xc7\xfe\xa0\x6e\x98\xd2\x5c\x1b\x26\x0c\x29\x7b\x1a\x3a\x47\xb5\x7d\xff\xb0\xa6\xff\x94\x82\x9c\x7c\x7b\xee\x1e\x94\xbc\xcd\x76\x6f\x75\x13\x0f\x2b\xfa\xcf\x56\x31\x6b\xcf\x6c\xcd\xe4\xf2\x04\xac\xda\x59\xf6\x73\x72\x4c\x0d\x45\x73\x0b\x4f\x0c\xd9\xf5\xf4\x02\xb3\x68\x0a\x78\x6e\xbe\x79\x5c\x3e\xa3\x28\x10\x75\x27\x4b\x28\x7a\x19\xbb\x28\x69\xf3\xb1\xd1\xfc\xb1\xfc\x8c\xf6\x8f\x1d\x21\x83\x05\xb4\x65\xcb\xc3\xbe\xcf\xdb\x54\x8f\x3e\xfe\xfc\x87\xf7\xa7\x5b\xb0\x5b\x0a\xb0\xc9\xe7\x6f\x64\x99\xc7\x78\x79\x16\x3d\xd0\xab\x68\xd0\x10\xf8\x08\x3f\x27\xb5\x1d\x89\xbc\x95\x82\x8d\xc8\x7b\x46\x4b\x62\x0f\x2b\xf7\xcf\x9f\x14\x37\x6c\xf2\x6c\x5b\x4a\xae\x5f\xc4\x2c\x13\xe1\x1f\xe6\x27\xe1\x6d\xd4\x26\x12\x7a\xb9\x82\x48\x77\x3a\xeb\xb4\x92\x53\xe2\x44\xea\x36\xdf\xfe\x87\xf7\xa7\xd9\x5e\xfe\x87\xf7\xa7\xfe\xdd\xed\x3f\xe5\x6c\x37\x5f\x7b\xd7\x0c\xf7\xd7\x2b\x16\xf3\x70\xcb\xe5\x8d\xab\x89\xa0\x6b\xd6\xf8\xfd\x9b\xe2\x93\x2d\x1b\xe1\x19\x20\x9c\x9c\xa1\xf7\x8a\x58\xba\xd2\xdc\xa0\x5c\x24\xc3\x23\xf6\x85\xab\x7d\x52\xd7\x93\x29\xca\x7a\x83\xde\x7e\xe5\x2b\x52\xb7\x95\x81\x2e\x37\xb0\xb5\xec\x5e\x83\x02\x32\xbf\xc9\x88\xeb\xfa\x6a\xb5\x03\xcc\x34\x29\x5f\x79\xf4\xa4\xf0\x8b\xcd\x3f\x78\x43\x05\x9d\xdb\xdb\xe1\xc4\x26\x35\xfe\x19\xed\xe9\x7d\x0c\xf0\x8b\xf0\x15\xbd\xa2\xbc\xa2\x53\x5e\x71\x03\xd6\xc8\xc1\xc4\xcf\x25\x42\xcd\x00\xc9\x5b\x13\xf6\x3b\x67\xd2\xc5\x9d\x30\xa0\x7b\x22\xd9\xb7\xdf\x3d\xbf\xb6\x87\xe2\xc1\x04\x4e\x48\xb8\x71\xc1\x54\x6c\xf5\x25\x8f\x6c\x37\xfc\xfb\x7b\xb2\x16\x87\x5b\x68\xd1\xc6\x83\xd9\x48\xb3\x04\xac\x34\xdd\xaa\x25\x60\x09\xd8\x68\x09\xc0\x17\xae\x97\xed\x16\x8c\x01\x18\x3e\xc1\x18\x80\xdf\x65\x36\x06\xec\xb1\xf4\x39\x19\x03\x9a\x15\x8a\x99\x01\xe6\x00\x88\xc6\xc4\xdf\x0f\x35\x08\x76\x4e\x2e\x96\x4f\x72\x31\xbe\x3a\xe6\xca\xb2\x42\xdd\xe3\xbc\xb2\x1e\x1a\xda\xe3\x57\x2b\x28\xd7\x28\xbc\xce\x9d\x76\xe0\x1b\xdd\xc3\xef\xad\xc8\x4a\xc1\xf7\xc7\x6b\xf0\x81\x1e\x36\x4d\x9e\x79\xf1\x4f\xf3\xd3\x82\x6a\x0f\x7c\x4c\x92\xb7\xf6\xc0\xd7\x2c\x58\xb3\x98\x6d\x0d\xda\xc1\x8e\xfe\xfa\xbc\x9f\x48\x72\xc4\x9a\x05\x79\x7d\xbe\xe1\x00\x43\xfc\x0e\x3b\x5d\x1a\xd3\x4b\x9e\x69\x52\xf1\x19\x33\x3c\x35\x32\x12\x9f\x61\x47\x48\x4b\xef\x00\x0b\xc0\x4c\xfe\xc0\xc2\xe9\x0a\x81\x47\x21\x7d\x7b\xd3\x60\xf7\x3c\xc2\xc3\xa5\x96\x82\x1b\x79\xe7\x5e\xe4\x24\x47\x1f\x03\x37\xf4\xb6\x8f\x06\x4f\x87\x5d\xd4\xf7\x7e\x3a\xc9\x9b\xe8\x53\x4a\x0a\x59\x55\xac\xf0\x58\x1a\xc0\xa6\x03\x66\x0e\xaf\x0d\x2e\x72\x97\x0a\xac\x27\x97\x7f\x00\x27\xb9\x73\x87\x3f\x47\xd6\x7b\xfe\xfe\xe4\xf0\xf8\xcd\xc9\xa4\x2e\xbf\x58\xc8\xeb\xb1\x91\xe3\x56\xb3\x31\x4f\x85\x4a\xdd\x7a\x97\x85\x0c\xd6\xf4\x3d\xa0\x16\x37\xd4\x2c\xf2\x98\xd7\xf6\x49\x96\x7d\xba\x8e\xf6\x3f\x68\xc4\x0b\x00\x44\x36\x97\x87\xa8\xa4\x34\x23\xa2\x28\x24\xdf\x86\x4e\xc9\xb3\xb6\xaa\x90\xcf\xac\xec\x19\xc5\xf1\xe1\xe7\x4f\x46\xae\x57\xa7\x7a\x93\xfb\x59\x59\xbc\xbb\x22\x1e\x86\xeb\x96\xa9\x36\x33\xc9\xc8\x30\x1d\x25\x7d\x96\x39\xef\x7d\x8e\xb9\x0f\x66\x61\x19\xe8\x92\x2d\x09\xa0\xda\x5b\xb3\xf5\x07\xcd\x54\x7f\x0b\x32\x53\xc0\xac\x3f\x6f\x35\x53\x13\x7c\xfc\x23\x5f\xe9\x21\xba\x32\xbc\xff\x7b\x36\xdb\x8d\x75\x7e\xcf\x66\x9b\x96\xd9\x7d\x0c\xdd\x99\x43\x55\x95\x55\xc5\x5b\xb3\xc0\xca\x5f\xec\x9f\x8f\x76\xca\xc6\x75\xc7\x3e\x08\x8f\x7c\xa1\x07\xe1\xab\xe7\x68\x6c\x23\x06\x58\x55\x24\x73\x13\x90\x38\x8e\xe6\x38\x63\x60\xb7\x94\x8b\x5e\x0b\x58\x84\x20\xe3\x57\xac\x5a\x06\x5d\x1d\xeb\x66\xca\x16\x11\x91\x69\x71\x79\x4d\x55\x09\xfd\xa6\x1b\x6a\xb8\xf3\x70\xf3\x74\xc5\xd2\x5e\xbe\x47\xb9\xc3\x5c\x76\x8d\x44\x5c\x01\xb6\xc6\x37\xe6\xce\x98\xc1\x82\x50\xe1\xc0\xa5\x1d\x82\x9a\x3d\x23\x69\x72\xd2\x85\x27\xa2\xb6\xb6\x5b\xc1\x94\xb5\xf6\xab\x25\xb9\x56\x32\x15\x81\xcd\x5f\x77\x4c\x2c\x91\x57\x4c\x5d\x71\x76\xfd\xfc\x5a\xaa\x4b\x2e\xe6\x63\xfb\xb2\x63\xdc\x02\xfa\xb9\xe5\x44\xfd\xfc\x0b\xf8\xcf\x00\xaa\x32\x75\xf6\x08\x1e\xea\xbd\xbd\x1c\xea\xf0\xe0\x86\x03\xf6\xb2\xe7\xdb\xb6\xa5\xba\xa5\xc1\xee\x25\x19\xeb\xd1\xca\x9f\xd8\x8a\x96\x52\xe3\x3d\x76\x1d\x7b\xf2\x9a\x96\x75\x22\x8a\x31\xd9\x19\x71\x9d\xea\xdc\xe1\xa2\x4c\x5b\xba\x2c\xce\x1d\x18\xbd\xef\xdc\x71\x9f\xb9\x24\xd0\x50\x0e\x42\x7d\x54\x02\x80\x67\x7d\x91\x47\xbf\xc6\x23\x83\x87\x07\x07\xbf\x5b\x88\xc2\x51\x9c\x39\x3e\x81\x4f\x85\x08\x85\x6c\x98\x15\xc9\xc5\xe5\x44\xaa\xf9\x7d\x14\x6d\xac\xf2\x6b\xbd\xd4\xbf\x56\x63\xa4\x60\xdc\x94\x1d\xc3\x3e\x3e\xcf\xd5\x53\x75\xc6\xad\xd5\x19\x8f\x3b\xd1\x63\x87\x6b\x2e\xee\x73\x4b\x91\xcf\xd2\x4b\xf3\x59\x85\xdc\xb6\xc8\x13\xc3\x7d\x31\xbb\x66\xa2\x77\x1a\x5d\x23\x01\x9b\xcd\x35\xcc\x04\x0b\x1c\x4f\x16\x1f\x2b\x04\x14\x06\xaa\x68\xcd\x0c\x53\x1d\x60\x7c\x21\x85\x18\xd2\x6f\xd6\x48\xf2\xae\x61\xe2\x1c\x0e\xe1\x27\xb3\xfa\xc9\xac\xbe\xfd\x7a\x32\xab\x9f\xcc\xea\x1c\x66\xf5\xce\x15\x0c\x79\x79\x8a\x20\x88\xae\x10\xb0\x43\x74\x70\x36\xcb\xe3\x3b\x33\x53\xad\x67\x29\x66\x7c\xfe\x86\x36\x83\x0d\xe8\xf0\xa4\x15\x63\x38\x7c\xec\x32\x1b\x00\x9a\xaa\x91\x0d\xb4\xe8\x73\x30\xa2\x30\xfd\x0f\x6f\x99\x0d\x3d\x8c\xdc\x86\xcb\x56\x04\x32\x80\xbf\x23\x52\xfa\xfa\x46\x6d\x3f\x99\x72\xd3\x69\x12\x9a\x19\xec\x07\x86\x3d\x57\x89\x14\xa4\x70\x08\xef\x60\xff\x44\x7d\xea\x32\xd8\x54\x82\xc8\xc2\x78\xa8\xd1\xd0\x3e\xec\xc5\x8b\x17\x2f\xb0\x77\xcc\xef\x7f\xff\x7b\x22\x15\xa1\xa4\x64\x05\xaf\xd7\x6f\x84\xbb\x7e\xfb\x32\xb1\xbd\x82\xbd\xfe\x76\xf8\xe6\x7b\xc0\x65\x69\x8c\xc6\x0e\x8d\x48\x91\x7d\x70\x6f\x50\x3d\x22\xff\xe7\xfc\xdd\xdb\xae\xf5\x5f\xff\x5b\xf0\x9a\x84\xe9\x4c\xa7\x27\x0e\xdf\xbe\xf8\xdd\x37\xdf\x0c\x78\x12\x38\x5c\xa4\xe2\x0e\xce\xd8\x43\xcc\x50\x7b\x1e\x2b\x86\x3d\x79\x40\x81\xf0\x16\x2c\x02\x80\x99\xe4\xf6\x20\xc4\x2b\x28\x35\x9f\x2f\x8c\x83\x89\xb5\x5b\xbc\xe2\x85\x41\x45\x00\xc1\xb5\xa4\x43\x6b\x86\x4d\x8f\x34\x04\xeb\x7d\x40\x02\x4b\xc9\x46\xa4\xe2\x97\x8c\xcc\xf4\x5f\x94\x6c\x9b\xae\x91\x2f\xf6\x2c\xf1\xd8\x47\x48\x44\xc7\xfb\xc9\x7d\x30\x77\xa5\x92\x7a\x50\x06\x4a\x2e\x21\x03\x44\xac\xb8\x1c\x1c\xf2\x69\xd7\x18\xb6\xa1\x3c\x80\x1d\x41\xd9\x26\xea\xb2\x7d\x1d\xb9\x48\x04\x94\xb3\xd7\x51\x38\x51\x7c\x03\x87\x46\xc9\xff\x46\x26\x07\x88\xdf\xe8\x44\x07\x68\x5c\xcb\x73\x1e\x18\xb7\xcb\x4c\x4c\x1e\xff\x92\x21\xf4\xad\xb5\xd7\x98\x08\xad\x16\xe1\xed\x01\xc5\x36\x9a\x1b\xfb\x45\xc5\xb5\x25\x0d\x3a\x02\x39\x8a\x93\xc7\xde\xf0\xa6\x61\x34\xd8\xf7\x1a\x77\x44\x2b\xd6\x46\xc5\x4e\x1a\x03\x46\x86\x23\x1d\x5e\x90\xfa\x2e\xb8\xdd\xd8\x08\x90\xee\x9a\xcc\xb8\x7b\x3d\x17\x84\x05\x4b\x6f\xdb\x1f\x2d\xa9\x66\xa6\x75\x4b\xcf\x94\x92\xca\xbe\x2b\xd3\xda\xf5\x57\xab\xa9\xba\x64\x65\x38\xff\x26\xe4\xcc\x4e\x8a\xef\x6f\x33\xc0\xc5\x53\x51\x6b\x85\xa1\x13\x9f\x2e\xe1\x35\x9d\xc1\x0e\xc4\x3d\x9b\x4c\x9e\xa1\xe0\x95\x8a\x68\x43\x95\x93\x86\xf6\xf3\x61\x92\x67\x8b\x79\x6b\x3d\xb9\xf1\x86\x36\xd0\x02\x1b\xf4\x4c\x60\x00\xf0\x61\xc0\x3b\xbb\xc3\x87\xba\x35\x4a\x3f\x5b\x32\x78\x18\x86\x3a\xdc\xf1\x1a\x27\x23\xac\xfb\xdf\xdb\x89\x19\xb2\xcf\x07\xbb\x49\x40\x52\x0d\xf9\xf9\x0a\x03\x5c\xf6\x31\xeb\x8d\xf4\xd2\x68\x98\x41\x9e\xc9\xf8\xad\x07\x28\xe1\x78\xe5\x74\x0b\x21\x3d\xfd\xe4\x9c\x4f\xd2\xc4\x0d\x7a\x7f\xaa\x01\x7b\x08\xaf\x1d\x52\xc0\xf1\xda\x35\x35\x1c\xaf\xd3\x19\x88\xf2\x95\x23\xdb\x1d\x35\xb1\x51\xe5\x75\x0d\xbb\x76\x43\x07\xdd\x9e\x06\x8d\xd7\x56\xf4\x68\xbc\x72\x68\xd3\x78\x0d\xd7\xa9\xf1\x1a\x92\x06\x8d\x57\x5e\xc1\xe1\x93\xa9\x71\x31\x9c\xda\x81\x9a\xc5\x2c\x30\x00\x44\x3d\xc1\xa7\xe2\x85\xf1\x60\x79\xe1\x94\x1a\x14\x19\x74\xaa\x65\xd5\x1a\x1c\x38\xd7\xa3\x63\x7d\x09\x5e\x88\x55\xd0\x93\x62\x90\x92\xb4\x3a\x48\xa4\x7b\x81\x76\x8c\xea\xca\xf0\x11\x76\x33\x87\x7f\x48\x28\x24\x17\xdb\xe6\x0d\x81\x6c\x3f\xfc\xb1\xf5\xd0\x47\xee\xb0\xc7\xae\x85\x3c\x72\x82\x4b\x24\x86\x3a\x82\x7f\x34\xc7\xde\xf1\x0f\x0b\xd8\x82\xd7\x0b\xe6\x8a\x5c\x22\xe3\xd7\x2a\x59\xf6\x08\x05\x8b\xdc\xf7\x5b\xc5\xa6\x3e\xdb\x8a\x96\xe7\x0d\xf7\x14\x9a\x0f\x0f\x22\x68\x4e\xf6\x8f\x02\x66\xb6\xaf\x97\x3d\x15\x86\xa9\x19\x2d\xd8\x41\x1c\x5c\x60\xcd\x82\xd5\x4c\xd9\x89\x77\xf7\x79\x08\xe6\x05\x15\x65\xe5\xa0\xcf\x71\x17\x11\xf6\xc1\x30\x65\x17\xa9\x4b\x3e\x4b\x52\x1e\xb7\x0d\x98\x05\x94\x6f\x23\xd6\x01\x03\x6f\xfb\xac\x41\x2a\xbc\x7a\x24\xa2\x93\xa7\x5b\x56\xdf\x37\xcd\xb2\x80\x8e\x03\x4c\xe9\x12\xf4\x48\x0a\xd0\x8a\x41\xdc\x2f\x65\xab\x30\xe1\x36\xe4\x51\x16\x52\x29\xab\x9f\x03\x41\x54\x13\xc5\xe6\x5c\x1b\xe8\x0e\xe3\xbb\x5a\x62\x87\x89\xad\xe1\xf1\xec\x54\x26\x5f\x48\xd9\xbb\x05\xe9\x28\x79\x0c\x67\xd1\x35\x4a\x5e\xf1\xd2\x1b\x74\xf1\xf9\xcc\x35\x69\xa8\x8e\xf0\xd3\xa9\xd6\xb2\xe0\x10\x00\xeb\xb8\x28\x79\x7c\xf4\x84\x82\xb9\x58\x32\x63\xad\x7b\xc1\x7a\xc8\xb7\x71\x92\xa1\x24\xb4\x69\xaa\xe4\x4a\x9b\xc1\x6c\x21\x64\xc9\xce\xda\x69\xc5\xf5\xe2\x7c\x57\x12\xa7\x36\xd1\x84\xc5\xc9\x6b\x15\x4d\x37\x25\x50\x0d\x48\xda\x12\x9a\x83\xc5\x65\xf5\x25\x6b\x60\x72\x29\xc0\xd5\x45\xb5\xf6\xa3\xc6\xa2\x46\x82\xde\x59\x31\xc3\xfc\x57\xe9\x7a\x74\xf7\xde\xae\xf7\x84\xb5\xc9\xed\xa7\x3f\x88\xa6\xf7\x79\x41\xab\x6a\x80\xe7\xa3\xaf\x62\x7b\xed\x05\x5d\x00\xbe\x8f\x05\x6e\x18\x6e\xf7\x92\x9f\x65\x28\x29\xc3\xd3\x6b\x82\x1d\x40\xd3\x55\xdc\x8d\x0b\xa7\xa3\x36\xff\x52\xf8\xd5\x1d\x59\x85\xdc\xff\x20\x70\x00\xc2\x77\xe1\x3e\x7e\x4a\x67\x7b\x4a\x67\xfb\xc8\xb5\x75\x9b\x8e\x3c\xa5\xb3\xdd\xf5\xda\xc5\x74\xb6\x9d\x4b\x39\xf7\x8e\x6b\x3c\x1e\x69\x39\x06\x34\x41\x4c\xba\x6a\xb1\xdc\x27\x68\xa9\x43\xb5\xe0\x8f\xe0\x0e\x6c\x2d\xe5\x1b\xdf\xeb\xd0\x18\xc5\xa7\xad\x49\x17\xc5\x79\x73\x0d\x3b\x7a\xc0\x3c\x65\xda\xe9\x0c\x63\xb7\x64\x45\x74\x78\x38\x27\x7f\x38\xd1\x22\x4d\x63\xa0\xa9\x34\x09\xb6\x0b\x98\x2d\xf8\xe1\x33\x4d\x4a\x59\xb4\x35\x13\xa6\xe3\x90\xae\xd6\x05\xe3\x2c\x5b\x3c\x55\x69\x59\x72\x54\x4a\xce\x32\x9c\xaf\x83\xc4\x51\x29\xaf\x85\x3d\x8f\x0e\xcf\x92\x10\x7e\xfb\xe8\xbe\xdd\xb3\x62\x37\x86\xff\x98\xd8\xcf\xe9\x14\x7a\xd2\xbb\x96\xab\x4f\x29\x93\x1b\x1f\x91\x67\x9b\x6e\x8a\xcc\x1a\x49\x5a\xcd\x6e\x4d\x89\xec\x22\xab\x59\x47\x7e\xca\xce\xdc\x8d\xb0\xf0\x53\x76\x66\xea\xc8\x4f\xd9\x99\x69\xc3\xf7\xe4\xd9\x29\xa6\x58\x5a\x75\xae\x72\xbd\x3d\x7b\xe7\x83\xcb\x4c\x18\xb0\x50\xbb\x95\x55\x76\xdc\x9d\x89\xe8\xdc\x58\x05\xfe\x5d\xf1\xc3\xa0\x2c\xec\xe2\xe0\x51\xd1\x9c\x3f\x34\xc1\xd8\xfc\x1c\x32\xd0\x76\x20\x83\x0c\xe6\x72\x80\x4f\x10\xaf\x3e\x5a\x5c\x07\x3d\x88\xdd\xb8\x31\x45\x37\xca\x11\x6e\x64\xf9\x0a\x1b\x50\x53\x21\x24\xaa\xa8\x7a\x84\x0d\xbc\xf5\xc8\x81\x5f\x80\x91\xda\xd0\x02\xbd\x64\x2d\x2f\x41\xa6\x76\x08\x95\xa9\xd8\x71\x78\x65\xe1\x02\x92\x89\x13\x08\x70\x03\x4c\xd1\xd9\x10\x96\x20\xd9\xd8\xc2\x5e\xb4\xe1\x3f\x32\xa5\x07\xf4\xb6\xeb\xae\x7e\xe3\x5d\x7c\xaa\xe7\x06\x5d\x2c\x58\x4d\xe1\x9f\xaf\xfd\x14\x58\x01\x69\xad\x4e\xc3\xb0\x7d\x1d\x53\xb5\x26\x72\x36\xea\x55\x60\xef\x5d\x0d\xe9\xe8\xe6\xaf\x4c\xce\x0c\xe2\x37\xd3\xd9\xe0\x74\x23\xb2\x3a\x61\x67\xbd\xe4\x20\xbb\x91\x40\x8f\xb4\x7b\xcb\x87\x9f\xba\x44\x6d\x38\x44\x70\x86\x77\x68\x72\xf2\x7b\x6a\xf0\xda\xb5\xac\xd0\xd4\x6c\xd0\x51\xc8\x18\xe8\xab\xec\x03\xc9\x79\xca\x06\xed\x5f\x4f\xd9\xa0\x4f\xd9\xa0\x59\xb3\x41\x23\x65\xc7\x9f\x5b\x1b\x12\x3b\xe3\x3c\x06\x9f\xdd\x39\x65\xde\xee\x77\x1e\x07\x9f\x9c\xe9\x33\x33\xa5\xea\x17\xa0\x3c\x9b\x4c\x9e\x61\x09\x4a\xe7\xa2\x68\xcd\x6c\xfc\x07\xc2\x44\x21\x4b\xfb\x9c\x0b\x78\xbe\xd2\x06\x54\xf8\x2e\xce\x13\xd3\x52\xfb\xb1\xe2\x22\x16\x78\x76\x0e\x8d\x6a\xf0\x51\xe1\x7b\x39\xbe\xce\xaf\x98\x0e\x16\xee\x9d\x3a\x1b\x3a\x4e\xba\x29\x2e\x7c\x46\x93\xd3\x6b\xfd\xf7\x9a\x54\xbc\xe6\xd0\xde\xa4\x04\x09\xc7\xb4\x19\x16\xe8\x22\x64\x1f\x1f\x39\x29\x9a\x76\xe4\x1e\x3f\xa9\x59\x2d\xd5\x72\x14\x86\xb0\x5f\xf6\xc6\x74\x77\x1c\x80\x12\x5d\xb4\x4a\x31\x61\xaa\xe5\x30\xc0\xf7\xee\xda\x41\x6d\xda\xaf\xc0\x8e\x28\xd3\x81\x41\x86\x34\x62\xe8\xae\xbe\x0c\xea\xf2\xe9\x20\xd4\x1c\x66\x11\xce\x4e\x07\xec\x37\xea\xb2\x18\xed\xa7\x4c\x5c\x91\x2b\xaa\xf4\xb0\x3d\x4f\xf2\xea\xcf\x25\xbf\xe2\x5a\x26\xe7\xa0\x45\x0f\x8a\xa7\xe7\x3c\x44\xd0\xec\x4e\x95\xad\x69\x5a\xe3\x8e\x13\xbf\x7d\xd9\x87\x46\x5a\x25\x2d\x6c\xdb\x15\x43\xe3\x65\x6a\x80\xb2\xbb\x1a\x6a\x0c\x53\xe2\x15\xf9\xbf\xfb\x3f\xff\xe6\x5f\xe3\x83\x3f\xef\xef\xff\xfd\xc5\xf8\x3f\xfe\xf1\x9b\xfd\x9f\x27\xf0\x8f\x2f\x0f\xfe\x7c\xf0\x2f\xff\xc7\x6f\x0e\x0e\xf6\xf7\xff\xfe\xdd\x9b\xbf\x5c\x9c\x9d\xfc\x83\x1f\xfc\xeb\xef\xa2\xad\x2f\xf1\xaf\x7f\xed\xff\x9d\x9d\xfc\xe3\x13\x1f\x72\x70\xf0\xe7\xff\x35\x98\x74\x2a\x96\xef\x06\xca\x61\xbc\xc6\x19\xf5\x81\xfe\x13\xb3\xb0\xdf\x8a\x95\xc2\x85\x19\x4b\x35\xc6\x47\xbf\x82\x9e\xd2\x03\x07\xf0\xec\x95\x7b\xff\x77\x3a\x48\x38\x97\x82\x81\xb8\x43\x1b\xfc\x3e\x6c\xc0\xcc\x25\x17\x90\x12\x72\xcc\xb7\x86\x36\xea\xc7\xef\x43\xac\x18\x56\x37\x52\x51\xb5\x24\xa5\x0b\x39\x2c\xef\xa1\x8d\xcc\xc0\x46\xd7\x40\x7a\xc9\x53\x76\xf5\x96\x43\x96\x35\x2b\x79\x5b\x6f\x3b\x5a\x89\x54\xc4\x0b\x7f\x6d\x97\x18\x32\x96\xe4\x2c\x64\xc0\xbb\xdb\x5c\xcc\x78\x4a\x8b\x4b\x74\x22\x04\xce\x18\x12\x59\x62\x31\xe4\xf0\xde\x9e\x4b\x75\xad\x19\x15\x21\x72\x0a\x69\xd9\xb2\x64\xcf\x74\xb8\x17\x49\xca\x12\xac\xc4\x94\x2c\x57\xd3\xb5\xef\x06\x38\xb0\xa6\xd0\x1b\xd0\x5f\xb7\xd6\xc6\x7d\x00\x77\x93\x2c\x8d\x09\xf8\x3f\xd9\xf7\x56\xd7\xdf\x36\x9b\x06\x42\x7c\x8e\xbe\x91\xe0\xd6\x71\x8d\xae\x66\xa4\x92\x45\x54\xb0\xd1\x53\x45\x81\x51\x4f\xbc\x88\x1b\x9a\xad\x64\xd9\xd5\x52\x83\x36\x10\x84\xd4\x2a\x8d\xf9\xd6\xbc\xa0\xd3\x8a\xa1\xeb\x08\xf8\x66\x30\x8f\xda\xc1\x6a\xfa\x81\xd7\x6d\x4d\x5a\x6d\xdf\x4c\x8a\xfe\xb3\xbb\x17\xbb\xc6\xad\x89\x7b\xa5\xe6\x02\x7e\xd4\x73\xb3\xa5\x07\xaf\x16\x8c\x9c\x87\x15\xe8\x9c\xbe\x98\xbe\xe8\x7c\x3a\xba\x05\xd3\xdf\x51\xe7\x0c\x50\x39\x83\x34\xdb\x60\x87\x68\x02\x78\x0e\xc9\x8d\x33\xc9\xba\xc0\x10\xbc\xea\x4b\x0c\x90\x5f\x8b\x68\x81\x5a\xe1\xea\xa1\x1e\xeb\x3e\x7e\x74\x5a\xfc\x40\xdd\x3d\x97\xc6\x9e\x45\x4f\xcf\xae\x9d\x87\xfa\xb2\xad\xa9\x7b\xa1\xc0\xad\xa7\xef\x39\x7f\xf4\x86\x62\x37\xea\xeb\x8c\x82\x80\x1d\x02\xb3\x7e\x11\x7c\xdf\x4e\x79\x2c\x96\x85\x6b\x20\xc4\xbb\x1c\xc5\x90\xa7\x86\x7b\x17\x80\x78\xc6\xf6\xff\xbc\x8f\xdc\xa7\x2f\x4d\xd9\x0c\xd3\xfb\xf1\x37\xe0\x5f\xd4\x69\x90\x40\x18\x25\xa8\x98\x01\xe4\x21\x26\xc2\x43\xa1\x46\xa1\x96\x57\x56\x84\x24\x3d\xf9\x07\xed\x12\xec\x78\xe2\xb6\xa0\x07\x3d\x44\x49\x8d\x0e\x3f\xc1\x58\x89\x28\x49\x55\x37\x03\xaa\x15\x89\xef\x3f\x3d\x20\x33\x46\x4d\xab\x30\x77\x5d\x48\x05\x11\x11\x14\x62\xe8\xca\x57\xcc\xb2\x00\x34\x76\x52\xb2\x26\x5a\xd0\x46\x2f\xa4\x01\xb7\x31\x6d\x68\xc1\x4d\x32\xbc\x8d\x51\xb4\xb8\xb4\x4f\x86\x2c\x26\x78\xb3\xb4\xd7\x28\x0e\x5c\x8d\x7e\xcc\xab\x7d\x5c\x29\xb3\x50\xb2\x9d\x2f\x00\x78\x08\xef\x2a\x2a\xaa\x11\xe5\x2a\x2d\x01\x71\xe3\x98\xce\xd1\xa9\x49\xb9\x14\xb4\xe6\x85\x5f\x3f\xa8\x22\xd3\x5c\xba\x04\x13\xa0\x25\x75\xda\x28\x39\x63\x4a\x73\x6d\x98\x30\x98\xeb\x72\x54\x51\x5e\x93\x7d\xcd\x18\x39\xf1\x5b\x1d\xbf\x39\x47\x33\x1d\x83\x5b\xe9\x65\x07\x71\xf2\x8c\x6b\x32\xea\x70\xa4\xed\x27\x3e\xa8\x17\x25\x94\xa6\xb7\x80\x70\xbb\x72\xe3\x2b\x1e\x0c\xd8\x8c\x9b\xe7\x4c\x2a\xa8\x10\x72\xfe\xb9\x2b\x26\x4a\xd9\x25\x56\x27\x8d\x75\x78\x76\xaa\x63\x87\x28\xca\xb4\x06\x47\x87\x2f\x5c\x13\xd4\xd0\xb9\x30\x48\xc4\xa4\xf1\xac\xc2\x25\x08\x17\x25\xbf\xe2\x65\x4b\x2b\x54\xb5\x92\xa7\xe9\xe8\xfc\x14\x89\xe4\xf3\x85\x19\x5f\x33\x08\x27\xa2\xae\xdd\x9d\x22\xfe\xd5\xf8\x5a\xc9\x2c\xd7\xa0\x94\x19\x62\x64\x9a\x40\x62\x2e\x8c\x6d\x27\xed\x9a\x2e\xa1\x9b\xb7\x2b\x7b\xec\x65\x9a\xbb\x15\x73\xc3\xce\x64\x9a\xce\x50\x7b\x2d\xcf\x31\x77\xe2\xc4\x1d\x82\x18\x2e\xa8\x00\xd3\x15\xa2\xd0\x96\xff\x41\xa6\xae\xcf\x5a\xaa\xc4\x69\x02\x07\x77\x8f\x42\xc5\x57\x53\xbb\xe3\x12\x3d\x32\x5b\xf6\x8a\x5c\x75\xbb\xf1\x82\xd5\x4d\x45\xcd\xd6\x13\xba\x7f\x8a\x82\xf2\x51\xae\xa0\x3d\x3a\xa8\x28\xc7\xb4\xb2\x22\xe3\xec\xc7\x23\x07\x5d\x86\x82\x3d\x4b\x65\xcc\x85\x57\x3f\x84\xb3\x70\xd0\x94\xdd\x28\xd3\xa1\xbb\xde\x94\x95\xa0\x0f\x38\x8a\x87\x94\x52\xca\x6b\xc1\x94\xdf\x57\x67\x3f\x1e\x8d\x08\x9f\xb0\x89\xff\x2b\x0c\xe1\xd5\x25\x23\xe7\x08\x4e\xe1\x21\x72\xd2\x33\x0c\x65\x39\xc1\x57\x8f\xe3\xd7\xf1\x98\xbf\xfc\xd1\x4e\x8a\xfd\xf6\x4f\xe3\x3f\xba\x03\x06\xfe\xfa\xc5\x6a\x6d\x03\xaa\xe9\x7e\x59\x79\x5a\x8c\x07\x00\xea\x8e\xfd\xeb\x97\x33\x59\x9e\x37\xac\x98\xe0\xf4\xeb\x5f\x06\x25\xbd\x12\xc2\x84\x51\xcb\x09\x39\x93\x50\x21\xc3\x4b\x14\x68\xf0\xae\x8a\xfd\xb7\x4f\xc8\x00\x36\x08\x51\xdf\x82\x1a\x26\x40\xfb\x15\xe9\xbd\xcf\x89\xc7\xd5\x84\x61\x41\xcc\x53\x98\xe7\x7d\x08\xd5\x21\xbc\xf8\x88\x18\x89\x8d\xba\x53\x4f\x5b\x7b\x1d\x0a\xc2\x3e\x70\x0d\x7d\x44\x70\x25\x81\x49\xa8\x83\x36\xf0\x26\x87\x25\xc6\xf2\x5d\xe8\x8b\xd3\xc8\xf4\x8c\x5b\x98\xc1\x2f\x85\x34\x5f\x86\xcd\xeb\x2b\xd6\xc0\xb6\x90\x84\x5e\x49\x5e\x92\x56\x83\xce\x29\x48\x2b\x20\x65\x61\x00\x84\xac\xe3\x9e\xe9\x92\xd4\x5c\x1b\x7a\xc9\x26\xe4\xdc\x9a\x23\x71\x1a\x31\xf2\x94\x20\xd3\x4a\x16\x97\xac\x24\xad\x30\xbc\x1a\xe4\x99\x09\x74\xc3\xd4\x46\xa6\x0a\x80\xc6\xb6\x85\xd5\x72\x1b\xc5\xc6\xde\x60\xc2\xbb\x06\x78\x8c\xf1\x40\x0f\xb3\xda\xad\xd5\x28\x6c\xd5\x05\x45\xd7\x6d\x53\xc2\x90\xae\xf6\x75\xa0\x30\x5a\xab\xd3\xb7\xf3\x29\xe1\x6f\xf7\x07\x30\x99\x9e\x90\xb7\x60\xb9\x54\xe9\x9b\x12\x8b\x26\xd0\xdb\xed\x32\x64\x04\x2b\x98\xd6\x54\x2d\xb1\xb0\x98\x1b\x5f\xd3\xde\x6a\x36\x6b\x2b\x30\x18\xd3\x27\x95\x8a\xd6\x12\x4c\x14\x2b\xa4\xd0\x46\xb5\x05\x70\x0d\x25\x53\x25\x2f\x99\xe8\x80\x3e\x06\x1c\x26\x71\xc5\x74\x57\xd4\x69\xd5\x6b\x21\x49\xb1\xa0\x62\xce\x02\x94\x30\xa9\x69\x09\x9c\xfc\x5d\x70\x7e\xa4\x4f\xa6\x0c\x7c\x41\x67\xc6\xaa\x85\x06\x18\x64\x6a\xad\x04\x9f\x8d\x94\xfe\x62\xef\x43\xc1\x77\x1d\x25\x34\x09\x5e\x6d\xb1\xd4\x70\x78\x46\xc9\x18\xac\xd5\x54\x87\x61\x86\x0c\x92\x9a\x19\x5a\x52\x43\x77\x05\x43\xe0\x0d\x5d\x86\xcc\x34\xcc\xd9\x07\xd6\x8d\x72\xf9\x9d\x99\xe0\xfd\x43\xb2\xe1\x31\xa0\xf5\xd9\x8f\x47\x83\xc6\x07\x87\x10\x70\x2b\x74\xc3\x32\x56\xca\xb8\xd4\x45\xd8\x55\x08\x1d\xe1\x11\x01\x2c\x69\x9e\x12\x3c\xc6\x59\x49\xca\x76\x70\x34\xbb\x53\x11\x86\xe4\x4e\x65\xc9\x9c\xb2\xfc\xb9\x2b\xcc\x71\xd1\x25\xa3\x17\xfd\xea\xf4\x8d\x86\x3e\xe6\x2c\x32\x61\xb8\x62\x11\xe0\xfa\x20\x12\x1c\xbf\xb5\x02\x25\x69\x9f\xf3\x90\x35\xe7\xcc\xe8\xae\xec\x12\x15\xca\x81\xa3\x1a\x67\x24\xe1\x1b\x81\xe5\xe7\xb9\xd1\xc5\x5a\x36\x4e\xc0\xa0\x31\x91\xcf\xb5\x74\x8a\xa3\x55\xb9\xb7\xce\x8c\xf9\xb2\xe6\x68\x61\xcf\xf9\x37\xb2\x1c\x9e\x7e\x97\x37\x0f\xb4\x47\x5a\x07\x6e\x83\x18\x50\x1a\xc2\x9d\x78\x03\xa4\x52\xeb\x1e\xb8\x3d\x6a\x32\x0b\x7a\x35\x18\x00\x3a\x39\x16\xd6\xf9\x2b\xc6\x3e\x2c\x86\xe4\x8e\x81\xdc\xf1\xcb\x81\x84\x0d\x2f\x40\xf4\xd7\xc0\x42\xc4\x3e\x41\x59\x72\xc4\xee\x01\xe2\xd5\x5f\xf6\x88\x3f\xcf\x92\x1f\x96\x9b\xdb\x3b\xca\x9c\xda\xea\xca\x05\x42\x61\x8b\x83\xc5\x64\xdc\x1e\xc2\xc3\xd7\xeb\xcb\x9e\x99\xea\x9c\x2b\x21\xbe\x81\x90\x52\xfb\x3e\xe0\x31\x71\x6c\xed\xbb\x6f\xf5\x6f\x3f\xc8\x4c\x0c\x58\xe5\x9b\x7d\xe0\x83\x47\x3a\x75\xd5\x91\xde\x73\xc5\x14\x54\xea\x44\xd0\x96\x56\xd4\x28\x59\x55\x4c\xc1\x12\xb8\xa0\xc6\x4a\x01\x98\x5d\x2d\x82\x69\x80\xe9\xfd\x38\xfc\xe5\xc3\x7c\xc1\xd5\x26\xd8\x75\xb0\xae\xa9\xc6\x4e\xd7\x3e\x03\x1e\xc2\x97\xbe\xaa\x6f\x13\x3d\xc3\x45\xde\x4f\x3e\x18\x78\x28\x96\x38\xf9\xc7\x11\x73\x62\xc8\x8c\xcc\x2d\xa9\x5c\x13\x26\xe8\xb4\xb2\xe6\x48\xc4\xc0\x81\xce\x15\xed\xd4\xc8\xe8\xae\xf7\x6c\x36\x7c\xea\x20\x86\x19\x3f\xf2\xd3\xc6\x46\xf5\xb6\xf7\xc3\x49\x57\x0b\xeb\x7c\x33\x19\x1a\x02\xfb\xcb\x71\x5d\x6f\x88\x7e\x7d\xd4\x0a\x35\x71\xb7\x99\x8d\x6f\x30\x94\xa6\x6c\xd5\x04\xf9\xea\x09\xa0\x5f\x08\x4f\x8c\x0f\xf4\x1f\x33\xc8\x4f\x88\x57\xbe\xb2\x04\xa8\xf2\x85\x92\xb0\x1c\xf9\xdd\xb9\xcf\x1d\x82\x61\x3b\xa0\xcf\xbb\x80\xe7\xf0\x87\xb7\x29\x42\xbe\xf3\x94\x59\xe9\xdc\x35\x9f\x1a\xbe\x2f\x08\xee\x8d\x78\xfc\x0d\xa5\x83\x9d\x98\xfb\x8e\x8b\x32\x14\x71\x7a\x50\x58\xab\xa0\x1d\x9e\x9d\x22\xd5\x79\x68\x7a\x0d\x67\xc2\xd2\x19\xbc\x66\xc1\x55\x39\x6e\xa8\x32\x4b\x0c\x6d\x8d\x7a\x14\x07\x3c\xc7\x0c\x43\x67\xcd\xb4\xb7\x9b\x29\x3b\xcb\xc1\x12\xf8\xb4\x44\x97\x37\x7b\x23\x87\xec\xda\x8c\x0c\x45\x89\xf4\x57\x6f\x46\xde\x76\xed\xd0\x42\x10\xe7\x91\xcc\xc8\x7d\x55\x8c\x93\xfe\x69\xb6\xbb\xba\xb6\x3d\x6a\x75\xbf\x76\x09\x55\x5f\xf0\x57\xb8\x30\xa4\x8c\x61\xc3\x82\x95\x09\x5e\x7e\xfb\xa4\x11\xe1\x33\xab\xb4\x49\x31\x86\xcc\xc7\xc1\xe4\x75\x69\x4f\xce\xd2\x9d\xb8\xf2\x66\xf4\xc0\x83\x60\x8a\xa8\x8c\x86\xee\xe4\x20\xd9\x17\x32\xdd\x41\xef\x2f\x90\xad\x38\xd6\x01\x56\xb4\xdf\x90\x49\x32\x1d\xde\xc2\x8a\x74\x9a\x67\xec\xba\x8f\xce\x02\xaf\x12\x73\x51\xda\x4d\x05\x2a\x12\x38\xf5\x75\x5b\x14\x8c\x85\x90\xa1\x13\x4b\xc3\x4d\xda\xde\xd9\xe3\xa6\xbc\xa6\xa6\x58\x30\x4d\xb4\x84\x5e\xc7\xda\xd0\xaa\x62\x65\x48\x75\x42\x46\x91\x60\x55\xb8\x34\xa8\xc1\x74\x44\xc6\xca\xf0\x29\x8e\x02\x23\x2e\xea\xda\x54\xd4\x05\x95\x66\xad\x28\xb0\x7e\x91\x9b\x65\xc8\x32\x59\x35\x4c\xc1\x0f\xad\x21\xd6\x36\xdc\xf4\x99\x61\xc6\x48\xe4\x53\x0e\xcc\x0c\x87\xff\x12\x8f\xfb\x05\xbd\x62\x5d\xb6\x87\xeb\x12\x69\x4f\xe9\x00\x75\x9b\x81\xd7\x23\xa8\xdc\x11\x5a\x08\xb1\xc2\x2e\x9e\xc5\xc9\xe0\x5c\xe4\x36\x65\xe2\x79\xd8\x8f\x26\x7d\xcd\xc4\x39\x08\xa6\x8d\x66\x26\x80\x78\x0f\xd7\x78\x89\xcb\x9f\xa7\xad\x91\x35\x35\xbc\x80\x10\x1d\x9f\x45\x49\x62\x35\x26\x5e\x58\x49\xe3\x13\xe1\x51\x45\x02\xc5\xcd\xad\x5b\x26\x31\xb0\xd9\x58\xba\x87\x89\x8f\xe6\xda\xad\x72\x7f\x5a\xfd\xb4\x44\xaa\x67\xa6\xf7\xbc\xf0\x88\xc8\xc4\x2c\x14\x63\x84\xd7\x8d\x54\x86\x0a\x43\x4a\x3e\x0b\x18\xdd\x3e\xc3\xf0\x36\x9e\xc8\xe1\x0f\xfa\x09\xf2\x6a\xa3\x51\x30\x60\x5a\x55\xf2\x5a\x13\x73\x2d\x43\xc8\xa1\xcb\xef\x72\x98\xc7\xa3\x3e\x31\x19\x74\x1c\x37\xaa\x3d\xea\x2c\x5f\x45\xe7\xd0\xc8\xca\x9e\x6b\x56\x55\xf6\xbf\xb7\x9d\x46\x83\x71\x4c\x36\xce\x09\x9f\x0b\x84\xa1\xe5\xda\x07\xbf\x1c\x86\xca\x7e\xa9\x64\xd3\xb8\xe4\x87\xfa\x20\xff\x9c\x40\xf2\xba\xba\x62\x1a\x8a\x4c\x3c\xae\x8b\x65\x85\x39\x13\x4c\x51\x03\xe9\x75\xae\x9f\x2b\xa8\x24\xab\x44\x0e\x0d\xfa\xe0\x95\xd1\x2f\xf2\x11\xa6\xc3\xd4\xcb\xcd\x4c\xe6\xef\x71\xdf\x66\x78\x2f\x2e\x90\xdf\xbc\xdc\xc9\xc0\x40\xfb\xdf\x32\x43\x0f\xc8\x0f\x1a\xd9\x22\x9c\xbc\x01\x87\xe7\x93\xbc\x6c\x0e\x6f\x1d\x1d\x6d\x19\x88\x3a\xac\x9a\x45\x44\x55\xec\x97\x0a\x10\x72\xfd\xb9\xee\xd1\x7b\xa4\xa4\xd6\x6f\xfd\x4f\x1e\x90\xf4\x27\x9f\xd5\x47\xae\x27\x9f\xd5\x93\xcf\xea\xc9\x67\x05\xd7\x93\xcf\x6a\xf5\xfa\x5c\x7c\x56\xa4\x3b\xae\x76\x55\x36\xbd\x8d\x4d\x97\xfe\x01\x7b\xcf\xf3\x4c\xc8\x5b\x69\x5c\x8a\x31\x58\xb0\xf4\xc6\xa0\x13\x85\x13\xfa\x9a\x2e\x27\x82\x19\xd7\xc9\xc4\xc7\x77\xdf\x7b\x9a\xfe\xa2\xac\x35\xe2\x5c\x1f\x91\xdc\xf0\x82\xcc\xb7\xb7\x89\x46\x31\x12\x55\xb3\x2e\xe3\x19\x3e\x7f\xa6\x5d\x5e\xab\xfd\x1e\x20\x0b\xe3\x07\x14\x6c\x42\xce\x5d\xad\xcb\xca\xe0\xeb\x4d\x16\x4a\x66\x28\x1f\xd2\xbb\x29\xbe\xbc\x36\x74\x71\x83\x76\xb6\x35\x6d\x87\xe4\xdc\x36\x01\x74\x69\xd7\x5c\xb1\x1d\x88\x5b\x54\x9d\x1b\xd7\xf4\x77\x37\xdc\x57\x86\xcf\xe9\x8c\xbc\x67\x85\xbc\x62\x0a\x57\xf7\xe4\x43\x43\x85\xe6\x52\xbc\xa6\xbc\xb2\x6b\xeb\xd7\xb8\x8b\x76\x93\x56\x33\xd5\x4f\x81\x8c\x52\x34\xc2\x06\x77\x8c\x64\xb9\x77\xb8\x81\x12\xba\x9b\xd8\xf1\x5c\x05\x5d\xa3\xd8\x15\x97\xad\xf6\xc8\x07\xad\x41\x4d\x43\x1b\xe7\x21\x5a\xf0\xf9\xc2\xdf\xec\x2b\x56\x21\xeb\x5a\x95\x61\x13\x0f\xa6\x4c\x1b\x6a\x5a\xdd\x87\x9f\x2e\x20\xf1\x70\x87\xb2\xaf\x02\x1f\xed\x8e\x11\x92\x53\x5d\x47\x04\x8a\x5d\x3d\x10\xbf\x47\x7c\x0c\x7c\xf4\xd4\xed\x65\x0f\xf5\xd1\xc1\x9a\x14\xb2\x6e\x5a\xc3\xa2\x3d\xef\x76\x57\x1e\x51\x7f\x47\x66\xea\xf5\x7f\x7a\x5e\x53\x41\xe7\x6c\x1c\x48\x1b\x77\x28\x1f\xcf\xb3\x49\xfa\x2c\x6c\x45\xb2\x37\xff\x89\xaf\x47\x87\xce\xd1\xbf\xb2\xe1\xec\x91\x7b\xc1\xda\x23\xf9\xf1\xf6\xc8\xfd\x63\xee\x91\x00\x81\xba\xab\x02\xe8\xbd\xa3\x6f\x55\x04\x39\x25\xe3\x36\x11\x94\xd3\x54\x76\xca\x86\xa3\x85\x6b\x22\x6b\x6e\x0c\xf3\xe5\x88\x41\xa4\x8c\x08\x37\x3d\x74\x4c\x27\x40\x21\xc0\x89\xd5\x83\xec\x43\x53\xf1\x82\x9b\xa8\x7d\x5d\x22\x80\xc4\xea\x05\x0e\x84\x6b\xae\x51\x95\x17\x84\xd7\x4d\xc5\x82\x06\x3e\x76\xe8\x42\x3e\x08\x17\xde\xa6\x80\xda\x14\xc2\x3e\x40\x28\x16\x09\x7e\x92\xdb\x77\xbc\x9e\xe4\xf6\x0d\xd7\x93\xdc\xce\x2e\xb7\x11\xbb\x74\x38\x14\x70\x4f\x5e\xfb\x87\xba\xee\x4b\x74\xca\x2a\xf2\x6b\xcb\xd4\x92\x58\x03\xab\xc3\x05\x91\x56\xd8\x69\x5e\x22\x7e\x85\xcf\xe9\xd8\xa1\x08\x41\x4e\xe5\x1c\x72\x46\x4e\x3e\x58\xfb\x16\xba\x52\x64\x3f\x25\x57\x07\xe8\xf7\xbe\xc2\x55\x08\x2b\x13\x5b\xa5\x58\x48\x15\x7f\x02\x26\xe6\xe1\xdb\xe3\x9c\x0e\x8c\x1c\x65\x2a\x24\x5f\xa9\x0a\xb9\x27\x25\x83\x90\xc3\x5b\xe6\x1a\xd7\x24\x7c\x03\xe7\x78\x28\x6b\x0a\xd1\x5c\x72\xc9\x96\x23\x57\xea\x49\x2c\x07\x52\x7f\x73\x26\x12\xb1\x7a\x1e\xd5\x9f\x4b\x86\x79\x1c\xc3\x7a\x95\xf6\xaf\xcc\x07\x62\xce\x50\x1d\x5e\x63\xfb\xda\xd9\x9e\xe5\x97\x28\xcf\x19\x9d\xf9\xcc\x27\xf6\x55\x73\x3d\x6a\x65\xcf\x58\xde\x71\xde\x6d\xe4\x79\xfb\x41\x40\xa3\x0c\x6c\x0e\x48\xa1\x20\xf0\xf3\xb0\x17\xc9\x1d\x4c\xc0\xcb\x2f\xe3\x3d\x4d\x56\x36\x01\x43\x22\x5a\xfb\x78\x86\x97\x6c\xf9\x4c\xbb\x36\x24\x52\xe8\x05\x6f\x40\x7d\x87\x64\x26\x39\xcb\xba\xc5\xf1\xfa\x11\xca\x61\x3d\x31\x78\x6e\x9c\x8a\x11\x79\x2b\x8d\xfd\xcf\x09\x80\x53\x80\x78\x39\x96\x4c\xbf\x95\x06\x3e\xd9\x69\x2e\xc0\x49\x7a\x0c\x3c\xe0\x72\x8e\x38\x64\xfc\xc0\xf1\x8a\xf8\xd5\x80\x55\xe8\xd6\xda\x57\x1d\x05\x7e\xe1\x9a\x9c\x0a\x22\x95\x5b\xa2\x8c\xe4\x80\x6b\x1e\x49\x42\x62\x7c\xbc\xbb\x4b\x0a\xdc\x44\x8d\xe3\x11\xa9\x7a\x2c\xf2\x20\x84\x39\xa2\x20\xea\x83\xdf\x40\x74\x0b\x72\x61\x3d\x74\x01\x80\x5e\x29\x6a\xd8\x3c\x43\x12\x6f\x77\xd5\x4c\xcd\xa1\x4f\x50\xb1\xc8\xbd\x1b\x72\x29\x5a\x78\x65\x54\xb7\xf0\xba\x87\x2d\x7b\xaf\xd5\xc2\x0f\x32\x00\xe8\xee\xdf\x03\xc4\xc7\xae\x7a\xcf\x22\x12\x51\x8b\xad\x69\x63\xe5\xcd\xff\xb3\xca\x2a\x6c\xaf\xff\x21\x0d\xe5\x4a\x4f\xc8\x21\xd1\x5c\xcc\x2b\xd6\xfb\xce\x05\x8b\xa3\xc7\x64\x22\x0b\x72\x59\xac\x7e\x78\x45\x2b\x86\x38\x4d\x54\x10\x86\xee\x2a\xc0\xe7\x5e\x31\x8c\x46\xe4\x7a\x21\x35\x6a\xbe\xa1\xc4\x60\xef\x92\x2d\xf7\x46\x59\x42\x61\x24\x3e\x9f\xed\xa3\x4f\xc5\x5e\xd7\x08\xae\x27\x89\x82\xee\x0f\x19\x8f\x7b\xf0\xdd\xde\xc3\xd8\x63\x8f\xc0\x5d\xf5\x28\x8a\x9c\x5c\xb8\xf1\xa8\xa2\x98\x22\xb0\x6b\xc1\xf5\x55\xfa\x56\x33\x7e\x00\xe9\x3e\xba\xa7\x4b\xef\x70\x28\x67\x3b\x17\xc5\x05\xdc\xe2\x4c\xe0\x19\x19\x98\x0b\xc9\x3a\x34\x46\xf1\x69\x6b\x98\xde\x59\x4e\xb8\x91\xd0\x08\xd6\x2d\xf4\x4f\xb5\x2b\xff\xe3\xa6\x1f\x44\x08\x78\x5c\xe7\x62\x8e\xd3\xd9\x6a\xee\x64\x04\xa9\x1b\xe3\x22\x48\xe5\x10\xf6\xd6\xaa\xf0\xec\xdf\x34\x90\xea\x30\xd4\x87\xa7\x53\x75\xc9\x9a\x8a\xe9\x46\x62\xd5\xd9\xc6\x89\x71\x8a\xe4\x82\x6a\xc8\xba\x9f\xb9\xa4\xa8\xa6\x55\x8d\x04\x2c\x74\x2a\xd6\x36\x63\x16\xdc\x08\x07\x12\xe2\x41\x98\x10\x70\x2e\xec\x5c\xbb\xdf\x43\xff\xcb\xc3\x95\xce\x2f\x52\x41\x33\x09\x57\x18\x20\x4a\x5e\x38\xbf\x10\x35\x44\xa4\x01\x18\xc7\xd7\x66\x06\xf2\x95\x4b\xe8\x16\x08\xf0\xf7\xc8\x4a\xde\x44\x40\xda\x99\x30\x90\x63\x23\xc8\xa9\x98\x31\xaa\xf9\xb4\x62\xae\xb8\x41\x1b\x6a\x32\xcc\x5f\x94\x90\xef\xe6\xd1\x9a\xd3\xa0\x45\x70\xa3\x57\x93\x6b\xf6\xb9\x28\xaa\x16\x78\x40\xf0\xea\x00\x5c\xd8\x54\x14\xac\x42\xdd\x46\x96\x01\x8d\x2b\x1b\x5e\x44\x94\x48\x34\x63\x4a\xe1\x7c\x4d\x97\x9b\x77\x33\x29\x25\xc3\x54\x64\x00\x52\x19\xe1\xeb\x6d\xae\x90\x71\xcb\x30\xfc\x80\xc1\xd9\xa2\xe4\x8c\xe1\xee\xc0\x95\x21\xd4\x1e\x25\xb3\x0a\x71\xe0\xdc\x59\x02\x33\xe4\x2a\x1d\xce\xa3\x8c\xa1\x11\x82\x82\x3a\xec\xce\xb8\xf1\xe7\x60\xf2\x1c\x40\xe6\xb6\xce\x2f\x5c\xa6\x71\x27\x99\xc6\x70\x7c\xb1\xc1\x81\xc7\xcc\xe7\xd7\x9b\xc1\xfd\xbd\xef\xeb\xc0\x82\x36\xd1\xbe\x25\x46\xaf\x55\x57\x57\x23\x7d\x4f\x3a\xcb\x8f\xb0\xe9\xe5\x8c\xbc\xe6\x15\xd3\x4b\x6d\xb0\xf8\x91\xd7\x28\xb8\xb0\x3c\x54\x1a\x82\x52\x01\x93\xe9\x50\x70\xd9\xd3\x2c\x4f\x20\x2b\xdb\x0a\x67\x57\x49\xba\xc7\x7a\x9d\xd2\x57\x65\xaf\xc1\xd6\xae\x4a\x20\x28\xd9\x0d\xf5\x50\x59\x56\x6b\xd0\x6c\xcd\x92\x60\x1d\x7b\xb3\x31\x2b\xfa\xbe\xd8\xd7\x7c\xaa\x18\x39\x5a\x50\x21\x58\x15\xf5\x8b\x74\xa9\x1b\xd4\x18\x5a\x2c\x50\x9a\x53\x62\x25\x49\xc5\xcc\x33\x4d\x16\x52\x1b\x52\xd3\x62\xc1\x45\x68\x34\x25\x42\xdf\xd4\x0e\x05\xf8\x11\x02\xdd\xcf\xf4\x85\x25\x20\x71\x9d\x73\x09\x17\xa4\xc2\x73\xec\xac\xdb\xd8\x20\x55\x8c\x24\x90\x06\x94\xa1\xc9\xde\xda\xb3\x43\x0f\x68\x2f\xa5\x60\xad\xd1\x53\x00\xe7\x26\xdc\x9b\x3e\xf2\xc9\x87\x09\xd9\x63\x1f\xcc\x37\x7b\x23\xb2\xf7\x61\xa6\xed\x7f\x84\x99\xe9\xbd\x09\x39\xad\x43\xa2\x10\x17\x91\x1a\xc1\xdc\x0f\x08\x9f\x91\x56\x0c\x2e\xea\x1c\x2c\xb1\xaa\x56\x64\xe1\x8f\x67\x55\x2b\xec\x12\xbf\x73\xad\x98\x5f\x91\xd7\x47\xc4\x50\x35\x67\xc6\x8e\x41\x44\x5b\x4f\x99\x4a\x6d\xd9\x9a\x23\x71\x64\x78\x9b\x7d\xc5\x68\xf9\x4e\x54\xc9\xb1\xbd\x5c\x1b\xca\xd3\xd1\x9f\xef\xe3\x28\x71\x6d\x46\x2b\xcd\xc8\xbe\xbd\xf1\xf9\xb5\xe2\x86\x1d\x4c\xc8\x7b\xff\x2b\x28\x7f\x07\x5d\x74\x26\x87\xe8\x7b\x58\x35\xe2\x1e\xaa\x99\x41\xcc\x62\xe1\x6c\x90\x37\x76\x53\x27\x6b\x81\xb8\xe0\x53\x29\x2b\x96\x08\xe9\x8e\xbc\xf7\xd3\x4f\x6f\x93\x5d\x63\x7d\xfe\xee\x9e\x77\x13\x9b\x5f\x4b\x55\x95\xd7\xbc\x74\x85\x47\x64\xdf\xde\x7c\x30\x8c\xe5\x87\x84\x16\x06\x06\x12\x72\xb7\xb5\xcb\xe3\xc3\xbf\xbe\xe6\x65\x9e\x15\x1d\xb0\x01\x81\x88\x3e\x0f\x78\xc7\x88\xe5\x01\x02\x4c\xc0\x4b\x26\x8c\x15\xee\x4a\x93\x7d\xf8\x45\x3a\x8e\xe6\x09\xc7\xbe\x27\x30\xae\x54\xa4\x90\xf5\x94\x8b\xae\x2d\x51\xc7\x9b\x56\x81\xb1\xf2\xd6\x47\xdc\x34\x33\xd8\x4b\x00\x50\x0d\xa5\x59\x10\xcd\xeb\xb6\x32\x54\x30\xd9\xea\x2a\x19\x4e\xe3\x89\x3d\xd7\xae\x59\xc5\x3e\xa0\xec\xdb\x56\xd3\xc5\x8e\x82\xbe\x66\x0c\x48\x15\x5d\x67\xb8\x55\xd5\x38\x69\xac\x0e\x1e\xa9\x7c\x1e\x54\xeb\xd0\xe7\x84\x7d\x60\x85\x43\x51\x6d\xaa\x76\xce\x13\xbd\x33\xc7\xf6\x2d\x0a\x6a\x58\xf9\x8a\xbc\xee\x5e\x0e\x30\xba\xfc\x37\x13\x72\xe4\x73\x1a\xdd\xf0\xe4\xe8\xfc\xf4\xd8\x35\x07\x13\xda\x30\xba\x0d\xdd\x7d\x58\x02\xd5\xd8\xb9\x62\xb7\x60\x34\xe0\xc0\x59\x44\x6c\xd7\xa1\x6d\x35\xfe\xe1\xbe\x71\x9d\xb7\x43\x07\xe5\x61\xcd\xac\x06\x8b\x84\x27\x7b\x69\x6b\xf6\x52\xdc\x70\x39\x22\xab\x64\x0d\x13\xf6\xcc\x13\xf1\xfe\xc7\x79\xde\x1a\x9b\x48\x58\xe3\x4c\x7a\xa5\x7b\x58\x5f\xa9\x8c\x7c\xe4\x0b\x59\x95\x9a\xb0\x0f\x46\x51\x7b\xec\xd7\xf6\x80\x0f\xbf\x99\x11\x2a\x96\x93\x61\x2a\xe6\xa0\xb0\x74\xde\x50\xf4\xe0\x95\xd9\x6d\x0b\xad\x7c\xb2\xd0\xe2\x4b\xb3\x42\x31\x33\x00\x46\x2d\x5b\xe3\x7f\x4f\x48\x7f\xb9\x7a\x1f\xaf\x39\x58\xf1\x5b\x0f\xd2\xe0\xd2\x4a\x86\xf8\x8d\x35\x13\x9a\x1b\x7e\xd5\xeb\x0e\x0a\x30\xa8\x54\xeb\xe0\x87\x04\x65\xca\x09\x40\xdd\x43\x28\x4d\x1e\x18\xe3\x93\x7c\x46\x84\x5c\x79\xab\x18\xba\x22\xc4\x09\x7b\xb7\x24\x0f\x1a\xf2\x70\x6a\x6c\xac\x4d\x05\x00\x1e\xe2\xc3\x47\x80\xb5\x86\xff\xc6\x54\x1c\x3b\x07\x91\x37\x16\x66\x21\x7d\xa6\xdd\xec\x6d\x4f\x6c\xe6\x48\x39\x1f\x8a\x50\x93\x33\x76\xf4\x36\x52\xed\x3c\x38\xc9\xb0\xf0\x42\xbf\x93\x1c\x9b\xcd\x58\x61\xf7\x06\x74\xaf\xf3\xad\xd8\xac\x59\x5b\xb6\x08\x00\xe2\x01\x49\xfb\x80\xa2\x43\xa1\xf7\x22\x98\x89\x2e\x7b\xf5\x54\x68\x43\x01\x23\x12\xde\xd8\xea\x69\x56\x79\x72\xfd\x07\xdd\x76\xc2\xe8\xb5\x47\x9a\x1c\x48\x44\x6d\xd5\xb0\x82\x29\xbb\x63\xaa\x25\xb9\x56\x72\x68\xd1\xd6\x1d\x63\xab\xf2\x8a\xa9\x2b\xce\xae\x9f\x3b\xc4\x9a\xb1\x7d\xd9\xb1\x03\x01\x7c\x0e\xee\xae\xe7\x5f\xc0\x7f\x06\x50\x95\x29\xfa\xe6\x4e\xd9\x57\x64\x6f\x2f\x87\x5f\x60\x70\xea\xda\x0c\x9a\x70\x26\x19\x54\x79\x7c\x02\x30\xfc\x4a\xa8\xcc\x7d\xe8\x1c\x02\x9f\x12\x1a\x73\x67\x4d\xa4\x90\xdb\xcd\xee\x1f\xe4\xda\xb7\x10\x6d\xf9\xa4\x03\x59\x6a\x85\x48\xae\x2f\xec\xdb\xfe\x38\x4c\xcf\xf0\x0f\x09\x9e\x5c\x8c\x8d\x62\x2c\xbc\xaa\x71\xe6\x93\x90\xbe\xf1\x79\x30\x6c\x1e\x61\x10\xaf\xa4\x86\x6a\x66\x86\x04\x93\x73\x89\xfa\x88\x14\x3b\xbf\xb1\xd4\x77\x5f\x41\xbe\x15\x03\xa4\x6a\xdf\xdb\x91\x8c\xff\xe4\x4c\x7f\xd1\xbb\xd3\x1a\xfd\x6e\x5d\xd3\x4f\x72\x44\x24\x82\x6e\x2d\xe8\x03\xc2\xb1\x3b\x26\xd9\x96\x8d\xe8\xde\xf2\x87\x1f\x4e\x8f\xf3\xb8\x52\xba\xe7\x79\xcf\x00\xfc\xbb\x3f\xfd\x6e\x93\x72\x4d\x5a\xc1\x7f\x6d\x63\x27\x34\x74\xed\x0f\x1b\xc9\xdd\xbf\x8d\xd9\x99\x17\xac\x4b\x4e\x38\xe6\xfa\x72\x5b\x92\x71\x8d\x90\xbe\x8c\xfc\xcb\xd1\x09\x71\x9f\xde\x96\x49\x90\x34\xf4\xc3\x64\x1f\xf4\x65\xe8\x5f\x8e\x4e\x56\x5e\x77\xc5\x8d\x7a\x58\x55\xde\xd7\x23\x85\x0e\xa0\x9e\x4e\xba\x66\x9a\x62\x90\xcd\x56\xa3\x57\xac\xe4\x0a\x53\xd5\xfc\x5b\x96\x93\x42\xf3\xd0\xf4\x6c\x7e\xc9\x26\x5c\x46\x69\xa9\x69\x53\x30\x28\x8b\x4c\x7f\x31\x2f\x58\x97\x10\x5d\x72\x7d\xf9\xf8\x3c\xc9\x4d\xf9\x36\x0d\xe4\xf6\x73\x4b\x3f\x59\x75\x77\x3a\xd9\xe9\x94\x20\xd8\xdd\x4b\xd9\x92\x6b\xd7\x7b\x7c\xa0\x9b\xf5\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x85\xee\x2a\x09\xd6\xc2\xbe\x77\xa7\x2b\x34\xd9\xd7\xaf\xb6\x9c\xaa\xb2\x13\x5b\x91\xe4\x38\xdb\x1b\xaa\x0c\x78\x3d\xb7\xcd\xda\x81\x10\xaf\x12\x44\x1f\x88\xfb\xe4\xed\xd3\x99\xc7\x50\x1a\xb9\xde\xb0\xe8\xb9\xe7\x3a\x3c\xbc\xcb\x98\x06\xed\x2f\x07\xff\xbe\x96\xc1\x62\x79\x5e\xb2\xab\xe7\xba\xa4\x2f\x47\xf0\x5a\x1e\x03\xb2\x3f\x07\x54\x93\xbd\x97\x7b\xe9\x23\x9f\xf3\x9a\x57\x54\x55\xd8\x13\x25\x34\x9b\x09\xcf\xb7\x27\xa4\x27\x04\xca\xce\x5e\xec\x91\x7d\xa9\x80\xa2\x82\x0a\x52\x31\xdf\x3f\xc5\x49\xd2\x25\x3a\x07\x0e\x3e\x93\x2d\xb4\xed\x7c\x2c\x3c\xd8\xb6\xbe\x09\x4b\x6f\x0f\x39\x9d\x3b\x8e\x73\x9e\x1d\x77\xea\x23\x17\x56\x07\x9b\x90\x1f\x9c\x66\xe7\x74\x73\xe4\xda\x12\x14\x32\xbc\xe3\xf3\xe0\x8e\xcf\x29\x8c\xb3\x12\x90\xb9\xd7\xc0\x0a\x59\xcf\xe4\xfb\x4c\x38\x22\x35\x58\x34\xe7\xe6\x3d\x6b\xe4\xd6\xec\x44\x1c\x7e\x25\xa5\x86\x1b\xfb\x81\xd4\xdc\x48\xb5\x24\xd4\x10\x8a\x27\x43\xd1\x56\x54\x11\xc5\x30\x39\x26\x83\xd9\xe6\x46\x5f\x31\xd6\x2e\x64\x97\x81\x13\x63\x18\x3a\x37\x74\xa0\x6f\xe4\x4e\xe3\xc4\x18\xdd\x89\x3d\xaf\x8e\xb9\xb2\x52\x5a\x62\x55\x18\x37\x47\x61\x30\x84\x53\xaa\xa4\x70\xd0\x46\x76\x44\x97\x85\x33\xe7\xc6\xb5\xd8\x45\x02\xec\xd7\xfe\x69\x49\xa4\x00\x05\x20\x53\x65\xf9\x4c\x77\x6f\xfc\x08\x73\x7b\x3a\xc6\xd9\x86\x3f\x11\xcc\x6e\xa9\xb6\x2e\x5d\x03\x21\xa1\x49\x04\xe6\xd1\x76\x9f\x0f\x53\x1c\x21\xcf\x45\xc8\x10\x9c\x25\x58\xc3\xa8\x0c\xee\x91\x67\x93\xc9\xb3\x09\xa8\xb2\xcf\x26\xcf\xbc\x21\x56\x85\x72\x58\xa7\xed\x75\xc4\xf8\x22\xca\x21\x80\x05\x7d\xa9\x31\x21\xe4\x9d\x47\xfd\x84\x76\x96\x2b\x15\xb9\xa1\xd8\xb6\xaa\xc2\x3b\x40\xd3\x95\xbe\xec\x19\x10\x09\x85\x78\x6e\x3b\x8d\x5f\xd2\x15\xf6\xce\xf9\x95\xeb\x06\xb7\xb5\x34\x9b\xee\x15\xb3\x70\x6a\x3c\x63\xce\x81\xfa\xfe\xfb\xed\xbd\x1b\x8a\xee\x4c\x6f\xe6\xce\x01\xf7\x5e\x85\xac\x6b\x6e\xc8\x82\xea\x45\xf0\xe2\x75\x9d\x71\x86\x1d\x4d\x43\x9d\xbf\x55\xab\x0d\x53\xb3\x24\xd9\x95\xe5\x30\xf7\x04\xac\x38\x7b\xc3\xc7\x0e\x93\x58\x74\xae\x18\x38\xe4\xf4\x82\x2a\x66\xef\x6c\xe0\xf4\xa9\xf8\x8c\x19\x9e\xba\x39\x7a\xe7\x7b\x18\xf9\xf6\xe0\x56\x47\xf8\x6e\x85\xb7\x86\x9e\x85\x4c\x94\x8d\xe4\xa9\xad\x1a\xc6\xa4\xa1\x26\xa5\x21\xea\xd0\x53\x34\x90\x9d\x65\x07\x87\xa7\xf9\x2d\xec\x3f\x40\x63\x12\x38\xd0\xf5\x5f\x89\x18\xc6\xc8\x46\x56\x72\x3e\x30\x87\x7f\x90\x23\xcc\x2c\xb6\xad\x45\x58\x1a\xfc\xac\x75\x53\x13\x7c\x35\x66\x00\xda\xd7\x06\xe3\x89\x39\x67\x94\x6f\xd9\xe3\x0c\xa5\xe7\x61\x77\x3e\x7f\x7f\x72\x78\xfc\xe6\x64\x52\x97\x5f\x20\x06\xc4\x98\x8e\x1b\xb9\xb5\x30\xe4\xa3\xb0\xa4\xd7\x96\x0d\xbd\xcf\x20\x89\x59\x89\x3a\x89\x7d\xc0\x18\x30\x9b\x1a\xa6\x6a\x8e\xb8\x52\xbb\x6a\x62\x6f\x85\x4b\x52\xad\x6b\x7b\xc6\x9d\x25\x6e\xe4\x1c\xec\xe1\xc7\xef\x1f\xc8\x8d\x62\x63\x00\x92\xb0\xb6\xe4\x8c\x57\x00\x44\xd3\xe9\xa9\xd1\xf9\x9c\x34\xa8\x8f\xb8\xfa\x90\x2e\x3e\xb9\x5a\xae\x46\x5e\x3b\x2b\x33\x44\xd6\xb1\xed\x6b\x55\xa5\xd5\x3d\x01\x96\x8f\x55\xca\x5c\x14\x88\xce\xe1\x85\xa5\x72\x1d\x04\x1b\xc5\xaf\x78\xc5\xe6\x96\x84\x05\x17\x73\xdd\x75\x20\x72\xc9\x68\x49\xc3\x02\xc6\x10\xeb\x74\x9a\x90\xd4\xf3\x06\x52\xcb\x02\x38\x3f\x6e\xcd\xb7\xef\x2e\x88\x60\x48\x42\xe2\x26\x1b\xe8\x78\xb2\x44\x26\x9e\xec\xdb\x8e\xb6\x6e\x47\x1f\xd9\x99\xa3\xd8\x27\xa4\x6c\xda\xaa\x83\x02\x4e\x18\xdb\xc1\xc3\x9e\x12\xbd\xac\x2b\x2e\x2e\xa1\x65\x87\x3b\x4e\x5c\xfb\x3b\x46\xec\x17\x7e\x03\x2b\x46\xab\xfc\x6a\xc0\x03\xb1\x32\xc9\xa1\x02\x98\x1d\x88\xc1\x83\xc9\x62\xa5\xde\x5f\xbd\xb0\x47\x4f\x79\x96\xf3\x3b\x39\xcf\xf3\x51\x2f\x2d\xaf\xe9\x7c\x6b\x85\xa6\x30\x78\xef\xc0\x16\xe4\xdd\xd1\xa9\xaf\x1b\xd8\x8f\x1d\xd2\x78\xaf\x54\x84\x2a\xc3\x67\xb4\x30\x07\xa4\x69\xab\xca\x99\xb8\x5e\xc9\x73\x52\xe2\x86\xdc\xd3\x24\x22\x2f\x3a\x17\x1a\x14\x70\x68\x59\x5d\xd9\x51\x8d\xb5\xe1\xd1\x13\xd8\x36\x2e\xa1\x15\xa0\xd9\x04\xb9\x5e\xf0\x62\x41\xce\xda\xaa\x3a\x93\x15\x2f\x96\xa1\x81\x3b\x3a\xdb\x4b\x7b\x2c\x24\x9e\x0b\x87\xd5\x35\x5d\xea\x57\xf1\x5b\x12\x0a\x9f\x11\x6a\x0c\xab\x1b\x64\x66\x3b\x35\xab\x2d\x3a\x3b\x7f\x3b\x28\x8b\xdc\x12\x0a\x22\x8f\xf2\x2a\x48\xc6\xd6\x7d\x90\x78\x5e\x8f\xc9\x5b\x76\xc5\x54\x9f\x3e\x61\x3f\x82\x47\xeb\x3e\x4d\xb0\x74\xa0\x8d\xb7\x1a\xbc\x22\xd8\x33\x7e\x6d\xa9\x3f\x42\x3b\x9f\xad\x3c\x96\x6b\xf1\xcc\x10\xc7\x55\xa9\x2f\x72\x3a\x7b\x2b\xcd\x19\x3e\xa3\xff\x3e\xf8\x26\x37\x8c\x4a\x2b\x6b\x63\x2c\xfd\xe8\x96\x1d\x4a\xae\x2f\x07\xbd\x42\xf0\xe2\xc4\xcb\x33\x94\x99\xe7\xcc\x58\x76\x1e\x07\x8e\x76\x34\x58\xae\x86\xef\x4a\xfb\xb2\x6e\x7f\x29\xe6\xa0\x08\x47\x8e\xb9\x6b\x46\x85\xc7\x1b\x64\xd7\x44\xb1\x5a\x1a\xd4\x73\x2d\xbd\xce\xc9\x5d\xc8\x9a\x11\x7a\x45\x79\x45\xa7\x15\x64\xee\xda\x87\xbb\x67\x25\xfb\x0e\x0f\x61\x06\x20\x1f\x4a\xfa\xfd\x68\xb9\x25\xf0\x3c\xf2\x8f\x83\x01\x8f\x37\x29\x92\x55\xc9\xe2\x32\xd6\x55\x67\x4a\xd6\x78\x0b\x56\x9d\x97\x50\x09\x45\xcb\x92\x68\x3e\x17\x00\x0c\x28\x0c\xa9\xa8\x61\xa2\x58\x4e\x88\x6b\x2c\xda\xc1\x21\x2a\x66\x14\x0f\x55\xeb\x42\xaa\x9a\x56\x7e\x92\xa7\xb4\xb8\x94\xb3\x19\x3c\xb5\xbb\xdf\x25\x6a\x39\x61\x85\x73\x42\xb5\x14\x38\x38\xd3\x9a\xce\x07\x08\x2b\xe8\x18\x6e\x15\x28\x57\x58\x81\xab\xe4\xa0\x42\xbd\xa0\xf4\x38\xa0\x3e\x75\x5f\x79\xa8\xb6\x0e\x8a\x2d\xf0\xab\x6a\x85\xe1\x56\xfc\xf5\x7a\x89\x11\x88\x18\xae\x25\x9e\xda\xa1\x5c\x63\x36\x00\x8f\x70\x10\x6b\x50\x8a\x75\x05\x5d\x07\x90\xbe\xb5\x7c\xb5\x55\x51\x0f\x55\x3b\xe9\xb3\x10\x9d\x23\xc0\xcd\xfe\xc5\xb9\xa5\xda\xc1\x5c\x77\xda\xe5\x3e\xe0\xbe\x75\x4c\xf1\xf7\x2f\xff\x31\xb9\x8a\xa3\xf0\xf0\x73\xab\x72\x1c\x58\x7a\x6b\xa6\xe6\x88\x82\xc6\x48\x4d\x05\x9f\x31\x6d\x39\x64\x69\xd9\xc9\x45\x57\x34\xad\x19\xb9\xb6\x8c\x84\x39\xb0\x2b\xaf\x97\x28\x5f\x2f\x56\xe2\x39\xd1\x8a\x76\xae\x8d\x7d\x25\x0f\x60\x2d\x00\xc0\xff\x03\x2b\x5a\x03\xfb\x0f\xb2\x06\xc9\xbe\x90\xf6\xb3\xc4\xec\xa1\xf3\x76\x8a\xea\x33\x0c\xbb\xf2\x6a\x58\x64\x07\x0d\xf5\xc3\xea\x7e\x74\x66\x75\x3b\x6d\x70\x5e\xd9\xcc\xea\x51\x2f\x27\x5f\x7f\x9d\x3e\x39\x58\xeb\x05\x63\x6a\x56\xb4\x8a\x9b\xa5\x15\xbc\xec\x83\x99\xcc\x34\x74\xd0\x3f\x02\xb8\x55\x77\x30\x2f\x28\x38\xc0\xb1\x30\x0c\x37\x64\xb7\x29\x2c\xa3\x3e\xc2\x4a\x8f\x26\xe8\x1d\xdb\xd6\xd7\xdd\x24\xcf\x9c\x70\xb6\x3b\xa6\xdb\x96\x7a\x42\xce\xa4\x46\x64\xd8\x80\xad\x3e\xa0\x14\x71\xc7\x35\x23\x7b\x7d\x26\xba\x11\x01\x4b\x7a\xb7\xb5\xa3\xd4\xf7\x8a\x2d\x42\xe4\x28\x3b\xfa\x2b\x68\xbb\x65\x88\xa1\xf3\x95\x46\xfc\x52\xf5\xa6\xa2\xeb\xbf\xb9\xc5\x78\xb7\x9b\xa5\x6d\xef\xfe\xf7\xde\x05\x46\x4e\x57\x99\xb6\x5f\x07\xef\x10\xcc\xd3\x17\xed\x5b\xb6\xa0\x57\x6c\xe3\xd1\xdb\xc8\x72\xb2\xe1\x04\x82\x6d\x94\x3e\xa0\x35\xed\x42\x61\x79\x80\xc5\xd6\x9a\xd5\xd0\x60\xfe\x06\x15\x60\x93\x96\x33\x5d\x92\x4a\x4a\x80\x54\x6d\x1b\x22\x64\xc9\xec\x06\x80\x94\x4e\x5a\xe9\x11\x39\x3f\x74\x37\x36\xd1\x90\xd8\x94\x02\x34\xdb\x86\x15\x1b\x6e\x78\x30\x2f\x55\xd4\x8f\x15\xd5\x9a\xf4\x3a\x87\x5e\xa5\xb6\x74\xf0\x09\x50\x1b\x05\x1e\x39\xd7\x0c\xbf\x62\x57\x0c\xd2\x58\x66\x7c\x4e\xb0\x3d\x6c\xed\x9a\x87\xf8\xec\x71\xa9\xa0\x5d\xa5\xe2\x65\xba\x63\x68\x55\x5b\xb3\x4b\x7a\x2d\xd5\x65\x25\x69\xe9\xab\x54\x2b\xab\xf0\x54\xfc\x92\x91\x63\xd6\x54\x72\xe9\x3a\x7e\x88\x92\x9c\x1b\x6a\xd8\xac\xad\xce\x07\x2c\xc5\x30\xaf\x8e\x2e\x34\xdf\x9a\x57\xc7\x0e\xbe\xe2\xd5\x39\x3d\x3f\x3a\x3f\x7d\xf4\x75\x70\xc3\xfc\x7c\xcf\xbf\x80\x99\x79\x7c\xb1\x08\xfe\x6b\x5a\x6a\xd8\x98\x54\x6d\xea\x2f\x31\x89\xef\x4c\x2a\x43\xab\x2d\xe8\xd0\xc5\x82\x36\x87\xad\x59\x1c\x73\x5d\x58\x61\x92\x47\x95\x5e\x7b\x6a\x04\x8f\xce\x20\x6e\xe7\xec\x26\xc2\xfd\x7e\x71\xf7\x1d\xfd\xf5\xf0\x8c\xd0\xd6\x72\xb3\x71\x8d\x0a\xb6\x12\xe5\x25\xd1\xdc\x9c\x63\x5b\xa6\xac\x33\xe3\x9e\xf9\x91\x79\xf1\x77\xed\xd2\xac\xec\x5a\x95\xe2\xa6\x32\xc1\xa7\x4a\xc5\x47\x55\xa9\x98\x7a\x5c\x90\x1c\x66\x04\x17\xdc\x70\x6a\xa4\xda\x85\xe2\xa8\x1e\x31\x21\x3f\xb5\xd5\x46\xd6\x4e\x24\x9c\xfa\x3b\x00\x4e\x62\x50\x84\x78\x6d\xb0\x2e\xe9\x15\x72\x88\x60\x59\x4e\x85\x61\x6a\x46\x0b\xb6\x02\x84\x3b\x02\x77\x38\xd2\xc4\xfd\x3d\xc9\xd4\xfc\xd1\xe5\xb2\x37\x70\x0e\xfe\xe9\xd5\x1f\xa3\x52\xc8\x3f\x05\xc3\xc3\xb9\xe6\x63\x1b\x43\xb0\x62\x48\x33\x9b\xe1\xdc\xf3\x6b\x9e\x73\x81\xff\x2a\x56\xd2\xfa\x71\x6a\xff\xb3\xa5\x15\x2e\xc9\x90\xe5\x1e\xfe\x9a\x3d\x56\xd8\xfa\x2e\xe9\x33\xa6\x9b\xb7\xc0\x85\x08\xb4\x02\x92\x19\x5d\x4a\xc2\x4d\xa6\x51\x54\x68\xcb\x62\x79\xdc\x26\xcf\x9c\x21\xf6\x8c\xec\x9b\xa2\x49\xae\x52\xcd\x80\xe3\x14\x30\x9c\xdc\x3f\x92\x1e\x93\xab\xb5\x41\xd5\x8a\xd8\x28\xc2\xa9\xbf\x40\xa6\xfe\x3e\xb4\x36\x18\x36\x5b\x5b\x2f\xa5\x05\x39\xb5\x75\x60\x75\x47\x46\xd8\x01\xf1\x54\xa3\x49\x41\xbe\xe7\xda\x20\x5c\x2c\xde\x0c\xf0\x70\x08\x8f\x6e\xcd\xd5\x33\x22\x15\xe1\xcd\x7f\xd1\xb2\x54\xaf\x50\xf3\xf4\xd1\x51\x95\x8e\x56\xc8\xb5\x4b\xcf\x03\xa0\x42\xef\xaf\xd8\x37\xcb\x86\x17\xb4\xaa\x96\xe4\xe2\xe8\x0c\x46\xd0\xe4\x0f\xbf\x7b\x01\xf6\xeb\xd7\x5f\xfd\xee\xc5\xc0\x2d\xf4\x84\xae\xbe\x72\x3d\x8a\x6c\xe6\x47\x50\x17\xbc\x6b\xd8\xad\x3d\xa4\x55\xe8\x45\x69\xed\xc3\x73\x04\x1a\xb5\xca\x91\x3b\xee\x50\x10\xd8\xdd\x15\x54\xbd\x9c\x56\xe4\x13\xa4\x67\x74\x3d\x41\x7a\x3e\x41\x7a\x3e\x41\x7a\xde\x7c\xc5\x7e\xce\x6d\x9f\x47\x31\x2d\xd0\x2e\x71\x5d\x6f\x42\x95\xe9\xec\x73\x57\x99\x12\x59\x2d\x55\xf0\xe6\x58\xc0\x18\x2e\x66\x48\xff\x8b\xae\xad\xc3\xf1\xdb\xf3\xff\xfa\xfe\xf0\xdb\x93\xef\x61\x56\x1d\x2a\x8d\xdd\xde\x5c\x3c\x68\x18\xe5\x5e\x45\xcc\xb0\xf5\xde\x5e\x01\xb2\x58\x29\x3d\x16\xe4\xed\xeb\xf3\x3b\x56\x1d\x6f\x21\x06\xf6\x85\x98\xa5\xaf\xd2\x63\x2b\xc6\xb1\x3f\xd5\x4c\x6d\xa7\xff\xce\xce\x54\xf2\xf8\x30\x2f\xfb\xd0\xf7\xfa\x5b\x7e\xc5\xd9\xd9\x9a\x83\x3d\x8d\x19\xc9\xbf\x4d\x45\xad\x5d\x22\x5c\xb6\x47\x5f\x4b\xfb\x90\x6c\x31\xcc\x22\x56\xb9\xda\x66\x0d\x6a\x65\xa2\xa2\x8e\x5b\xf6\x20\x41\xf5\x42\x59\x35\xcf\x2a\x78\x4c\x6b\xaf\x6c\xfc\xfb\xee\xe3\x66\x53\x7b\xfe\x6d\x29\x04\x1b\x89\x71\x0d\xfb\x31\xdf\xa6\x57\x18\xdd\x4b\xc0\x4b\xcb\xba\x59\xed\x0d\x0e\x23\xf6\x72\xdf\x40\x29\x6b\x68\x91\xaa\x8a\xa6\x71\x45\x37\x13\x63\xcf\x20\xdd\x47\xf8\x09\x34\x2e\x7f\x84\x8a\x08\xd0\xbd\x25\x18\xe6\x30\xf6\xb6\x85\x53\x20\x64\xb5\x23\x20\xbd\x0b\x4b\x12\xaa\x43\xf5\x0d\x56\xee\x64\x68\x1d\xb8\x93\x3c\x4b\x3e\x4b\x7d\xe5\xa7\x07\x76\x97\x6f\xd3\x55\xde\x2c\xa4\x91\x62\x37\xda\x1d\x6c\xa2\xa5\x7f\xb4\x9c\xc1\x1d\x47\x21\x49\x36\x3a\x9a\x10\x9f\x36\x24\x7c\xae\x54\xee\xba\x34\xce\x1c\x45\xbb\x31\x34\xd6\xd9\x26\x8a\x6f\x47\xc9\xda\xf8\x92\x9f\x17\x60\x56\x53\x9e\x1e\x6f\xe1\x14\x79\x0c\x69\x72\x9f\x69\x6f\xd4\x07\x4a\x7b\x1b\x0e\x07\x56\x66\x6a\x76\x63\x1f\xe4\xd7\xf8\xf4\xd8\x39\x22\x7c\x27\x1b\xed\xe4\x02\xb9\x59\x50\x6d\xc5\xa6\x90\xca\x5c\x4b\xb5\xe5\x0e\xe0\x7d\x2a\x56\x20\x95\xdc\x77\x6b\x5d\xbf\x1e\x48\x9a\xf7\x49\xbb\x53\xf3\x99\xd5\xf7\xb2\x2b\x95\x44\xd0\x0d\x9d\x67\x3e\x94\x13\x3f\xc2\xa4\x90\x75\xd4\x74\x86\x5c\x2f\x18\x6a\xa1\x47\xe7\xa7\x6f\xf8\x1c\x09\xf4\xef\x42\x66\x8c\x9a\x56\xb1\xf1\x9c\x9a\x34\x82\xb8\x26\x69\xd9\x7e\x5b\x3e\x85\x90\x87\xfe\x9d\x4f\xa2\x73\x38\x89\xa2\x1d\x76\xdb\x89\xf4\x39\x1c\x48\x8f\xe7\x20\xda\x39\x9b\xe7\xa9\xf3\x73\xef\xf2\xc2\x23\xcb\xfa\xf8\x87\xb9\x40\xa7\xe5\xcd\x4e\x55\xa0\xe1\xd8\x71\xf7\x6d\x45\x35\x50\xf2\xbf\xe1\xbc\x19\xac\x15\x84\x27\x61\x7e\x1f\x1c\x93\xb4\xaa\xec\xca\x4a\xc1\x42\x85\x9e\xee\xea\x4d\xb1\xe0\xb2\xa6\x8d\xab\x3d\x2d\xe5\xb5\xb8\xa6\xaa\x24\x87\x67\xa7\x0f\x7f\xea\x0c\xc6\xae\xc7\x7d\xf4\x46\x96\x5b\x97\xff\x11\x29\xa0\x55\x00\xa2\x88\xfd\x63\xca\x8d\x46\x98\x47\x00\x5d\x34\x71\x90\xc5\xaa\x57\x21\xe9\x1f\x40\x3d\xa6\x41\x38\x64\x30\x5a\x04\x91\x85\xa1\x95\xcb\x54\x9a\x32\x73\xcd\x98\x20\x2f\x5e\xbc\xc0\xfc\x8a\x17\xbf\xff\xfd\xef\xa1\x98\x9b\x94\xac\xe0\xf5\xfa\x8d\x70\xd7\x6f\x5f\xbe\x4c\x27\xe5\x6f\x87\x6f\xbe\x27\xb4\x00\x1f\x19\x99\x4a\xb3\x70\x14\x01\xeb\xc5\x83\xea\x11\xf9\x3f\xe7\xef\xde\x7a\x3d\x44\xaf\x7c\x0b\x9c\x1d\xa6\x73\x80\x0f\xc8\x01\xc5\x70\x80\xfd\xe9\x32\x20\xa8\x59\x04\xc8\x13\x0a\x99\x68\x11\xb4\x8e\x93\x97\x03\x0a\xaa\xa0\x2b\x3b\x9f\x2f\x60\x59\xb8\x80\x5d\x58\xf1\xc2\x75\x1e\xc0\xbc\x18\xac\x94\xf6\xf8\x9e\x88\x63\xe2\x55\x88\xe4\x91\xed\x94\x8d\xb0\xb6\xd9\xa1\xa6\x8c\x82\x8f\x44\x31\xdd\x56\x06\x3a\x53\x4d\x99\x23\xa2\xe3\x58\xcd\x92\x39\x70\x37\x52\xd8\x9d\xe8\xdb\xb6\x5c\xf0\x12\xd8\x99\xaf\x15\xb7\x4a\xd9\x2c\x00\x52\xa3\x00\x87\x80\x2b\x39\xa1\xc5\x82\x30\x61\xa0\x87\x03\xb2\x9e\xbd\x3d\x79\xe8\x05\x15\xa5\x95\x29\xd0\x48\x1f\xc8\x78\xb4\xf9\xe7\xf9\x32\x59\xcf\xc2\x8c\xf7\xe0\xb4\xba\x93\x94\x56\x52\xcc\xe3\x8d\xd9\x29\xd6\x11\x9c\xd0\x00\x19\x04\x85\x8d\x00\x2e\x6c\x17\x06\x83\xaf\xda\x01\x1e\x69\xc4\xda\x9a\xb2\x21\xfb\x2f\x4b\xfe\x72\x9e\x0c\x66\x42\x0a\xc4\xb8\xbe\x50\xad\x36\xdf\xb6\x96\x21\x87\x3c\x2d\x6f\x4e\x33\x21\x47\x6b\xd4\x61\x42\xb0\xcb\xb1\x82\x98\x6a\x51\x30\x8d\x9b\xf7\x17\x44\x20\x31\xdd\xdd\xbf\xe0\xb2\x0d\xa4\x42\xce\x36\x11\xe2\x51\xdf\xb8\xb0\x27\x39\x6d\x8d\x1c\xb7\x4d\x49\x03\x02\x76\x22\x72\x60\x77\x1d\x56\xcd\x82\x8e\xc8\x9c\x46\x46\xe3\x3a\x1d\xd1\x86\x71\xde\x0d\xf8\xc5\xe0\xd1\x6f\x79\x63\x7b\x24\xb9\x84\x54\xd8\x09\x55\x38\x8f\x05\xad\x19\x60\xf5\x20\xb9\x03\x49\x28\x64\x3d\xe5\xc2\x81\xe0\xcd\x00\x25\x90\x29\x8c\x42\x02\x02\x1e\xa9\xe8\x94\x55\x8e\x00\xa9\x06\xbf\xf2\x77\x1e\x59\x89\x29\x7b\xbe\x69\x42\xe7\x73\xc5\xb4\xe6\x57\xcc\xc1\x0d\xf2\x7f\x06\x6a\xa0\xb5\xd5\xc9\x1b\x0f\xc5\xa8\x89\x35\x0e\x0d\x4b\x6f\xee\x83\x57\x68\x9b\x65\xd9\xbb\xf3\x21\x4c\x08\x39\xd1\xd2\x30\xc5\x0b\x18\xd5\x2d\xb5\x26\xba\x2d\x16\x84\x6a\xac\x3e\x1c\x03\xe6\xe2\xf0\x59\xef\x10\x56\x10\xc4\x71\xc1\x68\xe9\x51\xe7\xac\x51\xd5\x34\xac\x9c\x10\x72\x64\xc5\xcf\x8c\x17\xd4\x20\xa6\x18\x29\x59\xd9\x36\x15\x47\x1f\xe1\x40\x32\x2e\x16\x8c\x48\x55\x32\x00\x97\x94\x33\x48\xbe\x0f\x83\x45\xba\x21\x80\xcd\x73\x3b\xfe\x94\x1b\x45\xd5\x12\x35\x28\xb7\x96\x03\x89\xb0\xa7\x4f\x01\x38\x76\x30\x16\xd0\x03\xa0\x37\x24\xbd\x9b\x8c\xbf\xb2\x1c\x02\x64\xb0\x6f\xb0\xbb\x06\xe4\x5f\xfa\x2b\xcf\x99\x64\x2f\xd8\xda\xe7\x6e\x67\x0f\x7d\x58\xee\x63\xc9\x5e\x48\x1b\x98\xf3\xeb\xa2\x32\x60\x81\x9a\x62\xe1\x34\xc5\xbe\xa8\x22\x04\xfd\x47\x74\x58\x75\x0c\x5e\x0e\x55\x91\x7b\x11\x19\xea\xe9\x99\x99\x58\x73\xd3\xb4\xb4\xaa\x96\x63\xf6\xc1\x1e\xf6\x56\x98\x81\xf6\x04\xcd\xc2\xa0\x10\xbf\x15\x9a\x99\x51\x06\x42\x40\x08\x35\x0a\xd1\x6c\x35\xd9\xc3\xf7\x17\x12\x5a\x23\xec\xe1\x60\xd6\xc4\x9e\xb6\x06\x8b\x74\x46\x9b\x7f\x92\x63\x4e\xae\x98\x5a\xba\x71\x07\x3f\x2e\xdb\x56\x25\x59\xf7\x08\x01\x09\x65\x8a\xc5\xc9\x87\x46\x21\x54\x4b\x96\x67\xae\x6c\x97\xd5\x21\x10\xd1\xdf\x5b\x4a\x7d\xc6\xf6\xc2\x08\x4e\x10\x2c\x62\x89\x3f\x81\x53\xe2\xf0\xed\xf1\xf0\xe3\x01\xaf\xe1\x86\x4f\xff\x1a\x68\x06\xf5\xaf\xfc\x32\x07\xaf\xc3\x5b\xe6\xdc\x75\x5b\xf0\xdf\x60\xc3\x4f\xc4\x58\xd3\xc1\x93\x43\xc9\x25\x73\xc7\x24\x15\x2e\x04\xe1\x6e\xce\x46\xa4\x62\x00\xe5\x88\x88\x95\x6c\x09\x83\xe1\xf8\x79\x56\x3e\xf3\xa6\xc4\x2b\xd7\x49\xda\x5d\x63\xfb\xf2\x19\x9f\xe6\x17\x2b\xd3\x23\xf3\xca\x22\xbc\x2e\x59\x72\x20\x67\xd3\xd5\xdb\x45\x96\x93\xbc\xa7\x06\xf6\x80\xfd\x20\x60\x20\x05\xb6\xa7\xd0\x19\x54\x13\x23\x73\x31\x1b\xc9\x57\x1d\xd9\xbf\xfc\x82\xde\xdb\x94\x65\x14\x3c\x24\xa2\xb7\x9f\xab\x70\xc9\x96\xcf\x34\xee\x79\x7b\x42\x2c\x78\x03\xa6\x39\x1c\xf6\x72\x96\x79\xe3\xe3\xf5\x23\x60\x9c\x7b\x72\xf0\x64\x39\x15\x23\xf2\x56\x1a\xfb\x9f\x93\x0f\x5c\x3b\x1b\xe6\x58\x32\xfd\x56\x1a\xf8\x64\xe7\xf9\x01\xa7\xea\xb1\x70\x83\xf3\xfe\x73\x28\x8c\x83\x63\x18\x0c\x75\x98\x12\xbf\xea\x1e\xd8\x39\x70\x0e\xd7\xe4\x14\xba\xfb\xe2\x52\x65\x25\x08\xaa\x32\x3d\xc8\xb5\x25\xc7\xfb\xeb\x00\xa2\xdd\x55\x8f\xaf\xd3\xe3\xb8\x45\xaa\x1e\xb3\x3c\x10\x69\x8e\x2c\x88\x42\xe0\x37\xd0\xff\xa4\xa9\x68\xc1\x4a\xdf\x5e\x81\xda\x59\xa5\x86\xcd\x13\xeb\x9f\x6f\xba\x6a\xa6\xe6\x10\x60\x29\x06\xb4\x5c\x5a\xbf\x72\x2b\x66\x78\x65\x55\xcf\xf0\xba\x97\x4d\x7c\x2f\x68\x2a\x0f\x3e\x04\xe8\xfd\xdf\xdb\x63\xf6\x3e\xac\x8a\x6c\x92\x28\x22\x13\xb5\xdf\x9a\x36\x56\x0a\xfd\x3f\xab\xe4\xc2\x86\xfb\x1f\xd2\x50\xae\xf4\x84\x1c\xfa\x86\x14\xf1\x77\xce\x8f\x14\x3d\x26\x1b\x61\x0d\xd4\x63\xfe\xda\xf2\x2b\x5a\x39\xf0\x64\x2a\x08\xc3\xe6\x1e\x96\xc6\x55\xd3\x6a\x44\xae\x17\x52\xa3\xc6\x1c\xa0\x37\xf6\x2e\xd9\x72\x6f\x94\xc1\x9f\xea\xaf\x58\xf2\xed\x9d\x8a\xbd\x2e\xe6\xd8\x93\x4f\xc1\x6e\x80\xda\xc3\x3d\xf8\x6e\xef\xa1\x6c\xba\x8c\x7a\x3d\x2d\x4b\x8e\x28\xd7\x67\xd9\xd5\xdd\xac\xe2\x23\x3f\xea\x45\x77\x0d\xc5\xaa\xc1\xeb\xfe\xdc\x68\x7e\x67\x6e\x08\x3b\x4c\x97\xbe\xc1\x8c\x73\x59\xad\x7b\xb4\x32\x10\x02\x3e\xb1\xc8\x7f\x66\xb7\x44\xcf\x09\x99\xcb\x8d\x94\x85\x59\x3c\x6e\xfb\x2e\x2e\xa9\xd5\xaf\x54\xcb\x46\xa4\x94\xe2\x99\x71\x21\x84\xb8\x3d\xd4\x6a\x9b\x89\x72\xc3\xaa\xef\xeb\x83\x0c\xa4\x50\xc5\xa0\x1b\x86\x6f\x8d\xe5\xfc\x9d\xd8\x40\x0a\x62\x55\xc6\xe7\x0b\xdb\x3f\x37\x11\x32\x14\xc0\xc8\x11\xe2\x60\x8c\x84\x84\x53\x00\x5a\xe5\xc6\xc4\x74\x8c\x17\x91\xd4\x8f\x7f\x65\xa0\xe2\x36\xf6\x86\xb3\xb3\x03\x5b\x42\xd7\xed\x3f\x99\x92\x19\xc6\xdd\xe0\x20\xcf\xb5\x9b\x86\xe4\x35\x76\xd7\x10\x10\x87\xee\xea\x6d\xa5\xf7\x60\x0c\x5f\xb9\xe4\x25\xe8\x7d\x16\x61\x42\x2b\x89\x8c\x00\x19\xa5\xf0\xc5\x14\xe6\x65\xa7\x84\x4c\xc7\x2e\xbb\x28\x66\xee\x18\x80\x89\xa2\xc7\x39\xf4\x94\x8f\x44\x55\x2e\x16\xac\x8b\x0c\xcb\x19\x50\xe9\x03\xe5\xf7\xb3\xa1\x02\x4a\x71\x2b\x10\xb0\x17\x73\xf8\xf2\x05\x64\xb3\xb1\x16\xe6\xb8\xbe\xa1\x4d\xc6\x4c\x93\xf0\x4c\xa8\x09\x56\x35\x0a\x4d\x3a\x95\xad\xf1\x50\xcd\xee\xfb\x92\x1a\x0a\xfd\xa9\x30\x6f\x62\x37\x42\xb8\xf9\xfc\xb0\x99\x4c\xe4\xfc\xdb\x15\x33\xa0\xfb\x15\x07\x23\xc2\x68\xb1\xb0\xd6\xce\x18\x53\x5b\xad\x9d\xe6\x0d\xb2\x63\xbb\x50\x68\x04\xc9\x55\x85\x21\xc7\x16\x0a\x1c\xe1\x37\x4e\x94\xad\xed\x93\x30\x7c\xe9\x95\x76\x05\x1d\xce\x3c\x13\x5d\x51\x7c\x06\x4a\x7c\x78\xc4\x37\xf5\x74\x0e\x6e\x98\x11\xf0\x56\x45\xf3\xe5\x73\x14\x59\x69\x7f\x16\x36\x7d\x06\x2a\x36\xbc\x7d\x87\xc7\x6e\xcf\x30\x97\x91\xde\x8a\xb5\xf1\xad\x52\x93\x89\x06\xec\x96\x66\x5f\x9a\x7a\x67\x7f\x84\x0a\x0f\x1d\x51\xa1\x32\xb8\x6b\x4a\xe6\xb8\x25\x2c\x67\x0e\xa7\x5d\xb4\xf4\x9a\x85\x86\xa6\x4c\x29\xa9\xec\xfb\x33\xad\x09\x87\x75\xaa\xa9\xba\x64\x65\xd0\xc6\x27\xe4\xcc\x4e\x94\xf7\xec\x65\xa0\x44\x79\x2d\xc2\xb7\x4b\xb5\xaf\xee\x0c\x73\x20\xf3\xd9\x64\xf2\xcc\x75\x72\x57\xa8\x60\xe3\x39\x64\x3f\xcf\x25\xf1\xf3\xb8\xf1\xb2\x39\xef\x7a\xb2\xe9\x0d\x6d\x34\x3a\x47\xad\x1a\x0d\xe1\x20\x49\x28\xce\x88\xcb\x12\xa2\x83\xc1\x26\xba\x2b\xb3\x73\x22\x6f\xc0\x31\x5f\xb0\x31\x43\x2a\x10\x5e\xb9\x03\x8c\x19\x83\x8b\x37\x05\x16\x1d\x0f\x39\x79\x98\x37\x5a\x9d\xd1\xcf\x5c\x0f\x28\xaa\x59\xbd\xee\x2b\x44\x04\xe5\x0a\x5c\x93\x77\xde\x5b\xf1\x69\x25\x37\x06\x91\x87\x73\x58\x43\xfe\xda\xa1\x9a\x9b\xd5\x6b\xd7\x6a\x70\x56\xaf\xd3\x19\x76\x1a\xee\x2b\x21\xee\x78\x8c\xcb\xaa\x82\x01\x32\xa8\xc7\xe4\xea\xb5\xbd\xe2\x9c\xd5\x6b\x2b\xc5\x3a\xab\x57\x8e\xe2\x9d\xd5\x6b\x78\x31\xcf\xea\x95\xc7\x9f\x82\xd7\x7d\x09\x27\x50\x11\xb8\xef\x06\x1c\x3b\x6b\x9c\xb9\x01\x0a\x3f\xb8\xc2\x9a\xe8\x60\xc8\x28\x93\x9c\x3a\x87\x62\x89\x4e\xb5\xac\x5a\x83\x24\xe4\x1f\x24\xd6\x19\xe1\x25\x7d\x14\x2a\x8f\xa2\xb8\x3a\x5c\xa4\x89\x82\x25\x81\xea\x59\xce\xb1\xee\x2f\xf2\x92\x3b\x96\xba\xab\xa1\x97\xfc\x2d\x03\xf0\xda\x8d\xc6\x01\x78\xed\x44\xfb\x00\x4f\x4a\xfe\x26\x02\x78\xed\x12\xce\x77\xff\xca\xba\x49\x87\xb7\x15\xf0\xd7\x3d\x45\xcf\x42\x33\x65\xd4\x95\x96\xa1\xab\x66\xcf\x41\x01\xf0\xfd\x46\xa3\xff\xc4\xe7\x00\x61\x1f\xce\xe1\x7e\xad\x7c\x41\x91\xfb\x0a\x46\x7b\x44\x83\xc3\xb3\xd3\x8c\xfe\xdf\xe8\xa9\x37\x78\x80\xe3\x3b\x9e\x7c\xc0\x9f\x72\xf5\x26\xf8\x14\xdd\xb7\x71\xe6\xff\x71\x37\xa3\x0e\xe7\x29\x8b\xba\xbd\xfb\x3e\xa7\xb5\x17\x7f\x6d\x35\xc5\xb8\xe7\x5c\xc4\x81\x46\x3a\x08\x89\x4e\xa7\x74\xba\x18\x62\xa1\xfa\x4a\xbf\xe1\x65\xaa\x64\xf7\xfd\x53\x3b\xea\x55\x82\xd9\x1f\xd0\x1d\x6b\xf5\xea\x71\xcb\xb3\xf7\x7e\x12\x5d\xc8\x12\x83\x09\x51\x5c\xa3\x91\xe5\x2b\x4c\xb2\xa2\x42\x48\x83\x39\xd4\x23\x0c\xcf\xeb\x91\x4b\x54\x88\x00\x75\x45\x49\x5a\x5e\x62\x35\x66\x40\xc6\x7c\xf6\xef\x55\x56\x01\x13\x78\x96\x87\x9d\xc8\x3d\x55\x42\xd0\x86\xff\xc8\xd4\x90\xde\xdd\x9b\xae\x1e\x73\xb9\xe7\x7b\x4e\xd2\xc5\x82\xd5\x14\xfe\xf9\xda\x4f\x90\x15\xda\xae\x36\x19\x82\x25\x4c\xd5\x56\xf1\x1d\xf5\x50\xae\xf6\xae\x5e\x66\xa8\x93\xeb\xae\x7b\x49\xab\x0d\x6b\x7e\x6f\xd3\x79\xd6\x33\xff\xed\x16\x05\x0f\x25\x24\x1a\x78\x74\xeb\x10\x8e\xb2\x9a\xc4\x15\xce\xff\x8e\x4f\xdd\x7d\x26\x16\xe2\xf5\x18\xbc\xd1\xa9\x5e\xe8\x51\xd0\xd2\xfb\xde\xe3\x6c\x84\x3d\x79\xa1\x3f\x7e\x3d\x79\xa1\xdd\xf5\xe4\x85\xfe\xe4\xeb\xde\xbc\xd0\x91\x4a\xe7\x4f\xd8\x0d\x6e\xe4\xb8\x53\x9c\xf7\x25\x77\x5d\xe4\x27\x18\x93\xf2\x0e\x60\xef\xfd\x95\xaa\x1f\xde\x7f\x36\x99\x3c\xc3\x00\xff\x24\x04\xb1\x5a\x33\x1b\xff\x81\x30\x51\xc8\xd2\x3e\xe7\x02\x9e\xaf\xb4\x01\x73\xa7\xf3\xe8\xc5\xb4\xd4\x7e\xac\x38\x45\x00\x9e\x9d\x57\x6f\xcc\x78\x6c\x79\x74\xc4\xd7\xf7\xa9\x9c\x67\x3c\x5e\x3a\xe5\xde\x53\xee\x97\xc2\x2d\x28\x53\x4e\xcb\xef\x70\x1f\x2b\x5e\x73\x57\xa5\x68\xe5\x29\xd3\x26\x57\xf1\x09\x21\xfb\xf8\xf0\x49\xd1\xb4\x23\x37\xd0\xa4\x66\xb5\x54\xcb\x51\x18\xcc\x7e\xd9\x1b\xdd\xdd\x71\x00\xc6\x45\xd1\x2a\xc5\x84\xa9\x96\xc3\x00\xf8\x37\x5d\x8f\xc4\xca\xf0\x2b\xb5\xc3\x46\x46\x60\xae\x3c\x79\xba\xdd\xd5\x97\x78\x47\x7e\x18\x0c\x67\x84\xd9\x86\xf3\xde\xb5\x52\x19\x75\x1e\x50\xfb\x29\x13\x57\xe4\x8a\x2a\x9d\x4b\xc2\x90\xfb\xb2\x2b\x4a\x7e\xc5\xf5\x3d\x96\x60\x9f\x3b\xa5\x05\x63\x8d\xb2\x35\x4d\x6b\xdc\x71\xe7\x45\x04\xfb\xd0\x48\xab\x8a\x06\xd1\xb0\x62\x9e\xbd\x1c\xea\xf2\x8e\xaf\x86\x1a\xc3\x94\x78\x45\xfe\xef\xfe\xcf\xbf\xf9\xd7\xf8\xe0\xcf\xfb\xfb\x7f\x7f\x31\xfe\x8f\x7f\xfc\x66\xff\xe7\x09\xfc\xe3\xcb\x83\x3f\x1f\xfc\xcb\xff\xf1\x9b\x83\x83\xfd\xfd\xbf\x7f\xf7\xe6\x2f\x17\x67\x27\xff\xe0\x07\xff\xfa\xbb\x68\xeb\x4b\xfc\xeb\x5f\xfb\x7f\x67\x27\xff\xf8\xc4\x87\x1c\x1c\xfc\xf9\x7f\x65\x7c\x09\x2a\x96\xef\xb2\x9d\x09\x78\x8d\xef\x45\xaf\xe9\x3f\xfb\x7e\x2b\x4d\xb9\x30\x63\xa9\xc6\x38\xc8\x2b\x28\xc3\xc9\x36\x94\x67\xcd\xfb\x93\x31\x9d\x56\x15\x4e\xd0\x60\x7e\xef\xb8\x10\xb9\x5f\x0b\xfb\xde\xc2\xd3\x8d\x2c\x23\x10\xb7\x5d\x42\x7e\x74\xb0\x86\x3a\x60\x2b\x2a\x70\x8c\x8a\xb9\xd5\x9f\x01\x30\x9c\x56\xae\x66\x86\xec\x37\x8a\x5f\x51\xd3\x01\xcd\x44\x58\x71\x03\xc9\x28\x16\x94\x8b\x83\x0e\x62\xa4\x91\x25\x98\x57\xad\x66\xa1\x27\xb7\x55\xf9\x2e\xbe\x3f\x27\x45\xc5\xa1\xac\x57\x85\x36\x8d\x03\x07\xf7\x78\x84\x73\x26\x98\x42\x90\x3d\xb2\xfa\xaa\xad\x66\x90\x8c\x0c\x1b\x45\x94\x89\x2d\x06\xbb\xeb\xac\xc7\x11\xef\x51\x2d\xf4\x8d\x37\xb0\x46\x0e\x2b\x69\x00\xc2\xcc\x35\x05\x73\xb5\x35\xb4\x69\x94\xbc\x62\x39\xf2\xe2\x9d\x3e\x0a\xaf\xc8\xb5\x86\xa2\xe4\x78\x59\x71\x61\x46\x61\x8a\xa0\x8e\xaa\x87\x36\x34\x74\xe1\x57\xc7\x22\x37\xe1\x32\x5e\xb8\x0f\x4b\xc9\x74\x64\x62\xb5\xc2\xf0\x2a\x1f\x11\x9a\x2c\xe8\x15\x23\x53\xc6\x04\x4e\x08\x6a\x5e\x50\x3f\xd1\xdf\xc5\x51\x26\xff\x20\x0c\x7d\x7f\x39\x49\xcc\x05\x44\xad\x01\x61\x35\x17\x63\x3b\x5f\xcd\xdc\xce\xae\x5a\x42\x3c\x4c\x12\xd8\xe8\xc8\x57\xf1\x22\xb8\x0d\x68\x78\x6d\x69\x29\xb1\xa6\x69\x20\x1d\x0e\x54\xd5\xb1\xaf\xef\x4e\xc8\x36\x6f\x82\xc9\xb9\xa1\xa6\xd5\x93\x6f\x2d\xbd\xef\xd9\x4c\x31\xbd\x38\x1c\x6a\xbc\xd8\xd7\xd1\x86\xd6\x4d\xb6\x39\xb5\xd2\x09\xab\x0a\x43\x4d\x35\x3a\x31\xc3\xa4\xf9\xd7\xee\x04\xa9\x43\x92\x1d\x1e\x4d\x01\x9f\xf9\x08\x45\x60\x43\xad\xcc\xc2\xbd\xb2\x61\xf4\x4b\xb6\x04\xdf\x49\xd6\xad\x7a\x64\x77\x2a\x3c\x16\xe1\x9a\x07\xcf\xea\x45\x6f\x9e\xfc\x81\x83\x20\x6b\xdd\xe4\xda\xcd\x01\xa8\xac\xa0\xd3\x3b\x99\x80\x2e\x99\xb3\x93\x37\x03\x49\x70\x88\xe3\xae\x8b\x66\x24\xfe\xf7\xed\xa8\xdf\x1d\x9d\x7f\xf1\x07\x37\xf0\x41\xec\x09\xac\x5d\x84\x39\x0f\x01\xdc\x21\xbc\xae\xee\x4a\x14\x8d\x4e\x20\xf5\xb7\xd3\xbe\x59\x36\xbc\xa0\x55\xb5\x1c\x5a\x92\x83\x0f\x74\xc5\x46\x8a\x99\x56\x81\x73\x8c\xab\x4d\xa4\x08\x52\x31\x3a\x1b\x83\xc6\x20\x0d\x42\xb6\x1e\x0c\xe6\x83\x33\x48\x90\x8b\x44\xc4\x3a\x53\xe0\x1a\x8c\x2c\x5f\x14\x8c\x2c\x65\xeb\x70\xc8\x0a\xcc\x03\x28\x64\x39\x58\x19\xa1\x02\x7a\xd4\xd8\xf3\x1e\x55\x3f\x3b\xbb\x58\x46\xbe\x94\x2d\x28\x25\xd1\xb6\xda\xb8\x31\x86\xae\xc5\xda\x7b\x81\x67\xb1\xa6\x97\x8c\x98\x6b\xd9\xdf\xf6\x40\x6c\x00\x80\xd2\x8c\x14\x92\x8b\x82\x0f\x9e\x07\x4c\xd4\xeb\x2d\xbe\x72\x61\xf3\x91\x2b\xcc\x6a\xa4\xd6\x7c\x5a\xb1\x48\x73\x5b\x51\x9c\x2c\x97\x64\xd4\x11\xec\xfc\xc3\xda\x74\x45\x5a\x4a\x31\xdd\x48\x01\xf1\x25\x38\xa7\xc1\x21\x3f\x21\xe4\x6f\x2b\x73\x38\x78\x3a\xaa\x8a\x08\x86\x81\xac\x62\xc1\x8a\x4b\xd7\x8f\x8d\x6b\x52\x48\x81\xe0\x27\x23\xe7\xe6\x1b\x03\x91\xa0\x9c\xd8\x69\x59\x66\x48\x6e\x2c\xa4\x70\xdd\xfc\xb2\x88\xdb\x58\xc9\x04\xef\x96\x92\x95\x26\xc5\x42\x4a\xed\x34\xbc\xbe\xeb\x24\x5e\x05\x3e\xf4\x3c\x46\x5d\xf3\x7f\xc3\x3b\xb5\x95\x89\xe5\x19\xaf\x1b\x4c\x99\x86\x35\x7b\xa6\x49\x29\x8b\x36\xfc\x6d\xe7\xbe\x62\x54\x09\xb2\x90\xd7\xc4\x0c\x45\x4d\xb0\x5b\x79\xe5\xe5\x5c\xcd\xa1\x1e\x8c\xa4\xb7\x83\xc0\xd3\x97\x6c\x79\x91\xda\x23\x30\x7e\x4e\x87\x58\xb0\x23\xa9\x78\x9b\x44\xf0\x2e\xe6\x82\xff\x14\x70\x28\xd6\x8f\x54\x10\xa0\x56\xa6\x42\xa8\xcb\x95\x10\xac\xd8\x18\x83\x77\x3e\x81\x3c\x66\x6b\xf1\x75\x72\x51\x13\xbd\x90\x6d\x05\x46\xee\x46\x6d\x75\x42\xc8\x4f\x0b\x26\xdc\xb1\xec\x8e\xbe\x1c\xa9\xda\x37\x1d\x9e\xeb\xc7\x9f\x95\xbb\xba\x13\xbc\xe1\xb8\xc9\x53\x89\xe9\x0f\xaa\xbe\x25\xa4\x58\x24\x73\x47\x64\xca\x0a\x6a\x67\x68\xf5\xe4\x93\x78\x20\xe5\x29\x52\xc7\xf6\x57\x35\x2f\xc7\xfe\xa8\xdd\x19\x3c\x09\x7b\x6d\xe2\x8e\x1d\xdf\x67\x6b\x0a\xe4\x83\xed\xb3\x4f\x34\x6a\xfa\xe0\xd1\x75\x5b\x19\xde\x54\xd8\xf4\x02\x30\x9d\xb2\x64\x77\xf4\x2c\x25\x87\x15\x05\x94\x9c\xbd\x3f\xfd\xf1\xf0\xe2\x84\x7c\x77\xf2\x37\xfc\x78\x14\xe7\xcd\x52\x6f\xf9\x38\xb5\x2e\x03\x25\x97\x6c\x99\x6d\x76\x3b\xf3\x0b\x67\x0a\xf6\xec\xd1\xc9\xfb\x8b\xd3\xd7\xa7\x47\xf6\xad\xf0\xe3\xd1\x6a\x2a\x30\x1a\x52\x19\x88\x58\x97\xe2\x01\x81\xc8\x9b\x67\x20\x57\x10\x03\x7c\x89\x30\xfc\x35\x2b\xb9\x55\x34\x86\x9b\x4b\xf6\xfa\x41\xf7\xbd\xb5\xdd\xc6\x24\xd0\xae\x18\x44\xe9\x99\x2c\x9f\xe9\x35\x3b\x09\xed\x09\xcf\x8d\x39\xe4\x28\x58\x4b\x5e\x1e\x52\x63\xad\x48\xc5\xd9\x15\xba\x15\x83\x2c\xdd\xe4\x40\xc6\xe9\x0b\x46\x56\x9e\xec\xe5\xff\x76\xa9\x41\x35\xfa\x6d\xfb\xae\x92\x8d\xa6\x63\x4f\xcb\xcf\x31\x23\x01\x14\xb1\x5a\xae\x9e\x5d\x6b\x27\xce\x35\xd5\xde\xc6\x77\x5e\x50\xd8\x2c\x43\x69\xc8\x28\xff\xdd\xd9\xbf\xdb\x22\x1f\xb8\xeb\x49\x99\x7a\x52\xa6\x76\x5c\x99\x72\xd6\xd8\x2e\x6e\x26\x7b\xb8\x42\xb1\xa6\x9c\x59\x32\x01\x2f\xaa\x17\x4d\xf0\xb1\xb2\xd0\x92\xbe\x91\x65\x96\xfd\x84\x78\xf3\x01\x20\x97\x91\xbd\xf7\xe7\x87\x5f\xbf\xf8\xfd\x57\x7b\x23\xf8\xe7\x37\x2f\xfe\xe3\x77\xf6\x9f\x27\x47\xc7\xe7\x87\x67\x5f\xfd\x36\xfa\xe3\xeb\x3f\x7c\xb3\x97\x03\x96\xc8\x3d\xee\xb7\x5f\xbd\x74\x90\xbd\x7b\x27\xc7\x5f\xfd\xf6\xb7\x2f\xff\x23\x5b\x8b\x9b\x2c\xec\x53\xd3\x0f\x27\x1f\x1a\x8e\xad\xf7\xcf\x59\x21\x45\xb9\x93\x88\x64\x9b\xe8\xf4\x7e\xf6\x9a\x7e\xe0\x75\x5b\x93\x8a\xcf\x18\x84\x9c\x20\x39\xdc\x18\x17\x76\xcb\x23\x06\x22\x39\x94\x85\x45\x43\x08\x48\x36\x98\x6c\xc4\x5d\xcf\x17\x72\xc5\xd4\x94\x1a\x5e\x77\xd8\x5e\x1b\x43\x5c\x7a\xb8\x03\xcd\x5e\x5d\xbc\x3a\xf8\x21\xbb\x46\xaa\x59\xde\xf4\x74\x46\x24\x2e\xc7\x88\x5c\xb6\x53\x36\xa6\x0d\xc7\xa0\x3b\x4a\x01\xcd\x8c\x0b\x8a\xff\xe1\x77\xdf\xbc\x78\xb1\xff\xd5\x37\x64\x21\x5b\xa5\x0f\x26\x2b\xb7\x67\xa0\xc5\x45\x25\x40\xa5\x73\xe2\x41\x2f\xa4\x32\x50\xf7\x4b\x05\xf9\xfa\x77\x2f\x5e\x90\xfd\x97\x40\xc0\x81\x8b\x0d\x79\xf6\x82\xf2\x74\x3a\xcd\xa2\xe3\xe2\x4a\x73\x4d\x7e\xff\x87\xdf\x7d\xf5\x8d\x1d\xf3\x3f\x5e\x92\x92\x2e\x33\xa9\xf3\x17\x37\x79\x42\xdd\x96\xb1\x16\x06\x83\x83\x12\x34\xc5\x15\xff\xbc\xab\xad\xcf\x71\x8c\x87\x2d\xf9\xa5\x9b\xe6\x2f\x71\x9e\xdf\x6c\xd8\xce\x08\x34\x20\xe4\xfa\x8a\x64\x20\x44\x3b\x91\xd1\x5b\x5b\xf4\xb9\x6b\xa3\x28\x47\x28\x3f\x26\x66\x52\x15\x18\x1d\xeb\xf3\x5e\x0e\xf3\xf9\x97\x5e\xa1\xff\x2f\xfd\x50\x99\x60\x76\x43\xe0\x72\xac\xb5\x4f\x84\x42\x5e\x9c\xc9\x1c\x8b\x22\xc5\xdc\x4f\xaf\xdf\x6c\xb9\x0e\xa5\x5c\xe9\x78\x39\x0b\x0c\xee\x0d\x1a\xd7\xc9\xf0\x67\x3a\x48\xd1\x92\x1c\x9d\xbf\xef\xe0\x5d\x69\x59\x2a\xa6\xb5\x37\xc5\x02\xb2\xed\xce\xa8\x00\x9a\x15\x8a\x99\x8c\xb9\x64\xf8\xc0\x1b\xca\xfa\xdd\x97\x4f\x15\xfd\x9f\x72\x7d\xfe\xa8\xae\xe7\xc8\x0e\x4f\x90\xae\xe4\xf1\x43\xba\xe2\x5a\x3e\xe1\xb9\x3e\xe1\xb9\x3e\xe1\xb9\x0e\x7e\xd2\x8e\x22\x6f\x3c\xe1\xb9\xfa\xeb\x31\x54\xd0\x3f\xe1\xb9\x7e\xc2\xf5\x54\x49\x7f\xeb\xf5\x54\x49\xdf\xbb\xfe\xcd\x2b\xe9\x9f\xf0\x5c\x13\x07\x79\xc2\x73\xbd\xed\x7a\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x4d\xa0\x69\x13\x9e\x2b\x32\xff\x26\x54\x57\xe7\x6f\xea\x20\x5d\xff\x0d\x11\x5d\xb5\x65\xbf\x82\x1d\x16\x85\x6c\x85\xb9\x90\x97\x6c\x20\xde\xdd\x8a\xf7\x77\xed\xe9\x56\x0c\xdd\xe4\x0d\x5e\xbf\x79\x27\x5d\xc3\xf9\x52\xe7\x07\x1b\xf6\xf9\x4c\x7a\xda\x96\x9c\x89\x1c\x08\x01\xf9\x0f\x47\x4f\x9b\xd7\x10\xad\xc6\x2d\x4a\x56\x76\x5f\xb8\x93\xd3\x58\xa6\x99\x90\x43\xa2\x58\xc1\x1b\xee\x1a\x35\x53\xfc\x3c\x47\xd6\x81\x95\x0f\x1c\xb2\xaf\x66\x4b\x2b\x35\x58\x35\x0b\x47\x95\xfb\x9c\x33\x15\xf9\x48\x9d\x96\xb7\x42\x68\x0e\xe7\x97\x7d\x25\xb4\x79\xc0\xc2\xb9\xe6\x9a\xf9\x2c\x31\x17\xd0\x8e\x66\xe4\x22\xa6\x21\x06\x27\xc9\x43\x4c\xf4\xea\x6e\x25\x32\x06\x4a\x33\x9e\x5b\xec\x31\xa4\xb6\xac\x11\xd9\x19\x46\x90\xe8\xc1\x4a\x52\xb6\xca\x77\x96\xb5\xba\x11\x2f\xad\x8e\xe6\x61\x44\x51\x8c\xe6\xd8\x76\x28\x89\xc3\xae\xd2\x1d\x47\x21\x5c\x00\x2d\x16\x4c\x47\xf4\xa2\x37\xe2\xd2\x65\xb2\x64\x29\x60\xb7\x57\x53\xb5\x73\x2e\xd0\xa5\x01\xa3\x7a\x0d\xb6\x2b\x36\x77\x2f\xbd\x4a\xf2\x45\x44\x8e\xfd\x79\x8e\xc4\x01\x30\xa6\x36\x56\xbc\xe3\xcc\xf0\x59\xfc\x87\x26\xb2\x2a\x7d\x70\xfd\x0f\x2f\x48\xc3\x54\x81\x62\x29\x4b\x00\x4f\x63\x4d\xbd\x91\xa4\xb2\x16\xb3\x55\x65\x6e\x1e\x3e\xc4\xf6\x8f\x23\x01\x80\xf9\x0f\x99\x32\x34\x03\xd6\xa6\x21\x15\xa3\xda\x90\x97\x2f\x48\xcd\x45\x6b\xf2\xf5\x0c\xbe\x87\x84\x82\xdf\x7d\x33\xf0\x69\xf7\xd0\x81\x38\x8b\x24\x89\xbd\x2a\xf0\xef\xe0\x5a\x71\x11\xc5\x1a\x36\x4b\x23\xb9\x30\xab\x8e\x96\x28\xd1\x3d\xd7\x69\x05\x91\xcc\x9d\x38\x0f\x32\xbb\x18\x7e\x6d\xe5\x74\x99\x06\xc1\x93\x63\xd1\xdd\xf0\x31\x88\x3d\x25\xff\xe9\x3e\xc4\x25\x96\xa8\x86\x2c\xac\xd1\x0b\x7e\x59\xbd\xa0\x0a\x31\x69\xa0\x88\xc3\x67\x13\xa5\xad\xce\xb1\x1d\x18\x00\x22\x5e\x85\x71\xb9\x26\x65\xf8\x38\xb8\x66\xb9\x18\x1b\xc5\x58\x20\x19\x6c\x7d\x88\x20\xfb\x2c\xa4\x41\x68\x85\x03\x55\xfc\x61\x8a\xfd\x98\x28\x36\xe7\xda\xa8\xb4\xb0\xdf\x38\xfd\xc0\x1c\x6a\x05\xcc\x95\x6c\x93\x1b\x3a\xe7\x12\x5b\x40\x84\x77\xf1\xfa\x44\x8f\xa2\x60\x5a\x0f\x29\x9a\x71\x47\x9d\xe3\x31\x18\x23\xf1\x59\x83\xc5\x8e\x62\xb4\x7c\x27\xaa\xe4\x98\x69\xae\x89\xf6\x74\xa0\x3f\x0d\xb4\x2a\xc8\x72\x84\x0d\xea\xb7\xaf\x5b\x00\x74\xd5\x81\x0c\x61\x25\x5a\x3a\xf6\xe7\x63\x80\x42\x8d\x22\x85\xe9\x52\x3d\xd6\x45\x66\xb4\xd2\xc9\x71\xc6\xe1\xbe\x16\xbf\x7d\xb7\xbf\x40\x48\x47\x5f\xa0\xbb\xea\x4e\xa9\xba\x6a\x4e\xbf\x58\xef\xfd\x0f\x9c\x1a\x9c\xee\x2b\xec\x0c\x57\x1a\x65\x72\x50\x0d\x27\xc7\x2b\x2b\x98\x31\x21\x6c\x3f\xd0\x10\x03\xcc\xf8\x62\x38\xc7\x29\x85\xac\x6b\xaa\x0f\x92\x89\xc1\xfc\x22\x0a\x40\x72\xda\xd5\xb7\x0b\xa3\x68\xd5\xcd\x50\x04\x60\xba\xad\x6d\x6d\x98\xa0\x22\x39\x65\x32\x17\xcf\x20\x15\x44\x5e\x87\x72\xd4\x39\xbf\x62\x62\x75\x3f\x3b\x77\xc4\xb7\xb4\xb8\x64\x03\xb0\x9b\x7e\xd0\x7e\x8d\xcb\xa5\xa0\x0e\xcb\xc6\x1e\x43\x57\xdc\x8a\x03\x56\xae\x8c\xab\x47\x5d\x86\xbb\x66\xc6\x83\x0d\xa1\x61\xb7\xad\x85\x6b\x35\x4b\x86\x8d\xcd\xb5\x6c\x96\x86\xfb\x3a\xf3\x34\x66\x74\x28\x7e\x55\x30\x6f\x17\xdb\xf1\xb6\x35\xdf\xf8\x7e\x59\x66\xdc\x73\x73\x24\xa3\x5c\x65\xb0\x4b\x47\x45\xe8\xc9\xca\x9e\x55\x4b\x0f\xda\xbe\xba\x17\xa6\x4b\x88\x06\x0e\x3b\x6f\x12\xe7\x43\x4d\x93\x94\xcc\x1c\x6c\xa7\xa6\x65\xff\x60\x79\x4f\x4b\xa9\xc9\xb7\x50\xbd\x7f\xcc\xc0\x8d\xf2\xd0\x46\xc3\xfb\x6f\x8f\x3f\x62\x30\x58\xaa\x3f\x2f\x63\x81\xd7\x74\x9e\x66\x5a\x8f\x49\x2d\x05\x37\x52\xa5\x9c\x79\x43\x6d\x85\x99\x1e\x52\x5e\x9a\x4b\x6e\x22\x15\xde\xb7\xd1\x41\x7a\x86\xfa\xd2\x28\x2d\x0a\x58\x77\x29\x5b\x72\x4d\xc1\x33\x88\xdc\x9d\xae\xb1\x5e\xf0\xe6\x15\x39\x11\xba\x55\x11\x42\xd9\x2a\x09\xf6\xa0\xf3\xcc\xe9\x8f\x3b\xd8\x48\x76\xf6\x11\x0b\xd7\x81\x90\x26\xd3\x71\xf2\x81\xd6\x4d\xc5\xf4\x2b\xb2\xc7\x3e\x98\x6f\xf6\x46\x64\xef\xc3\x4c\xdb\xff\x08\x33\xd3\x7b\x13\x72\x5a\x37\x15\x2f\xb8\xa9\x96\x84\x8b\x19\x53\x2a\xc4\xde\xf1\x07\x2b\xa9\xff\xe9\x94\xdc\x31\xe6\xad\x8d\x54\x74\xce\x9e\x3b\xdd\xe0\x0b\x35\x4d\xd5\x44\x06\x9f\x49\xb0\x09\xb7\xcd\xcc\x40\x44\x70\xf2\x83\x34\xc6\x8f\x86\x1c\x4f\x1b\x57\x85\x39\x96\x99\x5c\xfe\x01\xd6\xc5\xad\xc0\x73\x35\x2d\x9f\xbf\x3f\x39\x3c\x7e\x73\x32\xa9\xcb\x2f\x16\xf2\x7a\x6c\xe4\xb8\xd5\x6c\x9c\x5c\x52\x3a\x78\x65\x2e\xd9\x12\x70\xd0\xb7\xbc\x36\x8e\x8c\x9e\x17\xd5\x48\x48\x16\x80\xcf\xad\x01\xf2\xfe\xdb\xe3\x1f\xf4\x90\x48\x57\xe4\xa4\x78\xce\x4c\xf1\xbc\x60\xcd\xe2\xb9\x1b\xf9\xdf\x75\xfd\xa3\x14\x93\xb5\x39\x49\x7a\xa0\x3f\x33\xb7\xcd\x51\x9e\x0e\xd4\x5e\x0b\x59\x55\x58\x5b\x6d\x4f\xad\x23\xd6\x2c\xc2\x0d\x8f\x7a\xe5\x87\x94\xa9\x0c\x2c\x4e\xd9\xbd\xf8\x00\x01\xb4\x7e\x99\x9c\xe2\x94\x8b\xf5\x2c\x0d\xfd\x73\x06\x3e\x19\x76\xcc\x44\xc2\x4b\x4d\xf3\x2a\x11\x8f\x53\x5c\xa5\xaa\x33\x8f\xc2\x3f\xfc\xde\x7f\xa9\x99\x01\x2d\x96\x0b\x82\x7d\x94\xdf\x58\xad\x7a\x17\x1c\xc1\x3b\xc1\x4a\x43\xfc\xd0\x58\x16\x3d\xa0\x6b\x5a\x2e\x4e\x08\x84\x80\xd5\x1d\x65\x28\xd3\xd6\x2c\x98\x30\x1e\xfa\xc9\xd5\x71\xc7\xba\x10\x39\x9d\xa1\x3f\xb0\x1c\x90\x46\x29\xaf\x98\x52\xbc\x64\x9a\x0c\x56\x86\xe2\x38\x10\xaf\x1e\x35\x6b\x0d\xca\x60\xcc\x91\x30\x38\x34\x87\x3e\x67\xa2\x43\xfe\xbc\xf9\xdd\xc8\x98\xdf\x89\x5c\xf9\xfb\xc8\x92\xdf\xc5\xfc\xf8\x4c\x19\x86\xc3\x73\xe2\xf3\x67\x79\xef\x4c\x90\xa3\xa7\x76\xc2\x27\xd9\xd4\x4e\x5a\xd6\x7c\x00\x08\xdf\x0e\x88\xf4\x3c\x8a\x27\xcc\xc3\x9d\x1f\xa2\x0b\x5a\xb1\xd3\x77\xdb\x0a\x47\xb8\xe1\xfb\x21\x89\x73\xf7\x61\xc3\x94\x47\x77\xf5\xd1\x31\x63\x68\xb1\x70\x01\x02\x9f\x97\x20\x05\x40\xef\xe0\xbe\x21\x42\x96\xa9\xe9\x86\x71\x4c\xc2\xd3\x70\x7b\x5c\xc2\x93\xff\x79\xc5\x26\xe6\xd4\xb0\xeb\x44\xfb\x7d\xdc\xa9\x8d\xa9\xbf\x07\xc7\xf8\x53\x6c\x63\x63\x60\x61\x78\xfc\x22\x94\xdf\xaf\x3d\xfb\xfe\x23\x16\x93\x1b\x62\x15\x39\x8e\x01\x78\xe2\x56\xa2\xb9\x78\x05\x39\xfc\x61\x96\xa6\x8c\xb8\x5d\x97\x85\xff\xdc\xb3\x3c\x17\xc1\x42\x3a\xf4\x31\xaf\x2e\x7b\x01\x77\x78\x76\x4a\xfe\x82\xb7\x6f\x6d\xf6\x1a\x25\x0d\xba\x41\x8f\x65\x4d\x79\x72\x0d\x5a\x6f\x0e\x56\x1f\xea\x27\x23\xb6\x64\xfd\x24\x9c\x85\x7b\x89\xbb\xd9\x63\xd0\x16\x52\xcc\xf8\xbc\x55\xac\x24\x2e\x70\xb5\xb5\x59\xda\x39\x0f\xd1\x9a\xcf\x86\xec\xdb\xef\x9e\x43\x0f\xbb\x83\x49\xe7\x2d\x5a\x71\x25\xa5\xfb\x76\xef\xd1\x05\xf5\x59\x3a\x6e\xa2\x8c\x18\x8f\x22\xd6\x39\x6b\x3c\xf3\x83\x3a\x1e\x2a\xc9\x06\x8c\x2a\x34\x87\xf2\x82\xa8\xc0\xd3\x75\x10\xe3\xba\x03\x0a\x43\xaf\xd0\x88\x7c\x2f\xe7\x5c\xf8\xe3\x45\xba\x02\x9f\x19\x4d\x77\xcf\x3c\xf9\x47\xd6\xae\x27\xff\xc8\x93\x7f\xe4\xc9\x3f\x72\xf3\xa5\x75\x75\x22\xe8\xb4\x4a\xaf\xe6\xee\x17\xbc\x87\xc7\x91\xd7\x15\x9d\x13\x06\x7f\x3c\x2f\xb9\xb6\xff\x25\xe7\xe7\xdf\x43\x56\x74\x2b\xbc\xeb\x1c\x78\xd3\x69\x5f\x23\x3f\x43\x78\x96\x6e\xef\x18\x43\x35\xe7\xcd\x00\x50\xb3\x6c\x07\x59\x47\x4a\xe8\x42\xab\x7b\x20\x0e\xee\x0e\x38\xcf\x68\x00\x8a\xc4\x3a\xe8\x29\xb3\xd2\xaa\xb8\x3c\x8b\x12\x93\xa5\xb2\x9f\x89\xe8\xa3\x2c\xc6\x47\xa6\x67\xe6\x34\x43\x56\x48\x1a\xc2\x0a\x67\xb9\x82\xd7\xd1\xf3\xbc\x36\xee\x95\x90\x73\xb7\x90\xf0\x1d\xd5\x5a\x16\xbc\x2b\x25\x70\x9d\x56\xbc\x8a\x5e\x82\x8a\xbe\xb5\x49\x46\x3b\x38\xcf\x84\xa0\xf9\xbd\xc1\x32\xf1\x8c\xed\xee\xa0\x3a\xb6\x44\xb8\xf0\xf3\xb6\xb5\x49\xc0\xad\x36\x04\x45\x3b\x97\x90\xe8\x28\x59\x9d\xc7\x20\x10\x56\x53\xc1\x3d\x4a\xad\xe3\xbd\x64\x8f\x13\x5e\x90\x05\xca\xf5\x06\xae\xe5\x3a\x88\x24\xe8\xc4\xbe\x95\xd5\x4a\x07\xf5\xce\xe2\xe0\x45\x7b\xa3\x5f\xcb\x84\x9f\xb9\xa4\x72\x90\xd5\x8d\x6c\xda\x0a\x2b\xe9\xc3\xa4\xa5\xcd\xd6\xc0\x6c\x54\xa4\xed\xe1\x7d\xb6\x43\x2d\x8f\x08\xfd\x71\xdb\x1b\x32\x06\xa2\xbc\x3b\xe2\xa8\xdf\xa3\xd8\x68\x69\xba\xf4\x8f\xcb\xe0\xf1\xdc\x3e\xe0\x68\x2e\x80\xd1\x74\xef\x72\x0f\x98\xb4\xe7\xc1\x79\xf1\xbb\x6f\xbe\x19\xa0\x0c\x71\xc5\x0a\x23\xa1\x18\xd0\x81\x3d\x87\x8c\x59\xaa\x18\xd8\xfe\x88\x06\xea\xfd\xcb\x58\x0c\x66\x06\xe5\x75\x6c\x0f\x91\x74\x2b\x08\xa4\x39\x30\x30\x86\x23\x8c\x0e\x4a\xd0\xcc\x96\x35\x0f\xdd\x0b\x4e\xb7\xdc\xbd\x60\xab\x3d\x0b\xb6\xd9\xa9\x60\x7b\xfd\x09\xb6\xd8\x95\x60\xdb\xbd\x08\xb6\xd2\x81\x60\xeb\x09\xdd\x0f\xdf\x63\x20\x0b\x54\x60\x0e\x98\xc0\xa1\x5d\x04\x06\x42\x0c\xe6\x81\x17\x1c\xdc\x27\xe0\x21\xba\x03\x64\xf2\x71\x0e\xef\x04\x90\x17\x06\x6a\xdb\xa8\xff\x3b\xa4\x7a\xe3\xb5\x9b\x08\xff\x5b\xc1\xf5\xdf\x36\x9a\xff\x16\x31\xfc\xf3\x61\xc9\xe5\xc2\xeb\x1f\x8e\x21\x97\x57\x70\x6c\x09\x91\xff\x1e\x71\xf8\x1f\x04\x7d\xff\xbe\x31\xf7\x77\xb3\xb8\x6d\x28\x86\xf7\x60\xe4\x6e\x9d\x09\xba\x3b\x57\x0e\xc8\x2e\xb8\xc5\x3b\x4a\x36\x86\x17\x7c\x63\x46\xdf\x68\xfb\x19\x96\xf8\xe8\x86\x16\xb0\xaf\xdb\xcc\x15\x58\x0f\xe2\x83\x25\x83\x7d\xe5\x48\x89\x4c\x52\x78\xb3\xb8\xcb\x91\x80\x77\xe7\x2b\x19\xd1\xe1\xe3\x87\x4f\x84\x0e\x43\x7f\x24\x15\xda\x4f\xdd\x8e\x25\x43\x3f\x65\x05\x7f\xca\xb5\x8b\x59\xc1\x0f\x85\x60\xf2\xf9\x25\x66\x96\x4f\x89\x99\xf1\xb5\x83\x89\x99\x9e\x69\x75\x7c\x1a\xe3\xb1\x0b\xa6\xa5\x9c\x5a\x25\xd5\x83\xf9\x75\x32\xf8\xf0\xec\x34\x79\xf4\x42\x31\x00\xea\xa7\x95\x9e\x6c\xb2\x39\x7d\xfa\x91\xb3\x70\x43\xd7\x6a\x63\x58\xdd\x24\x0a\x6f\xf2\x94\x97\xb9\xe9\x7a\xca\xcb\x7c\xca\xcb\x7c\xca\xcb\xbc\xf9\xda\xe5\xec\xa2\x45\x5b\x53\x31\xb6\xe7\x29\x24\x75\xf6\xca\x49\x56\xd4\xf4\x09\x71\x27\xe0\x20\xa1\x85\xe8\xba\x80\xb9\xdc\x0a\xfe\x6b\xcb\xba\x48\x47\x30\xd9\x76\x20\x0f\x0c\xe8\xd8\x9d\xe5\x42\x4b\x76\xe5\x9c\x2d\xe4\x1a\x3e\xa0\x9b\xcb\xb0\x74\xfe\x68\x1c\xb6\x64\x30\x78\x2f\x30\x69\x16\x0c\x8d\xed\xb3\x15\x63\xbb\xe7\xd3\x75\x82\x1c\xe4\xe8\xb0\xe8\x70\x6c\x09\x5a\x16\xb5\xef\xee\x9a\x96\x4c\x19\xa9\xb9\x52\x52\xb9\x4c\xb5\xf8\xf5\xb1\xf0\x89\xcf\x17\x86\x29\xf4\x90\x62\x79\x46\xba\xf8\x3c\x67\xc6\xed\x02\xd8\x45\x46\x12\x2a\x10\x7b\xd5\xfe\xdb\x83\x7c\xc0\xd4\x78\x0d\x64\xca\x16\xf4\x8a\xcb\x76\x00\xa8\xda\x39\xea\x53\x7b\xee\x91\x60\x2b\x2c\x65\x1b\x72\x51\x5a\x6d\x27\x23\xac\x82\x5e\xe7\x83\xe4\xa1\xdf\x76\x0f\x05\xb7\x79\x29\x7d\x30\x7a\xcc\x3e\x70\x6d\xd6\xe7\xdc\xb3\x80\xcb\x7d\xda\xca\x66\xbe\xd2\x8d\x3d\x7d\x7f\x4c\x86\xe9\xcd\xb1\x85\x7b\x44\xf4\x5d\x20\x57\xe7\xf0\xd5\xc7\x1c\x20\xae\xdf\x0f\x42\x96\x93\x9a\x16\x0b\x2e\x32\x40\xd4\xfe\xd8\x23\xac\xe7\x09\x99\x90\xc3\xaa\xea\xea\x98\x74\x28\x1d\xf4\x9e\x91\xfe\x4b\xd9\x45\x4a\x22\xc7\x72\xae\x62\x25\xe4\x59\xa1\x8a\x05\xf5\x89\x9a\x4f\xdc\x00\x93\xab\xfa\x9a\x2a\x36\x29\x64\x4d\x8e\xce\x4f\x49\xa9\x78\x62\x07\xae\x2d\xd7\x9f\xe3\x12\x9f\xa5\x85\xae\x3f\x37\x7f\xcf\x93\xaf\x67\xa7\x7c\x3d\xa1\x84\xa1\xe2\xc5\xf2\xf4\x38\x6f\x59\x04\x3e\xd3\x2b\x9a\x3a\x94\x44\xd8\xcf\xc9\xb7\x54\xb3\x92\xbc\xa1\x82\xce\x31\x60\xb5\x7f\x7e\xf6\xed\x9b\x03\xcb\xf0\x10\x8c\x3b\x3d\xde\x58\x37\x71\x1e\x3f\xfc\xed\xb6\x10\xcf\xc9\xea\xd4\x65\xd3\xed\xd7\x9e\x9a\x38\x7d\x5b\x03\x83\x27\x41\x6d\x3d\x1b\x10\x04\xde\x00\x90\x7f\xb6\xda\xff\x0b\x0b\x15\x7c\xb3\x46\xbd\x7a\xa4\x5e\xd5\xe5\xe5\x43\x4f\xc0\x7a\x34\xd2\xda\x8f\x97\x6c\x79\x67\xe9\x3d\x86\x15\x1c\x38\x38\xbe\x47\x4d\x6f\xee\x12\x14\x65\xca\xdc\x46\xe1\xa7\x65\xcd\x7d\x42\x66\x5c\x6f\x5d\xcf\x8d\xa2\x86\xcd\x97\xc7\xac\xa9\xe4\xd2\x72\xf1\x59\x94\xb8\x83\xb7\x4e\x51\x95\x56\x53\x5a\x10\xd5\x56\xd0\x0b\xa1\x5c\xeb\x90\x28\x18\x2b\x3b\x31\xcf\x85\x36\xb4\xaa\xec\x02\xc2\xf3\x6f\xa5\xe8\x93\x95\x83\x4f\x55\x03\xc6\x48\xe7\x47\xef\xea\x77\x08\x7e\xfb\xb1\xd5\xfe\x74\x45\x00\x86\xff\x38\xbf\xdd\x25\x13\xf2\x93\x73\x1e\x53\x14\x06\x94\x68\xef\xdb\xca\x1e\xd0\x55\xd9\xef\xa8\x8c\x26\x87\x63\x05\xec\xd6\x00\xf2\xcf\xbe\xa4\x73\x01\x4a\xa6\x7b\xa9\x10\xd1\xcf\x3f\x69\x7c\x6c\xda\x7c\xbd\x40\x0d\xd4\x3e\x98\xd0\xa6\xa9\x38\xa2\x0c\x48\xe5\x92\x70\xa3\x78\xf2\xfa\x6d\x9f\x22\x6a\xef\xa8\x86\xde\x4d\xed\x1c\x93\x2b\xa6\xa6\x9f\xe2\x7f\xbb\xab\x46\x49\x1b\x0e\xe9\x4c\x9f\x2c\xc2\x52\x95\xc6\xc3\xb3\x53\x1c\x68\x53\x84\xdf\x7f\x89\x0c\xe1\x96\xda\x27\xf4\x60\x39\x9a\x0b\x03\x84\x66\x4e\x87\x67\xa7\xd8\x23\xcd\xf5\x73\xea\x42\x03\xd6\x62\xa7\x58\x7c\xd9\xb5\xa1\xa5\x73\xfb\x44\x43\xa4\x60\x77\x69\x68\x6a\x29\x60\xa2\xad\x19\xf6\x8a\x0a\xc4\x10\x2e\x60\x9c\x40\x45\x17\x81\x40\xaf\xf2\x84\xec\xed\xc5\x36\x21\xc2\xb3\xa8\x88\x6e\x10\x75\x7b\x5f\xf6\xee\xb2\x72\xad\x7b\xb1\x4f\x3d\xe1\xef\x9e\xf5\x7c\xc7\x2c\xe7\x84\x13\x33\x43\xe6\x8e\x90\xe2\xbd\x9b\xef\x1f\xde\x7f\x7f\xef\x0c\xfa\xb6\x3f\x9c\xeb\xd8\xc3\xa0\xdb\x68\x43\x95\xe1\xb4\x22\xad\xaa\x7c\x7a\x21\x22\x91\xb8\x8a\xc0\x05\xbd\x8a\xba\x21\x4d\x08\xf9\x12\xb9\xd2\x31\x03\x8a\x32\x70\x8a\xba\xee\x60\xb3\xb6\xaa\x46\x64\xc6\x05\xb5\x07\x19\x6b\x48\x94\xe4\xf5\xc9\x14\x9f\x73\x51\x30\x3b\x4d\x63\xcf\x97\x04\x28\xf7\x6e\xa3\x20\xd3\x20\x47\x33\x0e\xb9\x20\x29\x56\xbe\x15\xe0\x17\x9e\x49\x45\x8e\xaa\x56\x1b\xa6\xde\x4b\x7b\x0c\x77\xe5\x26\x64\xa6\x64\x4d\x68\xfc\xf5\xb7\x5c\x94\x77\xaa\x84\x7a\x0f\x47\x7b\x41\x05\x61\x1c\x12\xa3\xec\xd0\x90\x0f\x6d\x99\xbd\xdb\x54\xfb\xba\x2d\x16\x76\x8a\xf6\x1a\x59\xea\x3d\x2b\x9d\xf7\x30\xdc\xa8\xf7\x0e\xec\x5f\xab\xef\x8a\xd5\x1b\xd1\xef\x9e\xd3\x86\xef\x1d\x8c\x08\x4c\x38\x24\xe7\xc9\x4f\xcf\xc6\xfb\x4c\xf7\x91\x9f\x30\x70\xf5\x25\xed\xa2\xf7\xf1\x13\x60\x63\x88\x2e\xf5\xed\x7a\xc1\x0d\xd6\xeb\xd8\x9d\x82\x31\x80\xd0\x6b\x66\xf5\x20\x25\xe4\xd0\x07\xd1\xec\xd6\xaa\x19\xf5\xf9\xba\xec\x8a\xa9\xa5\x59\xb8\x06\x16\x5e\x8a\x3e\xad\x1c\xec\x8c\x41\xab\xe6\x44\x99\x5f\xa1\x6e\xbb\x81\x4c\x58\x5b\xa1\x67\x5f\x3e\x5b\x3d\x92\xba\x33\xf8\xdf\x7b\x3d\x40\x09\x4b\x5a\x8b\x1f\xed\x2f\xfb\xeb\x80\x1f\xe1\x61\x12\xc4\xe1\xf7\xdf\xbb\xf4\x14\x9c\xf0\xef\xb8\x80\xa8\x37\xe8\x43\x1e\x0b\xc0\x2d\xda\xc6\x95\x02\x0a\xff\x6d\x57\x69\xdd\xe8\xfa\x54\x43\xe9\x16\x1a\xbd\x9d\x79\xd3\xa3\x6e\x7d\x80\x33\x56\xdf\xc8\x72\xf3\x26\xee\x31\xc9\x69\x74\x73\xc8\x25\xee\xdc\x9c\xee\x59\xce\x72\x5a\x36\x1b\xad\xd0\xdb\xd7\xf4\x96\xf5\xbb\x89\x92\xce\x4f\x07\x62\x3f\xfa\xe6\xa2\x4b\x8c\x20\xb3\x8a\xce\x3b\x5e\x04\x21\x8e\x9a\xfd\xd1\xf9\x8f\xfe\x15\x34\xb9\x01\x7a\xf8\xa3\xa6\xd3\xc7\x8c\xa5\x71\x37\x4b\x37\xde\x71\x63\x28\xe3\xe3\x16\x53\x78\xf8\xcd\xdc\xf4\x29\x79\x5f\xe6\x56\x57\xfd\x4d\xf3\xef\x5d\xeb\x34\xe2\x04\xdf\x39\xce\xbb\x42\xa0\xda\x04\x74\xb8\xf3\x1f\x7b\x6c\xf2\x11\x7a\x6f\x60\xda\x4b\xb6\xbc\x96\xaa\xfc\x38\xc3\x1e\x06\x61\xe6\x7f\xe2\x8d\x79\x9f\x0c\x86\xee\x78\xb9\x31\xb0\x93\xcc\xaa\xb7\x12\x5f\xd1\x29\xab\x3e\x4e\xfa\x0d\x86\xc1\x1b\xda\xd8\xd7\xe9\x4a\x36\xd1\x23\xe5\xb2\xcc\xd0\x3a\xc5\x3a\x1f\x5f\x91\x26\xd5\x9c\x0a\xfe\x4f\xac\x73\x2d\xac\xa4\x90\x8a\xff\x73\x33\xab\xed\x63\x4c\x1f\x7d\x5c\x15\x2b\xcc\x81\xe3\xfa\x8d\x22\xfb\x23\xdb\x82\x96\x25\x47\x15\xec\xec\x23\x1c\x7c\xfb\x7c\x71\x71\x79\x97\x95\x86\xfb\xb1\xcc\xa6\x0b\xec\xdd\xe3\x32\xdf\x22\x16\x3e\xbe\x73\x6f\x4f\xa3\xfb\x84\xe3\xa9\x55\xb7\x14\x8a\xdc\xfa\xfb\x9a\x72\x3c\xb5\x37\xb7\xf1\xba\x61\x76\x1d\x37\x51\xa7\x5b\x5b\x59\x6a\xdf\x2f\x3c\xed\x01\xf6\xd5\xa0\x09\x67\x35\xe5\xa9\x33\x86\xd7\x80\x25\xab\xa9\x69\x15\x37\x1b\x4f\xea\xdb\x7f\xc8\xc5\x77\xed\x94\xfd\xc8\x94\xb6\xeb\x71\xd7\x9f\x0b\xa8\x38\x3b\x3c\x3b\xdd\x38\x2d\x79\x4e\xe4\x1b\x1d\x19\xe0\x37\x73\x94\x5b\x75\x91\xb4\x82\xd6\x53\x3e\x6f\x65\xab\xab\x65\x1c\x41\xa1\xe4\x92\x8b\x72\x42\xc8\x29\xba\x55\xc5\x33\x43\xa8\x90\x62\x59\xbb\x5b\x45\x51\xb5\x25\xeb\x3d\xf1\xa6\xa3\x4c\x12\x7a\x25\x79\x49\x68\x6b\x64\x4d\x0d\x2f\x48\x21\x99\x2a\x00\x44\x35\x7e\x7e\xab\x19\xa1\xbd\x27\x76\xbf\x2d\x5a\x6d\x64\x4d\x6a\xaa\xf4\x82\x56\xd5\x4d\x2c\x91\x41\x3b\x00\x77\xda\x8d\xdf\xda\x59\xb9\xf1\xcb\xab\x5b\xe6\xe1\xe3\xdb\x01\x06\x1e\xb4\x1d\x2c\x71\x83\x1e\x70\x75\x33\x53\x7f\xc2\x33\x1c\x02\xee\xc6\xbe\x1c\x3d\xfe\xbc\x58\x30\xd2\xb4\xd3\x8a\x6b\x30\xe1\x41\x70\x2d\xc9\x94\x2d\xb8\x2b\xbd\xf9\xb8\xc4\xba\x71\x89\x3f\x36\xcf\xb7\x89\x8c\x8f\xce\xd0\x2d\x12\xfe\xd6\xdf\xba\x13\xf0\xb4\xa6\xf3\x4f\x50\xed\x6f\xd8\xbe\xdf\x5b\xb1\x4f\xc5\x32\x9c\xa7\xd0\x4c\x55\x8f\x88\x54\xae\x90\xd8\xdb\x7e\xca\x7d\x15\x5a\x04\x2b\xf2\xce\xcd\xa8\xab\x8b\x76\xdb\x00\x50\x06\x98\x9a\x49\x55\xdb\x79\xe7\x8a\xcc\x5a\x01\xde\xf0\x1b\xec\x42\xc8\xe1\x83\xf3\xc7\x39\x33\x69\xa5\x65\x10\x06\xb0\x6c\xc2\x13\x46\xa8\x26\xd7\xac\xaa\x30\x8d\x08\x3b\xbf\x46\xb0\xcd\x1d\x96\x65\x97\x4a\x38\xdd\x6c\x5b\x96\x7c\xce\xb4\x21\xfb\xe7\x7f\x3d\x3c\x00\x85\x08\x9c\x75\x4b\x62\xe8\x7c\xb2\x92\x1f\x8e\xc9\xa4\x56\xdd\x2a\x5b\x50\xcb\x0a\x6a\x68\x25\xe7\x98\x81\x66\x45\x8a\xfd\x7d\x53\xd1\x25\x94\x71\x35\x54\x41\xad\x60\x81\x0e\x4b\xa2\x5a\x71\x53\xe7\xef\xfb\x3b\x29\x3f\x2e\x93\x6e\xeb\xa9\x7d\x4b\x78\xf8\xe3\x32\xe7\x23\x7d\x82\xef\xf7\x08\x56\xac\xf9\xff\xd8\xbb\xb6\xde\xc6\x6d\x25\xfc\xde\x5f\x41\xf8\x25\x6d\x10\x67\x71\xd0\xee\x79\xe8\x5b\xe0\xa4\x40\x70\x72\x59\x38\x69\xfb\x5a\xc6\x62\x6c\x21\x32\xa9\x92\x52\x2e\x2d\xfa\xdf\x0f\x38\x43\x52\xa2\x2d\x91\x94\xad\x38\x8b\x45\xf5\x92\x5d\x4b\xbc\xdf\x66\xbe\x99\xf9\x58\xd0\x1e\xc0\x6a\x6b\xbf\x68\xa8\x0f\xb5\xde\x02\xc0\x86\xe0\xcc\xe5\x71\x4a\xee\x70\x3e\xad\x69\xb5\x40\xff\x90\x3f\xd6\xac\xa2\x19\xad\xe8\xa9\x56\xee\xff\xf0\x29\x92\x44\x91\xe9\x8c\xfa\x07\xba\xa7\xce\x28\x8a\x8b\xf8\x1e\x77\xa5\x55\x0b\xf7\x39\x28\x5c\x76\xdd\x06\x11\xb2\x3d\xb7\x37\x68\xfe\xc5\xab\xd6\xad\x83\xa6\x7c\xaf\xae\x9b\x89\x7c\xec\xa9\xf0\x5b\x62\x66\xeb\x9a\xf1\x4a\x9d\xc2\xd0\xb4\x7f\x01\x7b\xc2\xd9\xcd\x79\x3f\x1c\x1b\x07\x92\x22\xc0\x51\xba\xcd\xe6\x2c\x50\x77\x6b\xb2\x31\x6f\x7c\x5b\xa2\x25\xca\x00\x1a\x26\x24\x6f\xa0\xdc\x9d\x4a\xf0\x71\xa0\x58\x1c\xe7\x86\xca\xa5\x51\x0a\xfb\xc1\xb6\x24\x8b\x70\x8a\x1d\x38\xc6\xac\x33\x75\xcd\xe8\xfd\x28\xcd\x2c\x1c\x65\xbf\xe9\x63\xb7\xc1\x31\x01\x5a\x05\x8b\xfc\xbb\x61\x48\x35\xa3\x27\x82\x85\xb6\xa9\x03\x2a\x1a\x35\x02\xba\x59\xe0\x39\xf1\x3e\xb1\xb7\x23\xa3\xe9\xea\x15\xb4\xca\x4b\xe4\x6f\x32\x36\xc1\xd8\xf0\xe3\xf3\x1b\x2d\xf2\xcc\x15\x80\x6b\xe9\x92\x9f\x90\x1b\x51\xe9\x3f\x17\xaf\xb9\xaa\x10\x63\x38\x17\x4c\xdd\x88\x0a\x7e\x19\xa5\xa7\xb0\x82\x63\xf6\x93\x81\x41\xd0\x00\x04\xcb\xbd\x05\x96\x98\xfe\xc0\x3b\x14\x1a\x79\x4f\x7f\x7d\xc9\xb5\x40\x83\x4d\x8e\x14\xe1\x48\xe1\x94\x29\xc0\x92\x25\x70\xc1\xa7\x36\x46\x6b\xbb\x04\xd3\x8f\x42\x7a\xdd\xb8\x73\x61\xa6\x20\x0c\x6f\x80\x37\xb9\xb2\xe7\x92\x13\x43\xa8\x85\x86\xa3\xb8\xf4\x9a\xc9\x25\xd8\x76\x17\x11\x5b\x64\x2a\x22\x9f\x84\xc3\x27\xa3\xef\x3b\x61\xee\x3b\x24\x82\x33\xe9\xaa\x17\x9f\x23\x03\xe6\x63\x2b\x2b\xdc\xf5\xd7\x08\xdc\xfd\xad\x37\x77\x18\xd2\x7f\x80\x50\x51\x9d\x92\x33\xa2\x72\xbe\x2c\x98\xf7\xce\x98\xdb\x5b\xd9\x04\x8a\x2a\x21\x4a\xf1\xcf\x3a\x7f\xa6\x85\x3e\x66\x20\x2a\xc4\x51\xb1\x88\xc7\xad\xc3\xf6\xc4\x10\x27\xea\x0d\xd1\x89\xb1\x93\x27\xf6\x36\x39\x09\x86\xc9\xb4\x67\xf4\xe4\x92\x4f\x1a\x8e\x21\x6f\x96\xba\x33\x0d\x24\xe3\x09\xbc\x9b\xec\x7e\x6e\x07\x4f\xa8\x74\x94\x91\xc4\xa7\xdc\xb0\xd8\x3b\xf5\x94\x77\xbb\x25\xa5\x4c\x12\x2b\x5f\x7e\xaf\x7e\x00\x5c\x8d\x33\x02\x24\x58\x12\x4c\x12\xfa\xd7\x36\xa3\xb3\xd6\x58\x9e\xf2\xb2\x6c\xe8\xb6\xeb\x72\x29\x69\xc6\xc8\x52\xd2\xb2\x67\xd1\x0e\x93\x4e\x51\xc4\xed\x2a\x32\xa0\x96\x7d\xfd\x3a\x50\xcf\x58\x07\x50\x87\x60\xba\x17\xf6\xb0\x12\xe2\x09\x98\x71\x60\xde\xbd\x23\xa4\xf6\x3b\x96\x75\xde\xfc\x66\xe1\x0e\x45\x32\x56\xd1\xbc\x00\x17\xc1\xdb\xab\x6b\xe3\x44\x68\x65\x35\x5b\xcb\xee\x3d\x63\x04\xdd\x90\x66\xc6\x4f\x76\xce\x9e\x73\xf6\x62\x90\xb3\xbe\x2d\x6a\x4a\x96\x8c\x83\x83\x5a\xc0\xcd\x74\x4a\x54\x9e\xb1\x0b\x08\xb5\xee\xcf\x68\x0f\x23\x59\x4f\x9d\x63\x7b\x45\xf8\xac\x8b\x9e\x73\x09\x67\x9c\x43\x50\xbe\x08\x19\x60\x96\x4f\xa3\x59\x4b\xa3\x50\x73\x51\xca\x3f\xfd\xf4\x63\xe0\x5c\x79\xcd\xd7\xf5\xfa\x67\xf2\xdf\xcf\x9f\x7f\xfc\xdc\xff\x59\xce\xf1\xb3\xff\xf4\xb7\xcf\xac\xb6\xd9\xfc\xfc\x2b\xe8\xef\xcc\xf9\x7b\x87\x0d\xf0\x09\x59\x3d\xd2\xbc\xa8\xa5\x09\x97\x48\xd4\x1e\x7f\x69\xa7\x01\xe3\x69\x13\x56\x4b\x6d\x8e\xd6\xcf\xd8\xf8\x1f\x3f\xe6\x9c\x29\xb2\x12\x2f\xa4\xe6\x92\x2d\xc4\x92\xe7\x7f\xb1\x0c\xc9\x72\x15\x3a\xc0\xc1\x55\xf2\x76\x8a\x13\xc6\xb3\x52\xe4\xbc\x82\x23\x76\x45\x79\x56\x84\x7c\x95\x12\x5a\xda\x5e\xc1\x7b\x75\x19\x9c\x46\x83\x3a\xec\xba\x49\xb1\xd1\x5d\xba\xcd\xd6\xd4\x8c\xa7\x1c\x76\xdb\x5e\x2d\xc5\x8d\xf1\x2e\x80\xb9\x74\xd4\x71\x18\x24\x80\x50\x07\xfc\xf6\x67\xcd\xe4\x1b\xc4\xed\x36\x8a\x5b\xcb\xa3\xf8\xbe\xa1\x6f\xb4\x6d\x34\x42\x25\xed\xb5\x09\x90\x0e\x48\xa6\x25\x6a\x35\x0e\x6e\x1b\xb5\x82\x34\x0c\xdd\x74\xac\xd5\x97\x9c\x11\x5e\x17\x45\xa0\xa4\x9e\x4c\xb8\x08\x59\x8e\xf1\x49\xc2\x1f\xd2\x80\x81\x54\x08\x0a\x9f\x8f\x03\xa2\xda\x0d\x1f\x49\x8b\x1a\xea\x4e\xfc\x41\x00\x15\x3e\xbb\xc0\x54\xf8\x0c\x08\x5f\x48\x0f\x5d\x48\xa3\x84\x4e\x80\xaf\xf0\x19\x12\xdb\x90\x48\xe4\xfc\x9e\x80\x16\x3e\x83\x7c\xe0\xd2\xc0\xad\x8e\xaa\x27\xfa\xb9\xbf\x23\xd0\x85\xcf\x7b\xc0\x5d\xf8\x0c\xea\xc7\x14\xe8\x0b\x9f\x5d\x7a\xf1\x00\x30\x98\x69\xf3\x21\xc1\xb0\x48\x91\x23\x43\x62\xf8\x24\x03\x63\xa6\x72\x83\x1c\x56\x07\x38\xab\x0e\x74\x54\xdd\xc3\x49\x75\xe7\xa4\x09\xe0\x19\x3e\xc3\x66\xf4\x01\x81\x34\x5b\xe0\xc1\xe0\x34\x7c\x0e\x0d\xaa\xe1\x93\x7c\x9e\x0e\x03\xd8\xda\x99\x47\xa6\xeb\x2e\x44\x57\x92\xe5\xfc\x59\xe0\x7d\x9f\x83\x94\x88\xf9\x56\xc2\x0d\x5d\xe2\x05\x8e\x51\xa3\x4c\x38\xed\xab\xad\x53\xad\x84\x78\x22\xb5\x8a\x5b\xd4\x82\xed\x8e\x84\xc7\x8e\xa2\x04\x0f\x59\x61\xf3\xba\x60\xbf\xe7\xd5\xea\xb6\xa1\x5c\x81\x65\x56\xd5\x65\x01\x7d\xd1\x7a\xa1\xe7\xe5\xbc\x51\x4e\x2e\x2b\xdc\x62\x17\x62\xbd\x66\x3c\x43\x6f\xcb\x35\x7d\x0a\x4f\x78\xa5\xd5\x5b\x8c\x2a\x28\x0a\x54\xe1\xa0\x28\xf6\x5a\x52\xde\x28\x2b\xcf\xfa\xa0\x0e\x4d\xe1\xc4\x09\x9c\x2a\x93\x25\xc7\x99\x0e\x96\xb7\x37\xe3\x4a\x5b\x81\xa1\x5e\xfc\x28\x79\x60\x85\x00\x4e\x29\x8c\x9c\xc0\x28\xa3\xe4\x50\xcb\xcb\x47\x9b\xca\x48\x4e\xe6\x9e\x22\xc6\x97\x0d\xd1\xbc\x2a\xf2\x05\x73\x47\xa6\x48\x21\xf3\x99\x1b\x69\x3a\x4d\x40\x4f\x39\xfb\x12\xcf\xbd\x01\x67\xde\x1e\xe7\x1d\x2d\xf3\x38\x14\x88\xcf\x0e\x23\x6f\xb3\x6e\x8f\xfd\xb3\xfd\x2d\x65\xf4\xed\xc7\xff\x8e\x7f\xe8\xd9\x63\xfc\x1b\xaa\xa9\xb1\x87\xdf\xdf\x51\x1b\x19\xd8\x8d\xfd\xc6\xd1\xb2\xa0\x52\x1f\xf6\x80\xe4\x4f\xc9\x6c\x7e\x71\x76\x7f\x71\x42\x7e\xfd\x72\x0e\x7f\xcf\x2f\xae\x2e\xf4\xdf\xd9\xed\xcd\xcd\xc5\xec\x5e\x0b\xcf\xc7\xd1\x2a\xc0\x45\xce\x45\x81\xa3\xaf\x25\x14\xe1\x6f\xe6\x94\xbf\x91\xc7\xba\xd2\x3b\x72\x53\x19\xaf\x96\x14\x21\x44\x9a\x65\x29\xc1\x8e\xdf\xdc\x1c\xf4\xc6\xdc\x0d\xe8\x26\x6a\xdb\xea\x33\x73\x77\xb6\x89\xeb\x8f\xb7\xec\x30\x93\x3c\x39\x4e\x73\xe8\x1c\xdf\x2d\x84\xf3\xbb\x68\xbe\xbf\x08\x49\xd8\x2b\x5d\x97\x45\x42\x84\xdc\x51\x29\x32\x75\x64\x62\x75\xf5\xbf\xe3\xdd\x0e\x49\x3e\x15\x62\x79\xe4\x42\x7c\x19\x29\xc4\x92\xa8\xfa\xc1\xc5\x6f\x83\x20\x98\x94\xdb\xb1\xcd\xc6\x0b\x46\x3d\x71\x41\xde\xad\x5c\x93\x2b\xe7\xe5\xd9\xce\x60\x48\xbd\x3e\xa9\x05\x2d\x98\x97\x93\xfe\x61\x68\x85\x8e\x3f\x75\xb7\xd0\x6a\x2a\xb9\xdc\xc8\x31\x65\xa7\x78\xc9\x8b\x6c\x41\x65\xb6\xb5\x5d\x80\xe8\x87\xab\x09\x66\x0e\x5e\x0c\xc8\x41\x70\x6c\x8a\x46\x22\xc8\x38\x62\xf5\xcc\x64\x41\x4b\x8c\x03\x84\x1b\x2d\xc1\x6f\x39\xa1\x8a\xe7\xac\x64\xc0\x23\x80\x97\x78\x31\xc2\xf8\xa2\x10\xc0\x74\x89\x52\xe7\x89\x3f\x2c\xe8\xe5\x6c\x2f\xdc\x49\x8d\x0f\xff\xc6\x8f\x57\x08\x28\x1b\x7b\xd7\xc1\x28\xb5\x5e\x36\x5a\x1b\x7f\x1c\xcd\x07\xc1\x40\xa7\x65\x33\x32\x31\x24\x12\x93\x13\x32\x71\xc4\xa3\x99\xd1\xc8\x27\xc7\x71\x4a\x67\x97\x41\x9b\x39\x00\x14\x76\xe3\xe9\x30\x85\x7a\xb6\x89\x5a\x60\x76\x5b\x1f\x8d\xe4\xaa\x37\xa4\xbc\x5a\xa4\x34\xa6\x16\x68\x83\x5f\x50\x3c\xa7\x76\x43\xb7\x6a\xdd\x30\x74\xec\x5d\xe3\xc9\xb1\x97\x7d\x65\xd9\xc9\x09\x17\x66\xf0\x24\xd3\xb3\x31\x14\x0a\xd0\x7e\xee\xbc\xb5\xe7\x7c\x5c\xda\xac\xc4\xb9\x24\x25\x95\x8c\x57\xae\xf2\xf1\x6c\xcd\x25\xce\x00\xc6\x1c\x4f\xd2\x56\x65\x70\x11\xb5\xdc\x1a\x12\xb1\x8a\x3b\x97\x62\x56\x50\xa5\x3a\x0c\x9e\x70\x06\xe8\x8c\x0d\x37\xbd\x3e\x7b\x8d\xcf\x07\x5c\x65\xba\xa2\xcf\x81\xa6\x26\x54\xba\xa2\x72\xc9\xaa\xb0\x43\x02\xe5\x6f\xb7\xc1\x4b\x20\xa6\xc9\x57\xc3\x4d\x77\x40\x8c\x72\x5e\x4d\x85\x9c\x62\x92\x9f\x49\x25\xeb\x3e\xdc\xa1\xca\xd7\x4c\xd4\xd5\x1d\x5b\x08\xde\x1d\x34\x6c\xbe\x1b\xcd\xc3\x62\x40\x24\xb5\x71\xf2\x39\xb3\xe2\x77\xfb\x66\x1a\x0b\x47\x35\xb2\xb9\x75\xec\xf1\xc9\x45\x6f\xaf\xae\xf7\x19\x6c\x02\x0c\x52\xe1\x91\xfc\xcd\x9c\xc9\x7c\xe9\x6a\x6a\x6a\x1e\x4c\x76\x5d\x57\xc3\x13\xcd\x9c\xc3\x48\xf8\x6b\xd3\x19\x61\xa2\xc7\xde\xf6\xab\x8a\x56\xf5\xd6\x6c\x88\x1d\x45\x66\x7f\xbf\x43\x22\x07\xa3\xde\xdf\x41\x56\x6d\x9b\x55\x9b\x43\x0e\x35\x3a\x24\xd1\x84\xef\x6c\x44\xc9\x29\x31\x09\xf5\x92\xad\x24\xcd\x11\x0e\xa3\x8b\xaa\xa6\xdb\x26\x77\x9d\xd8\x44\xa3\x74\x33\xc7\x06\x00\xb1\x10\x08\xb6\x60\xb2\x52\x57\x54\x55\xbf\x96\x19\xed\xe1\x10\xd8\x88\x32\x51\x15\xac\x29\xd4\x69\x5f\x38\xcb\xf4\x21\x64\xba\x04\xf3\x23\x2f\x7a\x77\xaf\x31\xc7\x8e\x0c\x23\xb3\xd2\xae\x31\x9d\x7c\xaa\x8b\xea\xae\xf5\x5c\xe8\x3e\x39\xeb\xdc\xa3\xfc\x60\x9e\x58\x6d\xf5\x89\x26\x21\x37\xc2\xd9\x6b\x97\x54\xb9\x7f\x8d\x0b\x46\x79\x77\xb0\xa5\x57\xd7\x19\x7e\x37\x7c\x4e\x99\x02\xc8\xcb\x2a\xd7\xea\x16\x72\x2d\x28\x62\x85\xd8\x8c\x15\xac\x87\x72\x61\xcf\xf8\x1f\x53\xc2\xb9\x29\x60\x5f\xd7\xe9\x2f\x7e\x76\xce\xe2\x6d\x74\x4b\x13\x95\xdb\x68\x69\x46\xf6\x71\x58\xc5\x66\x83\x41\x78\x7b\x28\xc4\xe2\x09\x49\xcd\x81\xd4\x2c\xff\x8b\xc9\x80\x90\x01\x56\xc4\x9c\x67\xf9\xc2\xb9\x2b\x94\x52\x2c\x25\x53\x5e\x57\x23\x07\xac\xc2\xdc\x75\x99\xba\xcf\x5d\xb9\x42\x36\xb6\x9d\x9a\x1b\xda\x8b\xc3\x84\x28\x59\xbd\x1c\xe2\x37\x3d\x5b\xfa\xb6\x8a\x8e\xfc\x92\x70\x2b\x86\x01\x68\xe8\xda\x04\x59\x7f\xfa\x5f\x7f\xe8\xf1\xa8\xf1\x43\xa1\x00\x68\xfc\x22\xb7\xf7\xde\x04\xbf\x0a\x84\x4a\xa7\x9a\x02\x22\x21\xd1\x24\x5d\x75\x72\x55\x4e\xc9\x6d\xd4\x98\x8a\xd1\xdd\x64\x12\xd8\x80\x87\x38\xbf\xa4\xde\x1e\x35\xc8\xec\xcd\x87\x5c\x9b\xe2\xad\x96\x46\x99\x32\xdc\x29\xe8\x1f\xf7\x28\x64\xaf\xda\x36\x5e\xe5\xc3\x01\xf4\xd1\x8c\xb4\x4c\xdb\xef\x88\xee\x1f\xdc\x76\x07\x75\x49\x4e\x08\x25\xab\x5c\x55\x42\x1a\x0f\x11\x7d\x00\x56\x92\x72\x85\xef\x7b\xcf\x8a\x7d\x5d\xdb\x67\xae\x0a\x84\x96\x25\xa3\xd2\xda\xe9\xcd\x71\x46\x15\x80\xa8\x0b\x21\xb3\xce\x8a\x59\x48\xa6\x53\x1c\xeb\x2c\x7e\x04\xee\x90\x82\xaa\xea\xde\xd5\x41\xcb\x14\x89\xbb\xb1\x2f\x31\x99\x26\x36\xad\xb1\x1c\x96\x82\x37\x2f\x05\xa1\xdc\x00\x55\x7d\x45\x24\xcd\xaf\xb8\x5c\xd2\xb4\x0d\x05\xc0\x9d\xda\xf5\xe2\x84\xbd\x56\x13\x0f\x53\xf3\x35\x53\x2a\x18\x50\xbe\xc1\x64\x03\x37\x4e\x11\x77\xe3\x94\x49\x6e\x0f\x7b\x14\x1c\x30\xb6\xc2\x32\x33\xbf\xf5\x4f\x35\x02\x62\x02\xc2\x20\x6e\x59\xed\x35\x64\xe5\x8a\xaa\xd4\xc6\xb8\x55\xe4\x62\x78\x92\x97\x43\x62\x6d\x24\xa3\x2a\xc4\xcd\x31\xc4\x09\xfa\x41\xe6\xec\x91\xcc\xe8\x9a\x15\x33\xaa\xc6\xec\x79\xd8\x1e\x42\x50\x0d\x3b\x5d\x9e\x92\xa3\x79\xcb\x4d\xe6\x46\x54\xd7\xac\x3a\xda\xad\x6f\xd2\x36\x82\x77\xdd\x02\xf6\x56\x47\xe2\x0b\x7e\xcf\xa5\xbe\x77\x0d\x03\x0b\xfb\xab\x58\xd2\x61\x5e\x9a\xbe\x65\xec\x2f\xe0\x5a\x02\x3c\xb9\xd8\x75\x21\x47\xb8\x2e\xfa\x16\x6f\xca\xb2\xfd\xa0\x05\x3b\x64\xa9\x46\x5a\xef\xb2\xb8\xeb\x84\x7a\xb6\x3a\xe2\xde\x53\xa7\xc1\x56\xd4\xf6\x8d\xc7\x9b\xa8\x72\xa5\x95\xbc\x31\x05\xa3\x8f\xe5\x8f\x32\x83\xda\xfb\x3e\x20\xf9\x4f\xc3\xe7\xfc\xbe\xdc\x54\x19\xd8\xdf\xf4\x0c\x38\xa4\xbb\xdc\xb9\x2d\xd5\x00\x30\xee\xfe\x1b\xf8\x1f\x5a\xf7\x5d\xcd\xbc\xf9\xf1\x7d\x25\x48\x29\xd9\x33\xc4\x51\x70\x88\x0f\x65\x84\x33\xa5\x17\xca\x0f\x81\xe2\x13\x55\xb6\x34\x75\x2d\xae\x4a\x47\xd5\x64\x12\x1f\x5a\xfb\x51\x68\x80\xf1\x49\xd5\x0a\x13\xb4\xee\x01\xea\x60\x5c\xa7\x1a\x90\x59\x54\xc0\x1c\x98\x5f\x37\xf0\xbc\xf9\x6c\x5c\x55\xa3\x93\xcc\x61\x3f\x47\x4f\x8b\x85\xde\x95\x17\x70\x0b\x13\x6e\xf3\xee\xa2\xbc\x36\xc8\x3c\xdf\xdc\x03\xc1\xe7\xde\x9f\xe1\x63\x35\xab\xae\xf3\xf1\xfa\x3c\x4a\x0a\x97\x9c\xdf\x57\xc0\x70\x17\x9d\x40\xef\x4b\x79\x85\x4f\x6c\xd6\x7d\xfc\x7c\x4b\x61\x3b\x0d\xce\xb1\x77\x22\x1b\x54\x4c\x3e\xb3\xcc\xb3\x30\x9a\xdb\xd0\xfc\xdf\x5a\xf6\xe8\x26\x7f\xd3\xed\xe4\xef\x7f\xbe\xfb\x7f\x00\x00\x00\xff\xff\x90\x1c\x07\x44\xe8\x50\x0c\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -225,7 +225,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xe4\xb6\x95\x28\xfe\x7f\x3e\x05\x4a\x49\x95\xa4\xa4\xbb\x67\x9c\xcd\xdd\xcd\x9d\x9b\x4a\x4a\x96\x34\x59\x5d\x7b\xc6\xba\xa3\xb1\x53\xfb\xf3\x7a\xd7\x10\x89\xee\x46\x44\x02\x34\x01\xb6\xa6\xb3\xde\xef\xfe\x2b\x9c\x03\x80\x64\xbf\x08\x50\xdd\x2d\x8d\x97\xf8\xc3\x1e\xb1\x49\x3c\x0f\xce\xfb\x41\x0b\xfe\x1d\x2b\x15\x97\xe2\x0d\xa1\x05\x67\x9f\x34\x13\xe6\x2f\x35\x79\xf8\xa3\x9a\x70\xf9\x6a\xf1\xc5\xaf\x1e\xb8\x48\xdf\x90\xcb\x4a\x69\x99\x7f\x60\x4a\x56\x65\xc2\xae\xd8\x94\x0b\xae\xb9\x14\xbf\xca\x99\xa6\x29\xd5\xf4\xcd\xaf\x08\xa1\x42\x48\x4d\xcd\x63\x65\xfe\x24\x24\x91\x42\x97\x32\xcb\x58\x39\x9e\x31\x31\x79\xa8\xee\xd9\x7d\xc5\xb3\x94\x95\xd0\xb9\x1b\x7a\xf1\x7a\xf2\xc5\x1f\x27\xaf\x7f\x45\x88\xa0\x39\x7b\x43\x54\x75\xaf\x92\x92\x17\xd0\xd3\x44\x16\xac\xa4\x5a\x96\x6a\x92\xc8\x92\x49\xf3\xbf\xfc\x57\xaa\x60\x89\x19\x63\x56\xca\xaa\x78\x43\x36\xbe\x83\xdd\xb9\xa9\x50\xcd\x66\xb2\xe4\xee\x6f\x42\xc6\x44\x66\x39\xfc\x1b\x97\x78\xd7\x18\x15\x1e\x67\x5c\xe9\xaf\xd6\x7e\xfa\x9a\x2b\x0d\x3f\x17\x59\x55\xd2\x6c\x65\xb6\xf0\x8b\x9a\xcb\x52\xbf\xaf\xc7\x36\x63\xa9\xea\xbe\xf9\x6f\xfb\x22\x17\xb3\x2a\xa3\x65\xbb\x93\x5f\x11\xa2\x12\x59\xb0\x37\x04\xfa\x28\x68\xc2\xd2\x5f\x11\x62\xb7\xcb\xf6\x39\x26\x34\x4d\xe1\x08\x68\x76\x5b\x72\xa1\x59\x79\x29\xb3\x2a\x17\x7e\x4c\xf3\x4e\xca\x7c\xaf\x6f\xc8\xc7\x39\x23\x05\x4d\x1e\xe8\x8c\xb9\xf1\xee\x59\x4a\xb4\xf4\x1f\x10\xf2\x77\x25\xc5\x2d\xd5\xf3\x37\x64\x62\xb6\x78\x62\x76\xb0\xf1\x33\x9e\xcf\x2d\x76\xd2\x78\xae\x97\x66\xba\x4a\x97\x5c\xcc\x76\x0d\x9f\x50\x4d\x33\x39\x23\x08\x46\x64\x2a\x4b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xd4\xcd\x6f\xc7\x8c\xf0\xd3\xb5\x39\xdd\xad\x3e\x0e\x9e\xd2\x9c\x0a\xc1\x32\x22\xa7\xa4\x2a\x52\xaa\x99\x22\x5a\xd6\xfb\xb3\x7b\x7b\xec\xc7\x6b\xb3\xb9\x5c\x7b\xbe\x61\x3a\xf8\xea\xe2\x0b\x9a\x15\x73\xfa\x85\x7d\xa8\x92\x39\xcb\x69\x7d\x86\xb2\x60\xe2\xe2\xf6\xe6\xbb\x7f\xba\x5b\xf9\x81\xb4\x97\xd2\x04\x51\xf2\xc0\x58\xa1\xea\x4b\x41\xaa\xc2\xac\xc9\x2c\x8e\xdc\x2f\x89\x2e\x69\xf2\xc0\xc5\x0c\x96\x3e\xc3\xf5\x5e\xe2\xc1\xa8\xc9\xda\x94\xe5\xfd\xdf\x59\xa2\x1b\x8f\x4b\xf6\x53\xc5\x4b\x96\x36\xa7\x62\x76\xd6\x61\x82\x95\xc7\x66\x9f\x1a\x8f\x8a\xd2\x4c\x4b\x37\xee\x21\xb6\x06\x2a\x6a\x3d\x5f\x59\xe6\xcf\xe3\x95\x5f\x09\x31\xbb\x83\x5f\x92\xd4\xe0\x25\xb3\xa0\x39\x73\xd7\x85\xa5\x76\x4b\xcd\x01\xeb\x39\x57\xa4\x64\x45\xc9\x14\x13\x88\xa9\xcc\x63\x2a\xec\x2a\x27\x6b\x9d\xdf\xb1\xd2\x74\x64\xae\x74\x95\xa5\x06\xa1\x2d\x58\xa9\x49\xc9\x12\x39\x13\xfc\x1f\xbe\x77\xd8\x44\x33\x6c\x66\x20\x48\x13\xb8\x90\x82\x66\x64\x41\xb3\x8a\x8d\x08\x15\xe9\x5a\xdf\x39\x5d\x92\x92\x99\x71\x49\x25\x1a\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xc9\x08\x17\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x66\x5c\x3b\x54\x9d\xc8\x3c\xaf\x04\xd7\xcb\x57\x80\x75\xf9\x7d\x65\x8e\xfe\x55\xca\x16\x2c\x7b\xa5\xf8\x6c\x4c\xcb\x64\xce\x35\x4b\x74\x55\xb2\x57\xb4\xe0\x63\x58\x8c\x40\x24\x9b\xa7\xbf\x2e\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc8\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\x5b\x9f\x89\x79\x64\xb6\xf1\xc3\xf5\xdd\x47\xe2\x66\x84\xe7\x86\x47\x54\xbf\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x4a\xfc\x72\x5a\xca\x1c\x7a\x65\x22\x2d\x24\x17\x1a\xfe\x48\x32\xce\x84\x36\x37\x3d\xe7\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x09\xa4\x8d\xdc\x33\x8b\x23\xd2\xf5\x57\x6e\x04\xb9\xa4\x39\xcb\x2e\xa9\x62\x47\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xf8\xf4\x9a\x84\x7b\xfd\x83\xb5\x5b\x4f\x88\x23\xb9\x5b\x8f\xbb\x89\x82\xee\x0a\x96\xf8\xeb\x48\x05\xb9\x28\x8a\x8c\x27\x78\xe3\xf4\x9c\x6a\x92\x50\x61\xb6\x93\x0b\xa5\x69\x96\xb1\xd5\xdb\xb1\x75\x16\xdb\xf0\x0f\x01\x64\xb3\x42\xae\xdc\xe3\x35\x9a\xd1\xfe\xc1\x93\xd9\x95\x37\xb6\xe1\x2a\xd3\x2c\xe6\x5f\xff\x61\xc7\x96\x13\x64\x89\xa6\x7c\xb6\xe9\xb3\xad\x7b\x79\x09\x9f\x00\x33\x45\xb9\x50\xb6\x8b\xaa\xc4\xdd\xac\x69\xa7\xa1\xa6\xb4\xc5\x49\xac\xc3\xe1\xce\x9d\xed\x5a\xb3\x69\x74\x0a\xac\xdf\x72\xf3\xaf\xdd\x08\xc0\xb5\x9b\x69\x3d\xf3\x11\x91\x0b\x56\x96\x3c\xb5\xa8\xbb\x90\xe9\xa9\x02\xc4\x9a\x56\x19\x10\x2a\x29\x94\x2e\x29\xdf\x78\xe9\x5d\x13\x3c\x33\x8b\x1f\x53\x8d\x37\x88\x29\xf2\xc8\xb3\x8c\xfc\x56\x48\xfd\x5b\x3f\x02\x0c\x20\x4b\x3e\xe3\x1e\x3b\x2b\xc2\x85\x1b\x17\xc8\xba\xe5\x4b\xa4\x62\x2b\x1d\x6e\x1f\xfc\x5b\xc5\x08\xcb\x0b\xbd\x74\x68\xea\xec\xbf\xfe\xfb\xdc\xd0\x04\x56\x52\xd5\x18\xb0\xd5\xdf\x56\x4c\x8f\xad\xe3\xa4\x48\xc0\x69\xc1\xbe\xc8\x94\x5d\x74\x9c\x1a\x59\x3d\xb9\x2b\x86\xec\x8f\x82\xcf\xfd\xa9\x37\x0f\xa5\xac\x32\xa6\x3c\x0b\x67\xf6\x6e\x47\xe7\x01\x6b\x09\x5d\x0f\xbe\xc7\xa6\xac\x2c\x59\x7a\x55\x99\x5b\x76\xe7\x67\x75\x33\x13\xd2\x3f\xbe\xfe\xc4\x92\x4a\x6f\x60\x29\x76\x2e\x7d\x07\xd0\xba\x66\xf8\x46\xbb\x13\xac\x44\x28\xc3\x19\x01\xeb\x68\x7f\x30\x5b\x02\x6c\x81\xd9\x41\x85\x58\x4f\x51\xcd\xd5\x74\xd9\x39\x80\xd9\x51\xbf\xe7\xec\x93\xa1\x78\xc0\xfb\x37\x6e\xbb\x61\xe4\x80\xb8\x71\x96\xa5\x23\x72\x5f\x69\xc2\x35\x50\xbe\x64\x2e\xa5\x5a\xc7\x76\xab\x8d\xe2\xd1\xc2\xbc\x16\x5c\x02\xe3\x42\xa4\x30\xc0\x4a\x72\x43\xae\x80\x61\x62\xcd\xe1\x27\xb0\xf2\xfa\x33\xbe\x4a\x6d\xd6\x5b\x2e\x95\xae\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x47\xae\xe7\xf0\xc7\xac\x64\xc8\x34\xa9\x2a\x37\x83\x3e\x32\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x26\xf3\xc6\xb4\x72\xc6\xb4\x22\x34\xcb\xdc\x12\x9a\x50\x8b\xd4\x23\x37\x0c\x04\x39\x73\x1c\x46\xe7\x28\x96\x3b\x18\x79\xea\xb3\x0a\x78\x1b\x8f\x6b\x44\x98\x4e\x26\xe7\xa3\xce\xee\x13\x99\x17\x06\x21\x50\xd8\x83\xfb\x25\xe1\xda\xf0\xee\xc8\x0d\x95\xb2\x9a\xe1\x4e\xb1\xcc\x4e\xdc\xf1\xb2\x70\xf8\x86\xb9\x04\x69\x70\x03\xb9\x59\x6d\x27\xb8\xb9\x27\x8e\x5d\x35\xc3\x71\xdc\x24\xd8\xbf\x9c\xea\x64\x6e\xd1\x70\x22\xcb\x92\xa9\x42\x0a\xd3\x33\xfe\x72\x5d\xaf\xed\xff\x98\x77\x3a\xc7\x33\x9d\x9e\xa9\xf3\xfa\xb0\xe7\x7c\x36\x77\x67\x4d\x4b\x44\xc7\x6d\x18\xe9\x3a\x72\x44\x25\xb4\x2c\x69\xd7\x3d\xe2\x9a\xe5\x1d\x88\x84\xf4\xb8\xfd\x84\x5c\x08\x8b\xec\x6b\xc0\x6e\x80\x98\x66\x65\xee\x37\x12\xa0\x10\xd0\x9e\xc2\x4d\xe0\xb9\xe1\x84\xb8\xb6\x60\x4e\x5e\x07\x8c\x77\x66\x6e\x02\xe1\xfa\x54\xc1\xad\x1d\xcb\xe2\x7c\x42\x2e\x88\xa8\x3c\xe2\xd9\x35\x05\x21\xfd\x0c\x6c\x47\x66\x5a\x4a\xd6\x7d\x75\xe3\xa3\x30\xf4\x8d\x6d\x3b\x83\xb6\xde\xc6\x76\xfe\x4c\x04\x5c\x42\xf3\x3a\xee\x5a\xe7\xab\xa1\x84\xc4\xbd\xed\xe6\x10\xf2\xf6\x0a\xc4\x5c\xe0\xcd\x51\x2c\x63\x89\x36\xd4\x90\x95\xf9\x88\x50\xa5\x64\xc2\x8d\xa8\x50\xc3\x7e\xfb\x42\xe1\x4a\xba\xf7\x9e\xc4\xee\x3f\x89\x5e\x3f\x01\x69\xb4\x7d\xbf\x43\xbf\x5b\xdb\x8d\x8c\x2b\x6d\x10\x54\x7b\x57\x5a\x78\xf7\x7e\x09\xbf\x9e\x2a\x92\xd1\x7b\x96\xed\xe0\xab\x56\x5b\xf8\xe5\xaf\x5b\x20\x1a\xd8\xb2\xa0\x20\x84\x50\xb7\x55\x68\x68\xac\xdb\xca\xbd\x1e\x4e\x40\x0c\x72\x4c\x3d\xb2\x82\x23\x42\xc9\x03\x5b\x8e\x10\xa5\x0b\xaf\xc2\x89\x9a\x02\x74\x5c\x32\x24\xe8\x06\xee\x1e\xd8\x12\x3a\xdc\xcd\x6e\x6e\xec\x2a\x16\xee\xb0\xc5\x60\x80\xba\x8d\xcd\x44\x23\xbf\xe8\xb1\x41\xf1\x57\x03\xdb\x03\xdb\xc9\x3e\x6f\x6a\x6b\xca\x46\x00\x77\x38\x0f\x38\x24\xa0\xc0\x0e\x1e\xa8\x11\x91\xd9\x66\xfd\xc3\xee\xb6\x53\xe0\xdc\xd5\xdc\xee\x3d\x69\x5d\x91\x17\xc4\xb4\x0f\x5e\x87\x83\xf0\x7e\xaa\x10\x5e\x0d\xde\x99\x73\x50\x56\x9a\x8b\x02\x68\x24\x1e\x68\xb1\x7d\x47\x33\x9e\x36\x74\xa0\x86\xd9\xb8\x11\x23\xf2\x5e\x6a\xf3\xbf\xeb\x4f\x5c\x19\x1e\xf3\x4a\x32\xf5\x5e\x6a\xf8\x73\x42\xfe\xaa\xf1\xea\x7d\x1d\x88\x97\xeb\xd6\xfb\x0c\x70\x7d\xc7\x3e\x81\x0b\x81\x48\xd4\xec\x70\x53\x13\xa7\x26\x46\x32\x07\x16\xdd\xee\x9c\xc1\x5a\x37\xc2\x08\x05\xb8\x73\xd1\x43\x81\x32\x16\xe5\x6c\x1c\x32\xaf\x14\xa8\xd2\x84\x14\x63\x60\xa3\x36\x8e\x89\x07\x64\xc6\x6d\x1e\xd1\x1e\x87\xdf\x3e\xf4\x5f\xb5\x19\xf6\x6b\x3d\x6a\x7c\x1c\x3d\x6e\x63\xb0\x39\x5d\x00\x6b\xcf\xc5\x2c\xf3\x4c\xfc\x88\x3c\xce\x79\x32\x47\xe9\x11\x34\x61\x9a\x95\x45\xc9\x0c\xc7\x40\x41\x67\x66\x9e\xcc\x58\x19\x0f\xfa\x1f\x8d\x68\x80\xe3\xa3\xbe\x3b\xa3\x09\x4b\x49\x0a\x22\x0b\xaa\x5e\xa9\x66\x33\x9e\x90\x9c\x95\x33\x46\x0a\x43\xfa\xfb\x01\x7c\x1c\x25\xc6\x16\x4d\x8f\x9b\x03\xf6\xb8\x61\x84\x7c\x1a\x3f\x54\xf7\xac\x14\x4c\x33\x35\x36\xfc\xc9\xd8\xce\x5e\xcb\x9c\x27\xc1\x9d\xed\xa5\x1b\xe0\xb3\xde\x1a\xb9\xed\x48\x2c\x16\xc8\x88\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x15\xdc\x06\x16\xeb\xc9\xc3\x0f\x2c\xd6\xc0\x62\x1d\x9d\xc5\x6a\x75\x91\xd3\x22\xb6\x07\xd4\xcb\xf5\x50\x04\xfe\x0d\x15\xba\xab\x9a\x3f\x60\xf8\x9c\x5f\x43\x5b\x05\x68\xf8\x98\x3b\x4b\x9c\x3e\x82\xda\xd0\x5a\x22\x4b\x2a\x66\x8c\x7c\x31\xfe\xe2\xf5\xeb\x18\x05\xa1\x05\xe7\xa0\x2f\xa6\xb2\xcc\xa9\x86\x6f\xfe\xe9\xf7\x1d\x5f\x3c\xe1\x54\xb6\xd9\x4b\x8e\x63\xa8\xb3\x98\xc7\xdb\x66\x5a\x2c\xf2\x16\x5b\x1a\x90\x31\x21\x35\xc9\x99\x26\xb4\x9b\x27\x6b\xaa\xdd\x79\xce\x46\xce\x1c\x8a\x68\xc7\xba\x8d\x38\xa3\x60\x4a\xa4\xb0\xa6\x17\x73\xf8\xdd\x87\xdb\x6b\x05\x09\xa3\x8a\x19\x12\x7f\xcf\xcc\x2a\xba\x4d\x81\x9a\x28\x99\x9b\x59\x73\xa1\x1d\x12\x33\x4b\x60\xee\x60\xc8\x19\x9b\xcc\x26\x24\xad\xa0\x5b\x2a\xac\x1f\xcc\x39\xae\x56\x2d\x95\x66\x79\xb7\x2d\xd0\x10\xc3\x12\xfe\x67\xb6\x45\x97\x4b\xb0\x90\x2f\x98\xd0\x15\xcd\xb2\x25\x61\x0b\x9e\x68\xbf\x7f\xe0\xb6\xc3\xb5\x0a\xda\xa9\x08\x36\x3a\x9c\x75\x1e\xaf\xdd\xd0\x2e\x22\x15\xc3\xf9\xae\xf5\x1d\x82\x73\x5a\x37\xe0\x83\x5d\xc9\x64\xab\x4c\xa8\x4d\xbf\x68\xb6\x85\x7f\x02\x70\x7f\xf3\xa1\xdb\xca\x46\xa2\xe9\x4f\x04\xcd\xe9\xc7\x5a\x59\x83\x97\x2c\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xd6\xad\x91\xd3\xc0\x01\xf5\x9c\xa1\x91\xf2\xe2\xfd\x55\xd8\x8e\x11\xeb\x1c\xf0\x51\x16\x32\x93\xb3\x65\xf3\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb0\x36\xe8\x2d\x9e\x3c\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x77\x1b\x58\xac\x9d\x6d\x60\xb1\x7c\x1b\x58\xac\x81\xc5\x1a\x58\xac\x81\xc5\x1a\x58\xac\x63\x75\xf3\x54\xd3\xd0\x93\xa6\xd0\x6f\xf0\x42\xa6\x4f\x08\xde\x2a\x64\xba\x23\x76\x0b\x75\xfa\x89\x1c\x67\x32\xa1\xda\x86\xd9\x9a\x4f\xac\x15\x4a\xd1\x1c\xcd\x14\x23\xf2\x0f\x29\x18\x46\xb3\x98\xeb\x01\xc6\x02\xa9\xe7\xac\x34\xaf\x9f\xa9\xf3\x9d\x21\x04\x43\xec\xd7\x10\xfb\x35\xc4\x7e\x6d\x6d\x2f\x26\xf6\x6b\x4e\x15\xc2\x2d\x92\xc6\xed\xa1\x60\x0d\x9c\xf4\x91\x95\xf9\x2f\x34\x12\xcc\x80\xbb\x05\x47\x48\x12\x51\x83\x14\xee\x4c\x6a\x0d\xfe\x2c\xbd\x6d\xef\x87\x15\xab\x61\x51\x34\x4d\x59\x4a\x0a\x56\x8e\x11\x44\x25\x99\x72\x91\x6e\x58\xab\xdb\x9f\x6e\xf4\x70\xc0\x50\xac\xf6\x3a\x82\xbe\x39\x4c\x3c\x56\x7b\x22\x3d\x8c\x8a\x4d\xcb\x68\x8b\x08\xbe\x88\xe8\xac\x58\x09\x7d\x4c\xb4\x35\x28\x7e\x15\x28\xa3\xc7\x8b\xd9\x20\x1c\x3b\xf3\x63\x4f\xf5\x53\x94\x28\x74\x61\xe5\xf1\x9f\x2a\x56\x2e\x21\x3e\xbf\x16\x3b\x7d\x2e\x12\xeb\x11\xc3\x15\x49\xa8\x42\xb2\x1a\xc3\x2a\xdf\x4c\x31\x6a\x52\x54\x59\x36\xc2\x7e\x56\x2f\xab\x43\x73\x00\x07\x42\x9a\xdf\xa3\x35\x62\x91\x2a\x9a\x7e\x3a\x90\xfe\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\xa3\xed\xe3\xd8\xfa\x0a\x30\xbd\xc4\x97\x27\xcb\xeb\x3b\xf6\xe4\x09\x7a\x45\x78\x39\x7a\x32\xfb\xd1\x2d\x92\xfe\xfa\x45\xd2\x5b\xc7\x48\x7a\xe9\x19\x49\x5f\x5d\x23\x79\x82\xbe\x91\xf4\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xc3\xa8\x1f\xc9\xd3\x84\xf3\xfe\x6a\x48\xb2\x87\x8b\xd5\x1c\xbf\x91\xd9\xe9\x70\x7a\x49\x12\xaa\x9b\x84\x6b\xd5\x52\x4f\x1e\xfb\x5c\xfa\xa9\x26\xc9\x9e\x4e\xc5\x65\xc6\x01\x5d\xd8\xb1\x94\x95\xe4\xf9\x15\x96\x3b\xa7\x60\x87\x0f\xd6\xf0\xf5\x1a\xfd\x09\x5a\x41\xf2\x24\xcd\x20\xe9\xaf\x1d\x24\x4f\x05\xf6\xbd\x69\x09\xf7\xda\x15\xf0\x49\x5f\x83\x1f\xda\x13\xb8\xad\xe8\x1b\xd8\x18\x16\xb9\x8b\x9c\x16\xe6\xf6\xfd\x97\x61\x22\x00\x30\xff\x9b\x14\x94\x97\xca\x48\x37\x56\xaf\xdd\xfc\xcd\xaa\xef\x1a\xdd\x44\x4f\xa0\x30\x03\x1b\x1a\xbf\xa0\x99\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\x79\x84\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\xf2\xc0\x96\x27\xa3\x20\xf5\x40\xbb\x35\x6f\xf6\xc9\x8d\x38\x41\xd6\x69\xed\x5e\x7a\x3e\x4b\x8a\x6c\x49\x4e\xe0\xb7\x93\x7d\xf3\xa8\x3d\xf8\xa3\x66\x6a\xd6\xbe\xec\x47\xaf\xeb\xf4\x54\x05\x37\x69\x41\xdf\x57\x6c\xd9\xd7\x11\x21\x0a\xe6\xdf\xb5\x46\x74\x0c\x35\x80\x99\x91\xdd\x3d\xdf\x84\x99\x59\x81\x65\xb2\x3a\x2a\x54\x57\xf1\x2c\x8b\x18\xed\x9e\x11\x4d\x1f\x18\x58\x78\x24\xa4\x96\xe3\x29\xc3\x64\x7a\x08\x3a\x30\x92\x01\x99\x4a\x41\x7a\x5c\x92\x49\xf9\x50\x15\x0e\xf4\x5c\x36\xc9\x88\x21\xb9\x48\x64\xee\x7c\xea\xd1\xaf\x75\x64\x13\xcc\x3d\xb0\xe5\x18\x73\x60\xe2\x73\x18\x18\x48\x80\x55\x4d\xfc\xd8\x12\xcc\x7f\x24\x54\x91\x1f\x81\xa9\x14\xe4\x0c\x3e\x3c\xff\x31\xc6\xa5\xc0\x6f\x20\x6a\x5f\x65\x05\x98\x85\x19\x62\x69\x27\xa8\x56\xf7\x76\xd7\x8e\x45\x0c\xed\x32\xc5\x35\x37\xe3\x14\xed\x0d\x67\x54\x68\x7e\xee\x95\x34\x13\x02\x70\x00\x5c\x72\x2a\xc5\xa9\xc6\xf9\x39\xbc\xe6\x3a\x88\xf1\x3a\xf0\xfb\x5e\x5b\xfc\xd0\x5a\x80\x47\x9e\xb2\x29\xad\x32\x6d\xb3\x91\x1a\xd4\x07\x94\x3e\x62\x84\x8f\xce\x5e\x62\x19\xfe\xa9\x2c\xef\x79\x9a\x32\x01\x21\x0e\x6e\xfa\xf7\xd2\x05\x04\xd5\xe0\x6e\x30\x5b\xeb\x8c\x63\x86\xbd\xc8\x94\x1c\xad\xf6\x98\xf8\x6c\xa5\xe6\x16\x3d\xce\x99\x68\x0f\x40\xb8\x32\x9b\xaa\x58\x04\x53\x7b\x14\xd7\x9f\xa7\xe3\xbc\xde\xae\x57\x5c\x3d\x03\xde\x5b\x1d\x74\x40\x7d\x41\xa8\x4f\x48\x3d\x60\xbf\xcf\x16\xfb\xad\x01\xfd\x3e\x10\xe0\x5a\xa7\x03\x0e\x8c\xc6\x81\xc2\xa5\x41\x7e\x66\x2b\x00\x2a\xc6\xd0\x8b\xd5\x4d\x49\xd5\x3a\x33\x08\xf4\xea\xa7\x2f\x73\x61\x70\x80\x67\xa1\x87\xd4\x19\x43\x2b\x61\x93\xc1\x83\x39\xb4\x1e\x16\xf1\xc5\xaa\xcd\x3d\x62\x4c\x27\xb8\x48\xc1\x14\xa8\xd8\x99\xf7\xaf\x68\x0c\x03\xbd\xc6\x2c\x05\x42\xe1\x6a\xf5\xa1\x48\x57\x83\xe3\xea\xbe\x41\xaf\x9f\x33\x2a\x14\x39\x71\x2e\x1e\xa7\xaa\x7e\xe3\x24\xea\xbe\xb9\xd4\x97\x7e\x6c\xc8\x74\xdc\x4c\x77\x59\x0f\x3d\xd8\x51\x06\x3b\x4a\xb3\x0d\x76\x94\xf5\x49\x0c\x76\x94\x6d\x6d\xb0\xa3\xf4\x1a\x7f\xb0\xa3\xb4\xdb\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xc1\x8e\x12\xfa\xd1\x3e\xec\x28\xb5\x18\x74\x0c\x39\xba\x29\xb2\x5a\x3f\x71\xac\xb2\x45\x35\x4f\xea\xa8\x50\xf7\x16\xfe\xeb\xb9\x84\xea\xa6\x18\xfc\x54\x91\xba\x29\xa0\xaf\x69\x30\xa2\x25\xea\xad\xf2\xb3\x97\xb0\xd7\xc6\xd8\x93\x68\xfd\x0b\x57\x2e\x35\x1c\x58\x8f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x9e\xd5\x71\x2e\x29\x39\x73\xba\xd6\x73\x73\xe0\x42\xea\xf6\x8f\x42\xf3\x71\xfd\x86\x77\x10\x06\x95\xb0\xcb\xe6\x16\xb3\xe9\x4e\x66\xa9\x75\x8f\x62\xa5\xec\x65\x0d\x6d\x06\xff\xb3\xb2\x35\x5b\xae\x6c\x25\x35\x08\x4d\x2b\x2b\x21\x0c\x7b\x24\x85\x8d\xe2\x88\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xfa\x98\x1a\x01\x00\x54\x63\x99\x44\x9b\x73\x49\x0a\xab\x24\x37\x4f\xb0\x9f\x88\x49\xf8\x0b\x0b\xfb\xc9\xfd\x8a\x62\xee\xea\x35\xdc\xd1\xe6\x64\xb9\x82\x73\xa4\x59\x26\x1f\x63\xe8\x53\xe4\x8d\xe8\x9d\x1c\x30\x18\x7a\x1f\xa3\xb3\x08\xae\x78\xcb\x87\xf2\xea\x43\xaa\xc1\x9d\x6d\x48\x35\xf8\x32\x52\x0d\x36\xec\xa0\xcd\x9c\x83\xdd\x7b\x05\x39\x09\x0f\x9a\x73\x90\x90\xbf\xcd\x19\xdc\xa2\x92\xa1\xf1\xb2\xca\x34\x2f\xea\x28\x63\x85\x27\x94\xa1\x48\x3d\xb5\xd1\x80\xed\xdb\x6b\x66\x43\x93\x79\xe7\x50\x2b\xb7\x1c\xc6\x83\xa8\x65\x05\xd8\x14\x23\xe6\x40\xff\x8e\x89\xfe\x9c\xac\x8d\x61\x87\xfc\xb9\xa3\xa9\x82\xf0\xdf\x95\x2b\x18\xda\xb0\x81\x2b\x72\x66\xa8\x63\xb6\xb4\x56\xe3\x16\x22\x6c\x91\xd5\x80\x01\x50\x0f\xb6\x60\x8e\x41\x9d\xf1\x05\x13\x35\xf5\x3d\x53\xe7\xe7\x8e\x27\x5e\xe5\x1f\x02\x7a\x7f\x0a\x87\x11\x82\xb5\x63\x39\x83\x15\x7a\x1f\x30\xc2\x06\x8e\xe0\x4f\x0d\x2a\xfb\xe7\x6e\x9e\x20\x60\x10\xbc\xd2\x2e\x3c\xb3\x71\xd0\x35\x2f\xd0\xd9\xcb\x01\xa3\xe0\x62\x42\xad\xe2\xb4\xe2\x3d\x42\xac\xfa\x66\xca\x3c\x6c\x68\xd5\x41\xc3\xaa\x3e\x9f\x84\x96\xcf\x6c\xfe\xfb\x0c\xb2\x31\xbd\x10\x73\xdf\x90\x8e\x69\x5b\x7b\xae\x74\x4c\x07\x37\xe7\x7d\x76\x59\x99\x8e\x6a\xbe\x3b\x8e\xe9\xee\x33\xcb\xca\xf4\x2c\xa6\xba\x17\x9e\x9f\xe9\x70\x26\xba\x21\xf9\xd1\xf3\xe4\x97\x8c\x35\xc3\xf5\xbf\x55\xcf\x6a\x7e\x7b\x56\xd3\xdb\xf3\x9b\xdd\x7a\xf1\x2a\x4f\x35\xb7\x45\x5f\x93\xa7\x9a\xd9\xfa\xb8\xec\xf7\x83\xe7\xe3\x85\x28\x1d\xd9\x47\xff\x65\x84\x26\x3d\x93\x63\xfe\x73\x39\xe5\x1f\xd6\x21\xff\x19\x42\x91\x8e\x12\x86\x14\x4b\xf6\xa3\x88\xfd\xd3\x70\x57\x1f\x8a\xdc\x33\xe4\xa8\x27\xfe\x3a\x66\xa8\xd1\x2f\x00\x85\xf5\x0a\x31\x1a\xb0\xd8\x33\x61\xb1\xfd\x85\x14\x1d\x2b\x9c\xe8\x17\x86\xcb\x7a\x86\x0e\xed\x4d\xbb\x7d\x98\x90\xa1\x63\x87\x0b\x1d\x20\x54\xe8\x39\xc2\x84\x0e\x10\x22\x34\xd8\x04\x02\xdb\x60\x13\x08\x6d\x83\x4d\x60\x5b\x1b\x6c\x02\xab\x6d\xb0\x09\x0c\x36\x81\xc1\x26\x30\xd8\x04\xd6\x07\x1c\x6c\x02\x83\x4d\x20\xac\x0d\x36\x81\xe3\xd8\x04\x62\xc3\x6e\xfa\xc1\xf2\xf3\x84\xdb\x1c\x37\xd4\x66\xff\x61\x36\xcf\x18\x62\xf3\x0b\x53\xb8\x44\x87\xd3\xf4\x03\xf3\x97\x12\x46\xf3\x32\x42\x68\x9e\x3d\x7c\xe6\xa9\xa1\x33\xfb\x09\x9b\x89\x80\xf6\x9e\x70\x5e\xc8\xf4\x42\x68\xfe\xd4\xc2\x47\x4d\x00\xdc\x56\xfd\x88\x2e\x24\x4f\x49\x51\x69\x5b\x70\x65\xa8\x80\xd4\x09\x03\xc7\xa9\x80\xd4\x3a\xbc\xa1\x0c\xd2\xae\xf6\x62\xca\x20\x6d\x3b\xb3\xa1\x16\x52\xbb\x0d\xb5\x90\x86\x5a\x48\x43\x2d\x24\x6c\x43\x2d\xa4\xa1\x16\xd2\x90\xc3\x6f\xc8\xe1\x37\xe4\xf0\x0b\xff\x6a\xc8\xe1\xb7\xbd\x0d\x39\xfc\x62\xda\x90\xc3\x2f\x78\xf4\x21\x87\xdf\x90\xc3\x2f\x6e\xe0\x21\x87\x1f\x19\x72\xf8\x0d\x39\xfc\x3e\xe3\x1c\x7e\x43\x2d\xa4\xcf\xa2\x20\xc8\x50\x0d\x24\x62\xec\x97\x55\x0d\x64\xa8\x85\xb4\x73\x90\xa1\x16\xd2\x80\xfa\x86\x5a\x48\xbf\x58\xec\x37\xd4\x42\x0a\x18\x64\xa8\x85\x34\xd4\x42\xda\xd9\x86\x5a\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x12\xfb\xd5\x60\x47\xd9\xde\x06\x3b\x4a\x4c\x1b\xec\x28\xc1\xa3\x0f\x76\x94\xc1\x8e\x12\x37\xf0\x60\x47\x21\x83\x1d\x65\xb0\xa3\x7c\xc6\x76\x94\xa1\x16\xd2\x50\x0b\x69\xa8\x85\xe4\x47\x1e\x6a\x21\x0d\xb5\x90\xa0\x0d\xb5\x90\x02\x46\x18\x6a\x21\x7d\xae\xb5\x90\x5a\xf1\x40\x9f\x6f\x41\xa4\xf8\x65\x0c\x55\x91\x86\xaa\x48\x5b\xda\x50\x15\x69\xa8\x8a\xb4\xa9\x0d\x55\x91\x86\xaa\x48\x3b\xda\x90\x01\x31\xb0\x0d\x19\x10\x43\xdb\x90\x01\x71\x5b\x1b\x32\x20\xae\xb6\x21\x03\xe2\x90\x01\x71\xc8\x80\x38\x64\x40\x5c\x1f\x70\xc8\x80\x38\x64\x40\x0c\x6b\xcf\x6f\x80\xfb\x9f\x91\x01\x71\xa8\x8a\xf4\x22\x4b\x8a\x0c\xf5\x44\x3a\xda\xcb\xa9\x27\x32\x54\x45\x6a\x75\x3e\x54\x45\x1a\x50\xd8\x50\x15\xe9\xb3\xc3\x62\x43\x55\xa4\x0d\x9d\x0f\x55\x91\x86\xaa\x48\x43\x55\xa4\xc1\x26\xd0\xd9\x06\x9b\xc0\x60\x13\x68\xb6\xc1\x26\xb0\xda\x06\x9b\xc0\x60\x13\x18\x6c\x02\x83\x4d\x60\x7d\xc0\xc1\x26\x30\xd8\x04\xc2\xda\x60\x13\x18\xaa\x22\x0d\x55\x91\x86\xaa\x48\xd0\x86\xaa\x48\x43\x55\xa4\xa1\x2a\xd2\xc6\x8f\x41\xd1\x8a\x92\xcd\x36\xc8\x0e\x85\xe5\x8b\xba\x2b\xcb\xc1\x57\x42\xe9\xb2\x4a\x74\x55\xb2\x14\x0e\x0c\x0f\xd3\x30\x06\x4a\xcb\xd2\x59\x05\xa0\xc4\xcc\x15\x2b\x32\xb9\x34\xd4\x76\x44\x6e\x65\x3a\x22\x17\xb7\x37\x77\xac\x5c\xf0\x84\x39\xe8\xfb\xc6\xd2\xf4\xed\xfb\xf6\x71\x59\xf0\x84\x66\x19\x68\x2c\xea\xd9\xe4\x74\xe9\x74\xc9\xf7\x4b\xc2\x3e\x69\x56\x0a\x9a\x11\x2d\x65\x86\xe6\x17\x33\x19\x40\x88\x25\xd3\x25\x67\x0b\x46\x68\x79\xcf\x75\x49\xcb\x25\xc9\x99\xa6\x29\xd5\x74\xfb\xa8\xdf\x2a\xd6\x8c\xd1\xd0\x92\x14\x25\x1b\xe3\x0d\x68\xcd\x03\x60\xf3\x9b\xaf\xdf\xb9\xfb\x4d\xd3\xd4\x05\x24\x38\x08\xbf\xab\xee\xfd\x6e\x9f\x6e\xe7\xb6\x52\xbf\x5b\x6a\x04\xe0\x69\x55\x34\x05\x57\xb8\x67\x5b\x25\xd2\x00\xb6\x24\x8e\x09\xe9\x84\x4f\x26\x16\x4f\x05\xad\x6b\xb1\x68\x6b\xf6\x98\x58\xf0\x52\x0a\xe0\x23\x17\xb4\xe4\xf4\x3e\x63\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x3b\xe0\xe5\xd2\xdb\x19\x30\xd8\x65\xeb\x95\xec\xa6\x67\x1d\x14\xac\xb5\xd2\x6b\xb1\xf8\x8e\xb6\xd5\x0c\x62\xe3\x92\x88\x7d\xc1\x2c\x89\x92\xcb\xee\x05\x05\x31\x9d\x21\xea\xb0\x31\x60\xf8\xad\x2f\x84\x29\xad\x4c\x17\xbb\xe9\x65\x6b\x5b\xde\xd3\xbc\xae\x8c\xb5\x61\x37\x26\xe4\x9d\x15\x8d\x29\xb9\xfc\xcf\x9b\xab\xeb\xf7\x1f\x6f\xde\xde\x5c\x7f\xd8\x8d\x47\x03\xf1\x27\xa0\xa6\x88\xc9\x76\x12\xf5\xef\xdc\x19\x42\xf5\x21\x26\x0c\xe3\xf5\x9b\xb3\xef\x2e\x3e\xfc\xe7\xfb\x8b\x77\xd7\xe7\x20\x52\xb0\x4f\x05\x15\x29\xeb\x62\x11\x2b\xe5\x22\x70\x8a\x92\x2d\xb8\xac\x54\xb6\xf4\x14\x76\xf3\x55\x58\xbd\x03\x06\x3d\x74\x8c\x62\xe8\xa3\xc5\x1e\x9b\x3b\x05\x35\x08\xad\x81\xb3\xb6\xd2\x95\x4c\xc9\x6c\xc1\xd2\x2e\xed\x07\xc4\x42\xba\xed\xa8\xed\xa0\x45\xa5\x9d\x92\xc7\x99\x36\x2b\x91\xcc\xa9\x98\xb1\x74\x42\xae\x64\x65\x46\xfb\xcd\x6f\x60\xcb\x4a\x96\x56\x49\xe7\x8e\xa1\x86\x0e\x05\xda\xdf\x8c\x1c\x03\x60\xc8\xae\xc2\xaa\x66\x2a\xa1\x85\xdb\xd4\xe6\xa9\xa8\xa5\xd0\xf4\xd3\x9b\x90\xfa\x68\x27\xbf\x69\x7c\x78\xe2\xea\xd5\x49\x33\x3d\x64\x96\x70\x45\x19\x94\x1a\xcb\xc8\x49\xf3\xed\xae\xbe\xaf\xcd\xfc\x58\xda\x84\x1d\x8c\x3c\x64\x0b\x56\x82\x72\xc8\x42\xce\x88\x94\x6c\x46\xcb\x34\x63\x0a\x62\xde\x1e\xe7\x0c\x8a\x07\xa2\xa4\x8b\x07\xd5\x31\x16\xf3\x8a\x2c\x21\x3b\x15\x8c\x57\x68\x65\x06\x5c\x7b\xd2\xb1\x8c\x98\x9b\xf7\xb6\x94\x1d\x25\xa8\x5a\xb7\xef\x0e\x82\x6a\xbc\x2d\x7e\x13\xb8\x9e\x5a\x23\xc6\xa4\x89\xe5\x95\xe1\x4e\xa7\xb5\x8d\xdc\x3c\x0f\xb0\x93\x07\xcb\xf2\xe1\xca\xfc\x44\x8a\x29\x9f\xbd\xa3\xc5\x57\x6c\xf9\x81\x4d\x23\xe3\xfb\x90\x31\xb7\xea\x69\x60\x77\x0d\x75\xc0\x0e\xbb\xd9\xca\x03\x86\x73\x85\x98\x4c\xe2\x2c\x1e\xc1\x76\x8e\xb5\xc2\x72\x28\x22\x58\x36\x7e\xef\xcc\x36\x09\x22\x70\x1b\x27\x17\x2c\x10\x36\x29\xa2\x45\x05\xc1\x26\x80\x8f\x35\x47\xca\x15\x61\xd3\x29\x4b\x34\x5f\xb0\xcc\x47\x1a\xdb\xca\x96\x36\xf2\xf7\x9e\x26\x0f\x8f\xb4\x4c\x15\xd4\x4a\xa4\x9a\xdf\xf3\x8c\xeb\x65\x48\x1d\x4a\x6c\x56\xa8\xb1\xc1\xc9\x4e\x6f\x2e\x94\xa6\x80\xbe\x5c\x45\x45\xb3\xc3\xc8\xf6\x53\x67\xb8\xc6\xdb\xe8\xc2\x7a\x83\x87\x83\xda\x7e\x09\x2b\x0d\x81\xcb\x96\xe4\xb1\x94\xe1\xa2\xd9\x3b\x09\xf1\xbc\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x6a\xd1\x69\xc2\xe5\xab\x54\x26\xea\x55\x22\x45\xc2\x0a\xad\x5e\xc9\x85\xa1\x8b\xec\xf1\xd5\xa3\x2c\x1f\xb8\x98\x8d\xcd\x02\xc6\x78\x81\xd4\x2b\x90\x85\x5f\xfd\x1a\xfe\x77\x08\x28\x23\xce\xb7\xe7\x0d\x39\x39\x09\x78\x5f\x16\xc8\xbd\xf7\x80\xcc\x3b\x10\xf0\x97\x2d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x48\x61\xb9\x90\x88\x65\xdf\x4b\x99\x31\xda\xed\x6d\xf5\x14\xcd\x24\x80\x7d\x3c\x56\x0d\xba\x97\x35\xea\xc5\xcb\x65\xaf\x67\x21\xd3\x37\x44\x55\x45\x21\x4b\xad\x6a\xa1\xd1\x00\xc5\xa8\xfd\x27\xa8\x4d\x46\xe4\x47\xff\x10\xbd\xba\xbe\x3f\xfd\xd3\x57\xd7\xff\xf6\xe7\xd3\x1f\x7e\x6c\xfe\xd6\x10\x1f\x1b\x2f\x04\x4c\x53\x15\x2c\x99\x08\x99\xb2\xf7\x30\x03\xf8\xd3\x72\x77\x17\x49\x22\x2b\xa1\xed\x0f\x9a\xea\x4a\x4d\xe6\x52\xe9\x9b\x5b\xff\x67\x21\xd3\xd5\xbf\x02\x6c\x9c\x07\xa4\x2b\xb0\xd7\xb7\x54\x07\x44\xee\x47\x51\x17\x5a\xf0\xef\x58\xa9\x02\x72\x55\x60\x6b\xc1\x8b\xfd\xb2\x59\x0a\x37\xa7\xf0\xcf\xb7\x6e\xba\x06\xf7\x3e\x96\x5c\x6b\x70\x39\xb4\xc9\x02\xe4\x74\xe4\xae\x34\x32\x52\x8b\x2f\xa2\xf4\xaa\xc1\x98\xc3\xef\x5a\x8f\xc5\xc1\xec\xed\xca\xbc\x62\xc3\x3a\x5c\xae\xa9\x03\x2f\x6e\x6f\xc8\x02\x77\xe3\x00\x0b\x79\x0a\x2a\x70\x01\xd8\x6f\x8f\x82\x12\xdc\x68\x6e\xe3\xbc\xfc\xf5\x06\x2d\x4c\x3e\x1c\x9c\x64\x3c\xe7\xd6\xc0\x6f\x0b\x20\x87\xd0\x8e\x33\xfc\x6c\x92\x14\xd5\xc8\x76\x31\xc9\x59\x2e\xcb\xa5\xff\x93\x15\x73\x96\x1b\x89\x63\xac\xb4\x2c\xe9\x8c\x8d\xfc\x00\xf8\x99\xff\x0b\x3f\x6c\x4d\x61\xfd\x6b\x14\x54\x93\xaa\x34\xbc\x47\xb6\x74\x28\x2e\x44\x7b\x79\x40\x74\x10\x5c\x5c\x3a\x0e\x1b\xf8\xe3\x7a\xdf\x8f\xb1\x3b\xf5\x2a\x1a\x64\x0d\xfd\xaa\x40\x52\x59\xc8\xac\xca\x99\x1a\x79\x02\x8d\xa2\xa8\x58\x18\x99\x45\x9d\x1e\x02\x01\xa4\x7c\xc1\x55\x2f\xff\xd0\x3b\x6f\x67\x03\xa3\x54\xa5\x8d\x90\x8e\x49\x86\x1a\xd5\xcb\xa5\x02\x21\xd5\xe7\x38\x68\x61\xb5\x2f\x42\x98\x15\x42\x0a\xaa\x35\x2b\xc5\x1b\xf2\x1f\x67\xff\xfe\xbb\x9f\xc7\xe7\x7f\x39\x3b\xfb\xfe\xf5\xf8\x7f\xff\xf0\xbb\xb3\x7f\x9f\xc0\x3f\x7e\x7b\xfe\x97\xf3\x9f\xdd\x1f\xbf\x3b\x3f\x3f\x3b\xfb\xfe\xab\x77\x7f\xfd\x78\x7b\xfd\x03\x3f\xff\xf9\x7b\x51\xe5\x0f\xf8\xd7\xcf\x67\xdf\xb3\xeb\x1f\x02\x3b\x39\x3f\xff\xcb\x6f\x82\xa6\x47\xc5\xf2\x9b\x00\xac\x81\x6d\xdc\x23\x73\x53\xfd\x55\x5f\x93\x16\x17\x7a\x2c\xcb\x31\x7e\xfe\x86\xe8\xb2\x0a\xe1\xa2\xdd\xb1\xf5\x81\x73\x57\xfa\xf9\x4d\x8d\xf1\x3c\x75\x38\x00\x20\x3f\x85\x00\x28\x96\x94\x4c\xef\x4b\xca\xc6\xde\x1c\x01\x5c\x31\x8e\x0e\x82\x77\x2d\x78\xfb\x84\x33\xb0\x5f\x35\xeb\x30\x2d\x65\x3e\x21\x0d\x4d\xee\x02\x1c\xe1\xec\x7b\x0f\x2c\x30\x62\x61\x10\xd4\x07\x41\x7d\x10\xd4\xdb\x82\xfa\x1d\xde\xa1\x17\x2e\xa5\x33\xb1\xd8\xa5\xec\x8d\x30\x09\xbe\x85\xec\x71\x4d\xb3\xa0\x63\xae\xb5\x24\x85\x2c\xaa\x8c\xea\x2d\xa6\x8c\x08\x1b\xa1\x8f\xa0\x73\x06\x17\x03\x52\x60\x8f\xb3\x84\x2f\xdf\x6c\x94\x22\x17\x59\x46\xb8\x40\xf4\x66\x3a\xd8\x3a\x82\xb3\x79\x94\x0c\x39\x6b\x42\xd1\x20\xb8\x30\x53\x7e\xb4\x39\xef\x1a\xa6\x1c\xae\x8c\x60\x5e\x6a\x2e\x66\x13\xcc\x89\x87\x04\xca\x2a\xf2\xb9\xf0\x99\xf1\xb6\x0e\xe9\x19\x36\xef\x11\xb7\x96\x0c\x13\xfd\x2d\x94\x76\xcb\x84\x59\x6a\xfa\x00\x46\xa8\x84\xa5\x4c\x24\x3b\x4c\x24\xdf\xa1\x97\x9d\xdb\xb3\x7b\x23\x66\x80\x19\x17\x31\x0a\x49\xab\x22\xe3\x89\x39\x1f\x33\xf3\xb8\xbe\x6f\xf2\xbc\xd2\x60\x10\x3c\x96\xb5\xd6\x40\x9a\x35\x39\x34\x8c\xb6\x40\xdf\xbc\xb8\xe7\x3d\xc2\xbd\xbe\x0c\x6c\x2a\x78\x29\xb7\x1f\x7e\x10\x4b\x10\x46\xb8\xbd\x49\xa1\x93\xd3\x59\xa3\xd8\xb5\x8e\xaf\x4d\xa9\x8f\x6d\x15\x09\xa3\xd3\xf1\x34\xba\x2f\x7d\x3e\x26\x6d\x3e\x22\x5d\xee\x4f\x93\x9f\x8f\x1e\x47\xd1\xe2\x70\x3a\x1c\x4e\x83\x23\x14\xe5\xb1\x74\x37\x9c\xe6\xf6\x95\x84\x8a\x92\x4d\xf9\xa7\x08\xac\xf0\x8d\xd3\x51\x68\xf6\x49\x5b\x9f\xa6\x82\x09\xef\x01\x2b\xec\x8d\x02\xe7\xa5\xa3\x7b\x6b\xa0\xb8\x10\x8f\xe7\xee\x36\x89\x23\x03\x92\x1b\x90\x5c\xab\x0d\x48\xae\x53\xc8\x78\x49\x18\x4e\xc8\xb4\x33\x12\x3e\xf4\x36\xbd\x6f\xf4\xb5\x12\x20\x8b\x4e\x44\x6e\xe1\xba\xac\x6a\xff\x93\x42\x02\x44\x4f\xb9\xae\xbd\x9c\xb7\x03\xda\xdd\x86\x1e\xc1\x7d\xd9\x7e\x79\xaa\x5c\xa2\x87\x95\xfe\x57\x72\x8e\xa3\x3f\xe9\xee\xb1\x22\x41\x19\x59\xc8\x0a\x13\x62\xbc\xa2\x4a\xf1\x99\x18\x17\x32\x1d\x9b\x51\x5e\xed\x64\xb7\x8f\xe9\x52\xea\x35\xce\x4f\x3d\xee\x0f\xde\x1e\xd3\xe0\xeb\x0d\x5a\xab\x34\x6b\x18\x6b\xbc\x1a\xdf\xe5\x19\x08\x90\x1b\x3b\xa5\x94\x27\x1e\x4e\x4e\x05\x9d\xb1\xb1\x9d\xec\xd8\x4f\x76\xec\xe7\xf6\x84\xf3\x0a\x21\x66\x49\x46\xf9\xee\xa0\x8d\x18\x12\x76\x09\xbd\xd9\xe4\xed\x3e\xaa\x66\x25\x85\xb2\x13\x27\xb9\x40\x83\xb6\xfb\x09\x3f\xde\x6d\x16\x87\xcb\xe2\xb3\xe0\x6c\x38\xc8\x9d\x5f\x03\x8d\xb4\x71\xa9\x59\x31\x77\xc6\x7f\x67\x3b\xe3\x25\x53\x84\x09\x7a\x9f\x59\xa7\xc2\x9d\x9d\x5d\x2d\x05\xcd\x79\xe2\x80\xef\x22\x83\xc0\x09\x2e\x05\x99\x32\xaa\xab\x92\x91\x19\xd5\x2c\x64\x46\x9e\x6a\x73\x0f\x6d\xe4\x46\x93\x84\x0a\xb4\x37\x5a\xaf\x77\x83\x47\xfc\x4a\x77\x1a\xf2\xc3\x02\x77\x02\xc2\x75\x5a\x67\xff\xa1\x79\x4e\x4d\xa7\x46\x29\x18\x61\x42\x97\x90\xc5\xec\x56\xa6\x86\xe2\x4c\x5a\x6f\x77\xb8\x1d\x04\xb3\x67\xa1\xda\xf4\x0e\xc7\x67\xf2\x72\x38\xbd\x06\xdd\x68\x32\xe4\xad\x2d\x2d\x64\x3a\xd9\x70\x53\xc2\xd3\xd3\xdf\xca\xd4\xc6\xf7\xe8\x16\xbc\x99\x4b\x04\xa0\x96\xd3\x07\x17\x75\xe3\x4d\x41\x74\x41\x79\x16\xe0\x79\x4a\x20\x9d\x94\xe2\xa9\x91\x11\x02\x50\xaa\x9f\x58\x38\x97\x64\x0d\xdb\x87\x38\x84\x0f\xd8\xb5\x4b\xa2\x00\xfb\x9f\xcc\xa5\x62\x02\xee\x1b\x75\x63\xfb\x22\x30\x0e\xec\x53\x44\x9d\x21\x9c\xe8\xcd\x14\xb9\xdf\x11\x61\x0b\x56\x2e\x35\x94\x62\x70\x09\xbb\xb0\x1b\x33\x7e\x4e\xd3\xc6\xae\x8f\x88\x34\xec\xda\x23\x57\x21\x07\x00\x78\x02\xe7\xa7\xaa\x4c\x7b\x16\xdc\xce\x7e\x6f\xa7\xb1\x1e\x9c\x64\x98\xbb\x87\xce\x4c\x6c\x9d\x17\x72\x5b\xd4\x53\x4e\x8b\xad\x5f\xa1\xaf\xc4\xbe\x68\xd7\xd7\xe8\xcb\x81\x9f\xdc\x5b\x93\x79\x4e\x3f\xf1\xbc\xca\x09\xcd\x65\x85\xd1\xce\xeb\x7c\x45\x50\x20\xd8\x3e\xb8\x84\x0d\xdc\x81\xda\xc6\x1e\x90\x70\xb4\x1a\x1f\xae\xfc\x42\x8d\xfd\x41\x46\xfe\x38\xe3\x7e\x84\x51\xbf\xb7\x31\xdf\xb9\xed\xec\x0b\x90\x2d\x4a\x5b\x03\x65\x2e\x3a\x41\xd9\xd1\xd7\xdd\xb0\x7c\x33\xad\xc7\xe0\x8a\xc8\x9c\x6b\x6d\xbd\x63\x1a\x14\x60\x44\xb8\x6e\xb9\x92\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x91\xf1\x84\x83\x47\x92\xf3\x42\xdb\xcd\xff\x79\x9c\x68\xd3\x10\xf0\xbc\xc0\x44\x04\x70\x51\xc6\x8e\xb5\xb4\x31\x03\x7e\x96\x36\xc8\x85\x7d\x4a\x18\x4b\xed\x44\x86\xfb\x3a\xdc\xd7\xe8\xfb\xaa\xf6\xa4\xa1\x68\x6a\x27\xea\x98\x68\xaf\xa5\x30\x57\x09\xe2\x95\x51\x5f\xe0\xa0\x6b\xd7\xc5\xbc\x76\x19\x33\x3f\x30\x30\xca\xdd\x31\xad\x6c\xf4\x35\xf4\xb4\x4b\xdd\xb6\x96\x81\xcf\x67\xd9\x74\xa9\x0c\x28\xe8\x13\x1b\x6f\xd4\xb1\xab\x3b\x84\x67\xbd\xca\xde\x82\x0a\x84\xe5\x45\x46\x75\xad\x20\x79\x42\x90\x6b\x08\x13\x1f\x93\xa4\xee\x79\xd3\xd2\x1d\x46\x6c\xeb\x64\x83\x9f\x31\xbd\x5c\xdf\x84\x72\x07\x10\x18\xbb\x5d\xaf\x02\x13\xc3\x85\x0b\x96\x41\xbe\x59\x87\x4e\xf7\x16\x21\x86\x85\xa7\x74\x8b\x97\xc3\x0e\x9c\xb6\xed\x50\x89\xda\x22\x76\x2f\x34\x19\x5b\xfc\xde\x1d\x29\xe1\xda\xd1\x53\xac\x1d\x33\xa9\x5a\x54\x1a\xb5\x98\xc4\x38\xc1\x49\x71\xfa\xfb\xd2\xc6\x24\xc3\xe9\xf9\x61\x60\xca\xb3\x18\xd8\x3d\x72\x5a\xb3\x23\x27\x32\x7b\x8e\xd4\x65\x07\x93\x1f\x02\x40\x33\xde\xe0\xa7\x65\x66\x73\xb6\x87\x19\x80\x3e\xd6\xef\xc3\x76\xd4\xae\xdb\x8d\x9e\x8e\xe3\x4c\xb6\x13\xb2\x3f\x3a\x3e\xd7\x60\xa7\x7a\xd2\x00\xe3\x5a\xd3\x64\x6e\x13\x90\xe1\x2f\x06\x12\xc4\x92\x18\x20\xd0\x48\xc9\x6d\x0e\xa4\x5d\xe7\x3c\x67\x44\x97\x50\x34\xf7\x4f\xfe\x42\x8c\xd0\xe4\xff\xe7\x46\x9e\x09\x5f\xf6\xd5\x03\xe3\x9f\xdc\xbf\xfe\xfc\xc4\xec\x23\x61\x4c\x0e\x4e\x69\x9f\xbc\xea\x35\xf4\x48\xb8\x48\xc1\xef\x10\x59\x21\xdc\x3c\x1c\xcc\x6c\x2d\xac\x7b\x62\x33\x37\x61\x1a\x34\x6b\x99\x05\x07\xc5\xfa\xe5\x4e\xd6\x01\xfc\x32\x6b\xd5\x84\x77\x7c\xf0\x77\x98\x91\xf7\xd2\xd6\xcf\x66\x23\x72\x0b\xda\xe1\xfa\x09\xdc\xf9\xf7\x12\x2b\x69\x77\xa4\xa2\x08\x44\xff\x9d\x3c\x63\xdc\x7e\x7e\x55\x33\x94\xb8\x31\x2d\x86\xb2\xbe\x58\x4d\x96\x72\xe7\xc6\x3e\xb0\x65\xe7\xae\x5a\x26\xc1\x32\xb3\x56\x35\xee\x61\xd4\x11\x79\xe4\x1b\xfe\x8f\xb3\xf0\xe5\xf7\x5c\xe0\x54\x70\x60\x77\xce\x30\xb6\x3b\x0f\x23\x81\x64\x59\xc0\x24\x02\x77\x3b\x8c\xe3\x8d\xdb\xf2\x6f\x22\x38\x5d\x4f\x2f\xba\xb6\x74\x13\x7f\xdb\x60\x6a\xaf\x7f\xaa\x68\x36\x69\xe5\xfd\xc0\x47\x5d\xd7\xcd\x3a\x23\xaf\xd2\xcd\x47\x9e\xa5\x09\x2d\x6d\x44\x1c\xa0\x1f\xa2\xa4\xb5\xce\x02\xf6\x4b\x3a\xdd\xce\x1d\x02\xac\x81\x47\xa1\x07\x6e\x41\x4b\xcd\x93\x2a\xa3\x25\x31\x77\x7c\x26\xcb\xa0\xc4\x1e\x9d\x87\x59\x43\xf3\x1d\x4b\xa4\x48\xf7\x2a\x44\x7f\x5c\xed\x7c\xd5\xc7\xb8\x60\x25\xb7\x25\x9c\x79\xce\x56\xaf\xd7\x59\xcb\x2f\xa5\x4b\x0e\x9b\x3a\x64\xe7\x71\xcb\xa8\xa9\x19\x6d\xdb\x94\xb1\xbc\xc8\x79\x83\xe0\xf8\xdb\x3e\x21\x5f\x2e\x9d\x8a\xb6\x8b\x21\xe7\xda\xa5\x5a\x51\x4c\xbb\x64\x3c\xee\x2a\xda\x93\xac\xd1\xc8\x54\x96\x90\xe4\xe6\x2c\x95\x98\x9e\x65\xc1\x13\x7d\x3e\x21\xff\x1f\x2b\x65\x40\x16\x23\xc1\x66\x58\x73\xdc\x5e\x6c\xaf\x8f\x2a\x19\xb5\xbe\xf5\xaf\xc9\x19\x96\xa1\xe7\x79\xce\x52\x4e\x35\xcb\x96\xe7\xa8\x9e\x62\xb6\x90\x7d\x08\xd4\x84\xa8\x15\x31\x60\x12\xde\xfd\xe7\x3f\xec\x78\xf3\x00\xd9\xa7\x6c\x86\x9b\x7a\x63\xd1\x81\x6e\x05\x7a\x7c\xda\xc4\x4e\x79\x7f\xab\x7c\xd6\x0c\x22\xa8\x13\x57\x3a\xdc\xec\x61\xeb\xef\x06\x40\x29\x29\xd9\x0c\xee\x27\xde\xb9\x27\xde\x4e\x8c\xa8\x7d\x27\x2b\xb1\xdd\x06\xd2\xda\xb7\xaf\xad\x0a\xee\xbb\xc6\x87\xb1\x69\xe3\xf6\xcb\x10\x36\x66\xd2\xb0\xba\x50\x02\xa6\x16\xe0\xc0\x0c\x62\xc3\xb7\xea\xd0\x93\x00\x63\xf9\x1e\x53\xc1\xc1\x5c\x3a\x92\x2f\xec\x25\x61\x9c\x1f\x68\x9f\x57\x01\x12\x19\xd8\x9d\x5b\xc9\x89\xe6\x4a\x6e\x01\x00\xe3\x16\xd7\x10\x0c\x93\x61\xa9\x0d\x56\xec\x42\x3b\xd2\x6b\x37\xc9\xe9\x9b\xd3\xbd\x50\x1d\xdc\x8d\x52\x16\x74\x06\x97\x75\x9f\x9b\xb2\xda\x37\x49\x99\x66\x65\xce\x05\x53\x64\x2e\x1f\xf1\x77\x64\x06\x0a\xfb\x16\x4b\x6b\xcf\x83\xb9\xec\xdc\x11\x2c\xaf\x55\x67\x9f\x43\xec\x01\x7e\xa4\x8f\x74\x49\x68\x29\x2b\xd1\x99\x44\x00\xb8\x68\x4f\x39\xde\xad\x4c\xfa\xbd\x14\xcc\x3b\xa3\x74\x51\xd9\x16\x69\xbb\x67\x9a\x9a\x0b\xff\xc5\xe4\x8b\xd7\x41\x73\xf8\xc0\x92\xaa\x54\x7c\xc1\x3e\x30\x9a\x7e\x63\x24\x6e\xae\x00\x6b\x68\x49\x6e\xa6\xb7\x52\x29\x7e\x9f\x31\x22\x4b\x60\x90\x04\xbd\xcf\x0c\xd3\xbf\x3a\x61\xcf\xa1\xc2\xcc\x65\x49\x2a\xe1\x45\x84\x8e\x59\x58\x32\xdf\xb4\x8a\x9a\x4e\xce\xf7\x02\x69\x91\x89\x1a\x61\x2f\x57\xec\x33\xce\xf9\xdc\xe1\xaa\xbd\xcc\xab\xb4\x9b\xbd\x4f\xc8\x7f\x87\xd7\x1a\xfa\x1e\x83\xee\x84\x4f\xc1\x6a\x37\xc2\x47\x8f\x25\xd7\xac\x41\xb7\xce\xa6\x34\x53\xab\x87\xd5\xb1\xed\xed\x3c\x79\xd0\x41\xc8\x7e\x74\xbb\x47\x97\xab\x60\xb8\xcf\x9d\x59\x87\xf1\x3a\xd9\xba\x73\x01\xaf\x77\xcd\x62\x88\x1a\x5f\xce\xa9\x48\xb3\x4e\x38\xf6\x2b\xc8\x96\x1d\x0e\x8e\xd6\x5b\xa0\xbe\x6e\xb0\x8f\xa3\x26\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf5\x37\xac\x71\x58\xb1\xe3\x20\x30\x20\xca\x6a\x22\x0d\x7b\xdd\xaf\xb8\xb2\xd7\x1b\x34\x25\x40\xb9\x2d\x7f\x9b\xd3\xce\xec\xd6\x8d\xf5\xd7\x9b\x39\xb1\xec\xd5\x86\xd1\x6a\xe4\xb2\x32\x5e\xdf\xb1\x46\x06\xde\x91\x25\xf7\xb9\x5c\x1c\xf3\x5b\x23\xec\xd2\x70\x1f\x39\xab\x27\xd6\x31\xd4\xea\xb4\x3d\x0a\x5c\x9b\xf3\xe6\x59\xf9\x49\x75\x8c\xd3\x3d\xe5\xb6\x3c\x83\x0a\x35\xcc\x9d\x69\x2b\x0a\x6a\x8a\x41\xb6\x01\x09\x51\x09\x2b\x4b\x59\x7a\x19\x62\xc6\x04\x48\x2b\xa0\x85\x73\x8a\x24\xeb\x3b\x47\x95\x14\x21\x80\xd6\x71\xc8\x06\xcf\x74\x93\x0f\xfc\xac\x63\x30\xa0\x31\x67\xb2\x5c\xb9\x0d\x4e\x00\xdb\x40\x49\x62\x67\x0f\x84\xb9\xee\x17\x81\xaa\x21\x68\x99\x0d\xac\x85\x7f\x39\xf5\x57\x67\x3f\x31\x60\xd5\xfd\xa1\x59\x45\xcb\x13\x02\xdb\x53\x73\x8a\x1e\xe4\x4e\xd5\x76\xae\x31\x82\x3e\x9c\x9c\x90\x33\xec\xe7\x54\x91\x52\x4a\xbd\x1f\xa2\x6e\xf7\xe7\xfa\x53\xb1\x57\x25\xd4\xb5\xcd\x3c\x4b\x8a\xa3\x6d\xd6\x97\x6c\x4e\x17\x4c\x11\xc5\x73\x9e\xd1\x32\x83\xb4\x9e\x77\xb8\x3c\x88\x4c\xdb\x98\x3b\x3b\x20\xef\x72\x43\xe3\xdd\x9c\x67\xa3\xbb\x43\x9e\x23\x71\x6b\x30\x47\x04\xf4\xc6\xad\x09\xea\xe6\x56\xba\xa2\x59\xb6\x24\xec\x53\x92\x55\x06\x5f\xee\x45\x58\xee\x23\x27\xaf\x8a\xc8\x85\x75\xd4\x3f\xa2\x80\xdc\x56\x79\x1a\x7e\x35\x75\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\x49\x98\x52\x2e\xf3\xc0\xb2\x99\x3d\xc1\xaf\xe1\x73\x49\xa3\x4e\x1f\xd5\x75\x46\x95\xe6\xc9\x97\x99\x4c\x1e\xee\xb4\x2c\xf7\xaa\x2b\xda\xd4\xff\x4a\x72\xfa\x8b\xbf\xdd\x19\xe4\xfd\xd0\x48\xf7\x64\x1d\x31\x9b\x86\x29\xda\x31\xd0\x43\x75\xcf\x32\xa6\x4f\x15\xc8\x8f\x24\xa7\xc9\x1c\x4b\x24\x80\x70\x28\x7c\x42\x31\xab\xbe\xde\x79\x44\xd8\xae\xcc\x2c\xa1\xe8\xc8\x1b\x33\xc7\xf5\x65\xa0\xbf\x99\x7d\x07\x73\x72\xa0\x06\x0b\x8c\x81\x75\x2d\xe7\xb1\x2e\x59\x17\x3b\xb5\x71\x9f\x20\x52\xd5\x26\x26\xe7\x25\x7a\xba\xd9\xf9\xb3\x7b\x35\x49\x14\x9f\xd0\x47\x35\x49\x64\x4e\x2e\xef\x6e\x48\x5a\xf2\x45\x77\x88\x43\xa4\x0b\xa9\x4d\xd5\xf7\xca\xde\xf0\x5f\xd3\x47\xc5\x70\xa2\xf7\x66\xa2\x50\xde\x22\x00\x77\xec\xd5\x29\x0a\xe7\x72\x73\xb5\xf3\xc5\x70\x87\xa7\xa9\xfa\x68\xe6\xd8\xf1\x56\x1f\x17\x18\xec\xd9\xa9\x4a\xa7\x3c\x63\xa8\x02\xc6\x93\xb5\xe1\xd4\x16\xd5\x00\xd0\x2f\x65\x45\x1e\x29\x5a\x33\x80\x80\x05\xc5\x58\xf3\xe2\x0d\xb9\x16\xaa\x2a\x59\x6d\x24\x5b\x1d\x6c\x13\x4b\x0e\x37\xc5\x82\xac\x98\x05\xa9\xa7\xb1\x5d\x7f\xa2\x79\x91\x31\xf5\x86\x9c\xb0\x4f\xfa\x0f\x27\x23\x72\xf2\x69\xaa\xcc\xff\x84\x9e\xaa\x93\x09\xb9\xc9\xbd\x0b\x35\x17\x53\x56\x96\x3e\x2c\x1b\x3f\x30\x2c\x79\x4b\x8a\xea\x1e\xf3\xd8\x70\x4b\xe2\x9c\x5f\xc0\x3c\xd4\xad\x49\x23\xbd\xe0\xc8\x77\xee\x40\xa9\xf1\x40\xec\x07\x88\x6e\xa6\xce\x63\x1e\xe5\x2a\x57\xf2\x9d\x2b\xdf\x8d\x01\x1b\x3b\x8e\xa1\x3c\x71\x80\xf2\xd6\x27\xa9\x24\xaf\x52\xb6\x78\xa5\x52\xfa\xc5\x08\xa6\xaa\x6c\x24\x78\x7b\x5d\x54\x91\x93\xb0\xcc\xb5\x77\x8e\x73\x1b\x35\x77\xa2\xee\xc9\x20\x62\x37\x24\xf8\xbd\xbc\x3e\x01\xd1\xc5\x8c\x9d\x50\x41\x32\x46\x17\x56\x9c\x43\x94\xb1\x44\x03\x43\x27\x87\x15\x63\xac\x21\x6d\x83\xcd\x3f\xfd\xbe\x53\xbc\x0e\xd1\xc1\x90\x5e\xd0\xe4\xfa\x76\x56\x9b\xb2\xb2\x19\x98\xa6\xb2\x4c\xbc\xcc\x69\xb5\x34\x4c\x03\x6e\xe0\xa2\x65\xd7\x78\xd9\x17\x36\x2c\xc1\x98\xa3\x22\x07\xf1\x7d\xb4\x7d\x83\x06\x59\xf0\x9f\x2a\x46\x6e\xae\x7c\x3a\x6f\x56\x2a\xae\xb4\x11\x28\xd2\x16\xdf\xc3\x91\x19\x3a\xbb\xc8\xe9\x3f\xa4\x20\xd7\x5f\xde\xd9\x8e\x02\x40\xf1\x45\x23\x48\xfa\x8f\xaa\x64\x86\xc7\xdb\x2b\x6b\xe9\x3a\x5d\xe5\x27\xcd\x73\x72\x45\x35\x45\xb6\xd2\x06\x16\x89\x9a\xe4\x19\xa6\xf0\x9e\x8b\xd4\xfe\xd4\x93\x25\xf4\xc3\x47\xf1\x81\x8d\x69\x9b\xcd\xeb\x5a\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x28\xfe\xef\x00\xdc\x98\x99\xcd\xfb\xae\xb8\x66\xf7\xe2\xb7\x1f\x6e\xf6\xc4\xb5\x25\xc0\xe1\xcf\xde\xc9\x34\x96\x75\x3b\x6d\x7c\xea\x08\xea\xbf\x1a\xb8\xb8\xc4\xe7\x24\x37\x7d\x82\xe2\x6a\x04\xca\x5b\xf2\x0d\xe8\x36\xe1\x9f\x7f\x2b\xb9\x66\x93\xee\x3c\xb4\x11\xac\x83\xdb\xc0\xc8\x65\xb8\xcf\xdc\x12\x9a\x29\x7a\x52\x03\xfd\x80\x5c\x2c\x7f\x70\x9f\xc9\x7b\x62\xaf\xfc\xbe\xe7\xfe\xed\x87\x9b\x1e\x53\xff\xf6\xc3\x8d\x9b\xb9\xf9\xa7\x9c\x1e\x6f\xd2\xc7\x60\xf8\xdf\xae\xf0\xdf\x31\xbc\x58\x9d\xdc\x6a\x95\x8b\xdf\x27\x0b\x3f\x39\x1a\xf3\xde\x2f\xf3\x90\x19\xab\x4b\xe8\xe7\x22\x20\x85\x71\xfb\xf2\x9b\x6f\x08\xfb\x54\x20\x46\x6d\xb8\x4c\xde\xcd\x29\x64\x9d\x76\x09\x2e\x11\xfc\x0c\x3c\x2a\x43\xb2\x1d\x20\x12\x8a\x25\x2e\x0c\x35\x40\x2d\x7d\xfa\xc6\x39\x82\xfb\x2f\x36\x7f\xf0\x0e\x02\x30\xd3\x37\x48\x03\x08\xc6\x63\xa6\x0d\xb8\x3f\x43\x73\x85\xf0\x3f\xd9\xb8\x7b\x4c\x82\xa5\x98\x3e\x9f\xb4\x74\xeb\x0a\xa6\xbc\x57\x64\x74\x14\xc6\x73\xcd\x82\x49\xce\xcc\x6f\xaf\xc0\x3e\x7a\x3e\xa9\x2d\x66\x90\x1d\xa2\xe6\x4d\x03\xc6\x30\x97\xe2\xc3\x93\xb9\xd7\xb8\x44\xb5\x1e\x64\x61\x2d\x5d\x7c\x90\xc1\x0c\x7b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\x3b\x3d\x24\x2b\x04\x03\xf5\x60\x85\xe0\xbb\xde\xac\x90\x41\x90\x2f\x87\x15\xc2\xd4\x81\x41\xcc\x10\x5c\xdd\xce\x37\xc3\xd9\xa1\xa3\xdc\xdb\xf4\x97\x74\x6f\xeb\xc3\x8a\xdc\xb3\xfa\x43\xc7\xc0\xf8\x04\x39\x2e\x25\x7d\x2b\x20\x15\x2f\xe2\x9d\xa5\x06\xb6\x42\x12\xb2\x6b\xe6\xfa\x7d\x15\x90\x5d\x3f\x02\x81\x7b\xc0\x8a\x5d\x95\xfb\xce\x2d\x0a\x89\x14\x3c\x26\x01\x20\x1d\x3c\xc9\x84\x15\xf3\xe9\x5e\xbd\x9c\x4d\x8f\x6f\xef\xda\x66\x9c\x4b\x56\xcc\xc9\xdb\xbb\x0d\x28\x0f\x0e\x07\x96\xa5\xd0\xb8\x73\xaa\x48\xc6\xa7\x0c\x7c\x12\x22\xb0\xde\x25\x8e\xda\x42\x79\xde\x19\xcd\xa1\x38\x5c\xac\x57\xc1\x0a\x49\x32\x29\x66\x86\x39\x08\xab\x75\x73\x00\x24\x95\x4b\xc1\xb5\x2c\x77\x7b\x43\x84\x23\x1e\xd7\xdd\x21\x10\x8f\xeb\xdb\x6c\x5d\x5d\x16\xe4\x5d\xe3\x29\x25\x89\xcc\x32\x96\x68\x5b\x2b\x0b\x8e\x3d\x68\x85\xd8\x36\x28\x4d\x98\xd5\x59\x4e\x1e\xfe\x08\x6a\x13\xab\x20\x79\x85\x47\xf9\xea\xc3\xf5\xc5\xd5\xbb\xeb\x49\x9e\xfe\x7a\x2e\x1f\xc7\x5a\x8e\x2b\xc5\xc6\xbc\xbb\xe4\xc6\x67\x1c\x9d\x49\x30\x59\x47\x40\xa5\xaf\x36\xab\x5d\xd8\x22\x65\x2e\xdf\xef\x1b\xf2\xad\x42\xef\x0d\xef\xb9\xc3\x52\xb0\x66\x8f\x48\x49\x6d\x1a\x50\x8a\x57\x75\x5a\x65\x19\x9e\xa6\xb9\x47\xa3\xa6\x3e\xfa\xd5\xe7\xc7\xf0\xb6\x36\xe1\xc5\x73\xbf\xc7\xbf\x16\x31\x14\xbb\x9b\x7f\x26\xbd\x0e\xab\xee\xbd\x7d\x5c\x77\xad\xe7\x68\xa5\xd0\x73\x73\x78\x0f\x6c\x49\x20\xa8\xdb\x30\xb6\xdf\x2a\x56\xb6\xc1\x94\xe9\x04\x76\xe7\x55\xa5\x58\x39\xc1\xee\x5f\xe0\xde\x87\x71\x15\x61\x49\xb1\xc9\x13\x76\xfe\x03\x9b\x6e\xda\x78\xfb\xb8\x2e\xed\x6d\x39\x7f\x5a\xe9\x39\x13\x9a\xdb\xec\x96\x96\xf3\xda\x78\x12\x01\x55\x98\xb1\x1d\x7b\xeb\x03\xab\x35\xc5\xd5\x56\x1a\xea\x11\xd5\x6d\xa8\x47\xf4\x32\xea\x11\x3d\xa5\xc8\x9a\xc1\x9e\x87\xc0\x3a\xa6\x5f\x48\x14\xd7\xe4\x4e\x7c\xea\xab\x92\xa6\x52\xe1\x3b\x58\x67\xb7\x81\x4f\x68\x9a\xf3\x6e\xad\xd0\x0b\xc4\xe4\x09\x17\x69\xd7\x66\x46\x8a\x5e\xd0\x63\x5b\xf4\xb2\xcf\xac\x21\xde\x3b\x71\x51\xa7\x65\xc2\x04\xe3\xd6\x61\xab\xed\xaf\x15\x25\x7f\xe1\x30\x71\x2a\x27\x3b\xb7\xde\xfa\x26\xfc\x1e\x34\x4e\xb2\x60\x06\x91\x24\x0f\x13\x59\xce\x9e\xe6\x80\xb5\x0a\x15\xf9\x52\xfd\x94\x8d\x71\xac\x71\x91\xd6\x60\x71\x6c\x59\xf1\x17\xe2\x69\xf5\xf2\x8c\x2f\x2f\xc2\x7f\x6a\x3f\x60\x47\x5e\xa0\xbc\xf5\xe2\x15\x95\x47\x39\x8f\x18\xa9\xea\x18\xac\x7d\x4d\x69\x0b\xc9\x6d\x74\xb4\x2f\x7b\x8a\x78\xcb\x69\x4d\xcd\xa6\x16\xb4\xa4\x39\xd3\xac\xc4\x28\x4c\x1b\xf5\x29\x42\x38\x66\x08\x11\xfd\xa6\x60\xe2\x0e\x10\xf4\xc0\x8e\x6f\x6e\x03\x3b\xbe\xa3\x0d\xec\xf8\xc6\x76\x14\xb7\x39\x77\xdf\x79\x6a\x44\x7c\xeb\x1c\x5a\xc7\x64\x58\x2e\xec\x65\x60\xd9\x6e\xae\xdb\xd5\x6e\x8b\x60\xbc\xfd\x37\x2b\xac\x75\x5d\x4b\x11\xad\x18\x10\xed\xe4\xeb\x91\xc2\xed\xc1\x6d\xda\x0f\xa7\x18\x8e\xea\x2c\xf8\xf5\x70\xc7\x0a\x82\x8c\x46\xf7\x6d\x4a\x92\x9b\x27\xf7\x5c\xd7\x34\x42\x31\x4d\x0a\x56\xe6\xdc\xe6\xc7\x95\x82\x24\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\xa2\xf8\x41\x41\x64\xa2\xa9\xcd\xea\x44\xee\x99\x7e\x64\x4c\x90\xd7\xaf\x5f\xbf\x06\xd1\xe6\xf5\xbf\xfc\xcb\xbf\x10\xc8\x35\x9e\xb2\x84\xe7\xeb\x2f\xc2\x5b\xff\xeb\x8b\x2f\x42\x06\xfd\xb7\x8b\x77\x5f\x43\x9c\x51\xa1\x15\xb9\x97\x7a\x6e\xc7\x36\x5d\xb4\xba\x57\x23\xf2\x7f\xef\xbe\x79\x5f\x17\x8a\x69\xff\x0a\xf2\x8f\xdf\xa2\x90\x91\x9b\xca\xe9\xd7\xff\xfc\x87\x3f\x04\x7d\x03\x42\x92\x2c\x21\x98\xbb\x0e\xda\x2b\x5c\xb8\x99\x90\x7a\x3d\x55\xb3\x65\x9d\x82\x8b\xc8\xe5\x7c\x36\x87\x83\x30\xf7\x5f\x8a\x69\xc6\x13\x8d\x44\x02\x13\x3f\x20\x48\xd8\x72\x21\xd4\x66\x5d\xb3\xb2\x40\x90\xa9\x29\x65\x23\x92\xf1\x07\x46\xa6\xea\xaf\xa5\xac\x8a\x3a\x37\xa2\xad\x5e\x91\x50\x61\xc6\xc7\xe1\x6a\xb8\x53\x2c\x38\x23\xeb\x21\x3c\xc5\x03\x6d\x45\xf1\x57\x0e\x3a\x5e\x11\x34\x46\x58\x93\xf1\x81\x2d\xc7\x08\xdd\x05\xe5\x3e\xec\x0d\x5c\x6e\x91\x9b\x68\xf3\x23\x49\x50\x79\xe8\xba\xc4\xa5\x8b\x89\x2e\x4a\xf9\x77\x04\x1a\x2e\x5c\xda\x31\xab\x54\x50\x56\x3e\xb3\xb9\x30\x45\x6d\xb7\x0e\x18\xc9\xe5\x74\x36\xbc\xa6\xcd\x26\x5d\xa7\x34\x23\x37\xd3\x66\xe0\x31\x24\x35\xe6\xca\x4c\x02\x2a\x35\xdb\xb9\x05\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x12\x6b\xfd\x63\x38\x79\xd0\x18\x40\x1a\x60\xd2\xd4\xa5\xae\xab\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x38\xe7\xad\x8d\xb0\x65\xba\xb2\x47\x84\x11\xec\x95\xc8\x98\x52\x36\x42\x3b\xa7\xe5\x03\x4b\x3d\x7e\x9e\x40\xd8\xb3\x0a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x9c\x2e\x5b\xd9\x6f\xcc\x34\x4e\x27\x93\x53\x44\x2d\xb2\xc4\x80\x7b\xc4\x02\xe6\xf9\x33\xe5\xc8\x6d\xdd\x2d\x28\xce\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1d\xd1\x4c\xed\x5e\x86\xe0\xbe\x28\xc9\x24\x5c\xb5\x83\x2d\x24\xbf\xb8\x7b\xb3\xd8\x9d\xa3\xc9\xb5\x38\xe1\x28\x30\xdb\x38\xb6\x6d\x39\xc7\xed\x1e\xdb\xfb\x16\xca\xde\x47\x33\xd8\x79\x10\x6b\xb3\x61\xaa\xc1\xa2\x1c\x8e\xd1\x36\x82\x05\xf1\x37\x36\x75\xc2\xae\x7a\x80\xab\xed\x59\xd8\x1a\x6c\xcf\xc7\xdc\x60\xbb\x99\xae\x66\x97\x68\xa0\xb7\x26\xa3\xe9\xe8\x50\x48\x0e\xa8\xba\x1d\x83\x5b\xc1\x76\x60\x9e\x05\x5b\x1c\xe7\x82\x2d\x86\x7f\xc1\x16\xe6\x5e\x82\xad\xef\xe5\x72\xee\x28\xb8\x3d\x96\xcc\x20\x25\x99\xfa\xcd\xc7\x0c\xae\x45\x03\xb1\x44\xdc\x29\x4b\xae\xf0\x5a\xd1\x7b\x25\xb3\x4a\xe3\x10\xf1\x9d\x34\x69\x1e\x4c\xd2\xa5\x04\x0f\x23\x74\xab\xdd\x35\x28\x25\x70\x22\x48\x9e\x62\xfa\x3a\x9e\xaf\xd1\x50\xc4\x7a\x28\x62\xbd\xa5\xbd\xac\x22\xd6\xee\x33\x1f\xc3\xbc\xb9\x64\xbf\x2c\x89\x41\xba\xc0\xdf\xbf\xa4\xe2\xd6\xd8\x12\xc5\x63\x14\x53\x8a\x93\xb3\x4b\x9f\xf1\xc4\x79\x35\xdf\x08\xcd\xca\x29\x4d\xd8\x79\x53\x61\xc5\x8a\x39\xcb\x59\x69\x36\xc8\xbe\xe7\x52\x7b\xd8\x84\x6e\xe4\x7e\xe9\xe0\x8f\xb0\x4f\x9a\x95\x66\x33\x6b\x53\xea\xf1\xeb\xed\xe0\xb8\xfb\xd2\x89\x41\x67\x07\x51\x87\x41\xcf\xad\xf2\xa0\x16\xaf\xd5\x9b\x87\x7b\x8d\x1b\xad\x9a\xaa\xc1\x90\x1b\x7e\x29\x05\xf0\x0f\x80\x62\x96\xb2\x2a\xd1\xe9\xc1\xdb\xd3\x13\x59\x96\x86\x67\x81\xa1\xa9\x22\x25\x9b\x19\x21\xb6\xc4\x02\xca\xf0\x46\x56\x99\x07\x7b\x8d\x0e\x3b\xb8\xfd\xd8\x1b\x8a\x77\xc4\xc7\x05\xf4\x66\x39\xcc\xa2\x94\x0b\x9e\x3a\x06\xb3\x89\xa5\xb9\x22\x05\x55\x8d\x7c\x34\x54\x29\x99\x70\x50\x52\xd6\x27\x18\x30\x12\x4a\xf8\xc0\xa8\xfa\x2c\xab\xad\xfc\x0d\x4d\x23\xb6\x84\x7c\xf9\x01\x9e\x70\x11\x47\x22\x64\xca\x6e\xab\xfb\x8c\xab\xf9\xdd\x21\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\x6d\x06\xc5\x20\x73\xa5\x50\x1c\xf8\x42\x43\xdd\x0c\x13\xcb\x8d\x78\x25\xe1\xb4\x5c\xff\xcd\x2b\x26\x81\xc6\x67\xcc\xe6\xea\xbb\xbc\xdb\x1d\xde\x8c\xed\x7d\xbd\x16\x9b\x81\x0a\x2b\x32\xa4\xec\x5b\x51\xb4\x9e\x27\x34\xdb\x5e\x89\xae\xd9\xda\x2c\x8a\xa3\x4b\x28\x0e\xb8\xbc\x55\x08\x80\xdc\xc0\xa6\xdb\x23\xde\x28\xae\x69\xb3\x70\x07\x1b\x75\x57\x36\x58\x91\x5c\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x68\x64\x4d\x83\xe4\xbf\x70\x03\x06\xe3\xec\x96\x36\x18\x67\x77\xb4\xc1\x38\xbb\xb1\x1d\xc5\xb9\xa6\xce\xdc\x4b\x1b\x49\x56\x5b\xb5\x66\x3d\x9f\x10\xce\x71\x74\x44\x45\xec\xd5\xe5\x05\x67\x75\xa1\x75\xc9\xef\x2b\x7d\xa0\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x49\x03\x61\x59\x65\x90\xc7\x8c\x0d\x7a\x13\xcc\x12\x4e\x3c\xe7\x06\x4c\x1b\x3e\x3c\x55\x24\x95\x49\xe5\x0b\x12\xc3\xe9\xd4\xde\x6c\xa1\xf5\x0a\xa3\xf0\x70\x7c\x39\xaf\xe6\x20\x9d\x57\x2b\x95\x8f\xc2\x60\xbb\x8b\xdb\x8e\xdc\x13\xed\xbc\x13\xf5\x57\x4d\x31\xc5\x3d\x26\xe6\x39\xbd\x97\x95\xf6\xd9\x7d\xff\x87\x99\xd9\x37\xe9\x9d\xb5\x24\x95\x62\x3b\xcd\xe8\xb5\x36\xb9\xe7\x18\x83\xed\x7e\xb0\xdd\x0f\xb6\xfb\x6d\xad\x75\x8f\x6f\xd0\x2c\xdf\x2c\xfa\xdc\xc2\x5f\x2e\x55\x72\xc8\xd6\x1d\xde\x1a\x7a\x55\x63\x5c\x14\x69\x56\x13\x55\xac\xc8\x59\x78\xdb\x6b\x6d\x7c\xc3\x1d\xd4\xa1\x64\x60\x89\x9f\xdf\x72\x7a\x20\x7b\x28\xac\x2e\x48\x86\xc6\xd6\x8e\xb8\xad\x83\xa4\xb1\x94\x3b\xba\x49\x34\x3c\x32\x0a\x99\xbe\xc1\xaa\x9e\x54\x08\x89\xec\x80\x1a\xd9\x92\xe7\x23\x1b\xea\x02\x8c\x70\x41\x13\x94\x4b\x2b\x9e\x02\x26\xa8\x23\xd6\xbb\xe3\x6f\xb1\x45\x9e\x00\x89\x3e\x05\x02\x27\x01\x0b\xec\x28\x21\xd4\x6c\xb1\x47\x62\x1a\x2d\xf8\x77\xac\x54\x41\xf9\x3d\xeb\xd6\x4e\x36\x8d\xdf\xbb\x93\x50\xc9\x9c\xe5\x14\xfe\xf9\xd6\x2d\xc0\x5c\x6b\xc3\xef\x6a\x86\x89\x3d\x59\x99\x1b\xc1\x6b\xd4\xf2\x67\x3f\x59\x84\xe5\xc5\x74\x2d\x5a\x58\x21\x0e\x0c\xbb\x53\xe0\xef\x58\xee\x6d\xcb\xb0\x66\x40\x10\xe8\x7b\x86\x85\x32\x57\xdc\x61\x00\x71\xe1\xfe\x1c\x78\x69\x4f\x91\xae\xb0\x1d\xc3\x0f\xa0\xaf\xfd\x7f\xe4\xed\x0b\x6d\x96\x27\x78\xe0\xc1\xfe\x3f\xd8\xff\xdb\xed\x85\xdb\xff\x1b\x24\xcf\x61\xd0\x0d\x06\xfe\xa6\x85\xc4\x59\xf9\xef\x99\x93\x2d\xac\xfc\xe2\x4c\xf7\xce\x6e\x2f\xcb\xb6\xe3\xd9\xe9\x64\x72\x8a\xae\x67\xb5\xc0\x53\xe9\xe9\xf8\x8f\x84\x89\x44\xa6\xa6\x9f\x8f\xd0\x7f\xa9\x34\xb0\x4b\xb5\xe6\xaf\x39\x97\xdc\x8d\xd5\x74\x5e\x83\xbe\xe3\xe8\x6a\x04\xda\x73\x19\x66\xdf\x3e\x85\xb9\x88\x40\x5f\x35\xf3\xe1\x73\xdb\xda\xad\xf0\xb5\x12\x2c\x17\xe2\x7e\x57\x24\xe3\x39\xb7\x75\x61\xcd\x7d\x67\x4a\x87\x2a\x2e\x09\x39\xc3\x8f\x27\x49\x51\x8d\x6c\x47\x93\x9c\xe5\xb2\x5c\x8e\x7c\x67\xe6\xc7\x56\xef\xf6\x0d\xac\xda\x91\x54\x65\xc9\x84\xce\x96\xa1\x89\x79\xea\x76\x24\x2e\xc7\xed\xd4\x01\x99\x1c\x7f\x38\x61\xe9\xa3\xea\xd6\xbe\x91\xb5\x75\x18\xd4\xeb\x7e\xb5\x58\x96\x17\x03\x9e\x47\xb5\xed\xdc\x3c\x65\x62\x41\x16\xb4\x54\xa1\x37\x80\xf4\xe5\x6b\x52\xbe\xe0\xaa\xab\x72\xf2\x8e\xc5\xdd\x79\xdd\x27\x94\x1c\xac\x74\x51\x69\x8b\xee\x1c\x88\xbb\x4a\x13\x1e\xb4\x57\xd8\xb7\x2f\xba\x55\xc0\x75\x2b\xa8\xd6\xac\x14\x6f\xc8\x7f\x9c\xfd\xfb\xef\x7e\x1e\x9f\xff\xe5\xec\xec\xfb\xd7\xe3\xff\xfd\xc3\xef\xce\xfe\x7d\x02\xff\xf8\xed\xf9\x5f\xce\x7f\x76\x7f\xfc\xee\xfc\xfc\xec\xec\xfb\xaf\xde\xfd\xf5\xe3\xed\xf5\x0f\xfc\xfc\xe7\xef\x45\x95\x3f\xe0\x5f\x3f\x9f\x7d\xcf\xae\x7f\x08\xec\xe4\xfc\xfc\x2f\xbf\x89\x98\x24\x15\xcb\x6f\x82\x71\x0a\xb6\x71\x2f\xba\xd2\xfe\x36\xf2\xe8\x57\x78\x3f\x2e\xf4\x58\x96\x63\xec\xe4\x0d\x64\x41\x0f\xee\xca\x1d\x6d\xff\x3b\x52\x53\xad\xba\xea\x89\x63\x8f\x0f\x7c\x09\x9e\xc6\x01\xf7\x76\xec\x02\x53\xd1\x15\xdf\x6b\xf6\x01\xd7\x67\x3b\x48\x4a\xb3\xbc\x90\x25\x2d\x97\x24\xb5\xca\xad\xe5\x93\x92\xbe\x3d\x31\xb1\x3a\x4c\x32\xe5\xbb\x61\xfc\x00\xaa\xe2\x9c\xa5\xbc\xca\x0f\x92\x96\x0d\x7a\x6e\x6e\xfa\x23\x94\x1d\xb1\x45\x4d\x9c\xaf\x8f\x7d\xcd\x95\xe4\xa2\xc9\x03\x0a\x2a\xfe\x54\xc2\xf4\x87\xad\x5a\x14\x27\x27\x2b\x35\xbe\x41\x37\x0d\x4e\x30\x32\x65\xa7\xca\xbf\x8b\x83\x47\x2a\x89\xd1\x9c\x69\x7d\x23\xcf\x6c\x57\xe7\x86\x11\x7c\x07\xbc\xc2\x11\xd2\xf0\x07\x41\x0b\x89\x4c\xde\xc4\xff\xc1\xbe\x36\x5c\xd1\x41\x22\xbc\x5d\xe7\xbe\x22\xb8\x04\x61\xce\x26\x5e\x9c\x92\x4c\x26\x0d\x07\xb0\x16\x33\x00\xe0\x70\xed\x2e\x71\xb8\xad\xd0\x00\x85\x19\x17\x79\x3d\x50\x86\x66\x0a\xbd\x5b\x78\x02\x05\xda\x40\x34\x84\x33\x8b\x80\x04\xd3\x6d\x4e\x3f\xf1\xbc\xca\x49\xa5\xcc\x6c\xa5\x68\xf7\x52\x4f\xf6\xd1\xd5\x99\x83\x54\x76\x5c\xc0\x47\x2d\xd1\x38\x44\x45\x39\x67\xe4\xce\xef\x5f\xad\x0e\x41\x53\xba\x95\xe4\x54\x05\x82\x84\x9d\x87\x65\x93\xe5\x14\x1c\x2b\x3c\xc7\xa6\x7c\xa9\xb2\x1e\x97\x4a\xf0\xac\x7d\xab\x5c\x11\x21\xbf\xbd\x95\xb0\xfe\x8a\x2f\xe9\x06\xbc\x60\xde\x28\x98\x23\x8a\xe7\x83\x22\xb9\x9f\x27\xf0\x3c\xde\x7b\x73\xaf\x24\xdb\xbb\x84\xb6\x68\x76\xb3\x7e\x51\xdb\x3d\x94\x3a\x4f\x42\x8f\x42\xc2\xd2\xec\x7c\xf4\x3a\x1d\x4b\xea\x93\x65\x62\x53\xf8\xf1\x56\x1d\x38\x1c\x14\xe1\x1b\xc2\xd8\xc6\xe6\x3f\x4e\xf7\xe3\xcc\x8f\xf7\x6c\x8a\xee\x4d\xf8\x0d\xc8\xee\xaa\x2b\x74\x0e\x35\x5a\x19\xd3\x10\x8b\xc7\x7c\x75\x40\xf4\xbb\xca\xe5\x22\xa0\x80\xf0\xb7\xca\x1a\x9c\x79\x27\x40\xd1\xf3\x56\x9c\xbc\x42\x11\x5b\x30\x96\x62\x2c\x60\x56\xcf\xbf\xac\x44\xe7\xec\xef\xcf\xc9\x94\x51\x5d\x95\xe8\xfd\x23\x8c\x94\x93\x39\x01\x0e\xd5\x4e\x25\x33\x87\x02\x29\x10\x4b\x99\x13\x25\x68\xa1\xe6\x52\x83\xea\x84\x16\x34\xe1\x3a\x20\xbc\x4c\x97\x34\x79\x80\x1a\xcb\x25\xb3\xb3\xed\x9a\x5a\x72\x6e\xa3\x18\x9a\x10\xd1\x8e\x7d\xd4\xf3\x52\x56\xb3\x39\x84\xe2\xe1\x5b\x49\x46\x15\xc6\x5c\x76\x19\xd9\x37\xf6\x6e\x15\x03\x8a\xa4\x4b\x41\x73\x9e\xf8\x4a\x53\xa5\x5c\x70\xc5\xa5\x35\x52\xc1\xa8\xdd\x8b\xa6\xe4\xd6\x97\x01\x42\xcb\xd8\x65\x46\x79\x4e\xce\x14\x63\xe4\xda\x5d\x12\xfc\xe5\x0e\x05\x04\x54\x77\x86\x38\x58\x35\x8d\x6a\x36\xf5\xb1\xcd\x9c\x62\x9e\x38\xd5\x6d\xc3\x8d\x21\x24\x21\x96\x85\xe7\x8d\xd3\xee\x2e\xf0\x6b\xc0\x78\xf3\x8a\x65\x09\xfe\x82\xae\x1a\x1e\x13\xa9\xac\xdd\x63\x3a\x7a\xbd\xb8\xbd\x51\x4d\xb5\x02\xde\x65\x5b\x60\x09\x7e\xb0\xe9\x96\x7d\x5e\x59\x8f\x09\x3a\x7a\x36\x04\x56\x40\x21\xe6\x05\x4f\x2b\x9a\x21\x69\x0d\x58\xe4\xe5\xdd\x0d\x0e\xcc\x67\x73\x3d\x7e\x64\xa0\x08\x46\x1e\xa8\xc6\x7d\x6e\xba\x7c\xcd\x69\x9b\x2b\x20\xc2\x01\x35\x98\xad\x62\x1a\x97\xfc\x48\x97\x90\x7f\xde\x3a\xff\xb6\xbc\x7d\x5c\x4d\x18\x1c\x60\x2a\xbb\xa8\x4c\xee\xe8\xb7\x05\xa1\xce\x65\x5f\x00\x4a\x49\xa8\x00\x66\x1c\x34\xfa\x06\x9e\x00\x6b\xac\xaf\xb9\xfb\xfe\x35\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xa7\xcc\x76\x00\x69\x6a\x51\x43\xec\x47\x96\x17\x19\xd5\x07\x71\xc0\xf9\x5b\xc3\xe4\xd0\xb0\x87\x1b\x24\x46\x45\x3a\xa6\x99\xb9\x2a\xb7\xdf\x5d\xda\x80\x57\x44\x3c\x91\x9e\x76\x1f\x1d\x11\x12\xbe\x96\xb2\x61\xc3\x37\xe2\x1c\xc8\x9e\x7a\xcf\x52\xa0\x20\x76\x6e\x61\x4e\xc2\xf2\x51\xb0\xd2\xc1\xde\xed\x77\x97\x23\xc2\x27\x6c\xe2\xfe\xf2\x9d\x39\xf2\xa8\xe5\x0c\x43\x67\x5c\x88\x5a\x88\x6d\x5d\xa6\x13\x5c\x4e\x53\xbf\xdf\xec\xfd\xc7\x3f\x99\x85\x9a\x5f\xff\x3c\xfe\x53\xa3\x76\xe1\x9f\x7f\x34\xf4\x38\xc8\x57\xf5\xc7\x95\xef\x9a\x31\x17\x40\xf4\xcc\x5f\x3f\xde\xda\xb2\xc5\xb6\xa8\xf1\x8f\x81\x4e\x15\x84\x30\xa1\xcb\xe5\x84\xdc\x4a\xf0\xc3\xe3\x29\x5e\x59\x98\x7f\xc9\xfe\xee\xcc\x42\x70\x5c\x5e\x83\x9e\x50\xcd\x04\x70\x25\x3b\x2b\x00\xd7\xcd\x66\x00\x80\x01\x00\x39\x51\xd8\xa5\x33\x50\xbd\x62\x3a\x9c\x11\xd1\x12\x93\xd3\x77\xe3\x72\xd3\x2e\x04\x61\x9f\xb8\x82\xec\x67\xb8\xe3\x70\x6c\xd4\x86\x84\x38\x46\xce\x0c\x6b\x20\xc1\xe7\xcc\x2b\x64\x88\xef\x06\xac\xff\xb7\x42\xea\xdf\xfa\xcb\xe0\x3c\x4a\x81\x63\x93\x84\x2e\x24\x77\x35\xb6\x0d\xe2\x11\x60\x64\x09\x4a\x34\x61\xcf\xf3\x7e\x49\x72\xae\x34\x7d\x60\x13\x72\x67\xd8\xb9\xa6\x93\x09\x9e\xb2\x20\x50\x0b\x8f\xa5\xa4\x12\x9a\x67\x81\x12\x9d\x9f\x0b\x6c\x4c\x83\xd5\x83\xd4\x12\x55\x62\x78\x92\xa2\x64\x63\xc7\x5a\xe2\x5b\x41\x7a\x17\x5b\xd5\xd3\xed\x49\xbd\xa7\x23\x0f\xfa\x73\x8a\x6a\x91\x22\x85\xce\xad\xa7\x76\xf0\x85\x5d\x8b\xa6\x30\xbb\x21\x45\x52\xb3\x8e\x70\xec\x6a\x42\xde\x03\x3f\x98\x85\x00\x39\x3a\x8d\xa1\x1e\xc8\x5a\xd9\x04\x4b\x98\x52\xb4\x5c\xa2\x13\x3b\xf7\xd5\xb5\x2b\xc5\xa6\x55\x06\xec\x72\xc8\x96\x50\x81\x95\xcc\x4b\x96\x48\xa1\x74\x59\x25\x70\x8e\x94\xdc\x97\xf2\x81\x89\x3a\x0c\x29\x08\x31\x36\x3d\xee\x6b\xd7\x66\xc3\xf6\x08\x49\x92\x39\x15\x33\xe6\x53\x80\x90\x9c\xa6\x00\x45\x5f\x79\x01\x2b\x64\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\xf7\x86\x23\x73\xf6\xc8\x90\xc9\x7e\xf0\x41\x00\x79\xc3\x78\x29\x78\xb6\x67\x47\xde\x18\x5b\xd5\x18\xf8\xef\x6e\xc1\x3d\xca\x36\x95\x33\x4d\x53\xaa\xe9\x21\xe3\x34\xde\x51\x5f\xc6\xdd\xfa\x42\xc1\xa1\x37\x7c\xa4\x2c\x9b\xe5\xa4\x42\x59\xf0\x66\x62\x97\xdb\xef\x2e\x03\x47\x02\x31\x10\xce\x19\xf2\x46\x6a\x73\x8f\xac\x79\x1e\x20\x0f\x43\x63\x5c\x2c\x86\x99\x84\x1b\x13\xc9\x01\x4b\x49\x5a\x45\x68\xfb\x6b\xa2\x12\x66\xcf\x8c\xb4\x66\x9a\xf3\x3e\xe4\xc1\x7c\xac\xdd\x84\x92\x76\x64\xc1\x46\x61\x02\x2d\xf0\x4c\x68\x5e\xb2\x46\x7a\x9f\xc0\xc1\xec\xa9\x56\x02\x6f\x7a\xfb\x7c\x11\x00\x66\x4c\xab\xda\x25\x19\xc9\x7f\x70\xff\xda\x32\x8e\x38\x4b\xe0\x65\xdd\x99\x5b\xfd\xdd\xc6\x45\x05\xf6\x8e\x70\xa3\xa4\x25\xf3\x86\xbd\x39\xc8\x91\xf7\xb1\x2d\xd3\xc4\x60\xfb\x77\x32\x8d\x31\x47\xf7\xf5\x3e\x68\x0d\x57\x87\xa7\x61\x54\xa4\x02\xe5\x33\xbe\x00\x0e\x31\xaa\x95\xdc\x08\x69\xd4\x9c\x2e\x22\x52\xa9\xf4\xd6\x78\xd6\x72\xce\xd8\x57\xe1\x85\x89\x8d\x61\x62\xe3\x2f\x82\xa7\x10\xe3\xc8\xeb\x5a\xb0\x43\x6f\x7b\x90\x48\xab\xeb\x93\x12\x41\xb8\x66\xd0\xff\x5d\xa4\xc5\xb5\x3f\xf4\xd4\xa3\x59\x66\xc0\x3a\x51\x79\x07\x3c\x1b\xec\xcf\xb8\x41\xdb\x31\x3b\xf8\xdb\x16\xdb\x6c\x05\x2d\xaf\x33\xc3\x70\xca\x33\xa7\x44\x9b\x58\x30\x71\x79\x2a\xdb\xaf\x9f\xf7\x1e\x16\x38\xff\xcd\x5a\x9c\x88\x3e\x6f\xac\x3f\xb1\x93\x41\x8d\xac\x57\x82\x0d\xcd\x85\xf1\x9b\x8b\x57\xca\x2c\x63\x25\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\x87\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\xa3\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x31\x57\xfd\x6f\x4e\x8d\x7b\x21\x96\xb8\x75\x57\x0d\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\xfb\xcc\xb0\x68\x0d\x90\xf2\x33\x5a\xe1\x25\xb4\x6c\xbc\xf5\x81\x4d\x63\xb6\x03\xf4\xcc\xcd\x8f\xc3\x46\x41\x66\xa4\xf5\xe1\xa4\xf6\xfd\xb6\xd2\x5b\x54\x92\x71\xd7\x2c\x74\xb4\x3a\x6b\xfb\x5b\xae\x8c\xdb\xcc\x7b\xb7\x71\xae\xe1\xa3\xf7\xf0\xc7\xea\xe3\x91\x05\xd9\xd3\x78\xa7\x2e\xab\xfd\x41\xa0\xbc\x8e\xad\x8f\x0b\x17\x78\xaa\x83\x2b\x68\x9c\x3f\x4e\x7f\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x67\x06\xff\xd4\x49\x21\x63\x20\x8a\x20\x54\x35\x47\xda\xe0\xc4\x5b\x5f\xef\xaf\xa0\xa8\xa9\x35\xed\xbb\x94\x14\x86\x4c\x5f\xdc\xde\xe0\xfc\x62\x47\x7f\x0b\xf8\x6d\x69\x99\x75\x3d\xe7\x65\x3a\x2e\x68\xa9\x97\xa8\xec\x1c\xb5\xe6\xe6\xa3\xea\xa3\x06\xe9\xe9\xd7\x14\x56\x06\xb9\xd9\x5a\xc7\x0d\x5b\xe5\x8c\xf7\xd6\x87\x63\xeb\x99\x1d\x63\x3d\xe1\x51\xf9\x1b\xd7\xd3\x2c\x62\xe9\x14\x83\xcf\xb8\x9e\xa7\x47\x1c\x90\x36\xae\x3c\x2e\x0f\x64\x90\xb3\x6a\x7b\x3d\x22\xa3\x02\xd2\x8f\x55\x20\xcb\x66\x70\xac\xe7\xa6\x41\xf7\x64\x7a\x1a\x11\x3e\x35\x44\x5a\x8a\x31\x58\xf7\x23\x26\x52\x1b\x33\x2d\xef\x3e\xb1\x0e\xf6\xa8\x2d\x82\x0b\xd9\x98\x4f\x63\x90\xfa\xa6\x93\x33\x21\x43\x94\x49\xae\x01\x9e\xc0\x5e\xcf\x31\xf6\x61\x8b\xe5\xea\x3e\x26\xe1\x24\xa9\xb9\x87\xa6\x9a\xa9\x81\xc1\x1c\x03\xc3\x45\x6a\x80\x14\x48\x22\x28\xa0\x54\x95\x24\x8c\x79\x15\xb0\xbd\xa4\x31\xac\x7b\x0b\x37\xda\x0d\xcb\xa9\x4e\xe6\x4c\x11\x25\x21\xab\xba\xd2\x34\xcb\x58\xea\xcd\x9a\x78\xa0\x12\xf8\x3a\x6b\xf2\x8c\x18\xb1\xc1\x18\xc6\x6c\x50\x43\x05\x67\x75\xe0\x45\x46\xad\xf2\x71\x5a\x89\x04\x7d\x86\xb9\x5e\x7a\xab\xd6\x2a\xb3\x0e\x7a\x1b\x05\x7a\xd6\x18\x86\x72\x8a\x76\xab\x86\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xd6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x0a\xce\x1a\x89\x3a\x46\xc8\x8d\x35\x59\x26\x71\xda\x74\x0a\xe2\xa2\x3f\x83\xd8\x5c\xdb\x59\x63\xcb\xd6\x18\xc7\x73\xcf\x30\x2a\xe6\xcb\x81\xab\x18\xae\x85\x58\x2f\x28\x5a\x69\x99\x53\xcd\x13\x50\xcf\xf2\x69\xc3\xc8\x9b\xfb\xa2\x7c\xde\xc9\x09\x89\x2a\x10\x75\xbb\xeb\xd1\xd7\x6a\x33\xb3\xf9\xa4\x6d\x6b\xec\x94\x3d\x8d\xf6\xa6\xb8\xa5\x36\x58\x8d\xe8\xb9\x7f\x74\x79\x53\x88\x9e\x97\x8c\x11\x9e\x1b\x31\x89\x0a\x4d\x52\x3e\xf5\xf9\x72\x9c\xcd\x7e\xd7\xd9\xc5\x49\xa2\x7f\x03\x7f\x90\x46\x7f\xa8\xea\xce\x32\xf9\xa8\x88\x7e\x94\x5e\xed\x56\xdb\x72\x6d\xbe\x94\x51\x7b\xd8\x28\x0a\x6a\xfb\x37\x68\xdb\x9c\x74\x03\xd3\x8e\xcc\xad\x7d\x64\x59\x66\xfe\xbf\x0b\xdf\x46\x44\x7a\x6d\x5c\x27\x9f\x09\x4c\xc4\xc1\x95\x53\xb3\xda\x78\xb2\xb3\xb4\x94\x45\x61\xcd\x40\xf9\xf9\x53\xd6\x09\xae\x4d\xe5\x82\x29\x70\xd3\x73\xd1\x6c\xe6\xc8\x66\x4c\xb0\x92\x6a\x30\x84\xdb\x0c\xda\x40\x1c\x57\xa7\x13\xae\xb6\xc4\xd6\x4b\x4e\xeb\x00\x03\x74\x5b\xd8\x7c\xec\xee\x1d\xfb\x6b\xd4\x5c\xb9\x40\x08\x70\x37\x36\xea\x48\xcf\xbe\x64\x9a\x9e\x93\x6f\x15\x1e\x94\xa7\x17\x3e\x4a\x30\x48\x3a\xb7\x59\x8e\x50\x40\x8f\x1a\xfe\x22\x2b\xe6\x8d\xf1\x9b\x52\xae\x0f\xb5\x6e\xef\x54\x6b\x66\x97\xa5\x54\xea\xbd\xfb\xe4\x20\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\xdd\x6d\x90\x80\x8f\xbd\x1e\xc0\x77\xc7\xbc\x93\xef\x9b\x0c\x61\x1b\x51\xef\x6d\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\x6e\x55\x7a\x52\xc0\xe9\x8f\x74\x39\x11\x4c\xdb\x3c\x74\x4e\xb7\xff\xc1\x8d\xfe\xd7\xd2\x70\x7e\x56\x40\x6b\xdc\x22\x77\x81\x5d\x12\xc1\xc6\x28\x5a\x22\x29\xae\xbd\x6f\xe0\xf9\xa9\xb2\x1e\x1d\xe6\x77\x08\xb6\x27\xad\x92\x2c\x13\x72\x67\xbd\x05\x57\x06\x5f\x4f\x15\x96\x32\x4d\x79\x58\x1e\xca\x66\x73\x94\xf2\xe3\x16\x1a\x7d\x04\x4a\x48\xfa\x81\xac\x0f\xdd\x3c\x86\xaa\xa5\x0e\x81\x6e\x78\xc4\x37\xa3\x4a\xea\x17\x9e\x6e\xa9\xbc\x99\x92\x0f\x2c\x91\x0b\x56\xe2\x7e\x5f\x7f\x2a\xa8\x30\x62\xfa\x5b\xca\x33\xb3\xdb\x6e\xd7\x6b\xeb\x05\x14\x41\x6e\xbb\x25\x34\x8c\x60\xfe\x1a\xd9\xa3\x35\x90\x13\xc3\x0c\xfa\x9c\x77\xa6\x67\xeb\xa7\x5b\x94\x6c\xc1\x65\xa5\x5c\x3c\x4d\xa5\x91\x8e\x29\x6d\x65\xd3\x39\x9f\xcd\xdd\xcb\xce\xcf\x1c\x3c\x80\xca\xd4\x5f\x95\x88\x39\x28\x4d\x75\xa5\xda\x89\x72\x12\x70\x27\x78\x16\x1b\xb0\x3f\xef\xc3\x32\x7c\xfd\x98\x2b\x8c\x3f\x3a\x26\x1a\xff\x1a\x23\x9e\xb0\x93\x7b\x7b\x0b\x5c\x98\x56\x1d\x66\x96\xc8\xbc\xa8\x34\x6b\xdc\x16\x0b\xad\xb1\x68\x2b\xf2\x20\x5b\x79\x2f\x5f\xe5\x54\xd0\x19\x1b\xfb\x49\x8c\xeb\x08\xad\x57\x3d\xb0\x56\xe4\x91\x92\x27\x24\x5e\x6c\xb6\x17\x1c\x59\xb5\xb2\xd8\xf8\xc8\x73\xf2\xc4\xe8\x73\xf2\x94\x08\x74\xb2\xcf\x28\x74\xe2\x53\x59\x1c\xf3\x3a\x7e\xb0\x63\xae\x5e\x48\x4b\xac\x76\x5d\xc8\x7e\x22\x81\x25\x5a\x76\x54\xae\x88\xcc\xb9\xd6\xcc\x39\x32\xfb\x0b\x36\x22\x5c\xb7\x32\x2d\x58\xc4\x01\x4a\x73\xf4\x46\x66\x9f\x7c\x59\xed\x9a\x31\x8b\x9c\x0c\x08\x3f\x8f\x5c\x21\xe3\x25\x08\xcf\x0b\x2c\xcc\x02\x08\x60\x6c\xe3\x24\x9d\x6a\xd8\xcf\x3b\x01\x5f\x42\xc2\x3e\x81\x22\x1f\xa7\x36\x60\xa6\x01\x33\xad\xb4\x5f\x02\x66\xc2\x2c\x16\x31\x49\x56\x5a\x18\xc9\x7d\x6e\x73\x5c\xd2\x7b\x96\x91\x9f\x2a\x56\x2e\x89\x61\x5b\xeb\x48\x2f\xa8\x06\xae\x78\x8a\x31\x4d\xce\x6a\x76\x60\x2d\x59\x3f\xa6\x09\x2c\x6d\xd7\x9f\x0c\x77\x0f\x39\xdb\x9e\x80\xaf\x57\xbb\x6a\x67\x02\xc5\xdd\xf2\x3b\xd8\xe4\xc9\xd1\xe9\xb4\xf9\x04\xd8\xee\x8b\xf7\x57\xfd\x04\xaa\x38\x67\x43\xd2\xc7\xe1\x70\x6d\xf1\xd1\xc4\x8a\x90\x8b\x1d\x7b\x82\x7b\xe7\x7f\x01\x2a\xe1\xdd\x45\xbd\xce\x9e\x3c\xb0\xe5\xc8\xba\x83\x13\x73\xfa\xd4\xbd\x1c\x3d\x19\x8c\x0b\xa9\xab\x16\x9a\x4e\x43\xb3\x6f\xb7\x5b\x6f\x24\xdc\x4f\xd1\x8b\x2d\xbc\x5c\x64\xfb\x2b\xb7\x69\xb1\xb8\xbe\x37\x95\x88\x2a\x2b\xd9\x6c\xdb\x4a\x4c\x22\x0c\x41\x3d\x38\x97\x1b\xc1\x83\x0d\x64\x9d\x00\x84\x14\x7b\x88\xa4\xbf\x42\x0d\x9b\xdb\xd8\x27\x2f\xb5\xc7\xc5\x6a\x8e\xdf\x8e\xe5\x7f\x60\xcb\x53\x65\x93\xde\x49\xa1\xe6\xbc\xc0\x12\xa8\x8a\x01\x8e\xea\x07\xf0\xd8\xbe\x03\xd7\x76\x37\x2c\x62\xb0\x1b\x31\x22\xef\xa5\x36\xff\xbb\x86\xd0\x24\xb8\x56\x57\x92\xa9\xf7\x52\xc3\x93\xa3\x9f\x0b\x2e\xf1\xb9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x6e\x04\x91\xa5\xdd\xca\x5e\x03\x6b\x57\x44\x59\xd9\x61\x9d\xf5\xa1\x36\xea\x6f\x1a\xd7\x9e\x9a\x2c\x5b\x87\xb6\xe7\x29\xd8\xe1\x41\x17\x89\xbf\x80\x76\x15\xbc\x4b\x5c\x48\x0d\x96\xed\xa5\x9a\xcd\xa2\x5c\x5d\xea\x96\xb3\x72\x06\x59\x1e\x93\x88\x82\x8f\x8d\xc9\xf7\x24\xac\xd8\x7a\x91\xd7\xe6\xc0\x3d\x81\x7d\x4f\x3e\xfe\x7b\xee\x0a\xf8\xa4\xaf\x21\x94\xeb\x98\xd2\x71\x63\x58\xe4\x2e\x72\x5a\x98\xdb\xf7\x5f\x86\x89\x00\xc0\xfc\x6f\xa8\x99\xae\x26\xe4\x82\x28\x2e\x66\x19\x6b\xfd\x66\xd5\xfc\x8d\x6e\xa2\x27\x00\xd6\x37\x43\xe3\x17\x34\x63\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x9d\x3c\xb0\xe5\xc9\x28\x52\x91\x4a\x9a\x34\xc1\x74\x72\x23\x4e\xea\x94\xb4\xad\x7b\xe9\xf9\x2c\xf0\x37\x38\x81\xdf\x4e\xf6\xcd\xa3\x3e\x93\x90\xfa\x6c\x6e\xa2\x56\xa9\x7c\x99\x51\x34\xac\x1c\xc3\x7c\xb1\x3a\xe6\xa6\xa2\x84\x77\x8d\x77\x6a\x93\x96\x8d\x5e\x7e\x46\x4d\x3b\x64\x84\x89\x0e\xb3\x8a\x3a\xd8\xd5\x32\x40\x47\x3d\x9b\xad\x83\x37\x82\xad\x7d\x4e\x71\x73\x16\xdf\x6d\xfa\xa0\x11\x6b\xce\x55\xfc\x71\xdd\x4c\x57\x7d\x14\x1a\xe9\x4e\x9a\x51\x3c\xb2\xb4\x51\xeb\x6b\x3e\xc4\x50\x21\xb1\xae\xa4\x14\x5a\x3b\xb5\x6e\xb5\xfb\x43\xc9\x54\x21\xd1\xbf\x76\xe3\x62\x2d\x8b\x30\xa7\x0a\x7c\xb2\xa6\xd6\xdc\x5a\x54\x65\x21\x95\x2d\x6f\xb7\x0a\xf2\x91\x91\x4b\x36\x9c\xcc\x05\x99\x62\x18\xb8\xbf\x09\xe6\xfe\xf8\xbc\xd4\x17\x2b\x39\x09\xd1\x20\xd6\xc8\xd2\x26\xe4\xe6\x65\x44\xcc\xc8\x39\x7c\xa2\x1c\xe3\x33\x63\xe1\x64\x30\x36\xff\x14\x5d\x4d\x1a\xe6\x3f\xc3\xed\xeb\xa6\xf7\x95\x96\xed\x99\x42\xca\x00\x4c\x1e\x17\x91\x6c\x9c\x20\xbc\x54\xa2\x76\x63\x71\xd4\x63\xb3\x4b\x20\xe4\xa6\xbb\x97\x95\xb0\xa0\xe5\xb2\xda\xed\x6b\x53\xcc\x2a\x5d\x96\x05\x3f\x01\x0b\x9a\x8d\x00\x37\x3e\x35\x6b\xb5\x99\x11\xe2\xd6\xda\xf2\x0f\x02\xeb\x7c\x69\x8b\xf0\x2d\x37\xdf\x5f\x92\x4a\x86\xe7\x01\xe3\x8d\xf0\x14\x36\x6f\x8f\x5d\x46\x0c\x3a\x47\x0f\x57\x4a\x6e\x19\xde\x12\xa5\xa9\x66\x23\xac\xf1\x3a\xcd\x1a\x75\x80\x18\xc9\x65\xca\xa7\xd6\xcf\xee\xae\x61\x43\x1d\x61\xba\x0c\x9b\xeb\xa2\x99\x06\x3c\x62\x22\xf1\x9b\xf9\xa4\xbc\x83\xe3\x1a\xbf\x8c\x81\x2c\xb0\x28\xb5\x78\x90\x53\xe2\x66\xec\xba\xdd\xcf\x81\x9c\xc9\xe9\xb4\x51\xf2\x2a\xa0\x0a\x9e\x6b\xbd\x29\x55\x58\x65\x31\xd7\x9e\x4a\x9a\xa0\xcc\x82\x4b\xbd\xd7\x4a\x22\x5b\xc7\x7d\x3c\x99\x5f\xf8\x0e\x90\xa6\x9c\x92\xb7\x75\x2d\x5c\xae\xc0\x70\xc3\x5d\x62\x3e\x73\x9d\xb8\x48\xb2\xca\x3a\x10\x20\xf6\x33\x58\xe8\x08\x7b\xfe\x04\x76\xa0\xee\xc0\xf1\x5d\x2e\x7a\x64\x2d\x91\xcb\x2a\x86\x80\x90\x05\x0f\xae\x91\xbb\x1a\xb8\xd6\x69\x47\x72\x88\xd6\x5a\xa6\x49\x5b\x8f\xf4\x96\xdf\x97\x8c\x5c\xce\xa9\x10\x2c\x6b\xe4\xc9\xb6\xc6\x3c\xaa\x35\x4d\xe6\x88\x2b\x29\x31\x37\x3d\x63\x86\x52\xcd\xa5\xd2\x24\xa7\xc9\x9c\x0b\x9f\x44\x55\xf8\xac\xec\x75\x56\x9b\xa3\xa7\x10\x3b\x78\xf5\x6a\x0b\x01\xcd\x92\xcf\xad\xa2\xd6\x01\x3d\xf9\x64\xc8\x6b\xbd\xd4\xf5\x22\xed\x3d\x84\x7d\x46\x69\x0f\xe8\x04\xbc\x1b\x32\xc6\xf6\xd2\xda\xe4\x26\xf7\x06\x5a\x2e\x1a\xa4\x90\xd9\x0f\x0c\xa1\x6d\x30\x07\x7b\xad\x64\x9d\x55\x01\xb5\x9d\xda\x59\xdc\xb3\x4a\x98\x4d\xaf\xab\xf5\xbc\xbd\x24\x9a\x96\x33\xa6\x4d\x6f\x44\x54\xf9\x3d\x2b\xbb\xd3\xb9\x1f\xae\xc0\xdc\x51\xea\xc1\xb6\x76\xa0\xa3\x8c\x2b\xf9\xe0\xbe\x82\xb0\x17\xe0\x4f\xa6\x32\x8c\x33\x40\x5f\x45\x57\x84\x16\x4b\x10\x1a\x5c\xfd\x9d\x25\x25\x95\x08\xe1\x17\x62\xea\xc4\xe2\x59\xfe\xed\x6f\xef\x63\x8b\xf4\x9d\xd6\x5f\x6e\x03\x90\x47\x59\x66\xe9\x23\x4f\xad\x5b\x2a\x39\x33\x2f\x9f\x87\x02\xcb\x9e\x6b\xf6\xf5\x4f\x29\x1c\xab\xa3\x7b\x7c\xe4\xe9\x41\xea\xed\x42\xc7\xed\x9d\x76\x22\xa4\xd9\x69\x02\x5b\xcd\x53\x26\xb4\x41\x1d\xa5\x22\x67\xf0\x45\x48\xce\x8b\x6b\x8e\x99\x09\x61\x04\xa8\x0a\x94\xdf\x73\x51\x27\xd7\xac\xcf\xda\x90\x1b\x73\xf3\x9d\xd6\x59\x31\x8d\xf9\xcd\x20\xb3\x81\xd4\x73\xa2\x78\x5e\x65\x9a\x0a\x26\x2b\x15\x5e\x8a\xff\xb3\x3c\xee\x69\xc6\x3e\xe1\xdd\xdc\x67\x02\xe9\xba\xd7\x36\xb7\x00\x71\x55\x75\x56\xde\x55\x76\xa1\xa3\xd7\x3a\x5c\x35\x7d\xe5\x19\x0b\x9f\x5d\x90\x7d\x62\x89\xcd\x2b\x52\x64\xd5\x8c\x77\xe6\xd2\xba\x32\x33\x4b\x8c\x0c\xff\x86\xbc\xad\x27\x0c\x51\xcc\xee\x17\x2c\xd5\x0c\xfe\x0b\x76\x20\x72\x79\x77\x73\x65\xd3\xc0\x0a\xa5\x19\xdd\x17\x8f\x12\x6a\xf2\x1d\x5b\xb5\xcc\x9e\x18\x1e\xec\x2c\xf2\xb2\xd7\x79\x70\x57\xb5\x88\xf6\x17\x5b\xf3\xc1\xd7\x0f\x08\x4d\x7c\x1a\x01\xf4\x03\xa7\x86\x6d\x07\xa7\xd6\x2c\x21\xd0\x98\x40\xca\x0a\x26\x52\x28\x4a\xd8\x80\x7b\xdc\xa5\xbd\x1e\x91\x2d\xa0\x17\x4b\x97\x5d\xdd\xbd\x16\x51\x6e\xc8\xeb\x73\x99\xa5\x8a\xb0\x4f\xba\xa4\x06\xcd\xe7\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x40\xf5\xd3\x97\x54\x28\x9d\x3c\x0b\x17\x98\xfe\x92\xb8\x40\xc5\x92\x92\xe9\xa0\x00\xeb\x1e\xe5\x53\x5c\xe7\xed\x0d\x6c\x3d\x5e\x13\xe5\xf1\x57\x17\x26\x54\xd7\x48\x0e\x1a\x4f\x28\x0e\xc5\x08\x57\x2a\x2f\x17\x54\x29\x2f\x1d\x03\x91\xb3\xd7\x56\xb5\x32\x6e\x04\x0c\x81\x7a\x60\x3e\x25\x42\xae\xcc\xb4\x19\x10\xe5\x5d\x01\x5a\xaf\x04\x74\xef\x2d\x87\x39\x16\x64\xa0\x02\x52\x0b\x60\x37\x23\x88\xb7\xc6\x7f\xa3\xf1\xd0\xac\xab\x21\xf7\xc3\xca\x42\xf6\xc9\xae\x7d\xbf\x97\x3d\xce\xa5\x29\x3c\x0a\xb0\x9f\x1e\xee\x7d\x83\xb8\xba\xc0\xb2\x50\x15\x50\x3b\x57\x2e\x83\x0a\xa6\x7c\xc1\x20\x13\xaf\x4b\x4c\x6b\x18\xdf\xb4\x42\xa5\xa6\x4b\x8f\xd1\x4e\x7a\x11\x1e\xe4\xde\xb0\x3d\xd4\xde\x1c\x37\x42\x69\x0a\xf9\x11\x60\x15\x86\xaa\x1a\x02\x68\x73\x1e\x5b\x40\x44\x9b\x89\xcb\xb2\x10\x3c\x5c\x6e\x88\x66\xc2\x4a\x03\x6b\xd9\x92\x3c\x96\x32\xdc\xb9\x34\x52\x13\x2d\x17\xac\x5c\x70\xf6\xf8\xca\x46\x05\x8e\xcd\x02\xc6\x36\xb0\xfe\x15\x88\x87\xaf\x7e\x0d\xff\x0b\x1a\x3f\x5a\x0f\x69\xb1\xf5\x1b\x72\xd2\x5d\x9a\xb0\xaf\x99\x7a\x0a\x89\xb4\xf7\x5a\xfd\xcd\x76\xb9\xa2\x34\xb4\x0f\xad\x18\x10\xa2\x24\xb4\xf8\xad\xc1\xba\x98\x0b\xe1\x3a\xb2\x56\x1e\xa2\xcc\x19\xd5\xe1\xa2\x95\x10\x01\xde\xc6\x6d\x39\x00\x3b\x6c\x09\x01\xde\xbc\xc5\xc5\x58\x97\x8c\xf9\x45\x69\xcb\x26\x0a\xe9\x4a\x58\x04\x16\x26\x3d\x80\xe2\x32\xa5\x9a\x2a\xa6\xc3\xd4\xd4\xf1\xa8\xa8\xd1\xbd\x59\x71\x13\x2b\xd9\x9f\xc0\xe2\xca\x20\xaf\x8f\xcb\x06\x4d\xc6\x7f\xb6\xc2\x81\x68\xbd\x69\xc4\x02\xbb\xd3\x21\x58\x7e\xee\xca\x78\x39\x5f\x72\x1c\xa5\x3e\xa0\x7d\xf2\xac\x76\x8e\xdf\x7e\x7b\x73\x15\x2b\x14\xd5\x5f\x3a\xd9\x01\xfe\xdd\xde\x26\x0b\xc8\x60\x13\xe5\x3f\x55\x4d\x75\x07\xd4\x33\xf1\x20\x68\xdf\xdf\xd7\xda\x66\x09\xab\x8d\x0b\x57\x5c\x3d\xec\xf3\x96\xaf\x75\xde\xbe\xef\x7f\xbd\xbc\x26\xf6\xe9\x2e\xfb\x40\xc7\x20\xfb\xb6\x1e\xb4\x6f\xfe\x5f\x2f\xaf\x57\x96\xb0\xa2\x08\xb8\xc8\x32\x27\x9f\x19\x41\xc3\xa5\x8d\xb0\x38\x21\x7a\x83\x00\x77\x18\xde\xa7\x64\x58\x6b\xb1\x31\xf3\x74\x92\x28\xee\x53\xcb\xce\x1e\xd8\x84\xcb\x86\x43\xc6\x81\x6b\x61\xce\x12\x56\x9b\xd1\x53\xae\x1e\x8e\xad\xdf\x28\xd2\xf7\x5d\x09\x48\x5e\x96\x41\x67\x55\xb8\x77\x65\x92\x1a\xf5\xd2\x96\xb2\x22\x8f\xb6\x32\x44\xb0\xfa\xe0\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x3e\xed\xab\x83\x19\x7e\x7d\x8f\xca\x04\x28\x34\xa2\xde\x1c\xcd\xf8\x73\x64\x70\x25\x71\xd4\xa0\xa0\xa5\x06\xc9\xff\x10\x00\xe4\x3b\x77\xe4\xa2\xf1\x40\xec\x07\x82\x6e\xa6\x2e\x12\xb3\xed\x7a\xc3\x95\xef\xa6\xf6\x61\x01\x5a\x1d\x07\x25\x6f\x7d\x59\x2f\xf2\x2a\x65\x8b\x57\x2a\xa5\x5f\x8c\x60\xaa\x2e\xf7\x40\x7b\x5d\x54\x91\x93\x2f\x4e\x42\xc6\xb8\xe3\x39\xcf\x68\x99\x61\x66\x3f\x9f\xf0\xd0\xf7\x64\xf0\xaf\x1b\x12\xdc\x58\x5f\x9f\x90\x33\x59\xc2\xd8\x09\x15\x24\x63\x2e\x0b\xa0\xc5\x15\x4b\x14\x35\x82\xfc\x33\x9e\x09\x24\x0f\x61\x5d\x44\x64\x7a\x10\xf0\x4d\x1d\x37\x68\x39\x99\x56\x81\xa7\xab\x9a\xd8\x73\x61\xa8\xeb\x84\x7c\x6b\xa9\xb3\xe5\x78\x10\x36\x52\x20\xb5\xf8\xc6\xcb\x3d\x99\x97\xa3\xc2\x5b\x51\xc6\xed\x49\xd5\x46\xd6\x6d\xc2\x2f\xf8\x34\xba\x55\x82\x33\xae\x3f\xb0\x42\xee\x95\xc7\xc5\x2e\x57\x0c\x5a\x5c\x9b\x07\x52\x71\xa8\x60\x4e\x35\xa1\x88\xa3\x92\x2a\xa3\x46\xea\x45\x83\x55\x14\x23\x6a\xc7\x59\x61\x3f\x3f\x36\x6b\xc9\x35\x22\xea\xad\x22\xc5\xcf\x64\x64\xb1\x7a\xa7\xc6\xd4\x57\x49\x86\x02\x2a\x54\x90\x1b\xc1\xf5\xa5\xef\x16\x03\x2d\x33\x29\xac\x5f\x9c\xe9\xdb\xda\xc0\x66\x5c\xdb\xf4\xf0\x38\x94\xf9\xd9\xf5\xd6\x31\x68\x5d\xac\x05\xaa\xbb\xfb\x55\x1c\xdd\x86\x56\x1f\xda\xbe\xe4\x6f\x57\x30\xfd\x20\xd2\xb7\xaf\x91\xef\x12\xa0\xa1\x7f\x42\xfd\x3c\x94\x74\xbf\x73\x75\xa8\x5c\x25\x25\x59\x62\x9d\x5c\x84\xa3\xd3\xc9\xe4\x74\x02\x6c\xc3\xe9\xe4\xd4\xb1\x96\x99\x77\x0a\xb7\x54\xb8\x1e\x36\xae\xdc\x60\xfb\xb6\x4c\x08\xf9\xc6\xe5\x69\x80\xe4\xd3\x2b\x1e\xe8\xde\xb9\xbc\xae\xa1\x8d\x69\xfb\xda\x77\x2e\x48\x53\x0c\x3a\xec\xea\xbe\x39\x71\xeb\xb2\x3e\xe3\x0b\x9b\x97\x76\xaf\xa6\xaf\x7a\x82\x91\xf0\xd0\x5c\x99\x55\x22\x7c\xf8\x7a\xbf\x33\x43\x24\x12\x3d\x2f\x8b\x7b\xec\xac\x12\x99\xe7\x58\x16\x6d\xee\x65\xe1\xda\x21\x3c\x14\xf1\x85\xab\x2f\xb0\x44\xdc\xb4\xe3\x1e\x46\xa2\x74\xd7\xe9\x8a\xba\xc2\x3f\xb6\x79\x52\x44\x2d\x54\x01\x5a\x54\x73\x5a\x32\x85\xa5\xdc\x6d\xe1\xea\xee\x7a\xa7\x2b\x58\xde\x8f\xb1\x5b\xd5\x58\x4f\xb1\xb7\xb2\x71\x23\x99\xb6\x15\x25\x95\x4b\x6e\x67\x49\xf2\x2b\x3f\xde\xab\x0f\xd7\x17\x57\xef\xae\x27\xf9\x6e\xed\xda\x01\x50\x33\x13\x69\x21\x79\x77\x86\xb2\x31\x29\xa8\xde\x9d\x3f\x3c\x1c\x7d\xfb\x41\x0f\x81\xbe\x7d\xe7\xee\xf2\xb8\x07\x8d\x3a\x9c\x36\x7f\x5f\x03\x30\xb4\x2c\x64\x26\x67\x41\x89\xaa\x9f\x76\xc2\xbf\xc6\x58\x96\x31\x1d\x87\x54\xfe\x8c\x12\x9f\xf5\xfc\x30\x92\xb3\x9e\xbb\xbd\xac\x37\xcc\xcb\x88\x3a\x28\xb2\xf7\x85\xee\xd9\xb3\x49\x11\x6b\x1b\x89\x7a\x1d\xc0\x81\xae\x48\x69\x5d\x6f\xb3\x60\x65\xce\x31\x36\xf5\x98\xe2\xc5\x81\x4f\xa8\x5b\xb2\x30\x54\xe0\xb6\x13\xac\xe3\x8e\xc6\xf5\xd9\x26\x43\x45\xc9\xc6\xbe\x20\xd8\x94\x67\x10\x7c\x57\x73\x30\x0d\xaa\xd4\xd1\xbd\xd3\x94\x3b\xa5\x3b\xf6\x91\x2d\x57\x35\xe6\x35\x37\xee\x6d\x14\x98\x08\xbd\xbb\x80\xac\xaf\xfe\x6b\x35\x93\x74\x86\x05\xbd\x4a\x9b\x87\xb8\x28\xf9\x82\x67\x6c\x06\xa5\xd0\xb9\x98\xa9\x3a\xa7\xa4\x35\x1a\x77\x0c\x00\xf1\x8f\xac\xa6\xc3\xde\x2c\xf8\x0e\x4c\xc0\x3e\x4d\x16\x02\xf5\xfb\x6f\x3e\x12\xc1\x70\xb0\x4e\xf0\x7c\xa2\x10\x6b\xa6\xd3\x49\x88\x0e\xa1\x25\xdf\x1f\xf1\x3b\x28\x9a\x76\xe6\xaf\x4d\x80\x1b\xa8\xc2\x44\x1d\x22\xa2\x7c\x4a\xd4\x32\xcf\xb8\x78\x18\xf9\x02\x73\x53\x69\x53\xeb\x32\x62\x7e\x70\xe0\x5c\x32\x9a\x3d\x85\x18\xec\x1d\x08\x48\x1c\x21\xd0\x07\xb2\x5b\x00\x23\x69\xee\xea\xbf\x3a\xb4\x83\xba\xa2\x48\x2c\x1e\xe0\x87\xf0\xe2\xb6\x95\xe7\x74\xb6\x57\x47\x67\xe8\xb0\x85\xb6\x05\xf9\xe6\xf2\xc6\xd7\x89\x6c\x2a\x6a\xf0\x5d\x59\x12\x5a\x6a\x3e\xa5\x89\x3e\x27\x45\x05\xd5\x7c\xa0\x36\x89\x25\xb3\xf6\x76\x6c\xf1\x82\xe8\x98\xce\xc7\x5a\x6c\x06\x97\x34\x25\xb3\x85\xe9\x5f\x43\x51\x70\x90\xf3\xab\xc2\x3a\x51\x60\x00\xb0\x2d\x0e\x75\x5b\x65\xd9\xad\xcc\x78\xb2\xf4\x85\x2d\x50\xdd\x94\x1a\x54\xd4\x89\x8b\x2e\xb2\x47\xba\x54\x6f\x9a\x33\x27\x14\x9e\x11\xaa\x35\xcb\x0b\x04\x19\xb3\xdc\xd5\x04\xd7\xb5\xc6\x09\x0b\x2e\xbb\xc2\xfa\x53\xca\x33\x7f\xf7\x2b\xfb\xa0\x13\x97\x8f\xc9\x7b\xb6\x60\x65\x7b\x26\xc2\x3c\x82\x4e\x54\x7b\x74\xd8\x78\xe0\x66\x2a\x05\xf2\x1c\xd6\xd2\x58\x3b\xa8\x8e\x59\xf2\xe9\x4a\xb7\x58\x87\xc6\xc2\x44\xf7\x94\x6f\xa6\xef\xa5\xbe\xc5\xb7\xdb\x33\xc7\x39\x6f\xe9\x9f\x66\x86\x1b\x5b\xba\x71\xcc\x61\xa6\x5c\x3d\x3c\x69\xb2\x5e\xfe\x6c\x6e\x79\x38\xd0\x41\xe5\xe5\x12\x13\x58\x02\xe4\xd9\xd1\x0c\xf4\xc1\x6f\xa9\x59\x96\x85\xf8\x92\xd9\x10\xfa\x91\x05\xc2\x66\xc8\x3c\x7b\x84\x8a\xfc\xba\xae\x10\x6d\x55\x4d\x89\xcc\x19\xa1\x0b\xca\x33\x7a\x9f\x81\x67\x89\xe9\xdc\xf6\x15\xa0\x71\xb8\x80\x55\x81\x45\x55\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x36\xd4\xbc\x36\x38\x81\x4c\x26\x0f\x4d\x7e\x03\x2a\x9a\xc1\x2b\x18\x87\x90\x82\x0f\x26\x4d\x53\xa2\xf8\x4c\x40\x49\x6c\xa1\x49\x46\x35\x13\xc9\x72\x42\x6c\x0a\x6f\xd5\xa8\x18\xae\x4b\xee\xe3\x18\x04\xd4\xeb\xaf\xab\xa4\x26\x0f\x72\x3a\x5d\xa9\x30\x6e\x4d\xbd\x16\x51\xe0\xea\xa9\x92\x02\x07\x67\x4a\xd1\x59\x10\xa2\x58\x2d\x19\x84\x3b\x6f\x93\x4e\x38\x74\xe4\x32\x4a\x38\x57\xad\xd2\x85\x02\xd7\xa1\xbe\x1e\xda\xca\x4a\x68\x9e\xb3\x95\x6c\xab\x04\xf4\xd5\x6b\x2e\x1b\x66\x28\x9b\x8e\x16\x02\x71\x6c\x60\xaf\x2b\xc5\xc3\x53\x3b\xbf\x35\xdb\xf6\x2a\x42\x05\xff\xc6\x90\xf5\x36\xf0\x32\xc0\xa2\x5b\x22\x14\xf5\xb6\x69\x7e\x6a\x2e\xe5\x0c\xe2\x8a\xeb\x83\xfe\xfe\xb7\x3f\x4c\x16\x4d\x9b\x0a\x7c\x6e\xc8\xe7\xb9\x99\x59\xce\xca\x99\xab\x35\x93\x53\xc1\xa7\x4c\x99\x53\x5f\x1a\x10\xb1\x7a\x4b\x28\x46\xf5\x68\x80\x03\xbd\x47\x56\x16\xd2\x89\xdb\x3e\xae\xe8\x44\x1b\xa7\x54\x8b\x65\x67\xa5\x3c\x87\xfd\x85\x74\x5e\x9f\x58\x52\x69\xb8\x27\xe0\x35\x40\xce\x84\x34\xcf\x3a\x6d\xa0\x77\xd5\x3d\x32\x5c\x30\xc0\xca\x74\x5d\xe5\x35\xdd\x38\x9b\xce\xdd\x52\xd5\x7d\x81\x7b\xc5\xa6\x86\x27\xf8\x62\xf2\x4f\xff\x14\xb2\x60\xf4\x5e\x85\xde\x15\x4b\xaa\x92\xeb\xa5\x41\x6f\xec\x93\x9e\x4c\x15\xd4\x31\xb9\x84\x14\x1d\x96\x78\xcd\x29\x28\xc8\xd0\xd5\x15\xaf\x48\x0d\xbc\x06\xa0\x8e\xee\x97\x57\x78\xca\x7a\x08\x5e\xce\x2e\x7b\x6a\x11\x98\x81\xc0\x1a\xcc\xd5\x84\xdc\x4a\xa5\xb8\x39\x7f\x9f\xd7\x29\xc8\x59\xf9\xc5\xd0\x73\xd3\x3e\x3b\x8a\x4e\x40\x6a\x79\xd9\x34\xbd\x7b\x05\x4d\x5e\x1f\xe1\xc1\x8c\xf3\x06\x92\xa3\x6a\xa2\xe9\x6c\xa5\x74\x8a\x2c\x5b\x8b\xae\x73\x70\xef\xd9\xae\x62\xd7\x78\x88\xdb\xf4\xc1\x09\xdf\xe4\x66\x15\x60\xda\xf1\x1d\x36\x2b\x53\xc8\x36\x7e\xc9\xe6\x74\xc1\x36\x12\x81\x42\xa6\x93\x0d\x78\x13\x80\x35\xa4\x6b\xc3\xb4\xfb\x30\x0a\x9f\x21\x48\x29\x96\x43\x62\x92\x2d\x64\x67\x13\x0d\xbd\x5f\x92\x4c\x4a\x48\x34\x51\x15\x44\xc8\x94\x19\x30\x03\x37\x0d\x9a\xa9\x11\xb9\xbb\xb0\x2f\x16\x8d\x21\x31\x69\x1c\x70\x48\x05\x4b\x36\xbc\x70\x00\xb9\xbb\x91\x0f\x1d\x89\x66\x88\x17\x5d\x2b\x0a\x42\xda\xf0\x9d\xba\x24\x8f\x2d\x54\x92\xb1\x05\x03\x43\xe3\x94\xcf\x08\x26\x62\xcf\x6d\x6a\x3e\xe7\x35\x25\x4b\x48\x6f\x5d\xf2\x34\x44\x58\x5e\xa5\xef\xe6\x40\x1e\x65\xf9\x90\x49\x9a\x36\xf2\x12\x29\x92\xf1\x07\x46\xae\x58\x91\xc9\xa5\xcd\xa7\x27\x52\x72\xa7\xa9\x66\xd3\x2a\xbb\x0b\xda\xc8\x50\xf9\x57\x25\x8a\xef\x55\xfe\x35\x1d\xae\xc8\xbf\x37\x77\x97\x77\x37\x2f\xd2\xdf\x37\x42\x9f\x0c\x0b\x7b\x3e\x1b\x18\xff\xa9\xcb\xaa\x3d\x26\x59\xd5\xfd\x0e\xfa\x09\xdc\xca\x52\xd3\x6c\x4f\x0c\x4d\x32\xa7\xc5\x45\xa5\xe7\x57\x5c\x41\x8d\xa2\x58\xbe\x66\xed\xfb\x46\x6e\x21\x06\xca\x62\xcb\x56\x12\xee\x00\xc9\xbe\x77\xf9\xaf\x17\xb7\x84\x56\xe6\xf0\x35\x4f\x80\x08\xee\x4d\xad\xdf\x5c\xd9\x1d\xe6\xdc\xec\xb9\x2e\xfb\x75\xc7\xaa\xdc\x5b\x87\x5e\xd3\x73\x45\x49\x0f\x2e\xd0\x47\x74\x81\x06\x64\xb5\x4f\x2e\x8b\x0b\xae\x39\xd5\xb2\x3c\x94\xef\x68\x6b\x00\xef\x52\x52\x29\x2d\x73\x7b\x41\x6e\xdc\x1b\x10\x6b\x14\x68\x28\x58\xeb\xb6\xf6\x48\x01\xf3\x25\x6c\xd4\x8d\xd0\xac\x9c\xd2\x84\xad\xe4\xf9\x18\x81\xd6\x09\x47\xe7\xee\x9d\x80\x71\xff\x64\x9d\xb1\xa0\x24\x74\xf6\xe7\x37\x7f\x6a\x78\x53\xff\xd9\xf3\x65\x56\xd7\xd5\x64\xc1\x04\x4b\x42\x34\x56\x71\x27\xf7\x53\x2c\xde\xe2\x3f\x89\x15\xaf\x32\xdc\x82\xff\x57\xd1\x0c\xb7\x2e\xec\x00\x62\x26\xd9\x3a\x86\x83\xc0\x57\xfb\xa0\xed\xfa\xfc\xa9\x62\xfc\x1a\xe0\x13\x94\x13\x85\x5d\xb4\x2e\xa9\x50\xe6\x20\x63\x25\xa4\x53\xcb\x23\x9e\x92\x33\x9d\x14\x01\x4e\xe6\x51\x01\xa0\x3e\xf8\xd3\xfe\xa3\xe3\x83\xf8\x2c\x59\x59\x25\x9a\x5c\x1c\x6e\xc6\x47\x04\x87\xaf\x7d\x96\xac\xd0\x55\x1d\xc4\x8f\x1d\x6e\xd7\x41\xdc\x73\x6c\xd7\x1e\x4a\x9a\x8b\x47\xd6\x89\x7c\xcd\x95\xc6\x7c\x1a\xf8\x32\xc4\x53\x63\xc6\x21\xc3\xf1\xde\x1a\xd1\x80\x17\xff\x49\xd3\xb4\x7c\x83\x54\xde\x29\xbe\xcb\x90\x70\x79\x23\x97\x68\x5f\x2d\xd1\x89\x1b\x67\x7a\x59\xd8\xd2\xfc\x1f\x2f\x6f\xa1\x2f\x45\xfe\xf8\xcf\xaf\x81\x05\xfe\xa7\xdf\xff\xf3\xeb\x60\x30\xfb\x2c\x53\x13\x91\xff\x81\x2e\xf5\xc7\x48\x79\xd1\x4a\x5b\x01\xa9\x9e\x0d\x0f\x7a\x87\x19\x1e\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xfb\x71\xaa\x43\xde\x85\x21\xef\x42\xdd\x86\xbc\x0b\x9b\x27\xd6\x90\xd4\x0f\xe2\xf5\xd1\xe8\x1f\x32\xeb\xae\x53\x39\x24\x70\xb7\x9f\x23\x81\xeb\x3c\xd0\x6e\x74\x11\xb7\xa5\xcd\x58\xb7\xb0\xe4\x66\x75\x2e\xb0\xab\xf7\x77\xff\xf9\xf5\xc5\x97\xd7\x5f\xc3\x3a\x6d\xf0\x9c\x01\x6b\x2e\x9e\xa0\xc9\x3a\xc2\x25\x0a\xdd\xeb\xfd\x7a\xe9\x8b\x15\xff\x7c\x41\xde\xbf\xbd\x8b\x74\xcd\xdf\xef\x76\xae\xca\xdf\x62\x1a\xb2\x6f\xc7\xf5\xfe\x33\x2f\x29\x56\xee\x2f\x51\xe0\x41\x9d\x04\x1b\xc5\x5f\x5b\x5a\x1c\x73\xd2\xb8\x8a\x23\xa8\x51\xba\x8e\x91\x7c\x26\x8e\xdc\x66\xd3\x70\x23\x5f\xa4\x0b\xf7\x61\x8e\x24\x94\x67\x2e\xe3\xb3\x5d\x06\xe6\x88\x2b\x1b\x29\x31\x0d\x42\x42\x12\x51\x1a\xe2\x69\xc8\x26\x53\xca\x11\x8c\xcf\x15\xaa\x8b\x4d\xf5\x2b\xf6\x89\xea\x37\x0e\x60\x6b\x57\xb8\xe2\x1b\x0d\x0f\xf9\x96\x4d\xb6\xcb\x9c\xb4\xa5\x36\x49\xc3\x48\x0a\x04\xb0\xa0\x49\x37\x29\xdf\x5b\x71\xa3\xd5\x7a\x25\x90\xe1\xff\xe8\xc4\x04\x46\xdd\x63\xce\x15\xdf\xdf\x21\x2e\x9a\xef\x7c\x35\xfd\x2c\x8d\x39\x62\x42\x95\x77\x9f\xab\xea\x82\x20\xa1\x79\x6a\x9f\x19\x06\xc8\x0b\xa4\x44\x7f\x3b\x98\x02\x65\xdf\xca\x93\x62\x2e\xb5\x14\x87\xcb\x86\xb5\xa9\xff\x36\xe2\xba\x85\x37\x2e\xeb\xda\x44\x35\x0c\x60\x42\x0c\x6f\x27\x5f\x71\x0d\xb7\x36\xf1\x38\xaf\xf0\x66\xdc\xe9\xed\xa6\xb9\xed\x0e\x41\xdd\xb8\x9c\xc3\xa7\xbe\x8b\xc9\x17\x75\x73\xb5\x27\xcc\x35\x24\x95\xc6\xf6\x42\xcb\x7f\x98\x93\x8e\x3c\x1c\xf3\x89\xdb\xf5\x9b\x2b\x2b\x68\xb8\x94\x7b\xca\xde\x07\xb2\xfd\x2a\xee\x8d\x77\x92\xa5\x7e\x94\xe5\x01\x92\xed\xb7\x7b\x5e\x89\x21\xb4\xbf\xad\xa5\xda\xdc\x3b\x5e\x69\x4f\x22\x2a\x77\xde\xea\x0a\xcc\x8e\x76\x0c\xbd\x25\x71\xde\xa7\x74\xe2\xfa\x9a\x24\x32\x6f\x15\x31\x9c\x33\xe4\x03\x2e\xef\x6e\xde\xf1\x19\x4e\xc5\xcd\xda\xd5\xf7\x1a\xcf\xa8\xee\x1a\x9a\x2b\xd2\x65\xb3\x3d\x00\x8e\xc3\xf3\xfb\x1c\xf0\xdc\x1d\xe0\xb9\x06\x14\xee\xc2\x77\x2f\x15\xdd\x3d\x2f\x9a\x3b\x0a\xbf\xf6\x8b\x4a\xff\xee\xae\x47\xe4\x8e\xb9\xcf\xac\x12\xd6\x9c\x75\x4d\x1a\xa8\x47\x6a\xf6\xbd\xbd\x91\x82\x52\xfe\x1d\xf0\x56\x04\x15\xf0\xdf\xa0\x95\x16\x50\x28\xcd\x32\xb3\xab\x52\xd4\x95\x54\x54\xed\x9c\x8b\x9e\xac\x39\x2d\xac\xa3\x6e\x2a\x1f\xc5\x23\x2d\x53\x72\x71\x7b\xb3\x1f\xec\x15\x91\x1c\x09\x61\x2d\xac\x6e\x61\x8f\xf4\x48\x75\xf7\x40\x19\x34\xd6\xbd\x64\xe4\x9e\x6b\xd5\xaa\x9f\xdb\x50\x79\x19\xb2\xe7\x9d\x72\x20\x3a\xa6\x2e\xe2\x18\xc5\x86\x09\x22\x13\x4d\x33\x6b\x4b\xbb\x67\xfa\x91\x31\x41\x5e\xbf\x7e\x8d\x76\x8c\xd7\xff\xf2\x2f\xff\x02\x9e\xe4\x24\x65\x09\xcf\xd7\x5f\x84\xb7\xfe\xd7\x17\x5f\x84\x0c\xfa\x6f\x17\xef\xbe\x26\x34\x01\x99\x12\x6b\x15\xe1\xd8\x70\xc0\xcd\xee\xd5\x88\xfc\xdf\xbb\x6f\xde\xd7\xb5\x2d\xdb\xbf\x02\xfc\xf8\x2d\x0a\x92\xc5\x6c\x64\x14\x87\xd8\xb5\xda\x56\x41\xf5\xdc\xc7\x03\x51\xb0\x74\x36\xa2\xc6\xec\xdd\x0f\x72\xf4\x83\xf2\x05\x7c\x36\x87\x4d\xe5\x02\xe0\x37\xe3\x89\x4d\x4c\x85\xd6\x23\x57\xe5\x03\x93\x07\x60\x90\x8f\x23\x2f\x01\x63\x98\x05\x8f\xd0\xdd\xda\x06\x0f\xd5\x85\xcf\x4b\xa6\x8c\xa8\x69\xeb\xfe\xe2\x70\x35\x0c\x05\x95\xc7\x3d\x9c\xf3\x8b\xbd\xdc\x07\xd1\x5b\x5a\xbc\x61\x59\xe4\x8c\x2b\xdd\x28\xed\x69\xd1\x0e\xa8\x88\xc9\x35\x4d\xe6\x84\x09\x0d\x49\xb7\xf0\x80\xcd\xeb\x01\x83\xcc\xa9\x48\xcd\x0d\x83\x1a\x10\x30\xe0\x33\x79\xae\xf4\xf1\x05\xb8\xf5\x7b\xd0\x8a\x90\xac\x31\x32\x35\x12\x70\x13\x4c\x6b\xc6\xa4\x11\x79\x16\x58\x26\xf7\xfa\x13\x85\xdc\x1c\x66\xab\x50\x5d\xac\x6c\x14\x9c\x6a\x56\x2c\x0b\xe9\x2c\xb2\xbe\x7e\x9c\xff\x05\x21\x09\xa6\x5c\xf9\x58\x56\x4a\x7f\x59\x99\x03\x0e\xad\x8f\xda\xb7\x22\xed\xe5\xda\x88\xe8\xfa\x60\xed\x7d\xa0\x05\x4e\x12\xa6\x10\x94\x7f\xc4\xe0\x1a\x5d\xbf\xfd\x23\x6e\x64\xf0\x78\x72\xba\x69\x48\x17\x2e\xcb\x85\xc1\xfd\xb4\xd2\x72\x0c\x25\xd1\x5d\x9a\x96\xce\x80\xe9\xba\x5d\x64\xc5\x9c\x8e\xa0\xaa\xb0\x67\x62\xd7\x47\x6c\x00\x60\xb3\x0e\x71\xc4\x38\x3b\x56\x61\x10\x9e\x35\xf4\x03\x64\xd5\xd5\xa3\x05\xcd\x19\x84\x75\xe1\xc4\x82\x07\x5b\xa9\xbc\xa7\xf8\x4c\xb0\x12\xb5\xb4\x10\xf8\x4b\x32\x7a\xcf\x32\x3b\x94\x2c\x23\x96\xf1\x95\x0b\xa1\x63\xa5\xc1\x9e\x8a\xd0\xd9\xac\x64\x4a\xf1\x05\xb3\x91\xd3\xfc\x1f\x75\xc5\xbf\x39\x23\xb7\xd7\xef\x5c\xfc\xb8\x22\x86\xb1\xd5\x2c\x24\x5b\x20\x36\x9f\xab\xd2\x80\x56\x2d\x7b\x4c\x08\xb9\x56\x52\x43\x1d\x3b\xd3\xbf\x3d\x12\xe5\x2b\x69\x83\x97\xe9\x18\x02\xc5\x63\xf6\xac\x0e\xfd\xc1\x18\xf3\x39\xa3\xa9\x0b\xb6\x35\x2c\x65\x51\x18\x49\x9a\x5c\x9a\x2b\x3a\xe5\x46\xb0\x56\x36\x1c\x3b\xad\x8c\xa8\x42\x03\x12\xc1\xd5\xed\xe3\x9c\x11\x59\xa6\x0c\xeb\xc0\x4f\xc1\x99\xc7\x77\xdb\xa0\xef\x90\x77\x88\x9b\x91\xee\xb9\x2e\x69\xb9\x44\x8a\x69\x4f\x22\x78\x38\x83\x33\xb1\x96\x3e\xf4\x0a\x23\x43\x2c\x15\x09\x49\x9c\xe7\x5a\x24\x42\x23\x11\x12\x76\xdd\x82\x6c\xeb\xae\xc5\xe2\x4c\xd3\x00\xfc\xef\x2c\xf4\x87\x7f\xf6\x94\x42\xde\x84\xe0\x78\x20\x32\xac\x23\x03\x1f\xfa\xaf\x93\xb9\xa5\xeb\xed\x2b\x4a\x08\x4a\x82\x34\xa6\x3c\x3f\x71\x61\xd8\xdc\x21\x01\xef\x95\xcf\xf4\xc4\x30\xd0\xba\xa2\x59\xb6\x1c\xb3\x4f\x86\x94\x98\x4b\x0c\x34\x14\x72\x71\x82\x3b\x7f\x25\x14\xd3\xa3\xa8\x21\xe1\xf2\x15\x25\x26\x99\x50\xe4\x04\xd7\x24\x24\x64\x9d\x3a\xc1\x6e\x8d\x20\x70\x5f\x69\x74\x81\x1b\x6d\xfe\x24\x6e\x9d\x0b\x56\x2e\xed\x08\x11\x1f\xf6\x00\x67\xd2\x13\xe6\x08\xdc\x41\x9d\xcc\xaf\x3f\x15\x25\x86\x1e\x45\x7e\xbd\x02\x7e\xab\x9d\x61\x6a\x26\xc7\x3d\xb6\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\xd6\x7c\x02\x58\xec\xe2\xfd\x55\x0c\xfa\xc2\x16\xc3\x22\xb6\x5b\x30\xc3\xd8\x6e\x4f\xb9\x81\xd8\x2e\x76\xec\x8d\x4d\x6f\xe5\x7e\xc1\x0c\xcc\xae\x90\x9a\x93\xea\x28\x79\x60\x16\x09\x1b\xc9\x13\x94\x5d\xf6\xe5\x1e\xd3\x29\x19\xc4\x73\x63\x80\x3a\x5b\x42\xb7\x38\x52\xec\x59\xf4\x06\x67\x37\x91\x58\x3c\x5d\xb7\xb1\x99\x7a\xaf\xef\xdc\xf6\x45\x7f\xdc\xf7\x0e\x62\x7b\x60\x01\xaa\xbd\x4d\xad\x05\x7f\xe6\xbc\x9c\xd4\x06\x30\x65\x1e\xf8\x18\x39\x0f\x46\x14\x12\x38\x2b\xa2\x65\xfc\x91\x92\x3e\x1e\xb3\xed\xe6\xb6\x78\x0f\x0b\xee\x75\xe1\x9a\x73\x68\xdb\x46\x1e\xd8\xf2\x54\xe1\x0d\x30\x18\x6c\xce\x0b\x2c\x40\x66\xc8\x83\x91\x80\x7b\x5e\x03\x6c\xdf\x41\x0a\x1b\x37\x30\xe2\xb8\x1b\x31\x22\xef\xa5\x36\xff\xbb\xfe\xc4\x95\xe5\xf6\xae\x24\x53\xef\xa5\x86\x27\xcf\x72\x42\xb8\xd0\xe7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x3b\xc4\x9f\x25\x57\xe4\x06\xd2\x97\xe3\x96\xf6\x1c\x1a\xfc\x77\x5d\x6e\x14\x33\xb0\x93\xb1\x21\x7f\x8e\xf5\xa4\x5f\x1f\xd9\x9e\x9f\x2c\x5b\xc7\xb7\xf7\x49\xd8\x09\x80\x6e\x0c\x7f\x81\xb4\x6e\x45\x46\x13\x96\xba\x1c\x55\xd4\xec\x14\xd5\x6c\xd6\xe9\x63\xbe\xad\xe5\xac\x9c\x81\x2a\x2f\x09\xca\x95\xb8\x61\x01\xbd\x09\x31\xb6\x9e\xe4\xb8\x39\x78\x6f\xf0\x7f\x62\x84\xd2\x01\x3b\x03\x1e\xeb\x6b\x83\xda\x9f\xc6\xab\xf5\xb8\x97\x8d\xa1\x91\x2b\xc9\x69\x61\xee\xe4\x7f\x19\xe6\x03\x40\xf5\xbf\x49\x41\x79\xa9\x26\xe4\xc2\xe5\xce\x6a\xfe\x66\xa5\xc7\x46\x37\x3d\xa6\x50\x80\x47\xf0\x4f\x15\x5f\xd0\xcc\x66\xe2\xa0\x82\x30\xcc\x2d\x66\x66\xb3\xca\x84\x8e\xc8\xe3\x5c\x2a\xe4\x64\x7c\xf8\xcd\xc9\x03\x5b\x9e\x8c\xa2\x34\x18\xae\x35\x6f\xfc\xc9\x8d\x38\xa9\xb5\xc5\xad\xdb\xea\x79\x34\xf0\xaa\x3d\x81\xdf\x4e\xf6\xcf\xe7\xf6\xe2\xac\xfa\x56\xae\xde\x34\x81\xe8\x2b\xf6\x94\x78\x98\xba\x85\x47\x7a\x61\xdb\x87\x98\xec\x60\x7a\x83\xe2\xec\x7e\xe9\xb2\xc8\x59\x41\x75\x5d\x8e\x8d\x1a\x12\x64\xde\x86\x7c\x6c\x40\xac\xa5\x22\x88\x17\x29\x23\x0f\xca\xa5\xc4\x39\xd6\x26\x1b\x7a\x5a\x56\x6c\x44\x52\x29\x4e\xb5\x55\x77\x35\x33\x2d\xae\xe6\xb3\x4a\x37\x9c\xc3\x99\x3a\x8f\x1a\x94\x96\x0c\x12\x6c\xb9\xcc\x91\x56\xc3\x80\x59\x17\x41\xd3\xa9\x9d\x87\x88\xf9\x73\xd3\x90\xe1\x01\x79\x76\x48\x1b\x96\x27\x24\xe0\x2e\xc8\xe5\xdd\x1c\xb6\x3e\xf4\xc6\xe0\x6d\xed\x69\xd4\x78\xbb\x80\x08\xb0\x78\x1d\x26\x88\x6a\x91\x7f\xb0\x52\x46\x8d\xb0\x41\x75\x14\x0f\x9d\x61\x16\xfd\xba\x85\x05\x9e\xd4\xad\x05\x9a\x1f\x80\xbd\x5f\x58\x43\x25\x24\xeb\x6c\xe4\x25\x29\x25\x1e\x0d\xf8\x3c\xc0\x0f\xf7\xb0\xaa\x83\x5f\xb9\xfa\xa8\x5e\xa8\x02\xb0\xa1\xb5\x8f\xa3\x56\x1d\x5a\xbd\x8f\x73\x56\x6b\xe4\xe5\xd4\x56\x82\x47\xa3\xc3\x53\x41\xd1\xe7\xda\xa8\x04\x26\xae\x40\xab\x78\x1f\xf5\x78\x8f\x63\x45\x7f\x8b\x77\xb4\xe8\x65\x05\xf3\x5f\xb7\x4a\xfe\xd3\x7b\x59\x69\x97\x2e\xc4\xfe\x0e\x85\x95\xb5\x74\xf6\xc7\xc3\xa9\xce\xfb\xe8\x38\xa2\x19\xf9\xa7\x80\x34\x7a\xc2\xb4\xfd\xb0\x46\x84\xd1\x64\x6e\x38\xc0\x31\xba\x59\x18\x2e\xd5\xb1\xa3\x57\x66\xeb\x90\x31\x94\xab\x24\x26\x0e\xf8\xfc\x69\x38\x90\x6b\xf8\xe7\x38\xb3\x91\x73\xb9\x54\xd6\x75\xcd\x32\xa7\xa2\x0e\x5d\x88\x1a\xd3\xa9\xe7\x5c\x3e\x64\xab\xfa\x81\x55\x82\x8c\xba\x52\x3e\xcb\xc8\x1e\x2c\x35\x9f\xf9\x8b\x11\x35\xde\x86\x15\xd5\xd9\x74\x0c\x36\xb5\x7e\x45\x95\x58\x1b\xc9\x10\xbc\xe8\xd1\x30\xb5\xa6\x59\x08\x75\xaa\xad\x46\xf6\x1e\x48\x10\x0d\xfe\xe6\x75\x5e\x4b\x7b\xaa\xfe\x30\xe2\xc4\xef\xc6\x11\x29\xe6\xf3\x3b\xb3\xb2\x94\xa5\x59\x13\x53\x8a\x70\xd8\xe5\x9c\x96\x0f\x2c\xf5\x5c\xd2\x84\xdc\x9a\xc5\x3b\x19\x3d\x6a\xcc\xd2\x51\x23\x97\x27\xba\x59\x89\xcd\x4c\xe8\x74\x32\x39\xb5\x65\x13\xd6\xeb\xb2\x45\x63\xaf\x58\x81\xbc\x87\x18\xde\xba\xbf\xef\x68\xa1\x50\x1d\x61\xd8\x1b\x50\x47\x4a\x28\x88\xa8\xe7\xce\xa6\x48\x23\x42\x6c\x56\x97\xd3\x43\x00\xea\xab\x56\xee\xa3\x52\x8e\x32\x1c\x62\xeb\xaf\x46\xee\xa5\x42\xde\xa6\x3e\xb6\x27\x65\x6f\x7c\x5f\xcd\x7f\x2f\x0d\x4c\x1e\xe4\x12\xb8\xda\x9e\xae\x76\x04\xd7\x2e\xae\xc8\x37\x4e\xf6\x09\x73\x18\xd4\x73\x5b\xee\xbb\x8f\x9e\xec\x59\x3c\x06\x57\xdb\xf3\x79\x10\xae\xb6\x9b\x29\x26\x11\xdf\x58\xf5\xb1\xe9\xd2\xe9\xd9\xba\xc0\x94\xbb\xab\xed\x18\xae\x85\xab\xed\xc0\xae\x86\xab\x2d\xce\xf5\x70\xb5\xc5\xb8\x22\xae\xb6\x58\xe9\x0c\xdb\xd3\x2f\x70\xb3\x04\x5c\xd9\x12\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x45\x03\xc9\xf5\xba\xb7\x96\x50\xe3\xd5\xa5\xf7\x4a\x66\x95\x0e\xaf\x33\xb7\xad\xbb\x26\xdd\x87\x89\x3b\xcd\x66\x2c\xb1\x5f\xed\xb8\xc1\x37\x00\xd7\x86\xe4\xb8\x5f\xaf\xfb\xd0\xfc\xf5\xd7\x82\x1f\x53\xf5\xf7\x94\x84\x4f\xd8\x8e\x9d\xf6\x09\xdb\x91\x93\x3f\xb9\x41\x9f\x92\x02\x0a\xdb\xf3\x26\x82\xc2\xd6\x13\xbc\x63\x92\x42\xb9\xf6\x64\x2d\xab\xcf\x5c\x8e\x14\x73\xe9\x33\x0b\xb7\x84\x20\x48\xd4\xa4\x15\x4a\x63\xce\x8e\x68\x4b\xb6\x1c\x58\x55\xf7\x74\x75\xbf\x8b\x51\xb9\xb8\xbd\xe9\xa5\x45\x69\x7c\xbf\x45\x8f\xd2\x7c\xe3\x17\xac\x49\xb9\x41\xd5\x48\xd3\x27\xeb\xaa\x5e\xb9\x8d\xb3\x8c\x64\x6d\x9e\x47\xa6\x5c\x9b\xf6\x5b\x43\xd7\x9b\xb9\x4a\x1b\xe7\xac\xa5\x0d\xe9\xa9\x39\x00\x4b\x65\x5d\x6d\x1e\xf4\xe5\x8d\x71\x02\x27\xcf\x23\x7f\x1e\x51\x96\x84\xfd\x08\xca\x23\xb9\xda\x5a\x27\x75\x5a\x97\xcf\x40\x65\x33\x2a\xbe\x1a\xda\xb6\x42\xa6\x6f\xd0\x48\x4a\x85\x90\x58\x1e\x4a\x8d\xd0\x50\xa1\x46\xd6\x0c\xd3\x48\xd1\x21\x52\x52\xf1\x14\x3d\xa0\x7d\x76\x81\xd3\xcf\xc9\x31\x0d\x96\x7f\x1b\x7b\x94\xe4\xc9\x1e\x66\xb4\xe0\xdf\xb1\x32\x2c\x8b\xfd\xa6\xd6\x3a\x58\xdb\x93\x3b\x45\x95\xcc\x59\x4e\xe1\x9f\x6f\xdd\xf2\x0c\xaa\xb1\xfe\xf5\xa0\x96\x63\x65\x6e\x58\x8f\x51\x2b\xca\xf4\x64\xf1\x45\x94\x7f\x6c\xdd\x9e\xe8\xe2\xe1\x4f\x61\x0f\x9b\x71\xdb\x12\x31\x0c\x70\x83\xa6\x00\x8c\x2b\x2e\xd3\x8c\x57\x5b\x1a\x2a\xb3\xc0\xdd\x7b\x86\x85\xef\xc7\xfc\x8e\xed\xb9\xf4\x34\x7d\xf5\x33\x23\xcf\xfb\xb4\xb5\x2d\x3d\xa6\x30\xe8\x67\x06\xfd\xcc\xff\x68\xfd\x4c\x83\xb0\x3b\x5c\xbf\x41\xed\xd2\xcc\x88\xea\x74\x2f\x75\xdd\x83\x09\x6a\x3f\x9d\x1a\xc5\xe9\x50\xea\xba\x82\x68\xfe\x38\x9d\x4c\x4e\xd1\x00\x32\xf1\xea\xd2\x4a\x4f\xc7\x7f\x24\x4c\x24\x32\x35\xfd\x60\x55\xc0\x52\x69\x60\x2d\x6b\x89\xbd\x39\x97\xdc\x8d\xd5\x34\xa1\x40\xdf\x7d\xb9\x87\x5e\x28\xd8\x45\xe5\xbf\xdd\x0f\x83\xd5\x0b\x81\xd6\xac\x98\x2f\xc6\x64\xb7\xcc\xd7\xa7\xb2\x3c\x59\x9d\x43\x20\xe3\x39\xb7\xde\xc9\x06\xbb\x30\xa5\xe3\xdd\xf7\x08\x39\xc3\x6e\x26\x49\x51\x8d\x6c\x97\x93\x9c\xe5\xb2\x5c\x8e\x7c\xb7\xe6\xc7\xd6\x38\xf6\x8d\x73\x60\xfa\x92\xaa\x2c\x99\xd0\xd9\x32\x34\xb9\xd4\xa6\xf6\x8c\xdc\x9f\xdb\xd1\x23\x33\x7f\xfe\x60\x63\xfd\x4b\xea\xd6\xbe\xff\x75\xf1\x41\x50\xc8\xf9\x5d\x01\x1a\x63\xd3\xd8\x8d\x6a\xfd\x84\x79\xca\xc4\x82\x2c\x68\xa9\xe2\xef\x1b\x79\x3a\xbf\x97\xf2\x05\x57\x7b\x09\x39\xb8\xb3\xc4\x0f\xf5\xcc\xb2\xd2\x45\xa5\x2d\x3a\x76\xd7\xc8\x95\x21\xf3\xd7\x67\x85\xe9\xfd\x22\x5c\x45\xd4\x6c\x05\xd5\x9a\x95\xe2\x0d\xf9\x8f\xb3\x7f\xff\xdd\xcf\xe3\xf3\xbf\x9c\x9d\x7d\xff\x7a\xfc\xbf\x7f\xf8\xdd\xd9\xbf\x4f\xe0\x1f\xbf\x3d\xff\xcb\xf9\xcf\xee\x8f\xdf\x9d\x9f\x9f\x9d\x7d\xff\xd5\xbb\xbf\x7e\xbc\xbd\xfe\x81\x9f\xff\xfc\xbd\xa8\xf2\x07\xfc\xeb\xe7\xb3\xef\xd9\xf5\x0f\x81\x9d\x9c\x9f\xff\xe5\x37\xbd\xa6\x4b\xc5\xf2\x9b\x1e\xf8\x0d\xdb\xf8\x89\xf4\xb1\xdd\xcb\xbe\x3c\xc1\xb9\xd0\x63\x59\x8e\xb1\xbb\x37\xe0\xb2\xd8\xa3\x53\x07\x16\xfb\xb8\x87\x35\x1d\xae\x0b\xeb\x39\xe1\xe3\x19\x2e\xda\xbe\xe4\x8b\x3d\x18\x0b\x30\xeb\x4d\x2f\x9d\x21\x7e\xba\x45\x5d\x68\x7f\xfc\x05\x6b\x0a\x3f\x1b\x9f\x2b\x5b\xa0\x64\x70\xb8\x7a\x76\x87\x2b\x3c\x89\xc1\xdb\xaa\x5e\xdc\xe0\x6d\x05\x6d\xf0\xb6\x6a\xb6\xc1\xdb\xaa\x35\xee\xe0\x6d\x35\x68\xf3\x06\x6d\xde\xf3\x6b\xf3\x06\x6f\xab\xc1\xdb\x6a\x73\x1b\xbc\xad\xba\xdb\xe0\x6d\xf5\x3f\xcd\xdb\x0a\x41\x6c\x93\xcf\x95\x95\x48\x6b\x87\xab\xcf\xce\xdf\x4a\x99\x43\x4e\xd8\x45\x92\xc8\x4a\xe8\x8f\xf2\x81\x05\xfb\x0b\xac\xe8\x50\xd6\xfa\x81\x1a\x83\x5b\x74\x2a\xeb\x2f\x1f\x4d\xc1\xf2\x02\xf3\xc1\xd1\x2a\xe5\x4c\xc4\x69\x08\x9f\x82\x7a\xdd\x78\xcd\xaa\xd8\x22\x65\x69\xfd\x83\xc5\xcb\xda\x1c\xcd\x84\x5c\x90\x92\x25\xbc\xe0\x36\xe9\x02\xc5\xe7\x51\x43\xc2\xbd\xb0\xa9\xb5\x97\xe6\xb6\xb0\x6c\xea\xd1\xa3\x4f\xb9\x5d\x36\xf4\x0f\x96\x52\xaf\x4c\x29\x4e\x8c\x35\xd3\x44\x3e\x10\xb8\xbe\x47\xae\x18\x51\x73\x59\x65\x29\x29\xd9\xdf\x1d\xcb\x69\x57\xf9\xb1\x39\x5a\x53\x81\x1f\x3b\x6c\x63\x39\x76\x1f\x69\xc1\xc3\xab\x7d\xf9\xd9\xf7\xc1\x95\xec\x53\xc1\xb1\xb2\xc1\x1d\x4b\xa4\x48\x8f\xa6\x16\x5c\x1b\xb8\x66\x16\xc1\xae\x87\xd9\x6a\x7c\x6e\xce\x05\xcd\x78\x6a\xa8\xaf\x73\x29\x42\x94\x10\x07\xc6\x88\x3f\x3c\x94\xaa\xfa\x34\x09\x2d\x8a\x52\xd2\x64\xce\x54\x63\x66\x28\xf1\xd8\x4a\x17\xa1\x29\xdd\x9b\xad\xc8\xaa\x19\x17\x28\x20\x41\xff\x8e\xdf\x90\xda\xb9\x1c\xda\x85\xac\x4e\xee\x63\x63\x60\xf3\x79\xd4\xb0\xc8\x60\xea\x72\x09\x3e\x8c\xb2\x39\x1c\xae\x96\x4f\x9b\x7f\x28\x22\xb3\xd4\x55\x5a\xfd\xe3\x6b\x23\x53\x27\x78\x75\x23\x15\xbd\x0a\x72\x73\x9a\x11\x33\xc3\xed\x1b\x32\xb7\x7d\xa0\xdf\xff\x81\xcc\x65\x55\xaa\x49\xb3\x4a\xe0\x17\xf0\x2c\xee\x54\x45\x5a\x7b\xee\x68\x92\x31\xaa\x34\xf9\xe2\x35\xc9\xb9\xa8\x74\x9f\x6c\x03\xf1\x52\x5a\x43\x3e\xfb\xe7\x3f\x04\x7f\xf7\xa4\x2c\x05\x91\xb7\xad\x29\x8d\xc1\xbf\xbd\x48\x66\xf5\xc6\x58\x1c\xb5\x90\x5c\xe8\x55\x01\xcd\x52\xd8\x7e\xd8\x14\x34\xd3\x07\xc3\x62\xbd\xc5\x98\x9f\x2a\x79\xbf\xd4\x7b\x2d\xaa\x63\xbb\x6c\x67\x8c\xfb\x7f\xf6\x61\x5c\xed\xd9\x98\x32\x3a\x6e\x84\xdd\x15\xb9\xdc\xe4\x5e\x52\x11\xae\x92\xcd\xb8\xd2\x65\x97\x1a\x77\x1c\x82\x78\xc3\xb9\xa8\x59\x29\xab\x80\x84\x0b\xf1\x97\x0d\x3a\x76\x0a\x0d\x67\x58\xb2\xb9\xc5\x43\x72\xa6\xb8\xd2\x75\x78\x3a\xd0\x5b\xe7\x57\x2f\xad\x42\xcc\xa6\xda\xb2\x0e\x40\x5d\x62\xfb\xe7\xad\x2f\x1b\x23\x35\x39\x00\x3d\xcc\x96\x61\xdf\x6d\x74\x61\x73\x48\xc9\x92\xe4\x55\xa6\x79\x91\xd5\xdb\xf7\xc1\x7d\x60\x19\x86\x10\x29\xba\x66\x8e\x69\xc3\xee\x43\xb1\x66\x17\x16\x65\x07\xc3\xeb\x99\x1f\x8d\x09\x0d\xf5\x3a\xc0\x81\x9e\x15\xb4\xa4\xfe\x94\x12\x99\xe7\x34\x28\x85\x12\x5a\x02\x29\xf8\x90\x21\xc9\x31\xec\x44\x49\xb3\x7a\xd5\x0d\x37\xa0\x7d\x02\xb9\x66\x82\x8a\x00\xa3\x7e\x8f\x62\xf8\xd0\x33\x91\x8f\x3e\x2e\x64\xc6\x17\x4c\xac\x42\xb7\x15\x42\xbe\xa4\xc9\x03\x13\x21\xd2\xfc\xb7\xca\xed\x6f\xba\x14\x34\xb7\xb5\xed\x8b\x52\x2e\xb8\xb9\x06\x2c\x5d\x19\x41\x8d\xac\x5a\x08\x93\x62\xbb\x12\x00\xc8\x68\xee\x73\x2b\x2b\x75\x98\xaa\xc7\xa6\xdf\xa7\x63\x49\x85\xf6\x9f\x92\x2f\x12\xe6\x38\x67\xd3\xf3\x3e\x77\x60\x11\x50\x77\x8f\x6c\xae\x0f\x65\xf3\x32\xe3\x7d\x03\x4a\xef\x5d\x18\x30\x63\x69\x66\x70\xde\xd2\x57\x13\x5a\x81\x22\x5b\x4a\x61\x6f\x15\xc2\xca\xfb\x98\xc2\x51\x9d\xc7\x58\xde\xa7\x6d\xb4\xf5\x81\xa6\x52\x91\x2f\x21\x2b\xdb\x15\x03\x71\xe6\x70\x0c\xcf\x87\x2f\xaf\x3a\x98\x1d\x33\xbf\xde\x8c\xce\x46\xbd\x27\xfb\x44\xf3\x22\x63\x6a\xf2\xf0\x47\xd0\x7c\xda\xbb\xf8\xaa\xbc\x4f\x5f\x7d\xb8\xbe\xb8\x7a\x77\x3d\xc9\x77\xdf\xf6\x03\xf0\x4f\x3c\xa7\xb3\x2e\x8e\x7c\x4c\x72\x29\xb8\x96\xe5\x6e\x34\xfb\x22\xca\x00\xee\x2c\x77\x6a\x65\x12\xc7\x44\x18\x58\x5a\xca\x8a\x3c\x52\xcc\xf2\x19\x5c\x0a\xf5\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x99\xaf\x57\x07\x33\xb8\x75\x8f\x95\x02\x11\x76\xde\x1c\xad\x3c\xea\x93\x0b\xc0\x97\xf7\xdd\xa4\x2b\x02\x91\x02\xa0\x1e\x02\x64\xa0\x63\xaf\x37\x02\x24\x84\x8f\x42\x93\xd0\xf5\xbd\xea\xbf\x9e\xcb\xc7\xb1\x96\xe3\x4a\xb1\x31\xef\x56\x24\x47\xec\xd5\x03\x5b\x82\xf3\xe8\x01\x76\xcb\x76\xdd\x52\x03\x68\x09\x56\x08\x78\x6e\x78\xb2\x0f\x5f\x5e\x7d\xab\xc2\xd4\x8e\x0d\x79\xe5\x15\xd3\xc9\xab\x84\x15\xf3\x57\x76\x8c\xcf\x73\xef\x1b\x76\xa3\xb5\x15\x75\x7c\xea\xb0\xec\x21\xce\xcd\xf5\x8d\x4c\x45\x22\xb3\xcc\x96\x76\x92\x53\x72\xc9\x8a\xb9\x7f\xe1\xc5\xed\xfa\x9e\x4b\xb1\x1d\x47\x35\x44\xa0\x40\xb2\x0c\xb0\x03\xc6\x1f\xa5\xe9\xb7\x8d\xaf\xe0\x49\x28\xba\x6a\x5c\xb9\xf2\xbe\x2f\x21\x78\x39\x97\xac\x9b\xcc\x3c\x9b\xd2\xe2\xe9\xb5\x68\x7b\x69\x27\x8e\x7c\x60\x61\x6a\x10\xf4\x68\x0f\x0a\x46\xeb\x51\x4c\xd2\x75\x0e\xcc\x7a\xc3\xc5\x83\x56\x7a\xce\x84\xe6\x09\x9a\x80\xac\x5b\x7d\x93\x46\x91\x9b\x29\x0a\xca\x69\x90\xdd\x5c\x2e\x58\x59\xf2\x94\x29\x12\x41\xa4\x9a\x4a\x39\x9e\xbd\xb8\x03\x0c\x34\x64\xc7\xd9\x98\xc3\x9d\x7a\xfa\x59\x24\x9e\xe2\xc8\x73\x6c\x17\x9e\x23\x3b\xef\x3c\xcd\x6d\xe7\x79\x1d\x76\xa2\xcd\xcf\x31\x4e\x3a\x4f\x71\x5c\x39\xa8\x26\xab\x45\xcc\xe1\x49\x0f\x62\x4e\xd3\x9c\x07\xa5\x7b\x78\xd1\xe4\x1c\x56\xb1\xe3\x75\x95\xd0\x8c\xdd\x7c\xb3\x4f\x4d\x94\xed\xb2\xad\x8d\xba\xb3\x0f\x0b\x56\x2a\xae\x20\x10\xc7\x29\x1a\xb5\xa6\xc9\xdc\x6a\x8c\x9c\x09\x42\x0a\xa8\x4d\x89\xb0\x45\x84\x4c\xbb\x6d\xc6\x4d\x75\x94\x1b\x6d\xb7\x4a\xca\x4d\xf4\x25\xd9\xdf\x66\x54\xb3\xc7\x4e\xfe\x7c\x5c\x93\xe8\xee\x37\x41\x29\xf2\x99\x6b\x9a\x62\xb4\x49\x3e\x62\x60\xad\x97\x7d\xea\x8f\x26\x5b\x34\x47\x71\x48\x06\xbe\xdd\x9b\x4a\x19\x9b\xbf\xfb\x9f\xa6\x5d\x44\xc2\x42\x5b\xe4\x79\xda\xaf\xdc\x59\xc1\x26\xd2\x34\x2d\x99\x52\x8e\x85\x70\x17\xf0\xe2\xf6\x86\xfc\x15\x5f\xdf\xeb\x2a\x8b\x52\x6a\x14\xb8\xaf\x64\x4e\x79\x80\xbb\x63\x6b\x05\xab\x9f\xbb\xa5\x34\x79\x5d\xb7\x84\x5b\xff\x2e\xb1\x2f\x4f\x65\xd9\x48\xe6\x5f\x95\x2c\x25\x56\x59\xb7\xd7\x35\x1e\x45\xce\x5a\x93\x87\xc8\x99\xf9\xed\x15\x94\xd2\x38\x9f\xd4\x32\xd7\x8a\x40\x16\xa2\x19\xd8\x8b\xc8\xf6\x02\x85\xa2\x86\xd9\xc8\x05\x78\xd6\x82\x90\x03\x1b\x60\x3b\xbc\xd3\x62\x50\xff\x42\x71\xf0\xfe\x69\xf8\xdb\xda\xaa\x75\x5c\xd5\x31\x9c\x28\x5b\x8d\xc8\xd7\x72\xc6\x5d\xe5\x50\x03\x9c\x78\x36\x34\x44\x20\x1a\xe4\x94\x41\x4e\x59\x6d\x83\x9c\xb2\xb1\x29\x95\x5d\x0b\x7a\x9f\x85\xb8\x9a\xb7\x7d\xe9\xfd\x87\xe4\x6d\x46\x67\x84\xc1\x1f\xaf\x52\xae\xcc\xff\xc9\xdd\xdd\xd7\xe0\xbc\x51\x09\xa7\x4c\x01\x08\xb0\xb4\xd2\xe7\x1e\x41\x9c\xbc\x5f\x24\x89\xa4\xea\x5d\x50\x0c\x69\x0f\x34\x59\x77\x4f\xb8\x48\x5d\x29\xfa\x46\xbc\x85\x7d\x03\xb0\x25\xf5\xd1\xe4\xe8\xd0\x7d\xcf\xcc\x2d\x4d\x1e\x6e\x1b\xbe\x16\xb2\x34\xcf\x44\xe3\x51\x24\x93\x15\xfd\x75\x3f\x76\x6b\x65\x98\xb0\x63\xb8\x8d\x57\x6a\x37\xbe\x74\x7c\x8b\x23\x3a\x77\x76\x6b\xe1\x37\xaa\x94\x4c\x78\xed\x2b\x04\xf6\xa5\x9a\x99\x49\x81\x99\xd9\xeb\x66\x20\xff\x1c\xbb\x1c\x64\xd0\x37\x70\x60\x0e\x50\xec\x1b\x54\x35\x39\x2e\x2e\xdc\xaa\xf7\xba\x04\x04\xc7\xb0\x8c\x4b\xf1\x97\xa3\xee\x7d\x75\xbd\xfe\x22\xac\x7a\xa1\xb8\x64\x0d\xf6\x84\x03\xa4\x39\xbb\xe6\x39\x45\x35\xc6\x1a\x14\x70\xe5\x2f\x1d\x24\x9f\xd9\xdb\xfe\x85\x64\x6f\x89\x54\x25\x20\x5f\xd5\x76\xc7\xc3\x67\xd6\x73\x05\xb0\x46\x21\x8b\x2a\x43\x67\x7a\xbf\xb8\x1e\x0e\x25\x31\xd6\x78\x9c\xc5\x7e\xb4\x03\xe1\x1c\x56\x23\xc0\xfb\x10\xe0\xd9\x8c\x1f\x8f\x0f\xf3\x77\x10\x0b\x52\xb7\x91\xb0\x6d\x77\x51\x32\xfb\x31\xa3\xfc\xf7\x15\xd5\x1f\xa2\xdd\x68\xc5\xfd\xb7\xa4\xae\xd7\xff\xfc\x87\x3f\x04\x11\x34\x5e\x42\x09\x48\x0e\x15\xf2\x20\x2f\x88\xf7\x18\xa0\x25\x03\xe9\x00\x43\xf0\x9d\x7e\x03\xbd\x11\x75\xa0\x55\xe5\x18\x01\xff\x07\x0e\xf0\x8f\x0b\x15\x89\x09\xe0\x0f\x34\x87\xf7\xf0\x96\x81\x44\x4c\x37\x47\x4b\xc4\x74\xa4\xf4\x4b\xc7\x49\xba\x74\x8c\x54\x4b\x47\x49\xb0\x74\xbc\xb4\x4a\x07\x4e\xa6\x74\x10\x17\x93\x43\xa6\x4b\x8a\x8c\x3d\x8e\x8b\x3b\x0e\x4f\x88\x14\x1c\x9d\x1c\x1b\x99\x1c\x91\xf2\x68\xbf\x89\x8e\xa2\x25\xfa\x98\xa4\x46\x7d\xa3\xee\x8e\x97\xc0\xe8\x19\xd3\x16\x3d\x77\xb2\xa2\x03\xa7\x28\x3a\x5e\x62\xa2\xa3\xa4\x23\xea\x13\xde\x1a\x9f\x7a\x28\x26\xac\xb5\xef\xe5\x3a\x78\x72\xa1\xbd\xa4\x14\xda\x73\x22\xa1\xfd\xa5\x0f\x3a\x9e\x23\x65\x78\x52\x95\x27\xa7\x52\x89\xaf\x5d\x15\x6f\xef\x39\x94\xb2\xa6\xee\x7d\xa3\x72\xca\xe5\x9b\x75\x25\x71\x4e\x55\xa3\xe6\x8d\x96\x06\xab\x1d\x21\x2a\x20\x40\x0f\x41\x22\x34\x38\xd8\xbb\xec\x60\x2e\x22\x95\x38\xd8\xe9\x37\x77\x2b\x1e\x21\xfe\xf1\x21\x1d\x41\xfc\x20\x1d\xae\x20\x6e\xe1\x47\x70\x06\x19\xbc\x2d\xf6\xe7\x6d\xb1\xff\x38\x9d\x97\x66\xa0\x4f\x07\x03\x7d\xb4\x81\x5e\xb5\xd2\xfd\x3b\x85\x31\xa0\x64\x60\x6a\xe5\x7d\xb3\x96\x5c\x8d\x23\x2e\x6e\x6f\x02\xc6\x49\x4a\x06\xb9\x81\x68\xa6\x26\x9b\xb8\x5d\x67\xba\xb3\x5c\xb4\xe3\x72\xa9\xd6\x2c\x2f\x82\x6a\x5f\x0c\xf6\xf9\xc1\x3e\xbf\xda\x06\xfb\xfc\xc6\x76\x6c\x7b\xdd\xbc\xca\xa9\x18\x1b\x0c\x0c\x66\xfc\x96\xc3\xd8\x0a\x43\x33\x21\x16\x93\x06\x5e\x4b\x4c\xf0\x00\x29\x37\x2a\xc1\x7f\xaa\x58\xad\xcf\xf2\x8c\xe5\x81\x6c\x9d\xd0\xf7\x61\x37\x10\xf9\xe2\x15\xcc\x9c\xc8\xb5\x28\x62\xbb\x66\xbf\x99\x0e\xc5\x86\x6e\x22\x0c\xd3\x52\xd1\xea\x39\x43\x26\xfd\x76\x85\x49\x6f\xe9\x1f\x2c\xfa\x01\x9c\x10\xaa\xe5\x6e\x72\xa6\x06\x10\xcc\x7a\x6c\x76\xaf\x7b\x46\x72\x5e\x96\xb2\xb4\x76\xd7\xe6\x92\xd0\x81\x90\xcf\xe6\x9a\x95\x28\xf9\xa3\x0b\x57\x08\x2a\xb8\x63\xda\x42\x15\x40\xa5\x96\x84\x0a\x4c\x4c\x60\xfe\xed\xc2\x69\x60\xb9\x8e\x0e\xdd\xb3\x39\x5d\x70\x59\x05\x05\x90\xde\x21\xa5\x3c\xb1\x1f\x03\xff\xb4\x94\x95\xb7\x30\x55\xca\x2c\xd0\xef\xa1\x5a\x3f\xaf\x80\x41\xde\xd7\x9f\x83\x82\x26\x95\x4e\x7d\x3e\x66\x9f\xb8\xd2\xeb\x3b\xe6\x8e\xca\x95\x21\xdb\xd7\x35\x58\xa8\xc2\x60\xf1\xef\x02\xb2\x4a\xc4\x01\x7f\xab\xe3\xb6\xe0\xb3\xb8\x83\x9f\xba\xc4\x1e\x9b\x68\x0e\xf3\xc2\x90\x9c\x26\x73\x2e\xa2\x72\x32\x7c\xd7\x9a\x42\x4b\xfe\x99\x90\x8b\x2c\xab\x7d\x07\x95\x77\x69\x75\xf2\x50\x7b\xfa\x66\x33\x3b\x06\x36\xf0\x51\xb2\x14\x6c\x94\x48\x52\xc1\x43\x56\xf1\x89\xed\x6a\xb2\xc8\x1f\x69\xc9\x26\x89\xcc\xc9\xe5\xdd\x0d\x49\x4b\xde\x99\x4a\xf1\x00\xfe\xf5\xb8\xe9\x9d\xa5\x5c\x5f\x96\x8c\x36\xc8\x67\x75\x8b\x71\x47\x72\x8e\x52\x19\x4f\x96\x37\x57\x7d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa9\x62\x29\x79\x47\x05\x9d\xa1\xfa\xf0\xec\xee\xf6\xcb\x77\xe7\x06\x80\x40\xdd\x79\x73\xb5\xd1\x0f\xeb\xae\xd9\xf9\xfb\x7d\xa6\x95\x59\x5b\x78\x0f\xde\x68\xed\xfb\x9e\x8b\xdf\x6b\xbe\x1c\xe2\xd9\x89\xb0\x12\xc0\x1b\x32\x00\xdd\xae\x26\x5c\x44\x27\x29\x97\xe9\x55\xad\xa2\xe6\x45\x9e\x3e\x3c\x6d\xfa\xdc\x48\x13\x59\x76\x9b\x51\x71\x51\x14\xa5\x5c\x6c\xd6\xba\x86\x20\x07\xf7\xbd\x5b\x00\x3a\x98\xbb\x87\x05\x9e\x08\xf8\x54\x0a\x14\x62\x70\xd8\xcd\xfb\x7f\xa3\xbd\x62\x56\x0a\x60\xc1\x4e\x2e\x2a\x2d\x73\xaa\x79\x72\x42\x64\x49\x4e\xde\x51\x51\xd1\x6c\x63\x6c\xca\xce\x15\x6f\x13\x30\x77\x7e\xb4\xbd\xb6\x5a\xc0\x67\x3b\x19\xd8\xdd\xdf\x6b\x5a\x1a\x54\x77\x79\xf7\x5d\xd4\xb7\x4a\x53\x5d\xad\x51\x86\x1d\xd4\x6a\x3b\x7d\x1a\x93\x8c\x2a\xfd\x6d\x91\x1a\xfc\xb0\xf2\xeb\x2e\x22\x94\x50\x4d\x33\x39\xfb\x57\x46\xb3\xcd\x97\x21\x04\xa4\x2e\x9b\x9d\x38\x8b\x88\xf5\x28\xad\xee\xfd\xf7\xa7\x8a\x18\x51\xd2\x40\x09\xd7\x8a\x94\x2c\x63\x0b\x2a\xb4\xfb\xfc\x0e\xeb\x25\x9e\xda\x6d\xd9\x0a\x70\xbc\xb6\xb1\xa6\x4c\xb3\x32\xe7\xa2\x3d\xce\x1d\x7c\x7f\x29\x45\xca\x91\x2b\x01\x2b\x12\x7e\xd1\x1e\x6b\x3b\x54\x6e\x73\x3d\xd8\xe1\x6c\xd0\xae\x14\xd9\x98\x4f\x7b\x7b\xf0\xb5\x7b\x2b\xba\xcc\xf1\x21\x78\x6e\xb6\xe6\xb6\xb6\x7b\xe4\x41\x18\x89\x02\x12\xa7\x6f\xde\x9b\x4e\x36\xa7\x8b\xbd\x19\x3b\x70\xc0\x29\x6c\x8f\x0a\x1c\xdb\x79\x6f\x73\x4a\xd8\x05\x8d\xd8\xba\x19\xa3\xd5\xa9\x6c\xc7\xd4\xad\x8d\xbf\x5c\xf9\x0c\x13\xab\x78\xdf\x26\xf4\xf2\x68\xbd\xb4\x9d\xb2\x04\xf1\x8d\x61\x2c\x5e\x68\x05\xfe\xd6\x5a\x1a\xf5\xe2\xe3\x74\x61\x81\xa4\x30\xb0\x10\x7e\x1c\xcb\x79\x63\x03\x9b\x4a\x2b\xc1\x52\x52\x70\x86\x29\xdb\xa9\xb0\x9b\x09\xf4\x8c\xd1\xd4\x3e\x34\x74\xb3\x64\xf6\xb7\x91\xf5\x38\x0c\x62\x50\xd0\x6f\xd7\xd9\x60\x29\x66\x12\x07\x6f\x84\x57\x7f\x95\x56\x07\x68\x33\x10\x1a\xac\x02\xdc\xc5\x88\xa8\x2a\x99\x13\x6a\x04\x19\x65\xae\x83\xc1\x17\x6c\x92\x53\xc1\xa7\x4c\xe9\x89\xaf\x97\xab\xbe\xff\xfd\x0f\x5d\x6c\xc7\x5b\x59\x12\x1b\xa5\x3d\x72\x09\xb1\xed\x1a\x6b\x98\xe3\x0a\x37\xc2\xf7\x5c\x6b\x64\x0a\x99\xda\x05\x3f\xc2\x52\x34\x7d\x30\xa4\x14\x97\x52\x31\xf0\x1a\xe8\xe2\x51\x4e\x0c\xdb\xdb\x98\xf6\x7f\x19\xda\xf9\xdf\x27\xe4\xec\x11\x98\x90\x13\xf3\xe7\x09\x4e\xc7\x47\x9a\x35\x15\x4e\xf5\xb4\x30\x69\x5a\xc9\x67\x33\x56\x76\xda\x58\xcd\xa7\x6c\xc1\x84\x3e\xb7\xc9\xc0\x85\x6c\x74\xe5\xfc\xfc\x6a\xfd\xc9\xea\x34\xbf\xff\xfd\x0f\x27\xe4\xac\xbd\x27\x1d\x43\x72\x91\xb2\x4f\xe4\xf7\x68\x2d\xe5\xca\xec\xde\xf9\x04\x15\x2e\x6a\x29\x34\xfd\x64\x46\x4c\xe6\x52\x31\x81\x0a\x30\x2d\xc9\x9c\x2e\x18\x51\x32\x67\xe4\x91\x65\xd9\xd8\xda\x8f\xc9\x23\x5d\x76\xe7\x40\x77\x47\x08\x99\x55\x49\x41\x4b\xdd\x02\xe3\xbd\x5c\xc2\x07\x2e\xf6\x9a\xc0\xf1\x2b\x2e\x56\x5d\x3a\x3b\x05\xbc\x0d\x4a\xe1\x19\xd7\x2e\xeb\x80\x8d\x2f\xd2\xcb\x57\xe6\xb0\x4a\x7e\x5f\x69\x59\xaa\x57\x29\x5b\xb0\xec\x95\xe2\xb3\x31\x2d\x93\x39\xd7\x2c\xd1\x55\xc9\x5e\xd1\x82\x8f\x13\x29\x0c\x60\x40\xaa\xdf\x3c\xfd\xb5\xd9\x09\x35\x36\x0b\xdd\xad\x25\x0e\xdc\xb1\x6e\xdb\x43\xdc\x8e\xf5\xb1\x35\x3c\x8f\x1a\x3d\x62\x83\x02\x54\xb1\xf1\xbb\x84\xfa\xce\x67\xdf\x2a\x50\xf9\xbd\xda\xc7\x4e\xb9\xc2\xc9\xf1\xb4\xb9\x73\xbf\x6c\xad\xf0\x64\x75\x0c\x83\x93\xd0\xdb\x17\x50\x58\x8b\x4a\xe4\x34\x45\x32\x42\x45\x67\x9c\xfb\x81\xef\xac\x39\x0f\xa8\xb7\x9f\x2c\xc7\xd0\x85\xcc\xc6\x54\xa4\xe6\xdf\x98\x78\x23\xd9\xed\x91\x1a\x78\x00\x15\xdf\x2b\xf2\xfb\xf6\xe6\xea\xf9\xc1\xf3\xd5\xaf\x2b\xbe\x0f\x4c\xd7\xc7\x9e\x65\xf9\xf2\x40\x66\x19\x45\x12\xf4\xd0\x2d\x2b\xe6\x18\x98\xb6\x20\xc2\x95\xeb\xf5\xff\x58\xcf\x01\x5f\x3f\xa7\x8b\x75\xde\x6d\xcd\x6f\xc8\x08\x81\xf3\xfd\xba\xfe\xa2\xa9\x0b\x07\xcf\x7f\xaa\xb4\xad\x50\xe2\x32\xbf\xb6\x96\xe1\x84\xd3\x39\x15\xb3\x1d\xac\x4d\xd0\xc1\x38\xbf\x49\x33\x91\xb1\x19\x73\x5d\xac\xf6\xc2\x67\xa7\x4c\xdd\x90\x53\x41\x54\xc9\xb8\xf2\x55\x3a\x8c\xd8\xaa\x34\xa1\x0b\xca\x33\xb0\x13\xca\x7b\xc5\xca\x85\x55\xb6\x63\x0d\x2d\xba\x2a\x63\xe3\xb5\xd5\xc8\xf0\x1e\x49\xc2\x75\x6b\x58\x3f\x95\x5d\x0b\x00\xa9\x77\x65\xf6\x5b\x67\xbd\x17\xf9\x16\x55\x0b\x5b\x7f\xde\x6a\xa0\xe8\x16\xf2\x0c\xfc\xfd\x2b\xa3\xa5\xbe\x67\x54\x7f\xe4\xbb\x38\x94\x35\x90\x6e\x7d\xe7\xf4\x72\x35\x40\x3f\x32\x32\x93\xda\xb0\x9d\x15\xc0\x3e\xca\x07\x98\xa2\xde\x03\xda\xa1\x21\xba\x5e\xe5\xc7\x92\x42\x86\x09\x29\x22\x97\xd9\xfe\x70\x7d\x9d\x56\x16\xb1\x90\xa4\xf1\x6d\x32\x2d\x65\x0e\xca\x45\x3c\x3b\x34\x55\xee\x4e\x86\xb1\xd7\x25\xe7\x4c\xa9\x9d\x29\x8e\xdb\x61\x25\xf8\x36\x5e\xe5\x15\x23\x7f\xee\x7e\xc3\x70\x76\x23\x54\xa4\x4c\x53\x9e\xb9\xab\x8c\x5b\xe1\x77\xa9\x0b\xbb\xee\x5c\x60\xc9\xa8\xda\xc5\xd0\xb4\x66\xfd\x01\x5e\xc6\x49\x4b\xc1\xc6\x8f\xb2\x4c\xc9\x25\xcd\x59\x76\x49\x15\xb3\x7d\x35\xf3\xd5\xe0\x19\x9d\xaa\xbd\x4e\x79\xb3\x3a\x74\xcb\x94\x51\xc9\x57\x1b\x14\xe0\xaf\x5a\xa0\xc5\x09\x8e\x9c\x56\xfa\x63\x59\xb1\x11\x79\x6b\xa8\xd7\x88\x7c\x2b\x1e\x84\x7c\x7c\xda\x5c\xf5\x4e\x63\x5d\x6b\xa6\x4d\x0f\x49\x97\xee\xbc\xa5\xd8\xf3\xd3\xed\x39\x23\x8b\xf0\xb7\x68\x9f\xdb\xc4\xc6\xbf\xea\x66\x64\xfe\xb9\xa6\x6a\x34\xa2\x75\x29\x67\x25\x53\x0a\xb5\x38\xd1\xea\xfb\x86\xc1\xe2\xaf\x4c\x58\xfb\x70\xe7\xf4\x6e\x36\x7d\xe5\x66\xea\xe8\xda\xac\xfe\xc5\x9e\xb7\x1d\xac\xc8\x36\xb2\x1a\xbb\x23\x23\x1a\x13\xdd\xa2\x64\xdc\x36\xc3\xcd\xca\xc5\x06\xd5\x6b\xbc\x8b\x4c\xc9\x2e\xcd\xb8\x5b\xdd\xe5\xdd\x77\xdb\x37\x7b\x2b\xed\xeb\xa2\x4f\xdd\xea\xc7\xa7\x2a\x1e\x3b\xef\x4c\xa7\xb2\x31\x94\xd3\x3f\x8e\x82\xf1\x39\x55\x8b\xcf\xab\x54\x3c\xba\x3a\xf1\xa8\x8a\xc4\xe3\xa9\x10\x7b\x2a\x0f\x3b\x2f\xd2\x2e\x85\x61\xe8\x1d\x8a\x53\x12\x3e\xbb\x7a\xb0\x73\x4f\x76\xa9\x04\x43\xf7\x24\x4e\x0d\x78\x6c\x05\x60\xd0\x16\xec\x54\xfa\xc5\xec\x43\xa4\xa2\xef\xc8\x2a\xbe\xce\xbd\x08\x54\xeb\x85\xee\xc8\xe1\x54\x79\x2f\x56\x89\xd7\xb9\xc5\x3b\x14\x77\xa1\xdb\x1a\xa5\xac\x3b\xb2\x9a\xae\x63\xfd\x71\xaa\x39\xcb\x63\xb2\x34\x84\x45\xbf\x69\xbc\xdc\x64\xd2\x2d\x83\x08\x0e\x70\xf6\x0d\xe7\x70\xd7\x64\x25\xfb\x72\xea\x86\x79\xee\xeb\xff\x61\xa7\x1c\xce\x0d\x5b\x16\x9e\xa5\x5e\xa6\xec\x5a\x02\x21\x57\xd7\xb7\x1f\xae\x2f\x2f\x3e\x5e\x5f\xad\x72\xe1\xf1\xec\xf2\x6e\x45\xd1\xb8\xc1\x2e\x6f\x79\xc1\x10\xab\x2d\x3f\x19\xd8\xda\xf2\x53\x55\xf1\x4d\x5f\x3d\x9d\x79\x7f\x12\xcf\xf0\x24\xe2\xda\x8d\x27\xf6\x84\x28\x00\xb6\xd0\x6b\xd5\x70\x95\x73\x99\xa5\xca\xc5\x37\xdc\x5c\xf9\x44\x04\x5c\x24\x59\x95\x1a\x96\xeb\xdb\x6f\x6f\xae\xd4\x84\x90\x2f\x59\x42\x2b\x65\x58\xb7\xed\xe2\xba\x14\xa7\x9a\x7c\xf3\xfe\xeb\x7f\x83\xd0\x2e\xf8\x72\xe4\xd3\xa5\x42\x49\x3f\x4e\xb1\x2a\x21\x2c\x14\x7a\x45\xb6\x0e\x66\x94\xd0\xc2\x60\xe0\xed\x2a\x7f\x8e\xd9\x6b\xa8\x48\xc9\x9c\x65\x85\xa1\x0e\x0f\x8c\xd4\x75\xca\xcc\x80\xf0\x2b\xc6\x6f\x58\x3f\xf6\x19\xd3\x98\x94\x60\x97\xab\xfa\xce\x03\xe8\xd0\xb0\x3f\x41\xb7\xde\x52\x17\x58\xed\xcb\x23\x55\x56\x43\xb9\x71\xb6\x1d\xa0\xd2\xad\x8f\xdb\xae\xd2\xda\xa2\xcc\x42\xca\x02\x7f\xad\xcd\xd9\x4c\xb6\xd6\x5b\xa1\x73\x18\xd7\xc1\xda\xf3\xed\x9e\x80\x9b\x0b\x4f\xaf\xe9\xae\xd8\xea\x26\xb7\x06\xf6\xb1\x40\x8d\x29\x87\xcd\x45\xb1\x72\xc1\xd2\x37\x60\xcf\x71\x8f\xd0\xdb\xb6\xfd\xac\xba\x77\xcc\x4c\x03\xeb\x58\x0d\x1c\xf9\xaf\xff\xfe\xd5\xff\x1f\x00\x00\xff\xff\x20\x58\x67\x59\xb4\x7f\x03\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfd\x77\xe3\xb6\x95\x30\x8e\xff\xde\xbf\x02\xc7\xed\x39\xb6\x5b\x49\x33\xd3\x76\xdb\xee\x3c\xfd\xb6\xc7\xf1\x78\xba\x7e\x92\x99\xf8\x19\x4f\xd2\xb3\xdf\x6c\x76\x03\x93\x90\x84\x9a\x04\x18\x02\x94\x47\xdd\xec\xff\xfe\x39\xb8\x17\x00\x41\x49\x36\x01\x59\x92\x3d\x59\xe2\x87\x64\x4c\x91\x78\xbd\xb8\xef\x2f\xb4\xe2\xdf\xb2\x5a\x71\x29\x5e\x13\x5a\x71\xf6\x49\x33\x61\xfe\x52\x93\xdb\x3f\xa9\x09\x97\x2f\x16\xaf\x7e\x71\xcb\x45\xfe\x9a\x9c\x37\x4a\xcb\xf2\x03\x53\xb2\xa9\x33\xf6\x86\x4d\xb9\xe0\x9a\x4b\xf1\x8b\x92\x69\x9a\x53\x4d\x5f\xff\x82\x10\x2a\x84\xd4\xd4\x3c\x56\xe6\x4f\x42\x32\x29\x74\x2d\x8b\x82\xd5\xe3\x19\x13\x93\xdb\xe6\x86\xdd\x34\xbc\xc8\x59\x0d\x9d\xbb\xa1\x17\x2f\x27\xaf\xfe\x34\x79\xf9\x0b\x42\x04\x2d\xd9\x6b\xa2\x9a\x1b\x95\xd5\xbc\x82\x9e\x26\xb2\x62\x35\xd5\xb2\x56\x93\x4c\xd6\x4c\x9a\xff\x95\xbf\x50\x15\xcb\xcc\x18\xb3\x5a\x36\xd5\x6b\xb2\xf1\x1d\xec\xce\x4d\x85\x6a\x36\x93\x35\x77\x7f\x13\x32\x26\xb2\x28\xe1\xdf\xb8\xc4\xeb\x60\x54\x78\x5c\x70\xa5\xbf\x5c\xfb\xe9\x2b\xae\x34\xfc\x5c\x15\x4d\x4d\x8b\x95\xd9\xc2\x2f\x6a\x2e\x6b\xfd\xbe\x1d\xdb\x8c\xa5\x9a\x9b\xf0\xdf\xf6\x45\x2e\x66\x4d\x41\xeb\x6e\x27\xbf\x20\x44\x65\xb2\x62\xaf\x09\xf4\x51\xd1\x8c\xe5\xbf\x20\xc4\x6e\x97\xed\x73\x4c\x68\x9e\xc3\x11\xd0\xe2\xaa\xe6\x42\xb3\xfa\x5c\x16\x4d\x29\xfc\x98\xe6\x9d\x9c\xf9\x5e\x5f\x93\x8f\x73\x46\x2a\x9a\xdd\xd2\x19\x73\xe3\xdd\xb0\x9c\x68\xe9\x3f\x20\xe4\x1f\x4a\x8a\x2b\xaa\xe7\xaf\xc9\xc4\x6c\xf1\xc4\xec\x60\xf0\x33\x9e\xcf\x15\x76\x12\x3c\xd7\x4b\x33\x5d\xa5\x6b\x2e\x66\x0f\x0d\x9f\x51\x4d\x0b\x39\x23\x08\x46\x64\x2a\x6b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xdc\xcd\xef\x81\x19\xe1\xa7\x6b\x73\xba\x5e\x7d\x1c\x3d\xa5\x39\x15\x82\x15\x44\x4e\x49\x53\xe5\x54\x33\x45\xb4\x6c\xf7\xe7\xe1\xed\xb1\x1f\xaf\xcd\xe6\x7c\xed\xf9\x86\xe9\xe0\xab\x8b\x57\xb4\xa8\xe6\xf4\x95\x7d\xa8\xb2\x39\x2b\x69\x7b\x86\xb2\x62\xe2\xec\xea\xf2\xdb\xdf\x5d\xaf\xfc\x40\xba\x4b\x09\x41\x94\xdc\x32\x56\xa9\xf6\x52\x90\xa6\x32\x6b\x32\x8b\x23\x37\x4b\xa2\x6b\x9a\xdd\x72\x31\x83\xa5\xcf\x70\xbd\xe7\x78\x30\x6a\xb2\x36\x65\x79\xf3\x0f\x96\xe9\xe0\x71\xcd\x7e\x6c\x78\xcd\xf2\x70\x2a\x66\x67\x1d\x26\x58\x79\x6c\xf6\x29\x78\x54\xd5\x66\x5a\x3a\xb8\x87\xd8\x02\x54\xd4\x79\xbe\xb2\xcc\x9f\xc6\x2b\xbf\x12\x62\x76\x07\xbf\x24\xb9\xc1\x4b\x66\x41\x73\xe6\xae\x0b\xcb\xed\x96\x9a\x03\xd6\x73\xae\x48\xcd\xaa\x9a\x29\x26\x10\x53\x99\xc7\x54\xd8\x55\x4e\xd6\x3a\xbf\x66\xb5\xe9\xc8\x5c\xe9\xa6\xc8\x0d\x42\x5b\xb0\x5a\x93\x9a\x65\x72\x26\xf8\x3f\x7d\xef\xb0\x89\x66\xd8\xc2\x40\x90\x26\x70\x21\x05\x2d\xc8\x82\x16\x0d\x1b\x11\x2a\xf2\xb5\xbe\x4b\xba\x24\x35\x33\xe3\x92\x46\x04\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xcd\x08\x17\x53\xf9\x9a\xcc\xb5\xae\xd4\xeb\x17\x2f\x66\x5c\x3b\x54\x9d\xc9\xb2\x6c\x04\xd7\xcb\x17\x80\x75\xf9\x4d\x63\x8e\xfe\x45\xce\x16\xac\x78\xa1\xf8\x6c\x4c\xeb\x6c\xce\x35\xcb\x74\x53\xb3\x17\xb4\xe2\x63\x58\x8c\x40\x24\x5b\xe6\xbf\xac\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc4\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\xdb\x9e\x89\x79\x64\xb6\xf1\xc3\xc5\xf5\x47\xe2\x66\x84\xe7\x86\x47\xd4\xbe\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x6a\xfc\x72\x5a\xcb\x12\x7a\x65\x22\xaf\x24\x17\x1a\xfe\xc8\x0a\xce\x84\x36\x37\xbd\xe4\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x0e\xa4\x8d\xdc\x30\x8b\x23\xf2\xf5\x57\x2e\x05\x39\xa7\x25\x2b\xce\xa9\x62\x07\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xfa\xf4\x42\xc2\xbd\xfe\xc1\xda\xad\x27\xc4\x91\xdc\x7b\x8f\x3b\x44\x41\xd7\x15\xcb\xfc\x75\xa4\x82\x9c\x55\x55\xc1\x33\xbc\x71\x7a\x4e\x35\xc9\xa8\x30\xdb\xc9\x85\xd2\xb4\x28\xd8\xea\xed\xb8\x77\x16\xf7\xe1\x1f\x02\xc8\x66\x85\x5c\xb9\xc7\x6b\x34\xa3\xfb\x83\x27\xb3\x2b\x6f\xdc\x87\xab\x4c\xb3\x98\x7f\xfd\x87\x07\xb6\x9c\x20\x4b\x34\xe5\xb3\x4d\x9f\xdd\xbb\x97\xe7\xf0\x09\x30\x53\x94\x0b\x65\xbb\x68\x6a\xdc\xcd\x96\x76\x1a\x6a\x4a\x3b\x9c\xc4\x3a\x1c\x3e\xb8\xb3\x7d\x6b\x36\x8d\x4e\x81\xf5\x5b\x6e\xfe\xb5\x1f\x01\xb8\x76\x39\x6d\x67\x3e\x22\x72\xc1\xea\x9a\xe7\x16\x75\x57\x32\x3f\x56\x80\x58\xf3\xa6\x00\x42\x25\x85\xd2\x35\xe5\x1b\x2f\xbd\x6b\x82\x17\x66\xf1\x63\xaa\xf1\x06\x31\x45\xee\x78\x51\x90\x5f\x0b\xa9\x7f\xed\x47\x80\x01\x64\xcd\x67\xdc\x63\x67\x45\xb8\x70\xe3\x02\x59\xb7\x7c\x89\x54\x6c\xa5\xc3\xfb\x07\xff\x46\x31\xc2\xca\x4a\x2f\x1d\x9a\x3a\xf9\xef\xff\x39\x35\x34\x81\xd5\x54\x05\x03\x76\xfa\xbb\x17\xd3\x63\xeb\x39\x29\x12\x71\x5a\xb0\x2f\x32\x67\x67\x3d\xa7\x46\x56\x4f\xee\x0d\x43\xf6\x47\xc1\xe7\xfe\xd4\xc3\x43\xa9\x9b\x82\x29\xcf\xc2\x99\xbd\x7b\xa0\xf3\x88\xb5\xc4\xae\x07\xdf\x63\x53\x56\xd7\x2c\x7f\xd3\x98\x5b\x76\xed\x67\x75\x39\x13\xd2\x3f\xbe\xf8\xc4\xb2\x46\x6f\x60\x29\x1e\x5c\xfa\x03\x40\xeb\x9a\xe1\x1b\xed\x4e\xb0\x1a\xa1\x0c\x67\x04\xac\xa3\xfd\xc1\x6c\x09\xb0\x05\x66\x07\x15\x62\x3d\x45\x35\x57\xd3\x65\xef\x00\x66\x47\xfd\x9e\xb3\x4f\x86\xe2\x01\xef\x1f\xdc\x76\xc3\xc8\x01\x71\xe3\xac\xc8\x47\xe4\xa6\xd1\x84\x6b\xa0\x7c\xd9\x5c\x4a\xb5\x8e\xed\x56\x1b\xc5\xa3\x85\x79\x2d\xb8\x04\xc6\x85\x48\x61\x80\x95\x94\x86\x5c\x01\xc3\xc4\xc2\xe1\x27\xb0\xf2\xf6\x33\xbe\x4a\x6d\xd6\x5b\x29\x95\x6e\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x3b\xae\xe7\xf0\xc7\xac\x66\xc8\x34\xa9\xa6\x34\x83\xde\x31\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x66\xf3\x60\x5a\x25\x63\x5a\x11\x5a\x14\x6e\x09\x21\xd4\x22\xf5\x28\x0d\x03\x41\x4e\x1c\x87\xd1\x3b\x8a\xe5\x0e\x46\x9e\xfa\xac\x02\xde\xc6\xe3\x1a\x11\xa6\xb3\xc9\xe9\xa8\xb7\xfb\x4c\x96\x95\x41\x08\x14\xf6\xe0\x66\x49\xb8\x36\xbc\x3b\x72\x43\xb5\x6c\x66\xb8\x53\xac\xb0\x13\x77\xbc\x2c\x1c\xbe\x61\x2e\x41\x1a\xdc\x40\x6e\x56\xdb\x11\x6e\xee\x91\x63\x57\xcd\x70\x1c\x37\x09\xf6\xaf\xa4\x3a\x9b\x5b\x34\x9c\xc9\xba\x66\xaa\x92\xc2\xf4\x8c\xbf\x5c\xb4\x6b\xfb\x3f\xe6\x9d\xde\xf1\x4c\xa7\x27\xea\xb4\x3d\xec\x39\x9f\xcd\xdd\x59\xd3\x1a\xd1\x71\x17\x46\xfa\x8e\x1c\x51\x09\xad\x6b\xda\x77\x8f\xb8\x66\x65\x0f\x22\x21\x5b\xdc\x7e\x42\xce\x84\x45\xf6\x2d\x60\x07\x20\xa6\x59\x5d\xfa\x8d\x04\x28\x04\xb4\xa7\x70\x13\x78\x69\x38\x21\xae\x2d\x98\x93\x97\x11\xe3\x9d\x98\x9b\x40\xb8\x3e\x56\x70\x6b\xc7\xb2\x3a\x9d\x90\x33\x22\x1a\x8f\x78\x1e\x9a\x82\x90\x7e\x06\xb6\x23\x33\x2d\x25\xdb\xbe\xfa\xf1\x51\x1c\xfa\xc6\x76\x3f\x83\xb6\xde\xc6\x76\xfe\x4c\x44\x5c\x42\xf3\x3a\xee\x5a\xef\xab\xb1\x84\xc4\xbd\xed\xe6\x10\xf3\xf6\x0a\xc4\x9c\xe1\xcd\x51\xac\x60\x99\x36\xd4\x90\xd5\xe5\x88\x50\xa5\x64\xc6\x8d\xa8\xd0\xc2\x7e\xf7\x42\xe1\x4a\xfa\xf7\x9e\xa4\xee\x3f\x49\x5e\x3f\x01\x69\xb4\x7b\xbf\x63\xbf\x5b\xdb\x8d\x82\x2b\x6d\x10\x54\x77\x57\x3a\x78\xf7\x66\x09\xbf\x1e\x2b\x52\xd0\x1b\x56\x3c\xc0\x57\xad\xb6\xf8\xcb\xdf\xb6\x48\x34\x70\xcf\x82\xa2\x10\x42\xdb\x56\xa1\x21\x58\xb7\x95\x7b\x3d\x9c\x80\x18\xe4\x98\x7a\x64\x05\x47\x84\x92\x5b\xb6\x1c\x21\x4a\x17\x5e\x85\x93\x34\x05\xe8\xb8\x66\x48\xd0\x0d\xdc\xdd\xb2\x25\x74\xf8\x30\xbb\xb9\xb1\xab\x54\xb8\xc3\x96\x82\x01\xda\x36\x36\x13\x4d\xfc\x62\x8b\x0d\x4a\xbf\x1a\xd8\x6e\xd9\x83\xec\xf3\xa6\xb6\xa6\x6c\x04\x70\x87\xf3\x80\x43\x02\x0a\xec\xe0\x81\x1a\x11\x99\x6d\xd6\x3f\x3c\xdc\x1e\x14\x38\x1f\x6a\x6e\xf7\x1e\xb5\xae\xc4\x0b\x62\xda\x07\xaf\xc3\x41\x78\x3f\x56\x08\xaf\x06\xef\xcc\x39\x28\x2b\xcd\x45\x01\x34\x92\x0e\xb4\xd8\xbe\xa5\x05\xcf\x03\x1d\xa8\x61\x36\x2e\xc5\x88\xbc\x97\xda\xfc\xef\xe2\x13\x57\x86\xc7\x7c\x23\x99\x7a\x2f\x35\xfc\x39\x21\x7f\xd3\x78\xf5\xbe\x8a\xc4\xcb\x6d\xdb\xfa\x0c\x70\x7d\x87\x3e\x81\x33\x81\x48\xd4\xec\x70\xa8\x89\x53\x13\x23\x99\x03\x8b\x6e\x77\xce\x60\xad\x4b\x61\x84\x02\xdc\xb9\xe4\xa1\x40\x19\x8b\x72\x36\x0e\x59\x36\x0a\x54\x69\x42\x8a\x31\xb0\x51\x1b\xc7\xc4\x03\x32\xe3\x86\x47\xb4\xc3\xe1\xef\x1f\xfa\x6f\xda\x0c\xfb\x95\x1e\x05\x1f\x27\x8f\x1b\x0c\x36\xa7\x0b\x60\xed\xb9\x98\x15\x9e\x89\x1f\x91\xbb\x39\xcf\xe6\x28\x3d\x82\x26\x4c\xb3\xba\xaa\x99\xe1\x18\x28\xe8\xcc\xcc\x93\x19\xab\xd3\x41\xff\xa3\x11\x0d\x70\x7c\xd4\x77\x17\x34\x63\x39\xc9\x41\x64\x41\xd5\x2b\xd5\x6c\xc6\x33\x52\xb2\x7a\xc6\x48\x65\x48\xff\x76\x00\x9f\x46\x89\xb1\x25\xd3\xe3\x70\xc0\x2d\x6e\x18\x21\x9f\xc6\xb7\xcd\x0d\xab\x05\xd3\x4c\x8d\x0d\x7f\x32\xb6\xb3\xd7\xb2\xe4\x59\x74\x67\x3b\xe9\x06\xf8\xac\xb7\x46\x6e\x3b\x10\x8b\x05\x32\xe2\xc0\x62\x0d\x2c\xd6\xc0\x62\x0d\x2c\xd6\xc0\x62\x45\xb7\x81\xc5\x7a\xf4\xf0\x03\x8b\x35\xb0\x58\x07\x67\xb1\x3a\x5d\x94\xb4\x4a\xed\x01\xf5\x72\x5b\x28\x02\xff\x8e\x0a\xdd\x55\xcd\x1f\x30\x7c\xce\xaf\xa1\xab\x02\x34\x7c\xcc\xb5\x25\x4e\x1f\x41\x6d\x68\x2d\x91\x35\x15\x33\x46\x5e\x8d\x5f\xbd\x7c\x99\xa2\x20\xb4\xe0\x1c\xf5\xc5\x54\xd6\x25\xd5\xf0\xcd\xef\x7e\xdb\xf3\xc5\x23\x4e\xe5\x3e\x7b\xc9\x61\x0c\x75\x16\xf3\x78\xdb\x4c\x87\x45\xbe\xc7\x96\x06\x64\x4c\x48\x4d\x4a\xa6\x09\xed\xe7\xc9\x42\xb5\x3b\x2f\xd9\xc8\x99\x43\x11\xed\x58\xb7\x11\x67\x14\xcc\x89\x14\xd6\xf4\x62\x0e\xbf\xff\x70\xb7\x5a\x41\xc6\xa8\x62\x86\xc4\xdf\x30\xb3\x8a\x7e\x53\xa0\x26\x4a\x96\x66\xd6\x5c\x68\x87\xc4\xcc\x12\x98\x3b\x18\x72\xc2\x26\xb3\x09\xc9\x1b\xe8\x96\x0a\xeb\x07\x73\x8a\xab\x55\x4b\xa5\x59\xd9\x6f\x0b\x34\xc4\xb0\x86\xff\x99\x6d\xd1\xf5\x12\x2c\xe4\x0b\x26\x74\x43\x8b\x62\x49\xd8\x82\x67\xda\xef\x1f\xb8\xed\x70\xad\xa2\x76\x2a\x81\x8d\x8e\x67\x9d\xc7\x6b\x37\xb4\x8f\x48\xa5\x70\xbe\x6b\x7d\xc7\xe0\x9c\xce\x0d\xf8\x60\x57\x32\xb9\x57\x26\xd4\xa6\x5f\x34\xdb\xc2\x3f\x01\xb8\xbf\xfe\xd0\x6f\x65\x23\xc9\xf4\x27\x81\xe6\x6c\xc7\x5a\x59\x83\x97\xac\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xce\xad\x91\xd3\xc8\x01\xf5\x9c\xa1\x91\xf2\xec\xfd\x9b\xb8\x1d\x23\xd6\x39\xe0\xa3\xac\x64\x21\x67\xcb\xf0\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb8\x36\xe8\x2d\x1e\x3d\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x7f\x1b\x58\xac\x07\xdb\xc0\x62\xf9\x36\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x87\xea\xe6\xb1\xa6\xa1\x47\x4d\x61\xbb\xc1\x2b\x99\x3f\x22\x78\xab\x92\xf9\x03\xb1\x5b\xa8\xd3\xcf\xe4\xb8\x90\x19\xd5\x36\xcc\xd6\x7c\x62\xad\x50\x8a\x96\x68\xa6\x18\x91\x7f\x4a\xc1\x30\x9a\xc5\x5c\x0f\x30\x16\x48\x3d\x67\xb5\x79\xfd\x44\x9d\x3e\x18\x42\x30\xc4\x7e\x0d\xb1\x5f\x43\xec\xd7\xbd\xed\xd9\xc4\x7e\xcd\xa9\x42\xb8\x45\xd2\x78\x7f\x28\x58\x80\x93\x3e\xb2\xba\xfc\x99\x46\x82\x19\x70\xb7\xe0\x08\x49\x22\x5a\x90\xc2\x9d\xc9\xad\xc1\x9f\xe5\x57\xdd\xfd\xb0\x62\x35\x2c\x8a\xe6\x39\xcb\x49\xc5\xea\x31\x82\xa8\x24\x53\x2e\xf2\x0d\x6b\x75\xfb\xd3\x8f\x1e\xf6\x18\x8a\xd5\x5d\x47\xd4\x37\xfb\x89\xc7\xea\x4e\x64\x0b\xa3\x62\x68\x19\xed\x10\xc1\x67\x11\x9d\x95\x2a\xa1\x8f\x89\xb6\x06\xc5\x2f\x23\x65\xf4\x74\x31\x1b\x84\x63\x67\x7e\xdc\x52\xfd\x94\x24\x0a\x9d\x59\x79\xfc\xc7\x86\xd5\x4b\x88\xcf\x6f\xc5\x4e\x9f\x8b\xc4\x7a\xc4\x70\x45\x32\xaa\x90\xac\xa6\xb0\xca\x97\x53\x8c\x9a\x14\x4d\x51\x8c\xb0\x9f\xd5\xcb\xea\xd0\x1c\xc0\x81\x90\xe6\xf7\x64\x8d\x58\xa2\x8a\x66\x3b\x1d\xc8\xf6\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\x93\xed\xe3\xd8\xb6\x15\x60\xb6\x12\x5f\x1e\x2d\xaf\x3f\xb0\x27\x8f\xd0\x2b\xc2\xcb\xc9\x93\xd9\x8d\x6e\x91\x6c\xaf\x5f\x24\x5b\xeb\x18\xc9\x56\x7a\x46\xb2\xad\xae\x91\x3c\x42\xdf\x48\xb6\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xfd\xa8\x1f\xc9\xe3\x84\xf3\xed\xd5\x90\x64\x07\x17\x2b\x1c\x3f\xc8\xec\xb4\x3f\xbd\x24\x89\xd5\x4d\xc2\xb5\xea\xa8\x27\x0f\x7d\x2e\xdb\xa9\x26\xc9\x8e\x4e\xc5\x65\xc6\x01\x5d\xd8\xa1\x94\x95\xe4\xe9\x15\x96\x0f\x4e\xc1\x0e\x1f\xad\xe1\xdb\x6a\xf4\x47\x68\x05\xc9\xa3\x34\x83\x64\x7b\xed\x20\x79\x2c\xb0\xef\x4c\x4b\xb8\xd3\xae\x80\x4f\xfa\x0a\xfc\xd0\x1e\xc1\x6d\x25\xdf\xc0\x60\x58\xe4\x2e\x4a\x5a\x99\xdb\xf7\xdf\x86\x89\x00\xc0\xfc\x1f\x52\x51\x5e\x2b\x23\xdd\x58\xbd\x76\xf8\x9b\x55\xdf\x05\xdd\x24\x4f\xa0\x32\x03\x1b\x1a\xbf\xa0\x85\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\xb9\x83\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\x74\xcb\x96\x47\xa3\x28\xf5\x40\xb7\x85\x37\xfb\xe8\x52\x1c\x21\xeb\xb4\x76\x2f\x3d\x9f\x25\x45\xb1\x24\x47\xf0\xdb\xd1\xae\x79\xd4\x2d\xf8\xa3\x30\x35\xeb\xb6\xec\xc7\x56\xd7\xe9\xb1\x0a\x6e\xd2\x81\xbe\x2f\xd9\x72\x5b\x47\x84\x24\x98\x7f\xd7\x19\xd1\x31\xd4\x00\x66\x46\x76\xf7\x7c\x13\x66\x66\x05\x96\xc9\xea\xa8\x50\x5d\xc5\x8b\x22\x61\xb4\x1b\x46\x34\xbd\x65\x60\xe1\x91\x90\x5a\x8e\xe7\x0c\x93\xe9\x21\xe8\xc0\x48\x06\x64\x1a\x05\xe9\x71\x49\x21\xe5\x6d\x53\x39\xd0\x73\xd9\x24\x13\x86\xe4\x22\x93\xa5\xf3\xa9\x47\xbf\xd6\x91\x4d\x30\x77\xcb\x96\x63\xcc\x81\x89\xcf\x61\x60\x20\x01\x56\x35\xf1\x43\x47\x30\xff\x81\x50\x45\x7e\x00\xa6\x52\x90\x13\xf8\xf0\xf4\x87\x14\x97\x02\xbf\x81\xa8\x7d\x95\x0d\x60\x16\x66\x88\xa5\x9d\xa0\x5a\xdd\xdb\x87\x76\x2c\x61\x68\x97\x29\x2e\xdc\x8c\x63\xb4\x37\x9c\x50\xa1\xf9\xa9\x57\xd2\x4c\x08\xc0\x01\x70\xc9\xb9\x14\xc7\x1a\xe7\xe7\xf0\x9a\xeb\x20\xc5\xeb\xc0\xef\x7b\x6b\xf1\x43\x6b\x01\x1e\x79\xce\xa6\xb4\x29\xb4\xcd\x46\x6a\x50\x1f\x50\xfa\x84\x11\x3e\x3a\x7b\x89\x65\xf8\xa7\xb2\xbe\xe1\x79\xce\x04\x84\x38\xb8\xe9\xdf\x48\x17\x10\xd4\x82\xbb\xc1\x6c\x9d\x33\x4e\x19\xf6\xac\x50\x72\xb4\xda\x63\xe6\xb3\x95\x9a\x5b\x74\x37\x67\xa2\x3b\x00\xe1\xca\x6c\xaa\x62\x09\x4c\xed\x41\x5c\x7f\x1e\x8f\xf3\xb6\x76\xbd\xe2\xea\x09\xf0\xde\xea\xa0\x03\xea\x8b\x42\x7d\x42\xea\x01\xfb\x7d\xb6\xd8\x6f\x0d\xe8\x77\x81\x00\xd7\x3a\x1d\x70\x60\x32\x0e\x14\x2e\x0d\xf2\x13\x5b\x01\x50\x31\x86\x5e\xac\x6e\x4a\xaa\xd5\x99\x41\xa0\xd7\x76\xfa\x32\x17\x06\x07\x78\x16\x7a\xc8\x9d\x31\xb4\x11\x36\x19\x3c\x98\x43\xdb\x61\x11\x5f\xac\xda\xdc\x13\xc6\x74\x82\x8b\x14\x4c\x81\x8a\x9d\x79\xff\x8a\x60\x18\xe8\x35\x65\x29\x10\x0a\xd7\xaa\x0f\x45\xbe\x1a\x1c\xd7\xf6\x0d\x7a\xfd\x92\x51\xa1\xc8\x91\x73\xf1\x38\x56\xed\x1b\x47\x49\xf7\xcd\xa5\xbe\xf4\x63\x43\xa6\xe3\x30\xdd\x65\x3b\xf4\x60\x47\x19\xec\x28\x61\x1b\xec\x28\xeb\x93\x18\xec\x28\xf7\xb5\xc1\x8e\xb2\xd5\xf8\x83\x1d\xa5\xdb\x06\x3b\xca\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xd8\x8f\x76\x61\x47\x69\xc5\xa0\x43\xc8\xd1\xa1\xc8\x6a\xfd\xc4\xb1\xca\x16\xd5\x3c\x6b\xa3\x42\xdd\x5b\xf8\xaf\xa7\x12\xaa\x43\x31\xf8\xb1\x22\x75\x28\xa0\xaf\x69\x30\x92\x25\xea\x7b\xe5\x67\x2f\x61\xaf\x8d\xb1\x23\xd1\xfa\x67\xae\x5c\x0a\x1c\x58\x0f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x86\xb5\x71\x2e\x39\x39\x71\xba\xd6\x53\x73\xe0\x42\xea\xee\x8f\x42\xf3\x71\xfb\x86\x77\x10\x06\x95\xb0\xcb\xe6\x96\xb2\xe9\x4e\x66\x69\x75\x8f\x62\xa5\xec\x65\x0b\x6d\x06\xff\xb3\xba\x33\x5b\xae\x6c\x25\x35\x08\x4d\xab\x1b\x21\x0c\x7b\x24\x85\x8d\xe2\x48\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xf6\x98\x82\x00\x00\xaa\xb1\x4c\xa2\xcd\xb9\x24\x85\x55\x92\x9b\x27\xd8\x4f\xc2\x24\xfc\x85\x85\xfd\xe4\x7e\x45\x29\x77\xf5\x02\xee\x68\x38\x59\xae\xe0\x1c\x69\x51\xc8\xbb\x14\xfa\x94\x78\x23\xb6\x4e\x0e\x18\x0d\xbd\x77\xc9\x59\x04\x57\xbc\xe5\x63\x79\xf5\x21\xd5\xe0\x83\x6d\x48\x35\xf8\x3c\x52\x0d\x06\x76\xd0\x30\xe7\x60\xff\x5e\x41\x4e\xc2\xbd\xe6\x1c\x24\xe4\xef\x73\x06\xb7\xa8\x66\x68\xbc\x6c\x0a\xcd\xab\x36\xca\x58\xe1\x09\x15\x28\x52\x4f\x6d\x34\x60\xf7\xf6\x9a\xd9\xd0\x6c\xde\x3b\xd4\xca\x2d\x87\xf1\x20\x6a\x59\x01\x36\xc5\x88\x39\xd0\xbf\x63\xa2\x3f\x27\x6b\x63\xd8\x21\x7f\xea\x68\xaa\x28\xfc\xf7\xc6\x15\x0c\x0d\x6c\xe0\x8a\x9c\x18\xea\x58\x2c\xad\xd5\xb8\x83\x08\x3b\x64\x35\x62\x00\xd4\x83\x2d\x98\x63\x50\x67\x7c\xc1\x44\x4b\x7d\x4f\xd4\xe9\xa9\xe3\x89\x57\xf9\x87\x88\xde\x1f\xc3\x61\xc4\x60\xed\x54\xce\x60\x85\xde\x47\x8c\xb0\x81\x23\xf8\x73\x40\x65\xff\xd2\xcf\x13\x44\x0c\x82\x57\xda\x85\x67\x06\x07\xdd\xf2\x02\xbd\xbd\xec\x31\x0a\x2e\x25\xd4\x2a\x4d\x2b\xbe\x45\x88\xd5\xb6\x99\x32\xf7\x1b\x5a\xb5\xd7\xb0\xaa\xcf\x27\xa1\xe5\x13\x9b\xff\x3e\x83\x6c\x4c\xcf\xc4\xdc\x37\xa4\x63\xba\xaf\x3d\x55\x3a\xa6\xbd\x9b\xf3\x3e\xbb\xac\x4c\x07\x35\xdf\x1d\xc6\x74\xf7\x99\x65\x65\x7a\x12\x53\xdd\x33\xcf\xcf\xb4\x3f\x13\xdd\x90\xfc\xe8\x69\xf2\x4b\xa6\x9a\xe1\xb6\xbf\x55\x4f\x6a\x7e\x7b\x52\xd3\xdb\xd3\x9b\xdd\xb6\xe2\x55\x1e\x6b\x6e\x4b\xbe\x26\x8f\x35\xb3\x6d\xe3\xb2\xbf\x1d\x3c\x1f\x2e\x44\xe9\xc0\x3e\xfa\xcf\x23\x34\xe9\x89\x1c\xf3\x9f\xca\x29\x7f\xbf\x0e\xf9\x4f\x10\x8a\x74\x90\x30\xa4\x54\xb2\x9f\x44\xec\x1f\x87\xbb\xb6\xa1\xc8\x5b\x86\x1c\x6d\x89\xbf\x0e\x19\x6a\xf4\x33\x40\x61\x5b\x85\x18\x0d\x58\xec\x89\xb0\xd8\xee\x42\x8a\x0e\x15\x4e\xf4\x33\xc3\x65\x5b\x86\x0e\xed\x4c\xbb\xbd\x9f\x90\xa1\x43\x87\x0b\xed\x21\x54\xe8\x29\xc2\x84\xf6\x10\x22\x34\xd8\x04\x22\xdb\x60\x13\x88\x6d\x83\x4d\xe0\xbe\x36\xd8\x04\x56\xdb\x60\x13\x18\x6c\x02\x83\x4d\x60\xb0\x09\xac\x0f\x38\xd8\x04\x06\x9b\x40\x5c\x1b\x6c\x02\x87\xb1\x09\xa4\x86\xdd\x6c\x07\xcb\x4f\x13\x6e\x73\xd8\x50\x9b\xdd\x87\xd9\x3c\x61\x88\xcd\xcf\x4c\xe1\x92\x1c\x4e\xb3\x1d\x98\x3f\x97\x30\x9a\xe7\x11\x42\xf3\xe4\xe1\x33\x8f\x0d\x9d\xd9\x4d\xd8\x4c\x02\xb4\x6f\x09\xe7\x95\xcc\xcf\x84\xe6\x8f\x2d\x7c\x14\x02\xe0\x7d\xd5\x8f\xe8\x42\xf2\x9c\x54\x8d\xb6\x05\x57\x86\x0a\x48\xbd\x30\x70\x98\x0a\x48\x9d\xc3\x1b\xca\x20\x3d\xd4\x9e\x4d\x19\xa4\xfb\xce\xec\x80\xb5\x90\x54\x73\xa3\x6b\x9a\xe9\xa4\x82\x48\xce\xe0\x38\x94\x44\x5a\x6b\x43\x49\xa4\xa1\x24\xd2\x50\x12\x69\x28\x89\x34\xa4\xf2\x1b\x52\xf9\x85\xed\xd9\xd8\xf1\xc8\x90\xca\x2f\xf1\xd3\x21\x95\x5f\x5f\x1b\x52\xf9\x0d\xa9\xfc\xee\x1b\x7d\x48\xe5\x37\xa4\xf2\x4b\x1b\x78\x48\xe5\x47\x86\x54\x7e\x43\x2a\xbf\xcf\x38\x95\xdf\x50\x12\xe9\xb3\xa8\x0b\x32\x14\x05\x49\x18\xfb\x79\x15\x05\x19\x4a\x22\x3d\x38\xc8\x50\x12\x69\x40\x7d\x43\x49\xa4\x9f\x2d\xf6\x1b\x4a\x22\x45\x0c\x32\x94\x44\x1a\x4a\x22\x3d\xd8\x86\x92\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x92\xfa\xd5\x60\x47\xb9\xbf\x0d\x76\x94\x94\x36\xd8\x51\xa2\x47\x1f\xec\x28\x83\x1d\x25\x6d\xe0\xc1\x8e\x42\x06\x3b\xca\x60\x47\xf9\x8c\xed\x28\x43\x49\xa4\xa1\x24\xd2\x50\x12\xc9\x8f\x3c\x94\x44\x1a\x4a\x22\x41\x1b\x4a\x22\x45\x8c\x30\x94\x44\xfa\x5c\x4b\x22\x75\xc2\x82\x3e\xdf\xba\x48\xe9\xcb\x18\x8a\x23\x0d\xc5\x91\xee\x69\x43\x71\xa4\xa1\x38\xd2\xa6\x36\x14\x47\x1a\x8a\x23\x3d\xd0\x86\x44\x88\x91\x6d\x48\x84\x18\xdb\x86\x44\x88\xf7\xb5\x21\x11\xe2\x6a\x1b\x12\x21\x0e\x89\x10\x87\x44\x88\x43\x22\xc4\xf5\x01\x87\x44\x88\x43\x22\xc4\xb8\xf6\xf4\x06\xb8\xff\x1d\x89\x10\x87\xe2\x48\xcf\xb2\xb2\xc8\x50\x56\xa4\xa7\x3d\x9f\xb2\x22\x43\x71\xa4\x4e\xe7\x43\x71\xa4\x01\x85\x0d\xc5\x91\x3e\x3b\x2c\x36\x14\x47\xda\xd0\xf9\x50\x1c\x69\x28\x8e\x34\x14\x47\x1a\x6c\x02\xbd\x6d\xb0\x09\x0c\x36\x81\xb0\x0d\x36\x81\xd5\x36\xd8\x04\x06\x9b\xc0\x60\x13\x18\x6c\x02\xeb\x03\x0e\x36\x81\xc1\x26\x10\xd7\x06\x9b\xc0\x50\x1c\x69\x28\x8e\x34\x14\x47\x82\x36\x14\x47\x1a\x8a\x23\x0d\xc5\x91\x36\x7e\x0c\x8a\x56\x94\x6c\xee\x83\xec\x58\x58\x3e\x6b\xbb\xb2\x1c\x7c\x23\x94\xae\x9b\x4c\x37\x35\xcb\xe1\xc0\xf0\x30\x0d\x63\xa0\xb4\xac\x9d\x55\x00\x2a\xcd\xbc\x61\x55\x21\x97\x86\xda\x8e\xc8\x95\xcc\x47\xe4\xec\xea\xf2\x9a\xd5\x0b\x9e\x31\x07\x7d\x5f\x5b\x9a\x7e\xff\xbe\x7d\x5c\x56\x3c\xa3\x45\x01\x1a\x8b\x76\x36\x25\x5d\x3a\x5d\xf2\xcd\x92\xb0\x4f\x9a\xd5\x82\x16\x44\x4b\x59\xa0\xf9\xc5\x4c\x06\x10\x62\xcd\x74\xcd\xd9\x82\x11\x5a\xdf\x70\x5d\xd3\x7a\x49\x4a\xa6\x69\x4e\x35\xbd\x7f\xd4\x6f\x14\x0b\x63\x34\xb4\x24\x55\xcd\xc6\x78\x03\x3a\xf3\x00\xd8\xfc\xfa\xab\x77\xee\x7e\xd3\x3c\x77\x01\x09\x0e\xc2\xaf\x9b\x1b\xbf\xdb\xc7\xf7\x73\x5b\xb9\xdf\x2d\x35\x02\xf0\xb4\x2a\x9a\x8a\x2b\xdc\xb3\x7b\x25\xd2\x08\xb6\x24\x8d\x09\xe9\x85\x4f\x26\x16\x8f\x05\xad\x0b\xb1\xe8\x6a\xf6\x98\x58\xf0\x5a\x0a\xe0\x23\x17\xb4\xe6\xf4\xa6\x60\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x0f\xc0\xcb\xb9\xb7\x33\x60\xb0\xcb\xbd\x57\xb2\x9f\x9e\xf5\x50\xb0\xce\x4a\x2f\xc4\xe2\x5b\xda\x55\x33\x88\x8d\x4b\x22\xf6\x05\xb3\x24\x4a\xce\xfb\x17\x14\xc5\x74\xc6\xa8\xc3\xc6\x80\xe1\xef\x7d\x21\x4e\x69\x65\xba\x78\x98\x5e\xa6\xd1\xc9\xf7\xb4\x6c\x2b\x68\x6d\xd8\xae\x3e\x84\xfa\x0e\x39\x7e\x65\x81\xc8\x10\x84\xaa\xe6\x42\xc3\x56\x9f\x5d\x9f\x5f\x5e\x92\x6c\x4e\x6b\x9a\x69\x56\x2b\xc2\x3e\x65\xac\xd2\xe4\xf8\xff\x77\xfc\x70\xbf\x91\x08\x1a\x70\xdf\x2e\x77\xe3\x5b\x07\x24\x50\xde\x88\x09\xc3\xd9\xfd\xea\xe4\xdb\xb3\x0f\xff\xf5\xfe\xec\xdd\xc5\x29\xc8\x2c\xec\x53\x45\x45\xce\xfa\x78\xd0\x46\xb9\x10\x9f\xaa\x66\x0b\x2e\x1b\x55\x2c\x3d\x09\xdf\x7c\xd7\x56\x2f\x99\xc1\x3f\x3d\xa3\x98\xfd\xb6\xe8\x69\x73\xa7\xa0\x67\xa1\x2d\xf4\xb7\x66\xc0\x9a\x29\x59\x2c\x58\xde\xa7\x5e\x81\x60\x4b\xb7\x1d\xad\xa1\xb5\x6a\xb4\xd3\x22\x39\xdb\x69\x23\xb2\x39\x15\x33\x96\x4f\xc8\x1b\xd9\x98\xd1\x7e\xf5\x2b\xd8\xb2\x9a\xe5\x4d\xd6\xbb\x63\xa8\x02\x44\x89\xf9\x57\x23\xc7\x61\x18\xba\xae\xb0\x7a\x9a\xca\x68\xe5\x36\x35\x3c\x15\xb5\x14\x9a\x7e\x7a\x1d\x53\x87\xed\xe8\x57\xc1\x87\x47\xae\x2e\x9e\x34\xd3\x43\x6e\x0c\x57\x54\x40\x49\xb3\x82\x1c\x85\x6f\xf7\xf5\x7d\x61\xe6\xc7\xf2\x10\x76\x30\xb4\x91\x2d\x58\x0d\xda\x27\x0b\x39\x23\x52\xb3\x19\xad\xf3\x82\x29\x08\xaa\xbb\x9b\x33\x28\x52\x88\xa2\x34\x1e\x54\xcf\x58\xcc\x6b\xca\x84\xec\xd5\x60\xbe\x41\x33\x36\x20\xf3\xa3\x9e\x65\xa4\xdc\xbc\xb7\xb5\xec\xa9\x71\xd5\xb9\x7d\xd7\x10\xb5\xe3\x8d\xfd\x9b\xc0\xf5\xd8\x5a\x49\x26\x21\x19\x51\x86\xfd\x9d\xb6\x46\x78\xf3\x3c\xc2\x10\x1f\xad\x2c\x88\xb7\x16\x64\x52\x4c\xf9\xec\x1d\xad\xbe\x64\xcb\x0f\x6c\x9a\x18\x40\x88\x9c\xbf\xd5\x7f\x03\xb2\x34\xe4\x07\x3b\xec\xe7\x5b\xf7\x18\x2f\x16\x63\x93\x49\x33\xa9\x44\x1b\x52\xd6\x2a\xd7\xa1\x0c\x62\xe5\x84\x9d\x73\xf3\x24\x8a\x82\x6e\x9c\x5c\xb4\xc4\x19\x52\x54\x8b\x0a\xa2\x6d\x0c\x1f\x5b\x96\x97\x2b\xc2\xa6\x53\x96\x69\xbe\x60\x85\x0f\x65\xb6\x15\x34\x6d\x68\xf1\x0d\xcd\x6e\xef\x68\x9d\x2b\xa8\xc9\x48\x35\xbf\xe1\x05\xd7\xcb\x98\x7a\x97\xd8\xac\xd4\x64\xa3\x9f\x9d\x62\x5e\x28\x4d\x01\x7d\xb9\xca\x8d\x66\x87\x51\xae\xa0\xce\x32\x8e\xb7\xd1\xc5\x0d\x47\x0f\x07\xc5\x03\x33\x56\x1b\x02\x57\x2c\xc9\x5d\x2d\xe3\x65\xbf\x77\x12\x02\x86\xa7\xf2\x35\x99\x6b\x5d\xa9\xd7\x2f\x5e\xb4\xb2\xd9\x84\xcb\x17\xb9\xcc\xd4\x8b\x4c\x0a\xc3\x63\xa8\x17\x72\x61\xe8\x22\xbb\x7b\x71\x27\xeb\x5b\x2e\x66\x63\xb3\x80\x31\x5e\x20\xf5\x02\x84\xed\x17\xbf\x84\xff\xed\x03\xca\x88\x73\x1e\x7a\x4d\x8e\x8e\x22\xde\x97\x15\x8a\x07\x5b\x40\xe6\x35\x68\x10\x96\x1d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x0a\x62\xb9\x90\x84\x65\xdf\x48\x59\x30\xda\xef\xce\xf5\x18\xd5\x27\x80\x7d\x3a\x56\x8d\xba\x97\x2d\xea\xc5\xcb\x65\xaf\x67\x25\xf3\xd7\x44\x35\x55\x25\x6b\xad\x5a\xa9\xd4\x00\xc5\xa8\xfb\x27\xe8\x65\x46\xe4\x07\xff\x10\xdd\xc6\xbe\x3b\xfe\xf3\x97\x17\xff\xfe\x97\xe3\xef\x7f\x08\x7f\x0b\xe4\xd3\xe0\x85\x88\x69\xaa\x8a\x65\x13\x21\x73\xf6\x1e\x66\x00\x7f\x5a\xee\xee\x2c\xcb\x64\x23\xb4\xfd\x41\x53\xdd\xa8\xc9\x5c\x2a\x7d\x79\xe5\xff\xac\x64\xbe\xfa\x57\x84\x11\x75\x8f\x74\x05\xf6\xfa\x8a\xea\x88\xd4\x00\x49\xd4\x85\x56\xfc\x5b\x56\xab\x88\x64\x18\xd8\x3a\xf0\x62\xbf\x0c\x4b\xee\x96\x14\xfe\xf9\xd6\x4d\xd7\xe0\xde\xbb\x9a\x6b\x0d\x3e\x8d\x36\x1b\x81\x9c\x8e\xdc\x95\x46\x46\x6a\xf1\x2a\x49\x71\x1b\x8d\x39\xfc\xae\x6d\xb1\x38\x98\xbd\x5d\x99\xd7\x9c\x58\x8f\xce\x35\x7d\xe3\xd9\xd5\x25\x59\xe0\x6e\xec\x61\x21\x8f\x43\x05\x05\xdb\x8a\xc5\x8a\x42\x06\x6f\x7d\xef\x76\x6b\x02\x96\xcc\x32\xa6\x30\x83\x98\x4d\xb1\xf5\x5a\xd1\xe7\xe3\x42\x2c\x4c\xdf\x8a\x4c\x19\xd5\x4d\xcd\xc8\x8c\x6a\x97\x59\x84\x09\xc3\xdf\x46\xe8\x27\x9f\x98\xcf\x83\x7a\xba\x31\x57\xd6\xbc\xb8\x90\x45\x53\x02\xb2\x7a\x16\xfc\x63\x82\x51\x00\x19\x4d\xc3\x11\xd8\x6b\xe1\x0f\x9d\x9c\x99\x4b\xbf\x00\x57\x12\x7c\x07\x4b\xa7\x2f\xc0\xda\x1a\x26\x59\x51\x9a\xd6\x3a\x41\x77\xed\xfd\xc6\x9d\x16\xc0\x0e\x4f\x09\xe6\x33\xc0\xa2\xe8\x3b\xd7\xa5\xb4\x0d\x33\x09\x91\xb3\xa2\x9a\x83\xa1\x6f\xe6\xf9\xd4\x8d\x90\x3b\xf2\x9e\x65\x8a\xff\x13\x24\xaf\x82\x97\x5c\x23\xbb\xf8\xea\xb7\x7f\x0a\x26\xb3\x17\x44\xf8\x08\x96\x28\x1a\x12\x36\xf1\x4e\x06\x0c\x1e\x60\x9b\xbc\xe7\x8a\x7b\x2f\xde\xa5\x2d\x97\xcc\x8a\xaf\xe0\xd7\x62\x7a\x69\xa1\x6f\x41\x6b\x27\xdd\x56\xcd\x4d\xc1\xd5\x3c\xde\x34\x7e\x39\xf5\xbb\x65\xfa\x50\x0c\x1c\x03\x74\xdd\x30\x6f\x03\x6d\xf1\xbe\x59\xd3\xca\x4c\x12\x8c\x58\x1b\x75\xaa\x9d\x14\x4e\xad\xba\xf8\x0a\x0c\x9d\x5e\x9f\xa5\x26\xbf\x78\xd4\x7a\xa6\xb4\x50\xbb\x5d\x90\x11\x67\xea\x5a\xd6\x5e\x85\x55\x33\xdd\xd4\xa2\xf5\x05\xba\x92\x39\xc9\x6a\x86\x91\x1f\x7b\x60\x98\x49\x28\x28\xc0\xfa\x22\x3e\xa9\xb6\x63\x0e\x92\xd0\xa3\x19\x23\xc4\x8f\x88\xea\x11\xf1\xa1\x66\xae\x1b\x2b\x12\x4b\x30\x4d\x7b\x67\x2f\x94\xcf\x65\x64\x8e\xd4\xe5\xb7\xb2\xd0\x02\x9d\x1e\x4f\x26\xc7\x38\x13\x59\x23\xba\x45\x29\xd4\x3c\xdf\x0b\xca\x69\x09\xda\x96\xea\x0b\x11\x08\xff\x76\xcb\x4a\xc3\xb7\xbb\x65\x39\xf5\x65\x0a\x8f\x71\x40\xc6\xcb\xa5\xd6\x79\x7b\x10\x59\xcc\x8d\xe6\x36\xcc\x23\x8a\xd7\xe8\x3b\xe4\x13\xfd\x20\xe1\x51\xd6\x9c\xf8\x63\xc3\x94\x8e\x11\xda\x4f\xf0\xb3\x49\x56\x35\x23\xdb\xc5\xa4\x64\xa5\xac\x97\xfe\x4f\x56\xcd\x59\xc9\x6a\x5a\x8c\x95\x96\x35\x9d\xb1\x91\x1f\x00\x3f\xf3\x7f\xe1\x87\x9d\x29\xac\x7f\x8d\x16\x82\xac\xa9\x6b\x26\x74\xb1\x74\xb2\xe5\x13\xf3\x7d\x6e\x1f\x77\xcc\xa4\xf9\xe3\xda\xf2\xbe\x1c\x7b\xe3\x1b\xea\xe4\xfc\xaa\x40\x45\x8c\xb7\x47\x8d\x5a\x42\x00\x36\x00\x24\x94\xea\x78\x1f\xb7\x3f\xe7\x0b\xae\xb6\x8a\xfc\xb9\xf6\x1e\x54\xe0\x6e\xd4\xe8\xaa\xd1\x36\x7d\xa4\x97\x2a\x3e\x55\x52\x81\x75\xc0\x67\xaf\xea\x88\x93\xaf\x62\xb4\x44\x80\xfb\x35\xab\xc5\x6b\xf2\x9f\x27\xff\xf1\x9b\x9f\xc6\xa7\x7f\x3d\x39\xf9\xee\xe5\xf8\x5f\xbf\xff\xcd\xc9\x7f\x4c\xe0\x1f\xbf\x3e\xfd\xeb\xe9\x4f\xee\x8f\xdf\x9c\x9e\x9e\x9c\x7c\xf7\xe5\xbb\xbf\x7d\xbc\xba\xf8\x9e\x9f\xfe\xf4\x9d\x68\xca\x5b\xfc\xeb\xa7\x93\xef\xd8\xc5\xf7\x91\x9d\x9c\x9e\xfe\xf5\x57\x51\xd3\xa3\x62\xf9\x75\x04\xd6\xc0\x36\xde\x22\x27\x67\xfb\xd5\xb6\xce\x4a\x5c\xe8\xb1\xac\xc7\xf8\xf9\x6b\x60\x92\x22\x3a\x71\xc7\xb6\x0d\x9c\x7f\x70\xb7\xb5\xc5\x78\x9e\x78\xee\x01\x90\x1f\x43\x00\x14\xcb\x6a\xa6\x77\x65\xde\xc0\xde\x1c\x37\xb8\xe2\xf6\xf6\xdc\x25\xe1\x43\x5a\x3c\x7c\x2a\x41\xd8\xaf\x96\xb3\x32\xec\xd6\xa4\x65\x98\x28\x41\xb9\xd4\xbe\x77\xcb\x22\x63\x51\x07\x0b\xc9\x60\x21\x19\x2c\x24\x5d\x29\xff\x1a\xef\xd0\x33\x37\x8f\x30\xb1\x78\xc8\xca\x9e\xe0\xec\xf5\x16\xf2\x02\x87\x0e\x5f\x8e\xb9\xd6\x92\x54\xb2\x6a\x0a\xaa\xef\xf1\x21\x49\xf0\xfe\xea\xd7\x71\x79\x54\x76\xfe\x5f\x97\x6f\x2e\xde\x7f\xbc\x7c\x7b\x79\xf1\x61\x42\xce\x8a\x22\x54\xbb\xdd\x0f\x71\xad\xa4\x8e\x9c\x35\xa1\xe8\xea\x05\xfa\xb9\x3b\xa7\x50\x69\x7d\x68\xb8\x6a\x15\x75\x98\xed\x18\x09\x94\xf5\xa0\xe0\xc2\xe7\x3c\xbe\x77\x48\xcf\xb0\xf9\x58\x87\xb5\x34\xe7\xe8\x49\xab\xb4\x5b\x26\xcc\x52\xd3\x5b\xf0\xfe\xc9\x58\xce\x44\xf6\x80\xac\xf7\x2d\xc6\x4f\xb8\x3d\xbb\x31\x62\x06\x38\xe8\x21\x46\x21\x79\x53\x15\x3c\x33\xe7\xe3\x35\x92\xd1\x7d\x5f\x96\x65\xa3\x1f\xf2\xe4\xda\xb9\x1f\x9e\x81\x34\xeb\xeb\x11\xb8\xe3\x01\x7d\xf3\xe2\x9e\x8f\xf5\xf3\x86\x4a\x70\x66\xc1\x4b\x79\xff\xe1\x47\xb1\x04\x71\x84\xdb\xfb\x72\xf4\x72\x3a\x6b\x14\xbb\x35\xae\x76\x29\xf5\x83\xbd\xec\xc1\x1d\x25\x8e\x4e\xa7\xd3\xe8\x6d\xe9\xf3\x21\x69\xf3\x01\xe9\xf2\xf6\x34\xf9\xe9\xe8\x71\x12\x2d\x8e\xa7\xc3\xf1\x34\x38\xc1\x43\x21\x95\xee\xc6\xd3\xdc\x6d\x25\xa1\xaa\x66\x53\xfe\x69\x97\x8e\xa5\x5f\x3b\x25\x86\x66\x9f\xb4\x75\x67\xaf\x98\xf0\xc1\x4f\x4e\x6f\x08\x7e\xeb\x9f\x9d\x1f\x2e\xca\x23\xe9\x88\xf4\x7a\x93\xbc\x33\x60\xd1\x01\x8b\x76\xda\x80\x45\x7b\xa5\x98\xe7\x84\x42\x85\xcc\x7b\x93\x28\xc5\xde\xa6\xf7\x41\x5f\x2b\xb9\x55\xd0\x08\xe5\x16\x0e\xa6\x4e\xe7\x59\x5c\x49\x80\xe8\x29\xd7\x6d\x80\xdc\xfd\x80\x76\xbd\xa1\x47\x88\x7c\xb3\x5f\x1e\x2b\x97\x23\x6c\xa5\xff\x95\x72\x35\x18\x8a\xf4\xf0\x58\x89\xa0\x8c\x3c\x6a\x83\xb9\xd4\x5e\x50\xa5\xf8\x4c\x8c\x2b\x99\x8f\xcd\x28\x2f\x1e\xe4\xe7\x0f\x19\x8d\xe4\x55\xda\x8f\x3d\xee\x0f\xde\xe0\x13\x08\x0e\x06\xad\x35\x9a\x05\xd6\x20\x6f\x27\x70\x29\xaa\x22\x04\xd3\x5e\x31\xe8\x91\x87\x53\x52\x41\x67\x6c\x6c\x27\x3b\xf6\x93\x1d\xfb\xb9\x3d\xe2\xbc\x62\x88\x59\x56\x50\xfe\x70\xbc\x6f\x0a\x09\x3b\x87\xde\x6c\xdd\x1f\x1f\x90\xbd\x52\x7d\xc3\xc9\xab\x5c\xa0\xab\xa2\xfb\x09\x3f\x7e\xd8\x06\x0f\x97\xc5\x27\x50\xdc\x70\x90\x0f\x7e\x1d\xd0\xc8\x1c\xf8\x28\x85\x17\xf0\x61\x42\xf4\x66\x29\x68\xc9\x33\x07\x65\x67\x05\x04\xd7\x72\x29\x3a\x6e\x2f\xf1\x43\x73\x45\xb8\x07\x2b\x72\xa9\x49\x46\x05\x5a\x2e\xad\x1b\x84\x41\x18\xa1\xf7\xc3\x03\xdb\x11\x15\xdc\x1d\x11\xd2\xdd\x39\xe4\x0f\xe1\x81\x84\x71\x29\x52\x30\xc2\x84\xae\x21\xd3\xed\x95\xcc\x0d\x69\x99\x74\xde\xee\x71\xe9\x89\xe6\xc3\x62\xf5\xf2\x3d\xc1\x71\xe4\xf9\xb0\x74\x01\x81\x08\x39\xf7\xce\x96\x56\x32\x9f\x6c\xb8\x12\xf1\x25\x8c\xae\x64\x6e\x63\xc0\x75\x07\xde\xcc\x6d\x01\x50\x2b\xe9\xad\x8b\xcc\xf6\x46\x25\xba\xa0\xbc\x88\x08\x1e\x22\x90\x72\x54\xf1\x9c\x11\x1a\x83\x3b\xfd\xc4\xe2\xd9\x21\x6b\x22\xdf\xc7\x21\x7c\xc0\xae\x5d\xa2\x2d\xd8\xff\x6c\x2e\x15\x13\x70\xdf\xa8\x1b\xdb\x17\x0a\x74\x60\x9f\x23\x8e\x8c\x61\x39\x2f\xa7\xc8\xe6\x8e\x08\x5b\xb0\x7a\xa9\xa1\x5c\x97\x4b\xea\x8a\xdd\x98\xf1\x4b\x9a\x07\xbb\x3e\x22\xd2\xf0\x65\x77\x3c\xca\x89\x07\xf0\x04\xce\x4f\x35\x85\xf6\xbc\xb6\x9d\xfd\xce\x4e\x63\x3d\x80\xdd\x70\x71\xb7\xbd\xd9\x7a\x7b\x2f\xe4\x7d\x91\xf1\x25\xad\xee\xfd\x0a\xbd\x2e\x76\x45\xa4\xbe\x42\xaf\x10\xfc\xe4\xc6\x1a\xdf\x4b\xfa\x89\x97\x4d\x49\x28\xfa\xdd\xc8\xe9\x06\x06\x22\x2a\x59\xc0\x2e\xd8\x81\x0d\x6c\x80\xba\x8f\x0f\x20\xf1\x68\x35\x3d\xa5\xcd\x33\x75\x1b\x88\x72\x17\x48\x73\x13\x48\x70\x0f\xd8\xda\x2d\xc0\x39\x00\xed\x0a\x90\x2d\x4a\x5b\x03\x65\x2e\x7a\x41\xd9\xd1\xd7\x87\x61\xf9\x72\xda\x8e\xc1\x15\x91\x25\xd7\xda\xfa\xd9\x04\x14\x60\x44\xb8\xee\x38\xa5\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x55\xf0\x8c\x83\x6f\x93\xf3\xbf\x7c\x98\xd1\xf3\x38\xd1\xa6\xaa\xe2\x65\x85\xc9\xaa\xe0\xa2\x8c\x1d\x0f\x69\xc3\x3e\xfd\x2c\x6d\x9c\x32\xfb\x94\x31\x96\xdb\x89\x0c\xf7\x75\xb8\xaf\xc9\xf7\x55\xed\x48\x15\x11\xaa\x21\xda\xbc\x39\x5e\x1d\x61\xae\x12\xe4\xb4\x41\xc5\x80\x83\xae\x87\x2e\xe6\x85\xcb\xaa\xfe\x81\x81\x79\xef\x9a\x69\x65\x33\xf4\x40\x4f\x0f\xe9\xd5\xd6\xb2\x34\xfb\x4c\xec\x2e\xdd\x15\x05\xc5\x61\xf0\x46\x9b\xdf\xe4\x01\x29\x59\xaf\xb2\xb7\xa0\xeb\x60\x65\x55\x50\xdd\x6a\x42\x1e\x91\x08\x25\x86\x89\x4f\x49\x64\xfc\xb4\xa9\x8b\xf7\x23\xb6\xf5\xb2\xc1\x4f\x98\x82\x78\xdb\xa4\xc3\x7b\x10\x18\xfb\x9d\xb8\x22\x93\x07\xc7\x0b\x96\x51\x5e\x5e\xfb\x4e\x09\x9c\x20\x86\xc5\xa7\xfd\x4d\x97\xc3\xf6\x9c\xda\x77\x5f\xc9\x7c\x13\x76\x2f\x36\x61\x6f\xfa\xde\x1d\x28\x29\xef\xc1\xd3\xf0\x1e\x32\xf1\x6e\x52\xaa\xdd\x94\xe4\x89\xd1\x89\x13\xb7\xf7\xca\x4d\x49\x98\xb8\xe5\x87\x91\x69\x71\x53\x60\xf7\xc0\xa9\x6f\x0f\x9c\xec\xf6\x29\xd2\xdb\xee\x4d\x7e\x88\x00\xcd\x74\xcb\x9e\x96\x85\xad\xeb\x13\x67\xe9\xf9\xd8\xbe\x0f\xdb\xd1\x3a\x81\x07\x3d\x1d\xc6\x2d\xed\x41\xc8\xfe\xe8\xf8\x5c\x83\x9d\xda\x49\x03\x8c\x6b\x4d\xb3\xb9\x4d\x52\x8b\xbf\x18\x48\x10\x4b\x62\x80\x40\x23\x25\xb7\x79\x32\x1f\x3a\xe7\x39\x23\xba\xe6\x55\xc1\xc8\x9f\xfd\x85\x18\xa1\x6d\xff\x2f\x41\xaa\x30\x97\x54\xb4\x05\xc6\x3f\xbb\x7f\xfd\xe5\x91\x19\xea\xe2\x98\x1c\x9c\xd2\x2e\x79\xd5\x0b\xe8\x91\x70\x91\x83\x07\x23\xb2\x42\xb8\x79\x38\x98\xd9\x5a\x58\xf7\xc4\x66\xf7\xc4\x54\xb9\xd6\x04\x0b\xae\x8e\xed\xcb\xbd\xac\x03\x78\x78\xb6\xaa\x09\xef\xe1\xe0\xef\x30\x23\xef\xe5\xb5\x35\xdb\x8e\xc8\x15\x68\x87\xdb\x27\x70\xe7\xdf\xcb\x8b\x4f\x2c\x6b\x74\x8f\xd3\x4d\x24\xfa\xef\xe5\x19\xd3\xf6\xf3\xcb\x96\xa1\xc4\x8d\xe9\x30\x94\xed\xc5\x0a\x59\xca\x07\x37\xf6\x96\x2d\x7b\x77\xd5\x32\x09\x96\x99\xb5\xaa\x71\x0f\xa3\x8e\xc8\x23\xdf\xf0\x7f\x9c\x29\xaf\xbc\xe1\x02\xa7\x82\x03\xbb\x73\x86\xb1\xdd\x79\x18\x09\xa4\x28\x22\x26\x11\xb9\xdb\x71\x1c\x6f\xaa\xf3\x56\x3c\xa7\xeb\xe9\x45\xdf\x96\x6e\xe2\x6f\x03\xa6\xf6\xe2\xc7\x86\x16\x93\x4e\xea\x36\x7c\xd4\x77\xdd\xac\x5b\xf3\x2a\xdd\xbc\xe3\x45\x9e\xd1\xda\xc6\xd6\x01\xfa\x21\x4a\x5a\x33\x2c\x60\xbf\xac\xd7\x81\xdd\x21\xc0\x16\x78\x14\xfa\xf2\x56\xb4\xd6\x3c\x6b\x0a\x5a\x13\x73\xc7\x67\xb2\x8e\xca\xcd\xd6\x7b\x98\x2d\x34\x5f\xb3\x4c\x8a\x7c\xa7\x42\xf4\xc7\xd5\xce\x57\xbd\x95\x2b\x56\x73\x89\xb9\x82\x78\xc9\x56\xaf\xd7\x49\xc7\x01\xa5\x4f\x0e\x9b\x3a\x64\xe7\x71\xcb\x28\xd4\x8c\x76\x6d\xca\x58\x82\xee\x34\x20\x38\xfe\xb6\x4f\xc8\x17\x4b\xa7\xa2\xed\x63\xc8\xb9\x76\xf9\x04\x14\xd3\x2e\x9f\xa2\xbb\x8a\xf6\x24\x5b\x34\x32\x95\x35\xe4\x29\x3c\xc9\x25\xc6\xd1\x2f\x78\xa6\x4f\x27\xe4\xff\xcf\x6a\x19\x91\x88\x52\xb0\x19\xc6\x72\xdb\x8b\xed\xf5\x51\x35\xa3\xd6\x4b\xff\x25\x39\x81\x4e\x09\x2f\x4b\x96\x73\xaa\x59\xb1\x3c\x45\xf5\x14\x23\x6a\xa9\x34\xeb\xb1\xcd\xc5\xab\x15\x31\xf4\x12\xde\xfd\xc3\xef\x1f\x78\x73\x0f\x09\x44\x6d\x92\xc2\x76\x63\xd1\x53\x6e\x05\x7a\x7c\x6a\xed\x5e\x79\xff\x5e\xf9\x2c\x0c\x47\x68\x93\x9b\x3b\xdc\xec\x61\xeb\x1f\x06\x40\x29\xa9\xd9\x0c\xee\x27\xde\xb9\x47\xde\x4e\x8c\xcd\x7d\x27\x1b\x71\xbf\x0d\xa4\xb3\x6f\x5f\x59\x15\xdc\xb7\xc1\x87\xa9\xa9\x85\x77\xcb\x10\x06\x33\x09\xac\x2e\x14\xa3\xf5\x81\x03\x33\x88\x0d\xdf\x6a\x83\x58\x22\x8c\xe5\x3b\x4c\x17\x0c\x73\xe9\xc9\x9f\xb5\x93\xa4\xc2\x7e\xa0\x5d\x5e\x85\xab\x95\x0c\x12\x41\x5a\x5b\x57\x96\x35\xc8\x92\xd0\x42\x30\x4c\x86\xe5\x36\xec\xb1\x0f\xed\x04\x19\x23\x8e\x5f\xef\xc6\x9b\x19\x77\xa3\x96\x15\x9d\xc1\x65\xdd\xe5\xa6\xac\xf6\x4d\x72\xa6\x59\x5d\x72\xc1\x14\x99\xcb\x3b\xfc\x1d\x99\x81\xca\xbe\xc5\xf2\xd6\xf3\x60\x2e\x7b\x77\x04\x4b\xb0\xb6\x09\x84\x11\x7b\x80\xc3\xe8\x1d\x5d\x12\x5a\xcb\x46\xf4\xa6\x23\x00\x2e\xda\x53\x8e\x77\x2b\x93\x7e\x2f\x05\xf3\xce\x28\x7d\x54\xb6\x43\xda\x6e\x98\xa6\xe6\xc2\xbf\x9a\xbc\x7a\x19\x35\x87\x0f\x2c\x6b\x6a\xc5\x17\xec\x03\xa3\xf9\xd7\x46\xe2\x6e\xd3\xc1\x5c\x4e\xaf\xa4\x52\xfc\x06\xb3\xf0\x18\x06\x09\x73\x6c\xad\x4f\xd8\x73\xa8\x30\x73\x59\x93\x46\x78\x11\xa1\x67\x16\x96\xcc\x87\x56\x51\xd3\xc9\xe9\x4e\x20\x2d\x31\x99\x37\xec\xe5\x8a\x7d\xc6\x79\x99\x3b\x5c\xb5\x93\x79\xd5\x76\xb3\x77\x09\xf9\xef\xf0\x5a\x43\xdf\x63\xd0\x9d\xf0\x29\x58\xed\x46\xf8\xe8\xae\xe6\x9a\x05\x74\xeb\x04\xb3\xfd\x74\x0f\xab\x67\xdb\xbb\xa9\x8e\xa1\x83\x98\xfd\xe8\xf7\x83\xae\x57\xc1\x70\x97\x3b\xb3\x0e\xe3\x6d\x41\x1e\xe7\xeb\xdd\xee\x9a\xc5\x10\x2d\xbe\x9c\x53\x91\x17\xbd\x70\xec\x57\x50\x2c\x7b\xb3\x30\x81\xb7\x40\x7b\xdd\x60\x1f\x47\x21\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf7\x37\x2c\x38\xac\xd4\x71\x10\x18\x10\x65\x85\x48\xc3\x5e\xf7\x37\x5c\xd9\xeb\x0d\x9a\x12\xa0\xdc\x96\xbf\x2d\x69\x6f\x05\x94\x60\xfd\xed\x66\x4e\x2c\x7b\xb5\x61\xb4\x16\xb9\xac\x8c\xb7\xed\x58\x23\x03\xef\xc8\x92\xfb\xac\x30\x8e\xf9\x6d\x11\x76\x6d\xb8\x8f\x92\xb5\x13\xeb\x19\x6a\x75\xda\x1e\x05\xae\xcd\x79\xf3\xac\xfc\xa4\x7a\xc6\xe9\x9f\x72\x57\x9e\x41\x85\x5a\x27\x2d\x98\xa6\x18\xae\x1b\x91\xd3\x7e\x25\x29\xd7\x8c\x09\x90\x56\x40\x0b\xe7\x14\x49\xd6\x77\x8e\x2a\x29\x62\x00\xad\xe7\x90\x0d\x9e\xe9\x27\x1f\xf8\x59\xcf\x60\x40\x63\x4e\x64\xbd\x72\x1b\x9c\x00\xb6\x81\x92\xa4\xce\x1e\x08\x73\xdb\x2f\x02\x55\x20\x68\x99\x0d\x6c\x85\x7f\x39\xf5\x57\x67\x37\xc1\x5e\xcd\xcd\xbe\x59\xc5\x0d\xc9\xc6\x42\x90\x3b\x56\xf7\x73\x8d\x09\xf4\xe1\xe8\x88\x9c\x60\x3f\xc7\x8a\xd4\x52\xea\xdd\x10\x75\xbb\x3f\x17\x9f\xaa\x9d\x2a\xa1\x2e\x6c\xf1\x80\x98\xcc\x6c\x3b\xda\xac\x2f\xd8\x9c\x2e\x98\x22\x8a\x97\xbc\xa0\x75\x01\x99\xd9\xaf\x71\x79\x10\x82\xb6\x31\x17\x60\x44\xe9\x8c\x40\xe3\x1d\xce\x33\xe8\x6e\x9f\xe7\x48\xdc\x1a\xcc\x11\x01\xbd\x71\x6b\x32\x73\x2c\x1b\xdd\xd0\xa2\x58\x12\xf6\x29\x2b\x1a\x83\x2f\x77\x22\x2c\x6f\x23\x27\xaf\x8a\xc8\x95\x75\xd4\x3f\xa0\x80\xdc\x55\x79\x1a\x7e\x35\x77\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\xcb\x98\x52\x2e\x87\xc1\x32\xcc\xc3\xe0\xd7\xf0\xb9\x94\xda\xa1\x77\xea\xa2\xa0\x4a\xf3\xec\x8b\x42\x66\xb7\xd7\x5a\xd6\x3b\xd5\x15\x6d\xea\x7f\xa5\x80\xd1\xd9\xdf\xaf\x0d\xf2\xbe\x0d\x12\x47\x59\x47\xcc\xd0\x30\x45\x7b\x06\xba\x6d\x6e\x58\xc1\xf4\xb1\x02\xf9\x91\x94\x34\x9b\x63\x19\xad\x1c\x33\x90\xba\xd4\x64\x56\x7d\xfd\xe0\x11\x61\x7b\x63\x66\x09\x85\xe9\x5e\x9b\x39\xae\x2f\x03\xfd\xcd\xec\x3b\x98\xdd\x03\x35\x58\x60\x0c\x74\x81\x74\x5c\x8c\x75\xcd\xfa\xd8\xa9\x8d\xfb\x04\x21\xa9\xb6\xb6\x0c\xaf\xd1\xd3\xcd\xce\x9f\xdd\xa8\x49\xa6\xf8\x84\xde\xa9\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\x2f\xfa\x43\x1c\x12\x5d\x48\x6d\xd2\xbf\x17\xf6\x86\xff\x92\xde\x29\x86\x13\xbd\x31\x13\x85\x12\x68\x11\xb8\x63\xa7\x4e\x51\x38\x97\xcb\x37\x0f\xbe\x18\xef\xf0\x34\x55\x1f\xcd\x1c\x7b\xde\xda\xc6\x05\x06\x7b\x76\xaa\xd2\x29\x2f\x18\xaa\x80\xf1\x64\xbb\x29\x34\x01\xe8\x97\xb2\x21\x77\x14\xad\x19\x40\xc0\xa2\x82\xa9\x79\xf5\x9a\x5c\x08\xd5\xd4\xac\x35\x92\xad\x0e\xb6\x89\x25\x87\x9b\x62\x41\x56\xcc\xa2\xd4\xd3\xd8\x2e\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\xde\x85\x9a\x8b\x29\xab\x6b\x1f\x7f\x8d\x1f\x18\x96\xbc\x23\x45\xf5\x8f\x79\x68\xb8\x25\x69\xce\x2f\x60\x1e\xea\xd7\xa4\x91\xad\xe0\xc8\x77\xee\x40\x29\x78\x20\x76\x03\x44\x97\x53\xe7\x31\x8f\x72\x95\x65\xe1\x61\x40\xdb\x8d\x01\x1b\x3b\x8e\xa1\x3c\x69\x80\xf2\xd6\xa7\xbb\x24\x2f\x72\xb6\x78\xa1\x72\xfa\x6a\x04\x53\x55\x36\xe4\xbb\xbb\x2e\xaa\xc8\x51\x5c\xf1\x81\x6b\xc7\xb9\x8d\xc2\x9d\x68\x7b\x32\x88\xd8\x0d\x09\x7e\x2f\x2f\x8f\x40\x74\x31\x63\x67\x54\x90\x82\xd1\x85\x15\xe7\x10\x65\x2c\xd1\xc0\xd0\xcb\x61\xa5\x18\x6b\x48\xd7\x60\xf3\xbb\xdf\xf6\x8a\xd7\x31\x3a\x18\xb2\x15\x34\xb9\xbe\x9d\xd5\xa6\x6e\x6c\x2e\xa7\xa9\xac\x33\x2f\x73\x5a\x2d\x0d\xd3\x80\x1b\xb8\xe8\xd8\x35\x9e\xf7\x85\x8d\x4b\x55\xe6\xa8\xc8\x5e\x7c\x1f\x6d\xdf\xa0\x41\x16\xfc\xc7\x86\x91\xcb\x37\xbe\x22\x0b\xab\x15\x57\xda\x08\x14\x79\x87\xef\xe1\xc8\x0c\x9d\x9c\x95\xf4\x9f\x52\x90\x8b\x2f\xae\x6d\x47\x11\xa0\xf8\xac\x11\x24\xfd\x67\x53\x33\xc3\xe3\xed\x94\xb5\x74\x9d\xae\xf2\x93\xe6\x39\x79\x43\x35\x45\xb6\xd2\x06\x16\x89\x96\xe4\x19\xa6\xf0\x86\x8b\xdc\xfe\xb4\x25\x4b\xe8\x87\x4f\xe2\x03\x83\x69\x9b\xcd\xeb\x5b\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x24\xfe\x6f\x0f\xdc\x98\x99\x4d\x44\x79\x0c\x7c\xf1\x9b\x0f\x97\x3b\xe2\xda\x32\xe0\xf0\x67\xef\x64\x9e\xca\xba\x1d\x07\x9f\x3a\x82\xfa\x6f\x06\x2e\xce\xf1\x39\x29\x4d\x9f\xa0\xb8\x1a\x81\xf2\x96\x7c\x0d\xba\x4d\xf8\xe7\xdf\x6b\xae\xd9\xa4\x3f\xa3\x6d\x02\xeb\xe0\x36\x30\x71\x19\xee\x33\xb7\x84\x30\x17\x4f\x6e\xa0\x1f\x90\x8b\xe5\x0f\x6e\x0a\x79\x43\xec\x95\xdf\xf5\xdc\xbf\xf9\x70\xb9\xc5\xd4\xbf\xf9\x70\xe9\x66\x6e\xfe\x29\xa7\x87\x9b\xf4\x21\x18\xfe\xb7\x2b\xfc\x77\x0a\x2f\xd6\xa6\xc2\x5d\xe5\xe2\x77\xc9\xc2\x4f\x0e\xc6\xbc\x6f\x97\x62\xc8\x8c\xd5\x27\xf4\x73\x11\x91\x0c\xb9\x7b\xf9\xcd\x37\x84\x7d\xaa\x10\xa3\x06\x2e\x93\xd7\x73\x0a\xf9\xab\x5d\xaa\x4c\x04\x3f\x03\x8f\xca\x90\x6c\x07\x88\x84\x62\x95\x32\x43\x0d\x50\x4b\x9f\xbf\x76\x8e\xe0\xfe\x8b\xcd\x1f\xbc\x83\x00\xcc\xfc\x35\xd2\x00\x82\xf1\x98\x79\x00\xf7\x27\x68\xae\x10\xfe\x27\x1b\x77\x8f\xd9\xae\x14\xd3\xa7\x93\x8e\x6e\x5d\xc1\x94\x77\x8a\x8c\x0e\xc2\x78\xae\x59\x30\xc9\x89\xf9\xed\x05\xd8\x47\x4f\x27\xad\xc5\x0c\xb2\x43\xb4\xbc\x69\xc4\x18\xe6\x52\x7c\x78\x34\xf7\x9a\x96\xf2\x36\xba\xb8\x09\x9c\xbb\xc1\x0c\x3b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\xc4\xdf\x27\x2b\x04\x03\x6d\xc1\x0a\xc1\x77\x5b\xb3\x42\x50\x5f\xe4\xd9\xb0\x42\x98\x23\x30\x8a\x19\x82\xab\xdb\xfb\x66\x3c\x3b\x74\x90\x7b\x9b\xff\x9c\xee\x6d\x7b\x58\x89\x7b\xd6\x7e\xe8\x18\x18\x9f\x20\xc7\x25\xb7\xef\x04\xa4\xe2\x45\xbc\xb6\xd4\xc0\x16\xb9\x44\x76\xcd\x5c\xbf\x2f\x23\xf2\xf4\x27\x20\x70\x0f\x58\xa9\xab\x72\xdf\xb9\x45\x21\x91\x82\xc7\x24\xaa\xfc\x5d\xe4\x24\x33\x56\xcd\xa7\x3b\xf5\x72\x36\x3d\xbe\xbd\xee\x9a\x71\xce\x59\x35\x27\x6f\xaf\x37\xa0\x3c\x38\x1c\x58\x96\x42\xe3\xce\xb1\x22\x05\x9f\x32\xf0\x49\x48\xc0\x7a\xe7\x38\x6a\x07\xe5\x79\x67\x34\x87\xe2\x70\xb1\x5e\x05\x2b\x24\x29\xa4\x98\x19\xe6\x20\xae\x6a\xce\x1e\x90\x54\x29\x05\xd7\xb2\x7e\xd8\x1b\x22\x1e\xf1\xb8\xee\xf6\x81\x78\x5c\xdf\x66\xeb\xda\x02\x23\xef\x82\xa7\x94\x64\xb2\x28\x58\xa6\x6d\xb9\x53\x38\xf6\xa8\x15\x62\xdb\xa0\x34\x61\x56\x67\x39\xb9\xfd\x13\xa8\x4d\xac\x82\xe4\x05\x1e\xe5\x8b\x0f\x17\x67\x6f\xde\x5d\x4c\xca\xfc\x97\x73\x79\x37\xd6\x72\xdc\x28\x36\xe6\xfd\xc5\x3b\x3e\xe3\xe8\x4c\x12\x5d\x8f\xad\xcb\x6a\x57\xb6\xce\xac\x4b\x0c\xfc\x9a\x7c\xa3\xd0\x7b\xc3\x7b\xee\xb0\x1c\xac\xd9\x23\x52\x53\x9b\xef\x93\xe2\x55\x9d\x36\x45\x81\xa7\x69\xee\xd1\x28\xd4\x47\xbf\xf8\xfc\x18\xde\xce\x26\x3c\x7b\xee\xf7\xf0\xd7\x22\x85\x62\xf7\xf3\xcf\x64\xab\xc3\x6a\x7b\xef\x1e\xd7\x75\xe7\xb9\x76\x75\x03\xb5\x84\x50\x31\x08\xea\x36\x8c\xed\x37\x8a\xd5\x5d\x30\x65\x3a\x83\xdd\x79\xd1\x28\x56\x4f\xb0\xfb\x67\xb8\xf7\x71\x5c\x45\x5c\xf6\x6b\xf2\x88\x9d\xff\xc0\xa6\x9b\x36\xde\x3e\xf6\x1e\x37\x8e\xf3\xa7\x8d\x9e\x33\xa1\xb9\xcd\x6e\x69\x39\xaf\x8d\x27\x81\x81\xf9\xcf\x70\xeb\x23\xeb\x3e\xa5\x55\x69\x1a\x2a\x1b\xb5\x6d\xa8\x6c\xf4\x3c\x2a\x1b\x3d\xa6\x5c\x9b\xc1\x9e\xfb\xc0\x3a\xa6\x5f\x48\x14\x17\x72\x27\x3e\xf5\x55\x4d\x73\xa9\xf0\x1d\xb3\x87\x1d\x7c\x42\xf3\x92\xc7\x94\xbd\x7d\x76\x98\x3c\xe3\x22\xef\xdb\xcc\x44\xd1\x0b\x7a\xec\x8a\x5e\xf6\x99\x35\xc4\x7b\x27\x2e\xea\xb4\x4c\x98\x49\xdc\x3a\x6c\x75\xfd\xb5\x92\xe4\x2f\x1c\x26\x4d\xe5\x64\xe7\xb6\xb5\xbe\x09\xbf\x07\x8d\x93\xac\x98\x41\x24\xd9\xed\x44\xd6\xb3\xc7\x39\x60\xad\x42\x45\xb9\x54\x3f\x16\x63\x1c\x6b\x5c\xe5\x2d\x58\x1c\x5a\x56\xfc\x99\x78\x5a\x3d\x3f\xe3\xcb\xb3\xf0\x9f\xda\x0d\xd8\x91\x67\x28\x6f\x3d\x7b\x45\xe5\x41\xce\x23\x45\xaa\x3a\x04\x6b\xdf\x52\xda\x4a\x72\x1b\x1d\xed\x0b\xa8\x22\xde\x0a\x6b\x88\x57\xb4\xa6\x25\x83\x5a\x3e\x8d\x75\xdd\xcd\xa4\x10\x31\x1c\x33\x84\x88\x7e\x5d\x31\x71\x0d\x08\x7a\x60\xc7\x37\xb7\x81\x1d\x7f\xa0\x0d\xec\xf8\xc6\x76\x10\xb7\x39\x77\xdf\x79\x6e\x44\x7c\xeb\x1c\xda\xc6\x64\x58\x2e\xec\x79\x60\xd9\x7e\xae\xdb\x55\x81\x4b\x60\xbc\xfd\x37\x2b\xac\x75\x5b\x95\x11\xad\x18\x10\xed\xe4\x2b\x9b\xc2\xed\xc1\x6d\xda\x0d\xa7\x18\x8f\xea\x2c\xf8\x6d\xe1\x8e\x15\x05\x19\x41\xf7\x5d\x4a\x52\x9a\x27\x37\x5c\xb7\x34\x42\x31\x4d\x2a\x56\x97\xdc\xe6\xc7\x95\x82\x64\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\x92\xf8\x41\x41\x64\xa6\xa9\xcd\xea\x44\x6e\x98\xbe\x63\x4c\x90\x97\x2f\x5f\xbe\x04\xd1\xe6\xe5\x1f\xff\xf8\x47\x02\xb9\xc6\x73\x96\xf1\x72\xfd\x45\x78\xeb\x5f\x5e\xbd\x8a\x19\xf4\xdf\xcf\xde\x7d\x05\x71\x46\x95\x56\xe4\x46\xea\xb9\x1d\xdb\x74\xd1\xe9\x5e\x8d\xc8\xff\xbd\xfe\xfa\xbd\xc3\xd7\x6a\xe5\x57\x90\x7f\xfc\x16\xc5\x8c\x1c\x2a\xa7\x5f\xfe\xe1\xf7\xbf\x8f\xfa\x06\x84\x24\x59\x43\x30\x77\x1b\xb4\x57\xb9\x70\x33\x21\xf5\x7a\xaa\x66\xcb\x3a\x45\x57\x8b\x2b\xf9\x6c\x0e\x07\x61\xee\xbf\x14\xd3\x82\x67\x1a\x89\x04\x26\x7e\x40\x90\xb0\xe5\x42\xa8\xcd\xba\x66\x65\x81\x28\x53\x53\xce\x46\xa4\xe0\xb7\x8c\x4c\xd5\xdf\x6a\xd9\x54\x6d\x6e\x44\x5b\xbd\x22\xa3\xc2\x8c\x8f\xc3\xb5\x70\xa7\x58\x74\x46\xd6\x7d\x78\x8a\x47\xda\x8a\xd2\xaf\x1c\x74\xbc\x22\x68\x8c\xb0\x78\xe3\x2d\x5b\x8e\x11\xba\x2b\xca\x7d\xd8\x1b\xb8\xdc\x22\x37\xd1\xe5\x47\xb2\xa8\x42\xd3\x6d\xb1\x4c\x17\x13\x5d\xd5\xf2\x1f\x08\x34\x5c\xb8\xb4\x63\x56\xa9\xa0\xac\x7c\x66\x73\x61\x8a\xd6\x6e\x1d\x31\x92\xcb\xe9\x6c\x78\x4d\x9b\x4d\xba\x4d\x69\x46\x2e\xa7\x61\xe0\x31\x24\x35\xe6\xca\x4c\x02\x6a\x3e\xdb\xb9\x45\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x11\x6b\xfd\x63\x38\x79\xd4\x18\x40\x1a\x60\xd2\xd4\xa5\xae\x6b\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x3a\xe7\xad\x8d\xb0\x65\xba\xb1\x47\x84\x11\xec\x8d\x28\x98\x52\x36\x42\xbb\xa4\xf5\x2d\xcb\x3d\x7e\x9e\x40\xd8\xb3\x8a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x92\x2e\x3b\xd9\x6f\xcc\x34\x8e\x27\x93\x63\x44\x2d\xb2\xc6\x80\x7b\xc4\x02\xe6\xf9\x13\xe5\xc8\xed\xdc\x2d\x28\xf3\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1b\xd1\x4c\xed\x5e\xc6\xe0\xbe\x24\xc9\x24\x5e\xb5\x83\x2d\x26\xbf\xb8\x7b\xb3\x7a\x38\x47\x93\x6b\x69\xc2\x51\x64\xb6\x71\x6c\xf7\xe5\x1c\xb7\x7b\x6c\xef\x5b\x2c\x7b\x9f\xcc\x60\x97\x51\xac\xcd\x86\xa9\x46\x8b\x72\x38\x46\xd7\x08\x16\xc5\xdf\xd8\xd4\x09\xfd\x15\x74\xdb\xf6\x24\x6c\x0d\xb6\xa7\x63\x6e\xb0\x5d\x4e\x57\xb3\x4b\x04\xe8\x2d\x64\x34\x1d\x1d\x8a\xc9\x01\xd5\xb6\x43\x70\x2b\xd8\xf6\xcc\xb3\x60\x4b\xe3\x5c\xb0\xa5\xf0\x2f\xd8\xe2\xdc\x4b\xb0\x6d\x7b\xb9\x9c\x3b\x0a\x6e\x8f\x25\x33\x48\x49\xa6\x7e\xf3\x31\x83\x6b\x15\x20\x96\x84\x3b\x65\xc9\x15\x5e\x2b\x7a\xa3\x64\xd1\x68\x1c\x22\xbd\x93\x90\xe6\xc1\x24\x5d\x4a\xf0\x38\x42\xb7\xda\x5d\x40\x29\x81\x13\x41\xf2\x94\xd2\xd7\xe1\x7c\x8d\x86\x6a\xd5\x43\xb5\xea\x7b\xda\xf3\xaa\x56\xed\x3e\xf3\x31\xcc\x9b\x8b\xff\xcb\x9a\x18\xa4\x0b\xfc\xfd\x73\xaa\x62\x8d\x2d\x53\x3c\x45\x31\xa5\x38\x39\x39\xf7\x19\x4f\x9c\x57\xf3\xa5\xd0\xac\x9e\xd2\x8c\x9d\x86\x0a\x2b\x56\xcd\x59\xc9\x6a\xb3\x41\xf6\x3d\x97\xda\xc3\x26\x74\x23\x37\x4b\x07\x7f\x84\x7d\xd2\xac\x36\x9b\xd9\x9a\x52\x0f\x5f\x6f\x07\xc7\xdd\x95\x4e\x0c\x3a\xdb\x8b\x3a\x0c\x7a\xee\x94\x07\xb5\x78\xad\xdd\x3c\xdc\x6b\xdc\x68\x15\xaa\x06\x63\x6e\xf8\xb9\x14\xc0\x3f\x00\x8a\x59\xca\xa6\x46\xa7\x07\x6f\x4f\xcf\x64\x5d\x1b\x9e\x05\x86\xa6\x8a\xd4\x6c\x66\x84\xd8\x1a\x2b\x25\xc3\x1b\x45\x63\x1e\xec\x34\x3a\x6c\xef\xf6\x63\x6f\x28\x7e\x20\x3e\x2e\xa2\x37\xcb\x61\x56\xb5\x5c\xf0\xdc\x31\x98\x21\x96\xe6\x8a\x54\x54\x05\xf9\x68\xa8\x52\x32\xe3\xa0\xa4\x6c\x4f\x30\x62\x24\x94\xf0\x81\x51\xf5\x59\x56\x3b\xf9\x1b\x42\x23\xb6\x84\x7c\xf9\x11\x9e\x70\x09\x47\x22\x64\xce\xae\x9a\x9b\x82\xab\xf9\xf5\x3e\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\xfb\x0c\x8a\x51\xe6\x4a\xa1\x38\xf0\x85\x86\xba\x19\x26\x96\x1b\xf1\x4a\xc2\x69\xb9\xfe\xc3\x2b\x26\x81\xc6\x17\xcc\xe6\xea\x3b\xbf\x7e\x38\xbc\x19\xdb\xfb\x76\x2d\x36\x03\x15\x56\x64\xc8\xd9\x37\xa2\xea\x3c\xcf\x68\x71\x7f\x25\xba\xb0\x75\x59\x14\x47\x97\x50\x1c\x70\x79\xab\x10\x00\xb9\x81\x4d\xb7\x47\x3c\x28\xae\x69\xb3\x70\x47\x1b\x75\x57\x36\x58\x91\x52\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x08\xb2\xa6\x41\xf2\x5f\xb8\x01\x83\x71\xf6\x9e\x36\x18\x67\x1f\x68\x83\x71\x76\x63\x3b\x88\x73\x4d\x9b\xb9\x97\x06\x49\x56\x3b\xb5\x66\x3d\x9f\x10\xcf\x71\xf4\x44\x45\xec\xd4\xe5\x05\x67\x75\xa6\x75\xcd\x6f\x1a\xbd\xa7\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x59\x80\xb0\xac\x32\xc8\x63\xc6\x80\xde\x44\xb3\x84\x13\xcf\xb9\x01\xd3\x86\x0f\x8f\x15\xc9\x65\xd6\xf8\x82\xc4\x70\x3a\xad\x37\x5b\x6c\xbd\xc2\x24\x3c\x9c\x5e\xce\x2b\x1c\xa4\xf7\x6a\xe5\xf2\x4e\x18\x6c\x77\x76\xd5\x93\x7b\xa2\x9b\x77\xa2\xfd\x2a\x14\x53\xdc\x63\x62\x9e\xd3\x1b\xd9\x68\x9f\xdd\xf7\x7f\x99\x99\x7d\x93\xde\x59\x4b\xd2\x28\xf6\xa0\x19\xbd\xd5\x26\x6f\x39\xc6\x60\xbb\x1f\x6c\xf7\x83\xed\xfe\xbe\xd6\xb9\xc7\x97\x68\x96\x0f\x8b\x3e\x77\xf0\x97\x4b\x95\x1c\xb3\x75\xfb\xb7\x86\xbe\x69\x31\x2e\x8a\x34\xab\x89\x2a\x56\xe4\x2c\xbc\xed\xad\x36\x3e\x70\x07\x75\x28\x19\x58\xe2\xa7\xb7\x9c\xee\xc9\x1e\x0a\xab\x8b\x92\xa1\xb1\x75\x23\x6e\xdb\x20\x69\x2c\xe5\x8e\x6e\x12\x81\x47\x46\x25\xf3\xd7\x58\xd5\x93\x0a\x21\x91\x1d\x50\x23\x5b\xf2\x7c\x64\x43\x5d\x80\x11\xae\x68\x86\x72\x69\xc3\x73\xc0\x04\x6d\xc4\x7a\x7f\xfc\x2d\xb6\xc4\x13\x20\xc9\xa7\x40\xe0\x24\x60\x81\x3d\x25\x84\xc2\x96\x7a\x24\xa6\xd1\x8a\x7f\xcb\x6a\x15\x95\xdf\xb3\x6d\xdd\x64\xd3\xf8\xbd\x3b\x09\x95\xcd\x59\x49\xe1\x9f\x6f\xdd\x02\xcc\xb5\x36\xfc\xae\x66\x98\xd8\x93\xd5\xa5\x11\xbc\x46\x1d\x7f\xf6\xa3\x45\x5c\x5e\x4c\xd7\x92\x85\x15\xe2\xc0\xb0\x3f\x05\xfe\x03\xcb\xbd\xea\x18\xd6\x0c\x08\x02\x7d\x2f\xb0\x50\xe6\x8a\x3b\x0c\x20\x2e\xdc\x9f\x3d\x2f\xed\x31\xd2\x15\xb6\x43\xf8\x01\x6c\x6b\xff\x1f\x79\xfb\x42\x97\xe5\x89\x1e\x78\xb0\xff\x0f\xf6\xff\x6e\x7b\xe6\xf6\xff\x80\xe4\x39\x0c\xba\xc1\xc0\x1f\x5a\x48\x9c\x95\xff\x86\x39\xd9\xc2\xca\x2f\xce\x74\xef\xec\xf6\xb2\xee\x3a\x9e\x1d\x4f\x26\xc7\xe8\x7a\xd6\x0a\x3c\x8d\x9e\x8e\xff\x44\x98\xc8\x64\x6e\xfa\xf9\x08\xfd\xd7\x4a\x03\xbb\xd4\x6a\xfe\xc2\xb9\x94\x6e\xac\xd0\x79\x0d\xfa\x4e\xa3\xab\x09\x68\xcf\x65\x98\x7d\xfb\x18\xe6\x22\x01\x7d\xb5\xcc\x87\xcf\x6d\x6b\xb7\xc2\xd7\x4a\xb0\x5c\x88\xfb\x5d\x91\x82\x97\xdc\xd6\x85\x35\xf7\x9d\x29\x1d\xab\xb8\x24\xe4\x04\x3f\x9e\x64\x55\x33\xb2\x1d\x4d\x4a\x56\xca\x7a\x39\xf2\x9d\x99\x1f\x3b\xbd\xdb\x37\xb0\x6a\x47\xd6\xd4\x35\x13\xba\x58\xc6\x26\xe6\x69\xdb\x81\xb8\x1c\xb7\x53\x7b\x64\x72\xfc\xe1\xc4\xa5\x8f\x6a\x5b\xf7\x46\xb6\xd6\x61\x50\xaf\xfb\xd5\x62\x59\x5e\x0c\x78\x1e\xb5\xb6\x73\xf3\x94\x89\x05\x59\xd0\x5a\xc5\xde\x00\xb2\x2d\x5f\x93\xf3\x05\x57\x7d\x95\x93\x1f\x58\xdc\xb5\xd7\x7d\x42\xc9\xc1\x46\x57\x8d\xb6\xe8\xce\x81\xb8\xab\x34\xe1\x41\x7b\x85\x7d\x7b\xd5\xaf\x02\x6e\x5b\x45\xb5\x66\xb5\x78\x4d\xfe\xf3\xe4\x3f\x7e\xf3\xd3\xf8\xf4\xaf\x27\x27\xdf\xbd\x1c\xff\xeb\xf7\xbf\x39\xf9\x8f\x09\xfc\xe3\xd7\xa7\x7f\x3d\xfd\xc9\xfd\xf1\x9b\xd3\xd3\x93\x93\xef\xbe\x7c\xf7\xb7\x8f\x57\x17\xdf\xf3\xd3\x9f\xbe\x13\x4d\x79\x8b\x7f\xfd\x74\xf2\x1d\xbb\xf8\x3e\xb2\x93\xd3\xd3\xbf\xfe\x2a\x61\x92\x54\x2c\xbf\x8e\xc6\x29\xd8\xc6\x5b\xd1\x95\xee\xb7\x89\x47\xbf\xc2\xfb\x71\xa1\xc7\xb2\x1e\x63\x27\xaf\x21\x0b\x7a\x74\x57\xee\x68\xb7\xbf\x23\x2d\xd5\x6a\xab\x9e\x38\xf6\x78\xcf\x97\xe0\x71\x1c\xf0\xd6\x8e\x5d\x60\x2a\x7a\xc3\x77\x9a\x7d\xc0\xf5\xd9\x0d\x92\xd2\xac\xac\x64\x4d\xeb\x25\xc9\xad\x72\x6b\xf9\xa8\xa4\x6f\x8f\x4c\xac\x0e\x93\xcc\xf9\xc3\x30\xbe\x07\x55\x71\xc9\x72\xde\x94\x7b\x49\xcb\x06\x3d\x87\x9b\x7e\x07\x65\x47\x6c\x51\x13\xe7\xeb\x63\x5f\x73\x25\xb9\x68\x76\x8b\x82\x8a\x3f\x95\x38\xfd\x61\xa7\x16\xc5\xd1\xd1\x4a\x8d\x6f\xd0\x4d\x83\x13\x8c\xcc\xd9\xb1\xf2\xef\xe2\xe0\x89\x4a\x62\x34\x67\x5a\xdf\xc8\x13\xdb\xd5\xa9\x61\x04\xdf\x01\xaf\x70\x80\x34\xfc\x51\xd0\x42\x12\x93\x37\xf1\x7f\xb2\xaf\x0c\x57\xb4\x97\x08\x6f\xd7\xb9\xaf\x08\x2e\x41\x98\xb3\x89\x17\xa7\xa4\x90\x59\xe0\x00\xd6\x61\x06\x00\x1c\x2e\xdc\x25\x8e\xb7\x15\x1a\xa0\x30\xe3\x22\xaf\x07\xca\xd0\x42\xa1\x77\x0b\xcf\xa0\x40\x1b\x88\x86\x70\x66\x09\x90\x60\xba\x2d\xe9\x27\x5e\x36\x25\x69\x94\x99\xad\x14\xdd\x5e\xda\xc9\xde\xb9\x3a\x73\x90\xca\x8e\x0b\xf8\xa8\x23\x1a\xc7\xa8\x28\xe7\x8c\x5c\xfb\xfd\x6b\xd5\x21\x68\x4a\xb7\x92\x9c\x6a\x40\x90\xb0\xf3\xb0\x6c\xb2\x9c\x82\x63\x85\xe7\xd8\x94\x2f\x55\xb6\xc5\xa5\x12\xbc\xe8\xde\x2a\x57\x44\xc8\x6f\x6f\x23\xac\xbf\xe2\x73\xba\x01\xcf\x98\x37\x8a\xe6\x88\xd2\xf9\xa0\x44\xee\xe7\x11\x3c\x8f\xf7\xde\xdc\x29\xc9\xf6\x2e\xa1\x1d\x9a\x1d\xd6\x2f\xea\xba\x87\x52\xe7\x49\xe8\x51\x48\x5c\x9a\x9d\x8f\x5e\xa7\x63\x49\x7d\xb6\xcc\x6c\x0a\x3f\xde\xa9\x03\x87\x83\x22\x7c\x43\x18\xdb\xd8\xfc\xc7\xe9\x7e\x9c\xf9\xf1\x86\x4d\xd1\xbd\x09\xbf\x01\xd9\x5d\xf5\x85\xce\xa1\x46\xab\x60\x1a\x62\xf1\x98\xaf\x0e\x88\x7e\x57\xa5\x5c\x44\x14\x10\xfe\x46\x59\x83\x33\xef\x05\x28\x7a\xda\x89\x93\x57\x28\x62\x0b\xc6\x72\x8c\x05\x2c\xda\xf9\xd7\x8d\xe8\x9d\xfd\xcd\x29\x99\x32\xaa\x9b\x1a\xbd\x7f\x84\x91\x72\x0a\x27\xc0\xa1\xda\xa9\x66\xe6\x50\x20\x05\x62\x2d\x4b\xa2\x04\xad\xd4\x5c\x6a\x50\x9d\xd0\x8a\x66\x5c\x47\x84\x97\xe9\x9a\x66\xb7\x50\x63\xb9\x66\x76\xb6\x7d\x53\xcb\x4e\x6d\x14\x43\x08\x11\xdd\xd8\x47\x3d\xaf\x65\x33\x9b\x43\x28\x1e\xbe\x95\x15\x54\x61\xcc\x65\x9f\x91\x7d\x63\xef\x56\x31\xa0\x48\xbe\x14\xb4\xe4\x99\xaf\x34\x55\xcb\x05\x57\x5c\x5a\x23\x15\x8c\xda\xbf\x68\x4a\xae\x7c\x19\x20\xb4\x8c\x9d\x17\x94\x97\xe4\x44\x31\x46\x2e\xdc\x25\xc1\x5f\xae\x51\x40\x40\x75\x67\x8c\x83\x55\x68\x54\xb3\xa9\x8f\x6d\xe6\x14\xf3\xc4\xa9\x6e\x03\x37\x86\x98\x84\x58\x16\x9e\x37\x4e\xbb\xbf\xc0\xaf\x01\xe3\xcd\x2b\x96\x35\xf8\x0b\xba\x6a\x78\x4c\xe4\xb2\x75\x8f\xe9\xe9\xf5\xec\xea\x52\x85\x6a\x05\xbc\xcb\xb6\xc0\x12\xfc\x60\xd3\x2d\xfb\xbc\xb2\x1e\x13\xf4\xf4\x6c\x08\xac\x80\x42\xcc\x0b\x9e\x37\xb4\x40\xd2\x1a\xb1\xc8\xf3\xeb\x4b\x1c\x98\xcf\xe6\x7a\x7c\xc7\x40\x11\x8c\x3c\x50\x8b\xfb\xdc\x74\xf9\x9a\xd3\x36\x57\x40\x84\x23\x6a\x30\x5b\xc5\x34\x2e\xf9\x8e\x2e\x21\xff\xbc\x75\xfe\xed\x78\xfb\xb8\x9a\x30\x38\xc0\x54\xf6\x51\x99\xd2\xd1\x6f\x0b\x42\xbd\xcb\x3e\x03\x94\x92\x51\x01\xcc\x38\x68\xf4\x0d\x3c\x01\xd6\x58\x5f\x73\xff\xfd\x0b\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xaf\xcc\xb6\x07\x69\x6a\xd1\x42\xec\x47\x56\x56\x05\xd5\x7b\x71\xc0\xf9\x7b\x60\x72\x08\xec\xe1\x06\x89\x51\x91\x8f\x69\x61\xae\xca\xd5\xb7\xe7\x36\xe0\x15\x11\x4f\xa2\xa7\xdd\x47\x47\x84\x84\xaf\xa5\x6c\xd8\xf0\x8d\x38\x07\xb2\xa7\xde\xb0\x1c\x28\x88\x9d\x5b\x9c\x93\xb0\xbc\x13\xac\x76\xb0\x77\xf5\xed\xf9\x88\xf0\x09\x9b\xb8\xbf\x7c\x67\x8e\x3c\x6a\x39\xc3\xd0\x19\x17\xa2\x16\x63\x5b\x97\xf9\x04\x97\x13\xea\xf7\xc3\xde\x7f\xf8\xb3\x59\xa8\xf9\xf5\x2f\xe3\x3f\x07\xb5\x0b\xff\xf2\x83\xa1\xc7\x51\xbe\xaa\x3f\xac\x7c\x17\xc6\x5c\x00\xd1\x33\x7f\xfd\x70\x65\xcb\x16\xdb\xa2\xc6\x3f\x44\x3a\x55\x10\xc2\x84\xae\x97\x13\x72\x25\xc1\x0f\x8f\xe7\x78\x65\x61\xfe\x35\xfb\x87\x33\x0b\xc1\x71\x79\x0d\x7a\x46\x35\x13\xc0\x95\x3c\x58\x01\xb8\x6d\x36\x03\x00\x0c\x00\xc8\x89\xc2\x2e\x9d\x80\xea\x15\xd3\xe1\x8c\x88\x96\x98\x9c\xbe\x1f\x97\x9b\x76\x26\x08\xfb\xc4\x15\x64\x3f\xc3\x1d\x87\x63\xa3\x36\x24\xc4\x31\x72\x66\x58\x03\x09\x3e\x67\x5e\x25\x63\x7c\x37\x60\xfd\xbf\x16\x52\xff\xda\x5f\x06\xe7\x51\x0a\x1c\x9b\x24\x74\x21\xb9\xab\xb1\x6d\x10\x8f\x00\x23\x4b\x54\xa2\x09\x7b\x9e\x37\x4b\x52\x72\xa5\xe9\x2d\x9b\x90\x6b\xc3\xce\x85\x4e\x26\x78\xca\x82\x40\x2d\x3c\x96\x93\x46\x68\x5e\x44\x4a\x74\x7e\x2e\xb0\x31\x01\xab\x07\xa9\x25\x9a\xcc\xf0\x24\x55\xcd\xc6\x8e\xb5\xc4\xb7\xa2\xf4\x2e\xb6\xaa\xa7\xdb\x93\x76\x4f\x47\x1e\xf4\xe7\x14\xd5\x22\x55\x0e\x9d\x5b\x4f\xed\xe8\x0b\xbb\x16\x4d\x61\x76\x43\x8a\xac\x65\x1d\xe1\xd8\xd5\x84\xbc\x07\x7e\xb0\x88\x01\x72\x74\x1a\x43\x3d\x90\xb5\xb2\x09\x96\x31\xa5\x68\xbd\x44\x27\x76\xee\xab\x6b\x37\x8a\x4d\x9b\x02\xd8\xe5\x98\x2d\xa1\x02\x2b\x99\xd7\x2c\x93\x42\xe9\xba\xc9\xe0\x1c\x29\xb9\xa9\xe5\x2d\x13\x6d\x18\x52\x14\x62\x0c\x3d\xee\x5b\xd7\x66\xc3\xf6\x08\x49\xb2\x39\x15\x33\xe6\x53\x80\x90\x92\xe6\x00\x45\x5f\x7a\x01\x2b\x66\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\x37\x86\x23\x73\xf6\xc8\x98\xc9\x7e\xf0\x41\x00\x65\x60\xbc\x14\xbc\xd8\xb1\x23\x6f\x8a\xad\x6a\x0c\xfc\x77\xbf\xe0\x9e\x64\x9b\x2a\x99\xa6\x39\xd5\x74\x9f\x71\x1a\xef\xa8\x2f\xe3\x6e\x7d\xa1\xe0\xd0\x03\x1f\x29\xcb\x66\x39\xa9\x50\x56\x3c\x4c\xec\x72\xf5\xed\x79\xe4\x48\x20\x06\xc2\x39\x43\xde\x48\x6d\xee\x91\x35\xcf\x03\xe4\x61\x68\x8c\x8b\xc5\x30\x93\x70\x63\x22\x39\x60\x39\xc9\x9b\x04\x6d\x7f\x4b\x54\xe2\xec\x99\x89\xd6\x4c\x73\xde\xfb\x3c\x98\x8f\xad\x9b\x50\xd6\x8d\x2c\xd8\x28\x4c\xa0\x05\x9e\x09\xcd\x6b\x16\xa4\xf7\x89\x1c\xcc\x9e\x6a\x23\xf0\xa6\x77\xcf\x17\x01\x60\xc6\xb4\x6a\x5d\x92\x91\xfc\x47\xf7\xaf\x2d\xe3\x88\xb3\x04\x5e\xd6\x9d\xb9\xd5\xdf\x6d\x5c\x54\x64\xef\x08\x37\x4a\x5a\x32\x6f\xd8\x9b\xbd\x1c\xf9\x36\xb6\x65\x9a\x19\x6c\xff\x4e\xe6\x29\xe6\xe8\x6d\xbd\x0f\x3a\xc3\xb5\xe1\x69\x18\x15\xa9\x40\xf9\x8c\x2f\x80\x43\x8c\xea\x24\x37\x42\x1a\x35\xa7\x8b\x84\x54\x2a\x5b\x6b\x3c\x5b\x39\x67\xec\xab\xf0\xc2\xc4\xc6\x30\xb1\xf1\xab\xe8\x29\xa4\x38\xf2\xba\x16\xed\xd0\xdb\x1d\x24\xd1\xea\xfa\xa8\x44\x10\xae\x19\xf4\x7f\x9d\x68\x71\xdd\x1e\x7a\xda\xd1\x2c\x33\x60\x9d\xa8\xbc\x03\x9e\x0d\xf6\x67\xdc\xa0\xed\x94\x1d\xfc\x75\x87\x6d\xb6\x82\x96\xd7\x99\x61\x38\xe5\x89\x53\xa2\x4d\x2c\x98\xb8\x3c\x95\xdd\xd7\x4f\xb7\x1e\x16\x38\xff\xcd\x5a\x9c\x84\x3e\x2f\xad\x3f\xb1\x93\x41\x8d\xac\x57\x83\x0d\xcd\x85\xf1\x9b\x8b\x57\xcb\xa2\x60\x35\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\xc7\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\x9d\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x29\x57\xfd\xef\x4e\x8d\x7b\x26\x96\xb8\x75\x6f\x02\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\x9b\xc2\xb0\x68\x01\x48\xf9\x19\xad\xf0\x12\x5a\x06\x6f\x7d\x60\xd3\x94\xed\x00\x3d\x73\xf8\x71\xdc\x28\xc8\x8c\x74\x3e\x9c\xb4\xbe\xdf\x56\x7a\x4b\x4a\x32\xee\x9a\x85\x8e\x4e\x67\x5d\x7f\xcb\x95\x71\xc3\xbc\x77\x1b\xe7\x1a\x3f\xfa\x16\xfe\x58\xdb\x78\x64\x41\xf6\x34\xde\xab\xcb\xea\x7e\x10\x29\xaf\x63\xdb\xc6\x85\x0b\x3c\xd5\xc1\x15\x34\xcd\x1f\x67\x7b\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x61\x06\xff\xb4\x49\x21\x53\x20\x8a\x20\x54\x85\x23\x6d\x70\xe2\x6d\xaf\xf7\x97\x50\xd4\xd4\x9a\xf6\x5d\x4a\x0a\x43\xa6\xcf\xae\x2e\x71\x7e\xa9\xa3\xbf\x05\xfc\xb6\xb4\xcc\xba\x9e\xf3\x3a\x1f\x57\xb4\xd6\x4b\x54\x76\x8e\x3a\x73\xf3\x51\xf5\x49\x83\x6c\xe9\xd7\x14\x57\x06\x39\x6c\x9d\xe3\x86\xad\x72\xc6\x7b\xeb\xc3\x71\xef\x99\x1d\x62\x3d\xf1\x51\xf9\x1b\xd7\x13\x16\xb1\x74\x8a\xc1\x27\x5c\xcf\xe3\x23\x0e\x48\x17\x57\x1e\x96\x07\x32\xc8\x59\x75\xbd\x1e\x91\x51\x01\xe9\xc7\x2a\x90\x65\x18\x1c\xeb\xb9\x69\xd0\x3d\x99\x9e\x46\x84\x4f\x0d\x91\x96\x62\x0c\xd6\xfd\x84\x89\xb4\xc6\x4c\xcb\xbb\x4f\xac\x83\x3d\x6a\x8b\xe0\x42\x06\xf3\x09\x06\x69\x6f\x3a\x39\x11\x32\x46\x99\xe4\x1a\xe0\x09\xec\xf5\x14\x63\x1f\xee\xb1\x5c\xdd\xa4\x24\x9c\x24\x2d\xf7\x10\xaa\x99\x02\x0c\xe6\x18\x18\x2e\x72\x03\xa4\x40\x12\x41\x01\xa5\x9a\x2c\x63\xcc\xab\x80\xed\x25\x4d\x61\xdd\x3b\xb8\xd1\x6e\x58\x49\x75\x36\x67\x8a\x28\x09\x59\xd5\x95\xa6\x45\xc1\x72\x6f\xd6\xc4\x03\x95\xc0\xd7\x59\x93\x67\xc2\x88\x01\x63\x98\xb2\x41\x81\x0a\xce\xea\xc0\xab\x82\x5a\xe5\xe3\xb4\x11\x19\xfa\x0c\x73\xbd\xf4\x56\xad\x55\x66\x1d\xf4\x36\x0a\xf4\xac\x29\x0c\xe5\x14\xed\x56\x81\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xb6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x09\xce\x82\x44\x1d\x23\xe4\xc6\x42\x96\x49\x1c\x87\x4e\x41\x5c\x6c\xcf\x20\x86\x6b\x3b\x09\xb6\x6c\x8d\x71\x3c\xf5\x0c\xa3\x62\xbe\x1c\xb8\x4a\xe1\x5a\x88\xf5\x82\xa2\x8d\x96\x25\xd5\x3c\x03\xf5\x2c\x9f\x06\x46\xde\xd2\x17\xe5\xf3\x4e\x4e\x48\x54\x81\xa8\xdb\x5d\x4f\xbe\x56\x9b\x99\xcd\x47\x6d\x5b\xb0\x53\xf6\x34\xba\x9b\xe2\x96\x1a\xb0\x1a\xc9\x73\xff\xe8\xf2\xa6\x10\x3d\xaf\x19\x23\xbc\x34\x62\x12\x15\x9a\xe4\x7c\xea\xf3\xe5\x38\x9b\xfd\x43\x67\x97\x26\x89\xfe\x1d\xfc\x41\x82\xfe\x50\xd5\x5d\x14\xf2\x4e\x11\x7d\x27\xbd\xda\xad\xb5\xe5\xda\x7c\x29\xa3\xee\xb0\x49\x14\xd4\xf6\x6f\xd0\xb6\x39\xe9\x00\xd3\x8e\xcc\xad\xbd\x63\x45\x61\xfe\xff\x10\xbe\x4d\x88\xf4\xda\xb8\x4e\x3e\x13\x98\x88\x83\x2b\xa7\x66\xb5\xf1\x64\x27\x79\x2d\xab\xca\x9a\x81\xca\xd3\xc7\xac\x13\x5c\x9b\xea\x05\x53\xe0\xa6\xe7\xa2\xd9\xcc\x91\xcd\x98\x60\x35\xd5\x60\x08\xb7\x19\xb4\x81\x38\xae\x4e\x27\x5e\x6d\x89\x6d\x2b\x39\xad\x07\x0c\xd0\x6d\x61\xf3\xb1\xbb\x77\xec\xaf\x49\x73\xe5\x02\x21\xc0\xdd\xd8\xa4\x23\x3d\xf9\x82\x69\x7a\x4a\xbe\x51\x78\x50\x9e\x5e\xf8\x28\xc1\x28\xe9\xdc\x66\x39\x42\x01\x3d\x69\xf8\xb3\xa2\x9a\x07\xe3\x87\x52\xae\x0f\xb5\xee\xee\x54\x67\x66\xe7\xb5\x54\xea\xbd\xfb\x64\x2f\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\x87\xdb\x20\x01\x1f\x7a\x3d\x80\xef\x0e\x79\x27\xdf\x87\x0c\x61\x17\x51\xef\x6c\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\xde\xab\xf4\xa4\x80\xd3\xef\xe8\x72\x22\x98\xb6\x79\xe8\x9c\x6e\xff\x83\x1b\xfd\x6f\xb5\xe1\xfc\xac\x80\x16\xdc\x22\x77\x81\x5d\x12\xc1\x60\x14\x2d\x91\x14\xb7\xde\x37\xf0\xfc\x58\x59\x8f\x0e\xf3\x3b\x04\xdb\x93\x4e\x49\x96\x09\xb9\xb6\xde\x82\x2b\x83\xaf\xa7\x0a\xcb\x99\xa6\x3c\x2e\x0f\x65\xd8\x1c\xa5\xfc\x78\x0f\x8d\x3e\x00\x25\x24\xdb\x81\xac\x0f\xdd\x3c\x84\xaa\xa5\x0d\x81\x0e\x3c\xe2\xc3\xa8\x92\xf6\x85\xc7\x5b\x2a\x2f\xa7\xe4\x03\xcb\xe4\x82\xd5\xb8\xdf\x17\x9f\x2a\x2a\x8c\x98\xfe\x96\xf2\xc2\xec\xb6\xdb\xf5\xd6\x7a\x01\x45\x90\xbb\x6e\x09\x81\x11\xcc\x5f\x23\x7b\xb4\x06\x72\x52\x98\x41\x9f\xf3\xce\xf4\x6c\xfd\x74\xab\x9a\x2d\xb8\x6c\x94\x8b\xa7\x69\x34\xd2\x31\xa5\xad\x6c\x3a\xe7\xb3\xb9\x7b\xd9\xf9\x99\x83\x07\x50\x9d\xfb\xab\x92\x30\x07\xa5\xa9\x6e\x54\x37\x51\x4e\x06\xee\x04\x4f\x62\x03\xf6\xe7\xbd\x5f\x86\x6f\x3b\xe6\x0a\xe3\x8f\x0e\x89\xc6\xbf\xc2\x88\x27\xec\xe4\xc6\xde\x02\x17\xa6\xd5\x86\x99\x65\xb2\xac\x1a\xcd\x82\xdb\x62\xa1\x35\x15\x6d\x25\x1e\x64\x27\xef\xe5\x8b\x92\x0a\x3a\x63\x63\x3f\x89\x71\x1b\xa1\xf5\x62\x0b\xac\x95\x78\xa4\xe4\x11\x89\x17\xc3\xf6\x8c\x23\xab\x56\x16\x9b\x1e\x79\x4e\x1e\x19\x7d\x4e\x1e\x13\x81\x4e\x76\x19\x85\x4e\x7c\x2a\x8b\x43\x5e\xc7\x0f\x76\xcc\xd5\x0b\x69\x89\xd5\x43\x17\x72\x3b\x91\xc0\x12\x2d\x3b\x2a\x57\x44\x96\x5c\x6b\xe6\x1c\x99\xfd\x05\x1b\x11\xae\x3b\x99\x16\x2c\xe2\x00\xa5\x39\x7a\x23\xb3\x4f\xbe\xac\x76\xcb\x98\x25\x4e\x06\x84\x9f\x3b\xae\x90\xf1\x12\x84\x97\x15\x16\x66\x01\x04\x30\xb6\x71\x92\x4e\x35\xec\xe7\x9d\x81\x2f\x21\x61\x9f\x40\x91\x8f\x53\x1b\x30\xd3\x80\x99\x56\xda\xcf\x01\x33\x61\x16\x8b\x94\x24\x2b\x1d\x8c\xe4\x3e\xb7\x39\x2e\xe9\x0d\x2b\xc8\x8f\x0d\xab\x97\xc4\xb0\xad\x6d\xa4\x17\x54\x03\x57\x3c\xc7\x98\x26\x67\x35\xdb\xb3\x96\x6c\x3b\xa6\x09\x2c\x6d\x17\x9f\x0c\x77\x0f\x39\xdb\x1e\x81\xaf\x57\xbb\xea\x66\x02\xc5\xdd\xf2\x3b\x18\xf2\xe4\xe8\x74\x1a\x3e\x01\xb6\xfb\xec\xfd\x9b\xed\x04\xaa\x34\x67\x43\xb2\x8d\xc3\xe1\xda\xe2\x93\x89\x15\x21\x67\x0f\xec\x09\xee\x9d\xff\x05\xa8\x84\x77\x17\xf5\x3a\x7b\x72\xcb\x96\x23\xeb\x0e\x4e\xcc\xe9\x53\xf7\x72\xf2\x64\x30\x2e\xa4\xad\x5a\x68\x3a\x8d\xcd\xbe\xdd\x6d\x5b\x23\xe1\xed\x14\xbd\xd8\xe2\xcb\x45\x76\xbf\x72\x9b\x96\x8a\xeb\xb7\xa6\x12\x49\x65\x25\xc3\x76\x5f\x89\x49\x84\x21\xa8\x07\xe7\x72\x23\x78\xb0\x81\xac\x13\x80\x90\x52\x0f\x91\x6c\xaf\x50\xc3\xe6\x36\xf6\xd1\x4b\xdd\xe2\x62\x85\xe3\x77\x63\xf9\x6f\xd9\xf2\x58\xd9\xa4\x77\x52\xa8\x39\xaf\xb0\x04\xaa\x62\x80\xa3\xb6\x03\x78\x6c\xdf\x82\x6b\xbb\x1b\x16\x31\xd8\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x40\x68\x12\x5c\xab\x37\x92\xa9\xf7\x52\xc3\x93\x83\x9f\x0b\x2e\xf1\xa9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x2e\x05\x91\xb5\xdd\xca\xad\x06\xd6\xae\x88\xb2\xb2\xc3\x3a\xeb\x43\x6b\xd4\xdf\x34\xae\x3d\x35\x59\x77\x0e\x6d\xc7\x53\xb0\xc3\x83\x2e\x12\x7f\x01\xed\x2a\x78\x97\xb8\x90\x1a\x2c\xdb\x4b\x35\x9b\x25\xb9\xba\xb4\xad\x64\xf5\x0c\xb2\x3c\x66\x09\x05\x1f\x83\xc9\x6f\x49\x58\xb1\x6d\x45\x5e\xc3\x81\xb7\x04\xf6\x1d\xf9\xf8\xef\xb8\x2b\xe0\x93\xbe\x82\x50\xae\x43\x4a\xc7\xc1\xb0\xc8\x5d\x94\xb4\x32\xb7\xef\xbf\x0d\x13\x01\x80\xf9\x3f\x50\x33\x5d\x4d\xc8\x19\x51\x5c\xcc\x0a\xd6\xf9\xcd\xaa\xf9\x83\x6e\x92\x27\x00\xd6\x37\x43\xe3\x17\xb4\x60\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x1d\xdd\xb2\xe5\xd1\x28\x51\x91\x4a\x42\x9a\x60\x3a\xb9\x14\x47\x6d\x4a\xda\xce\xbd\xf4\x7c\x16\xf8\x1b\x1c\xc1\x6f\x47\xbb\xe6\x51\x9f\x48\x48\x7d\x32\x37\x51\xab\x54\x3e\x2f\x28\x1a\x56\x0e\x61\xbe\x58\x1d\x73\x53\x51\xc2\xeb\xe0\x9d\xd6\xa4\x65\xa3\x97\x9f\x50\xd3\x0e\x19\x61\x92\xc3\xac\x92\x0e\x76\xb5\x0c\xd0\x41\xcf\xe6\xde\xc1\x83\x60\x6b\x9f\x53\xdc\x9c\xc5\xb7\x9b\x3e\x08\x62\xcd\xb9\x4a\x3f\xae\xcb\xe9\xaa\x8f\x42\x90\xee\x24\x8c\xe2\x91\xb5\x8d\x5a\x5f\xf3\x21\x86\x0a\x89\x6d\x25\xa5\xd8\xda\xa9\x6d\x6b\xdd\x1f\x6a\xa6\x2a\x89\xfe\xb5\x1b\x17\x6b\x59\x84\x39\x55\xe0\x93\x35\xb5\xe6\xd6\xaa\xa9\x2b\xa9\x6c\x79\xbb\x55\x90\x4f\x8c\x5c\xb2\xe1\x64\x2e\xc8\x14\xc3\xc0\xfd\x4d\x30\xf7\xc7\xe7\xa5\x3e\x5b\xc9\x49\x28\x6b\x48\xd6\x66\x1d\xc4\x44\xce\x33\x2b\x4f\x52\x4d\x44\x5f\xc2\x98\xb0\x6d\x3e\x68\xe7\xfb\x89\x22\x8d\x4f\x92\x85\x47\xee\x58\x37\x9c\x25\x13\x1a\xac\x82\x82\x5c\x8a\x29\xa3\x8a\xdf\x14\xcc\xba\xb3\x29\x4d\x75\xd2\x9e\x04\x4e\x5c\x76\x6f\x8c\x30\x01\x94\x8b\x6b\xb5\x6a\x0e\x3c\xe1\x22\x2b\x1a\x38\x41\xc1\x8b\x53\x50\x04\x51\x91\xb1\x02\x29\xa7\xcc\x7d\xac\xf0\x16\x11\x4b\x81\x39\x73\xca\xea\xda\x96\xc3\x5b\x6e\xbe\x49\x24\x97\x0c\x9d\x70\x20\xb8\x6e\x84\x0b\xd9\xec\xbb\x68\xb7\x36\x05\xb1\xe2\x0e\x50\x72\xc5\x10\x5e\x71\x5f\xb1\xda\xea\xb4\x08\x2a\xf2\xd8\x55\x5b\x8f\xb7\xeb\xc0\x9a\x39\xc2\xc4\x15\x36\xeb\x44\x98\x90\x3b\x61\x22\x36\xe1\xc3\xfe\x31\x34\x6e\xf2\xb8\xbd\xe9\x63\x40\xd0\x2c\x41\x41\xbd\x35\x86\x8e\xab\xa8\xe5\xda\x63\x51\x32\x94\x17\x70\x29\xe7\x3a\xc9\x53\xdb\x78\x87\x47\xd3\xc9\x6f\xe1\xba\xc8\x29\x79\xdb\xd6\x80\xe5\x0a\x0c\x16\xdc\x25\xa4\x33\xc0\x8b\xf7\x09\x0d\xe7\x78\xb9\x0d\xbe\x4e\x55\xa4\x6e\xb1\xe7\x8f\x20\x83\x6d\x07\x8e\xdf\x70\x51\x13\x6b\x09\x4c\x56\xef\x23\xb8\xea\x7b\xdf\xd1\xc4\x5d\x8d\x5c\xeb\xb4\x27\x29\x42\x67\x2d\xd3\xac\xab\x3f\x79\xcb\x6f\x6a\x46\xce\xe7\x54\x08\x56\x04\xf9\xa1\xad\x11\x8b\x6a\x4d\xb3\x39\x62\x26\x4a\xcc\xbd\x2a\x98\x3e\x56\x64\x2e\x95\x26\x25\xcd\xe6\x5c\xf8\xe4\xa1\xc2\x67\x23\x6f\xb3\xb9\x1c\x3c\x75\xd6\xde\xab\x36\x5b\x08\x08\x4b\x1d\x77\x8a\x39\x47\xf4\xe4\x93\x00\xaf\xf5\xd2\xd6\x49\xb4\xf7\x10\xf6\x19\xa5\x1c\xc0\xca\xf0\x6e\xcc\x18\xf7\x97\x94\x26\x97\xa5\x37\x4c\x72\x11\x10\x1e\x66\x3f\x20\x7c\x4a\x1a\x91\xe0\xe2\x9d\x70\x27\x8b\x26\xa2\xa6\x51\x37\x7b\x79\xd1\x08\xb3\xe9\x6d\x95\x9a\xb7\xe7\x44\xd3\x7a\xc6\xb4\xe9\x8d\x88\xa6\xbc\x61\x75\x7f\x1a\xf3\xfd\x15\x56\x3b\x48\x1d\xd4\xce\x0e\xf4\x94\x2f\x25\x1f\xdc\x57\x10\xee\x01\xdc\xc0\x54\xc6\xd1\x61\xf4\xd1\x73\xc5\x57\xb1\xf4\x9e\xc1\xd5\xdf\x5a\x52\xd2\x88\x18\xea\x9c\x52\x1f\x15\xcf\xf2\xef\x7f\x7f\x9f\x5a\x9c\xee\xb8\xfd\xf2\x3e\x00\xb9\x93\x75\x91\xdf\xf1\xdc\xba\x63\x92\x13\xf3\xf2\x69\x2c\xb0\xec\xb8\x56\xdd\xf6\xa9\x74\x53\x75\x53\x77\x77\x3c\xdf\x4b\x9d\x59\xe8\xb8\xbb\xd3\x4e\x74\x32\x3b\x4d\x60\xab\x79\xce\x84\x36\xa8\xa3\x56\xe4\x04\xbe\x88\xc9\xf5\x70\xc1\x31\x23\x1f\x8c\x00\xd5\x70\xca\x1b\x2e\xda\xa4\x92\xed\x59\x1b\x72\x63\x6e\xbe\xd3\xb6\x2a\xa6\x31\xaf\x17\x44\xf4\x4b\x3d\x27\x8a\x97\x4d\xa1\xa9\x60\xb2\x51\xf1\x25\xe8\x3f\xcb\xe3\x9e\x16\xec\x13\xde\xcd\x5d\x26\x4e\x6e\x7b\xed\x72\x0b\x10\x4f\xd4\x66\xa3\x5d\x65\x17\x7a\x7a\x6d\xc3\x34\xf3\x17\x9e\xb1\xf0\x59\xf5\xd8\x27\x96\xd9\x7c\x1a\x55\xd1\xcc\x78\xaf\x44\xf5\xc6\xcc\xcc\xc8\xa4\xf9\x6b\xf2\xb6\x9d\x30\x44\xef\xba\x5f\xb0\x44\x31\xd8\xed\xed\x40\xe4\xfc\xfa\xf2\x8d\x4d\x7f\x2a\x94\x66\x74\x57\x3c\x4a\xac\xa9\x73\x6c\xd5\x11\x3b\x62\x78\xb0\xb3\xc4\xcb\xde\xe6\x7f\x5d\xd5\x9e\xd9\x5f\x6c\xad\x03\x9f\x37\x3f\x36\xe1\x67\x02\xd0\x0f\x9c\x1a\xb6\x07\x38\xb5\x30\x75\x7e\x30\x81\x9c\x55\x4c\xe4\x50\x8c\x2f\x80\x7b\xdc\xa5\x9d\x1e\x91\x2d\x1c\x97\x4a\x97\x5d\xbd\xb9\x0e\x51\x0e\xf4\x2e\x73\x59\xe4\x8a\xb0\x4f\xba\xa6\x06\xcd\x97\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x44\xd5\xcf\xe7\x54\x20\x9c\x3c\x09\x17\x98\xff\x9c\xb8\x40\xc5\xb2\x9a\xe9\xa8\xc0\xe2\x2d\xca\x86\xb8\xce\xbb\x1b\xd8\x79\xbc\x26\xca\xe3\xaf\x2e\x3c\xa6\xad\x0d\x1c\x35\x9e\x50\x1c\x8a\xf0\xad\x54\x1c\xae\xa8\x52\x5e\x3a\x06\x22\x67\xaf\xad\xea\x64\x9a\x88\x18\x02\x35\xb5\x7c\x4a\x84\x5c\x99\x69\x18\x08\xe4\xf5\xa8\x9d\x57\x22\xba\xf7\x16\xb3\x12\x0b\x11\x50\x01\x21\xf5\xd8\xcd\x08\xe2\x8c\xf1\xdf\x68\x34\x33\xeb\x0a\xe4\x7e\x58\x59\xcc\x3e\xd9\xb5\xef\xf6\xb2\xa7\xb9\xf2\xc4\x47\xbf\x6d\xa7\x87\x7b\x1f\x10\x57\x17\x50\x15\xab\x02\xea\xe6\x88\x65\x50\xb9\x93\x2f\x18\x64\xa0\x75\x09\x59\x0d\xe3\x9b\x37\x18\xb4\xe4\xd2\x42\x74\x93\x3d\xc4\x07\x77\x07\x21\x37\xad\x17\xc3\xa5\x50\x9a\x42\x5e\x00\x58\x85\xa1\xaa\x86\x00\xda\x5c\xbf\x16\x10\x51\x5b\xee\xb2\x0b\x44\x0f\x57\x1a\xa2\x99\xb1\xda\xc0\x5a\xb1\x24\x77\xb5\x8c\x77\xaa\x4c\xd4\xfb\xca\x05\xab\x17\x9c\xdd\xbd\xb0\xd1\x70\x63\xb3\x80\xb1\x0d\x28\x7f\x01\xe2\xe1\x8b\x5f\xc2\xff\xa2\xc6\x4f\xd6\x43\x5a\x6c\xfd\x9a\x1c\xf5\x97\xe4\xdb\xd6\x3c\x3b\x85\x04\xd2\x3b\xad\x7a\x66\xbb\x5c\x51\x1a\xda\x87\x56\x0c\x88\x51\x12\x5a\xfc\x16\xb0\x2e\xe6\x42\xb8\x8e\x6c\xfa\x3e\xa2\xcc\x19\xb5\x61\x92\x8d\x10\x11\x5e\xb6\x5d\x39\x00\x3b\xec\x08\x01\xde\x29\x80\x8b\xb1\xae\x19\xf3\x8b\xd2\x96\x4d\x14\xd2\x95\x6e\x88\x2c\xc8\xb9\x07\xc5\x65\x4e\x35\x55\x4c\xc7\xa9\xa9\xd3\x51\x51\xd0\xbd\x59\x71\x88\x95\xec\x4f\x60\x69\x64\x90\xcf\xc6\x65\x41\x26\xe3\xbf\x58\xe1\x40\x74\xde\x34\x62\x81\xdd\xe9\x18\x2c\x3f\x77\xe5\xab\x9c\x0f\x35\x8e\xd2\x1e\xd0\x2e\x79\x56\x3b\xc7\x6f\xbe\xb9\x7c\x93\x2a\x14\xb5\x5f\x3a\xd9\x01\xfe\xdd\xdd\x26\x0b\xc8\x50\xa7\x8a\xff\xd8\x84\xea\x0e\xa8\xe3\xe1\x41\xd0\xbe\xbf\xab\xb5\xcd\x32\xd6\x1a\x17\xde\x70\x75\xbb\xcb\x5b\xbe\xd6\x79\xf7\xbe\xff\xed\xfc\x82\xd8\xa7\x0f\xd9\x07\x7a\x06\xd9\xb5\xf5\xa0\x7b\xf3\xff\x76\x7e\xb1\xb2\x84\x15\x45\xc0\x59\x51\x38\xf9\xcc\x08\x1a\x2e\x5d\x82\xc5\x09\xc9\x1b\x04\xb8\xc3\xf0\x3e\x35\xc3\x1a\x83\xc1\xcc\xf3\x49\xa6\xb8\x4f\xa9\x3a\xbb\x65\x13\x2e\x03\x47\x84\x3d\xd7\x80\x9c\x65\xac\x75\x3f\xc9\xb9\xba\x3d\xb4\x7e\xa3\xca\xdf\xf7\x25\xde\x78\x5e\x06\x9d\x55\xe1\xde\x95\x07\x0a\xea\x84\x2d\x65\x43\xee\x6c\x45\x84\x68\xf5\xc1\x47\x5e\xbd\x26\x17\x42\x35\x35\x6b\x7d\xb9\x57\x07\x33\xfc\xfa\x0e\x95\x09\x50\x60\x43\xbd\x3e\x98\xf1\xe7\xc0\xe0\x4a\xd2\xa8\x41\x45\x6b\x0d\x92\xff\x3e\x00\xc8\x77\xee\xc8\x45\xf0\x40\xec\x06\x82\x2e\xa7\x2e\x02\x71\x64\x73\x8a\xfb\x42\x8a\xae\x9b\xd6\x63\x04\x68\x75\x1a\x94\xbc\xf5\xe5\xac\xc8\x8b\x9c\x2d\x5e\xa8\x9c\xbe\x1a\xc1\x54\x5d\xcc\x7d\x77\x5d\x54\x91\xa3\x57\x47\x31\x63\x5c\xf3\x92\x17\xb4\x2e\x30\xa3\x9d\x4f\xf4\xe7\x7b\x32\xf8\xd7\x0d\x09\xee\x9b\x2f\x8f\xc8\x89\xac\x61\xec\x8c\x0a\x52\x30\x97\xfd\xce\xe2\x8a\x25\x8a\x1a\xa7\xcf\x18\x24\xf7\x61\x5d\x44\x64\xba\x17\xf0\xcd\x1d\x37\x68\x39\x99\x4e\x61\xa3\x37\x2d\xb1\xe7\xc2\x50\xd7\x09\xf9\xc6\x52\x67\xcb\xf1\x20\x6c\xe4\x40\x6a\xf1\x8d\xe7\x7b\x32\xcf\x47\x85\xb7\xa2\x8c\xdb\x91\xaa\x8d\xac\xdb\x84\x9f\xf1\x69\xf4\xab\x04\x67\x5c\x7f\x60\x95\xdc\x29\x8f\x8b\x5d\xae\x18\xb4\xb8\x36\x0f\xa4\xe2\x50\xb9\x9b\x6a\x42\x11\x47\x65\x4d\x41\x8d\xd4\x8b\x06\xab\x24\x46\xd4\x8e\xb3\xc2\x7e\x7e\x0c\x6b\xa8\x05\x91\xe4\x56\x91\xe2\x67\x32\xb2\x58\xbd\x57\x63\xea\xab\x03\x43\xe1\x10\xf0\x8d\xe4\xfa\xdc\x77\x8b\x01\x86\x85\x14\x36\x04\xd0\xf4\x6d\x6d\x60\x33\xae\x6d\x5a\x74\x1c\xca\xfc\xec\x7a\xeb\x19\xb4\x2d\x52\x02\x55\xcd\xfd\x2a\x0e\x6e\x43\x6b\x0f\x6d\x57\xf2\xb7\x2b\x14\xbe\x17\xe9\xdb\xd7\x86\x77\x89\xbf\xd0\x3f\xa1\x7d\x1e\x4b\xba\xdf\xb9\xfa\x4b\xae\x82\x10\xfa\xc0\xd6\x1a\xe1\xe8\x78\x32\x39\x9e\x00\xdb\x70\x3c\x39\x76\xac\x65\xe1\x9d\xa1\x2d\x15\x6e\x87\x4d\x2b\xb3\xd7\xbd\x2d\x13\x42\xbe\x76\xf9\x09\x20\xe9\xf2\x8a\xe7\xb5\x77\xaa\x6e\x6b\x47\x63\xba\xba\xee\x9d\x8b\xd2\x14\x83\x0e\xbb\xb9\x09\x27\x6e\x5d\xb5\x67\x7c\x61\xf3\xb1\xee\xd4\xf4\xd5\x4e\x30\x11\x1e\xc2\x95\x59\x25\xc2\x87\xaf\x76\x3b\x33\x44\x22\xc9\xf3\xb2\xb8\xc7\xce\x2a\x93\x65\x89\xe5\xc0\xe6\x5e\x16\x6e\xf3\xf9\xc5\x22\xbe\x78\xf5\x05\x96\x46\x9b\xf6\xdc\xc3\x44\x94\xee\x3a\x5d\x51\x57\xf8\xc7\x36\x3f\x88\x68\x85\x2a\x40\x8b\x6a\x4e\x6b\xa6\xb0\x84\xb9\x2d\xd8\xdc\x5f\xe7\x73\x05\xcb\xfb\x31\x1e\x56\x35\xb6\x53\xdc\xbf\xb2\x31\x1e\x7b\x32\x91\x57\x92\xf7\x27\xcf\x1a\x93\x8a\xea\x87\x53\x5b\xc7\x63\x58\x3f\x68\x22\xe4\xfa\xef\x1c\xe8\xba\x07\x41\xf5\x47\x9b\x35\x2e\x38\x16\x2d\x2b\x59\xc8\x59\xb4\xf7\x4f\xa4\x38\xa9\xe7\xfb\x91\x24\xf5\xdc\xad\xae\x5d\x82\x97\x99\x74\x54\x84\xe7\x06\x66\xce\xd6\xdb\x54\x2e\xf5\x9f\x65\xdc\x5e\x78\xa8\x7c\xf1\xe1\xe2\xec\xcd\xbb\x8b\x49\x99\xff\x12\xe3\x40\xc6\x74\x1c\x53\x35\xf3\x73\xe0\xaa\xd7\x36\x12\xf5\x1c\x80\x13\x5c\xb1\xca\xb6\xee\x62\xc5\xea\x92\x63\x8c\xe2\x21\xd9\xed\x3d\x9f\x50\x3f\xa7\x6d\xb0\xe2\x55\x2f\x58\xa7\x1d\x8d\xeb\xb3\x8b\x96\xab\x9a\x8d\x7d\x61\xa8\x29\x2f\x20\x08\xab\xa5\xe8\x01\x96\xee\xe9\xde\x69\x8e\x9d\x12\x1a\xfb\x28\x96\xab\x1a\xe4\x96\x3b\xf5\x3a\x7b\x4c\x88\xdd\x5f\x48\xd4\x57\x81\xb5\x9a\x3a\x3a\xc3\xc2\x4e\xb5\xcd\x47\x5b\xd5\x7c\xc1\x0b\x36\x83\x92\xd8\x5c\xcc\x54\x9b\x5b\xd0\x1a\x51\x7b\x06\x80\x38\x38\xd6\xd2\x25\x6f\x26\x7b\x07\x26\x51\x9f\x2e\x09\x81\xfa\xfd\xd7\x1f\xa1\x58\x3d\xd8\x5f\xf7\xac\x3e\x36\xd3\xe9\xc5\xfa\xfb\xd0\x1a\xef\x8e\xd2\xec\x15\x4d\x3b\x73\xd0\x26\xc0\x8d\x54\xe9\xa1\x4e\x0d\x51\x3e\x25\x6a\x59\x16\x5c\xdc\x8e\x7c\xa1\xb1\xa9\xb4\x29\x56\x19\x31\x3f\x38\x70\xae\x19\x2d\x1e\x43\x0c\x76\x0e\x04\x24\x8d\x10\xe8\x3d\xe9\xf1\x81\xb1\x32\x77\xf5\xdf\x1c\xda\x41\xdd\x49\x22\x16\x8f\xb0\xcb\x3f\xbb\x6d\xe5\x25\x9d\xed\xd4\xf1\x17\x3a\xec\xa0\x6d\x41\xbe\x3e\xbf\xf4\xf5\x02\x43\xc5\x05\xbe\x2b\x6b\x42\x6b\xcd\xa7\x34\xd3\xa7\xa4\x6a\xa0\xaa\x0b\xd4\xa8\xb0\x64\xd6\xde\x8e\x7b\xbc\x02\x7a\xa6\xf3\xb1\x15\x23\xc1\x45\x4b\xc9\x62\x61\xfa\xd7\x50\x1c\x1a\xe4\xde\xa6\xb2\x4e\x05\x10\xb2\xea\xaa\xcc\x5f\x35\x45\x71\x25\x0b\x9e\x2d\x7d\x81\x03\x54\xbf\xe4\x06\x15\xf5\xe2\xa2\xb3\xe2\x8e\x2e\xd5\xeb\x70\xe6\x84\xc2\x33\x42\xb5\x66\x65\x85\x20\x63\x96\xbb\x9a\xe8\xb8\xd5\xc0\x60\xe1\x5d\x57\x60\x7d\x4a\x79\xe1\xef\x7e\x63\x1f\xf4\xe2\xf2\x31\x79\xcf\x16\xac\xee\xce\x44\x98\x47\xd0\x89\xea\x8e\x0e\x1b\x0f\xdc\x4c\xa3\x40\xbe\xc1\x9a\x0a\x6b\x07\xd5\x33\x4b\x3e\x5d\xe9\x16\xeb\x91\x58\x98\xe8\x9f\xf2\xe5\xf4\xbd\xd4\x57\xf8\x76\x77\xe6\x38\xe7\x7b\xfa\xa7\x85\xe1\xc6\x96\x6e\x1c\x73\x98\x39\x57\xb7\x8f\x9a\xac\x97\xc7\xc2\x2d\x8f\x07\x3a\xa8\xc0\x5b\x63\x22\x43\x80\x3c\x3b\x9a\x81\x3e\xf8\x2d\x37\xcb\xb2\x10\x5f\x33\x1b\x4a\x3d\xb2\x40\x58\x32\xea\x6a\x39\x0b\x76\x07\x95\xd9\x75\x5b\x29\xd8\xaa\x5e\x32\x59\x32\x42\x17\x94\x17\xf4\xa6\x00\x4f\x0b\xd3\xb9\xed\x2b\x42\x02\x3f\x83\x55\x81\x85\x51\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x3a\x13\x5e\x1b\x9c\x40\x21\xb3\xdb\x90\xdf\x80\xca\x56\xca\x95\xa8\x87\x9b\x4c\x97\x84\xe6\x39\x51\x7c\x26\x20\xdc\x59\x68\x52\x50\xcd\x44\xb6\x9c\x10\x9b\xca\x59\x05\x95\xa3\x75\xcd\xbd\x5f\xbf\x80\xba\xed\x6d\xb5\xcc\xec\x56\x4e\xa7\x2b\x95\xa6\xad\xe9\xd3\x22\x0a\x5c\x3d\x55\x52\xe0\xe0\x4c\x29\x3a\x8b\x42\x14\xab\xa5\x63\x70\xe7\x6d\xf2\x01\x87\x8e\x5c\x66\x01\xe7\xba\x54\xbb\xd0\xd8\x36\xf4\xd5\x43\x5b\xdd\x08\xcd\x4b\xb6\x92\x75\x93\x80\xfe\x76\xcd\x85\xc1\x0c\x65\xd3\x92\x42\x60\x8a\x0d\x74\x75\x25\x59\x78\x6e\xe7\xb7\x66\xeb\x5d\x45\xa8\xe0\xef\x17\xb3\xde\x00\x2f\x03\x2c\xba\x25\x42\x71\x67\x9b\xee\xa5\xe5\x52\x4e\x20\xce\xb6\x3d\xe8\xef\x7e\xfd\xfd\x64\x11\xda\x18\xe0\x73\x43\x3e\x4f\xcd\xcc\x4a\x56\xcf\x5c\xcd\x91\x92\x0a\x3e\x65\xca\x9c\xfa\xd2\x80\x88\xd5\xe3\x41\x51\xa2\x3b\x03\x1c\xe8\x4d\xb1\xb2\x90\x5e\xdc\xf6\x71\x45\x47\x18\x9c\x52\x2b\x96\x9d\xd4\xf2\xd4\xd6\xc4\x17\x63\xf6\x89\x65\x8d\x86\x7b\x02\x56\x74\x72\x22\xa4\x79\xd6\x6b\x13\xbc\x6e\x6e\x90\xe1\x82\x01\x56\xa6\xeb\x2a\x70\xe9\xe0\x6c\x7a\x77\x4b\x35\x37\x15\xee\x15\x9b\x1a\x9e\xe0\xd5\xe4\x77\xbf\x8b\x59\x30\x7a\x73\x42\xef\x8a\x65\x4d\xcd\xf5\xd2\xa0\x37\xf6\x49\x4f\xa6\x0a\xea\x59\x9c\x43\xaa\x06\x4b\xbc\xe6\x14\x14\x46\xe8\xfa\x89\x57\xa4\x05\x5e\x03\x50\x07\xf7\x53\xab\x3c\x65\xdd\x07\x2f\x67\x97\x3d\xb5\x08\xcc\x40\x60\x0b\xe6\x6a\x42\xae\xa4\xc2\xec\x0f\x3e\xbf\x4f\x94\xf3\xee\xb3\xa1\xe7\xa6\x7d\x76\x14\x9d\x80\xd4\xf2\xbc\x69\x7a\xff\x0a\x42\x5e\x1f\xe1\xc1\x8c\xf3\x1a\x92\x64\x6a\xa2\xe9\x6c\xa5\x84\x86\xac\x3b\x8b\x6e\x73\x31\xef\xd8\xce\x60\xd7\xb8\x8f\xdb\xf4\xc1\x09\xdf\xe4\x72\x15\x60\xba\xf1\x0e\x36\x3b\x4f\xcc\x36\x7e\xc1\xe6\x74\xc1\x36\x12\x81\x4a\xe6\x93\x0d\x78\x13\x80\x35\xa6\x6b\xc3\xb4\xfb\xb0\x02\x9f\x1e\x46\x29\x56\x42\x69\x88\x7b\xc8\xce\x26\x1a\x7a\xb3\x24\x85\x94\x90\x78\xa1\xa9\x88\x90\x39\x33\x60\x06\x6e\x0b\xb4\x50\x23\x72\x7d\x66\x5f\xac\x82\x21\x31\x79\x18\x70\x48\x15\xcb\x36\xbc\xb0\x07\xb9\x3b\xc8\x8b\x8d\x44\x33\xc6\xab\xac\x13\x15\x20\x6d\x38\x4b\x5b\x9a\xc5\x16\xac\x28\xd8\x82\x81\xe1\x6d\xca\x67\x04\x13\x72\x97\x36\x45\x9b\xf3\x22\x92\x35\xa4\x39\xae\x79\x1e\x23\x2c\xaf\xd2\x77\x73\x20\x77\xb2\xbe\x2d\x24\xcd\x83\x02\xec\x8a\x14\xfc\x96\x91\x37\xac\x2a\xe4\xd2\xe6\x55\x13\x39\xb9\xd6\x54\xb3\x69\x53\x5c\x47\x6d\x64\xac\xfc\xab\x32\xc5\x77\x2a\xff\x9a\x0e\x57\xe4\xdf\xcb\xeb\xf3\xeb\xcb\x67\xe9\xff\xfa\x38\x6d\xc4\x8b\x5f\xc2\x6a\x0f\xad\xe7\xe3\x3f\xf6\x19\x7c\xc7\xa4\x68\xfa\xdf\x41\x13\xfa\x95\xac\x35\x2d\x76\xc4\xdb\x64\x73\x5a\x9d\x35\x7a\xfe\x86\x2b\x28\x5b\x93\xca\xe2\xac\x7d\x1f\xa4\xdd\x61\xa0\x37\xb6\x1c\x26\xe1\x0e\xa6\xec\x7b\xe7\xff\x76\x76\x45\x68\x63\xe0\x40\xdb\x84\x52\x3b\xd3\xf0\x87\x2b\xbb\xc6\x34\x8c\x5b\xae\xcb\x7e\xdd\xb3\x2a\xf7\xd6\xbe\xd7\xf4\x54\x01\xc4\x83\x77\xf0\x01\xbd\x83\xfb\x51\x14\x49\x63\xb8\xb8\xe0\x9a\x53\x2d\xeb\x7d\xb9\x55\x76\x06\xf0\xde\x16\x8d\xd2\xb2\xb4\x17\xe4\xd2\xbd\x01\x61\x38\x91\x36\x83\xb5\x6e\x5b\x67\x0d\xb0\x64\xc2\x46\x5d\x0a\xcd\xea\x29\xcd\xd8\x4a\x0a\x8c\x11\x28\xa0\x70\x74\xee\xde\x89\x18\xf7\xcf\xd6\x4f\x09\xaa\x04\x17\x7f\x79\xfd\xe7\xc0\xd1\xf8\x2f\x9e\x45\xb3\x6a\xaf\x90\x1b\x13\x2c\x8b\x4b\x8a\x97\x72\x72\x3f\xa6\xe2\x2d\xfe\xa3\x58\x71\xb8\xc2\x2d\xf8\x7f\x0d\x2d\x70\xeb\xe2\x0e\x20\x65\x92\x9d\x63\xd8\x0b\x7c\x75\x0f\xda\xae\xcf\x9f\x2a\x86\x76\x01\x3e\x41\x91\x51\xd8\x45\xeb\x9a\x0a\x65\x0e\x32\x55\x58\x3a\xb6\xec\xe2\x31\x39\xd1\x59\x15\xe1\x7f\x9d\x14\x1b\xe9\xe3\x22\xed\x3f\x7a\x3e\x48\x4f\x20\x55\x34\x22\x64\xe8\x70\x33\x3e\x22\x38\x7c\xe5\x13\x48\xc5\xae\x6a\x2f\x2e\xde\x70\xbb\xf6\x92\xb0\xc7\x76\xed\xa1\x24\x5c\x3c\xb2\x4e\xe4\x2b\xae\x34\xa6\x9a\xc0\x97\x21\xd4\x18\x93\xf1\x18\xe6\xf7\xca\x48\x09\xbc\xfa\x2f\x9a\xe7\xf5\x6b\xa4\xf2\x4e\x07\x5e\xc7\x44\x92\x1b\x11\x45\xfb\x02\x7a\x4e\xf2\x38\xd1\xcb\xca\x56\x6b\xff\x78\x7e\x05\x7d\x29\xf2\xa7\x3f\xbc\x04\x6e\xf8\x77\xbf\xfd\xc3\xcb\x68\x30\xfb\x2c\xb3\xf6\x90\xff\x85\xde\xe6\x87\xc8\x06\xd1\xc9\xe8\x00\xd9\x7f\x0d\x0f\x7a\x8d\xc9\x0f\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xb7\xe3\x54\x87\x94\x04\x43\x4a\x82\xb6\x0d\x29\x09\x36\x4f\x2c\x90\xd4\xf7\xe2\x00\x12\xf4\x0f\x49\x67\xd7\xa9\x1c\x12\xb8\xab\xcf\x91\xc0\xf5\x1e\x68\x3f\xba\x48\xdb\xd2\x30\x0c\x2c\x2e\xef\x57\x9b\x26\xeb\xcd\xfb\xeb\xff\xfa\xea\xec\x8b\x8b\xaf\x60\x9d\x36\xae\xcc\x80\x35\x17\x7b\x52\x6a\xed\xe8\x12\xc5\xee\xf5\x6e\x1d\xd8\xc5\x8a\xeb\xba\x20\xef\xdf\x5e\x27\x7a\xad\xef\x55\x47\xf8\x4b\x31\x8d\xd9\xb7\xc3\x3a\x02\x9a\x97\x14\xab\x77\x97\x43\x6f\xaf\xfe\x82\x41\x3d\xd0\x8e\x16\xc7\x9c\x34\xae\xe2\x00\x6a\x94\xbe\x63\x24\x9f\x89\x4f\xb7\xd9\x34\xdc\xc8\x67\xe9\xcd\xbd\x9f\x23\x89\xe5\x99\xeb\xf4\x44\x90\x91\xe9\xd3\xea\x20\x5b\xa4\x41\x48\x48\x22\x6a\x43\x3c\x0d\xd9\x64\x4a\x39\x82\xf1\xb9\x42\x75\xb5\xa9\x90\xc2\x2e\x51\xfd\xc6\x01\x6c\x11\x05\x57\x05\x22\x70\x96\xef\x98\x67\xfb\x2c\x4b\x9b\xab\x40\x84\xf6\x52\x20\x80\x15\xcd\xfa\x49\xf9\xce\xea\xdd\xb4\x8f\xf0\x09\x24\xbf\x3f\x38\x31\x81\x51\x77\x98\x8e\xc4\xf7\xb7\x8f\x8b\xe6\x3b\x5f\xcd\xcc\x4a\x53\x8e\x98\x50\xe5\x3d\xe9\xd0\x0b\x2f\x29\x85\xeb\x13\xc3\x00\x79\x86\x94\xe8\xef\x7b\x53\xa0\xec\x5a\x79\x52\xcd\xa5\x96\x62\x7f\x89\xa2\x36\xf5\xdf\x45\x5c\x57\xf0\xc6\xb9\x77\x07\x08\x10\x1f\xe6\x8a\xf0\x26\xf3\x15\x2f\x71\x6b\x1e\x4f\x73\x10\x0f\x43\x32\xaf\x36\xcd\xed\xe1\xe8\xcc\x8d\xcb\x79\x4e\x81\x9a\x55\x7e\xf9\x66\x47\x98\x6b\xc8\xb7\x8c\xed\x99\x56\xc6\x30\x27\x9d\x78\x38\xe6\x13\xb7\xeb\x97\x6f\xac\xa0\xe1\xb2\xd1\x29\x7b\x1f\xc8\xfd\x57\x71\x67\xbc\x93\xac\xf5\x9d\xac\xf7\x90\x87\xbe\xdb\xf3\x4a\x38\xa1\xfd\x6d\x2d\x0b\xe5\xce\xf1\x4a\x77\x12\x49\x69\xe5\x56\x57\x60\x76\xb4\x67\xe8\x7b\x72\xca\x7d\xca\x27\xae\xaf\x49\x26\xcb\x4e\x5d\xbb\x39\x43\x3e\xe0\xfc\xfa\xf2\x1d\x9f\xe1\x54\xdc\xac\xc9\x94\x51\xdd\xd4\x6c\x3c\xa3\xba\x6f\x68\xae\x48\x9f\xcd\x76\x0f\x38\x0e\xcf\xef\x73\xc0\x73\xd7\x80\xe7\x02\x28\x7c\x08\xdf\x3d\x57\x74\xf7\xb4\x68\xee\x20\xfc\xda\xcf\x2a\x33\xba\xbb\x1e\x89\x3b\xe6\x3e\xb3\x4a\x58\x73\xd6\x2d\x69\xa0\x1e\xa9\xd9\xf7\x76\x46\x0a\x6a\xf9\x0f\xc0\x5b\x09\x54\xc0\x7f\x83\x56\x5a\x40\xa1\xb4\x28\xcc\xae\x4a\xd1\x16\x19\x51\xad\x9f\x2e\x3a\xb5\x96\xb4\xb2\x3e\xbb\xb9\xbc\x13\x77\xb4\xce\xc9\xd9\xd5\xe5\x6e\xb0\x57\x42\xde\x20\x84\xb5\xb8\x92\x7e\x5b\x64\x0e\x6a\xbb\x07\xca\xa0\xb1\x00\x23\x23\x37\x5c\xab\x4e\x49\xd5\x40\xe5\x65\xc8\x9e\x77\xca\x81\x40\x99\x1b\x7f\x29\x92\xd8\x30\x41\x64\xa6\xa9\xab\x01\x7a\xc3\xf4\x1d\x63\x82\xbc\x7c\xf9\x12\xed\x18\x2f\xff\xf8\xc7\x3f\x82\x53\x39\xc9\x59\xc6\xcb\xf5\x17\xe1\xad\x7f\x79\xf5\x2a\x66\xd0\x7f\x3f\x7b\xf7\x15\xa1\x19\xc8\x94\x58\xc6\x07\xc7\x86\x03\x0e\xbb\x57\x23\xf2\x7f\xaf\xbf\x7e\xef\x28\x8c\x5a\xf9\x15\xe0\xc7\x6f\x51\x94\x2c\x66\x83\xa4\x38\x84\xb1\xb5\xb6\x0a\xaa\xe7\x3e\x34\x88\x82\xa5\x33\x08\x20\xb3\x77\x3f\xca\xd1\x0f\x32\xfb\xf3\xd9\x1c\x36\x95\x0b\x80\xdf\x82\x67\x36\x67\x13\x5a\x8f\x5c\x01\x0c\xcc\x23\x80\xf1\x3e\x8e\xbc\x44\x8c\x61\x16\x3c\x42\xcf\x6b\x1b\x47\xd4\xd6\xc2\xae\x99\x32\xa2\xa6\x2d\x77\x8a\xc3\xb5\x30\xa4\x58\x74\xd1\x90\x7d\x38\xbf\xd8\xcb\xbd\x17\xbd\xa5\xc5\x1b\x96\x45\x2e\xb8\xd2\x41\xd5\x4b\x8b\x76\x40\x45\x4c\x2e\x68\x36\x27\x4c\x68\xc8\x47\x85\x07\x6c\x5e\x8f\x18\x64\x4e\x45\x6e\x6e\x18\x94\x47\x80\x01\x9f\xc8\x73\x65\x1b\x5f\x80\x2b\xbf\x07\x9d\x60\xc9\x16\x23\x53\x23\x01\x87\x60\xda\x32\x26\x41\x10\x5a\x64\xbd\xd6\x8b\x4f\x14\xd2\x74\x98\xad\x42\x75\xb1\xb2\x01\x71\x2a\x2c\xe6\x15\xd3\x59\x62\xc9\xf5\x34\xff\x0b\x42\x32\xcc\xbe\xf2\xb1\x6e\x94\xfe\xa2\x31\x07\x1c\x5b\x3a\x74\xdb\x62\xad\xe7\x6b\x23\xa2\xeb\x83\xb5\xf7\x81\x16\x38\xcb\x98\x42\x50\xfe\x01\xe3\x6c\x74\xfb\xf6\x0f\xb8\x91\xd1\xe3\xc9\xe9\xa6\x21\x5d\xe4\x2c\x17\x06\xf7\xd3\x46\xcb\x31\x54\xc9\x76\x19\x5b\x7a\x63\xa7\xdb\x76\x56\x54\x73\x3a\x22\x33\x1a\x30\xb1\xeb\x23\x06\x00\x68\xe5\x14\xf8\x22\x61\x9c\x07\x56\x61\x10\x9e\x35\xf4\x03\x64\xb5\x65\x8c\x05\x2d\x19\x44\x78\xe1\xc4\xa2\x07\x5b\x29\x4a\xa7\xf8\x4c\xb0\x1a\xb5\xb4\x10\x03\x4c\x0a\x7a\xc3\x0a\x3b\x94\xac\x13\x96\xf1\xa5\x8b\xa6\x63\xb5\xc1\x9e\x8a\xd0\xd9\xac\x66\x4a\xf1\x05\xb3\x41\xd4\xfc\x9f\x6d\x31\xbc\x39\x23\x57\x17\xef\x5c\x28\xb9\x22\x86\xb1\xd5\x2c\x26\x91\x1e\x36\x9f\xc6\xd1\x80\x56\x2b\x7b\x4c\x08\xb9\x50\x52\x43\x89\x37\xd3\xbf\x3d\x12\xe5\x4b\x3a\x83\x97\xe9\x18\x62\xc6\x53\xf6\xac\x8d\x02\xc2\x70\xf3\x39\xa3\xb9\x8b\xbb\x35\x2c\x65\x55\x19\x49\x9a\x9c\x9b\x2b\x3a\xb5\x65\xc6\x31\x32\x3b\x6f\x8c\xa8\x42\x7b\x55\x6f\x61\xfb\x38\x67\x44\xd6\x39\xc3\x22\xe6\x53\x70\xe6\xf1\xdd\x06\xf4\x1d\x52\x10\x71\x33\xd2\x0d\xd7\x35\xad\x97\x48\x31\xed\x49\x44\x0f\x67\x70\x26\x96\x57\x87\x5e\x61\x64\x08\xab\x22\x31\x39\xe5\x5c\x4b\x44\x68\x24\x41\xc2\x6e\x5b\x94\x6d\xdd\xb5\x54\x9c\x69\x1a\x80\xff\xb5\x85\xfe\xf8\xcf\x1e\x53\xe3\x9a\x10\x1c\x0f\x44\x86\x75\x64\xe0\xb3\x00\xe8\x6c\x6e\xe9\x7a\xf7\x8a\x12\x82\x92\x20\x8d\xf5\x48\xc3\x66\x23\xb2\xb9\x43\x02\xde\x2b\x9f\xe9\x89\x61\xa0\x75\x43\x8b\x62\x39\x66\x9f\x0c\x29\x31\x97\x18\x68\x28\xa4\xa9\x04\x77\xfe\x46\x28\xa6\x53\xea\xd6\x13\xbc\x7c\x55\x8d\xf9\x26\x14\x39\xc2\x35\x09\x09\x09\xa8\x8e\xb0\x5b\x23\x08\xdc\x34\x1a\x5d\xe0\x46\x9b\x3f\x49\x5b\xe7\x82\xd5\x4b\x3b\x42\xc2\x87\x5b\x80\x33\xd9\x12\xe6\x08\xdc\x41\x9d\xcd\x2f\x3e\x55\x35\x86\x1e\x25\x7e\xbd\x02\x7e\xab\x9d\x61\x96\x26\xc7\x3d\x76\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\x16\x3e\x01\x2c\x76\xf6\xfe\x4d\x0a\xfa\xc2\x96\xc2\x22\x76\x5b\x34\xc3\xd8\x6d\x8f\xb9\x81\xd8\xce\x1e\xd8\x1b\x9b\xe9\xca\xfd\x82\xc9\x89\x5d\x8d\x31\x27\xd5\x51\x72\xcb\x2c\x12\x36\x92\x27\x28\xbb\xec\xcb\x5b\x4c\xa7\x66\x10\xda\x8d\xb1\xea\x6c\x09\xdd\xe2\x48\xa9\x67\xb1\x35\x38\xbb\x89\xa4\xe2\xe9\xb6\x8d\xcd\xd4\xb7\xfa\xce\x6d\x5f\xf2\xc7\xdb\xde\x41\x6c\xb7\x2c\x42\xb5\xb7\xa9\x75\xe0\xcf\x9c\x97\x93\xda\x00\xa6\xcc\x03\x1f\x23\xe7\xc1\x88\x42\x6e\x63\x45\xb4\x4c\x3f\x52\xb2\x8d\xc7\x6c\xb7\xb9\x2d\xde\xc1\x82\xb7\xba\x70\xe1\x1c\xba\xb6\x91\x5b\xb6\x3c\x56\x78\x03\x0c\x06\x9b\xf3\x0a\x6b\x73\x19\xf2\x60\x24\xe0\x2d\xaf\x01\xb6\x6f\x21\x9b\x8d\x1b\x18\x71\xdc\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x7c\xe2\xca\x72\x7b\x6f\x24\x53\xef\xa5\x86\x27\x4f\x72\x42\xb8\xd0\xa7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x46\xc4\x9f\x25\x57\xe4\x12\x32\x7b\xe3\x96\x6e\x39\x34\xf8\xef\xba\x34\x29\x66\x60\x27\x63\x43\x2a\x1d\xeb\x49\xbf\x3e\xb2\x3d\x3f\x59\x77\x8e\x6f\xe7\x93\xb0\x13\x00\xdd\x18\xfe\x02\x19\xde\xaa\x82\x66\x2c\x77\xe9\xaa\xa8\xd9\x29\xaa\xd9\xac\xd7\xc7\xfc\xbe\x56\xb2\x7a\x06\xaa\xbc\x2c\x2a\x6d\xe2\x86\x05\x6c\x4d\x88\xb1\x6d\x49\x8e\xc3\xc1\xb7\x06\xff\x47\x46\x28\xed\xb1\x33\xe0\xb1\xbe\x32\xa8\xfd\x71\xbc\xda\x16\xf7\x32\x18\x1a\xb9\x92\x92\x56\xe6\x4e\xfe\xb7\x61\x3e\x00\x54\xff\x87\x54\x94\xd7\x6a\x42\xce\x5c\x1a\xad\xf0\x37\x2b\x3d\x06\xdd\x6c\x31\x85\x0a\x3c\x82\x7f\x6c\xf8\x82\x16\x36\x29\x07\x15\x84\x61\x9a\x31\x33\x9b\x55\x26\x74\x44\xee\xe6\x52\x21\x27\xe3\xc3\x6f\x8e\x6e\xd9\xf2\x68\x94\xa4\xc1\x70\x2d\xbc\xf1\x47\x97\xe2\xa8\xd5\x16\x77\x6e\xab\xe7\xd1\xc0\xab\xf6\x08\x7e\x3b\xda\x3d\x9f\xbb\x15\x67\xb5\x6d\x51\xe7\x4d\x13\x48\xbe\x62\x8f\x89\x87\x69\x5b\x7c\xa4\x17\xb6\x5d\x88\xc9\x0e\xa6\x37\x28\xce\x6e\x96\x2e\xa1\x9c\x15\x54\xd7\xe5\xd8\xa4\x21\x41\xe6\x0d\xe4\x63\x03\x62\x1d\x15\x41\xba\x48\x99\x78\x50\x2e\x3b\xce\xa1\x36\xd9\xd0\xd3\xba\x61\x23\x92\x4b\x71\xac\xad\xba\x2b\x4c\xba\xb8\x9a\xda\x2a\xdf\x70\x0e\x27\xea\x34\x69\x50\x5a\x33\xc8\xb5\xe5\x92\x48\x5a\x0d\x03\x26\x60\x04\x4d\xa7\x76\x1e\x22\xe6\xcf\x4d\x43\xc6\x07\xe4\xd9\x21\x6d\x58\x9e\x90\x80\xbb\x20\xad\x77\x38\x6c\x7b\xe8\xc1\xe0\x5d\xed\x69\xd2\x78\x0f\x01\x11\x60\xf1\x36\x4c\x10\xd5\x22\xff\x64\xb5\x4c\x1a\x61\x83\xea\x28\x1d\x3a\xe3\x2c\xfa\x6d\x8b\x0b\x3c\x69\x5b\x07\x34\x3f\x00\x7b\xbf\xb0\x86\x4a\xc8\xdb\x19\xe4\x25\xa9\x25\x1e\x0d\xf8\x3c\xc0\x0f\x37\xb0\xaa\xbd\x5f\xb9\xf6\xa8\x9e\xa9\x02\x30\xd0\xda\xa7\x51\xab\x1e\xad\xde\xc7\x39\x6b\x35\xf2\x72\x6a\x8b\xa4\xa3\xd1\xe1\xb1\xa0\xe8\x73\x6d\x34\x02\x13\x57\xa0\x55\x7c\x1b\xf5\xf8\x16\xc7\x8a\xfe\x16\xef\x68\xb5\x95\x15\xcc\x7f\xdd\xa9\x86\x4f\x6f\x64\xa3\x5d\xba\x10\xfb\x3b\xd4\x1c\xd6\xd2\xd9\x1f\xf7\xa7\x3a\xdf\x46\xc7\x91\xcc\xc8\x3f\x06\xa4\xd1\x13\xa6\xeb\x87\x35\x22\x8c\x66\x73\xc3\x01\x8e\xd1\xcd\xc2\x70\xa9\x8e\x1d\x7d\x63\xb6\x0e\x19\x43\xb9\x4a\x62\xd2\x80\xcf\x9f\x86\x03\xb9\xc0\x3f\xc7\x99\x8d\x9c\xcb\xa5\xb2\xae\x6b\x96\x39\x15\x6d\xe8\x42\xd2\x98\x4e\x3d\xe7\x52\x23\x5b\xd5\x0f\xac\x12\x64\xd4\x95\xca\x52\x46\xf6\x60\xb9\xf9\xcc\x5f\x8c\xa4\xf1\x36\xac\xa8\xcd\xa6\x63\xb0\xa9\xf5\x2b\x6a\xc4\xda\x48\x86\xe0\x25\x8f\x86\x59\x36\xcd\x42\xa8\x53\x6d\x05\xd9\x7b\x20\x57\x34\xf8\x9b\xb7\x29\x2e\xed\xa9\xfa\xc3\x48\x13\xbf\x83\x23\x52\xcc\xa7\x7a\x66\x75\x2d\x6b\xb3\x26\xa6\x14\xe1\xb0\xcb\x25\xad\x6f\x59\xee\xb9\xa4\x09\xb9\x32\x8b\x77\x32\x7a\xd2\x98\xb5\xa3\x46\x2e\x65\x74\x58\xa4\xcc\x4c\xe8\x78\x32\x39\xb6\x15\x14\xd6\x4b\x96\x25\x63\xaf\x54\x81\x7c\x0b\x31\xbc\x73\x7f\xdf\xd1\x4a\xa1\x3a\xc2\xb0\x37\xa0\x8e\x94\x50\x2b\x50\xcf\x9d\x4d\x91\x26\x84\xd8\xac\x2e\x67\x0b\x01\x68\x5b\xb5\xf2\x36\x2a\xe5\x24\xc3\x21\xb6\xed\xd5\xc8\x5b\xa9\x90\xef\x53\x1f\xdb\x93\xb2\x37\x7e\x5b\xcd\xff\x56\x1a\x98\x32\xca\x25\x70\xb5\x3d\x5e\xed\x08\xae\x5d\x5c\x91\xaf\x9d\xec\x13\xe7\x30\xa8\xe7\xb6\x12\xf6\x36\x7a\xb2\x27\xf1\x18\x5c\x6d\x4f\xe7\x41\xb8\xda\x2e\xa7\x98\x4f\x7c\x63\x41\xc4\xd0\xa5\xd3\xb3\x75\x91\xd9\x77\x57\xdb\x21\x5c\x0b\x57\xdb\x9e\x5d\x0d\x57\x5b\x9a\xeb\xe1\x6a\x4b\x71\x45\x5c\x6d\xa9\xd2\x19\xb6\xc7\x5f\xe0\xb0\x1a\x5c\xdd\x11\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x55\x80\xe4\xb6\xba\xb7\x96\x50\xe3\xd5\xa5\x37\x4a\x16\x8d\x8e\x2f\x39\x77\x5f\x77\x21\xdd\x87\x89\x3b\xcd\x66\x2a\xb1\x5f\xed\x38\xe0\x1b\x80\x6b\x43\x72\xbc\x5d\xaf\xbb\xd0\xfc\x6d\xaf\x05\x3f\xa4\xea\xef\x31\x09\x9f\xb0\x1d\x3a\xed\x13\xb6\x03\x27\x7f\x72\x83\x3e\x26\x05\x14\xb6\xa7\x4d\x04\x85\x6d\x4b\xf0\x4e\x49\x0a\xe5\xda\xa3\xb5\xac\x3e\x89\x39\x52\xcc\xa5\xcf\x2c\xdc\x11\x82\x20\x51\x93\x56\x28\x8d\x39\x3b\xa2\xad\xde\xb2\x67\x55\xdd\xe3\xd5\xfd\x2e\x46\xe5\xec\xea\x72\x2b\x2d\x4a\xf0\xfd\x3d\x7a\x94\xf0\x8d\x9f\xb1\x26\xe5\x12\x55\x23\xa1\x4f\xd6\x9b\x76\xe5\x36\xce\x32\x91\xb5\x79\x1a\x99\x72\x6d\xda\x6f\x0d\x5d\x0f\x73\x95\x06\xe7\xac\xa5\x0d\xe9\x69\x39\x00\x4b\x65\x5d\x99\x1e\xf4\xe5\x4d\x71\x02\x27\x4f\x23\x7f\x1e\x50\x96\x84\xfd\x88\xca\x23\xb9\xda\x3a\x27\x75\xdc\x56\xd2\x40\x65\x33\x2a\xbe\x02\x6d\x5b\x25\xf3\xd7\x68\x24\xa5\x42\x48\xac\x14\xa5\x46\x68\xa8\x50\x23\x6b\x86\x09\x52\x74\x88\x9c\x34\x3c\x47\x0f\x68\x9f\x5d\xe0\xf8\x73\x72\x4c\x83\xe5\x5f\xa5\x1e\x25\x79\xb4\x87\x19\xad\xf8\xb7\xac\x8e\xcb\x62\xbf\xa9\x75\x0e\xd6\xf6\xe4\x4e\x51\x65\x73\x56\x52\xf8\xe7\x5b\xb7\x3c\x83\x6a\xac\x7f\x3d\xa8\xe5\x58\x5d\x1a\xd6\x63\xd4\x89\x32\x3d\x5a\xbc\x4a\xf2\x8f\x6d\xdb\x23\x5d\x3c\xfc\x29\xec\x60\x33\xae\x3a\x22\x86\x01\x6e\xd0\x14\x80\x71\xc5\x65\x9a\xf1\x6a\x4b\x43\x65\x16\xb8\x7b\x4f\xb0\xf0\xdd\x98\xdf\xb1\x3d\x95\x9e\x66\x5b\xfd\xcc\xc8\xf3\x3e\x5d\x6d\xcb\x16\x53\x18\xf4\x33\x83\x7e\xe6\x7f\xb5\x7e\x26\x20\xec\x0e\xd7\x6f\x50\xbb\x84\x19\x51\x9d\xee\xa5\xad\x7b\x30\x41\xed\xa7\x53\xa3\x38\x1d\x4a\x5b\x62\x10\xcd\x1f\xc7\x93\xc9\x31\x1a\x40\x26\x5e\x5d\xda\xe8\xe9\xf8\x4f\x84\x89\x4c\xe6\xa6\x1f\x2c\x10\x58\x2b\x0d\xac\x65\x2b\xb1\x87\x73\x29\xdd\x58\xa1\x09\x05\xfa\xde\x96\x7b\xd8\x0a\x05\xbb\xa8\xfc\xb7\xbb\x61\xb0\xb6\x42\xa0\x2d\x2b\xe6\xeb\x32\xd9\x2d\xf3\xa5\xaa\x2c\x4f\xd6\xe6\x10\x28\x78\xc9\xad\x77\xb2\xc1\x2e\x4c\xe9\x74\xf7\x3d\x42\x4e\xb0\x9b\x49\x56\x35\x23\xdb\xe5\xa4\x64\xa5\xac\x97\x23\xdf\xad\xf9\xb1\x33\x8e\x7d\xe3\x14\x98\xbe\xac\xa9\x6b\x26\x74\xb1\x8c\x4d\x2e\xb5\xa9\x3d\x21\xf7\xe7\x76\xf4\xc0\xcc\x9f\x3f\xd8\x54\xff\x92\xb6\x75\xef\x7f\x5b\x87\x10\x14\x72\x7e\x57\x80\xc6\xd8\x34\x76\xa3\x56\x3f\x61\x9e\x32\xb1\x20\x0b\x5a\xab\xf4\xfb\x46\x1e\xcf\xef\xe5\x7c\xc1\xd5\x4e\x42\x0e\xae\x2d\xf1\x43\x3d\xb3\x6c\x74\xd5\x68\x8b\x8e\xdd\x35\x72\x15\xc9\xfc\xf5\x59\x61\x7a\x5f\xc5\xab\x88\xc2\x56\x51\xad\x59\x2d\x5e\x93\xff\x3c\xf9\x8f\xdf\xfc\x34\x3e\xfd\xeb\xc9\xc9\x77\x2f\xc7\xff\xfa\xfd\x6f\x4e\xfe\x63\x02\xff\xf8\xf5\xe9\x5f\x4f\x7f\x72\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xbb\x2f\xdf\xfd\xed\xe3\xd5\xc5\xf7\xfc\xf4\xa7\xef\x44\x53\xde\xe2\x5f\x3f\x9d\x7c\xc7\x2e\xbe\x8f\xec\xe4\xf4\xf4\xaf\xbf\xda\x6a\xba\x54\x2c\xbf\xde\x02\xbf\x61\x1b\x3f\x92\x3e\x76\x7b\xd9\x95\x27\x38\x17\x7a\x2c\xeb\x31\x76\xf7\x1a\x5c\x16\xb7\xe8\xd4\x81\xc5\x2e\xee\x61\x4b\x87\xdb\x1a\x7b\x4e\xf8\x78\x82\x8b\xb6\x2b\xf9\x62\x07\xc6\x82\x4a\xe6\x41\x60\xf4\xbe\xf3\x10\xd8\x80\x7c\xe5\xe3\xff\x6b\x50\x66\x88\x59\x50\x40\xd3\x7a\x12\x92\x93\xaa\xe6\x0b\xaa\xdb\xf0\xba\x20\xd2\x3a\x7a\xc0\x6c\x4e\xb9\x38\x6d\x83\xbb\x2a\x99\x03\x7b\xda\x28\xe6\xb3\xf4\x1b\x12\xff\xf1\xab\x6b\x92\x15\x1c\xdc\xe3\x6b\x9f\x62\x38\x7a\x18\x17\x5f\x3f\x63\x82\xd5\x18\x60\x4e\x56\xa7\x0f\xf5\x92\xb8\x46\xc0\x13\x79\x6f\xda\xdd\x60\xd7\x3a\x67\xf4\x01\x09\xbe\x4b\xdd\x86\x3e\xb7\xe8\x75\x08\xe1\xc6\x36\x8d\xa8\xf5\x43\xa4\x55\x55\xcb\x05\x4b\xf3\x9a\xb2\x3c\x05\x96\x30\x51\x0a\x1c\xf6\xc3\xed\xc7\x6d\x1d\xf9\x65\x83\x17\x68\x27\x16\x32\xfe\x80\x56\x7b\x25\xf7\xe5\x0e\xf8\x68\x1f\xe6\x92\xa9\x80\x45\x6d\x84\xe6\x0f\x57\x68\xbc\x67\x38\x45\xe6\x74\x61\x64\x4f\x26\x70\x91\x48\x95\xc1\x0b\xae\x7b\x2b\x02\x8f\xae\xc8\x7c\x56\xae\x59\x5c\xc3\x05\x58\x16\x20\xab\x46\x3a\x50\x59\x29\x71\x66\xf6\xa6\x5e\x82\x3e\x56\x12\xb8\x38\x78\xd2\xe1\x16\x5a\x30\xc7\xc2\xf2\x22\x47\xef\xcd\xe8\x11\x6d\x22\x0d\x0b\x3a\x2e\xbb\x2f\xdb\x0c\x80\x93\x6b\x4d\x75\xa3\x26\x5f\x98\x99\x7d\x60\xd3\x9a\xa9\xf9\x59\x3c\xa3\x68\xa6\xa8\x34\x2d\xab\x2d\x76\xc4\xdc\x60\xf4\x3c\xf6\xf1\x06\xa8\xba\xf0\x4b\xf6\xe5\xef\x3d\x5a\xb1\x19\x41\x52\x34\x8a\xa0\xa5\x1a\x21\x42\xa8\xa8\xb9\xd7\x08\x91\x1b\xc6\xb9\x65\x4b\x90\xf0\xb6\x04\xfd\x73\x03\xf9\xd0\x01\x26\xac\x49\xd8\x93\x8f\x9d\x55\x3a\xe4\x89\x01\xd1\xed\xd6\x18\x10\x84\x9c\x1b\xc0\x81\x4d\x48\x20\x0c\x5e\x5d\xbc\x8b\x1e\xcc\xe6\x30\xb2\x19\xa0\x03\x04\x77\x62\xfa\xff\xf2\xfc\xfa\x97\x7f\xb2\x43\x9c\x86\x5a\x81\xd2\xda\x11\x52\x87\xe2\x36\x53\xc7\x2a\x94\x23\xa2\xb0\x97\xb6\x0b\xb4\x6d\x65\x94\x78\xa7\x46\xfc\xd4\xba\x60\xd6\x4c\x37\x35\x08\xd5\xbc\xde\x34\xa8\x20\x05\xa3\xd3\x31\xd0\x2e\xa9\x31\x21\xc7\x69\xc2\x79\x5d\x81\x89\x3c\xb8\x5c\xeb\x87\x87\x3b\x38\x32\xe7\x97\x31\xb2\x94\x8d\x8d\x45\xc6\xda\x51\xc4\x88\xf3\xf1\x40\x46\x05\x64\x2e\x34\x94\x07\xd9\x02\xb3\x37\x18\x4c\xb1\x94\x0d\x10\xc2\x00\x78\x37\x02\x65\xfc\x4e\xae\xcd\x15\xf4\x09\x25\xbd\x65\x44\xdf\xc9\xee\x35\x82\x69\xf9\xf0\x54\x65\xc4\x6a\x2e\xb2\xb8\x62\xd1\xd8\xd0\x28\xdf\x39\xa4\xda\x1a\x47\x46\xd6\x05\xb5\x72\x15\xfd\x5b\x0e\x60\x85\x2c\x9b\xd3\xdc\x8a\x5a\x99\xdd\x83\x9d\x6d\xdd\x51\xeb\x9a\xa9\x4a\x0a\xd0\xb1\x02\x1d\x01\x15\xd8\x84\x90\x7f\x5f\xd9\x97\x84\x25\x16\x05\x11\x0c\xd5\xb6\xd9\x9c\x65\xb7\x36\x07\x2c\x57\x46\x5a\xc5\x10\xb5\x91\x55\x04\x8c\x61\x3a\x40\x10\xcd\x52\x97\x49\xce\x09\x99\x14\x36\x7b\x6f\x22\xf2\x09\x19\x10\x57\xa8\x5b\x91\x6c\x2e\xa5\xb2\x3c\x41\x57\xec\x0b\xf7\x90\xc7\xd3\x0b\xe4\x43\xfe\x0f\xcc\xb3\x29\x74\x78\xe7\x79\x59\xa1\x03\x10\xec\xed\xb1\x22\xb9\xcc\x1a\xff\xb7\xd9\xb9\x82\xd1\x5a\x90\xb9\xbc\x23\x3a\x3e\x6e\xc7\x5c\x8d\x95\x09\x5b\xcf\x66\x95\x10\xdf\x7e\xa0\xd4\x3b\xb7\x6c\xf9\xb1\x3f\xfb\x6f\xf8\x45\x1b\x49\xb3\x47\x63\xfc\x26\x74\x72\x28\xbf\xa4\xbf\xfb\xd8\xa4\x75\x34\x0e\xc8\xc0\xe0\x07\x50\xcb\x5a\x57\xb2\x15\x2e\x2f\xe1\x1e\x10\xf0\xca\x31\x1c\x73\x7b\xc7\x15\x51\x73\xd9\x14\xc0\xf8\x6f\xe4\x43\x26\x84\xfc\x7d\xce\x84\x25\x05\x16\x09\xa7\x39\x13\xdd\x87\xb0\xd7\x11\xb1\xc1\x21\xaa\x45\x22\x1e\x1d\xa6\x7a\x6b\x3b\x94\xd9\xe5\x3a\x6b\x16\xe0\x8f\x11\xb9\x61\x19\x35\xab\x5e\xc5\xc1\x12\x11\x66\x6a\x00\x07\x26\x19\x2d\x79\x3e\x76\xe8\x7d\xef\x61\x66\x9b\xce\xeb\x09\xe0\x76\x8d\x35\xd8\x03\xdc\x46\x32\x90\xdd\xa4\x3a\x65\x53\x68\x5e\x15\x98\x28\x0e\xe2\x50\x13\x2d\x65\x1d\xfe\xd3\x46\xb2\xc2\x98\x57\x1f\x2e\xbf\x3d\xfb\x78\x41\xbe\xbc\xf8\x77\x7c\x3c\x0a\x3d\x51\xa8\xe3\x32\x2d\x19\x4f\x1a\xf3\x96\x2d\xb7\xd8\x9b\x96\x7d\xc5\x75\x02\xb4\x9f\x5f\x7c\xf8\x78\xf9\xf6\xf2\xdc\xcc\x14\x1f\x8f\x56\x1d\x66\x90\x3d\x4d\x1a\x6e\x1d\x4f\xf9\xb8\x4b\xc7\xde\xc2\xdd\xc3\x1c\x46\x4b\x4c\xc0\x55\xb2\x9c\x1b\xd2\x94\xc2\x84\x9a\xf6\x8d\xea\xea\x5d\x5a\x40\x27\x90\xd0\x1e\x50\xc8\x15\x14\x83\x5b\xe5\x3e\x91\xa3\x73\xf0\x91\x86\x3f\x80\x07\x75\x78\x80\x6a\xc3\x6f\xd7\x9c\x2d\x50\xc5\xe0\x71\xc8\x26\xa5\x0f\x6e\x89\x67\x5d\x53\x7d\x7c\xfe\x61\x0d\x9f\x25\x6a\x60\xba\x02\xdd\x46\x26\xbb\xc3\x7d\xa5\xad\xd2\x27\x0f\x28\x96\xab\x18\x77\x0d\x7b\xde\x51\xe5\x64\x19\xab\xfb\x00\x40\x8d\x1f\x6d\x2b\x0c\x67\xe9\xcd\xe1\x91\x1a\x9c\xec\x40\x7e\x07\xf2\xfb\x40\xb3\xdc\xec\xa1\x80\xd3\xa0\x79\x70\xf3\x96\x53\x33\x34\x44\xbe\x76\xb4\x6f\x4e\xaf\xeb\x0b\x70\x40\xa5\xd1\xa4\x31\x30\xaf\x95\x4f\x7f\xc2\xc8\xd1\x87\xeb\xb3\xdf\xbd\xfc\xe3\x6f\x8f\x46\xf0\xcf\xdf\xbf\xfc\xd7\x3f\x98\x7f\x5e\x9c\xbf\xb9\x3e\xbb\xfa\xed\xbf\x04\x7f\xfc\xee\x4f\xbf\x3f\x4a\x0b\xd1\xb4\x1f\xfe\xcb\x6f\x5f\xd9\xd4\x2b\x47\x17\x6f\x7e\xfb\x2f\xff\xf2\xea\x5f\xb7\x48\xb3\x98\x78\x74\x25\xfd\x74\xf1\xa9\xe2\x58\x26\xe4\x9a\x19\x21\xf5\x60\x71\xcd\x9b\xc6\x76\xda\xaa\x92\x7e\xe2\x65\x53\xfa\xc2\xa6\xe8\x00\xa5\xb5\x55\xfb\xa6\x5e\x8a\xe0\xfe\x25\x02\x82\x57\x62\xca\x0a\xcd\xa3\xdc\xe6\x28\x24\x0b\x56\xdf\x50\x0d\x85\xd7\x2c\x21\xd8\xa8\x78\x55\x29\x62\xb3\x69\xad\x55\xc2\xeb\x0e\xda\xf4\xe4\x89\xb3\xbf\x9c\x12\x89\xdb\x36\x82\xda\x37\x63\x5a\x71\x5b\xc1\x11\x6e\x8a\x62\xda\x1a\x39\xfe\xf4\x87\xdf\xbf\x7c\x79\xf2\xdb\xdf\x93\xb9\x6c\x6a\x75\x3a\x59\x79\x3d\x69\x54\xab\x99\x03\x12\x6e\xaf\x90\x9a\xcb\x5a\xbb\xba\xc8\xbf\xfb\xc3\xcb\x97\xe4\xe4\x15\x0c\x75\x6a\xb5\x9b\xee\xc0\x21\xcc\x83\xde\x24\xf2\x29\x78\x22\x5c\x91\x3f\xfe\xe9\x0f\xbf\xfd\xbd\xe9\xfd\x5f\x5f\x91\x9c\x2e\x93\xd9\xac\x8f\xf7\xe9\x29\x2c\x60\x1a\x1e\x8f\x01\x72\x06\x1e\x60\x45\x9f\x65\xe3\x4e\xd2\x88\x84\x07\xf1\x5f\xdb\x4d\xfa\x35\xee\xd2\xbb\x0d\xd7\x03\x03\x6b\x84\x5c\xdf\xcf\xa4\x21\x95\xbd\x6c\x9d\x33\x40\x1d\x95\xd2\x35\xe5\x18\x76\xcf\x04\x14\x42\x01\x9d\x6d\x17\x1a\xd2\x84\x87\x1f\x3a\xe1\x2e\x3f\x74\x15\xb8\x82\x61\x39\x51\xb3\x99\x6b\xc9\x99\xc1\xad\x3f\xaa\xb2\xf1\xca\x96\x62\xa9\x36\xd8\x1c\x07\xd2\xe9\xa8\x34\xdd\x4c\xbf\x9d\x03\xdb\x0e\x92\xa4\x58\x2c\x75\xac\x3c\xf6\xc8\xc9\xf9\xf5\x87\x36\x55\x88\xad\xcc\xea\x98\x56\x9f\xf9\x64\xaf\x04\x06\x6b\xb4\x6c\x65\xa5\xc6\x4f\xef\x09\x6e\xb1\x3f\xfe\x8c\xe3\x5a\x3e\x9b\x0c\x21\xd7\x78\x14\x43\x7a\x90\x27\x4f\x0f\x82\x27\x31\xe4\x06\x69\x17\x37\xe4\x06\x81\x36\xe4\x06\x09\xdb\x90\x1b\xa4\x33\xee\x90\x1b\x64\x88\x3d\x19\x62\x4f\x9e\x3e\xf6\x64\xc8\x0d\x32\xe4\x06\xd9\xdc\x86\xdc\x20\xfd\x6d\xc8\x0d\xf2\xbf\x2d\x37\x08\x82\xd8\xa6\x0c\x21\x56\x22\x6d\xd3\x83\x7c\x76\xd9\x41\x94\x39\xe4\x8c\x9d\x65\x99\x6c\x84\xfe\x28\x6f\x59\x74\x74\xfb\x8a\x0e\x65\xad\x1f\x73\x29\xef\xd3\xa9\xac\xbf\x7c\x30\x05\xcb\x33\xac\x5e\x46\x9b\x9c\x33\x91\x16\xcf\xf2\x18\xd4\xeb\xc6\x73\xf4\xdc\xf0\x31\x22\x67\x79\xfb\x83\xc5\xcb\xda\x1c\xcd\x84\x9c\x91\x9a\x65\xbc\xe2\xb6\x44\x00\xc5\xe7\x69\xf6\x17\x73\x2f\x6c\x21\xe8\xa5\xb9\x2d\xac\x98\x7a\xf4\xe8\x0b\x44\xd7\x81\xfe\xc1\x52\xea\x95\x29\xa5\x89\xb1\x66\x9a\xc8\x07\x02\xd7\x77\xc7\x15\x73\xb6\x5f\x6b\x32\x08\x56\xf9\x31\x1c\x2d\x0c\x37\x4b\x1d\x36\x58\x8e\xdd\xc7\xad\x94\xd9\x5b\xe1\x4a\xf6\x54\x06\xb6\xb5\x81\x5b\x66\x11\x4c\x53\x58\x5b\xc5\x57\x92\x5c\xd0\x82\xe7\x86\xfa\xba\x04\x18\x88\x12\xd2\xc0\x18\xf1\x87\x87\x52\xd5\x9e\x26\x06\xb7\xd0\x6c\xce\x54\x30\x33\x94\x78\x6e\xad\x95\x2d\x31\x60\xc3\xb4\xaa\x68\x66\x5c\xa0\x80\x04\xfd\x3b\x7e\xa3\x0d\xb9\xb0\x0b\x59\x9d\xdc\xc7\x60\x60\xf3\x79\x9a\x09\x05\x18\xcc\x8d\x11\x1e\xb8\x5a\x3e\x0d\xff\x50\x44\x16\xb9\x33\x49\xfc\xe9\xa5\x91\xa9\x33\xbc\xba\x89\x8a\x5e\x85\xd1\x22\x5a\x92\xc2\x70\xfb\x86\xcc\xdd\x3f\x90\xb7\x7d\xbc\x09\xae\x0e\xda\x7c\x92\xfd\x18\x7c\x9e\x09\x4d\x0a\x46\x95\x26\xaf\x5e\x92\x92\x8b\x46\x6f\x93\x1b\xff\x51\xa6\x95\x3f\xfc\x3e\xfa\xbb\x47\xe5\xd4\x4f\xbc\x6d\xa1\x34\x06\xff\xf6\x22\x99\xd5\x1b\x97\x00\x7c\x95\xe4\x42\xaf\x0a\x68\x81\xc3\x53\x3a\x36\x05\xcd\xf4\xde\xb0\xd8\xd6\x62\xcc\x8f\x8d\xbc\x59\xf6\x05\x29\xa6\x6d\xb8\xed\xb2\x5b\xdf\xec\xff\xd9\x87\xb8\xbd\x12\x49\xd4\xdc\xb0\xe6\xa0\xc7\x50\x73\x5a\x33\x5b\x39\xf9\x58\x79\x7b\x62\xdf\x7e\xbd\x31\x43\x40\xd0\xd0\x6b\x3f\x02\x57\x24\xf7\x8f\xbd\x2a\x83\x8b\xb1\xae\x19\xf3\x93\x03\x29\x03\x74\xf4\xce\x0e\x19\x19\xd5\x1f\xcd\x38\xc5\xb2\x4b\x63\x52\xb3\x19\x57\xba\xee\x53\xe3\x8e\x63\x10\x6f\x3c\x17\x35\xab\x65\x13\x51\x1e\x20\xfd\xb2\x41\xc7\x4e\xa1\xe1\x0c\x4b\xb6\x12\x76\x8c\xcb\x9f\x45\x83\xf6\x74\xa0\xb7\xde\xaf\x12\x2e\x4b\xcd\x68\xfe\xb5\x28\x22\xb4\xd2\xe9\x4b\x77\x7d\xa3\xac\x0a\xd4\x0e\xac\xf3\x00\x82\x0e\x40\x5d\x19\x76\x10\x83\xe1\x3e\xb0\x1c\x39\x3a\xf3\xf9\x18\xd2\x5f\x04\xda\xdc\x18\x9c\x11\x52\x8e\x29\x2d\x54\x74\x45\xfb\x38\xa9\xc9\x01\xe8\x7e\xb6\x0c\xfb\xee\xa2\x0b\xeb\x25\x2d\xeb\xd6\x2b\xda\x6d\xdf\x07\xf7\x81\x65\x18\x62\xa4\xe8\x96\x39\xa6\x81\xdd\x87\x2a\xc0\x40\xaf\xcd\xb5\x47\xc3\xeb\x89\x1f\x2d\x0c\x95\x73\x8e\xad\xf6\x94\x32\x59\x96\x34\xaa\xe0\x0f\x5a\x02\x29\x04\x67\x2b\x1b\x35\x21\x74\x4d\x8b\x76\xd5\x41\xd2\x8a\x5d\x02\xb9\x66\x82\x8a\x08\xa3\x7e\xfa\x79\x61\xcf\x44\xde\x79\xa7\xec\x19\x5f\x30\xb1\x0a\xdd\x56\x08\xf9\x82\x66\xb7\x2c\x2a\x7e\xf3\x1b\xe5\xf6\x37\x5f\x0a\x6a\x63\xea\x0c\x3a\x5b\x70\x73\x0d\x58\xbe\x32\x82\x1a\xb5\xfe\x44\x50\x43\x19\x43\x16\x91\xd1\xdc\xe5\x56\x36\x8a\x45\x24\xef\x48\xdf\x48\xd3\xef\xe3\xb1\xa4\x42\xfb\x4f\xcd\x17\x19\x73\x9c\xb3\xe9\x79\x97\x3b\x80\xb3\x4b\xdc\x03\x07\x07\xc1\x7d\xb3\xbe\xe9\xd6\x85\x01\x13\x16\x14\x06\xe7\x2d\x5d\x62\xa6\x55\x28\xb2\x85\xff\x63\xb1\x59\xef\x6a\xea\x9b\x1e\x72\x9c\x76\x8c\xf5\x4d\xde\x45\x5b\x1f\x68\x2e\x15\xf9\x02\x22\x2f\xde\x30\x10\x67\xf6\xc7\xf0\x7c\xf8\xe2\x4d\x0f\xb3\x63\xe6\xf7\x9c\x18\x1d\x5e\xd2\x59\x1f\xeb\x3c\x26\xa5\x14\x5c\xcb\xfa\x61\x7c\x18\xcf\xe7\x4c\x55\x9c\xdb\x73\xfa\x0d\xc6\x9e\x9d\x34\xd1\x26\x56\xf0\x7e\xcf\x81\x99\x10\x0e\x7d\x29\x1b\x72\x47\xb1\x78\x24\xc0\x45\x0c\x6d\xff\xc8\xab\xd7\xe4\x42\xa8\xa6\x0e\x22\x6e\x57\x07\x33\x48\xd0\x1d\xab\x43\x85\x00\x6c\x58\x35\x12\x0a\xbc\x61\xd2\x87\x88\x11\x2f\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\x55\xc1\x33\xae\x8b\x25\xe1\x62\xca\xea\xda\x6b\xf5\xf1\x83\x15\x27\xa7\x98\x31\x13\x75\xec\x4a\xcb\x9a\xce\xd8\x0b\x4b\x0b\x7e\x59\xdf\xf4\xd3\x98\x04\x8c\x07\x80\xba\x0f\x90\x81\x8e\xbd\x82\x07\xb0\x05\x3e\x8a\xad\x6d\xb6\x61\x9f\x98\x3d\xae\xc9\xed\x9f\x60\xa7\xec\x9e\xbc\xa8\x6f\xf2\x17\x1f\x2e\xce\xde\xbc\xbb\x98\x94\xf9\x2f\xe7\xf2\x6e\xac\xe5\xb8\x51\x6c\x1c\xe1\xea\x9c\xb0\x57\xb7\x6c\x09\x39\x89\xf6\xb0\x5b\xb6\xeb\x8e\xbc\xae\x25\x98\x0b\xe0\xb9\x61\x9e\x3e\x7c\xf1\xe6\x1b\x15\xa7\x1f\x0c\x04\x8b\x17\x4c\x67\x2f\x32\x56\xcd\x5f\xd8\x31\x3e\xcf\xbd\x0f\x0c\x3c\x6b\x2b\xea\xf9\xd4\x61\xd9\x7d\x9c\x9b\xeb\x1b\xa9\x7f\x26\x8b\x02\xfd\xe2\x0d\x4e\x3c\x67\xd5\xdc\xbf\xf0\xec\x76\x3d\xce\x11\x2d\xda\xfd\xec\x30\x3a\x1c\x02\x39\xa7\x64\x84\xc1\x2e\xfd\x28\x4d\xbf\x5d\x7c\x05\x4f\x62\xd1\x55\x70\xe5\xea\x9b\x6d\x09\xc1\xf3\xb9\x64\xfd\x64\xe6\xc9\xb4\x0b\x1f\xdc\x8f\x8a\x69\xa0\xf7\x5c\x10\xcc\x51\xff\xce\x70\x1a\xfb\x52\x23\x1c\xf8\xc0\xe2\xf4\x15\xe8\x7a\x1e\x95\xe3\x34\xfd\x14\x7c\xe7\xc0\x55\x07\xbe\x18\xb4\xd1\x73\x26\xb4\x0b\x4f\xb4\xfe\xef\x21\x8d\x22\x97\x53\x94\x68\xf3\x28\x03\xb7\x5c\xb0\xba\xe6\x39\x53\x24\x81\x48\x85\xda\x33\x5e\x3c\xbb\x03\x8c\xb4\x38\xa7\x19\x83\xe3\xbd\x6f\xb6\x33\x1d\x3c\xc6\xe3\xe6\xd0\xbe\x36\x07\xf6\xb2\x79\x9c\x7f\xcd\xd3\x7a\xd6\x24\xdb\x89\x53\xbc\x69\x1e\xe3\x61\xb2\x57\x95\x53\x87\x98\xc3\x93\x2d\x88\x39\xcd\x4b\x1e\x15\xb2\xfc\xac\xc9\x39\xac\xe2\x81\xd7\x55\x46\x0b\x76\xf9\xf5\x2e\x55\x46\xb6\xcb\xae\xda\xe8\xda\x3e\xac\x58\xed\x72\x35\x38\x8d\xa0\xd6\x34\x9b\x5b\xd5\x8e\xb3\x15\x48\x01\xa1\x64\x08\x5b\x44\xc8\xbc\xdf\xb8\x1b\xea\x8d\xdc\x68\x0f\xeb\x8e\xdc\x44\x9f\x93\xfe\x68\x46\x35\xbb\xeb\xe5\xcf\xc7\x2d\x89\xee\x7f\x13\x94\x22\x9f\xb9\xa6\x29\x45\x9b\xe4\x5d\xfb\xd7\x7a\xd9\xa5\xfe\x68\x72\x8f\xe6\x28\x0d\xc9\xc0\xb7\x3b\xd3\xfd\x62\xf3\x77\xff\xd3\xb4\x8f\x48\x58\x68\x4b\x3c\x4f\xfb\x95\x3b\x2b\xd8\x44\x1b\xd7\xe9\x58\x08\x77\x01\xcf\xae\x2e\xc9\xdf\xf0\xf5\x9d\xae\xb2\xaa\xa5\x46\x81\xfb\x8d\x2c\x29\x8f\xf0\x4b\xec\xac\x60\xf5\x73\xb7\x94\x90\xd7\x75\x4b\xb8\xf2\xef\x12\xfb\xb2\xcb\xe6\x80\x35\xe2\x9b\x9a\xe5\xc4\x2a\xeb\x76\xba\xc6\x83\xc8\x59\x6b\xf2\x10\x39\x31\xbf\xbd\x80\x3c\xa9\xa7\x93\x56\xe6\x5a\x11\xc8\x62\x34\x03\x3b\x11\xd9\x9e\xa1\x50\x14\xd8\x77\x5c\x24\x66\x2b\x08\x39\xb0\x01\xb6\xc3\x7b\x17\x46\xf5\x2f\x14\x07\x37\x9d\xc0\x31\xd6\xe6\xb9\xe4\xaa\x0d\xb6\x44\xd9\x6a\x44\xbe\x92\x33\x2e\x1c\xf2\x92\xd6\xf1\x6c\x4a\x63\x04\xa2\x41\x4e\x19\xe4\x94\xd5\x36\xc8\x29\x1b\x9b\x52\xc5\x85\xa0\x37\x45\x8c\x4f\x78\xd7\xe9\xdd\x7f\x48\xde\x16\x74\x46\x18\xfc\xf1\x22\xe7\xca\xfc\x9f\x5c\x5f\x7f\x05\x5e\x16\x8d\x70\xca\x14\x80\x00\x4b\x2b\x7d\x49\x0b\xc4\xc9\xbb\x45\x92\x48\xaa\xde\x45\x05\x7b\x6e\x81\x26\xdb\xee\x7d\xbe\x6b\xd5\x09\x8c\xb0\x6f\x00\xb6\xa4\x3e\xec\x1b\x3d\xaf\x6f\x98\xb9\xa5\xd9\xed\x55\xe0\x14\x21\x6b\xf3\x4c\x04\x8f\x12\x99\xac\xe4\xaf\xb7\x63\xb7\x56\x86\x89\x3b\x86\xab\x74\xa5\x76\xf0\xa5\xe3\x5b\x1c\xd1\xb9\xb6\x5b\x0b\xbf\x51\xa5\x64\xc6\x5b\xa7\x1e\x9b\x2d\xcd\x31\x33\x39\x30\x33\x3b\xdd\x0c\xe4\x9f\x53\x97\x83\x0c\xfa\x06\x0e\xcc\x01\x8a\x7d\x83\xaa\x90\xe3\xe2\xc2\xad\x7a\xa7\x4b\x40\x70\x8c\xcb\x81\x92\x7e\x39\xda\xde\x57\xd7\xeb\x2f\xc2\xaa\xbb\x88\xcb\xaa\x60\x4f\x38\x42\x9a\xb3\x6b\x9e\x53\x54\x63\xac\x41\x01\x57\xfe\xd2\x41\x9d\x81\x9d\xed\x5f\x4c\x9a\x95\x44\x55\x02\xf2\x55\x5d\xbf\x39\x7c\x66\x5d\x4c\x00\x6b\x54\xb2\x6a\x0a\xf4\x7a\xf7\x8b\xeb\x5b\xd5\x23\xad\xf1\x38\x8b\xdd\x68\x07\xe2\x39\xac\x20\x12\x7b\x1f\xe0\x19\x06\x7a\xa7\xc7\xe3\x3b\x88\xc5\xc4\x7f\x37\x4b\xd7\x5d\x92\xcc\x7e\xc8\x70\xfc\x5d\x85\xdf\xc7\x68\x37\x3a\x01\xfa\x1d\xa9\xeb\xe5\x1f\x7e\xff\xfb\x28\x82\xc6\x6b\x96\x69\x09\x2e\x9b\x36\x81\x87\xf7\x18\xa0\x35\x03\xe9\x00\x63\xe5\x9d\x7e\x03\xdd\x06\x75\xa4\x55\xe5\x10\x91\xf9\x7b\x8e\xc4\x4f\x8b\xe9\x48\x89\xb4\x8f\x34\x87\x6f\xe1\x2d\x03\x19\x93\x2e\x0f\x96\x31\xe9\x40\x79\x92\x0e\x93\x1d\xe9\x10\x39\x91\x0e\x92\x09\xe9\x70\xf9\x8f\xf6\x9c\xf5\x68\x2f\x2e\x26\xfb\xcc\x6b\x94\x18\x24\x9c\x16\x20\x1c\x9f\xb9\x28\x3a\x8c\x38\x35\x84\x38\x21\x37\xd1\x6e\x33\x12\x25\x4b\xf4\x29\xd9\x87\xb6\x0d\x8f\x3b\x5c\xa6\xa1\x27\xcc\x2f\xf4\xd4\x59\x85\xf6\x9c\x4b\xe8\x70\x19\x84\x0e\x92\x37\x68\x9b\x38\xd4\xf4\x1c\x41\x29\xf1\xa7\xdb\x5e\xae\xbd\x67\x01\xda\x49\xee\x9f\x1d\x67\xfc\xd9\x5d\x9e\x9f\xc3\x39\x52\xc6\x67\x3f\x79\x74\xce\x13\x95\x9c\xf4\x24\xdd\xde\xb3\x2f\x65\x4d\xdb\xfb\x46\xe5\x94\x4b\x0c\xeb\x12\xbb\x1f\xa3\xab\x9c\xaa\x28\x96\x89\x6d\xb6\xf6\x2d\xdc\xb1\x1e\x82\x24\x68\x70\xb0\x77\xd9\xc3\x5c\x24\x2a\x71\xb0\xd3\xaf\xaf\x57\x3c\x42\xfc\xe3\x7d\x3a\x82\xf8\x41\x7a\x5c\x41\xdc\xc2\x0f\xe0\x0c\x32\x78\x5b\xec\xce\xdb\x62\xf7\x71\x3a\xcf\xcd\x40\x9f\x0f\x06\xfa\x64\x03\xbd\xea\x54\x91\x77\x0a\x63\x40\xc9\xc0\xd4\xca\x9b\xb0\xe2\x52\x8b\x23\xce\xae\x2e\x23\xc6\x69\xab\xc2\xa8\xc9\x26\x6e\xd7\x99\xee\x2c\x17\xed\x33\x9f\x6b\xcd\xca\xaa\x17\x8d\x90\xc1\x3e\x3f\xd8\xe7\x37\xb4\xc1\x3e\xbf\xb1\x1d\xda\x5e\x37\x6f\x4a\x2a\xa0\x62\x2a\x98\xf1\x3b\x0e\x63\x2b\x0c\xcd\x84\x58\x4c\x1a\x79\x2d\x31\x13\x03\xe4\xc6\x68\x04\xff\xb1\x61\xad\x3e\xcb\x33\x96\x7b\xb2\x75\x42\xdf\xfb\xdd\x40\xe4\x8b\x57\x30\x73\x26\xd7\xa2\x88\xed\x9a\xfd\x66\x3a\x14\x1b\xbb\x89\x30\x4c\x47\x45\x0b\xd5\x52\x6c\x59\x9c\x0e\x93\xde\xd1\x3f\x58\xf4\x03\x38\x21\x56\xcb\x1d\x72\xa6\x06\x10\xcc\x7a\x6c\x1a\xae\x1b\x46\x4a\x5e\xd7\xb2\xb6\x76\xd7\x70\x49\xe8\x40\xc8\x67\x73\xcd\x6a\x94\xfc\xeb\xe8\xfa\x58\xd7\x4c\x5b\xa8\x02\xa8\xd4\x12\x2a\xfa\x09\xfb\x6f\x17\x4e\x03\xcb\x75\x74\xe8\x86\xcd\xe9\x82\xcb\x26\x2a\x80\xf4\x1a\x29\xe5\x91\xfd\x18\xf8\xa7\xa5\x6c\xbc\x85\x09\xcb\x9e\xf9\x3d\x54\xeb\xe7\x15\x31\xc8\xfb\xf6\x73\x50\xd0\xe4\xd2\xa9\xcf\xc7\xec\x13\x57\x7a\x7d\xc7\xdc\x51\x59\x1b\xe3\xce\xae\xc1\x42\x55\x06\x8b\x7f\x1b\x91\xfe\x21\x0d\xf8\x3b\x1d\x77\x05\x9f\xc5\x35\xfc\xd4\x27\xf6\xd8\x8c\x70\x98\xc0\x85\x94\x34\x9b\x73\x91\x94\x3c\xe1\xdb\xce\x14\x3a\xf2\xcf\x84\x9c\x15\x45\xeb\x3b\xa8\xbc\x4b\xab\x93\x87\xba\xd3\xd7\xfd\x25\x82\x0d\x7c\xd4\x2c\x07\x1b\x65\x5b\x91\x30\x53\x7c\x62\xbb\x9a\x2c\xca\x3b\x5a\xb3\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\xf7\xe6\x3c\xdc\x83\x7f\x3d\x6e\x7a\x6f\xcd\xbe\xe7\x25\xa3\x0d\xf2\x59\xdb\x52\xdc\x91\x9c\xa3\x54\xc1\xb3\xe5\xe5\x9b\x6d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa8\x62\x39\x79\x47\x05\x9d\xa1\xfa\xf0\xe4\xfa\xea\x8b\x77\xa7\x06\x80\x40\xdd\x79\xf9\x66\xa3\x1f\xd6\x75\xd8\xf9\xfb\x5d\xe6\x7f\x59\x5b\xf8\x16\xbc\xd1\xda\xf7\x5b\x2e\x7e\xa7\x89\x6d\x88\x67\x27\xe2\x0a\x90\x6e\x48\xd5\x73\xb5\x9a\x19\x11\x9d\xa4\x5c\x4a\x56\xb5\x8a\x9a\x17\x65\x7e\xfb\xb8\xe9\x73\x23\x4d\x14\xc5\x55\x41\xc5\x59\x55\xd5\x72\xb1\x59\xeb\x1a\x83\x1c\xdc\xf7\x6e\x01\xe8\x60\xee\x1e\x56\x78\x22\xe0\x53\x29\x50\x88\xc1\x61\x37\xef\xff\xa5\xf6\x8a\x59\x29\x80\x05\x3b\x3a\x6b\xb4\x2c\xa9\xe6\xd9\x11\x91\x35\x39\x7a\x47\x45\x43\x8b\x8d\xb1\x29\x0f\xae\xf8\x3e\x01\xf3\xc1\x8f\xd0\x11\x6d\xcb\xcf\x1e\x64\x60\x1f\xfe\x5e\xd3\xda\xa0\xba\xf3\xeb\x6f\x93\xbe\x55\x9a\xea\x66\x8d\x32\x3c\x40\xad\xee\xa7\x4f\x63\x52\x50\xa5\xbf\xa9\x72\x83\x1f\x56\x7e\x7d\x88\x08\x65\x54\xd3\x42\xce\xfe\x8d\xd1\x62\xf3\x65\x88\x01\xa9\xf3\xb0\x93\xb6\x4a\x37\x20\xa8\xe6\xc6\x7f\x7f\xac\x88\x11\x25\x0d\x94\x70\xad\x48\xcd\x0a\xb6\xa0\x42\xbb\xcf\xaf\xe1\x14\xd4\xb1\xdd\x96\x7b\x01\x8e\xb7\x36\xd6\x9c\x69\x56\x97\x5c\x74\xc7\xb9\x86\xef\xcf\xa5\xc0\x2a\xc8\x0a\xad\x48\xf8\x45\x77\xac\xfb\xa1\xf2\x3e\xd7\x83\x07\x9c\x0d\x3a\x3b\x15\xce\xa7\xbb\x3d\xf8\xda\x8d\x15\x5d\xe6\xf8\x10\x3c\x37\x3b\x73\x5b\xdb\x3d\x72\x2b\x8c\x44\x01\x19\xce\x37\xef\x4d\x2f\x9b\xd3\xc7\xde\x8c\x1d\x38\xe0\x14\xee\x8f\x0a\x1c\xdb\x79\xdf\xe7\x94\xf0\x10\x34\x62\xeb\x67\x8c\x56\xa7\x72\x3f\xa6\xee\x6c\xfc\xf9\xca\x67\x98\x58\xc5\xfb\x36\xa1\x97\x47\xe7\xa5\xfb\x29\x4b\x14\xdf\x18\xc7\xe2\xd1\x8a\x7f\xcb\x6a\x65\xa6\x18\x2f\x1d\x9c\x5d\x5d\x92\x05\x7e\x95\xa6\x0b\x8b\x24\x85\xa0\x23\xeb\xa7\x82\x69\x2c\xe7\xa5\x0d\x6c\xaa\xad\x04\x4b\x49\xc5\x19\xe6\x56\xa7\xc2\x6e\x26\xd0\x33\x46\x73\xfb\xd0\xd0\xcd\x9a\xd9\xdf\x46\xd6\xe3\x30\x8a\x41\x41\xbf\x5d\x67\x83\xa5\x98\xf2\x1b\xbc\x11\x5e\xfc\x4d\x5a\x1d\xa0\x4d\x15\x68\xb0\x0a\x70\x17\x23\xa2\x9a\x6c\x4e\xa8\x11\x64\x94\xb9\x0e\x06\x5f\xb0\x49\x49\x05\x9f\x32\xa5\x27\xb6\x37\x56\xab\xef\x7e\xfb\x7d\x1f\xdb\xf1\x56\xd6\xc4\x46\x69\x8f\x5c\xe6\x6a\xbb\xc6\x16\xe6\xb8\xc2\x8d\xf0\x3d\xb7\x1a\x99\x4a\xe6\x76\xc1\x77\xb0\x14\x4d\x6f\x0d\x29\xc5\xa5\x34\x0c\xbc\x06\xfa\x78\x94\x23\xc3\xf6\x06\xd3\xfe\x6f\x43\x3b\xff\xe7\x88\x9c\xdc\x01\x13\x72\x64\xfe\x3c\xc2\xe9\xf8\x48\xb3\x50\xe1\xd4\x4e\x0b\x93\xa6\xd5\x7c\x36\x63\x75\xaf\x8d\xd5\x7c\xca\x16\x4c\xe8\x53\x9b\xb5\x5b\xc8\xa0\x2b\xe7\xe7\xd7\xea\x4f\x56\xa7\xf9\xdd\x6f\xbf\x3f\x22\x27\xdd\x3d\xe9\x19\x92\x8b\x9c\x7d\x22\xbf\x45\x6b\x29\x14\x17\xcf\x4f\x27\xa8\x70\x51\x4b\xa1\xe9\x27\x33\x62\x36\x97\x8a\x09\x54\x80\x69\x49\xe6\x74\xc1\x88\x92\x25\x23\x77\xac\x28\xc6\xd6\x7e\x4c\xee\xe8\xb2\x3f\x59\xb9\x3b\x42\x48\x81\x4a\x2a\x5a\xeb\x0e\x18\xef\xe4\x12\xde\x72\xb1\xd3\x4c\x8b\x5f\x72\xb1\xea\xd2\xd9\x2b\xe0\x6d\x50\x0a\xcf\xb8\x76\x59\x07\x6c\x7c\x91\x5e\xbe\x30\x87\x55\xf3\x9b\x46\xcb\x5a\xbd\xc8\xd9\x82\x15\x2f\x14\x9f\x8d\x69\x9d\xcd\xb9\x66\x99\x6e\x6a\xf6\xe2\xff\x63\xee\x7c\x7e\xdb\x06\xa1\x38\x7e\xdf\x5f\x81\xd4\x43\x2f\xf1\x7a\xdf\x4e\x5b\xd2\x6d\x91\xaa\x6d\x6a\x93\x49\x3b\x52\x9b\xa5\xa8\x8e\x1d\x81\xdd\x68\x9a\xf6\xbf\x4f\xf0\xc0\x86\xc4\xfc\x4a\x5c\x67\xb7\x36\xb6\x93\xc7\x03\xc3\xf7\x7d\x78\x00\xde\xd1\x2c\xaf\x2b\xd1\x30\xe4\x9e\xbc\xdb\xe2\x4a\x78\x82\x67\xa2\xa0\x7e\x4a\x1c\xe9\xb1\xf0\xdc\x43\x9a\xc7\x4e\x99\x6b\xb8\x0c\x46\x4f\x70\x50\x04\x8a\x4d\xf7\x12\xf0\xce\x8b\xbb\x4a\x22\xbf\x9b\x31\x3c\xc5\x08\x68\xff\xf4\xb1\x39\xe8\xaf\x07\xe8\xf8\xf2\xc3\xdf\x10\x7d\x12\x64\xfb\xca\x2e\xcc\x1a\x25\xb6\xb8\x80\x61\x04\x57\xc1\x75\xee\xaf\xfc\xce\x8a\xfa\x68\x99\xb0\xec\x77\x26\xbf\xa2\x2e\x33\x5c\x15\xe2\x6f\xd8\x78\x23\xf7\x67\xa4\x46\x56\x40\x4b\x47\xed\xfc\xd6\xcb\xc5\xe5\x9b\xe7\xcd\x55\x4b\xc7\xe8\xe9\x4e\x99\xcf\x52\xba\x3c\x52\x2c\x43\x48\x02\x19\xba\xac\x25\x5a\xc0\xd8\x81\x08\xe5\xfa\x5b\xdf\xab\xcc\x81\xee\xa0\x9b\x90\x74\xf6\xcf\xe6\x1b\x31\x42\xa4\xbd\x77\xfd\x13\x26\x0b\x97\x99\xff\x98\x37\xea\x28\x11\xbd\xf3\xab\x55\x0c\x1d\x9c\x3e\xe1\x6a\xe3\x91\x36\x51\x15\xa3\xf3\x26\x85\x21\xd9\xe0\x61\xee\x79\x17\x7c\x06\x63\x6a\x23\x4e\x95\xa1\x4a\x49\x79\x77\x9c\x86\x08\x5b\x79\x83\xf0\x0b\xa6\xa5\x9c\x27\xac\x1f\x39\x61\x2f\x0a\xb6\xc3\x61\x57\xf8\x30\xc6\x86\xd7\xb6\x01\xc1\x3b\x51\x84\xab\xcb\x70\x5c\x2b\xbe\x02\xc8\xa8\xf7\xc0\x7a\xa7\xd5\xa3\xc4\xb7\x80\x16\x9c\x97\x9d\x13\x14\xe1\x20\x4f\xb4\xbf\x2f\x04\xb3\xe6\x91\xe0\x66\x45\x7d\x0a\xe5\xa8\x49\x5b\xcf\x69\x2e\xd7\x37\xe8\x3d\x41\x9b\xba\x11\xb2\xb3\x95\x6d\x1f\xe2\x03\xd8\x4b\xbe\x6b\x68\xaf\xdd\xa2\xfb\x52\xae\x18\x96\x3b\x4c\xd4\x55\x62\x31\xed\x07\x8f\xcb\xa9\x62\x11\xd5\x92\x1a\xb8\x1b\xfd\x62\xf5\x56\xc2\x45\xa8\x3b\x98\xaa\xf4\x6f\x86\x31\x6a\x91\xb7\x84\x73\xef\x16\xc7\xf6\xb2\x12\xb8\x1b\x5e\xe5\x83\x49\xfe\xad\xbe\x06\xcb\xd9\x45\x50\x51\x90\x06\xd3\x52\xbf\xca\xe0\x8a\xce\x4b\xa1\xde\xd5\x5b\x40\x46\x30\xf7\x09\x1a\xcb\xea\x7b\x79\x33\x18\x5d\x57\x24\xdb\xd7\xac\x40\x73\xbc\x25\xe5\x1c\x73\xa2\xbe\xcb\xdc\xaf\x06\xea\xe8\x9a\x8f\x6a\xf2\x30\x0e\x75\x98\x0c\x90\xaf\x9f\x50\x90\xff\xf5\x01\x2d\x18\x38\xd3\x54\x7a\xc5\x5a\x32\x43\x9f\xc4\xe8\x35\x43\xeb\xea\xb9\xaa\xf7\xe7\xd9\xda\x78\x27\xeb\x2c\x4b\xcd\x0c\x49\xbd\xdd\xb9\x05\xf6\x3a\x73\x4f\xb4\x48\x75\xf8\x0e\xfa\x6c\x0f\x36\xdd\xad\xda\x22\xf1\xe7\x11\x6a\x14\xa1\x35\xab\x37\x8c\x70\x0e\x14\x27\x19\xdf\x1b\x13\x16\x9f\x49\xa5\xe6\x87\x83\xe6\x2d\x87\x9e\xd2\x96\xea\x71\x6d\xd3\x5f\x51\xf5\xad\x7e\x6c\x57\x0e\x4a\x0d\xff\xca\x08\xc3\x50\x07\x64\x74\x59\x38\x0c\x17\x8d\x51\xcf\xb8\x17\x44\x89\x8f\x8c\xeb\xd2\xcd\x1f\x7e\xb8\x9d\xed\x1c\xfb\x42\xe3\x53\x18\x3f\x9e\x0b\x1e\x83\xef\x4c\x10\x36\xc6\x2a\xfd\x69\x00\xe3\x25\xd1\xe2\x65\xa1\xe2\xe4\x38\x71\x52\x90\x38\x1d\x42\x3c\x11\x1e\x06\x5f\x24\x1f\x30\x8c\x7d\x87\xd2\x20\xe1\xc5\xf1\x60\xd0\x27\x3e\x24\x18\xeb\x93\x34\x0c\x38\x35\x00\x8c\x72\x81\x17\xfa\xa5\xf8\x21\x11\xf4\x4d\x8c\xf8\x82\xbe\x88\xc4\x7a\xb1\x1e\x79\x3d\x94\xf7\xdf\x42\xbc\xa0\x8b\x3d\xe0\x2e\xd6\xad\x49\xb0\x6e\x62\x4c\x17\x28\x7f\x1a\x9a\x53\x1a\x93\x14\x31\x12\x7d\x69\xdc\x6c\x8a\x74\x25\x10\x65\x02\x9c\xba\x43\x27\xdc\x99\x52\xf2\x54\xa5\x2e\xc4\xf3\xa9\xf9\x1f\xca\xe4\x78\x35\xac\x24\x3c\x29\xba\x98\x32\x54\x04\x84\x16\xb7\xdf\xef\x6f\xe7\x1f\x56\xb7\x8b\x43\x15\x9e\x2e\x97\xfd\xa0\x28\x33\xe4\xb2\xe3\x06\x31\x58\x39\x2e\x89\xb6\xe5\xb8\xd4\xb6\x74\xe8\xa9\xf3\xc5\xfb\x59\x9a\xe1\xac\xc1\x35\xdc\x4f\x8c\xd4\x51\xc8\xb6\x05\x59\xab\x42\x55\x3e\xd5\x65\xc1\xf5\xfa\x86\xe5\xa2\xdb\x88\x80\x56\x79\xd9\x16\x42\x72\xad\xd7\xcb\x05\x7f\x8b\xd0\x47\x92\xe3\x96\x0b\xe9\xe6\x0e\xd7\xeb\xea\xba\x41\xdf\xbe\xde\xfd\x94\x4b\xbb\xe4\x93\xb3\x6e\xbb\x54\x79\xf6\x1e\xc5\x70\x7c\xa0\x2c\xa8\xfc\x56\x90\x75\xd2\xa2\x1c\xef\x44\x0f\xec\x46\xfe\x14\x76\xaf\xc1\x55\x81\x9e\x48\xb9\x13\xa3\xc3\x33\x41\xfd\x39\x65\xe2\x07\xe5\x55\x58\xbf\xa1\xf2\xd8\x37\xa4\x81\x4d\x09\x7c\xa9\xea\xde\x0a\x08\x10\xf6\x33\xd8\xba\x85\x0b\x14\x7d\xd9\x63\xae\x08\xe5\xa0\xb5\x81\xa6\x12\xe6\x71\x6e\xa4\xe5\x80\x59\x30\xb2\xc8\xff\x8e\x6c\x16\xc6\xf6\xdc\x0a\x92\xc3\x68\x13\x4d\xcf\xdd\x99\x80\xc3\x27\x44\x1f\xb1\x2b\x72\xe8\x64\xeb\x87\xbb\xb5\x40\x86\xc9\x71\xb6\x70\xc2\x5e\x48\xf1\x4e\xce\xe7\xe8\x8f\x20\xdb\xd6\xfe\xac\x7d\xd4\x62\xc6\xe8\x75\x14\x81\x43\x7f\xfe\xbe\xf9\x17\x00\x00\xff\xff\xc4\xc9\x92\x01\x49\xa6\x03\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( diff --git a/staging/api/go.mod b/staging/api/go.mod index 67febe8403..7a219074d7 100644 --- a/staging/api/go.mod +++ b/staging/api/go.mod @@ -5,16 +5,16 @@ go 1.24.4 require ( github.com/blang/semver/v4 v4.0.0 github.com/go-bindata/go-bindata/v3 v3.1.3 - github.com/google/cel-go v0.26.0 + github.com/google/cel-go v0.26.1 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.11.0 + github.com/spf13/cobra v1.10.1 + github.com/stretchr/testify v1.11.1 google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 - k8s.io/api v0.33.4 - k8s.io/apiextensions-apiserver v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 - sigs.k8s.io/controller-runtime v0.21.0 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 + sigs.k8s.io/controller-runtime v0.22.1 sigs.k8s.io/yaml v1.6.0 ) @@ -25,16 +25,15 @@ require ( github.com/cenkalti/backoff/v5 v5.0.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -43,14 +42,14 @@ require ( github.com/kisielk/errcheck v1.8.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.16.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/pflag v1.0.9 // indirect github.com/stoewer/go-strcase v1.3.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect @@ -63,6 +62,7 @@ require ( go.opentelemetry.io/otel/trace v1.36.0 // indirect go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/lint v0.0.0-20241112194109-818c5a804067 // indirect golang.org/x/mod v0.25.0 // indirect @@ -79,13 +79,13 @@ require ( google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.33.4 // indirect - k8s.io/component-base v0.33.4 // indirect + k8s.io/apiserver v0.34.1 // indirect + k8s.io/component-base v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) diff --git a/staging/api/go.sum b/staging/api/go.sum index 58a1e27fbb..2ee1585bbf 100644 --- a/staging/api/go.sum +++ b/staging/api/go.sum @@ -19,12 +19,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.11.2 h1:1onLa9DcsMYO9P+CXaL0dStDqQ2EHHXLiz+BtnqkLAU= -github.com/emicklei/go-restful/v3 v3.11.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -46,11 +46,10 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= -github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -86,8 +85,9 @@ github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUt github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= @@ -112,10 +112,10 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -128,22 +128,22 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= -github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= @@ -170,8 +170,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= -go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= -go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -243,35 +243,33 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= +sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg= +sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/staging/operator-lifecycle-manager/.bingo/Variables.mk b/staging/operator-lifecycle-manager/.bingo/Variables.mk index 7d111bbc09..81a37089c2 100644 --- a/staging/operator-lifecycle-manager/.bingo/Variables.mk +++ b/staging/operator-lifecycle-manager/.bingo/Variables.mk @@ -35,11 +35,11 @@ $(HELM): $(BINGO_DIR)/helm.mod @echo "(re)installing $(GOBIN)/helm-v3.18.3" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=helm.mod -o=$(GOBIN)/helm-v3.18.3 "helm.sh/helm/v3/cmd/helm" -KIND := $(GOBIN)/kind-v0.29.0 +KIND := $(GOBIN)/kind-v0.30.0 $(KIND): $(BINGO_DIR)/kind.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/kind-v0.29.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=kind.mod -o=$(GOBIN)/kind-v0.29.0 "sigs.k8s.io/kind" + @echo "(re)installing $(GOBIN)/kind-v0.30.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=kind.mod -o=$(GOBIN)/kind-v0.30.0 "sigs.k8s.io/kind" SETUP_ENVTEST := $(GOBIN)/setup-envtest-v0.0.0-20250620151452-b9a9ca01fd37 $(SETUP_ENVTEST): $(BINGO_DIR)/setup-envtest.mod diff --git a/staging/operator-lifecycle-manager/.bingo/kind.mod b/staging/operator-lifecycle-manager/.bingo/kind.mod index 80513d6833..51be6d24b1 100644 --- a/staging/operator-lifecycle-manager/.bingo/kind.mod +++ b/staging/operator-lifecycle-manager/.bingo/kind.mod @@ -4,4 +4,4 @@ go 1.22.0 toolchain go1.22.3 -require sigs.k8s.io/kind v0.29.0 +require sigs.k8s.io/kind v0.30.0 diff --git a/staging/operator-lifecycle-manager/.bingo/kind.sum b/staging/operator-lifecycle-manager/.bingo/kind.sum index 7800696aca..f1889a9118 100644 --- a/staging/operator-lifecycle-manager/.bingo/kind.sum +++ b/staging/operator-lifecycle-manager/.bingo/kind.sum @@ -39,6 +39,8 @@ github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= @@ -56,6 +58,8 @@ sigs.k8s.io/kind v0.26.0 h1:8fS6I0Q5WGlmLprSpH0DarlOSdcsv0txnwc93J2BP7M= sigs.k8s.io/kind v0.26.0/go.mod h1:t7ueEpzPYJvHA8aeLtI52rtFftNgUYUaCwvxjk7phfw= sigs.k8s.io/kind v0.29.0 h1:3TpCsyh908IkXXpcSnsMjWdwdWjIl7o9IMZImZCWFnI= sigs.k8s.io/kind v0.29.0/go.mod h1:ldWQisw2NYyM6k64o/tkZng/1qQW7OlzcN5a8geJX3o= +sigs.k8s.io/kind v0.30.0 h1:2Xi1KFEfSMm0XDcvKnUt15ZfgRPCT0OnCBbpgh8DztY= +sigs.k8s.io/kind v0.30.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/staging/operator-lifecycle-manager/.bingo/variables.env b/staging/operator-lifecycle-manager/.bingo/variables.env index d6a29bc397..28ce0c6fb1 100644 --- a/staging/operator-lifecycle-manager/.bingo/variables.env +++ b/staging/operator-lifecycle-manager/.bingo/variables.env @@ -14,7 +14,7 @@ GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.64.8" HELM="${GOBIN}/helm-v3.18.3" -KIND="${GOBIN}/kind-v0.29.0" +KIND="${GOBIN}/kind-v0.30.0" SETUP_ENVTEST="${GOBIN}/setup-envtest-v0.0.0-20250620151452-b9a9ca01fd37" diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml index b806578931..be98ac9a06 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml @@ -86,7 +86,7 @@ jobs: for i in $(seq 1 ${E2E_NODES}); do KIND_CLUSTER_NAME="kind-olmv0-${i}" \ KIND_CREATE_OPTS="--kubeconfig=${E2E_KUBECONFIG_ROOT}/kubeconfig-${i}" \ - HELM_INSTALL_OPTS="--kubeconfig ${E2E_KUBECONFIG_ROOT}/kubeconfig-${i}" \ + HELM_INSTALL_OPTS="--kubeconfig ${E2E_KUBECONFIG_ROOT}/kubeconfig-${i} --set certManager.enabled=false" \ make kind-create deploy; done @@ -173,7 +173,7 @@ jobs: for i in $(seq 1 ${E2E_NODES}); do KIND_CLUSTER_NAME="kind-olmv0-${i}" \ KIND_CREATE_OPTS="--kubeconfig=${E2E_KUBECONFIG_ROOT}/kubeconfig-${i}" \ - HELM_INSTALL_OPTS="--kubeconfig ${E2E_KUBECONFIG_ROOT}/kubeconfig-${i}" \ + HELM_INSTALL_OPTS="--kubeconfig ${E2E_KUBECONFIG_ROOT}/kubeconfig-${i} --set certManager.enabled=false" \ make kind-create deploy; done diff --git a/staging/operator-lifecycle-manager/AGENTS.md b/staging/operator-lifecycle-manager/AGENTS.md new file mode 100644 index 0000000000..1406828413 --- /dev/null +++ b/staging/operator-lifecycle-manager/AGENTS.md @@ -0,0 +1,352 @@ +# AGENTS.md + +This file provides AI agents with comprehensive context about the Operator Lifecycle Manager (OLM) v0 codebase to enable effective navigation, understanding, and contribution. + +## Project Status + +**CRITICAL**: This repository is in **maintenance mode**. OLM v0 accepts only critical bug fixes and security updates. For new development, use [operator-controller](https://github.com/operator-framework/operator-controller) (OLM v1). + +## Project Overview + +Operator Lifecycle Manager (OLM) extends Kubernetes to provide declarative installation, upgrade, and lifecycle management for Kubernetes operators. It's part of the [Operator Framework](https://github.com/operator-framework) ecosystem. + +### Core Capabilities +- **Over-the-Air Updates**: Automatic operator updates via catalog channels +- **Dependency Resolution**: Automatic resolution and installation of operator dependencies +- **Multi-tenancy**: Namespace-scoped operator management via OperatorGroups +- **Discovery**: Catalog-based operator discovery and installation +- **Stability**: Prevents conflicting operators from owning the same APIs + +## Architecture + +OLM consists of two main operators working together: + +### 1. OLM Operator (`cmd/olm`) +**Responsibility**: Manages the installation and lifecycle of operators defined by ClusterServiceVersions (CSVs) + +**Key Functions**: +- Creates Deployments, ServiceAccounts, Roles, and RoleBindings from CSV specifications +- Manages CSV lifecycle states: None → Pending → InstallReady → Installing → Succeeded/Failed +- Monitors installed operator health and rotates certificates +- Enforces OperatorGroup namespace scoping + +**Primary Controllers**: +- CSV Controller (pkg/controller/operators/olm) +- OperatorGroup Controller + +### 2. Catalog Operator (`cmd/catalog`) +**Responsibility**: Manages operator catalogs, subscriptions, and dependency resolution + +**Key Functions**: +- Monitors CatalogSources and builds operator catalogs +- Processes Subscriptions to track operator updates +- Generates InstallPlans with resolved dependencies +- Creates CRDs and CSVs from catalog content + +**Primary Controllers**: +- Subscription Controller +- InstallPlan Controller +- CatalogSource Controller +- Registry Reconciler + +## Custom Resource Definitions (CRDs) + +| Resource | API Group | Owner | Description | +|----------|-----------|-------|-------------| +| **ClusterServiceVersion (CSV)** | operators.coreos.com/v1alpha1 | OLM | Defines operator metadata, installation strategy, permissions, and owned/required CRDs | +| **Subscription** | operators.coreos.com/v1alpha1 | Catalog | Tracks operator updates from a catalog channel; drives automatic upgrades | +| **InstallPlan** | operators.coreos.com/v1alpha1 | Catalog | Calculated list of resources to install/upgrade; requires approval (manual or automatic) | +| **CatalogSource** | operators.coreos.com/v1alpha1 | Catalog | Repository of operators and metadata; served via grpc from operator-registry | +| **OperatorGroup** | operators.coreos.com/v1 | OLM | Groups namespaces for operator installation scope; enables multi-tenancy | +| **OperatorCondition** | operators.coreos.com/v2 | OLM | Tracks operator health status and conditions | + +## Directory Structure + +``` +operator-lifecycle-manager/ +├── cmd/ # Entry point binaries +│ ├── catalog/ # Catalog Operator main +│ ├── olm/ # OLM Operator main +│ ├── package-server/ # Package API server +│ └── copy-content/ # Content copy utility +│ +├── pkg/ # Core implementation +│ ├── api/ # API client and wrappers +│ │ ├── client/ # Generated Kubernetes clients +│ │ └── wrappers/ # Client wrapper utilities +│ │ +│ ├── controller/ # Main controllers +│ │ ├── bundle/ # Bundle lifecycle controller +│ │ ├── install/ # Installation controller +│ │ ├── operators/ # Operator/CSV controllers (OLM Operator) +│ │ └── registry/ # Catalog/registry controllers (Catalog Operator) +│ │ +│ ├── lib/ # Shared libraries and utilities +│ │ ├── catalogsource/ # CatalogSource utilities +│ │ ├── csv/ # CSV manipulation utilities +│ │ ├── operatorclient/ # Operator client abstractions +│ │ ├── operatorlister/ # Informer-based listers +│ │ ├── operatorstatus/ # Status management +│ │ ├── ownerutil/ # Owner reference utilities +│ │ ├── queueinformer/ # Queue-based informers +│ │ ├── scoped/ # Scoped client for multi-tenancy +│ │ └── [other utilities] +│ │ +│ ├── metrics/ # Prometheus metrics +│ └── package-server/ # Package server implementation +│ +├── test/ # Testing infrastructure +│ ├── e2e/ # End-to-end tests +│ └── images/ # Test container images +│ +├── doc/ # Documentation +│ ├── design/ # Architecture and design docs +│ └── contributors/ # Contributor guides +│ +└── vendor/ # Vendored dependencies +``` + +## Key Packages and Their Responsibilities + +### Controllers (`pkg/controller/`) + +#### `pkg/controller/operators/` +The heart of the OLM Operator. Contains the CSV controller that manages the complete operator lifecycle. + +**Key files**: +- `olm/operator.go` - Main OLM operator reconciler +- `olm/csv.go` - CSV reconciliation logic +- `catalog/operator.go` - Catalog operator reconciler + +#### `pkg/controller/registry/` +Registry and catalog management for the Catalog Operator. + +**Key files**: +- `reconciler/reconciler.go` - CatalogSource reconciliation +- `grpc/source.go` - gRPC catalog source handling + +#### `pkg/controller/install/` +Manages the installation of resources defined in InstallPlans. + +### Libraries (`pkg/lib/`) + +#### `pkg/lib/operatorclient/` +Abstraction layer over Kubernetes clients providing OLM-specific operations. + +#### `pkg/lib/operatorlister/` +Informer-based listers for efficient caching and querying of OLM resources. + +#### `pkg/lib/queueinformer/` +Queue-based informer pattern used throughout OLM controllers for event-driven reconciliation. + +#### `pkg/lib/ownerutil/` +Owner reference management ensuring proper garbage collection of OLM-managed resources. + +#### `pkg/lib/scoped/` +Scoped clients that respect OperatorGroup namespace boundaries for multi-tenancy. + +## Development Workflow + +### Building +```bash +make build # Build all binaries +make image # Build container image +make local-build # Build with 'local' tag +``` + +### Testing +```bash +make unit # Unit tests with setup-envtest +make e2e # E2E tests (requires cluster) +make e2e-local # Build + deploy + e2e locally +make coverage # Unit tests with coverage +``` + +### Code Generation +```bash +make gen-all # Generate all code (clients, mocks, manifests) +make codegen # Generate K8s clients and deep-copy methods +make mockgen # Generate test mocks +make manifests # Copy CRD manifests from operator-framework/api +``` + +### Local Development +```bash +make run-local # Complete local setup +# OR step-by-step: +make kind-create # Create kind cluster (kind-olmv0) +make cert-manager-install +make deploy # Deploy OLM to cluster +``` + +## Key Design Patterns + +### Control Loop State Machines + +**CSV Lifecycle**: +``` +None → Pending → InstallReady → Installing → Succeeded + ↑ ↓ + ←----------←------←-------Failed +``` + +**InstallPlan Lifecycle**: +``` +None → Planning → RequiresApproval → Installing → Complete + ↓ ↓ + ←-------←-------Failed +``` + +**Subscription Lifecycle**: +``` +None → UpgradeAvailable → UpgradePending → AtLatestKnown + ↑ ↓ + ←-----------←-----------←-------------← +``` + +### Dependency Resolution +- CSVs declare owned CRDs (what they provide) and required CRDs (what they need) +- Catalog Operator resolves transitive dependencies via graph traversal +- InstallPlans capture the complete dependency closure +- Resolution is based on (Group, Version, Kind) - no version pinning + +### Catalog and Channel Model +``` +Package (e.g., "etcd") + ├── Channel: "stable" → CSV v0.9.4 → CSV v0.9.3 → CSV v0.9.2 + ├── Channel: "alpha" → CSV v0.10.0 + └── Channel: "beta" → CSV v0.9.4 +``` + +Subscriptions track a channel; OLM follows the replacement chain to upgrade operators. + +## Testing Strategy + +### Unit Tests +- Use `setup-envtest` for real Kubernetes API behavior +- Race detection enabled by default (`CGO_ENABLED=1`) +- Mock generation via `counterfeiter` and `gomock` + +### E2E Tests +- Full cluster testing with Ginkgo/Gomega BDD framework +- Test images in `test/images/` hosted on quay.io/olmtest +- Default timeout: 90 minutes (configurable via `E2E_TIMEOUT`) +- Uses kind cluster named `kind-olmv0` + +### Integration Tests +- Bundle and catalog integration testing +- Upgrade path validation +- Multi-tenant scenario testing + +## Important Dependencies + +| Dependency | Version | Purpose | +|------------|---------|---------| +| kubernetes | v0.34.1 | Core K8s libraries | +| controller-runtime | v0.22.2 | Controller framework | +| operator-framework/api | v0.35.0 | OLM API definitions | +| operator-registry | v1.60.0 | Catalog/bundle tooling | +| ginkgo/gomega | v2.26.0 / v1.38.2 | BDD testing | + +## Common Tasks for AI Agents + +### Understanding Operator Installation Flow +1. User creates Subscription pointing to catalog/package/channel +2. Catalog Operator queries catalog for latest CSV in channel +3. Catalog Operator creates InstallPlan with resolved dependencies +4. Upon approval, Catalog Operator creates CRDs and CSV +5. OLM Operator detects CSV, validates requirements, creates Deployment/RBAC +6. CSV transitions through: Pending → InstallReady → Installing → Succeeded + +### Debugging Installation Issues +- Check CSV status and conditions: `kubectl get csv -o yaml` +- Examine InstallPlan: `kubectl get ip -o yaml` +- Review operator logs: OLM Operator and Catalog Operator pods in `olm` namespace +- Verify OperatorGroup configuration for namespace scoping + +### Adding New Functionality +**REMINDER**: This repository is in maintenance mode - only critical fixes accepted! + +For understanding existing code: +1. Controllers follow controller-runtime patterns with Reconcile() methods +2. Use informers and listers from `pkg/lib/operatorlister` +3. Queue-based event handling via `pkg/lib/queueinformer` +4. Always respect OperatorGroup namespace scoping + +### Code Generation +Most code is generated - don't hand-edit: +- Client code: Generated from CRDs using k8s.io/code-generator +- Deep-copy methods: Auto-generated for all API types +- Mocks: Generated via counterfeiter/gomock +- CRD manifests: Copied from operator-framework/api repository + +Always run `make gen-all` after API changes. + +## Navigation Tips + +### Finding Controllers +- OLM Operator controllers: `pkg/controller/operators/` +- Catalog Operator controllers: `pkg/controller/registry/`, subscription/installplan logic in `pkg/controller/operators/catalog/` + +### Finding API Definitions +- CRDs are defined in operator-framework/api (external dependency) +- Clients are in `pkg/api/client/` +- Listers are in `pkg/lib/operatorlister/` + +### Finding Business Logic +- CSV installation: `pkg/controller/operators/olm/` +- Dependency resolution: `pkg/controller/registry/resolver/` +- Catalog management: `pkg/controller/registry/reconciler/` +- InstallPlan execution: `pkg/controller/install/` + +### Finding Utilities +- Owner references: `pkg/lib/ownerutil/` +- Scoped clients: `pkg/lib/scoped/` +- Operator clients: `pkg/lib/operatorclient/` +- Queue informers: `pkg/lib/queueinformer/` + +## Anti-Patterns to Avoid + +1. **Don't bypass OperatorGroup scoping** - Always use scoped clients for multi-tenancy +2. **Don't modify generated code** - Edit source (CRDs, annotations) and regenerate +3. **Don't skip approval for InstallPlans** - Respect manual approval settings +4. **Don't create CSVs directly** - Use Subscriptions/Catalogs for proper lifecycle +5. **Don't ignore owner references** - Critical for garbage collection + +## Resources and Links + +- [OLM Documentation](https://olm.operatorframework.io/) +- [Architecture Doc](doc/design/architecture.md) +- [Philosophy](doc/design/philosophy.md) +- [Design Proposals](doc/contributors/design-proposals/) +- [Operator Framework Community](https://github.com/operator-framework/community) +- [OperatorHub.io](https://operatorhub.io/) - Public operator catalog + +## Quick Reference + +### Resource Short Names +```bash +kubectl get csv # ClusterServiceVersions +kubectl get sub # Subscriptions +kubectl get ip # InstallPlans +kubectl get catsrc # CatalogSources +kubectl get og # OperatorGroups +``` + +### Common Build Targets +```bash +make build build-utils # Build all binaries +make test unit e2e # Run tests +make lint verify # Code quality +make gen-all # Generate everything +make run-local # Full local dev environment +``` + +### Tool Management +Tools are managed via **bingo** (`.bingo/Variables.mk`) for reproducible builds. All tools are version-pinned. + +## Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md) and [CLAUDE.md](CLAUDE.md) for detailed guidelines. + +**Remember**: OLM v0 is in maintenance mode - only critical security fixes and outage issues are accepted! diff --git a/staging/operator-lifecycle-manager/Makefile b/staging/operator-lifecycle-manager/Makefile index d10ff7ab85..c2beb5a106 100644 --- a/staging/operator-lifecycle-manager/Makefile +++ b/staging/operator-lifecycle-manager/Makefile @@ -48,6 +48,12 @@ GINKGO := $(TOOL_EXEC) github.com/onsi/ginkgo/v2/ginkgo # Target environment and Dependencies # +# Cert-manager version - update this for new releases +CERT_MANAGER_VERSION ?= v1.18.2 + +# Cert-manager deployment timeout +CERT_MANAGER_TIMEOUT ?= 120s + # Minor Kubernetes version to build against derived from the client-go dependency version KUBE_MINOR ?= $(shell go list -m k8s.io/client-go | cut -d" " -f2 | sed 's/^v0\.\([[:digit:]]\{1,\}\)\.[[:digit:]]\{1,\}$$/1.\1/') @@ -157,7 +163,29 @@ local-build: IMAGE_TAG = local local-build: image .PHONY: run-local -run-local: local-build kind-create deploy +run-local: local-build kind-create cert-manager-install deploy + +.PHONY: cert-manager-install +cert-manager-install: #HELP Install cert-manager $(CERT_MANAGER_VERSION) + @echo "Installing cert-manager $(CERT_MANAGER_VERSION)" + kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/$(CERT_MANAGER_VERSION)/cert-manager.yaml + @echo "Waiting for cert-manager to be ready..." + kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager --timeout=$(CERT_MANAGER_TIMEOUT) + kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager-cainjector --timeout=$(CERT_MANAGER_TIMEOUT) + kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager-webhook --timeout=$(CERT_MANAGER_TIMEOUT) + @echo "Waiting for cert-manager webhook to be ready..." + kubectl wait --for=condition=Ready --namespace=cert-manager pod -l app=webhook --timeout=$(CERT_MANAGER_TIMEOUT) + @echo "Waiting for cert-manager CRDs to be available..." + kubectl wait --for condition=established --timeout=$(CERT_MANAGER_TIMEOUT) crd/certificates.cert-manager.io + kubectl wait --for condition=established --timeout=$(CERT_MANAGER_TIMEOUT) crd/issuers.cert-manager.io + @echo "cert-manager $(CERT_MANAGER_VERSION) installed successfully" + +.PHONY: cert-manager-uninstall +cert-manager-uninstall: #HELP Uninstall cert-manager + @echo "Uninstalling cert-manager..." + kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/$(CERT_MANAGER_VERSION)/cert-manager.yaml --ignore-not-found=true + @echo "cert-manager uninstalled" + .PHONY: clean clean: #HELP Clean up build artifacts @@ -231,6 +259,7 @@ deploy: $(KIND) $(HELM) #HELP Deploy OLM to kind cluster $KIND_CLUSTER_NAME (def $(KIND) load docker-image $(OLM_IMAGE) --name $(KIND_CLUSTER_NAME); \ $(HELM) upgrade --install olm deploy/chart \ --set debug=true \ + --set certManager.enabled=true \ --set olm.image.ref=$(OLM_IMAGE) \ --set olm.image.pullPolicy=IfNotPresent \ --set catalog.image.ref=$(OLM_IMAGE) \ @@ -254,6 +283,9 @@ undeploy: $(KIND) $(HELM) #HELP Uninstall OLM from kind cluster $KIND_CLUSTER_NA $(HELM) uninstall olm kubectl delete -f deploy/chart/crds + # Uninstall cert-manager + $(MAKE) cert-manager-uninstall + #SECTION e2e # E2E test configuration @@ -269,7 +301,24 @@ e2e: #HELP Run e2e tests against a cluster running OLM (params: $E2E_TEST_NS (op $(GO_TEST_ENV) $(GINKGO) -timeout $(E2E_TIMEOUT) $(GINKGO_OPTS) $(E2E_GINKGO_OPTS) ./test/e2e -- -namespace=$(E2E_TEST_NS) -olmNamespace=$(E2E_INSTALL_NS) -catalogNamespace=$(E2E_CATALOG_NS) $(E2E_OPTS) .PHONY: e2e-local -e2e-local: e2e-build kind-create deploy e2e +e2e-local: e2e-build kind-create e2e-local-deploy e2e + +.PHONY: e2e-local-deploy +e2e-local-deploy: $(KIND) $(HELM) #HELP Deploy OLM for e2e testing (without cert-manager) + $(KIND) load docker-image $(OLM_IMAGE) --name $(KIND_CLUSTER_NAME); \ + $(HELM) upgrade --install olm deploy/chart \ + --set debug=true \ + --set certManager.enabled=false \ + --set olm.image.ref=$(OLM_IMAGE) \ + --set olm.image.pullPolicy=IfNotPresent \ + --set catalog.image.ref=$(OLM_IMAGE) \ + --set catalog.image.pullPolicy=IfNotPresent \ + --set catalog.commandArgs=--configmapServerImage=$(CONFIGMAP_SERVER_IMAGE) \ + --set catalog.opmImageArgs=--opmImage=$(OPERATOR_REGISTRY_IMAGE) \ + --set package.image.ref=$(OLM_IMAGE) \ + --set package.image.pullPolicy=IfNotPresent \ + $(HELM_INSTALL_OPTS) \ + --wait; #SECTION Code Generation @@ -286,12 +335,16 @@ codegen: #HELP Generate clients, deepcopy, listers, and informers .PHONY: mockgen mockgen: #HELP Generate mocks - # Generate mocks and silence the followign warning: + # Generate mocks and silence the following warning: # WARNING: Invoking counterfeiter multiple times from "go generate" is slow. # Consider using counterfeiter:generate directives to speed things up. # See https://github.com/maxbrunsfeld/counterfeiter#step-2b---add-counterfeitergenerate-directives for more information. # Set the "COUNTERFEITER_NO_GENERATE_WARNING" environment variable to suppress this message. - COUNTERFEITER_NO_GENERATE_WARNING=1 go generate ./pkg/... + @set -e; \ + overlay_file=$$(mktemp "$(CURDIR)/hack/overlays/goimports_overlay.XXXXXX.json"); \ + trap 'rm -f "$$overlay_file"' EXIT; \ + printf '{\n "Replace": {\n "%s/vendor/golang.org/x/tools/imports/vendorlesspath.go": "%s/hack/overlays/goimports_vendorlesspath.go"\n }\n}\n' "$(CURDIR)" "$(CURDIR)" > "$$overlay_file"; \ + GO111MODULE=on GOWORK=off COUNTERFEITER_NO_GENERATE_WARNING=1 GOFLAGS="$$GOFLAGS -overlay=$$overlay_file" go generate ./pkg/... #SECTION Verification diff --git a/staging/operator-lifecycle-manager/cmd/catalog/main.go b/staging/operator-lifecycle-manager/cmd/catalog/main.go index b82f1689cb..4092bf8922 100644 --- a/staging/operator-lifecycle-manager/cmd/catalog/main.go +++ b/staging/operator-lifecycle-manager/cmd/catalog/main.go @@ -57,9 +57,16 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error { o.catalogNamespace = catalogNamespaceEnvVarValue } + // create a config client for operator status + config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig) + if err != nil { + return fmt.Errorf("error configuring client: %s", err.Error()) + } + listenAndServe, err := server.GetListenAndServeFunc( server.WithLogger(logger), server.WithTLS(&o.tlsCertPath, &o.tlsKeyPath, &o.clientCAPath), + server.WithKubeConfig(config), server.WithDebug(o.debug), ) if err != nil { @@ -72,11 +79,6 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error { } }() - // create a config client for operator status - config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig) - if err != nil { - return fmt.Errorf("error configuring client: %s", err.Error()) - } configClient, err := configv1client.NewForConfig(config) if err != nil { return fmt.Errorf("error configuring client: %s", err.Error()) diff --git a/staging/operator-lifecycle-manager/cmd/olm/main.go b/staging/operator-lifecycle-manager/cmd/olm/main.go index ff6e7354e6..a5ea596910 100644 --- a/staging/operator-lifecycle-manager/cmd/olm/main.go +++ b/staging/operator-lifecycle-manager/cmd/olm/main.go @@ -123,7 +123,18 @@ func main() { } logger.Infof("log level %s", logger.Level) - listenAndServe, err := server.GetListenAndServeFunc(server.WithLogger(logger), server.WithTLS(tlsCertPath, tlsKeyPath, clientCAPath), server.WithDebug(*debug)) + mgr, err := Manager(ctx, *debug) + if err != nil { + logger.WithError(err).Fatal("error configuring controller manager") + } + config := mgr.GetConfig() + + listenAndServe, err := server.GetListenAndServeFunc( + server.WithLogger(logger), + server.WithTLS(tlsCertPath, tlsKeyPath, clientCAPath), + server.WithKubeConfig(config), + server.WithDebug(*debug), + ) if err != nil { logger.Fatalf("Error setting up health/metric/pprof service: %v", err) } @@ -134,12 +145,6 @@ func main() { } }() - mgr, err := Manager(ctx, *debug) - if err != nil { - logger.WithError(err).Fatal("error configuring controller manager") - } - config := mgr.GetConfig() - // create a config that validates we're creating objects with labels validatingConfig := validatingroundtripper.Wrap(config, mgr.GetScheme()) diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml index 086fbc4c04..391b04ea4a 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml @@ -631,8 +631,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml index 20bb1a0394..b957a9badb 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -1382,8 +1382,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1767,7 +1767,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1822,6 +1824,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1872,8 +1910,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1900,7 +1938,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2544,7 +2584,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2597,10 +2637,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2612,6 +2652,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3213,7 +3304,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3268,6 +3361,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3318,8 +3447,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3346,7 +3475,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3969,7 +4100,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4023,9 +4154,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4541,7 +4714,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4566,6 +4741,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4653,7 +4841,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4708,6 +4898,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4758,8 +4984,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4786,7 +5012,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5430,7 +5658,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5483,10 +5711,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5498,6 +5726,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6007,6 +6286,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6158,7 +6438,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6172,7 +6452,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7406,15 +7686,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7583,16 +7861,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7667,7 +7942,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8060,6 +8335,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8186,7 +8565,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml index c388b9181e..10f465665c 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml @@ -618,8 +618,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -968,7 +968,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1023,6 +1025,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1098,7 +1136,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1137,7 +1177,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1987,15 +2027,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2164,16 +2202,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2248,7 +2283,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2641,6 +2676,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2767,7 +2906,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_02-olm-operator.serviceaccount.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_02-olm-operator.serviceaccount.yaml index fceffd024c..2c15ad34bf 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_02-olm-operator.serviceaccount.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_02-olm-operator.serviceaccount.yaml @@ -8,6 +8,18 @@ rules: verbs: ["watch", "list", "get", "create", "update", "patch", "delete", "deletecollection", "escalate", "bind"] - nonResourceURLs: ["*"] verbs: ["*"] +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create --- kind: ServiceAccount apiVersion: v1 diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_03-services.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_03-services.yaml index 51fb8df0e3..fde964e75d 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_03-services.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_03-services.yaml @@ -1,39 +1,43 @@ -{{ if .Values.monitoring.enabled }} +{{- if or .Values.monitoring.enabled .Values.serviceCa.enabled }} apiVersion: v1 kind: Service metadata: - name: olm-operator-metrics + name: {{ .Values.olm.service.name }} namespace: {{ .Values.namespace }} + {{- if .Values.serviceCa.enabled }} annotations: - service.alpha.openshift.io/serving-cert-secret-name: olm-operator-serving-cert + service.alpha.openshift.io/serving-cert-secret-name: {{ .Values.serviceCa.olmOperator.secretName }} + {{- end }} labels: app: olm-operator spec: type: ClusterIP ports: - name: https-metrics - port: {{ .Values.olm.service.externalPort }} + port: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.olm.service.internalPortHttps }}{{ else }}{{ .Values.olm.service.externalPort }}{{ end }} protocol: TCP - targetPort: {{ .Values.olm.service.internalPort }} + targetPort: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.olm.service.internalPortHttps }}{{ else }}{{ .Values.olm.service.internalPort }}{{ end }} selector: app: olm-operator --- apiVersion: v1 kind: Service metadata: - name: catalog-operator-metrics + name: {{ .Values.catalog.service.name }} namespace: {{ .Values.namespace }} + {{- if .Values.serviceCa.enabled }} annotations: - service.alpha.openshift.io/serving-cert-secret-name: catalog-operator-serving-cert + service.alpha.openshift.io/serving-cert-secret-name: {{ .Values.serviceCa.catalogOperator.secretName }} + {{- end }} labels: app: catalog-operator spec: type: ClusterIP ports: - name: https-metrics - port: {{ .Values.catalog.service.externalPort }} + port: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.catalog.service.internalPortHttps }}{{ else }}{{ .Values.catalog.service.externalPort }}{{ end }} protocol: TCP - targetPort: {{ .Values.catalog.service.internalPort }} + targetPort: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.catalog.service.internalPortHttps }}{{ else }}{{ .Values.catalog.service.internalPort }}{{ end }} selector: app: catalog-operator {{ end }} diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_04-cert-manager.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_04-cert-manager.yaml new file mode 100644 index 0000000000..699e8deef3 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_04-cert-manager.yaml @@ -0,0 +1,46 @@ +{{- if .Values.certManager.enabled }} +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: {{ .Values.certManager.issuer.name }} + namespace: {{ .Values.namespace }} +spec: + {{- if .Values.certManager.issuer.selfSigned }} + selfSigned: {} + {{- else if .Values.certManager.issuer.ca }} + ca: + secretName: {{ .Values.certManager.issuer.ca.secretName }} + {{- end }} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: {{ .Values.certManager.certificate.name }} + namespace: {{ .Values.namespace }} +spec: + secretName: {{ .Values.certManager.certificate.secretName }} + isCA: false + usages: + - server auth + - client auth + dnsNames: + - localhost + - catalog-operator.{{ .Values.namespace }}.svc + - catalog-operator.{{ .Values.namespace }}.svc.cluster.local + - olm-operator.{{ .Values.namespace }}.svc + - olm-operator.{{ .Values.namespace }}.svc.cluster.local + {{- range .Values.certManager.certificate.extraDnsNames }} + - {{ . }} + {{- end }} + ipAddresses: + - 127.0.0.1 + {{- range .Values.certManager.certificate.extraIpAddresses }} + - {{ . }} + {{- end }} + issuerRef: + name: {{ .Values.certManager.issuer.name }} + kind: Issuer + group: cert-manager.io +{{- end }} + diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml index 139f295195..b7eb6c8dd3 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml @@ -22,16 +22,21 @@ spec: seccompProfile: type: RuntimeDefault serviceAccountName: olm-operator-serviceaccount - volumes: - {{- if .Values.olm.tlsSecret }} + volumes: + {{- if .Values.certManager.enabled }} - name: srv-cert secret: - secretName: {{ .Values.olm.tlsSecret }} - {{- end }} - {{- if .Values.olm.clientCASecret }} + secretName: {{ .Values.certManager.certificate.secretName }} - name: profile-collector-cert secret: - secretName: {{ .Values.olm.clientCASecret }} + secretName: {{ .Values.certManager.certificate.secretName }} + {{- else if .Values.serviceCa.enabled }} + - name: srv-cert + secret: + secretName: {{ .Values.serviceCa.olmOperator.secretName }} + - name: profile-collector-cert + secret: + secretName: {{ .Values.serviceCa.olmOperator.secretName }} {{- end }} - name: tmpfs emptyDir: {} @@ -43,12 +48,10 @@ spec: capabilities: drop: [ "ALL" ] volumeMounts: - {{- if .Values.olm.tlsSecret }} + {{- if or .Values.certManager.enabled .Values.serviceCa.enabled }} - name: srv-cert mountPath: "/srv-cert" readOnly: true - {{- end }} - {{- if .Values.olm.clientCASecret }} - name: profile-collector-cert mountPath: "/profile-collector-cert" readOnly: true @@ -78,31 +81,29 @@ spec: - --writePackageServerStatusName - {{ .Values.writePackageServerStatusName }} {{- end }} - {{- if .Values.olm.tlsSecret }} + {{- if or .Values.certManager.enabled .Values.serviceCa.enabled }} - --tls-cert - /srv-cert/tls.crt - --tls-key - /srv-cert/tls.key - {{- end }} - {{- if .Values.olm.clientCASecret }} - --client-ca - /profile-collector-cert/tls.crt {{- end }} image: {{ .Values.olm.image.ref }} imagePullPolicy: {{ .Values.olm.image.pullPolicy }} ports: - - containerPort: {{ .Values.olm.service.internalPort }} + - containerPort: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.olm.service.internalPortHttps }}{{ else }}{{ .Values.olm.service.internalPort }}{{ end }} name: metrics livenessProbe: httpGet: path: /healthz - port: {{ .Values.olm.service.internalPort }} - scheme: {{ if .Values.olm.tlsSecret }}HTTPS{{ else }}HTTP{{end}} + port: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.olm.service.internalPortHttps }}{{ else }}{{ .Values.olm.service.internalPort }}{{ end }} + scheme: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}HTTPS{{ else }}HTTP{{ end }} readinessProbe: httpGet: path: /healthz - port: {{ .Values.olm.service.internalPort }} - scheme: {{ if .Values.olm.tlsSecret }}HTTPS{{ else }}HTTP{{end}} + port: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.olm.service.internalPortHttps }}{{ else }}{{ .Values.olm.service.internalPort }}{{ end }} + scheme: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}HTTPS{{ else }}HTTP{{ end }} terminationMessagePolicy: FallbackToLogsOnError env: - name: OPERATOR_NAMESPACE diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_08-catalog-operator.deployment.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_08-catalog-operator.deployment.yaml index 7b27706a74..5a4a77635f 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_08-catalog-operator.deployment.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_08-catalog-operator.deployment.yaml @@ -23,15 +23,20 @@ spec: type: RuntimeDefault serviceAccountName: olm-operator-serviceaccount volumes: - {{- if .Values.catalog.tlsSecret }} + {{- if .Values.certManager.enabled }} - name: srv-cert secret: - secretName: {{ .Values.catalog.tlsSecret }} - {{- end }} - {{- if .Values.catalog.clientCASecret }} + secretName: {{ .Values.certManager.certificate.secretName }} - name: profile-collector-cert secret: - secretName: {{ .Values.catalog.clientCASecret }} + secretName: {{ .Values.certManager.certificate.secretName }} + {{- else if .Values.serviceCa.enabled }} + - name: srv-cert + secret: + secretName: {{ .Values.serviceCa.catalogOperator.secretName }} + - name: profile-collector-cert + secret: + secretName: {{ .Values.serviceCa.catalogOperator.secretName }} {{- end }} - name: tmpfs emptyDir: {} @@ -43,12 +48,10 @@ spec: capabilities: drop: [ "ALL" ] volumeMounts: - {{- if .Values.catalog.tlsSecret }} + {{- if or .Values.certManager.enabled .Values.serviceCa.enabled }} - name: srv-cert mountPath: "/srv-cert" readOnly: true - {{- end }} - {{- if .Values.catalog.clientCASecret }} - name: profile-collector-cert mountPath: "/profile-collector-cert" readOnly: true @@ -75,13 +78,11 @@ spec: - --writeStatusName - {{ .Values.writeStatusNameCatalog }} {{- end }} - {{- if .Values.catalog.tlsSecret }} + {{- if or .Values.certManager.enabled .Values.serviceCa.enabled }} - --tls-cert - /srv-cert/tls.crt - --tls-key - /srv-cert/tls.key - {{- end }} - {{- if .Values.catalog.clientCASecret }} - --client-ca - /profile-collector-cert/tls.crt {{- end }} @@ -98,18 +99,18 @@ spec: {{- end }} imagePullPolicy: {{ .Values.catalog.image.pullPolicy }} ports: - - containerPort: {{ .Values.olm.service.internalPort }} + - containerPort: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.catalog.service.internalPortHttps }}{{ else }}{{ .Values.catalog.service.internalPort }}{{ end }} name: metrics livenessProbe: httpGet: path: /healthz - port: {{ .Values.catalog.service.internalPort }} - scheme: {{ if .Values.catalog.tlsSecret }}HTTPS{{ else }}HTTP{{end}} + port: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.catalog.service.internalPortHttps }}{{ else }}{{ .Values.catalog.service.internalPort }}{{ end }} + scheme: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}HTTPS{{ else }}HTTP{{ end }} readinessProbe: httpGet: path: /healthz - port: {{ .Values.catalog.service.internalPort }} - scheme: {{ if .Values.catalog.tlsSecret }}HTTPS{{ else }}HTTP{{end}} + port: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}{{ .Values.catalog.service.internalPortHttps }}{{ else }}{{ .Values.catalog.service.internalPort }}{{ end }} + scheme: {{ if or .Values.certManager.enabled .Values.serviceCa.enabled }}HTTPS{{ else }}HTTP{{ end }} terminationMessagePolicy: FallbackToLogsOnError {{- if .Values.catalog.resources }} resources: diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml index 6585bd609e..0d988e165f 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml @@ -87,4 +87,27 @@ rules: - get - list - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operator-lifecycle-manager-metrics-reader +rules: +- nonResourceURLs: + - "/metrics" + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: operator-lifecycle-manager-metrics-reader +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: operator-lifecycle-manager-metrics-reader +subjects: +- kind: ServiceAccount + name: prometheus-k8s + namespace: {{ .Values.monitoring.namespace }} {{ end }} diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/_helpers.tpl b/staging/operator-lifecycle-manager/deploy/chart/templates/_helpers.tpl index 308975b6f9..f0d83d2edb 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/templates/_helpers.tpl +++ b/staging/operator-lifecycle-manager/deploy/chart/templates/_helpers.tpl @@ -13,4 +13,4 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this {{- define "fullname" -}} {{- $name := default .Chart.Name .Values.nameOverride -}} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} \ No newline at end of file +{{- end -}} diff --git a/staging/operator-lifecycle-manager/deploy/chart/values.yaml b/staging/operator-lifecycle-manager/deploy/chart/values.yaml index 4e4ee726b8..af9968d327 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/values.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/values.yaml @@ -27,10 +27,10 @@ olm: ref: quay.io/operator-framework/olm:master pullPolicy: Always service: + name: olm-operator-metrics internalPort: 8080 + internalPortHttps: 8443 externalPort: metrics - # tlsSecret: olm-operator-serving-cert - # clientCASecret: pprof-serving-cert nodeSelector: kubernetes.io/os: linux resources: @@ -47,10 +47,10 @@ catalog: ref: quay.io/operator-framework/olm:master pullPolicy: Always service: + name: catalog-operator-metrics internalPort: 8080 + internalPortHttps: 8443 externalPort: metrics - # tlsSecret: catalog-operator-serving-cert - # clientCASecret: pprof-serving-cert nodeSelector: kubernetes.io/os: linux resources: @@ -78,6 +78,31 @@ monitoring: enabled: false namespace: monitoring +certManager: + enabled: true + issuer: + name: olm-ca-issuer + selfSigned: true + ca: + secretName: "" + certificate: + name: olm-cert + secretName: olm-cert + extraDnsNames: [] + extraIpAddresses: [] + +# OpenShift service-ca configuration +# When enabled, uses OpenShift service-ca-operator for certificate management +# This is mutually exclusive with certManager - only one should be enabled +serviceCa: + enabled: false + # Secret names are left empty in upstream, to be filled by downstream values.yaml + # Service names are taken from olm.service.name and catalog.service.name + olmOperator: + secretName: "" + catalogOperator: + secretName: "" + networkPolicy: dns: ports: diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index 6b46db5f62..98d2f32474 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -17,41 +17,41 @@ require ( github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 github.com/mitchellh/hashstructure v1.1.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/onsi/ginkgo/v2 v2.25.3 + github.com/onsi/ginkgo/v2 v2.26.0 github.com/onsi/gomega v1.38.2 - github.com/openshift/api v3.9.0+incompatible + github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a - github.com/operator-framework/api v0.34.0 - github.com/operator-framework/operator-registry v1.59.0 + github.com/operator-framework/api v0.35.0 + github.com/operator-framework/operator-registry v1.60.0 github.com/otiai10/copy v1.14.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.23.2 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.66.1 + github.com/prometheus/common v0.67.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/stretchr/testify v1.11.1 - go.podman.io/image/v5 v5.37.0 - golang.org/x/net v0.44.0 + go.podman.io/image/v5 v5.38.0 + golang.org/x/net v0.46.0 golang.org/x/sync v0.17.0 - golang.org/x/time v0.13.0 - google.golang.org/grpc v1.75.1 + golang.org/x/time v0.14.0 + google.golang.org/grpc v1.76.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.33.4 - k8s.io/apiextensions-apiserver v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/apiserver v0.33.4 - k8s.io/client-go v0.33.4 - k8s.io/code-generator v0.33.4 - k8s.io/component-base v0.33.4 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/apiserver v0.34.1 + k8s.io/client-go v0.34.1 + k8s.io/code-generator v0.34.1 + k8s.io/component-base v0.34.1 k8s.io/klog v1.0.0 k8s.io/klog/v2 v2.130.1 - k8s.io/kube-aggregator v0.33.4 - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a + k8s.io/kube-aggregator v0.34.1 + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 - sigs.k8s.io/controller-runtime v0.21.0 - sigs.k8s.io/controller-tools v0.18.0 + sigs.k8s.io/controller-runtime v0.22.3 + sigs.k8s.io/controller-tools v0.19.0 ) require ( @@ -80,17 +80,17 @@ require ( github.com/containers/ocicrypt v1.2.1 // indirect github.com/coreos/go-systemd/v22 v22.6.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/docker/cli v28.4.0+incompatible // indirect + github.com/docker/cli v28.5.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v28.3.3+incompatible // indirect - github.com/docker/docker-credential-helpers v0.9.3 // indirect + github.com/docker/docker v28.5.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.4 // indirect github.com/docker/go-connections v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect @@ -103,8 +103,8 @@ require ( github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.1 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect @@ -129,7 +129,7 @@ require ( github.com/moby/sys/user v0.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect @@ -140,12 +140,12 @@ require ( github.com/stoewer/go-strcase v1.3.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.etcd.io/bbolt v1.4.3 // indirect - go.etcd.io/etcd/api/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect - go.etcd.io/etcd/client/v3 v3.5.21 // indirect + go.etcd.io/etcd/api/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect + go.etcd.io/etcd/client/v3 v3.6.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect go.opentelemetry.io/otel v1.37.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect @@ -155,52 +155,36 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 // indirect go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.podman.io/common v0.65.0 // indirect - go.podman.io/storage v1.60.0 // indirect + go.podman.io/storage v1.61.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.42.0 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/mod v0.28.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/term v0.35.0 // indirect - golang.org/x/text v0.29.0 // indirect - golang.org/x/tools v0.36.0 // indirect - golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.38.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/protobuf v1.36.9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect - k8s.io/kms v0.33.4 // indirect + k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect + k8s.io/kms v0.34.1 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) -// v1.64.0 brings in go1.23, which we aren't ready to go to just yet -// issue: https://github.com/operator-framework/operator-lifecycle-manager/issues/3284 -replace google.golang.org/grpc => google.golang.org/grpc v1.63.2 - -// cel-go v0.23.0 upgrade causes errors raised from the vendor source which lead to think in -// incompatibilities scenarios. After upgrade to use the latest versions of k8s/api v0.33+ -// we should try to see if we could fix this one and remove this replace -replace github.com/google/cel-go => github.com/google/cel-go v0.22.1 - -replace ( - // controller runtime - github.com/openshift/api => github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 // release-4.12 - github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c // release-4.12 -) - retract v3.11.0+incompatible // https://github.com/operator-framework/operator-lifecycle-manager/issues/2253 diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum index 82366be3be..f3c69f7c6c 100644 --- a/staging/operator-lifecycle-manager/go.sum +++ b/staging/operator-lifecycle-manager/go.sum @@ -1,10 +1,10 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -17,1374 +17,77 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= -cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= -cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0= -cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= -cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= -cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= -cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= -cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk= -cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= -cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= -cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= -cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= -cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= -cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo= -cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= -cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/aiplatform v1.58.2/go.mod h1:c3kCiVmb6UC1dHAjZjcpDj6ZS0bHQ2slL88ZjC2LtlA= -cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= -cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA= -cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= -cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= -cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8= -cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= -cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= -cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= -cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18= -cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= -cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= -cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= -cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8= -cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= -cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= -cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= -cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= -cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo= -cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= -cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= -cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= -cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4= -cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= -cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= -cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= -cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= -cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= -cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI= -cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= -cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= -cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= -cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= -cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= -cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4= -cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= -cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.16.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/asset v1.17.1/go.mod h1:byvDw36UME5AzGNK7o4JnOnINkwOZ1yRrGrKIahHrng= -cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= -cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4= -cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= -cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= -cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= -cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg= -cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= -cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= -cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= -cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= -cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88= -cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= -cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= -cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= -cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= -cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8= -cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= -cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= -cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk= -cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= -cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= -cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= -cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= -cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= -cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= -cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= -cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= -cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= -cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= -cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg= -cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= -cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= -cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= -cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE= -cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= -cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= -cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ= -cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= -cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= -cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= -cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= -cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ= -cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= -cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= -cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU= -cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= -cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= -cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= -cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk= -cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= -cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= -cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= -cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk= -cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= -cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= -cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= -cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= -cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= -cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE= -cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= -cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= -cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= -cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04= -cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= -cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/container v1.30.1/go.mod h1:vkbfX0EnAKL/vgVECs5BZn24e1cJROzgszJirRKQ4Bg= -cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= -cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= -cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY= -cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= -cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= -cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= -cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= -cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= -cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A= -cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= -cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= -cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= -cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo= -cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= -cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= -cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= -cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM= -cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= -cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= -cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= -cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0= -cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= -cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= -cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= -cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE= -cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= -cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= -cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= -cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs= -cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= -cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataplex v1.14.1/go.mod h1:bWxQAbg6Smg+sca2+Ex7s8D9a5qU6xfXtwmq4BVReps= -cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= -cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= -cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o= -cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= -cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= -cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs= -cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= -cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= -cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= -cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= -cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= -cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c= -cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= -cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= -cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= -cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g= -cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= -cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= -cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= -cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= -cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk= -cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= -cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= -cloud.google.com/go/dialogflow v1.48.2/go.mod h1:7A2oDf6JJ1/+hdpnFRfb/RjJUOh2X3rhIa5P8wQSEX4= -cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= -cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ= -cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= -cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= -cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= -cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= -cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo= -cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= -cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/documentai v1.23.8/go.mod h1:Vd/y5PosxCpUHmwC+v9arZyeMfTqBR9VIwOwIqQYYfA= -cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= -cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I= -cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= -cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= -cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= -cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4= -cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= -cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= -cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= -cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo= -cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= -cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= -cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= -cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y= -cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= -cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= -cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= -cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE= -cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= -cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= -cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= -cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= -cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= -cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE= -cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= -cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= -cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= -cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk= -cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= -cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= -cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= -cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY= -cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= -cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= -cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= -cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY= -cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= -cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= -cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= -cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8= -cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= -cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= -cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= -cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU= -cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= -cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= -cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= -cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= -cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= -cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= -cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q= -cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= -cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= -cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= -cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk= -cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= -cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= -cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= -cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg= -cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= -cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= -cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= -cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ= -cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= -cloud.google.com/go/kms v1.15.6/go.mod h1:yF75jttnIdHfGBoE51AKsD/Yqf+/jICzB9v1s1acsms= -cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= -cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= -cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U= -cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= -cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= -cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= -cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA= -cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= -cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= -cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= -cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= -cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= -cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= -cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= -cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= -cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8= -cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= -cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= -cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= -cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY= -cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= -cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= -cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= -cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8= -cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= -cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= -cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= -cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A= -cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= -cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= -cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= -cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= -cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU= -cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= -cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= -cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= -cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= -cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4= -cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= -cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/monitoring v1.17.1/go.mod h1:SJzPMakCF0GHOuKEH/r4hxVKF04zl+cRPQyc3d/fqII= -cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= -cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= -cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug= -cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= -cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= -cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= -cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= -cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI= -cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= -cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= -cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= -cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI= -cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= -cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= -cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= -cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= -cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A= -cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= -cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= -cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= -cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= -cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8= -cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= -cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= -cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= -cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0= -cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= -cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= -cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= -cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= -cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o= -cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= -cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= -cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= -cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0= -cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= -cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= -cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= -cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= -cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg= -cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= -cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= -cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= -cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= -cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8= -cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= -cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= -cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= -cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= -cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= -cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U= -cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= -cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= -cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= -cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc= -cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= -cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= -cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= -cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= -cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y= -cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= -cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= -cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= -cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= -cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18= -cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= -cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= -cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA= -cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= -cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= -cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= -cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE= -cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= -cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= -cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= -cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk= -cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= -cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= -cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= -cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8= -cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= -cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= -cloud.google.com/go/retail v1.15.1/go.mod h1:In9nSBOYhLbDGa87QvWlnE1XA14xBN2FpQRiRsUs9wU= -cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= -cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= -cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s= -cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= -cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= -cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= -cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY= -cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= -cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= -cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss= -cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= -cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= -cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= -cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg= -cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= -cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= -cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= -cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s= -cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= -cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= -cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI= -cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= -cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= -cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= -cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc= -cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= -cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= -cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= -cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= -cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= -cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU= -cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= -cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= -cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= -cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA= -cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= -cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= -cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs= -cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= -cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= -cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= -cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo= -cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= -cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= -cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= -cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4= -cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= -cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= -cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= -cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU= -cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= -cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= -cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= -cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA= -cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= -cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= -cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= -cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8= -cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= -cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= -cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= -cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU= -cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= -cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= -cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= -cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc= -cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= -cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= -cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= -cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM= -cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= -cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= -cloud.google.com/go/vision/v2 v2.7.6/go.mod h1:ZkvWTVNPBU3YZYzgF9Y1jwEbD1NBOCyJn0KFdQfE6Bw= -cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= -cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8= -cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= -cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= -cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= -cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk= -cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= -cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= -cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= -cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU= -cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= -cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= -cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= -cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc= -cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= -cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= -cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= -cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas= -cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= -cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= -cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= -cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= -cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM= -cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= -cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= -cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/akrylysov/pogreb v0.10.2 h1:e6PxmeyEhWyi2AKOBIJzAEi4HkiC+lKyCocRGlnDi78= github.com/akrylysov/pogreb v0.10.2/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= -github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= -github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= -github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= -github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= github.com/containerd/containerd v1.7.28 h1:Nsgm1AtcmEh4AHAJ4gGlNSaKgXiNccU270Dnf81FQ3c= @@ -1417,6 +120,11 @@ github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6N github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1427,14 +135,14 @@ github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v28.4.0+incompatible h1:RBcf3Kjw2pMtwui5V0DIMdyeab8glEw5QY0UUU4C9kY= -github.com/docker/cli v28.4.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= +github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= -github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= -github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/docker v28.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= +github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.4 h1:76ItO69/AP/V4yT9V4uuuItG0B1N8hvt0T0c0NN/DzI= +github.com/docker/docker-credential-helpers v0.9.4/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-events v0.0.0-20250114142523-c867878c5e32 h1:EHZfspsnLAz8Hzccd67D5abwLiqoqym2jz/jOS39mCk= @@ -1444,51 +152,47 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.14 h1:3fAqdB6BCPKHDMHAKRwtPUwYexKtGrNuw8HX/T/4neo= +github.com/gkampitakis/go-snaps v0.5.14/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s= github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= @@ -1498,58 +202,50 @@ github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lo github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= +github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= -github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= -github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-migrate/migrate/v4 v4.19.0 h1:RcjOnCGz3Or6HQYEJ/EEVLfWnmw9KnoigPSjzhCuaSE= github.com/golang-migrate/migrate/v4 v4.19.0/go.mod h1:9dyEcu+hO+G9hPSw8AIg50yg622pXJsoHItQnDGZkI0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -1576,21 +272,18 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= -github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -1602,25 +295,18 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU= github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y= -github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1630,67 +316,32 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0 h1:+epNPbD5EqgpEMm5wrl4Hqts3jZt8+kYaqUisuuIGTk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.0/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg= @@ -1708,12 +359,10 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8z github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg= @@ -1724,33 +373,25 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/joelanford/ignore v0.1.1 h1:vKky5RDoPT+WbONrbQBgOn95VV/UPh4ejlyAbbzgnQk= github.com/joelanford/ignore v0.1.1/go.mod h1:8eho/D8fwQ3rIXrLwE23AaeaGDNXqLE9QJ3zJ4LIPCw= -github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -1759,47 +400,40 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d h1:fCRb9hXR4QQJpwc7xnGugnva0DD5ollTGkys0n8aXT4= github.com/letsencrypt/boulder v0.0.0-20250624003606-5ddd5acf990d/go.mod h1:BVoSL2Ed8oCncct0meeBqoTY7b1Mzx7WqEOZ8EisFmY= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= -github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 h1:aOeI7xAOVdK+R6xbVsZuU9HmCZYmQVmZgPf9xJUd2Sg= github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0/go.mod h1:0hZWbtfeCYUQeAQdPLUzETiBhUSns7O6LDj9vH88xKA= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= @@ -1813,16 +447,29 @@ github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcY github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.25.3 h1:Ty8+Yi/ayDAGtk4XxmmfUy4GabvM+MegeB4cDLRi6nw= -github.com/onsi/ginkgo/v2 v2.25.3/go.mod h1:43uiyQC4Ed2tkOzLsEYm7hnrb7UJTWHYNsuy3bG/snE= +github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE= +github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -1831,29 +478,23 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/openshift/api v0.0.0-20220525145417-ee5b62754c68/go.mod h1:LEnw1IVscIxyDnltE3Wi7bQb/QzIM8BfPNKoGA1Qlxw= github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 h1:PxjGCA72RtsdHWToZLkjjeWm7WXXx4cuv0u4gtvLbrk= github.com/openshift/api v0.0.0-20221021112143-4226c2167e40/go.mod h1:aQ6LDasvHMvHZXqLHnX2GRmnfTWCF/iIwz8EMTTIE9A= -github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c h1:CV76yFOTXmq9VciBR3Bve5ZWzSxdft7gaMVB3kS0rwg= -github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c/go.mod h1:lFMO8mLHXWFzSdYvGNo8ivF9SfF6zInA8ZGw4phRnUE= -github.com/operator-framework/api v0.34.0 h1:REiEaYhG1CWmDoajdcAdZqtgoljWG+ixMY59vUX5pFI= -github.com/operator-framework/api v0.34.0/go.mod h1:eGncUNIYvWtfGCCKmLzGXvoi3P0TDf3Yd/Z0Sn9E6SQ= -github.com/operator-framework/operator-registry v1.59.0 h1:SQhT0qMTYJXqStNhBOYXmLAMpS3eszzbcXAg5NLgJu8= -github.com/operator-framework/operator-registry v1.59.0/go.mod h1:QE1RRQGe+iau8sfY10DbP3+eoahH0G0l+coYrnEzJgI= +github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a h1:ylsEgoC8Dlg4A0C1TLH0A4x/TZao7k1YveLwROhRUdk= +github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a/go.mod h1:eDO5QeVi2IiXmDwB0e2z1DpAznWroZKe978pzZwFBzg= +github.com/operator-framework/api v0.35.0 h1:xKrffuGEagk3CWy6zqdK5YmIErlBtWUblNNK+q7ld7c= +github.com/operator-framework/api v0.35.0/go.mod h1:A9UNu/pdcO1RauMHvV54unp4DNm/Y5fMVbGDpnIIF+M= +github.com/operator-framework/operator-registry v1.60.0 h1:eUP14WThVTNx+/5hQR9Jyg0nxbf5cOg7hK/GgaOA5Tg= +github.com/operator-framework/operator-registry v1.60.0/go.mod h1:PojPivJbKZgD9RG77JWxFpQRo3iCoUn6WR3aTiS6HBI= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1864,14 +505,10 @@ github.com/proglottis/gpgme v0.1.5/go.mod h1:5LoXMgpE4bttgwwdv9bLs/vwqv3qV7F4glE github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/common v0.67.1 h1:OTSON1P4DNxzTg4hmKCc37o4ZAZDv0cfXLkOt0oEowI= +github.com/prometheus/common v0.67.1/go.mod h1:RpmT9v35q2Y+lsieQsdOh5sXZ6ajUGC8NjZAmr8vb0Q= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/redis/go-redis/extra/rediscmd/v9 v9.10.0 h1:uTiEyEyfLhkw678n6EulHVto8AkcXVr8zUcBJNZ0ark= @@ -1880,23 +517,17 @@ github.com/redis/go-redis/extra/redisotel/v9 v9.10.0 h1:4z7/hCJ9Jft8EBb2tDmK38p2 github.com/redis/go-redis/extra/redisotel/v9 v9.10.0/go.mod h1:B0thqLh4hB8MvvcUKSwyP5YiIcCCp8UrQ0cA9gEqyjk= github.com/redis/go-redis/v9 v9.10.0 h1:FxwK3eV8p/CQa0Ch276C7u2d0eNC9kCmAYQ7mCXCzVs= github.com/redis/go-redis/v9 v9.10.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sigstore/fulcio v1.7.1 h1:RcoW20Nz49IGeZyu3y9QYhyyV3ZKQ85T+FXPKkvE+aQ= github.com/sigstore/fulcio v1.7.1/go.mod h1:7lYY+hsd8Dt+IvKQRC+KEhWpCZ/GlmNvwIa5JhypMS8= github.com/sigstore/protobuf-specs v0.4.3 h1:kRgJ+ciznipH9xhrkAbAEHuuxD3GhYnGC873gZpjJT4= @@ -1909,18 +540,16 @@ github.com/smallstep/pkcs7 v0.2.1 h1:6Kfzr/QizdIuB6LSv8y1LJdZ3aPSfTNhTLqAx9CTLfA github.com/smallstep/pkcs7 v0.2.1/go.mod h1:RcXHsMfL+BzH8tRhmrF1NkkpebKpq3JEM66cOFxanf0= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1928,22 +557,26 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= github.com/tidwall/btree v1.8.1/go.mod h1:jBbTdUWhSZClZWoDg54VnvV7/54modSOzDN7VXftj1A= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= @@ -1964,26 +597,20 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v2 v2.305.21 h1:eLiFfexc2mE+pTLz9WwnoEsX5JTTpLCYVivKkmVXIRA= -go.etcd.io/etcd/client/v2 v2.305.21/go.mod h1:OKkn4hlYNf43hpjEM3Ke3aRdUkhSl8xjKjSf8eCq2J8= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= -go.etcd.io/etcd/pkg/v3 v3.5.21 h1:jUItxeKyrDuVuWhdh0HtjUANwyuzcb7/FAeUfABmQsk= -go.etcd.io/etcd/pkg/v3 v3.5.21/go.mod h1:wpZx8Egv1g4y+N7JAsqi2zoUiBIUWznLjqJbylDjWgU= -go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= -go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= -go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= -go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= +go.etcd.io/etcd/pkg/v3 v3.6.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= +go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= +go.etcd.io/etcd/server/v3 v3.6.4 h1:LsCA7CzjVt+8WGrdsnh6RhC0XqCsLkBly3ve5rTxMAU= +go.etcd.io/etcd/server/v3 v3.6.4/go.mod h1:aYCL/h43yiONOv0QIR82kH/2xZ7m+IWYjzRmyQfnCAg= +go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ= +go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1999,17 +626,10 @@ go.opentelemetry.io/contrib/bridges/prometheus v0.61.0 h1:RyrtJzu5MAmIcbRrwg75b+ go.opentelemetry.io/contrib/bridges/prometheus v0.61.0/go.mod h1:tirr4p9NXbzjlbruiRGp53IzlYrDk5CO2fdHj0sSSaY= go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 h1:XfzKtKSrbtYk9TNCF8dkO0Y9M7IOfb4idCwBOTwGBiI= go.opentelemetry.io/contrib/exporters/autoexport v0.61.0/go.mod h1:N6otC+qXTD5bAnbK2O1f/1SXq3cX+3KYSWrkBUqG0cw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8= @@ -2036,36 +656,24 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 h1:G8Xec/SgZQricwW go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY= go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0= go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.podman.io/common v0.65.0 h1:8JNl25U4VpKDkFHSymSPm4te7ZQHJbfAB/l2FqtmYEg= go.podman.io/common v0.65.0/go.mod h1:+lJu8KHeoDQsD9HDdiFaMaOUiqPLQnK406WuLnqM7Z0= -go.podman.io/image/v5 v5.37.0 h1:yzgQybwuWIIeK63hu+mQqna/wOh96XD5cpVc6j8Dg5M= -go.podman.io/image/v5 v5.37.0/go.mod h1:+s2Sx5dia/jVeT8tI3r2NAPrARMiDdbEq3QPIQogx3I= -go.podman.io/storage v1.60.0 h1:bWNSrR58nxg39VNFDSx3m0AswbvyzPGOo5XsUfomTao= -go.podman.io/storage v1.60.0/go.mod h1:NK+rsWJVuQeCM7ifv7cxD3abegWxwtW/3OkuSUJJoE4= +go.podman.io/image/v5 v5.38.0 h1:aUKrCANkPvze1bnhLJsaubcfz0d9v/bSDLnwsXJm6G4= +go.podman.io/image/v5 v5.38.0/go.mod h1:hSIoIUzgBnmc4DjoIdzk63aloqVbD7QXDMkSE/cvG90= +go.podman.io/storage v1.61.0 h1:5hD/oyRYt1f1gxgvect+8syZBQhGhV28dCw2+CZpx0Q= +go.podman.io/storage v1.61.0/go.mod h1:A3UBK0XypjNZ6pghRhuxg62+2NIm5lcUGv/7XyMhMUI= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -2074,67 +682,36 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +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= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -2145,7 +722,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -2157,20 +733,12 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2181,6 +749,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2191,6 +760,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -2199,46 +769,16 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2249,31 +789,11 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2284,18 +804,11 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2304,11 +817,13 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2319,6 +834,7 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2328,84 +844,25 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2415,30 +872,16 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= -golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -2451,7 +894,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2472,6 +914,8 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -2481,31 +925,16 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -2514,22 +943,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2551,62 +968,14 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= -google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= -google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= -google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= -google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= -google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= -google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= -google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2629,7 +998,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -2637,203 +1005,42 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= -google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= -google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= -google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= -google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= -google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= -google.golang.org/genproto/googleapis/api v0.0.0-20240122161410-6c6643bf1457/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I= -google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:SCz6T5xjNXM4QFPRwxHcfChp7V+9DcXR3ay2TkHR8Tg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240122161410-6c6643bf1457/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2847,38 +1054,39 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/src-d/go-billy.v4 v4.3.0/go.mod h1:tm33zBoOwxjYHZIE+OV8bxTWFMJLrconzFMd38aARFk= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2888,114 +1096,66 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/code-generator v0.33.4 h1:DiA801QxqApRIBh3OWULasVAUA237XnYvFNMh+E34Y8= -k8s.io/code-generator v0.33.4/go.mod h1:ifWxKWhEl/Z1K7WmWAyOBEf3ex/i546ingCzLC8YVIY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= -k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= +k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc= +k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q= +k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.33.4 h1:rvsVglcIFa9WeKk5vd3mBufSG4D5dqponz1Jz5d6FXU= -k8s.io/kms v0.33.4/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E= -k8s.io/kube-aggregator v0.33.4 h1:TdIJKHb0/bLpby7FblXIaVEzyA1jGEjzt/n9cRvwq8U= -k8s.io/kube-aggregator v0.33.4/go.mod h1:wZuctdRvGde5bwzxkZRs0GYj2KOpCNgx8rRGVoNb62k= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kms v0.34.1 h1:iCFOvewDPzWM9fMTfyIPO+4MeuZ0tcZbugxLNSHFG4w= +k8s.io/kms v0.34.1/go.mod h1:s1CFkLG7w9eaTYvctOxosx88fl4spqmixnNpys0JAtM= +k8s.io/kube-aggregator v0.34.1 h1:WNLV0dVNoFKmuyvdWLd92iDSyD/TSTjqwaPj0U9XAEU= +k8s.io/kube-aggregator v0.34.1/go.mod h1:RU8j+5ERfp0h+gIvWtxRPfsa5nK7rboDm8RST8BJfYQ= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= -modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= -modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= -modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= -modernc.org/libc v1.21.2/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= -modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= -modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= -modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE= -sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U= +sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y= +sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= +sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk= +sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/staging/operator-lifecycle-manager/hack/overlays/goimports_vendorlesspath.go b/staging/operator-lifecycle-manager/hack/overlays/goimports_vendorlesspath.go new file mode 100644 index 0000000000..4d1ab99221 --- /dev/null +++ b/staging/operator-lifecycle-manager/hack/overlays/goimports_vendorlesspath.go @@ -0,0 +1,14 @@ +package imports + +import "strings" + +// VendorlessPath returns ipath with any vendor prefixes trimmed. +func VendorlessPath(ipath string) string { + if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 { + return ipath[i+len("/vendor/"):] + } + if strings.HasPrefix(ipath, "vendor/") { + return ipath[len("vendor/"):] + } + return ipath +} diff --git a/staging/operator-lifecycle-manager/hack/scripts/run-counterfeiter.sh b/staging/operator-lifecycle-manager/hack/scripts/run-counterfeiter.sh new file mode 100755 index 0000000000..cd2e320189 --- /dev/null +++ b/staging/operator-lifecycle-manager/hack/scripts/run-counterfeiter.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -euo pipefail + +if [[ $# -lt 3 ]]; then + echo "usage: $0 " >&2 + exit 2 +fi + +out="$1" +pkg_path="$2" +type_name="$3" + +# Resolve the fully-qualified package path even when invoked from GOPATH layouts. +module_pkg=$(GO111MODULE="${GO111MODULE:-on}" GOWORK="${GOWORK:-off}" GOFLAGS="${GOFLAGS:-}" go list "$pkg_path") + +GO111MODULE="${GO111MODULE:-on}" GOWORK="${GOWORK:-off}" GOFLAGS="${GOFLAGS:-}" \ + go run github.com/maxbrunsfeld/counterfeiter/v6 -o "$out" "${module_pkg}.${type_name}" diff --git a/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go b/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go index 1b09f2edb4..cb46e97ba3 100644 --- a/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go +++ b/staging/operator-lifecycle-manager/pkg/api/wrappers/deployment_install_client_test.go @@ -441,7 +441,7 @@ func TestEnsureServiceAccount(t *testing.T) { require.True(t, equality.Semantic.DeepEqual(tt.expect.returnedServiceAccount, sa), "Resources do not match : %s", - diff.ObjectDiff(tt.expect.returnedServiceAccount, sa)) + diff.Diff(tt.expect.returnedServiceAccount, sa)) require.EqualValues(t, tt.expect.returnedError, errors.Cause(err)) diff --git a/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go b/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go index b24538859d..2a928f9841 100644 --- a/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go +++ b/staging/operator-lifecycle-manager/pkg/api/wrappers/wrappersfakes/fake_install_strategy_deployment_interface.go @@ -8,7 +8,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" - v1 "k8s.io/api/apps/v1" + "k8s.io/api/apps/v1" v1b "k8s.io/api/core/v1" v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index c26c3da927..24336fbd95 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -1654,12 +1654,6 @@ func (o *Operator) ensureInstallPlan(logger *logrus.Entry, namespace string, gen return nil, nil } - // Check if any existing installplans are creating the same resources - installPlans, err := o.listInstallPlans(namespace) - if err != nil { - return nil, err - } - // There are multiple(2) worker threads process the namespaceQueue. // Both worker can work at the same time when 2 separate updates are made for the namespace. // The following sequence causes 2 installplans are created for a subscription @@ -1680,6 +1674,13 @@ func (o *Operator) ensureInstallPlan(logger *logrus.Entry, namespace string, gen o.muInstallPlan.Lock() defer o.muInstallPlan.Unlock() + // Check if any existing installplans are creating the same resources + // This must be done inside the lock to prevent TOCTOU race condition + installPlans, err := o.listInstallPlans(namespace) + if err != nil { + return nil, err + } + for _, installPlan := range installPlans { if installPlan.Spec.Generation == gen { return reference.GetReference(installPlan) diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go index 00a6e48d9a..694a87ae94 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go @@ -9,6 +9,7 @@ import ( "os" "reflect" "strings" + "sync" "testing" "testing/quick" "time" @@ -2559,3 +2560,107 @@ func hasExpectedCondition(ip *v1alpha1.InstallPlan, expectedCondition v1alpha1.I } return false } + +// TestEnsureInstallPlanConcurrency tests that concurrent calls to ensureInstallPlan +// do not create duplicate InstallPlans for the same subscription. +// This test verifies the fix for a TOCTOU race condition where multiple worker threads +// could create duplicate InstallPlans if they both check for existing plans before either +// has created one. +func TestEnsureInstallPlanConcurrency(t *testing.T) { + namespace := "test-ns" + gen := 1 + numGoroutines := 10 + + ctx, cancel := context.WithCancel(context.TODO()) + defer cancel() + + // Create a fake operator + op, err := NewFakeOperator(ctx, namespace, []string{namespace}) + require.NoError(t, err) + + // Create a test subscription + sub := &v1alpha1.Subscription{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-sub", + Namespace: namespace, + UID: types.UID("test-uid"), + }, + Spec: &v1alpha1.SubscriptionSpec{ + Package: "test-package", + }, + } + + // Create test steps for the InstallPlan + steps := []*v1alpha1.Step{ + { + Resolving: "test-csv", + Resource: v1alpha1.StepResource{ + CatalogSource: "test-catalog", + CatalogSourceNamespace: namespace, + Group: "operators.coreos.com", + Version: "v1alpha1", + Kind: "ClusterServiceVersion", + Name: "test-csv", + Manifest: toManifest(t, csv("test-csv", namespace, nil, nil)), + }, + Status: v1alpha1.StepStatusUnknown, + }, + } + + // Use WaitGroup to synchronize goroutines + var wg sync.WaitGroup + // Use a channel to collect results + results := make(chan *corev1.ObjectReference, numGoroutines) + // Use a sync.Once-like mechanism to start all goroutines at roughly the same time + startBarrier := make(chan struct{}) + + logger := logrus.NewEntry(logrus.New()) + + // Launch multiple goroutines that will call ensureInstallPlan concurrently + for i := 0; i < numGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + // Wait for the start signal + <-startBarrier + + // Call ensureInstallPlan + ref, err := op.ensureInstallPlan(logger, namespace, gen, []*v1alpha1.Subscription{sub}, v1alpha1.ApprovalAutomatic, steps, nil) + require.NoError(t, err) + results <- ref + }() + } + + // Start all goroutines + close(startBarrier) + + // Wait for all goroutines to complete + wg.Wait() + close(results) + + // Collect all results + var refs []*corev1.ObjectReference + for ref := range results { + refs = append(refs, ref) + } + + // Verify we got the expected number of results + require.Len(t, refs, numGoroutines, "should have received results from all goroutines") + + // Verify all refs point to the same InstallPlan + firstRef := refs[0] + for i, ref := range refs { + require.Equal(t, firstRef.Name, ref.Name, "goroutine %d returned different InstallPlan name", i) + require.Equal(t, firstRef.Namespace, ref.Namespace, "goroutine %d returned different InstallPlan namespace", i) + require.Equal(t, firstRef.UID, ref.UID, "goroutine %d returned different InstallPlan UID", i) + } + + // Verify only one InstallPlan was created in the cluster + ipList, err := op.client.OperatorsV1alpha1().InstallPlans(namespace).List(ctx, metav1.ListOptions{}) + require.NoError(t, err) + require.Len(t, ipList.Items, 1, "exactly one InstallPlan should have been created") + + // Verify the created InstallPlan has the correct generation + createdIP := &ipList.Items[0] + require.Equal(t, gen, createdIP.Spec.Generation, "InstallPlan should have the correct generation") +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go index fbaa32492a..f934194cb4 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go @@ -414,7 +414,7 @@ func deployment(deploymentName, namespace, serviceAccountName string, templateAn Containers: []corev1.Container{ { Name: deploymentName + "-c1", - Image: "nginx:1.7.9", + Image: "docker.io/nginx:1.7.9", Ports: []corev1.ContainerPort{ { ContainerPort: 80, @@ -681,7 +681,7 @@ func installStrategy(deploymentName string, permissions []v1alpha1.StrategyDeplo Containers: []corev1.Container{ { Name: deploymentName + "-c1", - Image: "nginx:1.7.9", + Image: "docker.io/nginx:1.7.9", Ports: []corev1.ContainerPort{ { ContainerPort: 80, @@ -5853,6 +5853,12 @@ func RequireObjectsInCache(t *testing.T, lister operatorlister.OperatorLister, n fetched, err = lister.RbacV1().RoleBindingLister().RoleBindings(namespace).Get(o.GetName()) case *v1alpha1.ClusterServiceVersion: fetched, err = lister.OperatorsV1alpha1().ClusterServiceVersionLister().ClusterServiceVersions(namespace).Get(o.GetName()) + if err != nil { + if apierrors.IsNotFound(err) { + return err + } + return errors.Join(err, fmt.Errorf("namespace: %v, error: %v", namespace, err)) + } // We don't care about finalizers object.(*v1alpha1.ClusterServiceVersion).Finalizers = nil fetched.(*v1alpha1.ClusterServiceVersion).Finalizers = nil diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/operatorconditiongenerator_controller_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/operatorconditiongenerator_controller_test.go index eb11813e4d..730f3a357c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/operatorconditiongenerator_controller_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/operatorconditiongenerator_controller_test.go @@ -260,7 +260,7 @@ func newNginxInstallStrategy(name string, permissions []operatorsv1alpha1.Strate Spec: corev1.PodSpec{Containers: []corev1.Container{ { Name: genName("nginx"), - Image: "bitnami/nginx:latest", + Image: "docker.io/bitnami/nginx:latest", Ports: []corev1.ContainerPort{{ContainerPort: 80}}, ImagePullPolicy: corev1.PullIfNotPresent, }, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go b/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go index 4fdf56e26b..c7aea05f44 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go @@ -163,7 +163,7 @@ func grpcConnection(address string) (*grpc.ClientConn, error) { })) } - return grpc.Dial(address, dialOptions...) + return grpc.NewClient(address, dialOptions...) } func (s *SourceStore) Add(key registry.CatalogKey, address string) (*SourceConn, error) { @@ -203,6 +203,11 @@ func (s *SourceStore) stateTimeout(state connectivity.State) time.Duration { func (s *SourceStore) watch(ctx context.Context, key registry.CatalogKey, source SourceConn) { state := source.ConnectionState + + // Make initial connection + source.Conn.Connect() + + // Periodically observe connection state change for { select { case <-ctx.Done(): diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go index 601eaaad22..4eb40925e4 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go @@ -1259,7 +1259,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", }, }, expectedTolerations: nil, @@ -1275,7 +1275,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ NodeSelector: overriddenNodeSelectors, }, @@ -1294,7 +1294,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ PriorityClassName: &overriddenPriorityClassName, }, @@ -1313,7 +1313,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ PriorityClassName: nil, }, @@ -1332,7 +1332,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ Tolerations: overriddenTolerations, }, @@ -1351,7 +1351,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ Affinity: overriddenAffinity, }, @@ -1370,7 +1370,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ NodeSelector: overriddenNodeSelectors, PriorityClassName: &overriddenPriorityClassName, @@ -1392,7 +1392,7 @@ func TestPodSchedulingOverrides(t *testing.T) { }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ PriorityClassName: &overriddenPriorityClassName, }, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go index 01cc473d5e..b088106520 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go @@ -45,7 +45,7 @@ func csv(name, replaces string, ownedCRDs, requiredCRDs, ownedAPIServices, requi Containers: []corev1.Container{ { Name: name + "-c1", - Image: "nginx:1.7.9", + Image: "docker.io/nginx:1.7.9", Ports: []corev1.ContainerPort{ { ContainerPort: 80, diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go index 77fcc2d59c..c7bb8fe4f0 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeClusterRoleBindingLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go index 82eed6967a..67f9b8f8dd 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go index e3432c88fb..ff67a136c1 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_role_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go index 7caeab6ca5..b2de0d603d 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleBindingLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go index fdda3a76cf..d95d9b411c 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRoleBindingNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go index c07aa9f450..491fb0c77c 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeSecretLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go index b4c70b1f95..217d168cf6 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_secret_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeSecretNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go index 9c417b127e..904a6f528f 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceAccountLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go index b6cd697361..447f7a6f0d 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_account_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceAccountNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go index 3a3a7dfd22..f5646edb91 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go index 02e7c77ac5..34199c47e5 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/client-go/listers/fake_v1_service_namespace_lister.go @@ -6,7 +6,7 @@ import ( v1a "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeServiceNamespaceLister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go index 296cbc6558..1d542d2859 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go +++ b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa_test.go @@ -78,10 +78,6 @@ func TestServerSideApply(t *testing.T) { return nil }, want: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ Name: "testpod", Namespace: "testns", @@ -106,10 +102,6 @@ func TestServerSideApply(t *testing.T) { return nil }, want: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ Name: "testpod", Namespace: "testns", @@ -137,10 +129,6 @@ func TestServerSideApply(t *testing.T) { return unstructured.SetNestedField(u.Object, "new", "status", "message") }, want: &corev1.Pod{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, ObjectMeta: metav1.ObjectMeta{ Name: "testpod", Namespace: "testns", diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go index a6b94264f7..67cb40108c 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go @@ -25,8 +25,8 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go k8s.io/client-go/listers/rbac/v1.RoleBindingNamespaceLister //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go k8s.io/client-go/listers/rbac/v1.ClusterRoleBindingLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionNamespaceLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionNamespaceLister // OperatorLister is a union of versioned informer listers // diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go index cc6ed0d2fe..003dce5780 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apiregistration_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1" + "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1" ) type FakeAPIRegistrationV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go index 53e64161c1..f2a0e9f19c 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_apps_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/client-go/listers/apps/v1" + "k8s.io/client-go/listers/apps/v1" ) type FakeAppsV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go index 99e222e063..d7774d2e01 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_core_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/listers/core/v1" ) type FakeCoreV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go index 6a578b93dd..10b70b77ca 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/operatorlisterfakes/fake_rbac_v1lister.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" - v1 "k8s.io/client-go/listers/rbac/v1" + "k8s.io/client-go/listers/rbac/v1" ) type FakeRbacV1Lister struct { diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go b/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go index bb0b092d85..6b7fcab02e 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go +++ b/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go @@ -214,7 +214,7 @@ func MonitorClusterStatus(name string, syncCh <-chan error, stopCh <-chan struct log.Errorf("Failed to get related objects: %v", err) } if !reflect.DeepEqual(previousStatus.RelatedObjects, existing.Status.RelatedObjects) { - diffString := diff.ObjectDiff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) + diffString := diff.Diff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) log.Debugf("Update required for related objects: %v", diffString) } diff --git a/staging/operator-lifecycle-manager/pkg/lib/server/server.go b/staging/operator-lifecycle-manager/pkg/lib/server/server.go index 3d79a192e0..3fab132997 100644 --- a/staging/operator-lifecycle-manager/pkg/lib/server/server.go +++ b/staging/operator-lifecycle-manager/pkg/lib/server/server.go @@ -11,6 +11,9 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/profile" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/metrics/filters" ) // Option applies a configuration option to the given config. @@ -43,11 +46,18 @@ func WithDebug(debug bool) Option { } } +func WithKubeConfig(config *rest.Config) Option { + return func(sc *serverConfig) { + sc.kubeConfig = config + } +} + type serverConfig struct { logger *logrus.Logger tlsCertPath *string tlsKeyPath *string clientCAPath *string + kubeConfig *rest.Config debug bool } @@ -62,6 +72,7 @@ func defaultServerConfig() serverConfig { tlsCertPath: nil, tlsKeyPath: nil, clientCAPath: nil, + kubeConfig: nil, logger: nil, debug: false, } @@ -90,12 +101,53 @@ func (sc serverConfig) getListenAndServeFunc() (func() error, error) { } mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) profile.RegisterHandlers(mux, profile.WithTLS(tlsEnabled || !sc.debug)) + // Set up authenticated metrics endpoint if kubeConfig is provided + if sc.kubeConfig != nil && tlsEnabled { + sc.logger.Info("Setting up authenticated metrics endpoint") + // Create HTTP client with proper TLS configuration from kubeConfig + // This is necessary for TokenReview/SubjectAccessReview API calls to verify API server certificates + httpClient, err := rest.HTTPClientFor(sc.kubeConfig) + if err != nil { + return nil, fmt.Errorf("failed to create http client for authentication: %w", err) + } + // Create authentication filter using controller-runtime + filter, err := filters.WithAuthenticationAndAuthorization(sc.kubeConfig, httpClient) + if err != nil { + return nil, fmt.Errorf("failed to create authentication filter: %w", err) + } + // Create authenticated metrics handler + logger := log.FromContext(context.Background()) + authenticatedMetricsHandler, err := filter(logger, promhttp.Handler()) + if err != nil { + return nil, fmt.Errorf("failed to wrap metrics handler with authentication: %w", err) + } + // Add request logging for debugging if debug mode is enabled + if sc.debug { + debugAuthHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + sc.logger.Infof("Metrics request from %s, Auth header present: %v, User-Agent: %s", + r.RemoteAddr, r.Header.Get("Authorization") != "", r.Header.Get("User-Agent")) + authenticatedMetricsHandler.ServeHTTP(w, r) + }) + mux.Handle("/metrics", debugAuthHandler) + } else { + mux.Handle("/metrics", authenticatedMetricsHandler) + } + sc.logger.Info("Metrics endpoint configured with authentication and authorization") + } else { + // Fallback to unprotected metrics (for development/testing) + mux.Handle("/metrics", promhttp.Handler()) + if sc.kubeConfig == nil { + sc.logger.Warn("No Kubernetes config provided - metrics endpoint will be unprotected") + } else if !tlsEnabled { + sc.logger.Warn("TLS not enabled - metrics endpoint will be unprotected") + } + } + s := http.Server{ Handler: mux, Addr: sc.getAddress(tlsEnabled), @@ -141,6 +193,7 @@ func (sc serverConfig) getListenAndServeFunc() (func() error, error) { ClientAuth: tls.VerifyClientCertIfGiven, }, nil }, + NextProtos: []string{"http/1.1"}, // Disable HTTP/2 for security } return func() error { return s.ListenAndServeTLS("", "") diff --git a/staging/operator-lifecycle-manager/pkg/lib/server/server_test.go b/staging/operator-lifecycle-manager/pkg/lib/server/server_test.go new file mode 100644 index 0000000000..f94f63fadc --- /dev/null +++ b/staging/operator-lifecycle-manager/pkg/lib/server/server_test.go @@ -0,0 +1,455 @@ +package server + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "io" + "math/big" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "k8s.io/client-go/rest" +) + +// TestGetListenAndServeFunc_WithAuthenticatedMetrics tests that the server +// correctly creates an HTTP client with TLS configuration when kubeConfig is provided +func TestGetListenAndServeFunc_WithAuthenticatedMetrics(t *testing.T) { + // Generate test certificates dynamically + caCert, caKey, err := generateCA() + require.NoError(t, err) + + serverCert, serverKey, err := generateServerCert(caCert, caKey, "localhost") + require.NoError(t, err) + + // Create temporary directory for test certificates + tmpDir, err := os.MkdirTemp("", "server-test-*") + require.NoError(t, err) + defer os.RemoveAll(tmpDir) + + // Write dynamically generated certificates to files + tlsCertPath := filepath.Join(tmpDir, "tls.crt") + tlsKeyPath := filepath.Join(tmpDir, "tls.key") + clientCAPath := filepath.Join(tmpDir, "ca.crt") + + err = os.WriteFile(tlsCertPath, serverCert, 0644) + require.NoError(t, err) + err = os.WriteFile(tlsKeyPath, serverKey, 0600) // Private key should have restricted permissions + require.NoError(t, err) + err = os.WriteFile(clientCAPath, caCert, 0644) + require.NoError(t, err) + + // Create a test kubeConfig with CA data + kubeConfig := &rest.Config{ + Host: "https://test-api-server:6443", + TLSClientConfig: rest.TLSClientConfig{ + CAData: caCert, + }, + } + + logger := logrus.New() + logger.SetOutput(io.Discard) // Suppress logs during test + + // Test with authenticated metrics (kubeConfig + TLS enabled) + _, err = GetListenAndServeFunc( + WithLogger(logger), + WithTLS(&tlsCertPath, &tlsKeyPath, &clientCAPath), + WithKubeConfig(kubeConfig), + WithDebug(false), + ) + + // The function should succeed - if httpClient is properly configured, + // it won't fail during filter creation + assert.NoError(t, err, "GetListenAndServeFunc should succeed with proper TLS configuration") +} + +// TestGetListenAndServeFunc_WithoutKubeConfig tests that metrics endpoint +// falls back to unprotected mode when kubeConfig is not provided +func TestGetListenAndServeFunc_WithoutKubeConfig(t *testing.T) { + // Generate test certificates dynamically + caCert, caKey, err := generateCA() + require.NoError(t, err) + + serverCert, serverKey, err := generateServerCert(caCert, caKey, "localhost") + require.NoError(t, err) + + tmpDir, err := os.MkdirTemp("", "server-test-*") + require.NoError(t, err) + defer os.RemoveAll(tmpDir) + + tlsCertPath := filepath.Join(tmpDir, "tls.crt") + tlsKeyPath := filepath.Join(tmpDir, "tls.key") + clientCAPath := filepath.Join(tmpDir, "ca.crt") + + err = os.WriteFile(tlsCertPath, serverCert, 0644) + require.NoError(t, err) + err = os.WriteFile(tlsKeyPath, serverKey, 0600) + require.NoError(t, err) + err = os.WriteFile(clientCAPath, caCert, 0644) + require.NoError(t, err) + + logger := logrus.New() + logger.SetOutput(io.Discard) + + // Test without kubeConfig - should use unprotected metrics + _, err = GetListenAndServeFunc( + WithLogger(logger), + WithTLS(&tlsCertPath, &tlsKeyPath, &clientCAPath), + WithDebug(false), + ) + + assert.NoError(t, err, "GetListenAndServeFunc should succeed without kubeConfig") +} + +// TestHTTPClientHasTLSConfig verifies that rest.HTTPClientFor creates a client +// with proper TLS configuration including CA certificates +func TestHTTPClientHasTLSConfig(t *testing.T) { + // Generate test CA dynamically + caCert, _, err := generateCA() + require.NoError(t, err) + + kubeConfig := &rest.Config{ + Host: "https://test-api-server:6443", + TLSClientConfig: rest.TLSClientConfig{ + CAData: caCert, + }, + Timeout: 30 * time.Second, + } + + // Create HTTP client using rest.HTTPClientFor + httpClient, err := rest.HTTPClientFor(kubeConfig) + require.NoError(t, err, "HTTPClientFor should succeed") + require.NotNil(t, httpClient, "HTTP client should not be nil") + + // Verify that the client has a transport configured + require.NotNil(t, httpClient.Transport, "HTTP client transport should be configured") + + // Check if it's an http.Transport with TLS config + transport, ok := httpClient.Transport.(*http.Transport) + require.True(t, ok, "Transport should be *http.Transport") + require.NotNil(t, transport.TLSClientConfig, "TLS config should be set") + + // Verify that RootCAs is configured (this proves CA cert is loaded) + assert.NotNil(t, transport.TLSClientConfig.RootCAs, "RootCAs should be configured from kubeConfig") + + // Verify timeout is set + assert.Equal(t, 30*time.Second, httpClient.Timeout, "Timeout should match kubeConfig") +} + +// TestEmptyHTTPClientMissingTLSConfig demonstrates the bug: +// Creating an empty http.Client doesn't have TLS configuration +func TestEmptyHTTPClientMissingTLSConfig(t *testing.T) { + // This is the buggy code pattern from the original implementation + buggyClient := &http.Client{ + Timeout: 30 * time.Second, + } + + // The buggy client doesn't have a transport or TLS config + assert.Nil(t, buggyClient.Transport, "Empty http.Client has no transport (uses default)") + + // When used with NewForConfigAndClient, it would fail to verify API server certs + // because it doesn't have the CA certificates from the kubeConfig +} + +// TestMetricsEndpointAccessible tests that the metrics endpoint is accessible +// and properly configured (integration-style test) +func TestMetricsEndpointAccessible(t *testing.T) { + logger := logrus.New() + logger.SetOutput(io.Discard) + + // Test unprotected metrics endpoint (no kubeConfig, no TLS) + emptyStr := "" + listenAndServe, err := GetListenAndServeFunc( + WithLogger(logger), + WithTLS(&emptyStr, &emptyStr, &emptyStr), + WithDebug(false), + ) + require.NoError(t, err) + + // Start a test server + mux := http.NewServeMux() + mux.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + fmt.Fprintln(w, "# HELP test_metric Test metric") + }) + + server := httptest.NewServer(mux) + defer server.Close() + + // Test that metrics endpoint responds + resp, err := http.Get(server.URL + "/metrics") + require.NoError(t, err) + defer resp.Body.Close() + + assert.Equal(t, http.StatusOK, resp.StatusCode, "Metrics endpoint should return 200") + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Contains(t, string(body), "test_metric", "Response should contain metrics") + + // Verify listenAndServe function is not nil + assert.NotNil(t, listenAndServe, "listenAndServe function should be returned") +} + +// generateCA generates a test CA certificate and private key. +// Returns CA certificate PEM, CA private key, and error. +// This function generates certificates dynamically at test runtime to avoid +// hardcoding private keys in source code. +func generateCA() ([]byte, *rsa.PrivateKey, error) { + // Generate RSA private key for CA + caKey, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate CA key: %w", err) + } + + // Create CA certificate template + caTemplate := &x509.Certificate{ + SerialNumber: big.NewInt(1), + Subject: pkix.Name{ + CommonName: "Test CA", + }, + NotBefore: time.Now(), + NotAfter: time.Now().Add(24 * time.Hour), // Valid for 1 day + IsCA: true, + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageDigitalSignature, + BasicConstraintsValid: true, + } + + // Create self-signed CA certificate + caCertBytes, err := x509.CreateCertificate(rand.Reader, caTemplate, caTemplate, &caKey.PublicKey, caKey) + if err != nil { + return nil, nil, fmt.Errorf("failed to create CA certificate: %w", err) + } + + // Encode CA certificate to PEM + caCertPEM := pem.EncodeToMemory(&pem.Block{ + Type: "CERTIFICATE", + Bytes: caCertBytes, + }) + + return caCertPEM, caKey, nil +} + +// generateServerCert generates a server certificate signed by the given CA. +// Returns server certificate PEM, server private key PEM, and error. +func generateServerCert(caCertPEM []byte, caKey *rsa.PrivateKey, commonName string) ([]byte, []byte, error) { + // Parse CA certificate + block, _ := pem.Decode(caCertPEM) + if block == nil { + return nil, nil, fmt.Errorf("failed to parse CA certificate PEM") + } + caCert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, nil, fmt.Errorf("failed to parse CA certificate: %w", err) + } + + // Generate RSA private key for server + serverKey, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate server key: %w", err) + } + + // Create server certificate template + serverTemplate := &x509.Certificate{ + SerialNumber: big.NewInt(2), + Subject: pkix.Name{ + CommonName: commonName, + }, + NotBefore: time.Now(), + NotAfter: time.Now().Add(24 * time.Hour), // Valid for 1 day + KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + } + + // Create server certificate signed by CA + serverCertBytes, err := x509.CreateCertificate(rand.Reader, serverTemplate, caCert, &serverKey.PublicKey, caKey) + if err != nil { + return nil, nil, fmt.Errorf("failed to create server certificate: %w", err) + } + + // Encode server certificate to PEM + serverCertPEM := pem.EncodeToMemory(&pem.Block{ + Type: "CERTIFICATE", + Bytes: serverCertBytes, + }) + + // Encode server private key to PEM + serverKeyPEM := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: x509.MarshalPKCS1PrivateKey(serverKey), + }) + + return serverCertPEM, serverKeyPEM, nil +} + +// TestServerConfig_TLSEnabled tests the TLS detection logic +func TestServerConfig_TLSEnabled(t *testing.T) { + tests := []struct { + name string + certPath string + keyPath string + expectTLS bool + expectError bool + }{ + { + name: "both cert and key provided", + certPath: "/path/to/cert", + keyPath: "/path/to/key", + expectTLS: true, + expectError: false, + }, + { + name: "neither cert nor key provided", + certPath: "", + keyPath: "", + expectTLS: false, + expectError: false, + }, + { + name: "only cert provided", + certPath: "/path/to/cert", + keyPath: "", + expectTLS: false, + expectError: true, + }, + { + name: "only key provided", + certPath: "", + keyPath: "/path/to/key", + expectTLS: false, + expectError: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sc := &serverConfig{ + tlsCertPath: &tt.certPath, + tlsKeyPath: &tt.keyPath, + } + + enabled, err := sc.tlsEnabled() + + if tt.expectError { + assert.Error(t, err, "Expected error for mismatched cert/key") + } else { + assert.NoError(t, err, "Should not error") + assert.Equal(t, tt.expectTLS, enabled, "TLS enabled state should match") + } + }) + } +} + +// TestServerConfig_GetAddress tests address selection based on TLS +func TestServerConfig_GetAddress(t *testing.T) { + sc := &serverConfig{} + + httpsAddr := sc.getAddress(true) + assert.Equal(t, ":8443", httpsAddr, "HTTPS should use port 8443") + + httpAddr := sc.getAddress(false) + assert.Equal(t, ":8080", httpAddr, "HTTP should use port 8080") +} + +// TestWithOptions tests that configuration options are properly applied +func TestWithOptions(t *testing.T) { + logger := logrus.New() + tlsCert := "/path/to/cert" + tlsKey := "/path/to/key" + clientCA := "/path/to/ca" + kubeConfig := &rest.Config{Host: "https://test:6443"} + + sc := defaultServerConfig() + sc.apply([]Option{ + WithLogger(logger), + WithTLS(&tlsCert, &tlsKey, &clientCA), + WithKubeConfig(kubeConfig), + WithDebug(true), + }) + + assert.Equal(t, logger, sc.logger, "Logger should be set") + assert.Equal(t, &tlsCert, sc.tlsCertPath, "TLS cert path should be set") + assert.Equal(t, &tlsKey, sc.tlsKeyPath, "TLS key path should be set") + assert.Equal(t, &clientCA, sc.clientCAPath, "Client CA path should be set") + assert.Equal(t, kubeConfig, sc.kubeConfig, "KubeConfig should be set") + assert.True(t, sc.debug, "Debug should be enabled") +} + +// TestRootCAsConfiguration verifies that CA certificates are properly loaded +func TestRootCAsConfiguration(t *testing.T) { + // Generate test CA dynamically + caCertPEM, _, err := generateCA() + require.NoError(t, err) + + caCert := caCertPEM + + // Test that CA data can be parsed + certPool := x509.NewCertPool() + ok := certPool.AppendCertsFromPEM(caCert) + assert.True(t, ok, "CA certificate should be parseable") + + // Create rest.Config with CA data + config := &rest.Config{ + Host: "https://test-api:6443", + TLSClientConfig: rest.TLSClientConfig{ + CAData: caCert, + }, + } + + // Create HTTP client + client, err := rest.HTTPClientFor(config) + require.NoError(t, err) + + // Verify transport has TLS config + transport, ok := client.Transport.(*http.Transport) + require.True(t, ok) + require.NotNil(t, transport.TLSClientConfig) + + // The RootCAs should be configured + if transport.TLSClientConfig.RootCAs != nil { + // Success - RootCAs are configured + assert.NotNil(t, transport.TLSClientConfig.RootCAs) + } else { + // On some systems, if CAData is invalid, RootCAs might be nil + // but the important thing is no error was returned + t.Log("RootCAs is nil - this might be due to invalid test certificate") + } +} + +// TestHTTPClientTimeout verifies timeout configuration +func TestHTTPClientTimeout(t *testing.T) { + config := &rest.Config{ + Host: "https://test-api:6443", + Timeout: 45 * time.Second, + } + + client, err := rest.HTTPClientFor(config) + require.NoError(t, err) + + assert.Equal(t, 45*time.Second, client.Timeout, "Client timeout should match config") +} + +// BenchmarkHTTPClientCreation benchmarks the performance of creating HTTP clients +func BenchmarkHTTPClientCreation(b *testing.B) { + config := &rest.Config{ + Host: "https://test-api:6443", + TLSClientConfig: rest.TLSClientConfig{ + CAData: []byte("test-ca-data"), + }, + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _ = rest.HTTPClientFor(config) + } +} diff --git a/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go b/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go index 02b994ce95..ec38b314a5 100644 --- a/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go +++ b/staging/operator-lifecycle-manager/pkg/package-server/provider/registry_test.go @@ -2067,7 +2067,7 @@ func TestRegistryProviderListLabels(t *testing.T) { } func newTestRegistryClient(t *testing.T, catsrc *operatorsv1alpha1.CatalogSource) *registryClient { - conn, err := grpc.Dial(address+catsrc.Status.RegistryServiceStatus.Port, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(address+catsrc.Status.RegistryServiceStatus.Port, grpc.WithTransportCredentials(insecure.NewCredentials())) require.NoError(t, err, "could not set up test grpc connection") return newRegistryClient(catsrc, conn) } diff --git a/staging/operator-lifecycle-manager/test/e2e/catsrc_pod_config_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/catsrc_pod_config_e2e_test.go index 50930d5e64..1af18e465c 100644 --- a/staging/operator-lifecycle-manager/test/e2e/catsrc_pod_config_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/catsrc_pod_config_e2e_test.go @@ -55,7 +55,7 @@ var _ = Describe("CatalogSource Grpc Pod Config", Label("CatalogSourcePodConfig" }, Spec: v1alpha1.CatalogSourceSpec{ SourceType: v1alpha1.SourceTypeGrpc, - Image: "repo/image:tag", + Image: "docker.io/repo/image:tag", GrpcPodConfig: &v1alpha1.GrpcPodConfig{ SecurityContextConfig: v1alpha1.Restricted, }, diff --git a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go index 872707e436..dfb8b2c6b1 100644 --- a/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/csv_e2e_test.go @@ -1561,7 +1561,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csv.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) }) It("create with owned API service", func() { @@ -2557,7 +2557,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) }) It("update different deployment name", func() { @@ -2735,7 +2735,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old") depNew, err := c.GetDeployment(generatedNamespace.GetName(), strategyNew.DeploymentSpecs[0].Name) @@ -2924,7 +2924,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old") depNew, err := c.GetDeployment(generatedNamespace.GetName(), strategyNew.DeploymentSpecs[0].Name) @@ -3293,7 +3293,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err := fetchCSV(crc, generatedNamespace.GetName(), csvNew.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old one") depNew, err := c.GetDeployment(generatedNamespace.GetName(), strategyNew.DeploymentSpecs[0].Name) @@ -3372,7 +3372,7 @@ var _ = Describe("ClusterServiceVersion", Label("ClusterServiceVersion"), func() By("Fetch cluster service version again to check for unnecessary control loops") sameCSV, err = fetchCSV(crc, generatedNamespace.GetName(), csvNew2.Name, csvSucceededChecker) Expect(err).ShouldNot(HaveOccurred()) - Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.ObjectDiff(fetchedCSV, sameCSV)) + Expect(equality.Semantic.DeepEqual(fetchedCSV, sameCSV)).Should(BeTrue(), diff.Diff(fetchedCSV, sameCSV)) By("Should have created new deployment and deleted old one") depNew, err = c.GetDeployment(generatedNamespace.GetName(), strategyNew2.DeploymentSpecs[0].Name) diff --git a/staging/operator-lifecycle-manager/test/e2e/e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/e2e_test.go index 3e69bf1e96..00fb1f482c 100644 --- a/staging/operator-lifecycle-manager/test/e2e/e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/e2e_test.go @@ -46,7 +46,7 @@ var ( dummyImage = flag.String( "dummyImage", - "bitnami/nginx:latest", + "docker.io/bitnami/nginx:latest", "dummy image to treat as an operator in tests", ) diff --git a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go index 4fe1419fd6..09641dac67 100644 --- a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go @@ -770,8 +770,8 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { By(`Don't compare object meta as labels can be applied by the operator controller.`) - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Spec, fip.Spec)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Status, fip.Status)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Spec, fip.Spec)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan.Status, fip.Status)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) @@ -941,7 +941,7 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) @@ -2496,7 +2496,7 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) @@ -2696,7 +2696,7 @@ var _ = Describe("Install Plan", Label("InstallPlan"), func() { By(`Fetch installplan again to check for unnecessary control loops`) fetchedInstallPlan, err = fetchInstallPlan(GinkgoT(), crc, fetchedInstallPlan.GetName(), generatedNamespace.GetName(), func(fip *operatorsv1alpha1.InstallPlan) bool { - Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.ObjectDiff(fetchedInstallPlan, fip)) + Expect(equality.Semantic.DeepEqual(fetchedInstallPlan, fip)).Should(BeTrue(), diff.Diff(fetchedInstallPlan, fip)) return true }) require.NoError(GinkgoT(), err) diff --git a/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go index d5cb75523d..f793f830c2 100644 --- a/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go @@ -28,7 +28,11 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx" ) -var _ = Describe("Metrics are generated for OLM managed resources", Label("Metrics"), func() { +// With the new authentication mechanisms added to OLM components, metrics endpoints +// are now secured by default. Therefore, these tests are disabled until we can +// properly configure authentication for the OLM components in the e2e test suite. +// See: https://github.com/operator-framework/operator-lifecycle-manager/commit/589a5d0cc11ee76518173c9a21ce3f1adc15fa78 +var _ = XDescribe("Metrics are generated for OLM managed resources", Label("Metrics"), func() { var ( c operatorclient.ClientInterface crc versioned.Interface diff --git a/staging/operator-registry/.github/workflows/goreleaser.yaml b/staging/operator-registry/.github/workflows/goreleaser.yaml index 93c482aad8..b09a7010c8 100644 --- a/staging/operator-registry/.github/workflows/goreleaser.yaml +++ b/staging/operator-registry/.github/workflows/goreleaser.yaml @@ -61,7 +61,7 @@ jobs: run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ARGS: release --skip=validate --clean -f release/goreleaser.windows.yaml ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} + RELEASE_ARGS: release --verbose --skip=validate --clean -f release/goreleaser.windows.yaml ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} - run: tar -cvf dist-windows.tar dist - uses: actions/upload-artifact@v4 @@ -85,7 +85,7 @@ jobs: run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ARGS: release --rm-dist -f release/goreleaser.darwin.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} + RELEASE_ARGS: release --verbose --clean -f release/goreleaser.darwin.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} - run: gtar -cvf dist-darwin.tar dist - uses: actions/upload-artifact@v4 @@ -140,7 +140,7 @@ jobs: run: make release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE_ARGS: release --rm-dist -f release/goreleaser.linux.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} + RELEASE_ARGS: release --verbose --clean -f release/goreleaser.linux.yaml --skip=validate ${{ github.event_name == 'pull_request' && '--snapshot' || '' }} - run: tar -cvf dist-linux.tar dist - uses: actions/upload-artifact@v4 diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile index 8f4e906667..51fd6ebfde 100644 --- a/staging/operator-registry/Makefile +++ b/staging/operator-registry/Makefile @@ -9,6 +9,7 @@ export PKG := github.com/operator-framework/operator-registry export GIT_COMMIT := $(or $(SOURCE_GIT_COMMIT),$(shell git rev-parse --short HEAD)) export OPM_VERSION := $(or $(SOURCE_GIT_TAG),$(shell git describe --always --tags HEAD)) export BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') +export GRPC_HEALTH_PROBE_VERSION := $(shell $(GO) list -m github.com/grpc-ecosystem/grpc-health-probe | awk '{print $$2}') .DEFAULT_GOAL := all @@ -143,7 +144,7 @@ export LATEST_IMAGE_OR_EMPTY := $(shell \ && [ "$(shell echo -e "$(OPM_VERSION)\n$(LATEST_TAG)" | sort -rV | head -n1)" == "$(OPM_VERSION)" ] \ && echo "$(OPM_IMAGE_REPO):latest" || echo "") RELEASE_GOOS := $(shell go env GOOS) -RELEASE_ARGS ?= release --clean --snapshot -f release/goreleaser.$(RELEASE_GOOS).yaml +RELEASE_ARGS ?= release --verbose --clean --snapshot -f release/goreleaser.$(RELEASE_GOOS).yaml # Note: bingo does not yet support windows (https://github.com/bwplotka/bingo/issues/26) # so GOOS=windows gets its own way to install goreleaser diff --git a/staging/operator-registry/go.mod b/staging/operator-registry/go.mod index 67f8ba3f5d..4099cf546b 100644 --- a/staging/operator-registry/go.mod +++ b/staging/operator-registry/go.mod @@ -24,7 +24,7 @@ require ( github.com/onsi/gomega v1.38.2 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.1 - github.com/operator-framework/api v0.34.0 + github.com/operator-framework/api v0.35.0 github.com/otiai10/copy v1.14.1 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 @@ -45,14 +45,14 @@ require ( google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.33.4 - k8s.io/apiextensions-apiserver v0.33.4 - k8s.io/apimachinery v0.33.4 - k8s.io/client-go v0.33.4 + k8s.io/api v0.34.1 + k8s.io/apiextensions-apiserver v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 k8s.io/kubectl v0.33.2 oras.land/oras-go/v2 v2.6.0 - sigs.k8s.io/controller-runtime v0.21.0 - sigs.k8s.io/kind v0.29.0 + sigs.k8s.io/controller-runtime v0.22.1 + sigs.k8s.io/kind v0.30.0 sigs.k8s.io/yaml v1.6.0 ) @@ -95,7 +95,7 @@ require ( github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.2 // indirect @@ -109,8 +109,8 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/cel-go v0.26.0 // indirect - github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/cel-go v0.26.1 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-containerregistry v0.20.6 // indirect github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/google/uuid v1.6.0 // indirect @@ -142,7 +142,7 @@ require ( github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/opencontainers/runtime-spec v1.2.1 // indirect @@ -213,14 +213,14 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.33.4 // indirect + k8s.io/apiserver v0.34.1 // indirect k8s.io/cli-runtime v0.33.2 // indirect - k8s.io/component-base v0.33.4 // indirect + k8s.io/component-base v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) diff --git a/staging/operator-registry/go.sum b/staging/operator-registry/go.sum index 9164c21cb9..673766764a 100644 --- a/staging/operator-registry/go.sum +++ b/staging/operator-registry/go.sum @@ -118,8 +118,8 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= @@ -175,17 +175,16 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= -github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= +github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -296,8 +295,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -313,8 +313,8 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/operator-framework/api v0.34.0 h1:REiEaYhG1CWmDoajdcAdZqtgoljWG+ixMY59vUX5pFI= -github.com/operator-framework/api v0.34.0/go.mod h1:eGncUNIYvWtfGCCKmLzGXvoi3P0TDf3Yd/Z0Sn9E6SQ= +github.com/operator-framework/api v0.35.0 h1:xKrffuGEagk3CWy6zqdK5YmIErlBtWUblNNK+q7ld7c= +github.com/operator-framework/api v0.35.0/go.mod h1:A9UNu/pdcO1RauMHvV54unp4DNm/Y5fMVbGDpnIIF+M= github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= @@ -425,12 +425,12 @@ github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= -go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= -go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= -go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= -go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= -go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= -go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= +go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= +go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= +go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= +go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= @@ -687,24 +687,24 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= -k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= -k8s.io/apiextensions-apiserver v0.33.4 h1:rtq5SeXiDbXmSwxsF0MLe2Mtv3SwprA6wp+5qh/CrOU= -k8s.io/apiextensions-apiserver v0.33.4/go.mod h1:mWXcZQkQV1GQyxeIjYApuqsn/081hhXPZwZ2URuJeSs= -k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= -k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.33.4 h1:6N0TEVA6kASUS3owYDIFJjUH6lgN8ogQmzZvaFFj1/Y= -k8s.io/apiserver v0.33.4/go.mod h1:8ODgXMnOoSPLMUg1aAzMFx+7wTJM+URil+INjbTZCok= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA= +k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0= k8s.io/cli-runtime v0.33.2 h1:koNYQKSDdq5AExa/RDudXMhhtFasEg48KLS2KSAU74Y= k8s.io/cli-runtime v0.33.2/go.mod h1:gnhsAWpovqf1Zj5YRRBBU7PFsRc6NkEkwYNQE+mXL88= -k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= -k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= -k8s.io/component-base v0.33.4 h1:Jvb/aw/tl3pfgnJ0E0qPuYLT0NwdYs1VXXYQmSuxJGY= -k8s.io/component-base v0.33.4/go.mod h1:567TeSdixWW2Xb1yYUQ7qk5Docp2kNznKL87eygY8Rc= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a h1:ZV3Zr+/7s7aVbjNGICQt+ppKWsF1tehxggNfbM7XnG8= -k8s.io/kube-openapi v0.0.0-20250610211856-8b98d1ed966a/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/kubectl v0.33.2 h1:7XKZ6DYCklu5MZQzJe+CkCjoGZwD1wWl7t/FxzhMz7Y= k8s.io/kubectl v0.33.2/go.mod h1:8rC67FB8tVTYraovAGNi/idWIK90z2CHFNMmGJZJ3KI= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= @@ -713,17 +713,15 @@ oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0 h1:qPrZsv1cwQiFeieFlRqT627fVZ+tyfou/+S5S0H5ua0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.33.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= +sigs.k8s.io/controller-runtime v0.22.1 h1:Ah1T7I+0A7ize291nJZdS1CabF/lB4E++WizgV24Eqg= +sigs.k8s.io/controller-runtime v0.22.1/go.mod h1:FwiwRjkRPbiN+zp2QRp7wlTCzbUXxZ/D4OzuQUDwBHY= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/kind v0.29.0 h1:3TpCsyh908IkXXpcSnsMjWdwdWjIl7o9IMZImZCWFnI= -sigs.k8s.io/kind v0.29.0/go.mod h1:ldWQisw2NYyM6k64o/tkZng/1qQW7OlzcN5a8geJX3o= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/kind v0.30.0 h1:2Xi1KFEfSMm0XDcvKnUt15ZfgRPCT0OnCBbpgh8DztY= +sigs.k8s.io/kind v0.30.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/staging/operator-registry/pkg/lib/bundle/supported_resources.go b/staging/operator-registry/pkg/lib/bundle/supported_resources.go index 3569367ef2..ee2afeb419 100644 --- a/staging/operator-registry/pkg/lib/bundle/supported_resources.go +++ b/staging/operator-registry/pkg/lib/bundle/supported_resources.go @@ -22,6 +22,7 @@ const ( ConsoleLinkKind = "ConsoleLink" ConsolePlugin = "ConsolePlugin" NetworkPolicyKind = "NetworkPolicy" + PodMonitorKind = "PodMonitor" ) // Namespaced indicates whether the resource is namespace scoped (true) or cluster-scoped (false). @@ -51,6 +52,7 @@ var supportedResources = map[string]Namespaced{ ConsoleLinkKind: false, ConsolePlugin: false, NetworkPolicyKind: true, + PodMonitorKind: true, } // IsSupported checks if the object kind is OLM-supported and if it is namespaced diff --git a/staging/operator-registry/pkg/sqlite/configmap_test.go b/staging/operator-registry/pkg/sqlite/configmap_test.go index a09f22f4d4..b6c3485382 100644 --- a/staging/operator-registry/pkg/sqlite/configmap_test.go +++ b/staging/operator-registry/pkg/sqlite/configmap_test.go @@ -171,12 +171,12 @@ func TestQuerierForConfigmap(t *testing.T) { }, Version: "0.9.2", SkipRange: "< 0.6.0", - CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"creationTimestamp\":null,\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", + CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", Object: []string{ - "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"creationTimestamp\":null,\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", - "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", - "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", - "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}"}, + "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"version\":\"0.9.2\"}}", + "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", + "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}", + "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\",\"versions\":[{\"name\":\"v1beta2\",\"served\":true,\"storage\":true}]},\"status\":{\"acceptedNames\":{\"kind\":\"\",\"plural\":\"\"},\"conditions\":null,\"storedVersions\":null}}"}, } bareGetBundleForChannelResult := &api.Bundle{ CsvName: expectedBundle.CsvName, diff --git a/staging/operator-registry/release/goreleaser.linux.yaml b/staging/operator-registry/release/goreleaser.linux.yaml index 2822d1d302..2d74ea71d3 100644 --- a/staging/operator-registry/release/goreleaser.linux.yaml +++ b/staging/operator-registry/release/goreleaser.linux.yaml @@ -87,6 +87,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/amd64 + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} - image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" ids: ["linux-arm64"] @@ -97,6 +98,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/arm64 + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} - image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" ids: ["linux-ppc64le"] @@ -107,6 +109,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/ppc64le + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} - image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" ids: ["linux-s390x"] @@ -117,6 +120,7 @@ dockers: use: buildx build_flag_templates: - --platform=linux/s390x + - --build-arg=GRPC_HEALTH_PROBE_VERSION={{ .Env.GRPC_HEALTH_PROBE_VERSION }} docker_manifests: # IMAGE_TAG is either set by the Makefile or the goreleaser action workflow, # This image is intended to be tagged/pushed on all trunk (master, release branch) commits and tags. diff --git a/staging/operator-registry/release/goreleaser.opm.Dockerfile b/staging/operator-registry/release/goreleaser.opm.Dockerfile index 96c70d6d24..5c668c9b41 100644 --- a/staging/operator-registry/release/goreleaser.opm.Dockerfile +++ b/staging/operator-registry/release/goreleaser.opm.Dockerfile @@ -1,8 +1,13 @@ # NOTE: This Dockerfile is used in conjuction with GoReleaser to # build opm images. See the configurations in .goreleaser.yaml # and .github/workflows/release.yaml. +# +# The GRPC_HEALTH_PROBE_VERSION is automatically passed as a build arg +# by GoReleaser from the GRPC_HEALTH_PROBE_VERSION environment variable, +# which is set in the Makefile from go.mod. -FROM ghcr.io/grpc-ecosystem/grpc-health-probe:v0.4.37 AS grpc_health_probe +ARG GRPC_HEALTH_PROBE_VERSION +FROM ghcr.io/grpc-ecosystem/grpc-health-probe:${GRPC_HEALTH_PROBE_VERSION} AS grpc_health_probe FROM gcr.io/distroless/static:debug COPY --from=grpc_health_probe /ko-app/grpc-health-probe /bin/grpc_health_probe COPY ["nsswitch.conf", "/etc/nsswitch.conf"] diff --git a/values.yaml b/values.yaml index 759946fa7b..23cd802875 100644 --- a/values.yaml +++ b/values.yaml @@ -101,6 +101,18 @@ package: requests: cpu: 10m memory: 50Mi +# Disable cert-manager in favor of OpenShift service-ca +certManager: + enabled: false + +# Enable OpenShift service-ca for automatic certificate management +serviceCa: + enabled: true + olmOperator: + secretName: olm-operator-serving-cert + catalogOperator: + secretName: catalog-operator-serving-cert + monitoring: enabled: true namespace: openshift-monitoring diff --git a/vendor/github.com/docker/cli/cli/config/memorystore/store.go b/vendor/github.com/docker/cli/cli/config/memorystore/store.go index 199083464e..267e1e3437 100644 --- a/vendor/github.com/docker/cli/cli/config/memorystore/store.go +++ b/vendor/github.com/docker/cli/cli/config/memorystore/store.go @@ -3,7 +3,6 @@ package memorystore import ( - "errors" "fmt" "maps" "os" @@ -13,12 +12,17 @@ import ( "github.com/docker/cli/cli/config/types" ) -var errValueNotFound = errors.New("value not found") +// notFoundErr is the error returned when a plugin could not be found. +type notFoundErr string -func IsErrValueNotFound(err error) bool { - return errors.Is(err, errValueNotFound) +func (notFoundErr) NotFound() {} + +func (e notFoundErr) Error() string { + return string(e) } +var errValueNotFound notFoundErr = "value not found" + type Config struct { lock sync.RWMutex memoryCredentials map[string]types.AuthConfig diff --git a/vendor/github.com/fxamacker/cbor/v2/README.md b/vendor/github.com/fxamacker/cbor/v2/README.md index da9f9e6f09..d072b81c73 100644 --- a/vendor/github.com/fxamacker/cbor/v2/README.md +++ b/vendor/github.com/fxamacker/cbor/v2/README.md @@ -4,7 +4,7 @@ CBOR is a [trusted alternative](https://www.rfc-editor.org/rfc/rfc8949.html#name-comparison-of-other-binary-) to JSON, MessagePack, Protocol Buffers, etc.  CBOR is an Internet Standard defined by [IETF STD 94 (RFC 8949)](https://www.rfc-editor.org/info/std94) and is designed to be relevant for decades. -`fxamacker/cbor` is used in projects by Arm Ltd., Cisco, EdgeX Foundry, Flow Foundation, Fraunhofer‑AISEC, Kubernetes, Let's Encrypt (ISRG), Linux Foundation, Microsoft, Mozilla, Oasis Protocol, Tailscale, Teleport, [etc](https://github.com/fxamacker/cbor#who-uses-fxamackercbor). +`fxamacker/cbor` is used in projects by Arm Ltd., EdgeX Foundry, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes[*](https://github.com/search?q=org%3Akubernetes%20fxamacker%2Fcbor&type=code), Let's Encrypt, Linux Foundation, Microsoft, Oasis Protocol, Red Hat[*](https://github.com/search?q=org%3Aopenshift+fxamacker%2Fcbor&type=code), Tailscale[*](https://github.com/search?q=org%3Atailscale+fxamacker%2Fcbor&type=code), Veraison[*](https://github.com/search?q=org%3Averaison+fxamacker%2Fcbor&type=code), [etc](https://github.com/fxamacker/cbor#who-uses-fxamackercbor). See [Quick Start](#quick-start) and [Releases](https://github.com/fxamacker/cbor/releases/). 🆕 `UnmarshalFirst` and `DiagnoseFirst` can decode CBOR Sequences. `MarshalToBuffer` and `UserBufferEncMode` accepts user-specified buffer. @@ -39,7 +39,7 @@ Codec passed multiple confidential security assessments in 2022. No vulnerabili __🗜️  Data Size__ -Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) automatically reduce size of encoded structs. Encoding optionally shrinks float64→32→16 when values fit. +Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) and field tag "-" automatically reduce size of encoded structs. Encoding optionally shrinks float64→32→16 when values fit. __:jigsaw:  Usability__ @@ -146,8 +146,12 @@ Struct tags automatically reduce encoded size of structs and improve speed. We can write less code by using struct tag options: - `toarray`: encode without field names (decode back to original struct) - `keyasint`: encode field names as integers (decode back to original struct) -- `omitempty`: omit empty fields when encoding -- `omitzero`: omit zero-value fields when encoding +- `omitempty`: omit empty field when encoding +- `omitzero`: omit zero-value field when encoding + +As a special case, struct field tag "-" omits the field. + +NOTE: When a struct uses `toarray`, the encoder will ignore `omitempty` and `omitzero` to prevent position of encoded array elements from changing. This allows decoder to match encoded elements to their Go struct field. ![alt text](https://github.com/fxamacker/images/raw/master/cbor/v2.3.0/cbor_struct_tags_api.svg?sanitize=1 "CBOR API and Go Struct Tags") @@ -353,6 +357,60 @@ err = em.MarshalToBuffer(v, &buf) // encode v to provided buf Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) reduce encoded size of structs. +As a special case, struct field tag "-" omits the field. + +
🔎  Example encoding with struct field tag "-"

+ +https://go.dev/play/p/aWEIFxd7InX + +```Go +// https://github.com/fxamacker/cbor/issues/652 +package main + +import ( + "encoding/json" + "fmt" + + "github.com/fxamacker/cbor/v2" +) + +// The `cbor:"-"` tag omits the Type field when encoding to CBOR. +type Entity struct { + _ struct{} `cbor:",toarray"` + ID uint64 `json:"id"` + Type string `cbor:"-" json:"typeOf"` + Name string `json:"name"` +} + +func main() { + entity := Entity{ + ID: 1, + Type: "int64", + Name: "Identifier", + } + + c, _ := cbor.Marshal(entity) + diag, _ := cbor.Diagnose(c) + fmt.Printf("CBOR in hex: %x\n", c) + fmt.Printf("CBOR in edn: %s\n", diag) + + j, _ := json.Marshal(entity) + fmt.Printf("JSON: %s\n", string(j)) + + fmt.Printf("JSON encoding is %d bytes\n", len(j)) + fmt.Printf("CBOR encoding is %d bytes\n", len(c)) + + // Output: + // CBOR in hex: 82016a4964656e746966696572 + // CBOR in edn: [1, "Identifier"] + // JSON: {"id":1,"typeOf":"int64","name":"Identifier"} + // JSON encoding is 45 bytes + // CBOR encoding is 13 bytes +} +``` + +

+
🔎  Example encoding 3-level nested Go struct to 1 byte CBOR

https://go.dev/play/p/YxwvfPdFQG2 @@ -476,6 +534,139 @@ if data, err := em.Marshal(v); err != nil {

+👉 `fxamacker/cbor` allows user apps to use almost any current or future CBOR tag number by implementing `cbor.Marshaler` and `cbor.Unmarshaler` interfaces. + +Basically, `MarshalCBOR` and `UnmarshalCBOR` functions can be implemented by user apps and those functions will automatically be called by this CBOR codec's `Marshal`, `Unmarshal`, etc. + +The following [example](https://github.com/fxamacker/cbor/blob/master/example_embedded_json_tag_for_cbor_test.go) shows how to encode and decode a tagged CBOR data item with tag number 262. The tag content is a JSON object "embedded" as a CBOR byte string (major type 2). + +
🔎  Example using Embedded JSON Tag for CBOR (tag 262) + +```go +// https://github.com/fxamacker/cbor/issues/657 + +package cbor_test + +// NOTE: RFC 8949 does not mention tag number 262. IANA assigned +// CBOR tag number 262 as "Embedded JSON Object" specified by the +// document Embedded JSON Tag for CBOR: +// +// "Tag 262 can be applied to a byte string (major type 2) to indicate +// that the byte string is a JSON Object. The length of the byte string +// indicates the content." +// +// For more info, see Embedded JSON Tag for CBOR at: +// https://github.com/toravir/CBOR-Tag-Specs/blob/master/embeddedJSON.md + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/fxamacker/cbor/v2" +) + +// cborTagNumForEmbeddedJSON is the CBOR tag number 262. +const cborTagNumForEmbeddedJSON = 262 + +// EmbeddedJSON represents a Go value to be encoded as a tagged CBOR data item +// with tag number 262 and the tag content is a JSON object "embedded" as a +// CBOR byte string (major type 2). +type EmbeddedJSON struct { + any +} + +func NewEmbeddedJSON(val any) EmbeddedJSON { + return EmbeddedJSON{val} +} + +// MarshalCBOR encodes EmbeddedJSON to a tagged CBOR data item with the +// tag number 262 and the tag content is a JSON object that is +// "embedded" as a CBOR byte string. +func (v EmbeddedJSON) MarshalCBOR() ([]byte, error) { + // Encode v to JSON object. + data, err := json.Marshal(v) + if err != nil { + return nil, err + } + + // Create cbor.Tag representing a tagged CBOR data item. + tag := cbor.Tag{ + Number: cborTagNumForEmbeddedJSON, + Content: data, + } + + // Marshal to a tagged CBOR data item. + return cbor.Marshal(tag) +} + +// UnmarshalCBOR decodes a tagged CBOR data item to EmbeddedJSON. +// The byte slice provided to this function must contain a single +// tagged CBOR data item with the tag number 262 and tag content +// must be a JSON object "embedded" as a CBOR byte string. +func (v *EmbeddedJSON) UnmarshalCBOR(b []byte) error { + // Unmarshal tagged CBOR data item. + var tag cbor.Tag + if err := cbor.Unmarshal(b, &tag); err != nil { + return err + } + + // Check tag number. + if tag.Number != cborTagNumForEmbeddedJSON { + return fmt.Errorf("got tag number %d, expect tag number %d", tag.Number, cborTagNumForEmbeddedJSON) + } + + // Check tag content. + jsonData, isByteString := tag.Content.([]byte) + if !isByteString { + return fmt.Errorf("got tag content type %T, expect tag content []byte", tag.Content) + } + + // Unmarshal JSON object. + return json.Unmarshal(jsonData, v) +} + +// MarshalJSON encodes EmbeddedJSON to a JSON object. +func (v EmbeddedJSON) MarshalJSON() ([]byte, error) { + return json.Marshal(v.any) +} + +// UnmarshalJSON decodes a JSON object. +func (v *EmbeddedJSON) UnmarshalJSON(b []byte) error { + dec := json.NewDecoder(bytes.NewReader(b)) + dec.UseNumber() + return dec.Decode(&v.any) +} + +func Example_embeddedJSONTagForCBOR() { + value := NewEmbeddedJSON(map[string]any{ + "name": "gopher", + "id": json.Number("42"), + }) + + data, err := cbor.Marshal(value) + if err != nil { + panic(err) + } + + fmt.Printf("cbor: %x\n", data) + + var v EmbeddedJSON + err = cbor.Unmarshal(data, &v) + if err != nil { + panic(err) + } + + fmt.Printf("%+v\n", v.any) + for k, v := range v.any.(map[string]any) { + fmt.Printf(" %s: %v (%T)\n", k, v, v) + } +} +``` + +
+ + ### Functions and Interfaces
🔎  Functions and interfaces at a glance

@@ -492,7 +683,7 @@ because RFC 8949 treats CBOR data item with remaining bytes as malformed. Other useful functions: - `Diagnose`, `DiagnoseFirst` produce human-readable [Extended Diagnostic Notation](https://www.rfc-editor.org/rfc/rfc8610.html#appendix-G) from CBOR data. - `UnmarshalFirst` decodes first CBOR data item and return any remaining bytes. -- `Wellformed` returns true if the the CBOR data item is well-formed. +- `Wellformed` returns true if the CBOR data item is well-formed. Interfaces identical or comparable to Go `encoding` packages include: `Marshaler`, `Unmarshaler`, `BinaryMarshaler`, and `BinaryUnmarshaler`. @@ -511,28 +702,28 @@ Default limits may need to be increased for systems handling very large data (e. ## Status -v2.8.0 (March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality. - -v2.8.0 and v2.7.1 fixes these 3 functions (when called directly by user apps) to use same error handling on bad inputs as `cbor.Unmarshal()`: -- `ByteString.UnmarshalCBOR()` -- `RawTag.UnmarshalCBOR()` -- `SimpleValue.UnmarshalCBOR()` +[v2.9.0](https://github.com/fxamacker/cbor/releases/tag/v2.9.0) (Jul 13, 2025) improved interoperability/transcoding between CBOR & JSON, refactored tests, and improved docs. +- Add opt-in support for `encoding.TextMarshaler` and `encoding.TextUnmarshaler` to encode and decode from CBOR text string. +- Add opt-in support for `json.Marshaler` and `json.Unmarshaler` via user-provided transcoding function. +- Update docs for TimeMode, Tag, RawTag, and add example for Embedded JSON Tag for CBOR. -The above 3 `UnmarshalCBOR()` functions were initially created for internal use and are deprecated now, so please use `Unmarshal()` or `UnmarshalFirst()` instead. To preserve backward compatibility, these deprecated functions were added to fuzz tests and will not be removed in v2. +v2.9.0 passed fuzz tests and is production quality. The minimum version of Go required to build: -- v2.8.0 requires go 1.20. -- v2.7.1 and older releases require go 1.17. +- v2.8.0 and newer releases require go 1.20+. +- v2.7.1 and older releases require go 1.17+. For more details, see [release notes](https://github.com/fxamacker/cbor/releases). ### Prior Releases -v2.7.0 (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality. +[v2.8.0](https://github.com/fxamacker/cbor/releases/tag/v2.8.0) (March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality. + +[v2.7.0](https://github.com/fxamacker/cbor/releases/tag/v2.7.0) (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality. [v2.6.0](https://github.com/fxamacker/cbor/releases/tag/v2.6.0) (February 2024) adds important new features, optimizations, and bug fixes. It is especially useful to systems that need to convert data between CBOR and JSON. New options and optimizations improve handling of bignum, integers, maps, and strings. -v2.5.0 was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023). +[v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023). __IMPORTANT__: 👉 Before upgrading from v2.4 or older release, please read the notable changes highlighted in the release notes. v2.5.0 is a large release with bug fixes to error handling for extraneous data in `Unmarshal`, etc. that should be reviewed before upgrading. @@ -601,9 +792,9 @@ geomean 2.782 ## Who uses fxamacker/cbor -`fxamacker/cbor` is used in projects by Arm Ltd., Berlin Institute of Health at Charité, Chainlink, Cisco, Confidential Computing Consortium, ConsenSys, EdgeX Foundry, F5, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes, Let's Encrypt (ISRG), Linux Foundation, Matrix.org, Microsoft, Mozilla, National Cybersecurity Agency of France (govt), Netherlands (govt), Oasis Protocol, Smallstep, Tailscale, Taurus SA, Teleport, TIBCO, and others. +`fxamacker/cbor` is used in projects by Arm Ltd., Berlin Institute of Health at Charité, Chainlink, Confidential Computing Consortium, ConsenSys, EdgeX Foundry, F5, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes, Let's Encrypt (ISRG), Linaro, Linux Foundation, Matrix.org, Microsoft, National Cybersecurity Agency of France (govt), Netherlands (govt), Oasis Protocol, Red Hat OpenShift, Smallstep, Tailscale, Taurus SA, TIBCO, Veraison, and others. -`fxamacker/cbor` passed multiple confidential security assessments. A [nonconfidential security assessment](https://github.com/veraison/go-cose/blob/v1.0.0-rc.1/reports/NCC_Microsoft-go-cose-Report_2022-05-26_v1.0.pdf) (prepared by NCC Group for Microsoft Corporation) includes a subset of fxamacker/cbor v2.4.0 in its scope. +`fxamacker/cbor` passed multiple confidential security assessments in 2022. A [nonconfidential security assessment](https://github.com/veraison/go-cose/blob/v1.0.0-rc.1/reports/NCC_Microsoft-go-cose-Report_2022-05-26_v1.0.pdf) (prepared by NCC Group for Microsoft Corporation) assessed a subset of fxamacker/cbor v2.4. ## Standards diff --git a/vendor/github.com/fxamacker/cbor/v2/cache.go b/vendor/github.com/fxamacker/cbor/v2/cache.go index 0d96b9882c..5051f110fb 100644 --- a/vendor/github.com/fxamacker/cbor/v2/cache.go +++ b/vendor/github.com/fxamacker/cbor/v2/cache.go @@ -37,6 +37,7 @@ const ( specialTypeIface specialTypeTag specialTypeTime + specialTypeJSONUnmarshalerIface ) type typeInfo struct { @@ -75,6 +76,8 @@ func newTypeInfo(t reflect.Type) *typeInfo { tInfo.spclType = specialTypeUnexportedUnmarshalerIface } else if reflect.PointerTo(t).Implements(typeUnmarshaler) { tInfo.spclType = specialTypeUnmarshalerIface + } else if reflect.PointerTo(t).Implements(typeJSONUnmarshaler) { + tInfo.spclType = specialTypeJSONUnmarshalerIface } switch k { diff --git a/vendor/github.com/fxamacker/cbor/v2/common.go b/vendor/github.com/fxamacker/cbor/v2/common.go index ec038a49ec..9cf33cd209 100644 --- a/vendor/github.com/fxamacker/cbor/v2/common.go +++ b/vendor/github.com/fxamacker/cbor/v2/common.go @@ -5,6 +5,7 @@ package cbor import ( "fmt" + "io" "strconv" ) @@ -180,3 +181,11 @@ func validBuiltinTag(tagNum uint64, contentHead byte) error { return nil } + +// Transcoder is a scheme for transcoding a single CBOR encoded data item to or from a different +// data format. +type Transcoder interface { + // Transcode reads the data item in its source format from a Reader and writes a + // corresponding representation in its destination format to a Writer. + Transcode(dst io.Writer, src io.Reader) error +} diff --git a/vendor/github.com/fxamacker/cbor/v2/decode.go b/vendor/github.com/fxamacker/cbor/v2/decode.go index 3c1c168f38..f0bdc3b38d 100644 --- a/vendor/github.com/fxamacker/cbor/v2/decode.go +++ b/vendor/github.com/fxamacker/cbor/v2/decode.go @@ -4,6 +4,7 @@ package cbor import ( + "bytes" "encoding" "encoding/base64" "encoding/binary" @@ -94,7 +95,7 @@ import ( // // To unmarshal CBOR null (0xf6) and undefined (0xf7) values into a // slice/map/pointer, Unmarshal sets Go value to nil. Because null is often -// used to mean "not present", unmarshalling CBOR null and undefined value +// used to mean "not present", unmarshaling CBOR null and undefined value // into any other Go type has no effect and returns no error. // // Unmarshal supports CBOR tag 55799 (self-describe CBOR), tag 0 and 1 (time), @@ -202,7 +203,7 @@ type DupMapKeyError struct { } func (e *DupMapKeyError) Error() string { - return fmt.Sprintf("cbor: found duplicate map key \"%v\" at map element index %d", e.Key, e.Index) + return fmt.Sprintf("cbor: found duplicate map key %#v at map element index %d", e.Key, e.Index) } // UnknownFieldError describes detected unknown field in CBOR map when decoding to Go struct. @@ -387,7 +388,7 @@ const ( // - return UnmarshalTypeError if value doesn't fit into int64 IntDecConvertSignedOrFail - // IntDecConvertSigned affects how CBOR integers (major type 0 and 1) decode to Go interface{}. + // IntDecConvertSignedOrBigInt affects how CBOR integers (major type 0 and 1) decode to Go interface{}. // It makes CBOR integers (major type 0 and 1) decode to: // - int64 if value fits // - big.Int or *big.Int (see BigIntDecMode) if value doesn't fit into int64 @@ -493,11 +494,11 @@ type BigIntDecMode int const ( // BigIntDecodeValue makes CBOR bignum decode to big.Int (instead of *big.Int) - // when unmarshalling into a Go interface{}. + // when unmarshaling into a Go interface{}. BigIntDecodeValue BigIntDecMode = iota // BigIntDecodePointer makes CBOR bignum decode to *big.Int when - // unmarshalling into a Go interface{}. + // unmarshaling into a Go interface{}. BigIntDecodePointer maxBigIntDecMode @@ -749,6 +750,25 @@ func (bum BinaryUnmarshalerMode) valid() bool { return bum >= 0 && bum < maxBinaryUnmarshalerMode } +// TextUnmarshalerMode specifies how to decode into types that implement +// encoding.TextUnmarshaler. +type TextUnmarshalerMode int + +const ( + // TextUnmarshalerNone does not recognize TextUnmarshaler implementations during decode. + TextUnmarshalerNone TextUnmarshalerMode = iota + + // TextUnmarshalerTextString will invoke UnmarshalText on the contents of a CBOR text + // string when decoding into a value that implements TextUnmarshaler. + TextUnmarshalerTextString + + maxTextUnmarshalerMode +) + +func (tum TextUnmarshalerMode) valid() bool { + return tum >= 0 && tum < maxTextUnmarshalerMode +} + // DecOptions specifies decoding options. type DecOptions struct { // DupMapKey specifies whether to enforce duplicate map key. @@ -797,7 +817,7 @@ type DecOptions struct { // TagsMd specifies whether to allow CBOR tags (major type 6). TagsMd TagsMode - // IntDec specifies which Go integer type (int64 or uint64) to use + // IntDec specifies which Go integer type (int64, uint64, or [big.Int]) to use // when decoding CBOR int (major type 0 and 1) to Go interface{}. IntDec IntDecMode @@ -811,7 +831,7 @@ type DecOptions struct { ExtraReturnErrors ExtraDecErrorCond // DefaultMapType specifies Go map type to create and decode to - // when unmarshalling CBOR into an empty interface value. + // when unmarshaling CBOR into an empty interface value. // By default, unmarshal uses map[interface{}]interface{}. DefaultMapType reflect.Type @@ -883,6 +903,15 @@ type DecOptions struct { // BinaryUnmarshaler specifies how to decode into types that implement // encoding.BinaryUnmarshaler. BinaryUnmarshaler BinaryUnmarshalerMode + + // TextUnmarshaler specifies how to decode into types that implement + // encoding.TextUnmarshaler. + TextUnmarshaler TextUnmarshalerMode + + // JSONUnmarshalerTranscoder sets the transcoding scheme used to unmarshal types that + // implement json.Unmarshaler but do not also implement cbor.Unmarshaler. If nil, decoding + // behavior is not influenced by whether or not a type implements json.Unmarshaler. + JSONUnmarshalerTranscoder Transcoder } // DecMode returns DecMode with immutable options and no tags (safe for concurrency). @@ -1095,33 +1124,39 @@ func (opts DecOptions) decMode() (*decMode, error) { //nolint:gocritic // ignore return nil, errors.New("cbor: invalid BinaryUnmarshaler " + strconv.Itoa(int(opts.BinaryUnmarshaler))) } + if !opts.TextUnmarshaler.valid() { + return nil, errors.New("cbor: invalid TextUnmarshaler " + strconv.Itoa(int(opts.TextUnmarshaler))) + } + dm := decMode{ - dupMapKey: opts.DupMapKey, - timeTag: opts.TimeTag, - maxNestedLevels: opts.MaxNestedLevels, - maxArrayElements: opts.MaxArrayElements, - maxMapPairs: opts.MaxMapPairs, - indefLength: opts.IndefLength, - tagsMd: opts.TagsMd, - intDec: opts.IntDec, - mapKeyByteString: opts.MapKeyByteString, - extraReturnErrors: opts.ExtraReturnErrors, - defaultMapType: opts.DefaultMapType, - utf8: opts.UTF8, - fieldNameMatching: opts.FieldNameMatching, - bigIntDec: opts.BigIntDec, - defaultByteStringType: opts.DefaultByteStringType, - byteStringToString: opts.ByteStringToString, - fieldNameByteString: opts.FieldNameByteString, - unrecognizedTagToAny: opts.UnrecognizedTagToAny, - timeTagToAny: opts.TimeTagToAny, - simpleValues: simpleValues, - nanDec: opts.NaN, - infDec: opts.Inf, - byteStringToTime: opts.ByteStringToTime, - byteStringExpectedFormat: opts.ByteStringExpectedFormat, - bignumTag: opts.BignumTag, - binaryUnmarshaler: opts.BinaryUnmarshaler, + dupMapKey: opts.DupMapKey, + timeTag: opts.TimeTag, + maxNestedLevels: opts.MaxNestedLevels, + maxArrayElements: opts.MaxArrayElements, + maxMapPairs: opts.MaxMapPairs, + indefLength: opts.IndefLength, + tagsMd: opts.TagsMd, + intDec: opts.IntDec, + mapKeyByteString: opts.MapKeyByteString, + extraReturnErrors: opts.ExtraReturnErrors, + defaultMapType: opts.DefaultMapType, + utf8: opts.UTF8, + fieldNameMatching: opts.FieldNameMatching, + bigIntDec: opts.BigIntDec, + defaultByteStringType: opts.DefaultByteStringType, + byteStringToString: opts.ByteStringToString, + fieldNameByteString: opts.FieldNameByteString, + unrecognizedTagToAny: opts.UnrecognizedTagToAny, + timeTagToAny: opts.TimeTagToAny, + simpleValues: simpleValues, + nanDec: opts.NaN, + infDec: opts.Inf, + byteStringToTime: opts.ByteStringToTime, + byteStringExpectedFormat: opts.ByteStringExpectedFormat, + bignumTag: opts.BignumTag, + binaryUnmarshaler: opts.BinaryUnmarshaler, + textUnmarshaler: opts.TextUnmarshaler, + jsonUnmarshalerTranscoder: opts.JSONUnmarshalerTranscoder, } return &dm, nil @@ -1174,33 +1209,35 @@ type DecMode interface { } type decMode struct { - tags tagProvider - dupMapKey DupMapKeyMode - timeTag DecTagMode - maxNestedLevels int - maxArrayElements int - maxMapPairs int - indefLength IndefLengthMode - tagsMd TagsMode - intDec IntDecMode - mapKeyByteString MapKeyByteStringMode - extraReturnErrors ExtraDecErrorCond - defaultMapType reflect.Type - utf8 UTF8Mode - fieldNameMatching FieldNameMatchingMode - bigIntDec BigIntDecMode - defaultByteStringType reflect.Type - byteStringToString ByteStringToStringMode - fieldNameByteString FieldNameByteStringMode - unrecognizedTagToAny UnrecognizedTagToAnyMode - timeTagToAny TimeTagToAnyMode - simpleValues *SimpleValueRegistry - nanDec NaNMode - infDec InfMode - byteStringToTime ByteStringToTimeMode - byteStringExpectedFormat ByteStringExpectedFormatMode - bignumTag BignumTagMode - binaryUnmarshaler BinaryUnmarshalerMode + tags tagProvider + dupMapKey DupMapKeyMode + timeTag DecTagMode + maxNestedLevels int + maxArrayElements int + maxMapPairs int + indefLength IndefLengthMode + tagsMd TagsMode + intDec IntDecMode + mapKeyByteString MapKeyByteStringMode + extraReturnErrors ExtraDecErrorCond + defaultMapType reflect.Type + utf8 UTF8Mode + fieldNameMatching FieldNameMatchingMode + bigIntDec BigIntDecMode + defaultByteStringType reflect.Type + byteStringToString ByteStringToStringMode + fieldNameByteString FieldNameByteStringMode + unrecognizedTagToAny UnrecognizedTagToAnyMode + timeTagToAny TimeTagToAnyMode + simpleValues *SimpleValueRegistry + nanDec NaNMode + infDec InfMode + byteStringToTime ByteStringToTimeMode + byteStringExpectedFormat ByteStringExpectedFormatMode + bignumTag BignumTagMode + binaryUnmarshaler BinaryUnmarshalerMode + textUnmarshaler TextUnmarshalerMode + jsonUnmarshalerTranscoder Transcoder } var defaultDecMode, _ = DecOptions{}.decMode() @@ -1215,32 +1252,34 @@ func (dm *decMode) DecOptions() DecOptions { } return DecOptions{ - DupMapKey: dm.dupMapKey, - TimeTag: dm.timeTag, - MaxNestedLevels: dm.maxNestedLevels, - MaxArrayElements: dm.maxArrayElements, - MaxMapPairs: dm.maxMapPairs, - IndefLength: dm.indefLength, - TagsMd: dm.tagsMd, - IntDec: dm.intDec, - MapKeyByteString: dm.mapKeyByteString, - ExtraReturnErrors: dm.extraReturnErrors, - DefaultMapType: dm.defaultMapType, - UTF8: dm.utf8, - FieldNameMatching: dm.fieldNameMatching, - BigIntDec: dm.bigIntDec, - DefaultByteStringType: dm.defaultByteStringType, - ByteStringToString: dm.byteStringToString, - FieldNameByteString: dm.fieldNameByteString, - UnrecognizedTagToAny: dm.unrecognizedTagToAny, - TimeTagToAny: dm.timeTagToAny, - SimpleValues: simpleValues, - NaN: dm.nanDec, - Inf: dm.infDec, - ByteStringToTime: dm.byteStringToTime, - ByteStringExpectedFormat: dm.byteStringExpectedFormat, - BignumTag: dm.bignumTag, - BinaryUnmarshaler: dm.binaryUnmarshaler, + DupMapKey: dm.dupMapKey, + TimeTag: dm.timeTag, + MaxNestedLevels: dm.maxNestedLevels, + MaxArrayElements: dm.maxArrayElements, + MaxMapPairs: dm.maxMapPairs, + IndefLength: dm.indefLength, + TagsMd: dm.tagsMd, + IntDec: dm.intDec, + MapKeyByteString: dm.mapKeyByteString, + ExtraReturnErrors: dm.extraReturnErrors, + DefaultMapType: dm.defaultMapType, + UTF8: dm.utf8, + FieldNameMatching: dm.fieldNameMatching, + BigIntDec: dm.bigIntDec, + DefaultByteStringType: dm.defaultByteStringType, + ByteStringToString: dm.byteStringToString, + FieldNameByteString: dm.fieldNameByteString, + UnrecognizedTagToAny: dm.unrecognizedTagToAny, + TimeTagToAny: dm.timeTagToAny, + SimpleValues: simpleValues, + NaN: dm.nanDec, + Inf: dm.infDec, + ByteStringToTime: dm.byteStringToTime, + ByteStringExpectedFormat: dm.byteStringExpectedFormat, + BignumTag: dm.bignumTag, + BinaryUnmarshaler: dm.binaryUnmarshaler, + TextUnmarshaler: dm.textUnmarshaler, + JSONUnmarshalerTranscoder: dm.jsonUnmarshalerTranscoder, } } @@ -1367,7 +1406,7 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin // Decode CBOR nil or CBOR undefined to pointer value by setting pointer value to nil. if d.nextCBORNil() && v.Kind() == reflect.Pointer { d.skip() - v.Set(reflect.Zero(v.Type())) + v.SetZero() return nil } @@ -1467,6 +1506,14 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin case specialTypeUnexportedUnmarshalerIface: return d.parseToUnexportedUnmarshaler(v) + + case specialTypeJSONUnmarshalerIface: + // This special type implies that the type does not also implement + // cbor.Umarshaler. + if d.dm.jsonUnmarshalerTranscoder == nil { + break + } + return d.parseToJSONUnmarshaler(v) } } @@ -1523,14 +1570,14 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin return err } copied = copied || converted - return fillByteString(t, b, !copied, v, d.dm.byteStringToString, d.dm.binaryUnmarshaler) + return fillByteString(t, b, !copied, v, d.dm.byteStringToString, d.dm.binaryUnmarshaler, d.dm.textUnmarshaler) case cborTypeTextString: b, err := d.parseTextString() if err != nil { return err } - return fillTextString(t, b, v) + return fillTextString(t, b, v, d.dm.textUnmarshaler) case cborTypePrimitives: _, ai, val := d.getHead() @@ -1582,7 +1629,7 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin return nil } if tInfo.nonPtrKind == reflect.Slice || tInfo.nonPtrKind == reflect.Array { - return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler) + return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler, d.dm.textUnmarshaler) } if bi.IsUint64() { return fillPositiveInt(t, bi.Uint64(), v) @@ -1605,7 +1652,7 @@ func (d *decoder) parseToValue(v reflect.Value, tInfo *typeInfo) error { //nolin return nil } if tInfo.nonPtrKind == reflect.Slice || tInfo.nonPtrKind == reflect.Array { - return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler) + return fillByteString(t, b, !copied, v, ByteStringToStringForbidden, d.dm.binaryUnmarshaler, d.dm.textUnmarshaler) } if bi.IsInt64() { return fillNegativeInt(t, bi.Int64(), v) @@ -1832,6 +1879,32 @@ func (d *decoder) parseToUnexportedUnmarshaler(v reflect.Value) error { return errors.New("cbor: failed to assert " + v.Type().String() + " as cbor.unmarshaler") } +// parseToJSONUnmarshaler parses CBOR data to be transcoded to JSON and passed to the value's +// implementation of the json.Unmarshaler interface. It assumes data is well-formed, and does not +// perform bounds checking. +func (d *decoder) parseToJSONUnmarshaler(v reflect.Value) error { + if d.nextCBORNil() && v.Kind() == reflect.Pointer && v.IsNil() { + d.skip() + return nil + } + + if v.Kind() != reflect.Pointer && v.CanAddr() { + v = v.Addr() + } + if u, ok := v.Interface().(jsonUnmarshaler); ok { + start := d.off + d.skip() + e := getEncodeBuffer() + defer putEncodeBuffer(e) + if err := d.dm.jsonUnmarshalerTranscoder.Transcode(e, bytes.NewReader(d.data[start:d.off])); err != nil { + return &TranscodeError{err: err, rtype: v.Type(), sourceFormat: "cbor", targetFormat: "json"} + } + return u.UnmarshalJSON(e.Bytes()) + } + d.skip() + return errors.New("cbor: failed to assert " + v.Type().String() + " as json.Unmarshaler") +} + // parse parses CBOR data and returns value in default Go type. // It assumes data is well-formed, and does not perform bounds checking. func (d *decoder) parse(skipSelfDescribedTag bool) (any, error) { //nolint:gocyclo @@ -2317,9 +2390,8 @@ func (d *decoder) parseArrayToArray(v reflect.Value, tInfo *typeInfo) error { } // Set remaining Go array elements to zero values. if gi < vLen { - zeroV := reflect.Zero(tInfo.elemTypeInfo.typ) for ; gi < vLen; gi++ { - v.Index(gi).Set(zeroV) + v.Index(gi).SetZero() } } return err @@ -2403,7 +2475,7 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli } keyType, eleType := tInfo.keyTypeInfo.typ, tInfo.elemTypeInfo.typ reuseKey, reuseEle := isImmutableKind(tInfo.keyTypeInfo.kind), isImmutableKind(tInfo.elemTypeInfo.kind) - var keyValue, eleValue, zeroKeyValue, zeroEleValue reflect.Value + var keyValue, eleValue reflect.Value keyIsInterfaceType := keyType == typeIntf // If key type is interface{}, need to check if key value is hashable. var err, lastErr error keyCount := v.Len() @@ -2422,10 +2494,7 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli if !keyValue.IsValid() { keyValue = reflect.New(keyType).Elem() } else if !reuseKey { - if !zeroKeyValue.IsValid() { - zeroKeyValue = reflect.Zero(keyType) - } - keyValue.Set(zeroKeyValue) + keyValue.SetZero() } if lastErr = d.parseToValue(keyValue, tInfo.keyTypeInfo); lastErr != nil { if err == nil { @@ -2460,10 +2529,7 @@ func (d *decoder) parseMapToMap(v reflect.Value, tInfo *typeInfo) error { //noli if !eleValue.IsValid() { eleValue = reflect.New(eleType).Elem() } else if !reuseEle { - if !zeroEleValue.IsValid() { - zeroEleValue = reflect.Zero(eleType) - } - eleValue.Set(zeroEleValue) + eleValue.SetZero() } if lastErr := d.parseToValue(eleValue, tInfo.elemTypeInfo); lastErr != nil { if err == nil { @@ -2995,6 +3061,8 @@ func (d *decoder) nextCBORNil() bool { return d.data[d.off] == 0xf6 || d.data[d.off] == 0xf7 } +type jsonUnmarshaler interface{ UnmarshalJSON([]byte) error } + var ( typeIntf = reflect.TypeOf([]any(nil)).Elem() typeTime = reflect.TypeOf(time.Time{}) @@ -3002,6 +3070,8 @@ var ( typeUnmarshaler = reflect.TypeOf((*Unmarshaler)(nil)).Elem() typeUnexportedUnmarshaler = reflect.TypeOf((*unmarshaler)(nil)).Elem() typeBinaryUnmarshaler = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem() + typeTextUnmarshaler = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + typeJSONUnmarshaler = reflect.TypeOf((*jsonUnmarshaler)(nil)).Elem() typeString = reflect.TypeOf("") typeByteSlice = reflect.TypeOf([]byte(nil)) ) @@ -3009,7 +3079,7 @@ var ( func fillNil(_ cborType, v reflect.Value) error { switch v.Kind() { case reflect.Slice, reflect.Map, reflect.Interface, reflect.Pointer: - v.Set(reflect.Zero(v.Type())) + v.SetZero() return nil } return nil @@ -3110,7 +3180,7 @@ func fillFloat(t cborType, val float64, v reflect.Value) error { return &UnmarshalTypeError{CBORType: t.String(), GoType: v.Type().String()} } -func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts ByteStringToStringMode, bum BinaryUnmarshalerMode) error { +func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts ByteStringToStringMode, bum BinaryUnmarshalerMode, tum TextUnmarshalerMode) error { if bum == BinaryUnmarshalerByteString && reflect.PointerTo(v.Type()).Implements(typeBinaryUnmarshaler) { if v.CanAddr() { v = v.Addr() @@ -3123,9 +3193,26 @@ func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts B } return errors.New("cbor: cannot set new value for " + v.Type().String()) } - if bsts != ByteStringToStringForbidden && v.Kind() == reflect.String { - v.SetString(string(val)) - return nil + if bsts != ByteStringToStringForbidden { + if tum == TextUnmarshalerTextString && reflect.PointerTo(v.Type()).Implements(typeTextUnmarshaler) { + if v.CanAddr() { + v = v.Addr() + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + // The contract of TextUnmarshaler forbids retaining the input + // bytes, so no copying is required even if val is shared. + if err := u.UnmarshalText(val); err != nil { + return fmt.Errorf("cbor: cannot unmarshal text for %s: %w", v.Type(), err) + } + return nil + } + } + return errors.New("cbor: cannot set new value for " + v.Type().String()) + } + + if v.Kind() == reflect.String { + v.SetString(string(val)) + return nil + } } if v.Kind() == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 { src := val @@ -3145,9 +3232,8 @@ func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts B } // Set remaining Go array elements to zero values. if i < vLen { - zeroV := reflect.Zero(reflect.TypeOf(byte(0))) for ; i < vLen; i++ { - v.Index(i).Set(zeroV) + v.Index(i).SetZero() } } return nil @@ -3155,11 +3241,28 @@ func fillByteString(t cborType, val []byte, shared bool, v reflect.Value, bsts B return &UnmarshalTypeError{CBORType: t.String(), GoType: v.Type().String()} } -func fillTextString(t cborType, val []byte, v reflect.Value) error { +func fillTextString(t cborType, val []byte, v reflect.Value, tum TextUnmarshalerMode) error { + // Check if the value implements TextUnmarshaler and the mode allows it + if tum == TextUnmarshalerTextString && reflect.PointerTo(v.Type()).Implements(typeTextUnmarshaler) { + if v.CanAddr() { + v = v.Addr() + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + // The contract of TextUnmarshaler forbids retaining the input + // bytes, so no copying is required even if val is shared. + if err := u.UnmarshalText(val); err != nil { + return fmt.Errorf("cbor: cannot unmarshal text for %s: %w", v.Type(), err) + } + return nil + } + } + return errors.New("cbor: cannot set new value for " + v.Type().String()) + } + if v.Kind() == reflect.String { v.SetString(string(val)) return nil } + return &UnmarshalTypeError{CBORType: t.String(), GoType: v.Type().String()} } diff --git a/vendor/github.com/fxamacker/cbor/v2/encode.go b/vendor/github.com/fxamacker/cbor/v2/encode.go index a3f999221b..c550617c38 100644 --- a/vendor/github.com/fxamacker/cbor/v2/encode.go +++ b/vendor/github.com/fxamacker/cbor/v2/encode.go @@ -132,6 +132,20 @@ func (e *MarshalerError) Unwrap() error { return e.err } +type TranscodeError struct { + err error + rtype reflect.Type + sourceFormat, targetFormat string +} + +func (e TranscodeError) Error() string { + return "cbor: cannot transcode from " + e.sourceFormat + " to " + e.targetFormat + ": " + e.err.Error() +} + +func (e TranscodeError) Unwrap() error { + return e.err +} + // UnsupportedTypeError is returned by Marshal when attempting to encode value // of an unsupported type. type UnsupportedTypeError struct { @@ -293,24 +307,51 @@ func (icm InfConvertMode) valid() bool { return icm >= 0 && icm < maxInfConvert } -// TimeMode specifies how to encode time.Time values. +// TimeMode specifies how to encode time.Time values in compliance with RFC 8949 (CBOR): +// - Section 3.4.1: Standard Date/Time String +// - Section 3.4.2: Epoch-Based Date/Time +// For more info, see: +// - https://www.rfc-editor.org/rfc/rfc8949.html +// NOTE: User applications that prefer to encode time with fractional seconds to an integer +// (instead of floating point or text string) can use a CBOR tag number not assigned by IANA: +// 1. Define a user-defined type in Go with just a time.Time or int64 as its data. +// 2. Implement the cbor.Marshaler and cbor.Unmarshaler interface for that user-defined type +// to encode or decode the tagged data item with an enclosed integer content. type TimeMode int const ( - // TimeUnix causes time.Time to be encoded as epoch time in integer with second precision. + // TimeUnix causes time.Time to encode to a CBOR time (tag 1) with an integer content + // representing seconds elapsed (with 1-second precision) since UNIX Epoch UTC. + // The TimeUnix option is location independent and has a clear precision guarantee. TimeUnix TimeMode = iota - // TimeUnixMicro causes time.Time to be encoded as epoch time in float-point rounded to microsecond precision. + // TimeUnixMicro causes time.Time to encode to a CBOR time (tag 1) with a floating point content + // representing seconds elapsed (with up to 1-microsecond precision) since UNIX Epoch UTC. + // NOTE: The floating point content is encoded to the shortest floating-point encoding that preserves + // the 64-bit floating point value. I.e., the floating point encoding can be IEEE 764: + // binary64, binary32, or binary16 depending on the content's value. TimeUnixMicro - // TimeUnixDynamic causes time.Time to be encoded as integer if time.Time doesn't have fractional seconds, - // otherwise float-point rounded to microsecond precision. + // TimeUnixDynamic causes time.Time to encode to a CBOR time (tag 1) with either an integer content or + // a floating point content, depending on the content's value. This option is equivalent to dynamically + // choosing TimeUnix if time.Time doesn't have fractional seconds, and using TimeUnixMicro if time.Time + // has fractional seconds. TimeUnixDynamic - // TimeRFC3339 causes time.Time to be encoded as RFC3339 formatted string with second precision. + // TimeRFC3339 causes time.Time to encode to a CBOR time (tag 0) with a text string content + // representing the time using 1-second precision in RFC3339 format. If the time.Time has a + // non-UTC timezone then a "localtime - UTC" numeric offset will be included as specified in RFC3339. + // NOTE: User applications can avoid including the RFC3339 numeric offset by: + // - providing a time.Time value set to UTC, or + // - using the TimeUnix, TimeUnixMicro, or TimeUnixDynamic option instead of TimeRFC3339. TimeRFC3339 - // TimeRFC3339Nano causes time.Time to be encoded as RFC3339 formatted string with nanosecond precision. + // TimeRFC3339Nano causes time.Time to encode to a CBOR time (tag 0) with a text string content + // representing the time using 1-nanosecond precision in RFC3339 format. If the time.Time has a + // non-UTC timezone then a "localtime - UTC" numeric offset will be included as specified in RFC3339. + // NOTE: User applications can avoid including the RFC3339 numeric offset by: + // - providing a time.Time value set to UTC, or + // - using the TimeUnix, TimeUnixMicro, or TimeUnixDynamic option instead of TimeRFC3339Nano. TimeRFC3339Nano maxTimeMode @@ -483,6 +524,24 @@ func (bmm BinaryMarshalerMode) valid() bool { return bmm >= 0 && bmm < maxBinaryMarshalerMode } +// TextMarshalerMode specifies how to encode types that implement encoding.TextMarshaler. +type TextMarshalerMode int + +const ( + // TextMarshalerNone does not recognize TextMarshaler implementations during encode. + // This is the default behavior. + TextMarshalerNone TextMarshalerMode = iota + + // TextMarshalerTextString encodes the output of MarshalText to a CBOR text string. + TextMarshalerTextString + + maxTextMarshalerMode +) + +func (tmm TextMarshalerMode) valid() bool { + return tmm >= 0 && tmm < maxTextMarshalerMode +} + // EncOptions specifies encoding options. type EncOptions struct { // Sort specifies sorting order. @@ -540,6 +599,14 @@ type EncOptions struct { // BinaryMarshaler specifies how to encode types that implement encoding.BinaryMarshaler. BinaryMarshaler BinaryMarshalerMode + + // TextMarshaler specifies how to encode types that implement encoding.TextMarshaler. + TextMarshaler TextMarshalerMode + + // JSONMarshalerTranscoder sets the transcoding scheme used to marshal types that implement + // json.Marshaler but do not also implement cbor.Marshaler. If nil, encoding behavior is not + // influenced by whether or not a type implements json.Marshaler. + JSONMarshalerTranscoder Transcoder } // CanonicalEncOptions returns EncOptions for "Canonical CBOR" encoding, @@ -750,6 +817,9 @@ func (opts EncOptions) encMode() (*encMode, error) { //nolint:gocritic // ignore if !opts.BinaryMarshaler.valid() { return nil, errors.New("cbor: invalid BinaryMarshaler " + strconv.Itoa(int(opts.BinaryMarshaler))) } + if !opts.TextMarshaler.valid() { + return nil, errors.New("cbor: invalid TextMarshaler " + strconv.Itoa(int(opts.TextMarshaler))) + } em := encMode{ sort: opts.Sort, shortestFloat: opts.ShortestFloat, @@ -769,6 +839,8 @@ func (opts EncOptions) encMode() (*encMode, error) { //nolint:gocritic // ignore byteSliceLaterEncodingTag: byteSliceLaterEncodingTag, byteArray: opts.ByteArray, binaryMarshaler: opts.BinaryMarshaler, + textMarshaler: opts.TextMarshaler, + jsonMarshalerTranscoder: opts.JSONMarshalerTranscoder, } return &em, nil } @@ -814,6 +886,8 @@ type encMode struct { byteSliceLaterEncodingTag uint64 byteArray ByteArrayMode binaryMarshaler BinaryMarshalerMode + textMarshaler TextMarshalerMode + jsonMarshalerTranscoder Transcoder } var defaultEncMode, _ = EncOptions{}.encMode() @@ -890,22 +964,24 @@ func getMarshalerDecMode(indefLength IndefLengthMode, tagsMd TagsMode) *decMode // EncOptions returns user specified options used to create this EncMode. func (em *encMode) EncOptions() EncOptions { return EncOptions{ - Sort: em.sort, - ShortestFloat: em.shortestFloat, - NaNConvert: em.nanConvert, - InfConvert: em.infConvert, - BigIntConvert: em.bigIntConvert, - Time: em.time, - TimeTag: em.timeTag, - IndefLength: em.indefLength, - NilContainers: em.nilContainers, - TagsMd: em.tagsMd, - OmitEmpty: em.omitEmpty, - String: em.stringType, - FieldName: em.fieldName, - ByteSliceLaterFormat: em.byteSliceLaterFormat, - ByteArray: em.byteArray, - BinaryMarshaler: em.binaryMarshaler, + Sort: em.sort, + ShortestFloat: em.shortestFloat, + NaNConvert: em.nanConvert, + InfConvert: em.infConvert, + BigIntConvert: em.bigIntConvert, + Time: em.time, + TimeTag: em.timeTag, + IndefLength: em.indefLength, + NilContainers: em.nilContainers, + TagsMd: em.tagsMd, + OmitEmpty: em.omitEmpty, + String: em.stringType, + FieldName: em.fieldName, + ByteSliceLaterFormat: em.byteSliceLaterFormat, + ByteArray: em.byteArray, + BinaryMarshaler: em.binaryMarshaler, + TextMarshaler: em.textMarshaler, + JSONMarshalerTranscoder: em.jsonMarshalerTranscoder, } } @@ -1677,6 +1753,107 @@ func (bme binaryMarshalerEncoder) isEmpty(em *encMode, v reflect.Value) (bool, e return len(data) == 0, nil } +type textMarshalerEncoder struct { + alternateEncode encodeFunc + alternateIsEmpty isEmptyFunc +} + +func (tme textMarshalerEncoder) encode(e *bytes.Buffer, em *encMode, v reflect.Value) error { + if em.textMarshaler == TextMarshalerNone { + return tme.alternateEncode(e, em, v) + } + + vt := v.Type() + m, ok := v.Interface().(encoding.TextMarshaler) + if !ok { + pv := reflect.New(vt) + pv.Elem().Set(v) + m = pv.Interface().(encoding.TextMarshaler) + } + data, err := m.MarshalText() + if err != nil { + return fmt.Errorf("cbor: cannot marshal text for %s: %w", vt, err) + } + if b := em.encTagBytes(vt); b != nil { + e.Write(b) + } + + encodeHead(e, byte(cborTypeTextString), uint64(len(data))) + e.Write(data) + return nil +} + +func (tme textMarshalerEncoder) isEmpty(em *encMode, v reflect.Value) (bool, error) { + if em.textMarshaler == TextMarshalerNone { + return tme.alternateIsEmpty(em, v) + } + + m, ok := v.Interface().(encoding.TextMarshaler) + if !ok { + pv := reflect.New(v.Type()) + pv.Elem().Set(v) + m = pv.Interface().(encoding.TextMarshaler) + } + data, err := m.MarshalText() + if err != nil { + return false, fmt.Errorf("cbor: cannot marshal text for %s: %w", v.Type(), err) + } + return len(data) == 0, nil +} + +type jsonMarshalerEncoder struct { + alternateEncode encodeFunc + alternateIsEmpty isEmptyFunc +} + +func (jme jsonMarshalerEncoder) encode(e *bytes.Buffer, em *encMode, v reflect.Value) error { + if em.jsonMarshalerTranscoder == nil { + return jme.alternateEncode(e, em, v) + } + + vt := v.Type() + m, ok := v.Interface().(jsonMarshaler) + if !ok { + pv := reflect.New(vt) + pv.Elem().Set(v) + m = pv.Interface().(jsonMarshaler) + } + + json, err := m.MarshalJSON() + if err != nil { + return err + } + + offset := e.Len() + + if b := em.encTagBytes(vt); b != nil { + e.Write(b) + } + + if err := em.jsonMarshalerTranscoder.Transcode(e, bytes.NewReader(json)); err != nil { + return &TranscodeError{err: err, rtype: vt, sourceFormat: "json", targetFormat: "cbor"} + } + + // Validate that the transcode function has written exactly one well-formed data item. + d := decoder{data: e.Bytes()[offset:], dm: getMarshalerDecMode(em.indefLength, em.tagsMd)} + if err := d.wellformed(false, true); err != nil { + e.Truncate(offset) + return &TranscodeError{err: err, rtype: vt, sourceFormat: "json", targetFormat: "cbor"} + } + + return nil +} + +func (jme jsonMarshalerEncoder) isEmpty(em *encMode, v reflect.Value) (bool, error) { + if em.jsonMarshalerTranscoder == nil { + return jme.alternateIsEmpty(em, v) + } + + // As with types implementing cbor.Marshaler, transcoded json.Marshaler values always encode + // as exactly one complete CBOR data item. + return false, nil +} + func encodeMarshalerType(e *bytes.Buffer, em *encMode, v reflect.Value) error { if em.tagsMd == TagsForbidden && v.Type() == typeRawTag { return errors.New("cbor: cannot encode cbor.RawTag when TagsMd is TagsForbidden") @@ -1780,9 +1957,13 @@ func encodeHead(e *bytes.Buffer, t byte, n uint64) int { return headSize } +type jsonMarshaler interface{ MarshalJSON() ([]byte, error) } + var ( typeMarshaler = reflect.TypeOf((*Marshaler)(nil)).Elem() typeBinaryMarshaler = reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem() + typeTextMarshaler = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + typeJSONMarshaler = reflect.TypeOf((*jsonMarshaler)(nil)).Elem() typeRawMessage = reflect.TypeOf(RawMessage(nil)) typeByteString = reflect.TypeOf(ByteString("")) ) @@ -1825,6 +2006,30 @@ func getEncodeFuncInternal(t reflect.Type) (ef encodeFunc, ief isEmptyFunc, izf ief = bme.isEmpty }() } + if reflect.PointerTo(t).Implements(typeTextMarshaler) { + defer func() { + // capture encoding method used for modes that disable TextMarshaler + tme := textMarshalerEncoder{ + alternateEncode: ef, + alternateIsEmpty: ief, + } + ef = tme.encode + ief = tme.isEmpty + }() + } + if reflect.PointerTo(t).Implements(typeJSONMarshaler) { + defer func() { + // capture encoding method used for modes that don't support transcoding + // from types that implement json.Marshaler. + jme := jsonMarshalerEncoder{ + alternateEncode: ef, + alternateIsEmpty: ief, + } + ef = jme.encode + ief = jme.isEmpty + }() + } + switch k { case reflect.Bool: return encodeBool, isEmptyBool, getIsZeroFunc(t) diff --git a/vendor/github.com/fxamacker/cbor/v2/structfields.go b/vendor/github.com/fxamacker/cbor/v2/structfields.go index 593508d9ce..cf0a922cd7 100644 --- a/vendor/github.com/fxamacker/cbor/v2/structfields.go +++ b/vendor/github.com/fxamacker/cbor/v2/structfields.go @@ -239,8 +239,7 @@ func appendFields( // a nonexportable anonymous field of struct type. // Nonexportable anonymous field of struct type can contain exportable fields. func isFieldExportable(f reflect.StructField, fk reflect.Kind) bool { //nolint:gocritic // ignore hugeParam - exportable := f.PkgPath == "" - return exportable || (f.Anonymous && fk == reflect.Struct) + return f.IsExported() || (f.Anonymous && fk == reflect.Struct) } type embeddedFieldNullPtrFunc func(reflect.Value) (reflect.Value, error) diff --git a/vendor/github.com/fxamacker/cbor/v2/tag.go b/vendor/github.com/fxamacker/cbor/v2/tag.go index 47bcca8018..bd8b773f54 100644 --- a/vendor/github.com/fxamacker/cbor/v2/tag.go +++ b/vendor/github.com/fxamacker/cbor/v2/tag.go @@ -10,22 +10,23 @@ import ( "sync" ) -// Tag represents CBOR tag data, including tag number and unmarshaled tag content. Marshaling and -// unmarshaling of tag content is subject to any encode and decode options that would apply to -// enclosed data item if it were to appear outside of a tag. +// Tag represents a tagged data item (CBOR major type 6), comprising a tag number and the unmarshaled tag content. +// NOTE: The same encoding and decoding options that apply to untagged CBOR data items also applies to tag content +// during encoding and decoding. type Tag struct { Number uint64 Content any } -// RawTag represents CBOR tag data, including tag number and raw tag content. -// RawTag implements Unmarshaler and Marshaler interfaces. +// RawTag represents a tagged data item (CBOR major type 6), comprising a tag number and the raw tag content. +// The raw tag content (enclosed data item) is a CBOR-encoded data item. +// RawTag can be used to delay decoding a CBOR data item or precompute encoding a CBOR data item. type RawTag struct { Number uint64 Content RawMessage } -// UnmarshalCBOR sets *t with tag number and raw tag content copied from data. +// UnmarshalCBOR sets *t with the tag number and the raw tag content copied from data. // // Deprecated: No longer used by this codec; kept for compatibility // with user apps that directly call this function. @@ -49,7 +50,7 @@ func (t *RawTag) UnmarshalCBOR(data []byte) error { return t.unmarshalCBOR(data) } -// unmarshalCBOR sets *t with tag number and raw tag content copied from data. +// unmarshalCBOR sets *t with the tag number and the raw tag content copied from data. // This function assumes data is well-formed, and does not perform bounds checking. // This function is called by Unmarshal(). func (t *RawTag) unmarshalCBOR(data []byte) error { diff --git a/vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md b/vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md deleted file mode 100644 index 66a8a0f89a..0000000000 --- a/vendor/github.com/go-jose/go-jose/v4/CHANGELOG.md +++ /dev/null @@ -1,101 +0,0 @@ -## Changed - - - Defined a custom error, ErrUnexpectedSignatureAlgorithm, returned when a JWS - header contains an unsupported signature algorithm. - -# v4.0.4 - -## Fixed - - - Reverted "Allow unmarshalling JSONWebKeySets with unsupported key types" as a - breaking change. See #136 / #137. - -# v4.0.3 - -## Changed - - - Allow unmarshalling JSONWebKeySets with unsupported key types (#130) - - Document that OpaqueKeyEncrypter can't be implemented (for now) (#129) - - Dependency updates - -# v4.0.2 - -## Changed - - - Improved documentation of Verify() to note that JSONWebKeySet is a supported - argument type (#104) - - Defined exported error values for missing x5c header and unsupported elliptic - curves error cases (#117) - -# v4.0.1 - -## Fixed - - - An attacker could send a JWE containing compressed data that used large - amounts of memory and CPU when decompressed by `Decrypt` or `DecryptMulti`. - Those functions now return an error if the decompressed data would exceed - 250kB or 10x the compressed size (whichever is larger). Thanks to - Enze Wang@Alioth and Jianjun Chen@Zhongguancun Lab (@zer0yu and @chenjj) - for reporting. - -# v4.0.0 - -This release makes some breaking changes in order to more thoroughly -address the vulnerabilities discussed in [Three New Attacks Against JSON Web -Tokens][1], "Sign/encrypt confusion", "Billion hash attack", and "Polyglot -token". - -## Changed - - - Limit JWT encryption types (exclude password or public key types) (#78) - - Enforce minimum length for HMAC keys (#85) - - jwt: match any audience in a list, rather than requiring all audiences (#81) - - jwt: accept only Compact Serialization (#75) - - jws: Add expected algorithms for signatures (#74) - - Require specifying expected algorithms for ParseEncrypted, - ParseSigned, ParseDetached, jwt.ParseEncrypted, jwt.ParseSigned, - jwt.ParseSignedAndEncrypted (#69, #74) - - Usually there is a small, known set of appropriate algorithms for a program - to use and it's a mistake to allow unexpected algorithms. For instance the - "billion hash attack" relies in part on programs accepting the PBES2 - encryption algorithm and doing the necessary work even if they weren't - specifically configured to allow PBES2. - - Revert "Strip padding off base64 strings" (#82) - - The specs require base64url encoding without padding. - - Minimum supported Go version is now 1.21 - -## Added - - - ParseSignedCompact, ParseSignedJSON, ParseEncryptedCompact, ParseEncryptedJSON. - - These allow parsing a specific serialization, as opposed to ParseSigned and - ParseEncrypted, which try to automatically detect which serialization was - provided. It's common to require a specific serialization for a specific - protocol - for instance JWT requires Compact serialization. - -[1]: https://i.blackhat.com/BH-US-23/Presentations/US-23-Tervoort-Three-New-Attacks-Against-JSON-Web-Tokens.pdf - -# v3.0.2 - -## Fixed - - - DecryptMulti: handle decompression error (#19) - -## Changed - - - jwe/CompactSerialize: improve performance (#67) - - Increase the default number of PBKDF2 iterations to 600k (#48) - - Return the proper algorithm for ECDSA keys (#45) - -## Added - - - Add Thumbprint support for opaque signers (#38) - -# v3.0.1 - -## Fixed - - - Security issue: an attacker specifying a large "p2c" value can cause - JSONWebEncryption.Decrypt and JSONWebEncryption.DecryptMulti to consume large - amounts of CPU, causing a DoS. Thanks to Matt Schwager (@mschwager) for the - disclosure and to Tom Tervoort for originally publishing the category of attack. - https://i.blackhat.com/BH-US-23/Presentations/US-23-Tervoort-Three-New-Attacks-Against-JSON-Web-Tokens.pdf diff --git a/vendor/github.com/go-jose/go-jose/v4/README.md b/vendor/github.com/go-jose/go-jose/v4/README.md index 02b5749546..ca5f1d790b 100644 --- a/vendor/github.com/go-jose/go-jose/v4/README.md +++ b/vendor/github.com/go-jose/go-jose/v4/README.md @@ -3,7 +3,6 @@ [![godoc](https://pkg.go.dev/badge/github.com/go-jose/go-jose/v4.svg)](https://pkg.go.dev/github.com/go-jose/go-jose/v4) [![godoc](https://pkg.go.dev/badge/github.com/go-jose/go-jose/v4/jwt.svg)](https://pkg.go.dev/github.com/go-jose/go-jose/v4/jwt) [![license](https://img.shields.io/badge/license-apache_2.0-blue.svg?style=flat)](https://raw.githubusercontent.com/go-jose/go-jose/master/LICENSE) -[![test](https://img.shields.io/github/checks-status/go-jose/go-jose/v4)](https://github.com/go-jose/go-jose/actions) Package jose aims to provide an implementation of the Javascript Object Signing and Encryption set of standards. This includes support for JSON Web Encryption, @@ -29,17 +28,20 @@ libraries in other languages. ### Versions -[Version 4](https://github.com/go-jose/go-jose) -([branch](https://github.com/go-jose/go-jose/tree/main), -[doc](https://pkg.go.dev/github.com/go-jose/go-jose/v4), [releases](https://github.com/go-jose/go-jose/releases)) is the current stable version: +The forthcoming Version 5 will be released with several breaking API changes, +and will require Golang's `encoding/json/v2`, which is currently requires +Go 1.25 built with GOEXPERIMENT=jsonv2. + +Version 4 is the current stable version: import "github.com/go-jose/go-jose/v4" -The old [square/go-jose](https://github.com/square/go-jose) repo contains the prior v1 and v2 versions, which -are still useable but not actively developed anymore. +It supports at least the current and previous Golang release. Currently it +requires Golang 1.23. + +Version 3 is only receiving critical security updates. Migration to Version 4 is recommended. -Version 3, in this repo, is still receiving security fixes but not functionality -updates. +Versions 1 and 2 are obsolete, but can be found in the old repository, [square/go-jose](https://github.com/square/go-jose). ### Supported algorithms @@ -47,36 +49,36 @@ See below for a table of supported algorithms. Algorithm identifiers match the names in the [JSON Web Algorithms](https://dx.doi.org/10.17487/RFC7518) standard where possible. The Godoc reference has a list of constants. - Key encryption | Algorithm identifier(s) - :------------------------- | :------------------------------ - RSA-PKCS#1v1.5 | RSA1_5 - RSA-OAEP | RSA-OAEP, RSA-OAEP-256 - AES key wrap | A128KW, A192KW, A256KW - AES-GCM key wrap | A128GCMKW, A192GCMKW, A256GCMKW - ECDH-ES + AES key wrap | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW - ECDH-ES (direct) | ECDH-ES1 - Direct encryption | dir1 +| Key encryption | Algorithm identifier(s) | +|:-----------------------|:-----------------------------------------------| +| RSA-PKCS#1v1.5 | RSA1_5 | +| RSA-OAEP | RSA-OAEP, RSA-OAEP-256 | +| AES key wrap | A128KW, A192KW, A256KW | +| AES-GCM key wrap | A128GCMKW, A192GCMKW, A256GCMKW | +| ECDH-ES + AES key wrap | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW | +| ECDH-ES (direct) | ECDH-ES1 | +| Direct encryption | dir1 | 1. Not supported in multi-recipient mode - Signing / MAC | Algorithm identifier(s) - :------------------------- | :------------------------------ - RSASSA-PKCS#1v1.5 | RS256, RS384, RS512 - RSASSA-PSS | PS256, PS384, PS512 - HMAC | HS256, HS384, HS512 - ECDSA | ES256, ES384, ES512 - Ed25519 | EdDSA2 +| Signing / MAC | Algorithm identifier(s) | +|:------------------|:------------------------| +| RSASSA-PKCS#1v1.5 | RS256, RS384, RS512 | +| RSASSA-PSS | PS256, PS384, PS512 | +| HMAC | HS256, HS384, HS512 | +| ECDSA | ES256, ES384, ES512 | +| Ed25519 | EdDSA2 | 2. Only available in version 2 of the package - Content encryption | Algorithm identifier(s) - :------------------------- | :------------------------------ - AES-CBC+HMAC | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 - AES-GCM | A128GCM, A192GCM, A256GCM +| Content encryption | Algorithm identifier(s) | +|:-------------------|:--------------------------------------------| +| AES-CBC+HMAC | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 | +| AES-GCM | A128GCM, A192GCM, A256GCM | - Compression | Algorithm identifiers(s) - :------------------------- | ------------------------------- - DEFLATE (RFC 1951) | DEF +| Compression | Algorithm identifiers(s) | +|:-------------------|--------------------------| +| DEFLATE (RFC 1951) | DEF | ### Supported key types @@ -85,12 +87,12 @@ library, and can be passed to corresponding functions such as `NewEncrypter` or `NewSigner`. Each of these keys can also be wrapped in a JWK if desired, which allows attaching a key id. - Algorithm(s) | Corresponding types - :------------------------- | ------------------------------- - RSA | *[rsa.PublicKey](https://pkg.go.dev/crypto/rsa/#PublicKey), *[rsa.PrivateKey](https://pkg.go.dev/crypto/rsa/#PrivateKey) - ECDH, ECDSA | *[ecdsa.PublicKey](https://pkg.go.dev/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](https://pkg.go.dev/crypto/ecdsa/#PrivateKey) - EdDSA1 | [ed25519.PublicKey](https://pkg.go.dev/crypto/ed25519#PublicKey), [ed25519.PrivateKey](https://pkg.go.dev/crypto/ed25519#PrivateKey) - AES, HMAC | []byte +| Algorithm(s) | Corresponding types | +|:------------------|--------------------------------------------------------------------------------------------------------------------------------------| +| RSA | *[rsa.PublicKey](https://pkg.go.dev/crypto/rsa/#PublicKey), *[rsa.PrivateKey](https://pkg.go.dev/crypto/rsa/#PrivateKey) | +| ECDH, ECDSA | *[ecdsa.PublicKey](https://pkg.go.dev/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](https://pkg.go.dev/crypto/ecdsa/#PrivateKey) | +| EdDSA1 | [ed25519.PublicKey](https://pkg.go.dev/crypto/ed25519#PublicKey), [ed25519.PrivateKey](https://pkg.go.dev/crypto/ed25519#PrivateKey) | +| AES, HMAC | []byte | 1. Only available in version 2 or later of the package diff --git a/vendor/github.com/go-jose/go-jose/v4/crypter.go b/vendor/github.com/go-jose/go-jose/v4/crypter.go index d81b03b447..ab02a28e26 100644 --- a/vendor/github.com/go-jose/go-jose/v4/crypter.go +++ b/vendor/github.com/go-jose/go-jose/v4/crypter.go @@ -286,6 +286,10 @@ func makeJWERecipient(alg KeyAlgorithm, encryptionKey interface{}) (recipientKey return newSymmetricRecipient(alg, encryptionKey) case string: return newSymmetricRecipient(alg, []byte(encryptionKey)) + case JSONWebKey: + recipient, err := makeJWERecipient(alg, encryptionKey.Key) + recipient.keyID = encryptionKey.KeyID + return recipient, err case *JSONWebKey: recipient, err := makeJWERecipient(alg, encryptionKey.Key) recipient.keyID = encryptionKey.KeyID diff --git a/vendor/github.com/go-jose/go-jose/v4/jwk.go b/vendor/github.com/go-jose/go-jose/v4/jwk.go index 9700f8906c..164d6a1619 100644 --- a/vendor/github.com/go-jose/go-jose/v4/jwk.go +++ b/vendor/github.com/go-jose/go-jose/v4/jwk.go @@ -175,6 +175,8 @@ func (k JSONWebKey) MarshalJSON() ([]byte, error) { } // UnmarshalJSON reads a key from its JSON representation. +// +// Returns ErrUnsupportedKeyType for unrecognized or unsupported "kty" header values. func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { var raw rawJSONWebKey err = json.Unmarshal(data, &raw) @@ -228,7 +230,7 @@ func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { } key, err = raw.symmetricKey() case "OKP": - if raw.Crv == "Ed25519" && raw.X != nil { + if raw.Crv == "Ed25519" { if raw.D != nil { key, err = raw.edPrivateKey() if err == nil { @@ -238,17 +240,27 @@ func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { key, err = raw.edPublicKey() keyPub = key } - } else { - return fmt.Errorf("go-jose/go-jose: unknown curve '%s'", raw.Crv) } - default: - return fmt.Errorf("go-jose/go-jose: unknown json web key type '%s'", raw.Kty) + case "": + // kty MUST be present + err = fmt.Errorf("go-jose/go-jose: missing json web key type") } if err != nil { return } + if key == nil { + // RFC 7517: + // 5. JWK Set Format + // ... + // Implementations SHOULD ignore JWKs within a JWK Set that use "kty" + // (key type) values that are not understood by them, that are missing + // required members, or for which values are out of the supported + // ranges. + return ErrUnsupportedKeyType + } + if certPub != nil && keyPub != nil { if !reflect.DeepEqual(certPub, keyPub) { return errors.New("go-jose/go-jose: invalid JWK, public keys in key and x5c fields do not match") @@ -581,10 +593,10 @@ func fromEcPublicKey(pub *ecdsa.PublicKey) (*rawJSONWebKey, error) { func (key rawJSONWebKey) edPrivateKey() (ed25519.PrivateKey, error) { var missing []string - switch { - case key.D == nil: + if key.D == nil { missing = append(missing, "D") - case key.X == nil: + } + if key.X == nil { missing = append(missing, "X") } @@ -611,19 +623,21 @@ func (key rawJSONWebKey) edPublicKey() (ed25519.PublicKey, error) { func (key rawJSONWebKey) rsaPrivateKey() (*rsa.PrivateKey, error) { var missing []string - switch { - case key.N == nil: + if key.N == nil { missing = append(missing, "N") - case key.E == nil: + } + if key.E == nil { missing = append(missing, "E") - case key.D == nil: + } + if key.D == nil { missing = append(missing, "D") - case key.P == nil: + } + if key.P == nil { missing = append(missing, "P") - case key.Q == nil: + } + if key.Q == nil { missing = append(missing, "Q") } - if len(missing) > 0 { return nil, fmt.Errorf("go-jose/go-jose: invalid RSA private key, missing %s value(s)", strings.Join(missing, ", ")) } @@ -698,8 +712,19 @@ func (key rawJSONWebKey) ecPrivateKey() (*ecdsa.PrivateKey, error) { return nil, fmt.Errorf("go-jose/go-jose: unsupported elliptic curve '%s'", key.Crv) } - if key.X == nil || key.Y == nil || key.D == nil { - return nil, fmt.Errorf("go-jose/go-jose: invalid EC private key, missing x/y/d values") + var missing []string + if key.X == nil { + missing = append(missing, "X") + } + if key.Y == nil { + missing = append(missing, "Y") + } + if key.D == nil { + missing = append(missing, "D") + } + + if len(missing) > 0 { + return nil, fmt.Errorf("go-jose/go-jose: invalid EC private key, missing %s value(s)", strings.Join(missing, ", ")) } // The length of this octet string MUST be the full size of a coordinate for diff --git a/vendor/github.com/go-jose/go-jose/v4/shared.go b/vendor/github.com/go-jose/go-jose/v4/shared.go index 1ec3396126..56a81b258d 100644 --- a/vendor/github.com/go-jose/go-jose/v4/shared.go +++ b/vendor/github.com/go-jose/go-jose/v4/shared.go @@ -22,7 +22,6 @@ import ( "encoding/base64" "errors" "fmt" - "github.com/go-jose/go-jose/v4/json" ) diff --git a/vendor/github.com/goccy/go-yaml/ast/ast.go b/vendor/github.com/goccy/go-yaml/ast/ast.go index f535a24658..a1a7de1d38 100644 --- a/vendor/github.com/goccy/go-yaml/ast/ast.go +++ b/vendor/github.com/goccy/go-yaml/ast/ast.go @@ -1,6 +1,7 @@ package ast import ( + "errors" "fmt" "io" "math" @@ -8,13 +9,12 @@ import ( "strings" "github.com/goccy/go-yaml/token" - "golang.org/x/xerrors" ) var ( - ErrInvalidTokenType = xerrors.New("invalid token type") - ErrInvalidAnchorName = xerrors.New("invalid anchor name") - ErrInvalidAliasName = xerrors.New("invalid alias name") + ErrInvalidTokenType = errors.New("invalid token type") + ErrInvalidAnchorName = errors.New("invalid anchor name") + ErrInvalidAliasName = errors.New("invalid alias name") ) // NodeType type identifier of node @@ -51,6 +51,8 @@ const ( MappingValueType // SequenceType type identifier for sequence node SequenceType + // SequenceEntryType type identifier for sequence entry node + SequenceEntryType // AnchorType type identifier for anchor node AnchorType // AliasType type identifier for alias node @@ -98,6 +100,8 @@ func (t NodeType) String() string { return "MappingValue" case SequenceType: return "Sequence" + case SequenceEntryType: + return "SequenceEntry" case AnchorType: return "Anchor" case AliasType: @@ -148,6 +152,8 @@ func (t NodeType) YAMLName() string { return "value" case SequenceType: return "sequence" + case SequenceEntryType: + return "value" case AnchorType: return "anchor" case AliasType: @@ -196,6 +202,7 @@ type Node interface { // MapKeyNode type for map key node type MapKeyNode interface { Node + IsMergeKey() bool // String node to text without comment stringWithoutComment() string } @@ -278,6 +285,49 @@ func readNode(p []byte, node Node) (int, error) { return size, nil } +func checkLineBreak(t *token.Token) bool { + if t.Prev != nil { + lbc := "\n" + prev := t.Prev + var adjustment int + // if the previous type is sequence entry use the previous type for that + if prev.Type == token.SequenceEntryType { + // as well as switching to previous type count any new lines in origin to account for: + // - + // b: c + adjustment = strings.Count(strings.TrimRight(t.Origin, lbc), lbc) + if prev.Prev != nil { + prev = prev.Prev + } + } + lineDiff := t.Position.Line - prev.Position.Line - 1 + if lineDiff > 0 { + if prev.Type == token.StringType { + // Remove any line breaks included in multiline string + adjustment += strings.Count(strings.TrimRight(strings.TrimSpace(prev.Origin), lbc), lbc) + } + // Due to the way that comment parsing works its assumed that when a null value does not have new line in origin + // it was squashed therefore difference is ignored. + // foo: + // bar: + // # comment + // baz: 1 + // becomes + // foo: + // bar: null # comment + // + // baz: 1 + if prev.Type == token.NullType || prev.Type == token.ImplicitNullType { + return strings.Count(prev.Origin, lbc) > 0 + } + if lineDiff-adjustment > 0 { + return true + } + } + } + return false +} + // Null create node for null value func Null(tk *token.Token) *NullNode { return &NullNode{ @@ -298,105 +348,30 @@ func Bool(tk *token.Token) *BoolNode { // Integer create node for integer value func Integer(tk *token.Token) *IntegerNode { - value := removeUnderScoreFromNumber(tk.Value) - switch tk.Type { - case token.BinaryIntegerType: - // skip two characters because binary token starts with '0b' - skipCharacterNum := 2 - negativePrefix := "" - if value[0] == '-' { - skipCharacterNum++ - negativePrefix = "-" - } - if len(negativePrefix) > 0 { - i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 2, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - i, _ := strconv.ParseUint(negativePrefix+value[skipCharacterNum:], 2, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - case token.OctetIntegerType: - // octet token starts with '0o' or '-0o' or '0' or '-0' - skipCharacterNum := 1 - negativePrefix := "" - if value[0] == '-' { - skipCharacterNum++ - if len(value) > 2 && value[2] == 'o' { - skipCharacterNum++ - } - negativePrefix = "-" - } else { - if value[1] == 'o' { - skipCharacterNum++ - } - } - if len(negativePrefix) > 0 { - i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 8, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - i, _ := strconv.ParseUint(value[skipCharacterNum:], 8, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - case token.HexIntegerType: - // hex token starts with '0x' or '-0x' - skipCharacterNum := 2 - negativePrefix := "" - if value[0] == '-' { - skipCharacterNum++ - negativePrefix = "-" - } - if len(negativePrefix) > 0 { - i, _ := strconv.ParseInt(negativePrefix+value[skipCharacterNum:], 16, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - i, _ := strconv.ParseUint(value[skipCharacterNum:], 16, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } - } - if value[0] == '-' || value[0] == '+' { - i, _ := strconv.ParseInt(value, 10, 64) - return &IntegerNode{ - BaseNode: &BaseNode{}, - Token: tk, - Value: i, - } + var v any + if num := token.ToNumber(tk.Value); num != nil { + v = num.Value } - i, _ := strconv.ParseUint(value, 10, 64) return &IntegerNode{ BaseNode: &BaseNode{}, Token: tk, - Value: i, + Value: v, } } // Float create node for float value func Float(tk *token.Token) *FloatNode { - f, _ := strconv.ParseFloat(removeUnderScoreFromNumber(tk.Value), 64) + var v float64 + if num := token.ToNumber(tk.Value); num != nil && num.Type == token.NumberTypeFloat { + value, ok := num.Value.(float64) + if ok { + v = value + } + } return &FloatNode{ BaseNode: &BaseNode{}, Token: tk, - Value: f, + Value: v, } } @@ -607,7 +582,9 @@ func (d *DocumentNode) String() string { if d.Start != nil { doc = append(doc, d.Start.Value) } - doc = append(doc, d.Body.String()) + if d.Body != nil { + doc = append(doc, d.Body.String()) + } if d.End != nil { doc = append(doc, d.End.Value) } @@ -619,10 +596,6 @@ func (d *DocumentNode) MarshalYAML() ([]byte, error) { return []byte(d.String()), nil } -func removeUnderScoreFromNumber(num string) string { - return strings.ReplaceAll(num, "_", "") -} - // NullNode type of null node type NullNode struct { *BaseNode @@ -654,6 +627,12 @@ func (n *NullNode) GetValue() interface{} { // String returns `null` text func (n *NullNode) String() string { + if n.Token.Type == token.ImplicitNullType { + if n.Comment != nil { + return n.Comment.String() + } + return "" + } if n.Comment != nil { return addCommentString("null", n.Comment) } @@ -669,6 +648,11 @@ func (n *NullNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *NullNode) IsMergeKey() bool { + return false +} + // IntegerNode type of integer node type IntegerNode struct { *BaseNode @@ -716,6 +700,11 @@ func (n *IntegerNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *IntegerNode) IsMergeKey() bool { + return false +} + // FloatNode type of float node type FloatNode struct { *BaseNode @@ -764,6 +753,11 @@ func (n *FloatNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *FloatNode) IsMergeKey() bool { + return false +} + // StringNode type of string node type StringNode struct { *BaseNode @@ -794,6 +788,11 @@ func (n *StringNode) GetValue() interface{} { return n.Value } +// IsMergeKey returns whether it is a MergeKey node. +func (n *StringNode) IsMergeKey() bool { + return false +} + // escapeSingleQuote escapes s to a single quoted scalar. // https://yaml.org/spec/1.2.2/#732-single-quoted-style func escapeSingleQuote(s string) string { @@ -831,11 +830,12 @@ func (n *StringNode) String() string { // It works mostly, but inconsistencies occur if line break characters are mixed. header := token.LiteralBlockHeader(n.Value) space := strings.Repeat(" ", n.Token.Position.Column-1) + indent := strings.Repeat(" ", n.Token.Position.IndentNum) values := []string{} for _, v := range strings.Split(n.Value, lbc) { - values = append(values, fmt.Sprintf("%s %s", space, v)) + values = append(values, fmt.Sprintf("%s%s%s", space, indent, v)) } - block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s %s", lbc, space)), fmt.Sprintf(" %s", space)) + block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s%s%s", lbc, indent, space)), fmt.Sprintf("%s%s", indent, space)) return fmt.Sprintf("%s%s%s", header, lbc, block) } else if len(n.Value) > 0 && (n.Value[0] == '{' || n.Value[0] == '[') { return fmt.Sprintf(`'%s'`, n.Value) @@ -862,11 +862,12 @@ func (n *StringNode) stringWithoutComment() string { // It works mostly, but inconsistencies occur if line break characters are mixed. header := token.LiteralBlockHeader(n.Value) space := strings.Repeat(" ", n.Token.Position.Column-1) + indent := strings.Repeat(" ", n.Token.Position.IndentNum) values := []string{} for _, v := range strings.Split(n.Value, lbc) { - values = append(values, fmt.Sprintf("%s %s", space, v)) + values = append(values, fmt.Sprintf("%s%s%s", space, indent, v)) } - block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s %s", lbc, space)), fmt.Sprintf(" %s", space)) + block := strings.TrimSuffix(strings.TrimSuffix(strings.Join(values, lbc), fmt.Sprintf("%s%s%s", lbc, indent, space)), fmt.Sprintf(" %s", space)) return fmt.Sprintf("%s%s%s", header, lbc, block) } else if len(n.Value) > 0 && (n.Value[0] == '{' || n.Value[0] == '[') { return fmt.Sprintf(`'%s'`, n.Value) @@ -931,6 +932,11 @@ func (n *LiteralNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *LiteralNode) IsMergeKey() bool { + return false +} + // MergeKeyNode type of merge key node type MergeKeyNode struct { *BaseNode @@ -974,6 +980,11 @@ func (n *MergeKeyNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *MergeKeyNode) IsMergeKey() bool { + return true +} + // BoolNode type of boolean node type BoolNode struct { *BaseNode @@ -1021,6 +1032,11 @@ func (n *BoolNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *BoolNode) IsMergeKey() bool { + return false +} + // InfinityNode type of infinity node type InfinityNode struct { *BaseNode @@ -1068,6 +1084,11 @@ func (n *InfinityNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *InfinityNode) IsMergeKey() bool { + return false +} + // NanNode type of nan node type NanNode struct { *BaseNode @@ -1114,6 +1135,11 @@ func (n *NanNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *NanNode) IsMergeKey() bool { + return false +} + // MapNode interface of MappingValueNode / MappingNode type MapNode interface { MapRange() *MapNodeIter @@ -1147,6 +1173,11 @@ func (m *MapNodeIter) Value() Node { return m.values[m.idx].Value } +// KeyValue returns the MappingValueNode of the iterator's current map node entry. +func (m *MapNodeIter) KeyValue() *MappingValueNode { + return m.values[m.idx] +} + // MappingNode type of mapping node type MappingNode struct { *BaseNode @@ -1317,13 +1348,27 @@ func (n *MappingKeyNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *MappingKeyNode) IsMergeKey() bool { + if n.Value == nil { + return false + } + key, ok := n.Value.(MapKeyNode) + if !ok { + return false + } + return key.IsMergeKey() +} + // MappingValueNode type of mapping value type MappingValueNode struct { *BaseNode - Start *token.Token - Key MapKeyNode - Value Node - FootComment *CommentGroupNode + Start *token.Token // delimiter token ':'. + CollectEntry *token.Token // collect entry token ','. + Key MapKeyNode + Value Node + FootComment *CommentGroupNode + IsFlowStyle bool } // Replace replace value node. @@ -1360,6 +1405,7 @@ func (n *MappingValueNode) AddColumn(col int) { // SetIsFlowStyle set value to IsFlowStyle field recursively. func (n *MappingValueNode) SetIsFlowStyle(isFlow bool) { + n.IsFlowStyle = isFlow switch value := n.Value.(type) { case *MappingNode: value.SetIsFlowStyle(isFlow) @@ -1390,12 +1436,20 @@ func (n *MappingValueNode) String() string { func (n *MappingValueNode) toString() string { space := strings.Repeat(" ", n.Key.GetToken().Position.Column-1) + if checkLineBreak(n.Key.GetToken()) { + space = fmt.Sprintf("%s%s", "\n", space) + } keyIndentLevel := n.Key.GetToken().Position.IndentLevel valueIndentLevel := n.Value.GetToken().Position.IndentLevel keyComment := n.Key.GetComment() if _, ok := n.Value.(ScalarNode); ok { - return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) - } else if keyIndentLevel < valueIndentLevel { + value := n.Value.String() + if value == "" { + // implicit null value. + return fmt.Sprintf("%s%s:", space, n.Key.String()) + } + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), value) + } else if keyIndentLevel < valueIndentLevel && !n.IsFlowStyle { if keyComment != nil { return fmt.Sprintf( "%s%s: %s\n%s", @@ -1414,7 +1468,10 @@ func (n *MappingValueNode) toString() string { return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) } else if _, ok := n.Value.(*AliasNode); ok { return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) + } else if _, ok := n.Value.(*TagNode); ok { + return fmt.Sprintf("%s%s: %s", space, n.Key.String(), n.Value.String()) } + if keyComment != nil { return fmt.Sprintf( "%s%s: %s\n%s", @@ -1485,13 +1542,14 @@ type SequenceNode struct { IsFlowStyle bool Values []Node ValueHeadComments []*CommentGroupNode + Entries []*SequenceEntryNode FootComment *CommentGroupNode } // Replace replace value node. func (n *SequenceNode) Replace(idx int, value Node) error { if len(n.Values) <= idx { - return xerrors.Errorf( + return fmt.Errorf( "invalid index for sequence: sequence length is %d, but specified %d index", len(n.Values), idx, ) @@ -1506,9 +1564,12 @@ func (n *SequenceNode) Replace(idx int, value Node) error { func (n *SequenceNode) Merge(target *SequenceNode) { column := n.Start.Position.Column - target.Start.Position.Column target.AddColumn(column) - for _, value := range target.Values { - n.Values = append(n.Values, value) + n.Values = append(n.Values, target.Values...) + if len(target.ValueHeadComments) == 0 { + n.ValueHeadComments = append(n.ValueHeadComments, make([]*CommentGroupNode, len(target.Values))...) + return } + n.ValueHeadComments = append(n.ValueHeadComments, target.ValueHeadComments...) } // SetIsFlowStyle set value to IsFlowStyle field recursively. @@ -1564,7 +1625,15 @@ func (n *SequenceNode) blockStyleString() string { } for idx, value := range n.Values { + if value == nil { + continue + } valueStr := value.String() + newLinePrefix := "" + if strings.HasPrefix(valueStr, "\n") { + valueStr = valueStr[1:] + newLinePrefix = "\n" + } splittedValues := strings.Split(valueStr, "\n") trimmedFirstValue := strings.TrimLeft(splittedValues[0], " ") diffLength := len(splittedValues[0]) - len(trimmedFirstValue) @@ -1587,9 +1656,10 @@ func (n *SequenceNode) blockStyleString() string { } newValue := strings.Join(newValues, "\n") if len(n.ValueHeadComments) == len(n.Values) && n.ValueHeadComments[idx] != nil { - values = append(values, n.ValueHeadComments[idx].StringWithSpace(n.Start.Position.Column-1)) + values = append(values, fmt.Sprintf("%s%s", newLinePrefix, n.ValueHeadComments[idx].StringWithSpace(n.Start.Position.Column-1))) + newLinePrefix = "" } - values = append(values, fmt.Sprintf("%s- %s", space, newValue)) + values = append(values, fmt.Sprintf("%s%s- %s", newLinePrefix, space, newValue)) } if n.FootComment != nil { values = append(values, n.FootComment.StringWithSpace(n.Start.Position.Column-1)) @@ -1618,6 +1688,87 @@ func (n *SequenceNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// SequenceEntryNode is the sequence entry. +type SequenceEntryNode struct { + *BaseNode + HeadComment *CommentGroupNode // head comment. + LineComment *CommentGroupNode // line comment e.g.) - # comment. + Start *token.Token // entry token. + Value Node // value node. +} + +// String node to text +func (n *SequenceEntryNode) String() string { + return "" // TODO +} + +// GetToken returns token instance +func (n *SequenceEntryNode) GetToken() *token.Token { + return n.Start +} + +// Type returns type of node +func (n *SequenceEntryNode) Type() NodeType { + return SequenceEntryType +} + +// AddColumn add column number to child nodes recursively +func (n *SequenceEntryNode) AddColumn(col int) { + n.Start.AddColumn(col) +} + +// SetComment set line comment. +func (n *SequenceEntryNode) SetComment(cm *CommentGroupNode) error { + n.LineComment = cm + return nil +} + +// Comment returns comment token instance +func (n *SequenceEntryNode) GetComment() *CommentGroupNode { + return n.LineComment +} + +// MarshalYAML +func (n *SequenceEntryNode) MarshalYAML() ([]byte, error) { + return []byte(n.String()), nil +} + +func (n *SequenceEntryNode) Read(p []byte) (int, error) { + return readNode(p, n) +} + +// SequenceEntry creates SequenceEntryNode instance. +func SequenceEntry(start *token.Token, value Node, headComment *CommentGroupNode) *SequenceEntryNode { + return &SequenceEntryNode{ + BaseNode: &BaseNode{}, + HeadComment: headComment, + Start: start, + Value: value, + } +} + +// SequenceMergeValue creates SequenceMergeValueNode instance. +func SequenceMergeValue(values ...MapNode) *SequenceMergeValueNode { + return &SequenceMergeValueNode{ + values: values, + } +} + +// SequenceMergeValueNode is used to convert the Sequence node specified for the merge key into a MapNode format. +type SequenceMergeValueNode struct { + values []MapNode +} + +// MapRange returns MapNodeIter instance. +func (n *SequenceMergeValueNode) MapRange() *MapNodeIter { + ret := &MapNodeIter{idx: startRangeIndex} + for _, value := range n.values { + iter := value.MapRange() + ret.values = append(ret.values, iter.values...) + } + return ret +} + // AnchorNode type of anchor node type AnchorNode struct { *BaseNode @@ -1626,6 +1777,10 @@ type AnchorNode struct { Value Node } +func (n *AnchorNode) stringWithoutComment() string { + return n.Value.String() +} + func (n *AnchorNode) SetName(name string) error { if n.Name == nil { return ErrInvalidAnchorName @@ -1651,6 +1806,10 @@ func (n *AnchorNode) GetToken() *token.Token { return n.Start } +func (n *AnchorNode) GetValue() any { + return n.Value.GetToken().Value +} + // AddColumn add column number to child nodes recursively func (n *AnchorNode) AddColumn(col int) { n.Start.AddColumn(col) @@ -1664,15 +1823,18 @@ func (n *AnchorNode) AddColumn(col int) { // String anchor to text func (n *AnchorNode) String() string { + anchor := "&" + n.Name.String() value := n.Value.String() - if len(strings.Split(value, "\n")) > 1 { - return fmt.Sprintf("&%s\n%s", n.Name.String(), value) - } else if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { - return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { + return fmt.Sprintf("%s\n%s", anchor, value) } else if m, ok := n.Value.(*MappingNode); ok && !m.IsFlowStyle { - return fmt.Sprintf("&%s\n%s", n.Name.String(), value) + return fmt.Sprintf("%s\n%s", anchor, value) + } + if value == "" { + // implicit null value. + return anchor } - return fmt.Sprintf("&%s %s", n.Name.String(), value) + return fmt.Sprintf("%s %s", anchor, value) } // MarshalYAML encodes to a YAML text @@ -1680,6 +1842,18 @@ func (n *AnchorNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *AnchorNode) IsMergeKey() bool { + if n.Value == nil { + return false + } + key, ok := n.Value.(MapKeyNode) + if !ok { + return false + } + return key.IsMergeKey() +} + // AliasNode type of alias node type AliasNode struct { *BaseNode @@ -1687,6 +1861,10 @@ type AliasNode struct { Value Node } +func (n *AliasNode) stringWithoutComment() string { + return n.Value.String() +} + func (n *AliasNode) SetName(name string) error { if n.Value == nil { return ErrInvalidAliasName @@ -1712,6 +1890,10 @@ func (n *AliasNode) GetToken() *token.Token { return n.Start } +func (n *AliasNode) GetValue() any { + return n.Value.GetToken().Value +} + // AddColumn add column number to child nodes recursively func (n *AliasNode) AddColumn(col int) { n.Start.AddColumn(col) @@ -1730,11 +1912,20 @@ func (n *AliasNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *AliasNode) IsMergeKey() bool { + return false +} + // DirectiveNode type of directive node type DirectiveNode struct { *BaseNode + // Start is '%' token. Start *token.Token - Value Node + // Name is directive name e.g.) "YAML" or "TAG". + Name Node + // Values is directive values e.g.) "1.2" or "!!" and "tag:clarkevans.com,2002:app/". + Values []Node } // Read implements (io.Reader).Read @@ -1752,14 +1943,21 @@ func (n *DirectiveNode) GetToken() *token.Token { // AddColumn add column number to child nodes recursively func (n *DirectiveNode) AddColumn(col int) { - if n.Value != nil { - n.Value.AddColumn(col) + if n.Name != nil { + n.Name.AddColumn(col) + } + for _, value := range n.Values { + value.AddColumn(col) } } // String directive to text func (n *DirectiveNode) String() string { - return fmt.Sprintf("%s%s", n.Start.Value, n.Value.String()) + values := make([]string, 0, len(n.Values)) + for _, val := range n.Values { + values = append(values, val.String()) + } + return strings.Join(append([]string{"%" + n.Name.String()}, values...), " ") } // MarshalYAML encodes to a YAML text @@ -1770,8 +1968,21 @@ func (n *DirectiveNode) MarshalYAML() ([]byte, error) { // TagNode type of tag node type TagNode struct { *BaseNode - Start *token.Token - Value Node + Directive *DirectiveNode + Start *token.Token + Value Node +} + +func (n *TagNode) GetValue() any { + scalar, ok := n.Value.(ScalarNode) + if !ok { + return nil + } + return scalar.GetValue() +} + +func (n *TagNode) stringWithoutComment() string { + return n.Value.String() } // Read implements (io.Reader).Read @@ -1797,7 +2008,14 @@ func (n *TagNode) AddColumn(col int) { // String tag to text func (n *TagNode) String() string { - return fmt.Sprintf("%s %s", n.Start.Value, n.Value.String()) + value := n.Value.String() + if s, ok := n.Value.(*SequenceNode); ok && !s.IsFlowStyle { + return fmt.Sprintf("%s\n%s", n.Start.Value, value) + } else if m, ok := n.Value.(*MappingNode); ok && !m.IsFlowStyle { + return fmt.Sprintf("%s\n%s", n.Start.Value, value) + } + + return fmt.Sprintf("%s %s", n.Start.Value, value) } // MarshalYAML encodes to a YAML text @@ -1805,6 +2023,26 @@ func (n *TagNode) MarshalYAML() ([]byte, error) { return []byte(n.String()), nil } +// IsMergeKey returns whether it is a MergeKey node. +func (n *TagNode) IsMergeKey() bool { + if n.Value == nil { + return false + } + key, ok := n.Value.(MapKeyNode) + if !ok { + return false + } + return key.IsMergeKey() +} + +func (n *TagNode) ArrayRange() *ArrayNodeIter { + arr, ok := n.Value.(ArrayNode) + if !ok { + return nil + } + return arr.ArrayRange() +} + // CommentNode type of comment node type CommentNode struct { *BaseNode @@ -1882,10 +2120,13 @@ func (n *CommentGroupNode) StringWithSpace(col int) string { values := []string{} space := strings.Repeat(" ", col) for _, comment := range n.Comments { + space := space + if checkLineBreak(comment.Token) { + space = fmt.Sprintf("%s%s", "\n", space) + } values = append(values, space+comment.String()) } return strings.Join(values, "\n") - } // MarshalYAML encodes to a YAML text @@ -1932,7 +2173,10 @@ func Walk(v Visitor, node Node) { Walk(v, n.Value) case *DirectiveNode: walkComment(v, n.BaseNode) - Walk(v, n.Value) + Walk(v, n.Name) + for _, value := range n.Values { + Walk(v, value) + } case *TagNode: walkComment(v, n.BaseNode) Walk(v, n.Value) @@ -2018,7 +2262,14 @@ func (f *parentFinder) walk(parent, node Node) Node { case *LiteralNode: return f.walk(node, n.Value) case *DirectiveNode: - return f.walk(node, n.Value) + if found := f.walk(node, n.Name); found != nil { + return found + } + for _, value := range n.Values { + if found := f.walk(node, value); found != nil { + return found + } + } case *TagNode: return f.walk(node, n.Value) case *DocumentNode: @@ -2094,10 +2345,10 @@ func Merge(dst Node, src Node) error { err := &ErrInvalidMergeType{dst: dst, src: src} switch dst.Type() { case DocumentType: - node := dst.(*DocumentNode) + node, _ := dst.(*DocumentNode) return Merge(node.Body, src) case MappingType: - node := dst.(*MappingNode) + node, _ := dst.(*MappingNode) target, ok := src.(*MappingNode) if !ok { return err @@ -2105,7 +2356,7 @@ func Merge(dst Node, src Node) error { node.Merge(target) return nil case SequenceType: - node := dst.(*SequenceNode) + node, _ := dst.(*SequenceNode) target, ok := src.(*SequenceNode) if !ok { return err diff --git a/vendor/github.com/goccy/go-yaml/printer/color.go b/vendor/github.com/goccy/go-yaml/printer/color.go new file mode 100644 index 0000000000..79d7d7c6cc --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/printer/color.go @@ -0,0 +1,83 @@ +// This source inspired by https://github.com/fatih/color. +package printer + +import ( + "fmt" + "strings" +) + +type ColorAttribute int + +const ( + ColorReset ColorAttribute = iota + ColorBold + ColorFaint + ColorItalic + ColorUnderline + ColorBlinkSlow + ColorBlinkRapid + ColorReverseVideo + ColorConcealed + ColorCrossedOut +) + +const ( + ColorFgHiBlack ColorAttribute = iota + 90 + ColorFgHiRed + ColorFgHiGreen + ColorFgHiYellow + ColorFgHiBlue + ColorFgHiMagenta + ColorFgHiCyan + ColorFgHiWhite +) + +const ( + ColorResetBold ColorAttribute = iota + 22 + ColorResetItalic + ColorResetUnderline + ColorResetBlinking + + ColorResetReversed + ColorResetConcealed + ColorResetCrossedOut +) + +const escape = "\x1b" + +var colorResetMap = map[ColorAttribute]ColorAttribute{ + ColorBold: ColorResetBold, + ColorFaint: ColorResetBold, + ColorItalic: ColorResetItalic, + ColorUnderline: ColorResetUnderline, + ColorBlinkSlow: ColorResetBlinking, + ColorBlinkRapid: ColorResetBlinking, + ColorReverseVideo: ColorResetReversed, + ColorConcealed: ColorResetConcealed, + ColorCrossedOut: ColorResetCrossedOut, +} + +func format(attrs ...ColorAttribute) string { + format := make([]string, 0, len(attrs)) + for _, attr := range attrs { + format = append(format, fmt.Sprint(attr)) + } + return fmt.Sprintf("%s[%sm", escape, strings.Join(format, ";")) +} + +func unformat(attrs ...ColorAttribute) string { + format := make([]string, len(attrs)) + for _, attr := range attrs { + v := fmt.Sprint(ColorReset) + reset, exists := colorResetMap[attr] + if exists { + v = fmt.Sprint(reset) + } + format = append(format, v) + } + return fmt.Sprintf("%s[%sm", escape, strings.Join(format, ";")) +} + +func colorize(msg string, attrs ...ColorAttribute) string { + return format(attrs...) + msg + unformat(attrs...) +} diff --git a/vendor/github.com/goccy/go-yaml/printer/printer.go b/vendor/github.com/goccy/go-yaml/printer/printer.go index d5e25dc919..9346983da2 100644 --- a/vendor/github.com/goccy/go-yaml/printer/printer.go +++ b/vendor/github.com/goccy/go-yaml/printer/printer.go @@ -5,7 +5,6 @@ import ( "math" "strings" - "github.com/fatih/color" "github.com/goccy/go-yaml/ast" "github.com/goccy/go-yaml/token" ) @@ -29,6 +28,7 @@ type Printer struct { Bool PrintFunc String PrintFunc Number PrintFunc + Comment PrintFunc } func defaultLineNumberFormat(num int) string { @@ -82,6 +82,11 @@ func (p *Printer) property(tk *token.Token) *Property { return p.Number() } return prop + case token.CommentType: + if p.Comment != nil { + return p.Comment() + } + return prop default: } return prop @@ -144,47 +149,47 @@ func (p *Printer) PrintNode(node ast.Node) []byte { return []byte(fmt.Sprintf("%+v\n", node)) } -const escape = "\x1b" - -func format(attr color.Attribute) string { - return fmt.Sprintf("%s[%dm", escape, attr) -} - func (p *Printer) setDefaultColorSet() { p.Bool = func() *Property { return &Property{ - Prefix: format(color.FgHiMagenta), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiMagenta), + Suffix: format(ColorReset), } } p.Number = func() *Property { return &Property{ - Prefix: format(color.FgHiMagenta), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiMagenta), + Suffix: format(ColorReset), } } p.MapKey = func() *Property { return &Property{ - Prefix: format(color.FgHiCyan), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiCyan), + Suffix: format(ColorReset), } } p.Anchor = func() *Property { return &Property{ - Prefix: format(color.FgHiYellow), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiYellow), + Suffix: format(ColorReset), } } p.Alias = func() *Property { return &Property{ - Prefix: format(color.FgHiYellow), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiYellow), + Suffix: format(ColorReset), } } p.String = func() *Property { return &Property{ - Prefix: format(color.FgHiGreen), - Suffix: format(color.Reset), + Prefix: format(ColorFgHiGreen), + Suffix: format(ColorReset), + } + } + p.Comment = func() *Property { + return &Property{ + Prefix: format(ColorFgHiBlack), + Suffix: format(ColorReset), } } } @@ -192,9 +197,9 @@ func (p *Printer) setDefaultColorSet() { func (p *Printer) PrintErrorMessage(msg string, isColored bool) string { if isColored { return fmt.Sprintf("%s%s%s", - format(color.FgHiRed), + format(ColorFgHiRed), msg, - format(color.Reset), + format(ColorReset), ) } return msg @@ -246,10 +251,7 @@ func (p *Printer) isNewLineLastChar(s string) bool { } func (p *Printer) printBeforeTokens(tk *token.Token, minLine, extLine int) token.Tokens { - for { - if tk.Prev == nil { - break - } + for tk.Prev != nil { if tk.Prev.Position.Line < minLine { break } @@ -317,8 +319,7 @@ func (p *Printer) setupErrorTokenFormat(annotateLine int, isColored bool) { p.LineNumber = true p.LineNumberFormat = func(num int) string { if isColored { - fn := color.New(color.Bold, color.FgHiWhite).SprintFunc() - return fn(prefix(annotateLine, num)) + return colorize(prefix(annotateLine, num), ColorBold, ColorFgHiWhite) } return prefix(annotateLine, num) } diff --git a/vendor/github.com/goccy/go-yaml/scanner/context.go b/vendor/github.com/goccy/go-yaml/scanner/context.go index 09d0a2daaa..4f3250be8a 100644 --- a/vendor/github.com/goccy/go-yaml/scanner/context.go +++ b/vendor/github.com/goccy/go-yaml/scanner/context.go @@ -1,13 +1,14 @@ package scanner import ( + "errors" + "strconv" + "strings" "sync" "github.com/goccy/go-yaml/token" ) -const whitespace = ' ' - // Context context at scanning type Context struct { idx int @@ -18,11 +19,20 @@ type Context struct { buf []rune obuf []rune tokens token.Tokens - isRawFolded bool - isLiteral bool - isFolded bool - isSingleLine bool - literalOpt string + mstate *MultiLineState +} + +type MultiLineState struct { + opt string + firstLineIndentColumn int + prevLineIndentColumn int + lineIndentColumn int + lastNotSpaceOnlyLineIndentColumn int + spaceOnlyIndentColumn int + foldedNewLine bool + isRawFolded bool + isLiteral bool + isFolded bool } var ( @@ -35,14 +45,13 @@ var ( func createContext() *Context { return &Context{ - idx: 0, - tokens: token.Tokens{}, - isSingleLine: true, + idx: 0, + tokens: token.Tokens{}, } } func newContext(src []rune) *Context { - ctx := ctxPool.Get().(*Context) + ctx, _ := ctxPool.Get().(*Context) ctx.reset(src) return ctx } @@ -51,17 +60,18 @@ func (c *Context) release() { ctxPool.Put(c) } +func (c *Context) clear() { + c.resetBuffer() + c.mstate = nil +} + func (c *Context) reset(src []rune) { c.idx = 0 c.size = len(src) c.src = src c.tokens = c.tokens[:0] c.resetBuffer() - c.isRawFolded = false - c.isSingleLine = true - c.isLiteral = false - c.isFolded = false - c.literalOpt = "" + c.mstate = nil } func (c *Context) resetBuffer() { @@ -71,15 +81,185 @@ func (c *Context) resetBuffer() { c.notSpaceOrgCharPos = 0 } -func (c *Context) isSaveIndentMode() bool { - return c.isLiteral || c.isFolded || c.isRawFolded +func (c *Context) breakMultiLine() { + c.mstate = nil +} + +func (c *Context) getMultiLineState() *MultiLineState { + return c.mstate +} + +func (c *Context) setLiteral(lastDelimColumn int, opt string) { + mstate := &MultiLineState{ + isLiteral: true, + opt: opt, + } + indent := firstLineIndentColumnByOpt(opt) + if indent > 0 { + mstate.firstLineIndentColumn = lastDelimColumn + indent + } + c.mstate = mstate +} + +func (c *Context) setFolded(lastDelimColumn int, opt string) { + mstate := &MultiLineState{ + isFolded: true, + opt: opt, + } + indent := firstLineIndentColumnByOpt(opt) + if indent > 0 { + mstate.firstLineIndentColumn = lastDelimColumn + indent + } + c.mstate = mstate +} + +func (c *Context) setRawFolded(column int) { + mstate := &MultiLineState{ + isRawFolded: true, + } + mstate.updateIndentColumn(column) + c.mstate = mstate +} + +func firstLineIndentColumnByOpt(opt string) int { + opt = strings.TrimPrefix(opt, "-") + opt = strings.TrimPrefix(opt, "+") + opt = strings.TrimSuffix(opt, "-") + opt = strings.TrimSuffix(opt, "+") + i, _ := strconv.ParseInt(opt, 10, 64) + return int(i) +} + +func (s *MultiLineState) lastDelimColumn() int { + if s.firstLineIndentColumn == 0 { + return 0 + } + return s.firstLineIndentColumn - 1 +} + +func (s *MultiLineState) updateIndentColumn(column int) { + if s.firstLineIndentColumn == 0 { + s.firstLineIndentColumn = column + } + if s.lineIndentColumn == 0 { + s.lineIndentColumn = column + } +} + +func (s *MultiLineState) updateSpaceOnlyIndentColumn(column int) { + if s.firstLineIndentColumn != 0 { + return + } + s.spaceOnlyIndentColumn = column +} + +func (s *MultiLineState) validateIndentAfterSpaceOnly(column int) error { + if s.firstLineIndentColumn != 0 { + return nil + } + if s.spaceOnlyIndentColumn > column { + return errors.New("invalid number of indent is specified after space only") + } + return nil +} + +func (s *MultiLineState) validateIndentColumn() error { + if firstLineIndentColumnByOpt(s.opt) == 0 { + return nil + } + if s.firstLineIndentColumn > s.lineIndentColumn { + return errors.New("invalid number of indent is specified in the multi-line header") + } + return nil +} + +func (s *MultiLineState) updateNewLineState() { + s.prevLineIndentColumn = s.lineIndentColumn + if s.lineIndentColumn != 0 { + s.lastNotSpaceOnlyLineIndentColumn = s.lineIndentColumn + } + s.foldedNewLine = true + s.lineIndentColumn = 0 +} + +func (s *MultiLineState) isIndentColumn(column int) bool { + if s.firstLineIndentColumn == 0 { + return column == 1 + } + return s.firstLineIndentColumn > column +} + +func (s *MultiLineState) addIndent(ctx *Context, column int) { + if s.firstLineIndentColumn == 0 { + return + } + + // If the first line of the document has already been evaluated, the number is treated as the threshold, since the `firstLineIndentColumn` is a positive number. + if column < s.firstLineIndentColumn { + return + } + + // `c.foldedNewLine` is a variable that is set to true for every newline. + if !s.isLiteral && s.foldedNewLine { + s.foldedNewLine = false + } + // Since addBuf ignore space character, add to the buffer directly. + ctx.buf = append(ctx.buf, ' ') + ctx.notSpaceCharPos = len(ctx.buf) +} + +// updateNewLineInFolded if Folded or RawFolded context and the content on the current line starts at the same column as the previous line, +// treat the new-line-char as a space. +func (s *MultiLineState) updateNewLineInFolded(ctx *Context, column int) { + if s.isLiteral { + return + } + + // Folded or RawFolded. + + if !s.foldedNewLine { + return + } + var ( + lastChar rune + prevLastChar rune + ) + if len(ctx.buf) != 0 { + lastChar = ctx.buf[len(ctx.buf)-1] + } + if len(ctx.buf) > 1 { + prevLastChar = ctx.buf[len(ctx.buf)-2] + } + if s.lineIndentColumn == s.prevLineIndentColumn { + // --- + // > + // a + // b + if lastChar == '\n' { + ctx.buf[len(ctx.buf)-1] = ' ' + } + } else if s.prevLineIndentColumn == 0 && s.lastNotSpaceOnlyLineIndentColumn == column { + // if previous line is indent-space and new-line-char only, prevLineIndentColumn is zero. + // In this case, last new-line-char is removed. + // --- + // > + // a + // + // b + if lastChar == '\n' && prevLastChar == '\n' { + ctx.buf = ctx.buf[:len(ctx.buf)-1] + ctx.notSpaceCharPos = len(ctx.buf) + } + } + s.foldedNewLine = false +} + +func (s *MultiLineState) hasTrimAllEndNewlineOpt() bool { + return strings.HasPrefix(s.opt, "-") || strings.HasSuffix(s.opt, "-") || s.isRawFolded } -func (c *Context) breakLiteral() { - c.isLiteral = false - c.isRawFolded = false - c.isFolded = false - c.literalOpt = "" +func (s *MultiLineState) hasKeepAllEndNewlineOpt() bool { + return strings.HasPrefix(s.opt, "+") || strings.HasSuffix(s.opt, "+") } func (c *Context) addToken(tk *token.Token) { @@ -90,7 +270,7 @@ func (c *Context) addToken(tk *token.Token) { } func (c *Context) addBuf(r rune) { - if len(c.buf) == 0 && r == ' ' { + if len(c.buf) == 0 && (r == ' ' || r == '\t') { return } c.buf = append(c.buf, r) @@ -99,6 +279,16 @@ func (c *Context) addBuf(r rune) { } } +func (c *Context) addBufWithTab(r rune) { + if len(c.buf) == 0 && r == ' ' { + return + } + c.buf = append(c.buf, r) + if r != ' ' { + c.notSpaceCharPos = len(c.buf) + } +} + func (c *Context) addOriginBuf(r rune) { c.obuf = append(c.obuf, r) if r != ' ' && r != '\t' { @@ -106,7 +296,7 @@ func (c *Context) addOriginBuf(r rune) { } } -func (c *Context) removeRightSpaceFromBuf() int { +func (c *Context) removeRightSpaceFromBuf() { trimmedBuf := c.obuf[:c.notSpaceOrgCharPos] buflen := len(trimmedBuf) diff := len(c.obuf) - buflen @@ -114,11 +304,6 @@ func (c *Context) removeRightSpaceFromBuf() int { c.obuf = c.obuf[:buflen] c.buf = c.bufferedSrc() } - return diff -} - -func (c *Context) isDocument() bool { - return c.isLiteral || c.isFolded || c.isRawFolded } func (c *Context) isEOS() bool { @@ -126,7 +311,7 @@ func (c *Context) isEOS() bool { } func (c *Context) isNextEOS() bool { - return len(c.src)-1 <= c.idx+1 + return len(c.src) <= c.idx+1 } func (c *Context) next() bool { @@ -151,18 +336,6 @@ func (c *Context) currentChar() rune { return rune(0) } -func (c *Context) currentCharWithSkipWhitespace() rune { - idx := c.idx - for c.size > idx { - ch := c.src[idx] - if ch != whitespace { - return ch - } - idx++ - } - return rune(0) -} - func (c *Context) nextChar() rune { if c.size > c.idx+1 { return c.src[c.idx+1] @@ -186,19 +359,53 @@ func (c *Context) progress(num int) { c.idx += num } -func (c *Context) nextPos() int { - return c.idx + 1 -} - func (c *Context) existsBuffer() bool { return len(c.bufferedSrc()) != 0 } +func (c *Context) isMultiLine() bool { + return c.mstate != nil +} + func (c *Context) bufferedSrc() []rune { src := c.buf[:c.notSpaceCharPos] - if len(src) > 0 && src[len(src)-1] == '\n' && c.isDocument() && c.literalOpt == "-" { - // remove end '\n' character - src = src[:len(src)-1] + if c.isMultiLine() { + mstate := c.getMultiLineState() + // remove end '\n' character and trailing empty lines. + // https://yaml.org/spec/1.2.2/#8112-block-chomping-indicator + if mstate.hasTrimAllEndNewlineOpt() { + // If the '-' flag is specified, all trailing newline characters will be removed. + src = []rune(strings.TrimRight(string(src), "\n")) + } else if !mstate.hasKeepAllEndNewlineOpt() { + // Normally, all but one of the trailing newline characters are removed. + var newLineCharCount int + for i := len(src) - 1; i >= 0; i-- { + if src[i] == '\n' { + newLineCharCount++ + continue + } + break + } + removedNewLineCharCount := newLineCharCount - 1 + for removedNewLineCharCount > 0 { + src = []rune(strings.TrimSuffix(string(src), "\n")) + removedNewLineCharCount-- + } + } + + // If the text ends with a space character, remove all of them. + if mstate.hasTrimAllEndNewlineOpt() { + src = []rune(strings.TrimRight(string(src), " ")) + } + if string(src) == "\n" { + // If the content consists only of a newline, + // it can be considered as the document ending without any specified value, + // so it is treated as an empty string. + src = []rune{} + } + if mstate.hasKeepAllEndNewlineOpt() && len(src) == 0 { + src = []rune{'\n'} + } } return src } @@ -209,18 +416,34 @@ func (c *Context) bufferedToken(pos *token.Position) *token.Token { } source := c.bufferedSrc() if len(source) == 0 { + c.buf = c.buf[:0] // clear value's buffer only. return nil } var tk *token.Token - if c.isDocument() { + if c.isMultiLine() { tk = token.String(string(source), string(c.obuf), pos) } else { tk = token.New(string(source), string(c.obuf), pos) } + c.setTokenTypeByPrevTag(tk) c.resetBuffer() return tk } +func (c *Context) setTokenTypeByPrevTag(tk *token.Token) { + lastTk := c.lastToken() + if lastTk == nil { + return + } + if lastTk.Type != token.TagType { + return + } + tag := token.ReservedTagKeyword(lastTk.Value) + if _, exists := token.ReservedTagKeywordMap[tag]; !exists { + tk.Type = token.StringType + } +} + func (c *Context) lastToken() *token.Token { if len(c.tokens) != 0 { return c.tokens[len(c.tokens)-1] diff --git a/vendor/github.com/goccy/go-yaml/scanner/error.go b/vendor/github.com/goccy/go-yaml/scanner/error.go new file mode 100644 index 0000000000..3f5419af52 --- /dev/null +++ b/vendor/github.com/goccy/go-yaml/scanner/error.go @@ -0,0 +1,17 @@ +package scanner + +import "github.com/goccy/go-yaml/token" + +type InvalidTokenError struct { + Token *token.Token +} + +func (e *InvalidTokenError) Error() string { + return e.Token.Error +} + +func ErrInvalidToken(tk *token.Token) *InvalidTokenError { + return &InvalidTokenError{ + Token: tk, + } +} diff --git a/vendor/github.com/goccy/go-yaml/scanner/scanner.go b/vendor/github.com/goccy/go-yaml/scanner/scanner.go index ce9c6654ed..13a7ecc4d5 100644 --- a/vendor/github.com/goccy/go-yaml/scanner/scanner.go +++ b/vendor/github.com/goccy/go-yaml/scanner/scanner.go @@ -1,11 +1,13 @@ package scanner import ( + "errors" + "fmt" "io" + "strconv" "strings" "github.com/goccy/go-yaml/token" - "golang.org/x/xerrors" ) // IndentState state for indent @@ -25,20 +27,27 @@ const ( // Scanner holds the scanner's internal state while processing a given text. // It can be allocated as part of another data structure but must be initialized via Init before use. type Scanner struct { - source []rune - sourcePos int - sourceSize int - line int - column int - offset int - prevIndentLevel int - prevIndentNum int - prevIndentColumn int - docStartColumn int + source []rune + sourcePos int + sourceSize int + // line number. This number starts from 1. + line int + // column number. This number starts from 1. + column int + // offset represents the offset from the beginning of the source. + offset int + // lastDelimColumn is the last column needed to compare indent is retained. + lastDelimColumn int + // indentNum indicates the number of spaces used for indentation. + indentNum int + // prevLineIndentNum indicates the number of spaces used for indentation at previous line. + prevLineIndentNum int + // indentLevel indicates the level of indent depth. This value does not match the column value. indentLevel int - indentNum int isFirstCharAtLine bool isAnchor bool + isAlias bool + isDirective bool startedFlowSequenceNum int startedFlowMapNum int indentState IndentState @@ -64,7 +73,7 @@ func (s *Scanner) bufferedToken(ctx *Context) *token.Token { line := s.line column := s.column - len(ctx.buf) level := s.indentLevel - if ctx.isSaveIndentMode() { + if ctx.isMultiLine() { line -= s.newLineCount(ctx.buf) column = strings.Index(string(ctx.obuf), string(ctx.buf)) + 1 // Since we are in a literal, folded or raw folded @@ -86,30 +95,30 @@ func (s *Scanner) bufferedToken(ctx *Context) *token.Token { func (s *Scanner) progressColumn(ctx *Context, num int) { s.column += num s.offset += num - ctx.progress(num) + s.progress(ctx, num) +} + +func (s *Scanner) progressOnly(ctx *Context, num int) { + s.offset += num + s.progress(ctx, num) } func (s *Scanner) progressLine(ctx *Context) { + s.prevLineIndentNum = s.indentNum s.column = 1 s.line++ s.offset++ s.indentNum = 0 s.isFirstCharAtLine = true s.isAnchor = false - ctx.progress(1) + s.isAlias = false + s.isDirective = false + s.progress(ctx, 1) } -func (s *Scanner) isNeededKeepPreviousIndentNum(ctx *Context, c rune) bool { - if !s.isChangedToIndentStateUp() { - return false - } - if ctx.isDocument() { - return true - } - if c == '-' && ctx.existsBuffer() { - return true - } - return false +func (s *Scanner) progress(ctx *Context, num int) { + ctx.progress(num) + s.sourcePos += num } func (s *Scanner) isNewLineChar(c rune) bool { @@ -140,67 +149,50 @@ func (s *Scanner) newLineCount(src []rune) int { return cnt } -func (s *Scanner) updateIndentState(ctx *Context) { - indentNumBasedIndentState := s.indentState - if s.prevIndentNum < s.indentNum { - s.indentLevel = s.prevIndentLevel + 1 - indentNumBasedIndentState = IndentStateUp - } else if s.prevIndentNum == s.indentNum { - s.indentLevel = s.prevIndentLevel - indentNumBasedIndentState = IndentStateEqual - } else { - indentNumBasedIndentState = IndentStateDown - if s.prevIndentLevel > 0 { - s.indentLevel = s.prevIndentLevel - 1 - } - } - - if s.prevIndentColumn > 0 { - if s.prevIndentColumn < s.column { - s.indentState = IndentStateUp - } else if s.prevIndentColumn != s.column || indentNumBasedIndentState != IndentStateEqual { - // The following case ( current position is 'd' ), some variables becomes like here - // - prevIndentColumn: 1 of 'a' - // - indentNumBasedIndentState: IndentStateDown because d's indentNum(1) is less than c's indentNum(3). - // Therefore, s.prevIndentColumn(1) == s.column(1) is true, but we want to treat this as IndentStateDown. - // So, we look also current indentState value by the above prevIndentNum based logic, and determins finally indentState. - // --- - // a: - // b - // c - // d: e - // ^ - s.indentState = IndentStateDown - } else { - s.indentState = IndentStateEqual +func (s *Scanner) updateIndentLevel() { + if s.prevLineIndentNum < s.indentNum { + s.indentLevel++ + } else if s.prevLineIndentNum > s.indentNum { + if s.indentLevel > 0 { + s.indentLevel-- } + } +} + +func (s *Scanner) updateIndentState(ctx *Context) { + if s.lastDelimColumn == 0 { + return + } + + if s.lastDelimColumn < s.column { + s.indentState = IndentStateUp } else { - s.indentState = indentNumBasedIndentState + // If lastDelimColumn and s.column are the same, + // treat as Down state since it is the same column as delimiter. + s.indentState = IndentStateDown } } func (s *Scanner) updateIndent(ctx *Context, c rune) { - if s.isFirstCharAtLine && s.isNewLineChar(c) && ctx.isDocument() { + if s.isFirstCharAtLine && s.isNewLineChar(c) { return } if s.isFirstCharAtLine && c == ' ' { s.indentNum++ return } + if s.isFirstCharAtLine && c == '\t' { + // found tab indent. + // In this case, scanTab returns error. + return + } if !s.isFirstCharAtLine { s.indentState = IndentStateKeep return } + s.updateIndentLevel() s.updateIndentState(ctx) s.isFirstCharAtLine = false - if s.isNeededKeepPreviousIndentNum(ctx, c) { - return - } - if s.indentState != IndentStateUp { - s.prevIndentColumn = 0 - } - s.prevIndentNum = s.indentNum - s.prevIndentLevel = s.indentLevel } func (s *Scanner) isChangedToIndentStateDown() bool { @@ -211,20 +203,15 @@ func (s *Scanner) isChangedToIndentStateUp() bool { return s.indentState == IndentStateUp } -func (s *Scanner) isChangedToIndentStateEqual() bool { - return s.indentState == IndentStateEqual -} - func (s *Scanner) addBufferedTokenIfExists(ctx *Context) { ctx.addToken(s.bufferedToken(ctx)) } -func (s *Scanner) breakLiteral(ctx *Context) { - s.docStartColumn = 0 - ctx.breakLiteral() +func (s *Scanner) breakMultiLine(ctx *Context) { + ctx.breakMultiLine() } -func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanSingleQuote(ctx *Context) (*token.Token, error) { ctx.addOriginBuf('\'') srcpos := s.pos() startIndex := ctx.idx + 1 @@ -233,6 +220,7 @@ func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { value := []rune{} isFirstLineChar := false isNewLine := false + for idx := startIndex; idx < size; idx++ { if !isNewLine { s.progressColumn(ctx, 1) @@ -240,34 +228,67 @@ func (s *Scanner) scanSingleQuote(ctx *Context) (tk *token.Token, pos int) { isNewLine = false } c := src[idx] - pos = idx + 1 ctx.addOriginBuf(c) if s.isNewLineChar(c) { - value = append(value, ' ') + notSpaceIdx := -1 + for i := len(value) - 1; i >= 0; i-- { + if value[i] == ' ' { + continue + } + notSpaceIdx = i + break + } + if len(value) > notSpaceIdx { + value = value[:notSpaceIdx+1] + } + if isFirstLineChar { + value = append(value, '\n') + } else { + value = append(value, ' ') + } isFirstLineChar = true isNewLine = true s.progressLine(ctx) + if idx+1 < size { + if err := s.validateDocumentSeparatorMarker(ctx, src[idx+1:]); err != nil { + return nil, err + } + } continue - } else if c == ' ' && isFirstLineChar { + } else if isFirstLineChar && c == ' ' { + continue + } else if isFirstLineChar && c == '\t' { + if s.lastDelimColumn >= s.column { + return nil, ErrInvalidToken( + token.Invalid( + "tab character cannot be used for indentation in single-quoted text", + string(ctx.obuf), s.pos(), + ), + ) + } continue } else if c != '\'' { value = append(value, c) isFirstLineChar = false continue - } - if idx+1 < len(ctx.src) && ctx.src[idx+1] == '\'' { + } else if idx+1 < len(ctx.src) && ctx.src[idx+1] == '\'' { // '' handle as ' character value = append(value, c) ctx.addOriginBuf(c) idx++ + s.progressColumn(ctx, 1) continue } s.progressColumn(ctx, 1) - tk = token.SingleQuote(string(value), string(ctx.obuf), srcpos) - pos = idx - startIndex + 1 - return + return token.SingleQuote(string(value), string(ctx.obuf), srcpos), nil } - return + s.progressColumn(ctx, 1) + return nil, ErrInvalidToken( + token.Invalid( + "could not find end character of single-quoted text", + string(ctx.obuf), srcpos, + ), + ) } func hexToInt(b rune) int { @@ -288,7 +309,7 @@ func hexRunesToInt(b []rune) int { return sum } -func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanDoubleQuote(ctx *Context) (*token.Token, error) { ctx.addOriginBuf('"') srcpos := s.pos() startIndex := ctx.idx + 1 @@ -297,6 +318,7 @@ func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { value := []rune{} isFirstLineChar := false isNewLine := false + for idx := startIndex; idx < size; idx++ { if !isNewLine { s.progressColumn(ctx, 1) @@ -304,107 +326,253 @@ func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { isNewLine = false } c := src[idx] - pos = idx + 1 ctx.addOriginBuf(c) if s.isNewLineChar(c) { - value = append(value, ' ') + notSpaceIdx := -1 + for i := len(value) - 1; i >= 0; i-- { + if value[i] == ' ' { + continue + } + notSpaceIdx = i + break + } + if len(value) > notSpaceIdx { + value = value[:notSpaceIdx+1] + } + if isFirstLineChar { + value = append(value, '\n') + } else { + value = append(value, ' ') + } isFirstLineChar = true isNewLine = true s.progressLine(ctx) + if idx+1 < size { + if err := s.validateDocumentSeparatorMarker(ctx, src[idx+1:]); err != nil { + return nil, err + } + } continue - } else if c == ' ' && isFirstLineChar { + } else if isFirstLineChar && c == ' ' { + continue + } else if isFirstLineChar && c == '\t' { + if s.lastDelimColumn >= s.column { + return nil, ErrInvalidToken( + token.Invalid( + "tab character cannot be used for indentation in double-quoted text", + string(ctx.obuf), s.pos(), + ), + ) + } continue } else if c == '\\' { isFirstLineChar = false - if idx+1 < size { - nextChar := src[idx+1] - switch nextChar { - case 'b': - ctx.addOriginBuf(nextChar) - value = append(value, '\b') - idx++ - continue - case 'e': - ctx.addOriginBuf(nextChar) - value = append(value, '\x1B') - idx++ - continue - case 'f': - ctx.addOriginBuf(nextChar) - value = append(value, '\f') - idx++ - continue - case 'n': - ctx.addOriginBuf(nextChar) - value = append(value, '\n') - idx++ - continue - case 'v': - ctx.addOriginBuf(nextChar) - value = append(value, '\v') - idx++ - continue - case 'L': // LS (#x2028) - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xE2', '\x80', '\xA8'}...) - idx++ - continue - case 'N': // NEL (#x85) - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xC2', '\x85'}...) - idx++ - continue - case 'P': // PS (#x2029) - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xE2', '\x80', '\xA9'}...) - idx++ - continue - case '_': // #xA0 - ctx.addOriginBuf(nextChar) - value = append(value, []rune{'\xC2', '\xA0'}...) - idx++ - continue - case '"': + if idx+1 >= size { + value = append(value, c) + continue + } + nextChar := src[idx+1] + progress := 0 + switch nextChar { + case '0': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x00) + case 'a': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x07) + case 'b': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x08) + case 't': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x09) + case 'n': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0A) + case 'v': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0B) + case 'f': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0C) + case 'r': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x0D) + case 'e': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x1B) + case ' ': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x20) + case '"': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x22) + case '/': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x2F) + case '\\': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x5C) + case 'N': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x85) + case '_': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0xA0) + case 'L': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x2028) + case 'P': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, 0x2029) + case 'x': + if idx+3 >= size { + progress = 1 ctx.addOriginBuf(nextChar) value = append(value, nextChar) - idx++ - continue - case 'x': - if idx+3 >= size { - // TODO: need to return error - //err = xerrors.New("invalid escape character \\x") - return - } - codeNum := hexRunesToInt(src[idx+2 : idx+4]) + } else { + progress = 3 + codeNum := hexRunesToInt(src[idx+2 : idx+progress+1]) value = append(value, rune(codeNum)) - idx += 3 - continue - case 'u': - if idx+5 >= size { - // TODO: need to return error - //err = xerrors.New("invalid escape character \\u") - return + } + case 'u': + // \u0000 style must have 5 characters at least. + if idx+5 >= size { + return nil, ErrInvalidToken( + token.Invalid( + "not enough length for escaped UTF-16 character", + string(ctx.obuf), s.pos(), + ), + ) + } + progress = 5 + codeNum := hexRunesToInt(src[idx+2 : idx+6]) + + // handle surrogate pairs. + if codeNum >= 0xD800 && codeNum <= 0xDBFF { + high := codeNum + + // \u0000\u0000 style must have 11 characters at least. + if idx+11 >= size { + return nil, ErrInvalidToken( + token.Invalid( + "not enough length for escaped UTF-16 surrogate pair", + string(ctx.obuf), s.pos(), + ), + ) } - codeNum := hexRunesToInt(src[idx+2 : idx+6]) - value = append(value, rune(codeNum)) - idx += 5 - continue - case 'U': - if idx+9 >= size { - // TODO: need to return error - //err = xerrors.New("invalid escape character \\U") - return + + if src[idx+6] != '\\' || src[idx+7] != 'u' { + return nil, ErrInvalidToken( + token.Invalid( + "found unexpected character after high surrogate for UTF-16 surrogate pair", + string(ctx.obuf), s.pos(), + ), + ) } - codeNum := hexRunesToInt(src[idx+2 : idx+10]) - value = append(value, rune(codeNum)) - idx += 9 + + low := hexRunesToInt(src[idx+8 : idx+12]) + if low < 0xDC00 || low > 0xDFFF { + return nil, ErrInvalidToken( + token.Invalid( + "found unexpected low surrogate after high surrogate", + string(ctx.obuf), s.pos(), + ), + ) + } + codeNum = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000 + progress += 6 + } + value = append(value, rune(codeNum)) + case 'U': + // \U00000000 style must have 9 characters at least. + if idx+9 >= size { + return nil, ErrInvalidToken( + token.Invalid( + "not enough length for escaped UTF-32 character", + string(ctx.obuf), s.pos(), + ), + ) + } + progress = 9 + codeNum := hexRunesToInt(src[idx+2 : idx+10]) + value = append(value, rune(codeNum)) + case '\n': + isFirstLineChar = true + isNewLine = true + ctx.addOriginBuf(nextChar) + s.progressColumn(ctx, 1) + s.progressLine(ctx) + idx++ + continue + case '\r': + isFirstLineChar = true + isNewLine = true + ctx.addOriginBuf(nextChar) + s.progressLine(ctx) + progress = 1 + // Skip \n after \r in CRLF sequences + if idx+2 < size && src[idx+2] == '\n' { + ctx.addOriginBuf('\n') + progress = 2 + } + case '\t': + progress = 1 + ctx.addOriginBuf(nextChar) + value = append(value, nextChar) + default: + s.progressColumn(ctx, 1) + return nil, ErrInvalidToken( + token.Invalid( + fmt.Sprintf("found unknown escape character %q", nextChar), + string(ctx.obuf), s.pos(), + ), + ) + } + idx += progress + s.progressColumn(ctx, progress) + continue + } else if c == '\t' { + var ( + foundNotSpaceChar bool + progress int + ) + for i := idx + 1; i < size; i++ { + if src[i] == ' ' || src[i] == '\t' { + progress++ continue - case '\\': - ctx.addOriginBuf(nextChar) - idx++ } + if s.isNewLineChar(src[i]) { + break + } + foundNotSpaceChar = true + } + if foundNotSpaceChar { + value = append(value, c) + if src[idx+1] != '"' { + s.progressColumn(ctx, 1) + } + } else { + idx += progress + s.progressColumn(ctx, progress) } - value = append(value, c) continue } else if c != '"' { value = append(value, c) @@ -412,18 +580,86 @@ func (s *Scanner) scanDoubleQuote(ctx *Context) (tk *token.Token, pos int) { continue } s.progressColumn(ctx, 1) - tk = token.DoubleQuote(string(value), string(ctx.obuf), srcpos) - pos = idx - startIndex + 1 - return + return token.DoubleQuote(string(value), string(ctx.obuf), srcpos), nil + } + s.progressColumn(ctx, 1) + return nil, ErrInvalidToken( + token.Invalid( + "could not find end character of double-quoted text", + string(ctx.obuf), srcpos, + ), + ) +} + +func (s *Scanner) validateDocumentSeparatorMarker(ctx *Context, src []rune) error { + if s.foundDocumentSeparatorMarker(src) { + return ErrInvalidToken( + token.Invalid("found unexpected document separator", string(ctx.obuf), s.pos()), + ) } - return + return nil } -func (s *Scanner) scanQuote(ctx *Context, ch rune) (tk *token.Token, pos int) { +func (s *Scanner) foundDocumentSeparatorMarker(src []rune) bool { + if len(src) < 3 { + return false + } + var marker string + if len(src) == 3 { + marker = string(src) + } else { + marker = strings.TrimRightFunc(string(src[:4]), func(r rune) bool { + return r == ' ' || r == '\t' || r == '\n' || r == '\r' + }) + } + return marker == "---" || marker == "..." +} + +func (s *Scanner) scanQuote(ctx *Context, ch rune) (bool, error) { + if ctx.existsBuffer() { + return false, nil + } if ch == '\'' { - return s.scanSingleQuote(ctx) + tk, err := s.scanSingleQuote(ctx) + if err != nil { + return false, err + } + ctx.addToken(tk) + } else { + tk, err := s.scanDoubleQuote(ctx) + if err != nil { + return false, err + } + ctx.addToken(tk) + } + ctx.clear() + return true, nil +} + +func (s *Scanner) scanWhiteSpace(ctx *Context) bool { + if ctx.isMultiLine() { + return false + } + if !s.isAnchor && !s.isDirective && !s.isAlias && !s.isFirstCharAtLine { + return false + } + + if s.isFirstCharAtLine { + s.progressColumn(ctx, 1) + ctx.addOriginBuf(' ') + return true + } + if s.isDirective { + s.addBufferedTokenIfExists(ctx) + s.progressColumn(ctx, 1) + ctx.addOriginBuf(' ') + return true } - return s.scanDoubleQuote(ctx) + + s.addBufferedTokenIfExists(ctx) + s.isAnchor = false + s.isAlias = false + return true } func (s *Scanner) isMergeKey(ctx *Context) bool { @@ -450,156 +686,169 @@ func (s *Scanner) isMergeKey(ctx *Context) bool { return false } -func (s *Scanner) scanTag(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanTag(ctx *Context) (bool, error) { + if ctx.existsBuffer() || s.isDirective { + return false, nil + } + ctx.addOriginBuf('!') - ctx.progress(1) // skip '!' character + s.progress(ctx, 1) // skip '!' character + + var progress int for idx, c := range ctx.src[ctx.idx:] { - pos = idx + 1 - ctx.addOriginBuf(c) + progress = idx + 1 switch c { - case ' ', '\n', '\r': + case ' ': + ctx.addOriginBuf(c) value := ctx.source(ctx.idx-1, ctx.idx+idx) - tk = token.Tag(value, string(ctx.obuf), s.pos()) - pos = len([]rune(value)) - return + ctx.addToken(token.Tag(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, len([]rune(value))) + ctx.clear() + return true, nil + case ',': + if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { + value := ctx.source(ctx.idx-1, ctx.idx+idx) + ctx.addToken(token.Tag(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, len([]rune(value))-1) // progress column before collect-entry for scanning it at scanFlowEntry function. + ctx.clear() + return true, nil + } else { + ctx.addOriginBuf(c) + } + case '\n', '\r': + ctx.addOriginBuf(c) + value := ctx.source(ctx.idx-1, ctx.idx+idx) + ctx.addToken(token.Tag(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, len([]rune(value))-1) // progress column before new-line-char for scanning new-line-char at scanNewLine function. + ctx.clear() + return true, nil + case '{', '}': + ctx.addOriginBuf(c) + s.progressColumn(ctx, progress) + invalidTk := token.Invalid(fmt.Sprintf("found invalid tag character %q", c), string(ctx.obuf), s.pos()) + return false, ErrInvalidToken(invalidTk) + default: + ctx.addOriginBuf(c) } } - return + s.progressColumn(ctx, progress) + ctx.clear() + return true, nil } -func (s *Scanner) scanComment(ctx *Context) (tk *token.Token, pos int) { +func (s *Scanner) scanComment(ctx *Context) bool { + if ctx.existsBuffer() { + c := ctx.previousChar() + if c != ' ' && c != '\t' && !s.isNewLineChar(c) { + return false + } + } + + s.addBufferedTokenIfExists(ctx) ctx.addOriginBuf('#') - ctx.progress(1) // skip '#' character + s.progress(ctx, 1) // skip '#' character + for idx, c := range ctx.src[ctx.idx:] { - pos = idx + 1 ctx.addOriginBuf(c) - switch c { - case '\n', '\r': - if ctx.previousChar() == '\\' { - continue - } - value := ctx.source(ctx.idx, ctx.idx+idx) - tk = token.Comment(value, string(ctx.obuf), s.pos()) - pos = len([]rune(value)) + 1 - return + if !s.isNewLineChar(c) { + continue + } + if ctx.previousChar() == '\\' { + continue } + value := ctx.source(ctx.idx, ctx.idx+idx) + progress := len([]rune(value)) + ctx.addToken(token.Comment(value, string(ctx.obuf), s.pos())) + s.progressColumn(ctx, progress) + s.progressLine(ctx) + ctx.clear() + return true } // document ends with comment. value := string(ctx.src[ctx.idx:]) - tk = token.Comment(value, string(ctx.obuf), s.pos()) - pos = len([]rune(value)) + 1 - return -} - -func trimCommentFromLiteralOpt(text string) (string, error) { - idx := strings.Index(text, "#") - if idx < 0 { - return text, nil - } - if idx == 0 { - return "", xerrors.New("invalid literal header") - } - return text[:idx-1], nil + ctx.addToken(token.Comment(value, string(ctx.obuf), s.pos())) + progress := len([]rune(value)) + s.progressColumn(ctx, progress) + s.progressLine(ctx) + ctx.clear() + return true } -func (s *Scanner) scanLiteral(ctx *Context, c rune) { +func (s *Scanner) scanMultiLine(ctx *Context, c rune) error { + state := ctx.getMultiLineState() ctx.addOriginBuf(c) if ctx.isEOS() { - if ctx.isLiteral { + if s.isFirstCharAtLine && c == ' ' { + state.addIndent(ctx, s.column) + } else { ctx.addBuf(c) } + state.updateIndentColumn(s.column) + if err := state.validateIndentColumn(); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return ErrInvalidToken(invalidTk) + } value := ctx.bufferedSrc() ctx.addToken(token.String(string(value), string(ctx.obuf), s.pos())) - ctx.resetBuffer() + ctx.clear() s.progressColumn(ctx, 1) } else if s.isNewLineChar(c) { - if ctx.isLiteral { - ctx.addBuf(c) - } else { - ctx.addBuf(' ') - } + ctx.addBuf(c) + state.updateSpaceOnlyIndentColumn(s.column - 1) + state.updateNewLineState() s.progressLine(ctx) - } else if s.isFirstCharAtLine && c == ' ' { - if 0 < s.docStartColumn && s.docStartColumn <= s.column { - ctx.addBuf(c) + if ctx.next() { + if s.foundDocumentSeparatorMarker(ctx.src[ctx.idx:]) { + value := ctx.bufferedSrc() + ctx.addToken(token.String(string(value), string(ctx.obuf), s.pos())) + ctx.clear() + s.breakMultiLine(ctx) + } } + } else if s.isFirstCharAtLine && c == ' ' { + state.addIndent(ctx, s.column) + s.progressColumn(ctx, 1) + } else if s.isFirstCharAtLine && c == '\t' && state.isIndentColumn(s.column) { + err := ErrInvalidToken( + token.Invalid( + "found a tab character where an indentation space is expected", + string(ctx.obuf), s.pos(), + ), + ) + s.progressColumn(ctx, 1) + return err + } else if c == '\t' && !state.isIndentColumn(s.column) { + ctx.addBufWithTab(c) s.progressColumn(ctx, 1) } else { - if s.docStartColumn == 0 { - s.docStartColumn = s.column + if err := state.validateIndentAfterSpaceOnly(s.column); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return ErrInvalidToken(invalidTk) } - ctx.addBuf(c) - s.progressColumn(ctx, 1) - } -} - -func (s *Scanner) scanLiteralHeader(ctx *Context) (pos int, err error) { - header := ctx.currentChar() - ctx.addOriginBuf(header) - ctx.progress(1) // skip '|' or '>' character - for idx, c := range ctx.src[ctx.idx:] { - pos = idx - ctx.addOriginBuf(c) - switch c { - case '\n', '\r': - value := ctx.source(ctx.idx, ctx.idx+idx) - opt := strings.TrimRight(value, " ") - orgOptLen := len(opt) - opt, err = trimCommentFromLiteralOpt(opt) - if err != nil { - return - } - switch opt { - case "", "+", "-", - "0", "1", "2", "3", "4", "5", "6", "7", "8", "9": - hasComment := len(opt) < orgOptLen - if header == '|' { - if hasComment { - commentLen := orgOptLen - len(opt) - headerPos := strings.Index(string(ctx.obuf), "|") - litBuf := ctx.obuf[:len(ctx.obuf)-commentLen-headerPos] - commentBuf := ctx.obuf[len(litBuf):] - ctx.addToken(token.Literal("|"+opt, string(litBuf), s.pos())) - s.column += len(litBuf) - s.offset += len(litBuf) - commentHeader := strings.Index(value, "#") - ctx.addToken(token.Comment(string(value[commentHeader+1:]), string(commentBuf), s.pos())) - } else { - ctx.addToken(token.Literal("|"+opt, string(ctx.obuf), s.pos())) - } - ctx.isLiteral = true - } else if header == '>' { - if hasComment { - commentLen := orgOptLen - len(opt) - headerPos := strings.Index(string(ctx.obuf), ">") - foldedBuf := ctx.obuf[:len(ctx.obuf)-commentLen-headerPos] - commentBuf := ctx.obuf[len(foldedBuf):] - ctx.addToken(token.Folded(">"+opt, string(foldedBuf), s.pos())) - s.column += len(foldedBuf) - s.offset += len(foldedBuf) - commentHeader := strings.Index(value, "#") - ctx.addToken(token.Comment(string(value[commentHeader+1:]), string(commentBuf), s.pos())) - } else { - ctx.addToken(token.Folded(">"+opt, string(ctx.obuf), s.pos())) - } - ctx.isFolded = true - } - s.indentState = IndentStateKeep - ctx.resetBuffer() - ctx.literalOpt = opt - return - } - break + state.updateIndentColumn(s.column) + if err := state.validateIndentColumn(); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return ErrInvalidToken(invalidTk) + } + if col := state.lastDelimColumn(); col > 0 { + s.lastDelimColumn = col } + state.updateNewLineInFolded(ctx, s.column) + ctx.addBufWithTab(c) + s.progressColumn(ctx, 1) } - err = xerrors.New("invalid literal header") - return + return nil } func (s *Scanner) scanNewLine(ctx *Context, c rune) { if len(ctx.buf) > 0 && s.savedPos == nil { + bufLen := len(ctx.bufferedSrc()) s.savedPos = s.pos() - s.savedPos.Column -= len(ctx.bufferedSrc()) + s.savedPos.Column -= bufLen + s.savedPos.Offset -= bufLen } // if the following case, origin buffer has unnecessary two spaces. @@ -607,268 +856,621 @@ func (s *Scanner) scanNewLine(ctx *Context, c rune) { // --- // a:[space][space] // b: c - removedNum := ctx.removeRightSpaceFromBuf() - if removedNum > 0 { - s.column -= removedNum - s.offset -= removedNum - if s.savedPos != nil { - s.savedPos.Column -= removedNum - } + ctx.removeRightSpaceFromBuf() + + // There is no problem that we ignore CR which followed by LF and normalize it to LF, because of following YAML1.2 spec. + // > Line breaks inside scalar content must be normalized by the YAML processor. Each such line break must be parsed into a single line feed character. + // > Outside scalar content, YAML allows any line break to be used to terminate lines. + // > -- https://yaml.org/spec/1.2/spec.html + if c == '\r' && ctx.nextChar() == '\n' { + ctx.addOriginBuf('\r') + s.progress(ctx, 1) + s.offset++ + c = '\n' } if ctx.isEOS() { s.addBufferedTokenIfExists(ctx) - } else if s.isAnchor { + } else if s.isAnchor || s.isAlias || s.isDirective { s.addBufferedTokenIfExists(ctx) } - ctx.addBuf(' ') + if ctx.existsBuffer() && s.isFirstCharAtLine { + if ctx.buf[len(ctx.buf)-1] == ' ' { + ctx.buf[len(ctx.buf)-1] = '\n' + } else { + ctx.buf = append(ctx.buf, '\n') + } + } else { + ctx.addBuf(' ') + } + ctx.addOriginBuf(c) + s.progressLine(ctx) +} + +func (s *Scanner) isFlowMode() bool { + if s.startedFlowSequenceNum > 0 { + return true + } + if s.startedFlowMapNum > 0 { + return true + } + return false +} + +func (s *Scanner) scanFlowMapStart(ctx *Context) bool { + if ctx.existsBuffer() && !s.isFlowMode() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('{') + ctx.addToken(token.MappingStart(string(ctx.obuf), s.pos())) + s.startedFlowMapNum++ + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowMapEnd(ctx *Context) bool { + if s.startedFlowMapNum <= 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('}') + ctx.addToken(token.MappingEnd(string(ctx.obuf), s.pos())) + s.startedFlowMapNum-- + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowArrayStart(ctx *Context) bool { + if ctx.existsBuffer() && !s.isFlowMode() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('[') + ctx.addToken(token.SequenceStart(string(ctx.obuf), s.pos())) + s.startedFlowSequenceNum++ + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowArrayEnd(ctx *Context) bool { + if ctx.existsBuffer() && s.startedFlowSequenceNum <= 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf(']') + ctx.addToken(token.SequenceEnd(string(ctx.obuf), s.pos())) + s.startedFlowSequenceNum-- + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanFlowEntry(ctx *Context, c rune) bool { + if s.startedFlowSequenceNum <= 0 && s.startedFlowMapNum <= 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) ctx.addOriginBuf(c) - ctx.isSingleLine = false + ctx.addToken(token.CollectEntry(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanMapDelim(ctx *Context) (bool, error) { + nc := ctx.nextChar() + if s.isDirective || s.isAnchor || s.isAlias { + return false, nil + } + if s.startedFlowMapNum <= 0 && nc != ' ' && nc != '\t' && !s.isNewLineChar(nc) && !ctx.isNextEOS() { + return false, nil + } + if s.startedFlowMapNum > 0 && nc == '/' { + // like http:// + return false, nil + } + if s.startedFlowMapNum > 0 { + tk := ctx.lastToken() + if tk != nil && tk.Type == token.MappingValueType { + return false, nil + } + } + + if strings.HasPrefix(strings.TrimPrefix(string(ctx.obuf), " "), "\t") && !strings.HasPrefix(string(ctx.buf), "\t") { + invalidTk := token.Invalid("tab character cannot use as a map key directly", string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return false, ErrInvalidToken(invalidTk) + } + + // mapping value + tk := s.bufferedToken(ctx) + if tk != nil { + s.lastDelimColumn = tk.Position.Column + ctx.addToken(tk) + } else if tk := ctx.lastToken(); tk != nil { + // If the map key is quote, the buffer does not exist because it has already been cut into tokens. + // Therefore, we need to check the last token. + if tk.Indicator == token.QuotedScalarIndicator { + s.lastDelimColumn = tk.Position.Column + } + } + ctx.addToken(token.MappingValue(s.pos())) + s.progressColumn(ctx, 1) + ctx.clear() + return true, nil +} + +func (s *Scanner) scanDocumentStart(ctx *Context) bool { + if s.indentNum != 0 { + return false + } + if s.column != 1 { + return false + } + if ctx.repeatNum('-') != 3 { + return false + } + if ctx.size > ctx.idx+3 { + c := ctx.src[ctx.idx+3] + if c != ' ' && c != '\t' && c != '\n' && c != '\r' { + return false + } + } + + s.addBufferedTokenIfExists(ctx) + ctx.addToken(token.DocumentHeader(string(ctx.obuf)+"---", s.pos())) + s.progressColumn(ctx, 3) + ctx.clear() + s.clearState() + return true +} + +func (s *Scanner) scanDocumentEnd(ctx *Context) bool { + if s.indentNum != 0 { + return false + } + if s.column != 1 { + return false + } + if ctx.repeatNum('.') != 3 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addToken(token.DocumentEnd(string(ctx.obuf)+"...", s.pos())) + s.progressColumn(ctx, 3) + ctx.clear() + return true +} + +func (s *Scanner) scanMergeKey(ctx *Context) bool { + if !s.isMergeKey(ctx) { + return false + } + + s.lastDelimColumn = s.column + ctx.addToken(token.MergeKey(string(ctx.obuf)+"<<", s.pos())) + s.progressColumn(ctx, 2) + ctx.clear() + return true +} + +func (s *Scanner) scanRawFoldedChar(ctx *Context) bool { + if !ctx.existsBuffer() { + return false + } + if !s.isChangedToIndentStateUp() { + return false + } + + ctx.setRawFolded(s.column) + ctx.addBuf('-') + ctx.addOriginBuf('-') + s.progressColumn(ctx, 1) + return true +} + +func (s *Scanner) scanSequence(ctx *Context) (bool, error) { + if ctx.existsBuffer() { + return false, nil + } + + nc := ctx.nextChar() + if nc != 0 && nc != ' ' && nc != '\t' && !s.isNewLineChar(nc) { + return false, nil + } + + if strings.HasPrefix(strings.TrimPrefix(string(ctx.obuf), " "), "\t") { + invalidTk := token.Invalid("tab character cannot use as a sequence delimiter", string(ctx.obuf), s.pos()) + s.progressColumn(ctx, 1) + return false, ErrInvalidToken(invalidTk) + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('-') + tk := token.SequenceEntry(string(ctx.obuf), s.pos()) + s.lastDelimColumn = tk.Position.Column + ctx.addToken(tk) + s.progressColumn(ctx, 1) + ctx.clear() + return true, nil +} + +func (s *Scanner) scanMultiLineHeader(ctx *Context) (bool, error) { + if ctx.existsBuffer() { + return false, nil + } + + if err := s.scanMultiLineHeaderOption(ctx); err != nil { + return false, err + } s.progressLine(ctx) + return true, nil } -func (s *Scanner) scan(ctx *Context) (pos int) { +func (s *Scanner) validateMultiLineHeaderOption(opt string) error { + if len(opt) == 0 { + return nil + } + orgOpt := opt + opt = strings.TrimPrefix(opt, "-") + opt = strings.TrimPrefix(opt, "+") + opt = strings.TrimSuffix(opt, "-") + opt = strings.TrimSuffix(opt, "+") + if len(opt) == 0 { + return nil + } + if opt == "0" { + return fmt.Errorf("invalid header option: %q", orgOpt) + } + i, err := strconv.ParseInt(opt, 10, 64) + if err != nil { + return fmt.Errorf("invalid header option: %q", orgOpt) + } + if i > 9 { + return fmt.Errorf("invalid header option: %q", orgOpt) + } + return nil +} + +func (s *Scanner) scanMultiLineHeaderOption(ctx *Context) error { + header := ctx.currentChar() + ctx.addOriginBuf(header) + s.progress(ctx, 1) // skip '|' or '>' character + + var progress int + for idx, c := range ctx.src[ctx.idx:] { + progress = idx + ctx.addOriginBuf(c) + if s.isNewLineChar(c) { + break + } + } + value := strings.TrimRight(ctx.source(ctx.idx, ctx.idx+progress), " ") + commentValueIndex := strings.Index(value, "#") + opt := value + if commentValueIndex > 0 { + opt = value[:commentValueIndex] + } + opt = strings.TrimRightFunc(opt, func(r rune) bool { + return r == ' ' || r == '\t' + }) + if len(opt) != 0 { + if err := s.validateMultiLineHeaderOption(opt); err != nil { + invalidTk := token.Invalid(err.Error(), string(ctx.obuf), s.pos()) + s.progressColumn(ctx, progress) + return ErrInvalidToken(invalidTk) + } + } + if s.column == 1 { + s.lastDelimColumn = 1 + } + + commentIndex := strings.Index(string(ctx.obuf), "#") + headerBuf := string(ctx.obuf) + if commentIndex > 0 { + headerBuf = headerBuf[:commentIndex] + } + switch header { + case '|': + ctx.addToken(token.Literal("|"+opt, headerBuf, s.pos())) + ctx.setLiteral(s.lastDelimColumn, opt) + case '>': + ctx.addToken(token.Folded(">"+opt, headerBuf, s.pos())) + ctx.setFolded(s.lastDelimColumn, opt) + } + if commentIndex > 0 { + comment := string(value[commentValueIndex+1:]) + s.offset += len(headerBuf) + s.column += len(headerBuf) + ctx.addToken(token.Comment(comment, string(ctx.obuf[len(headerBuf):]), s.pos())) + } + s.indentState = IndentStateKeep + ctx.resetBuffer() + s.progressColumn(ctx, progress) + return nil +} + +func (s *Scanner) scanMapKey(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + + nc := ctx.nextChar() + if nc != ' ' && nc != '\t' { + return false + } + + tk := token.MappingKey(s.pos()) + s.lastDelimColumn = tk.Position.Column + ctx.addToken(tk) + s.progressColumn(ctx, 1) + ctx.clear() + return true +} + +func (s *Scanner) scanDirective(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + if s.indentNum != 0 { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('%') + ctx.addToken(token.Directive(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + ctx.clear() + s.isDirective = true + return true +} + +func (s *Scanner) scanAnchor(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('&') + ctx.addToken(token.Anchor(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + s.isAnchor = true + ctx.clear() + return true +} + +func (s *Scanner) scanAlias(ctx *Context) bool { + if ctx.existsBuffer() { + return false + } + + s.addBufferedTokenIfExists(ctx) + ctx.addOriginBuf('*') + ctx.addToken(token.Alias(string(ctx.obuf), s.pos())) + s.progressColumn(ctx, 1) + s.isAlias = true + ctx.clear() + return true +} + +func (s *Scanner) scanReservedChar(ctx *Context, c rune) error { + if ctx.existsBuffer() { + return nil + } + + ctx.addBuf(c) + ctx.addOriginBuf(c) + err := ErrInvalidToken( + token.Invalid( + fmt.Sprintf("%q is a reserved character", c), + string(ctx.obuf), s.pos(), + ), + ) + s.progressColumn(ctx, 1) + ctx.clear() + return err +} + +func (s *Scanner) scanTab(ctx *Context, c rune) error { + if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { + // tabs character is allowed in flow mode. + return nil + } + + if !s.isFirstCharAtLine { + return nil + } + + ctx.addBuf(c) + ctx.addOriginBuf(c) + err := ErrInvalidToken( + token.Invalid("found character '\t' that cannot start any token", + string(ctx.obuf), s.pos(), + ), + ) + s.progressColumn(ctx, 1) + ctx.clear() + return err +} + +func (s *Scanner) scan(ctx *Context) error { for ctx.next() { - pos = ctx.nextPos() c := ctx.currentChar() + // First, change the IndentState. + // If the target character is the first character in a line, IndentState is Up/Down/Equal state. + // The second and subsequent letters are Keep. s.updateIndent(ctx, c) - if ctx.isDocument() { - if s.isChangedToIndentStateEqual() || - s.isChangedToIndentStateDown() { - s.addBufferedTokenIfExists(ctx) - s.breakLiteral(ctx) + + // If IndentState is down, tokens are split, so the buffer accumulated until that point needs to be cutted as a token. + if s.isChangedToIndentStateDown() { + s.addBufferedTokenIfExists(ctx) + } + if ctx.isMultiLine() { + if s.isChangedToIndentStateDown() { + if tk := ctx.lastToken(); tk != nil { + // If literal/folded content is empty, no string token is added. + // Therefore, add an empty string token. + // But if literal/folded token column is 1, it is invalid at down state. + if tk.Position.Column == 1 { + return ErrInvalidToken( + token.Invalid( + "could not find multi-line content", + string(ctx.obuf), s.pos(), + ), + ) + } + if tk.Type != token.StringType { + ctx.addToken(token.String("", "", s.pos())) + } + } + s.breakMultiLine(ctx) } else { - s.scanLiteral(ctx, c) + if err := s.scanMultiLine(ctx, c); err != nil { + return err + } continue } - } else if s.isChangedToIndentStateDown() { - s.addBufferedTokenIfExists(ctx) - } else if s.isChangedToIndentStateEqual() { - // if first character is new line character, buffer expect to raw folded literal - if len(ctx.obuf) > 0 && s.newLineCount(ctx.obuf) <= 1 { - // doesn't raw folded literal - s.addBufferedTokenIfExists(ctx) - } } switch c { case '{': - if !ctx.existsBuffer() { - ctx.addOriginBuf(c) - ctx.addToken(token.MappingStart(string(ctx.obuf), s.pos())) - s.startedFlowMapNum++ - s.progressColumn(ctx, 1) - return + if s.scanFlowMapStart(ctx) { + continue } case '}': - if !ctx.existsBuffer() || s.startedFlowMapNum > 0 { - ctx.addToken(s.bufferedToken(ctx)) - ctx.addOriginBuf(c) - ctx.addToken(token.MappingEnd(string(ctx.obuf), s.pos())) - s.startedFlowMapNum-- - s.progressColumn(ctx, 1) - return + if s.scanFlowMapEnd(ctx) { + continue } case '.': - if s.indentNum == 0 && s.column == 1 && ctx.repeatNum('.') == 3 { - ctx.addToken(token.DocumentEnd(string(ctx.obuf)+"...", s.pos())) - s.progressColumn(ctx, 3) - pos += 2 - return + if s.scanDocumentEnd(ctx) { + continue } case '<': - if s.isMergeKey(ctx) { - s.prevIndentColumn = s.column - ctx.addToken(token.MergeKey(string(ctx.obuf)+"<<", s.pos())) - s.progressColumn(ctx, 1) - pos++ - return + if s.scanMergeKey(ctx) { + continue } case '-': - if s.indentNum == 0 && s.column == 1 && ctx.repeatNum('-') == 3 { - s.addBufferedTokenIfExists(ctx) - ctx.addToken(token.DocumentHeader(string(ctx.obuf)+"---", s.pos())) - s.progressColumn(ctx, 3) - pos += 2 - return - } - if ctx.existsBuffer() && s.isChangedToIndentStateUp() { - // raw folded - ctx.isRawFolded = true - ctx.addBuf(c) - ctx.addOriginBuf(c) - s.progressColumn(ctx, 1) + if s.scanDocumentStart(ctx) { continue } - if ctx.existsBuffer() { - // '-' is literal - ctx.addBuf(c) - ctx.addOriginBuf(c) - s.progressColumn(ctx, 1) + if s.scanRawFoldedChar(ctx) { continue } - nc := ctx.nextChar() - if nc == ' ' || s.isNewLineChar(nc) { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - tk := token.SequenceEntry(string(ctx.obuf), s.pos()) - s.prevIndentColumn = tk.Position.Column - ctx.addToken(tk) - s.progressColumn(ctx, 1) - return + scanned, err := s.scanSequence(ctx) + if err != nil { + return err + } + if scanned { + continue } case '[': - if !ctx.existsBuffer() { - ctx.addOriginBuf(c) - ctx.addToken(token.SequenceStart(string(ctx.obuf), s.pos())) - s.startedFlowSequenceNum++ - s.progressColumn(ctx, 1) - return + if s.scanFlowArrayStart(ctx) { + continue } case ']': - if !ctx.existsBuffer() || s.startedFlowSequenceNum > 0 { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.SequenceEnd(string(ctx.obuf), s.pos())) - s.startedFlowSequenceNum-- - s.progressColumn(ctx, 1) - return + if s.scanFlowArrayEnd(ctx) { + continue } case ',': - if s.startedFlowSequenceNum > 0 || s.startedFlowMapNum > 0 { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.CollectEntry(string(ctx.obuf), s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanFlowEntry(ctx, c) { + continue } case ':': - nc := ctx.nextChar() - if s.startedFlowMapNum > 0 || nc == ' ' || s.isNewLineChar(nc) || ctx.isNextEOS() { - // mapping value - tk := s.bufferedToken(ctx) - if tk != nil { - s.prevIndentColumn = tk.Position.Column - ctx.addToken(tk) - } else if tk := ctx.lastToken(); tk != nil { - // If the map key is quote, the buffer does not exist because it has already been cut into tokens. - // Therefore, we need to check the last token. - if tk.Indicator == token.QuotedScalarIndicator { - s.prevIndentColumn = tk.Position.Column - } - } - ctx.addToken(token.MappingValue(s.pos())) - s.progressColumn(ctx, 1) - return + scanned, err := s.scanMapDelim(ctx) + if err != nil { + return err + } + if scanned { + continue } case '|', '>': - if !ctx.existsBuffer() { - progress, err := s.scanLiteralHeader(ctx) - if err != nil { - // TODO: returns syntax error object - return - } - s.progressColumn(ctx, progress) - s.progressLine(ctx) + scanned, err := s.scanMultiLineHeader(ctx) + if err != nil { + return err + } + if scanned { continue } case '!': - if !ctx.existsBuffer() { - token, progress := s.scanTag(ctx) - ctx.addToken(token) - s.progressColumn(ctx, progress) - if c := ctx.previousChar(); s.isNewLineChar(c) { - s.progressLine(ctx) - } - pos += progress - return + scanned, err := s.scanTag(ctx) + if err != nil { + return err + } + if scanned { + continue } case '%': - if !ctx.existsBuffer() && s.indentNum == 0 { - ctx.addToken(token.Directive(string(ctx.obuf)+"%", s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanDirective(ctx) { + continue } case '?': - nc := ctx.nextChar() - if !ctx.existsBuffer() && nc == ' ' { - ctx.addToken(token.MappingKey(s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanMapKey(ctx) { + continue } case '&': - if !ctx.existsBuffer() { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.Anchor(string(ctx.obuf), s.pos())) - s.progressColumn(ctx, 1) - s.isAnchor = true - return + if s.scanAnchor(ctx) { + continue } case '*': - if !ctx.existsBuffer() { - s.addBufferedTokenIfExists(ctx) - ctx.addOriginBuf(c) - ctx.addToken(token.Alias(string(ctx.obuf), s.pos())) - s.progressColumn(ctx, 1) - return + if s.scanAlias(ctx) { + continue } case '#': - if !ctx.existsBuffer() || ctx.previousChar() == ' ' { - s.addBufferedTokenIfExists(ctx) - token, progress := s.scanComment(ctx) - ctx.addToken(token) - s.progressColumn(ctx, progress) - s.progressLine(ctx) - pos += progress - return + if s.scanComment(ctx) { + continue } case '\'', '"': - if !ctx.existsBuffer() { - token, progress := s.scanQuote(ctx, c) - ctx.addToken(token) - pos += progress - // If the non-whitespace character immediately following the quote is ':', the quote should be treated as a map key. - // Therefore, do not return and continue processing as a normal map key. - if ctx.currentCharWithSkipWhitespace() == ':' { - continue - } - return + scanned, err := s.scanQuote(ctx, c) + if err != nil { + return err } - case '\r', '\n': - // There is no problem that we ignore CR which followed by LF and normalize it to LF, because of following YAML1.2 spec. - // > Line breaks inside scalar content must be normalized by the YAML processor. Each such line break must be parsed into a single line feed character. - // > Outside scalar content, YAML allows any line break to be used to terminate lines. - // > -- https://yaml.org/spec/1.2/spec.html - if c == '\r' && ctx.nextChar() == '\n' { - ctx.addOriginBuf('\r') - ctx.progress(1) - c = '\n' + if scanned { + continue } + case '\r', '\n': s.scanNewLine(ctx, c) continue case ' ': - if ctx.isSaveIndentMode() || (!s.isAnchor && !s.isFirstCharAtLine) { - ctx.addBuf(c) + if s.scanWhiteSpace(ctx) { + continue + } + case '@', '`': + if err := s.scanReservedChar(ctx, c); err != nil { + return err + } + case '\t': + if ctx.existsBuffer() && s.lastDelimColumn == 0 { + // tab indent for plain text (yaml-test-suite's spec-example-7-12-plain-lines). + s.indentNum++ ctx.addOriginBuf(c) - s.progressColumn(ctx, 1) + s.progressOnly(ctx, 1) continue } - if s.isFirstCharAtLine { - s.progressColumn(ctx, 1) + if s.lastDelimColumn < s.column { + s.indentNum++ ctx.addOriginBuf(c) + s.progressOnly(ctx, 1) continue } - s.addBufferedTokenIfExists(ctx) - pos-- // to rescan white space at next scanning for adding white space to next buffer. - s.isAnchor = false - return + if err := s.scanTab(ctx, c); err != nil { + return err + } } ctx.addBuf(c) ctx.addOriginBuf(c) s.progressColumn(ctx, 1) } s.addBufferedTokenIfExists(ctx) - return + return nil } // Init prepares the scanner s to tokenize the text src by setting the scanner at the beginning of src. @@ -880,12 +1482,15 @@ func (s *Scanner) Init(text string) { s.line = 1 s.column = 1 s.offset = 1 - s.prevIndentLevel = 0 - s.prevIndentNum = 0 - s.prevIndentColumn = 0 + s.isFirstCharAtLine = true + s.clearState() +} + +func (s *Scanner) clearState() { + s.prevLineIndentNum = 0 + s.lastDelimColumn = 0 s.indentLevel = 0 s.indentNum = 0 - s.isFirstCharAtLine = true } // Scan scans the next token and returns the token collection. The source end is indicated by io.EOF. @@ -895,9 +1500,17 @@ func (s *Scanner) Scan() (token.Tokens, error) { } ctx := newContext(s.source[s.sourcePos:]) defer ctx.release() - progress := s.scan(ctx) - s.sourcePos += progress + var tokens token.Tokens + err := s.scan(ctx) tokens = append(tokens, ctx.tokens...) + + if err != nil { + var invalidTokenErr *InvalidTokenError + if errors.As(err, &invalidTokenErr) { + tokens = append(tokens, invalidTokenErr.Token) + } + return tokens, err + } return tokens, nil } diff --git a/vendor/github.com/goccy/go-yaml/token/token.go b/vendor/github.com/goccy/go-yaml/token/token.go index 182f4bea91..e887356243 100644 --- a/vendor/github.com/goccy/go-yaml/token/token.go +++ b/vendor/github.com/goccy/go-yaml/token/token.go @@ -1,8 +1,11 @@ package token import ( + "errors" "fmt" + "strconv" "strings" + "time" ) // Character type for character @@ -99,6 +102,10 @@ const ( SpaceType // NullType type for Null token NullType + // ImplicitNullType type for implicit Null token. + // This is used when explicit keywords such as null or ~ are not specified. + // It is distinguished during encoding and output as an empty string. + ImplicitNullType // InfinityType type for Infinity token InfinityType // NanType type for Nan token @@ -117,6 +124,8 @@ const ( StringType // BoolType type for Bool token BoolType + // InvalidType type for invalid token + InvalidType ) // String type identifier to text @@ -182,10 +191,14 @@ func (t Type) String() string { return "Float" case NullType: return "Null" + case ImplicitNullType: + return "ImplicitNull" case InfinityType: return "Infinity" case NanType: return "Nan" + case InvalidType: + return "Invalid" } return "" } @@ -202,6 +215,8 @@ const ( CharacterTypeMiscellaneous // CharacterTypeEscaped type of escaped character CharacterTypeEscaped + // CharacterTypeInvalid type for a invalid token. + CharacterTypeInvalid ) // String character type identifier to text @@ -210,7 +225,7 @@ func (c CharacterType) String() string { case CharacterTypeIndicator: return "Indicator" case CharacterTypeWhiteSpace: - return "WhiteSpcae" + return "WhiteSpace" case CharacterTypeMiscellaneous: return "Miscellaneous" case CharacterTypeEscaped: @@ -339,9 +354,12 @@ func reservedKeywordToken(typ Type, value, org string, pos *Position) *Token { func init() { for _, keyword := range reservedNullKeywords { - reservedKeywordMap[keyword] = func(value, org string, pos *Position) *Token { + f := func(value, org string, pos *Position) *Token { return reservedKeywordToken(NullType, value, org, pos) } + + reservedKeywordMap[keyword] = f + reservedEncKeywordMap[keyword] = f } for _, keyword := range reservedBoolKeywords { f := func(value, org string, pos *Position) *Token { @@ -391,6 +409,10 @@ const ( SetTag ReservedTagKeyword = "!!set" // TimestampTag `!!timestamp` tag TimestampTag ReservedTagKeyword = "!!timestamp" + // BooleanTag `!!bool` tag + BooleanTag ReservedTagKeyword = "!!bool" + // MergeTag `!!merge` tag + MergeTag ReservedTagKeyword = "!!merge" ) var ( @@ -496,121 +518,163 @@ var ( Position: pos, } }, + BooleanTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, + MergeTag: func(value, org string, pos *Position) *Token { + return &Token{ + Type: TagType, + CharacterType: CharacterTypeIndicator, + Indicator: NodePropertyIndicator, + Value: value, + Origin: org, + Position: pos, + } + }, } ) -type numType int +type NumberType string const ( - numTypeNone numType = iota - numTypeBinary - numTypeOctet - numTypeHex - numTypeFloat + NumberTypeDecimal NumberType = "decimal" + NumberTypeBinary NumberType = "binary" + NumberTypeOctet NumberType = "octet" + NumberTypeHex NumberType = "hex" + NumberTypeFloat NumberType = "float" ) -type numStat struct { - isNum bool - typ numType +type NumberValue struct { + Type NumberType + Value any + Text string } -func getNumberStat(str string) *numStat { - stat := &numStat{} - if str == "" { - return stat +func ToNumber(value string) *NumberValue { + num, err := toNumber(value) + if err != nil { + return nil } - if str == "-" || str == "." || str == "+" || str == "_" { - return stat + return num +} + +func isNumber(value string) bool { + num, err := toNumber(value) + if err != nil { + var numErr *strconv.NumError + if errors.As(err, &numErr) && errors.Is(numErr.Err, strconv.ErrRange) { + return true + } + return false } - if str[0] == '_' { - return stat + return num != nil +} + +func toNumber(value string) (*NumberValue, error) { + if len(value) == 0 { + return nil, nil } - dotFound := false - isNegative := false - isExponent := false - if str[0] == '-' { - isNegative = true + if strings.HasPrefix(value, "_") { + return nil, nil } - for idx, c := range str { - switch c { - case 'x': - if (isNegative && idx == 2) || (!isNegative && idx == 1) { - continue - } - case 'o': - if (isNegative && idx == 2) || (!isNegative && idx == 1) { - continue - } - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - continue - case 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F': - if (len(str) > 2 && str[0] == '0' && str[1] == 'x') || - (len(str) > 3 && isNegative && str[1] == '0' && str[2] == 'x') { - // hex number - continue - } - if c == 'b' && ((isNegative && idx == 2) || (!isNegative && idx == 1)) { - // binary number - continue - } - if (c == 'e' || c == 'E') && dotFound { - // exponent - isExponent = true - continue - } - case '.': - if dotFound { - // multiple dot - return stat - } - dotFound = true - continue - case '-': - if idx == 0 || isExponent { - continue - } - case '+': - if idx == 0 || isExponent { - continue - } - case '_': - continue - } - return stat + dotCount := strings.Count(value, ".") + if dotCount > 1 { + return nil, nil } - stat.isNum = true + + isNegative := strings.HasPrefix(value, "-") + normalized := strings.ReplaceAll(strings.TrimPrefix(strings.TrimPrefix(value, "+"), "-"), "_", "") + + var ( + typ NumberType + base int + ) switch { - case dotFound: - stat.typ = numTypeFloat - case strings.HasPrefix(str, "0b") || strings.HasPrefix(str, "-0b"): - stat.typ = numTypeBinary - case strings.HasPrefix(str, "0x") || strings.HasPrefix(str, "-0x"): - stat.typ = numTypeHex - case strings.HasPrefix(str, "0o") || strings.HasPrefix(str, "-0o"): - stat.typ = numTypeOctet - case (len(str) > 1 && str[0] == '0') || (len(str) > 1 && str[0] == '-' && str[1] == '0'): - stat.typ = numTypeOctet - } - return stat + case strings.HasPrefix(normalized, "0x"): + normalized = strings.TrimPrefix(normalized, "0x") + base = 16 + typ = NumberTypeHex + case strings.HasPrefix(normalized, "0o"): + normalized = strings.TrimPrefix(normalized, "0o") + base = 8 + typ = NumberTypeOctet + case strings.HasPrefix(normalized, "0b"): + normalized = strings.TrimPrefix(normalized, "0b") + base = 2 + typ = NumberTypeBinary + case strings.HasPrefix(normalized, "0") && len(normalized) > 1 && dotCount == 0: + base = 8 + typ = NumberTypeOctet + case dotCount == 1: + typ = NumberTypeFloat + default: + typ = NumberTypeDecimal + base = 10 + } + + text := normalized + if isNegative { + text = "-" + text + } + + var v any + if typ == NumberTypeFloat { + f, err := strconv.ParseFloat(text, 64) + if err != nil { + return nil, err + } + v = f + } else if isNegative { + i, err := strconv.ParseInt(text, base, 64) + if err != nil { + return nil, err + } + v = i + } else { + u, err := strconv.ParseUint(text, base, 64) + if err != nil { + return nil, err + } + v = u + } + + return &NumberValue{ + Type: typ, + Value: v, + Text: text, + }, nil } -func looksLikeTimeValue(value string) bool { - for i, c := range value { - switch c { - case ':', '1', '2', '3', '4', '5', '6', '7', '8', '9': - continue - case '0': - if i == 0 { - return false - } - continue +// This is a subset of the formats permitted by the regular expression +// defined at http://yaml.org/type/timestamp.html. Note that time.Parse +// cannot handle: "2001-12-14 21:59:43.10 -5" from the examples. +var timestampFormats = []string{ + time.RFC3339Nano, + "2006-01-02t15:04:05.999999999Z07:00", // RFC3339Nano with lower-case "t". + time.DateTime, + time.DateOnly, + + // Not in examples, but to preserve backward compatibility by quoting time values. + "15:4", +} + +func isTimestamp(value string) bool { + for _, format := range timestampFormats { + if _, err := time.Parse(format, value); err == nil { + return true } - return false } - return true + return false } -// IsNeedQuoted whether need quote for passed string or not +// IsNeedQuoted checks whether the value needs quote for passed string or not func IsNeedQuoted(value string) bool { if value == "" { return true @@ -618,27 +682,30 @@ func IsNeedQuoted(value string) bool { if _, exists := reservedEncKeywordMap[value]; exists { return true } - if stat := getNumberStat(value); stat.isNum { + if isNumber(value) { + return true + } + if value == "-" { return true } first := value[0] switch first { - case '*', '&', '[', '{', '}', ']', ',', '!', '|', '>', '%', '\'', '"', '@': + case '*', '&', '[', '{', '}', ']', ',', '!', '|', '>', '%', '\'', '"', '@', ' ', '`': return true } last := value[len(value)-1] switch last { - case ':': + case ':', ' ': return true } - if looksLikeTimeValue(value) { + if isTimestamp(value) { return true } for i, c := range value { switch c { case '#', '\\': return true - case ':': + case ':', '-': if i+1 < len(value) && value[i+1] == ' ' { return true } @@ -663,13 +730,13 @@ func LiteralBlockHeader(value string) string { } } -// New create reserved keyword token or number token and other string token +// New create reserved keyword token or number token and other string token. func New(value string, org string, pos *Position) *Token { fn := reservedKeywordMap[value] if fn != nil { return fn(value, org, pos) } - if stat := getNumberStat(value); stat.isNum { + if num := ToNumber(value); num != nil { tk := &Token{ Type: IntegerType, CharacterType: CharacterTypeMiscellaneous, @@ -678,14 +745,14 @@ func New(value string, org string, pos *Position) *Token { Origin: org, Position: pos, } - switch stat.typ { - case numTypeFloat: + switch num.Type { + case NumberTypeFloat: tk.Type = FloatType - case numTypeBinary: + case NumberTypeBinary: tk.Type = BinaryIntegerType - case numTypeOctet: + case NumberTypeOctet: tk.Type = OctetIntegerType - case numTypeHex: + case NumberTypeHex: tk.Type = HexIntegerType } return tk @@ -709,14 +776,24 @@ func (p *Position) String() string { // Token type for token type Token struct { - Type Type + // Type is a token type. + Type Type + // CharacterType is a character type. CharacterType CharacterType - Indicator Indicator - Value string - Origin string - Position *Position - Next *Token - Prev *Token + // Indicator is a indicator type. + Indicator Indicator + // Value is a string extracted with only meaningful characters, with spaces and such removed. + Value string + // Origin is a string that stores the original text as-is. + Origin string + // Error keeps error message for InvalidToken. + Error string + // Position is a token position. + Position *Position + // Next is a next token reference. + Next *Token + // Prev is a previous token reference. + Prev *Token } // PreviousType previous token type @@ -756,9 +833,26 @@ func (t *Token) Clone() *Token { return &copied } +// Dump outputs token information to stdout for debugging. +func (t *Token) Dump() { + fmt.Printf( + "[TYPE]:%q [CHARTYPE]:%q [INDICATOR]:%q [VALUE]:%q [ORG]:%q [POS(line:column:level:offset)]: %d:%d:%d:%d\n", + t.Type, t.CharacterType, t.Indicator, t.Value, t.Origin, t.Position.Line, t.Position.Column, t.Position.IndentLevel, t.Position.Offset, + ) +} + // Tokens type of token collection type Tokens []*Token +func (t Tokens) InvalidToken() *Token { + for _, tt := range t { + if tt.Type == InvalidType { + return tt + } + } + return nil +} + func (t *Tokens) add(tk *Token) { tokens := *t if len(tokens) == 0 { @@ -782,7 +876,8 @@ func (t *Tokens) Add(tks ...*Token) { // Dump dump all token structures for debugging func (t Tokens) Dump() { for _, tk := range t { - fmt.Printf("- %+v\n", tk) + fmt.Print("- ") + tk.Dump() } } @@ -1054,6 +1149,18 @@ func DocumentEnd(org string, pos *Position) *Token { } } +func Invalid(err string, org string, pos *Position) *Token { + return &Token{ + Type: InvalidType, + CharacterType: CharacterTypeInvalid, + Indicator: NotIndicator, + Value: org, + Origin: org, + Error: err, + Position: pos, + } +} + // DetectLineBreakCharacter detect line break character in only one inside scalar content scope. func DetectLineBreakCharacter(src string) string { nc := strings.Count(src, "\n") diff --git a/vendor/github.com/google/gnostic-models/compiler/context.go b/vendor/github.com/google/gnostic-models/compiler/context.go index 1bfe961219..26b31e51e3 100644 --- a/vendor/github.com/google/gnostic-models/compiler/context.go +++ b/vendor/github.com/google/gnostic-models/compiler/context.go @@ -15,7 +15,7 @@ package compiler import ( - yaml "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) // Context contains state of the compiler as it traverses a document. diff --git a/vendor/github.com/google/gnostic-models/compiler/extensions.go b/vendor/github.com/google/gnostic-models/compiler/extensions.go index 16ae66faa3..efa07f2a90 100644 --- a/vendor/github.com/google/gnostic-models/compiler/extensions.go +++ b/vendor/github.com/google/gnostic-models/compiler/extensions.go @@ -20,9 +20,9 @@ import ( "os/exec" "strings" + yaml "go.yaml.in/yaml/v3" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" - yaml "gopkg.in/yaml.v3" extensions "github.com/google/gnostic-models/extensions" ) diff --git a/vendor/github.com/google/gnostic-models/compiler/helpers.go b/vendor/github.com/google/gnostic-models/compiler/helpers.go index 975d65e8f8..a83261eb6c 100644 --- a/vendor/github.com/google/gnostic-models/compiler/helpers.go +++ b/vendor/github.com/google/gnostic-models/compiler/helpers.go @@ -20,7 +20,7 @@ import ( "sort" "strconv" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/jsonschema" ) diff --git a/vendor/github.com/google/gnostic-models/compiler/reader.go b/vendor/github.com/google/gnostic-models/compiler/reader.go index be0e8b40c8..da409d6b36 100644 --- a/vendor/github.com/google/gnostic-models/compiler/reader.go +++ b/vendor/github.com/google/gnostic-models/compiler/reader.go @@ -24,7 +24,7 @@ import ( "strings" "sync" - yaml "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) var verboseReader = false diff --git a/vendor/github.com/google/gnostic-models/jsonschema/models.go b/vendor/github.com/google/gnostic-models/jsonschema/models.go index 4781bdc5f5..a42b8e0035 100644 --- a/vendor/github.com/google/gnostic-models/jsonschema/models.go +++ b/vendor/github.com/google/gnostic-models/jsonschema/models.go @@ -16,7 +16,7 @@ // of JSON Schemas. package jsonschema -import "gopkg.in/yaml.v3" +import "go.yaml.in/yaml/v3" // The Schema struct models a JSON Schema and, because schemas are // defined hierarchically, contains many references to itself. diff --git a/vendor/github.com/google/gnostic-models/jsonschema/reader.go b/vendor/github.com/google/gnostic-models/jsonschema/reader.go index b8583d4660..4f1fe0c08c 100644 --- a/vendor/github.com/google/gnostic-models/jsonschema/reader.go +++ b/vendor/github.com/google/gnostic-models/jsonschema/reader.go @@ -21,7 +21,7 @@ import ( "io/ioutil" "strconv" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) // This is a global map of all known Schemas. diff --git a/vendor/github.com/google/gnostic-models/jsonschema/writer.go b/vendor/github.com/google/gnostic-models/jsonschema/writer.go index 340dc5f933..19f5ddeae2 100644 --- a/vendor/github.com/google/gnostic-models/jsonschema/writer.go +++ b/vendor/github.com/google/gnostic-models/jsonschema/writer.go @@ -17,7 +17,7 @@ package jsonschema import ( "fmt" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" ) const indentation = " " diff --git a/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go b/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go index d71fe6d545..de337d80c8 100644 --- a/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go +++ b/vendor/github.com/google/gnostic-models/openapiv2/OpenAPIv2.go @@ -21,7 +21,7 @@ import ( "regexp" "strings" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) @@ -60,7 +60,7 @@ func NewAdditionalPropertiesItem(in *yaml.Node, context *compiler.Context) (*Add // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid AdditionalPropertiesItem") + message := "contains an invalid AdditionalPropertiesItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -2543,7 +2543,7 @@ func NewNonBodyParameter(in *yaml.Node, context *compiler.Context) (*NonBodyPara // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid NonBodyParameter") + message := "contains an invalid NonBodyParameter" err := compiler.NewError(context, message) errors = []error{err} } @@ -3271,7 +3271,7 @@ func NewParameter(in *yaml.Node, context *compiler.Context) (*Parameter, error) // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid Parameter") + message := "contains an invalid Parameter" err := compiler.NewError(context, message) errors = []error{err} } @@ -3345,7 +3345,7 @@ func NewParametersItem(in *yaml.Node, context *compiler.Context) (*ParametersIte // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ParametersItem") + message := "contains an invalid ParametersItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -4561,7 +4561,7 @@ func NewResponseValue(in *yaml.Node, context *compiler.Context) (*ResponseValue, // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ResponseValue") + message := "contains an invalid ResponseValue" err := compiler.NewError(context, message) errors = []error{err} } @@ -5030,7 +5030,7 @@ func NewSchemaItem(in *yaml.Node, context *compiler.Context) (*SchemaItem, error // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SchemaItem") + message := "contains an invalid SchemaItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -5160,7 +5160,7 @@ func NewSecurityDefinitionsItem(in *yaml.Node, context *compiler.Context) (*Secu // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SecurityDefinitionsItem") + message := "contains an invalid SecurityDefinitionsItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -6930,7 +6930,7 @@ func (m *BodyParameter) ToRawInfo() *yaml.Node { // always include this required field. info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -7149,7 +7149,7 @@ func (m *FileSchema) ToRawInfo() *yaml.Node { // always include this required field. info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) - if m.ReadOnly != false { + if m.ReadOnly { info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) } @@ -7176,7 +7176,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -7192,7 +7192,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) } - if m.AllowEmptyValue != false { + if m.AllowEmptyValue { info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) } @@ -7220,7 +7220,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -7228,7 +7228,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -7252,7 +7252,7 @@ func (m *FormDataParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -7306,7 +7306,7 @@ func (m *Header) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -7314,7 +7314,7 @@ func (m *Header) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -7338,7 +7338,7 @@ func (m *Header) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -7373,7 +7373,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -7413,7 +7413,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -7421,7 +7421,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -7445,7 +7445,7 @@ func (m *HeaderParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -7940,7 +7940,7 @@ func (m *Operation) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("schemes")) info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Schemes)) } - if m.Deprecated != false { + if m.Deprecated { info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) } @@ -8110,7 +8110,7 @@ func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8118,7 +8118,7 @@ func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8142,7 +8142,7 @@ func (m *PathParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8218,7 +8218,7 @@ func (m *PrimitivesItems) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8226,7 +8226,7 @@ func (m *PrimitivesItems) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8250,7 +8250,7 @@ func (m *PrimitivesItems) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8296,7 +8296,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { if m == nil { return info } - if m.Required != false { + if m.Required { info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) } @@ -8312,7 +8312,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) } - if m.AllowEmptyValue != false { + if m.AllowEmptyValue { info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) } @@ -8340,7 +8340,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8348,7 +8348,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8372,7 +8372,7 @@ func (m *QueryParameterSubSchema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8514,7 +8514,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) } - if m.ExclusiveMaximum != false { + if m.ExclusiveMaximum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) } @@ -8522,7 +8522,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) } - if m.ExclusiveMinimum != false { + if m.ExclusiveMinimum { info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) } @@ -8546,7 +8546,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) } - if m.UniqueItems != false { + if m.UniqueItems { info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) } @@ -8610,7 +8610,7 @@ func (m *Schema) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("discriminator")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Discriminator)) } - if m.ReadOnly != false { + if m.ReadOnly { info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) } @@ -8796,11 +8796,11 @@ func (m *Xml) ToRawInfo() *yaml.Node { info.Content = append(info.Content, compiler.NewScalarNodeForString("prefix")) info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Prefix)) } - if m.Attribute != false { + if m.Attribute { info.Content = append(info.Content, compiler.NewScalarNodeForString("attribute")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Attribute)) } - if m.Wrapped != false { + if m.Wrapped { info.Content = append(info.Content, compiler.NewScalarNodeForString("wrapped")) info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Wrapped)) } diff --git a/vendor/github.com/google/gnostic-models/openapiv2/document.go b/vendor/github.com/google/gnostic-models/openapiv2/document.go index e96ac0d6da..89469a13ed 100644 --- a/vendor/github.com/google/gnostic-models/openapiv2/document.go +++ b/vendor/github.com/google/gnostic-models/openapiv2/document.go @@ -15,7 +15,7 @@ package openapi_v2 import ( - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) diff --git a/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go b/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go index 4b1131ce1c..662772dd95 100644 --- a/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go +++ b/vendor/github.com/google/gnostic-models/openapiv3/OpenAPIv3.go @@ -21,7 +21,7 @@ import ( "regexp" "strings" - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) @@ -60,7 +60,7 @@ func NewAdditionalPropertiesItem(in *yaml.Node, context *compiler.Context) (*Add // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid AdditionalPropertiesItem") + message := "contains an invalid AdditionalPropertiesItem" err := compiler.NewError(context, message) errors = []error{err} } @@ -113,7 +113,7 @@ func NewAnyOrExpression(in *yaml.Node, context *compiler.Context) (*AnyOrExpress // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid AnyOrExpression") + message := "contains an invalid AnyOrExpression" err := compiler.NewError(context, message) errors = []error{err} } @@ -227,7 +227,7 @@ func NewCallbackOrReference(in *yaml.Node, context *compiler.Context) (*Callback // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid CallbackOrReference") + message := "contains an invalid CallbackOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -979,7 +979,7 @@ func NewExampleOrReference(in *yaml.Node, context *compiler.Context) (*ExampleOr // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ExampleOrReference") + message := "contains an invalid ExampleOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -1320,7 +1320,7 @@ func NewHeaderOrReference(in *yaml.Node, context *compiler.Context) (*HeaderOrRe // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid HeaderOrReference") + message := "contains an invalid HeaderOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -1713,7 +1713,7 @@ func NewLinkOrReference(in *yaml.Node, context *compiler.Context) (*LinkOrRefere // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid LinkOrReference") + message := "contains an invalid LinkOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -3090,7 +3090,7 @@ func NewParameterOrReference(in *yaml.Node, context *compiler.Context) (*Paramet // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ParameterOrReference") + message := "contains an invalid ParameterOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -3606,7 +3606,7 @@ func NewRequestBodyOrReference(in *yaml.Node, context *compiler.Context) (*Reque // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid RequestBodyOrReference") + message := "contains an invalid RequestBodyOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -3743,7 +3743,7 @@ func NewResponseOrReference(in *yaml.Node, context *compiler.Context) (*Response // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid ResponseOrReference") + message := "contains an invalid ResponseOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -4310,7 +4310,7 @@ func NewSchemaOrReference(in *yaml.Node, context *compiler.Context) (*SchemaOrRe // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SchemaOrReference") + message := "contains an invalid SchemaOrReference" err := compiler.NewError(context, message) errors = []error{err} } @@ -4543,7 +4543,7 @@ func NewSecuritySchemeOrReference(in *yaml.Node, context *compiler.Context) (*Se // since the oneof matched one of its possibilities, discard any matching errors errors = make([]error, 0) } else { - message := fmt.Sprintf("contains an invalid SecuritySchemeOrReference") + message := "contains an invalid SecuritySchemeOrReference" err := compiler.NewError(context, message) errors = []error{err} } diff --git a/vendor/github.com/google/gnostic-models/openapiv3/document.go b/vendor/github.com/google/gnostic-models/openapiv3/document.go index 1cee467735..499ff883c5 100644 --- a/vendor/github.com/google/gnostic-models/openapiv3/document.go +++ b/vendor/github.com/google/gnostic-models/openapiv3/document.go @@ -15,7 +15,7 @@ package openapi_v3 import ( - "gopkg.in/yaml.v3" + yaml "go.yaml.in/yaml/v3" "github.com/google/gnostic-models/compiler" ) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/BUILD.bazel b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/BUILD.bazel new file mode 100644 index 0000000000..d71991e6e8 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/BUILD.bazel @@ -0,0 +1,44 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "options_proto_files", + srcs = [ + "annotations.proto", + "openapiv2.proto", + ], +) + +go_library( + name = "options", + embed = [":options_go_proto"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options", +) + +proto_library( + name = "options_proto", + srcs = [ + "annotations.proto", + "openapiv2.proto", + ], + deps = [ + "@com_google_protobuf//:descriptor_proto", + "@com_google_protobuf//:struct_proto", + ], +) + +go_proto_library( + name = "options_go_proto", + compilers = ["//:go_apiv2"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options", + proto = ":options_proto", +) + +alias( + name = "go_default_library", + actual = ":options", + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.pb.go new file mode 100644 index 0000000000..738c9754a6 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.pb.go @@ -0,0 +1,269 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/annotations.proto + +//go:build !protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_protoc_gen_openapiv2_options_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*Swagger)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger", + Tag: "bytes,1042,opt,name=openapiv2_swagger", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*Operation)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation", + Tag: "bytes,1042,opt,name=openapiv2_operation", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema", + Tag: "bytes,1042,opt,name=openapiv2_schema", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.EnumOptions)(nil), + ExtensionType: (*EnumSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum", + Tag: "bytes,1042,opt,name=openapiv2_enum", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*Tag)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag", + Tag: "bytes,1042,opt,name=openapiv2_tag", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*JSONSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field", + Tag: "bytes,1042,opt,name=openapiv2_field", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Swagger openapiv2_swagger = 1042; + E_Openapiv2Swagger = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Operation openapiv2_operation = 1042; + E_Openapiv2Operation = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[1] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Schema openapiv2_schema = 1042; + E_Openapiv2Schema = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[2] +) + +// Extension fields to descriptorpb.EnumOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.EnumSchema openapiv2_enum = 1042; + E_Openapiv2Enum = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[3] +) + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Tag openapiv2_tag = 1042; + E_Openapiv2Tag = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[4] +) + +// Extension fields to descriptorpb.FieldOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.JSONSchema openapiv2_field = 1042; + E_Openapiv2Field = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[5] +) + +var File_protoc_gen_openapiv2_options_annotations_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x29, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x7e, 0x0a, 0x11, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x3a, 0x86, 0x01, 0x0a, 0x13, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x12, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x7b, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x45, 0x6e, 0x75, + 0x6d, 0x3a, 0x75, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x74, + 0x61, 0x67, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x54, 0x61, 0x67, 0x3a, 0x7e, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, + 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, + 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_protoc_gen_openapiv2_options_annotations_proto_goTypes = []any{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions + (*descriptorpb.EnumOptions)(nil), // 3: google.protobuf.EnumOptions + (*descriptorpb.ServiceOptions)(nil), // 4: google.protobuf.ServiceOptions + (*descriptorpb.FieldOptions)(nil), // 5: google.protobuf.FieldOptions + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Schema)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*Tag)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*JSONSchema)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema +} +var file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = []int32{ + 0, // 0: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:extendee -> google.protobuf.FileOptions + 1, // 1: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:extendee -> google.protobuf.MethodOptions + 2, // 2: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:extendee -> google.protobuf.MessageOptions + 3, // 3: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:extendee -> google.protobuf.EnumOptions + 4, // 4: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:extendee -> google.protobuf.ServiceOptions + 5, // 5: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:extendee -> google.protobuf.FieldOptions + 6, // 6: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger + 7, // 7: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation + 8, // 8: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 9, // 9: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + 10, // 10: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 11, // 11: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 6, // [6:12] is the sub-list for extension type_name + 0, // [0:6] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_annotations_proto_init() } +func file_protoc_gen_openapiv2_options_annotations_proto_init() { + if File_protoc_gen_openapiv2_options_annotations_proto != nil { + return + } + file_protoc_gen_openapiv2_options_openapiv2_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 6, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_annotations_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_annotations_proto_depIdxs, + ExtensionInfos: file_protoc_gen_openapiv2_options_annotations_proto_extTypes, + }.Build() + File_protoc_gen_openapiv2_options_annotations_proto = out.File + file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_annotations_proto_goTypes = nil + file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.proto b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.proto new file mode 100644 index 0000000000..aecc5e709c --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations.proto @@ -0,0 +1,51 @@ +syntax = "proto3"; + +package grpc.gateway.protoc_gen_openapiv2.options; + +import "google/protobuf/descriptor.proto"; +import "protoc-gen-openapiv2/options/openapiv2.proto"; + +option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"; + +extend google.protobuf.FileOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Swagger openapiv2_swagger = 1042; +} +extend google.protobuf.MethodOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Operation openapiv2_operation = 1042; +} +extend google.protobuf.MessageOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Schema openapiv2_schema = 1042; +} +extend google.protobuf.EnumOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + EnumSchema openapiv2_enum = 1042; +} +extend google.protobuf.ServiceOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + Tag openapiv2_tag = 1042; +} +extend google.protobuf.FieldOptions { + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + JSONSchema openapiv2_field = 1042; +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations_protoopaque.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations_protoopaque.pb.go new file mode 100644 index 0000000000..b570167836 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/annotations_protoopaque.pb.go @@ -0,0 +1,269 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/annotations.proto + +//go:build protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_protoc_gen_openapiv2_options_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*Swagger)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger", + Tag: "bytes,1042,opt,name=openapiv2_swagger", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*Operation)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation", + Tag: "bytes,1042,opt,name=openapiv2_operation", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema", + Tag: "bytes,1042,opt,name=openapiv2_schema", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.EnumOptions)(nil), + ExtensionType: (*EnumSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum", + Tag: "bytes,1042,opt,name=openapiv2_enum", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*Tag)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag", + Tag: "bytes,1042,opt,name=openapiv2_tag", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*JSONSchema)(nil), + Field: 1042, + Name: "grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field", + Tag: "bytes,1042,opt,name=openapiv2_field", + Filename: "protoc-gen-openapiv2/options/annotations.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Swagger openapiv2_swagger = 1042; + E_Openapiv2Swagger = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Operation openapiv2_operation = 1042; + E_Openapiv2Operation = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[1] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Schema openapiv2_schema = 1042; + E_Openapiv2Schema = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[2] +) + +// Extension fields to descriptorpb.EnumOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.EnumSchema openapiv2_enum = 1042; + E_Openapiv2Enum = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[3] +) + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.Tag openapiv2_tag = 1042; + E_Openapiv2Tag = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[4] +) + +// Extension fields to descriptorpb.FieldOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as they extend + // different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv2.options.JSONSchema openapiv2_field = 1042; + E_Openapiv2Field = &file_protoc_gen_openapiv2_options_annotations_proto_extTypes[5] +) + +var File_protoc_gen_openapiv2_options_annotations_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x29, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x7e, 0x0a, 0x11, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x3a, 0x86, 0x01, 0x0a, 0x13, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x12, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x7b, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x45, 0x6e, 0x75, + 0x6d, 0x3a, 0x75, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x74, + 0x61, 0x67, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x54, 0x61, 0x67, 0x3a, 0x7e, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x92, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, + 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, + 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_protoc_gen_openapiv2_options_annotations_proto_goTypes = []any{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions + (*descriptorpb.EnumOptions)(nil), // 3: google.protobuf.EnumOptions + (*descriptorpb.ServiceOptions)(nil), // 4: google.protobuf.ServiceOptions + (*descriptorpb.FieldOptions)(nil), // 5: google.protobuf.FieldOptions + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Schema)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*Tag)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*JSONSchema)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema +} +var file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = []int32{ + 0, // 0: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:extendee -> google.protobuf.FileOptions + 1, // 1: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:extendee -> google.protobuf.MethodOptions + 2, // 2: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:extendee -> google.protobuf.MessageOptions + 3, // 3: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:extendee -> google.protobuf.EnumOptions + 4, // 4: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:extendee -> google.protobuf.ServiceOptions + 5, // 5: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:extendee -> google.protobuf.FieldOptions + 6, // 6: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger + 7, // 7: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation + 8, // 8: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 9, // 9: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + 10, // 10: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 11, // 11: grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 6, // [6:12] is the sub-list for extension type_name + 0, // [0:6] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_annotations_proto_init() } +func file_protoc_gen_openapiv2_options_annotations_proto_init() { + if File_protoc_gen_openapiv2_options_annotations_proto != nil { + return + } + file_protoc_gen_openapiv2_options_openapiv2_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 6, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_annotations_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_annotations_proto_depIdxs, + ExtensionInfos: file_protoc_gen_openapiv2_options_annotations_proto_extTypes, + }.Build() + File_protoc_gen_openapiv2_options_annotations_proto = out.File + file_protoc_gen_openapiv2_options_annotations_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_annotations_proto_goTypes = nil + file_protoc_gen_openapiv2_options_annotations_proto_depIdxs = nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/buf.gen.yaml b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/buf.gen.yaml new file mode 100644 index 0000000000..07dfb958f1 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/buf.gen.yaml @@ -0,0 +1,7 @@ +version: v2 +plugins: + - remote: buf.build/protocolbuffers/go:v1.36.0 + out: . + opt: + - paths=source_relative + - default_api_level=API_HYBRID diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.pb.go new file mode 100644 index 0000000000..3a34e664e0 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.pb.go @@ -0,0 +1,4263 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/openapiv2.proto + +//go:build !protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Scheme describes the schemes supported by the OpenAPI Swagger +// and Operation objects. +type Scheme int32 + +const ( + Scheme_UNKNOWN Scheme = 0 + Scheme_HTTP Scheme = 1 + Scheme_HTTPS Scheme = 2 + Scheme_WS Scheme = 3 + Scheme_WSS Scheme = 4 +) + +// Enum value maps for Scheme. +var ( + Scheme_name = map[int32]string{ + 0: "UNKNOWN", + 1: "HTTP", + 2: "HTTPS", + 3: "WS", + 4: "WSS", + } + Scheme_value = map[string]int32{ + "UNKNOWN": 0, + "HTTP": 1, + "HTTPS": 2, + "WS": 3, + "WSS": 4, + } +) + +func (x Scheme) Enum() *Scheme { + p := new(Scheme) + *p = x + return p +} + +func (x Scheme) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Scheme) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0].Descriptor() +} + +func (Scheme) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0] +} + +func (x Scheme) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Type` is a supported HTTP header type. +// See https://swagger.io/specification/v2/#parameterType. +type HeaderParameter_Type int32 + +const ( + HeaderParameter_UNKNOWN HeaderParameter_Type = 0 + HeaderParameter_STRING HeaderParameter_Type = 1 + HeaderParameter_NUMBER HeaderParameter_Type = 2 + HeaderParameter_INTEGER HeaderParameter_Type = 3 + HeaderParameter_BOOLEAN HeaderParameter_Type = 4 +) + +// Enum value maps for HeaderParameter_Type. +var ( + HeaderParameter_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STRING", + 2: "NUMBER", + 3: "INTEGER", + 4: "BOOLEAN", + } + HeaderParameter_Type_value = map[string]int32{ + "UNKNOWN": 0, + "STRING": 1, + "NUMBER": 2, + "INTEGER": 3, + "BOOLEAN": 4, + } +) + +func (x HeaderParameter_Type) Enum() *HeaderParameter_Type { + p := new(HeaderParameter_Type) + *p = x + return p +} + +func (x HeaderParameter_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (HeaderParameter_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1].Descriptor() +} + +func (HeaderParameter_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1] +} + +func (x HeaderParameter_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +type JSONSchema_JSONSchemaSimpleTypes int32 + +const ( + JSONSchema_UNKNOWN JSONSchema_JSONSchemaSimpleTypes = 0 + JSONSchema_ARRAY JSONSchema_JSONSchemaSimpleTypes = 1 + JSONSchema_BOOLEAN JSONSchema_JSONSchemaSimpleTypes = 2 + JSONSchema_INTEGER JSONSchema_JSONSchemaSimpleTypes = 3 + JSONSchema_NULL JSONSchema_JSONSchemaSimpleTypes = 4 + JSONSchema_NUMBER JSONSchema_JSONSchemaSimpleTypes = 5 + JSONSchema_OBJECT JSONSchema_JSONSchemaSimpleTypes = 6 + JSONSchema_STRING JSONSchema_JSONSchemaSimpleTypes = 7 +) + +// Enum value maps for JSONSchema_JSONSchemaSimpleTypes. +var ( + JSONSchema_JSONSchemaSimpleTypes_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ARRAY", + 2: "BOOLEAN", + 3: "INTEGER", + 4: "NULL", + 5: "NUMBER", + 6: "OBJECT", + 7: "STRING", + } + JSONSchema_JSONSchemaSimpleTypes_value = map[string]int32{ + "UNKNOWN": 0, + "ARRAY": 1, + "BOOLEAN": 2, + "INTEGER": 3, + "NULL": 4, + "NUMBER": 5, + "OBJECT": 6, + "STRING": 7, + } +) + +func (x JSONSchema_JSONSchemaSimpleTypes) Enum() *JSONSchema_JSONSchemaSimpleTypes { + p := new(JSONSchema_JSONSchemaSimpleTypes) + *p = x + return p +} + +func (x JSONSchema_JSONSchemaSimpleTypes) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (JSONSchema_JSONSchemaSimpleTypes) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2].Descriptor() +} + +func (JSONSchema_JSONSchemaSimpleTypes) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2] +} + +func (x JSONSchema_JSONSchemaSimpleTypes) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The type of the security scheme. Valid values are "basic", +// "apiKey" or "oauth2". +type SecurityScheme_Type int32 + +const ( + SecurityScheme_TYPE_INVALID SecurityScheme_Type = 0 + SecurityScheme_TYPE_BASIC SecurityScheme_Type = 1 + SecurityScheme_TYPE_API_KEY SecurityScheme_Type = 2 + SecurityScheme_TYPE_OAUTH2 SecurityScheme_Type = 3 +) + +// Enum value maps for SecurityScheme_Type. +var ( + SecurityScheme_Type_name = map[int32]string{ + 0: "TYPE_INVALID", + 1: "TYPE_BASIC", + 2: "TYPE_API_KEY", + 3: "TYPE_OAUTH2", + } + SecurityScheme_Type_value = map[string]int32{ + "TYPE_INVALID": 0, + "TYPE_BASIC": 1, + "TYPE_API_KEY": 2, + "TYPE_OAUTH2": 3, + } +) + +func (x SecurityScheme_Type) Enum() *SecurityScheme_Type { + p := new(SecurityScheme_Type) + *p = x + return p +} + +func (x SecurityScheme_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3].Descriptor() +} + +func (SecurityScheme_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3] +} + +func (x SecurityScheme_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The location of the API key. Valid values are "query" or "header". +type SecurityScheme_In int32 + +const ( + SecurityScheme_IN_INVALID SecurityScheme_In = 0 + SecurityScheme_IN_QUERY SecurityScheme_In = 1 + SecurityScheme_IN_HEADER SecurityScheme_In = 2 +) + +// Enum value maps for SecurityScheme_In. +var ( + SecurityScheme_In_name = map[int32]string{ + 0: "IN_INVALID", + 1: "IN_QUERY", + 2: "IN_HEADER", + } + SecurityScheme_In_value = map[string]int32{ + "IN_INVALID": 0, + "IN_QUERY": 1, + "IN_HEADER": 2, + } +) + +func (x SecurityScheme_In) Enum() *SecurityScheme_In { + p := new(SecurityScheme_In) + *p = x + return p +} + +func (x SecurityScheme_In) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_In) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4].Descriptor() +} + +func (SecurityScheme_In) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4] +} + +func (x SecurityScheme_In) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The flow used by the OAuth2 security scheme. Valid values are +// "implicit", "password", "application" or "accessCode". +type SecurityScheme_Flow int32 + +const ( + SecurityScheme_FLOW_INVALID SecurityScheme_Flow = 0 + SecurityScheme_FLOW_IMPLICIT SecurityScheme_Flow = 1 + SecurityScheme_FLOW_PASSWORD SecurityScheme_Flow = 2 + SecurityScheme_FLOW_APPLICATION SecurityScheme_Flow = 3 + SecurityScheme_FLOW_ACCESS_CODE SecurityScheme_Flow = 4 +) + +// Enum value maps for SecurityScheme_Flow. +var ( + SecurityScheme_Flow_name = map[int32]string{ + 0: "FLOW_INVALID", + 1: "FLOW_IMPLICIT", + 2: "FLOW_PASSWORD", + 3: "FLOW_APPLICATION", + 4: "FLOW_ACCESS_CODE", + } + SecurityScheme_Flow_value = map[string]int32{ + "FLOW_INVALID": 0, + "FLOW_IMPLICIT": 1, + "FLOW_PASSWORD": 2, + "FLOW_APPLICATION": 3, + "FLOW_ACCESS_CODE": 4, + } +) + +func (x SecurityScheme_Flow) Enum() *SecurityScheme_Flow { + p := new(SecurityScheme_Flow) + *p = x + return p +} + +func (x SecurityScheme_Flow) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Flow) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5].Descriptor() +} + +func (SecurityScheme_Flow) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5] +} + +func (x SecurityScheme_Flow) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// schemes: HTTPS; +// consumes: "application/json"; +// produces: "application/json"; +// }; +type Swagger struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + Swagger string `protobuf:"bytes,1,opt,name=swagger,proto3" json:"swagger,omitempty"` + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"` + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"` + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + Schemes []Scheme `protobuf:"varint,5,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + Responses map[string]*Response `protobuf:"bytes,10,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Security scheme definitions that can be used across the specification. + SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,11,opt,name=security_definitions,json=securityDefinitions,proto3" json:"security_definitions,omitempty"` + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []*Tag `protobuf:"bytes,13,rep,name=tags,proto3" json:"tags,omitempty"` + // Additional external documentation. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,14,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,15,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Swagger) Reset() { + *x = Swagger{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Swagger) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Swagger) ProtoMessage() {} + +func (x *Swagger) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Swagger) GetSwagger() string { + if x != nil { + return x.Swagger + } + return "" +} + +func (x *Swagger) GetInfo() *Info { + if x != nil { + return x.Info + } + return nil +} + +func (x *Swagger) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *Swagger) GetBasePath() string { + if x != nil { + return x.BasePath + } + return "" +} + +func (x *Swagger) GetSchemes() []Scheme { + if x != nil { + return x.Schemes + } + return nil +} + +func (x *Swagger) GetConsumes() []string { + if x != nil { + return x.Consumes + } + return nil +} + +func (x *Swagger) GetProduces() []string { + if x != nil { + return x.Produces + } + return nil +} + +func (x *Swagger) GetResponses() map[string]*Response { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Swagger) GetSecurityDefinitions() *SecurityDefinitions { + if x != nil { + return x.SecurityDefinitions + } + return nil +} + +func (x *Swagger) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Swagger) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Swagger) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Swagger) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Swagger) SetSwagger(v string) { + x.Swagger = v +} + +func (x *Swagger) SetInfo(v *Info) { + x.Info = v +} + +func (x *Swagger) SetHost(v string) { + x.Host = v +} + +func (x *Swagger) SetBasePath(v string) { + x.BasePath = v +} + +func (x *Swagger) SetSchemes(v []Scheme) { + x.Schemes = v +} + +func (x *Swagger) SetConsumes(v []string) { + x.Consumes = v +} + +func (x *Swagger) SetProduces(v []string) { + x.Produces = v +} + +func (x *Swagger) SetResponses(v map[string]*Response) { + x.Responses = v +} + +func (x *Swagger) SetSecurityDefinitions(v *SecurityDefinitions) { + x.SecurityDefinitions = v +} + +func (x *Swagger) SetSecurity(v []*SecurityRequirement) { + x.Security = v +} + +func (x *Swagger) SetTags(v []*Tag) { + x.Tags = v +} + +func (x *Swagger) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Swagger) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Swagger) HasInfo() bool { + if x == nil { + return false + } + return x.Info != nil +} + +func (x *Swagger) HasSecurityDefinitions() bool { + if x == nil { + return false + } + return x.SecurityDefinitions != nil +} + +func (x *Swagger) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Swagger) ClearInfo() { + x.Info = nil +} + +func (x *Swagger) ClearSecurityDefinitions() { + x.SecurityDefinitions = nil +} + +func (x *Swagger) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type Swagger_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + Swagger string + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info *Info + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + Host string + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + BasePath string + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + Schemes []Scheme + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Consumes []string + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Produces []string + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + Responses map[string]*Response + // Security scheme definitions that can be used across the specification. + SecurityDefinitions *SecurityDefinitions + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + Security []*SecurityRequirement + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []*Tag + // Additional external documentation. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Swagger_builder) Build() *Swagger { + m0 := &Swagger{} + b, x := &b0, m0 + _, _ = b, x + x.Swagger = b.Swagger + x.Info = b.Info + x.Host = b.Host + x.BasePath = b.BasePath + x.Schemes = b.Schemes + x.Consumes = b.Consumes + x.Produces = b.Produces + x.Responses = b.Responses + x.SecurityDefinitions = b.SecurityDefinitions + x.Security = b.Security + x.Tags = b.Tags + x.ExternalDocs = b.ExternalDocs + x.Extensions = b.Extensions + return m0 +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +// +// Example: +// +// service EchoService { +// rpc Echo(SimpleMessage) returns (SimpleMessage) { +// option (google.api.http) = { +// get: "/v1/example/echo/{id}" +// }; +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { +// summary: "Get a message."; +// operation_id: "getMessage"; +// tags: "echo"; +// responses: { +// key: "200" +// value: { +// description: "OK"; +// } +// } +// }; +// } +// } +type Operation struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response `protobuf:"bytes,9,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + Schemes []Scheme `protobuf:"varint,10,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + Deprecated bool `protobuf:"varint,11,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,13,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters *Parameters `protobuf:"bytes,14,opt,name=parameters,proto3" json:"parameters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Operation) Reset() { + *x = Operation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Operation) GetConsumes() []string { + if x != nil { + return x.Consumes + } + return nil +} + +func (x *Operation) GetProduces() []string { + if x != nil { + return x.Produces + } + return nil +} + +func (x *Operation) GetResponses() map[string]*Response { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Operation) GetSchemes() []Scheme { + if x != nil { + return x.Schemes + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Operation) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Operation) GetParameters() *Parameters { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Operation) SetTags(v []string) { + x.Tags = v +} + +func (x *Operation) SetSummary(v string) { + x.Summary = v +} + +func (x *Operation) SetDescription(v string) { + x.Description = v +} + +func (x *Operation) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Operation) SetOperationId(v string) { + x.OperationId = v +} + +func (x *Operation) SetConsumes(v []string) { + x.Consumes = v +} + +func (x *Operation) SetProduces(v []string) { + x.Produces = v +} + +func (x *Operation) SetResponses(v map[string]*Response) { + x.Responses = v +} + +func (x *Operation) SetSchemes(v []Scheme) { + x.Schemes = v +} + +func (x *Operation) SetDeprecated(v bool) { + x.Deprecated = v +} + +func (x *Operation) SetSecurity(v []*SecurityRequirement) { + x.Security = v +} + +func (x *Operation) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Operation) SetParameters(v *Parameters) { + x.Parameters = v +} + +func (x *Operation) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Operation) HasParameters() bool { + if x == nil { + return false + } + return x.Parameters != nil +} + +func (x *Operation) ClearExternalDocs() { + x.ExternalDocs = nil +} + +func (x *Operation) ClearParameters() { + x.Parameters = nil +} + +type Operation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []string + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + Summary string + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + Description string + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + OperationId string + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Consumes []string + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Produces []string + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + Schemes []Scheme + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + Deprecated bool + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + Security []*SecurityRequirement + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters *Parameters +} + +func (b0 Operation_builder) Build() *Operation { + m0 := &Operation{} + b, x := &b0, m0 + _, _ = b, x + x.Tags = b.Tags + x.Summary = b.Summary + x.Description = b.Description + x.ExternalDocs = b.ExternalDocs + x.OperationId = b.OperationId + x.Consumes = b.Consumes + x.Produces = b.Produces + x.Responses = b.Responses + x.Schemes = b.Schemes + x.Deprecated = b.Deprecated + x.Security = b.Security + x.Extensions = b.Extensions + x.Parameters = b.Parameters + return m0 +} + +// `Parameters` is a representation of OpenAPI v2 specification's parameters object. +// Note: This technically breaks compatibility with the OpenAPI 2 definition structure as we only +// allow header parameters to be set here since we do not want users specifying custom non-header +// parameters beyond those inferred from the Protobuf schema. +// See: https://swagger.io/specification/v2/#parameter-object +type Parameters struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + Headers []*HeaderParameter `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Parameters) Reset() { + *x = Parameters{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Parameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameters) ProtoMessage() {} + +func (x *Parameters) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Parameters) GetHeaders() []*HeaderParameter { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Parameters) SetHeaders(v []*HeaderParameter) { + x.Headers = v +} + +type Parameters_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + Headers []*HeaderParameter +} + +func (b0 Parameters_builder) Build() *Parameters { + m0 := &Parameters{} + b, x := &b0, m0 + _, _ = b, x + x.Headers = b.Headers + return m0 +} + +// `HeaderParameter` a HTTP header parameter. +// See: https://swagger.io/specification/v2/#parameter-object +type HeaderParameter struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Name` is the header name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // `Description` is a short description of the header. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type HeaderParameter_Type `protobuf:"varint,3,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter_Type" json:"type,omitempty"` + // `Format` The extending format for the previously mentioned type. + Format string `protobuf:"bytes,4,opt,name=format,proto3" json:"format,omitempty"` + // `Required` indicates if the header is optional + Required bool `protobuf:"varint,5,opt,name=required,proto3" json:"required,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HeaderParameter) Reset() { + *x = HeaderParameter{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HeaderParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderParameter) ProtoMessage() {} + +func (x *HeaderParameter) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *HeaderParameter) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *HeaderParameter) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *HeaderParameter) GetType() HeaderParameter_Type { + if x != nil { + return x.Type + } + return HeaderParameter_UNKNOWN +} + +func (x *HeaderParameter) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *HeaderParameter) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *HeaderParameter) SetName(v string) { + x.Name = v +} + +func (x *HeaderParameter) SetDescription(v string) { + x.Description = v +} + +func (x *HeaderParameter) SetType(v HeaderParameter_Type) { + x.Type = v +} + +func (x *HeaderParameter) SetFormat(v string) { + x.Format = v +} + +func (x *HeaderParameter) SetRequired(v bool) { + x.Required = v +} + +type HeaderParameter_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Name` is the header name. + Name string + // `Description` is a short description of the header. + Description string + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type HeaderParameter_Type + // `Format` The extending format for the previously mentioned type. + Format string + // `Required` indicates if the header is optional + Required bool +} + +func (b0 HeaderParameter_builder) Build() *HeaderParameter { + m0 := &HeaderParameter{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Description = b.Description + x.Type = b.Type + x.Format = b.Format + x.Required = b.Required + return m0 +} + +// `Header` is a representation of OpenAPI v2 specification's Header object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject +type Header struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Description` is a short description of the header. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // `Format` The extending format for the previously mentioned type. + Format string `protobuf:"bytes,3,opt,name=format,proto3" json:"format,omitempty"` + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + Default string `protobuf:"bytes,6,opt,name=default,proto3" json:"default,omitempty"` + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + Pattern string `protobuf:"bytes,13,opt,name=pattern,proto3" json:"pattern,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Header) Reset() { + *x = Header{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Header) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Header) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *Header) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *Header) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *Header) SetDescription(v string) { + x.Description = v +} + +func (x *Header) SetType(v string) { + x.Type = v +} + +func (x *Header) SetFormat(v string) { + x.Format = v +} + +func (x *Header) SetDefault(v string) { + x.Default = v +} + +func (x *Header) SetPattern(v string) { + x.Pattern = v +} + +type Header_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the header. + Description string + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + Type string + // `Format` The extending format for the previously mentioned type. + Format string + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + Default string + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + Pattern string +} + +func (b0 Header_builder) Build() *Header { + m0 := &Header{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Type = b.Type + x.Format = b.Format + x.Default = b.Default + x.Pattern = b.Pattern + return m0 +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +type Response struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema *Schema `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + Headers map[string]*Header `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + Examples map[string]string `protobuf:"bytes,4,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Response) GetSchema() *Schema { + if x != nil { + return x.Schema + } + return nil +} + +func (x *Response) GetHeaders() map[string]*Header { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Response) GetExamples() map[string]string { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Response) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Response) SetDescription(v string) { + x.Description = v +} + +func (x *Response) SetSchema(v *Schema) { + x.Schema = v +} + +func (x *Response) SetHeaders(v map[string]*Header) { + x.Headers = v +} + +func (x *Response) SetExamples(v map[string]string) { + x.Examples = v +} + +func (x *Response) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Response) HasSchema() bool { + if x == nil { + return false + } + return x.Schema != nil +} + +func (x *Response) ClearSchema() { + x.Schema = nil +} + +type Response_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + Description string + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema *Schema + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + Headers map[string]*Header + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + Examples map[string]string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Response_builder) Build() *Response { + m0 := &Response{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Schema = b.Schema + x.Headers = b.Headers + x.Examples = b.Examples + x.Extensions = b.Extensions + return m0 +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// ... +// }; +type Info struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The title of the application. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // A short description of the application. GFM syntax can be used for rich + // text representation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // The Terms of Service for the API. + TermsOfService string `protobuf:"bytes,3,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + // The contact information for the exposed API. + Contact *Contact `protobuf:"bytes,4,opt,name=contact,proto3" json:"contact,omitempty"` + // The license information for the exposed API. + License *License `protobuf:"bytes,5,opt,name=license,proto3" json:"license,omitempty"` + // Provides the version of the application API (not to be confused + // with the specification version). + Version string `protobuf:"bytes,6,opt,name=version,proto3" json:"version,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,7,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Info) Reset() { + *x = Info{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.License + } + return nil +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Info) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Info) SetTitle(v string) { + x.Title = v +} + +func (x *Info) SetDescription(v string) { + x.Description = v +} + +func (x *Info) SetTermsOfService(v string) { + x.TermsOfService = v +} + +func (x *Info) SetContact(v *Contact) { + x.Contact = v +} + +func (x *Info) SetLicense(v *License) { + x.License = v +} + +func (x *Info) SetVersion(v string) { + x.Version = v +} + +func (x *Info) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Info) HasContact() bool { + if x == nil { + return false + } + return x.Contact != nil +} + +func (x *Info) HasLicense() bool { + if x == nil { + return false + } + return x.License != nil +} + +func (x *Info) ClearContact() { + x.Contact = nil +} + +func (x *Info) ClearLicense() { + x.License = nil +} + +type Info_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The title of the application. + Title string + // A short description of the application. GFM syntax can be used for rich + // text representation. + Description string + // The Terms of Service for the API. + TermsOfService string + // The contact information for the exposed API. + Contact *Contact + // The license information for the exposed API. + License *License + // Provides the version of the application API (not to be confused + // with the specification version). + Version string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Info_builder) Build() *Info { + m0 := &Info{} + b, x := &b0, m0 + _, _ = b, x + x.Title = b.Title + x.Description = b.Description + x.TermsOfService = b.TermsOfService + x.Contact = b.Contact + x.License = b.License + x.Version = b.Version + x.Extensions = b.Extensions + return m0 +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// ... +// }; +// ... +// }; +type Contact struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The identifying name of the contact person/organization. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The URL pointing to the contact information. MUST be in the format of a + // URL. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + // The email address of the contact person/organization. MUST be in the format + // of an email address. + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Contact) Reset() { + *x = Contact{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Contact) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *Contact) SetName(v string) { + x.Name = v +} + +func (x *Contact) SetUrl(v string) { + x.Url = v +} + +func (x *Contact) SetEmail(v string) { + x.Email = v +} + +type Contact_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The identifying name of the contact person/organization. + Name string + // The URL pointing to the contact information. MUST be in the format of a + // URL. + Url string + // The email address of the contact person/organization. MUST be in the format + // of an email address. + Email string +} + +func (b0 Contact_builder) Build() *Contact { + m0 := &Contact{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Url = b.Url + x.Email = b.Email + return m0 +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// ... +// }; +// ... +// }; +type License struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The license name used for the API. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A URL to the license used for the API. MUST be in the format of a URL. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *License) Reset() { + *x = License{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *License) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *License) SetName(v string) { + x.Name = v +} + +func (x *License) SetUrl(v string) { + x.Url = v +} + +type License_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The license name used for the API. + Name string + // A URL to the license used for the API. MUST be in the format of a URL. + Url string +} + +func (b0 License_builder) Build() *License { + m0 := &License{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Url = b.Url + return m0 +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// ... +// external_docs: { +// description: "More about gRPC-Gateway"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// } +// ... +// }; +type ExternalDocumentation struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // The URL for the target documentation. Value MUST be in the format + // of a URL. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalDocumentation) Reset() { + *x = ExternalDocumentation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalDocumentation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocumentation) ProtoMessage() {} + +func (x *ExternalDocumentation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *ExternalDocumentation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ExternalDocumentation) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *ExternalDocumentation) SetDescription(v string) { + x.Description = v +} + +func (x *ExternalDocumentation) SetUrl(v string) { + x.Url = v +} + +type ExternalDocumentation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + Description string + // The URL for the target documentation. Value MUST be in the format + // of a URL. + Url string +} + +func (b0 ExternalDocumentation_builder) Build() *ExternalDocumentation { + m0 := &ExternalDocumentation{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Url = b.Url + return m0 +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +type Schema struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + JsonSchema *JSONSchema `protobuf:"bytes,1,opt,name=json_schema,json=jsonSchema,proto3" json:"json_schema,omitempty"` + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + Discriminator string `protobuf:"bytes,2,opt,name=discriminator,proto3" json:"discriminator,omitempty"` + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,5,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + Example string `protobuf:"bytes,6,opt,name=example,proto3" json:"example,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Schema) Reset() { + *x = Schema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Schema) GetJsonSchema() *JSONSchema { + if x != nil { + return x.JsonSchema + } + return nil +} + +func (x *Schema) GetDiscriminator() string { + if x != nil { + return x.Discriminator + } + return "" +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *Schema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Schema) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *Schema) SetJsonSchema(v *JSONSchema) { + x.JsonSchema = v +} + +func (x *Schema) SetDiscriminator(v string) { + x.Discriminator = v +} + +func (x *Schema) SetReadOnly(v bool) { + x.ReadOnly = v +} + +func (x *Schema) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Schema) SetExample(v string) { + x.Example = v +} + +func (x *Schema) HasJsonSchema() bool { + if x == nil { + return false + } + return x.JsonSchema != nil +} + +func (x *Schema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Schema) ClearJsonSchema() { + x.JsonSchema = nil +} + +func (x *Schema) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type Schema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + JsonSchema *JSONSchema + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + Discriminator string + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + Example string +} + +func (b0 Schema_builder) Build() *Schema { + m0 := &Schema{} + b, x := &b0, m0 + _, _ = b, x + x.JsonSchema = b.JsonSchema + x.Discriminator = b.Discriminator + x.ReadOnly = b.ReadOnly + x.ExternalDocs = b.ExternalDocs + x.Example = b.Example + return m0 +} + +// `EnumSchema` is subset of fields from the OpenAPI v2 specification's Schema object. +// Only fields that are applicable to Enums are included +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = { +// ... +// title: "MyEnum"; +// description:"This is my nice enum"; +// example: "ZERO"; +// required: true; +// ... +// }; +type EnumSchema struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A short description of the schema. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` + // The title of the schema. + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + ReadOnly bool `protobuf:"varint,5,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,6,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + Example string `protobuf:"bytes,7,opt,name=example,proto3" json:"example,omitempty"` + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string `protobuf:"bytes,8,opt,name=ref,proto3" json:"ref,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumSchema) Reset() { + *x = EnumSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumSchema) ProtoMessage() {} + +func (x *EnumSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *EnumSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *EnumSchema) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *EnumSchema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *EnumSchema) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *EnumSchema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *EnumSchema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *EnumSchema) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *EnumSchema) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *EnumSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *EnumSchema) SetDescription(v string) { + x.Description = v +} + +func (x *EnumSchema) SetDefault(v string) { + x.Default = v +} + +func (x *EnumSchema) SetTitle(v string) { + x.Title = v +} + +func (x *EnumSchema) SetRequired(v bool) { + x.Required = v +} + +func (x *EnumSchema) SetReadOnly(v bool) { + x.ReadOnly = v +} + +func (x *EnumSchema) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *EnumSchema) SetExample(v string) { + x.Example = v +} + +func (x *EnumSchema) SetRef(v string) { + x.Ref = v +} + +func (x *EnumSchema) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *EnumSchema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *EnumSchema) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type EnumSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the schema. + Description string + Default string + // The title of the schema. + Title string + Required bool + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + Example string + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 EnumSchema_builder) Build() *EnumSchema { + m0 := &EnumSchema{} + b, x := &b0, m0 + _, _ = b, x + x.Description = b.Description + x.Default = b.Default + x.Title = b.Title + x.Required = b.Required + x.ReadOnly = b.ReadOnly + x.ExternalDocs = b.ExternalDocs + x.Example = b.Example + x.Ref = b.Ref + x.Extensions = b.Extensions + return m0 +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +// +// Example: +// +// message SimpleMessage { +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { +// json_schema: { +// title: "SimpleMessage" +// description: "A simple message." +// required: ["id"] +// } +// }; +// +// // Id represents the message identifier. +// string id = 1; [ +// (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { +// description: "The unique identifier of the simple message." +// }]; +// } +type JSONSchema struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string `protobuf:"bytes,3,opt,name=ref,proto3" json:"ref,omitempty"` + // The title of the schema. + Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` + // A short description of the schema. + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + Default string `protobuf:"bytes,7,opt,name=default,proto3" json:"default,omitempty"` + ReadOnly bool `protobuf:"varint,8,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + Example string `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"` + MultipleOf float64 `protobuf:"fixed64,10,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength uint64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength uint64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems uint64 `protobuf:"varint,20,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems uint64 `protobuf:"varint,21,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,22,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + MaxProperties uint64 `protobuf:"varint,24,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + MinProperties uint64 `protobuf:"varint,25,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + Required []string `protobuf:"bytes,26,rep,name=required,proto3" json:"required,omitempty"` + // Items in 'array' must be unique. + Array []string `protobuf:"bytes,34,rep,name=array,proto3" json:"array,omitempty"` + Type []JSONSchema_JSONSchemaSimpleTypes `protobuf:"varint,35,rep,packed,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.JSONSchema_JSONSchemaSimpleTypes" json:"type,omitempty"` + // `Format` + Format string `protobuf:"bytes,36,opt,name=format,proto3" json:"format,omitempty"` + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + Enum []string `protobuf:"bytes,46,rep,name=enum,proto3" json:"enum,omitempty"` + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration *JSONSchema_FieldConfiguration `protobuf:"bytes,1001,opt,name=field_configuration,json=fieldConfiguration,proto3" json:"field_configuration,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,48,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema) Reset() { + *x = JSONSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema) ProtoMessage() {} + +func (x *JSONSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *JSONSchema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *JSONSchema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *JSONSchema) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *JSONSchema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *JSONSchema) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *JSONSchema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *JSONSchema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *JSONSchema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *JSONSchema) GetMaxLength() uint64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *JSONSchema) GetMinLength() uint64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *JSONSchema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *JSONSchema) GetMaxItems() uint64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *JSONSchema) GetMinItems() uint64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *JSONSchema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *JSONSchema) GetMaxProperties() uint64 { + if x != nil { + return x.MaxProperties + } + return 0 +} + +func (x *JSONSchema) GetMinProperties() uint64 { + if x != nil { + return x.MinProperties + } + return 0 +} + +func (x *JSONSchema) GetRequired() []string { + if x != nil { + return x.Required + } + return nil +} + +func (x *JSONSchema) GetArray() []string { + if x != nil { + return x.Array + } + return nil +} + +func (x *JSONSchema) GetType() []JSONSchema_JSONSchemaSimpleTypes { + if x != nil { + return x.Type + } + return nil +} + +func (x *JSONSchema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *JSONSchema) GetEnum() []string { + if x != nil { + return x.Enum + } + return nil +} + +func (x *JSONSchema) GetFieldConfiguration() *JSONSchema_FieldConfiguration { + if x != nil { + return x.FieldConfiguration + } + return nil +} + +func (x *JSONSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *JSONSchema) SetRef(v string) { + x.Ref = v +} + +func (x *JSONSchema) SetTitle(v string) { + x.Title = v +} + +func (x *JSONSchema) SetDescription(v string) { + x.Description = v +} + +func (x *JSONSchema) SetDefault(v string) { + x.Default = v +} + +func (x *JSONSchema) SetReadOnly(v bool) { + x.ReadOnly = v +} + +func (x *JSONSchema) SetExample(v string) { + x.Example = v +} + +func (x *JSONSchema) SetMultipleOf(v float64) { + x.MultipleOf = v +} + +func (x *JSONSchema) SetMaximum(v float64) { + x.Maximum = v +} + +func (x *JSONSchema) SetExclusiveMaximum(v bool) { + x.ExclusiveMaximum = v +} + +func (x *JSONSchema) SetMinimum(v float64) { + x.Minimum = v +} + +func (x *JSONSchema) SetExclusiveMinimum(v bool) { + x.ExclusiveMinimum = v +} + +func (x *JSONSchema) SetMaxLength(v uint64) { + x.MaxLength = v +} + +func (x *JSONSchema) SetMinLength(v uint64) { + x.MinLength = v +} + +func (x *JSONSchema) SetPattern(v string) { + x.Pattern = v +} + +func (x *JSONSchema) SetMaxItems(v uint64) { + x.MaxItems = v +} + +func (x *JSONSchema) SetMinItems(v uint64) { + x.MinItems = v +} + +func (x *JSONSchema) SetUniqueItems(v bool) { + x.UniqueItems = v +} + +func (x *JSONSchema) SetMaxProperties(v uint64) { + x.MaxProperties = v +} + +func (x *JSONSchema) SetMinProperties(v uint64) { + x.MinProperties = v +} + +func (x *JSONSchema) SetRequired(v []string) { + x.Required = v +} + +func (x *JSONSchema) SetArray(v []string) { + x.Array = v +} + +func (x *JSONSchema) SetType(v []JSONSchema_JSONSchemaSimpleTypes) { + x.Type = v +} + +func (x *JSONSchema) SetFormat(v string) { + x.Format = v +} + +func (x *JSONSchema) SetEnum(v []string) { + x.Enum = v +} + +func (x *JSONSchema) SetFieldConfiguration(v *JSONSchema_FieldConfiguration) { + x.FieldConfiguration = v +} + +func (x *JSONSchema) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *JSONSchema) HasFieldConfiguration() bool { + if x == nil { + return false + } + return x.FieldConfiguration != nil +} + +func (x *JSONSchema) ClearFieldConfiguration() { + x.FieldConfiguration = nil +} + +type JSONSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // The title of the schema. + Title string + // A short description of the schema. + Description string + Default string + ReadOnly bool + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + Example string + MultipleOf float64 + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + Maximum float64 + ExclusiveMaximum bool + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + Minimum float64 + ExclusiveMinimum bool + MaxLength uint64 + MinLength uint64 + Pattern string + MaxItems uint64 + MinItems uint64 + UniqueItems bool + MaxProperties uint64 + MinProperties uint64 + Required []string + // Items in 'array' must be unique. + Array []string + Type []JSONSchema_JSONSchemaSimpleTypes + // `Format` + Format string + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + Enum []string + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration *JSONSchema_FieldConfiguration + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 JSONSchema_builder) Build() *JSONSchema { + m0 := &JSONSchema{} + b, x := &b0, m0 + _, _ = b, x + x.Ref = b.Ref + x.Title = b.Title + x.Description = b.Description + x.Default = b.Default + x.ReadOnly = b.ReadOnly + x.Example = b.Example + x.MultipleOf = b.MultipleOf + x.Maximum = b.Maximum + x.ExclusiveMaximum = b.ExclusiveMaximum + x.Minimum = b.Minimum + x.ExclusiveMinimum = b.ExclusiveMinimum + x.MaxLength = b.MaxLength + x.MinLength = b.MinLength + x.Pattern = b.Pattern + x.MaxItems = b.MaxItems + x.MinItems = b.MinItems + x.UniqueItems = b.UniqueItems + x.MaxProperties = b.MaxProperties + x.MinProperties = b.MinProperties + x.Required = b.Required + x.Array = b.Array + x.Type = b.Type + x.Format = b.Format + x.Enum = b.Enum + x.FieldConfiguration = b.FieldConfiguration + x.Extensions = b.Extensions + return m0 +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +type Tag struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A short description for the tag. GFM syntax can be used for rich text + // representation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,4,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Tag) Reset() { + *x = Tag{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Tag) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Tag) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *Tag) SetName(v string) { + x.Name = v +} + +func (x *Tag) SetDescription(v string) { + x.Description = v +} + +func (x *Tag) SetExternalDocs(v *ExternalDocumentation) { + x.ExternalDocs = v +} + +func (x *Tag) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *Tag) HasExternalDocs() bool { + if x == nil { + return false + } + return x.ExternalDocs != nil +} + +func (x *Tag) ClearExternalDocs() { + x.ExternalDocs = nil +} + +type Tag_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + Name string + // A short description for the tag. GFM syntax can be used for rich text + // representation. + Description string + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Tag_builder) Build() *Tag { + m0 := &Tag{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Description = b.Description + x.ExternalDocs = b.ExternalDocs + x.Extensions = b.Extensions + return m0 +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +type SecurityDefinitions struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + Security map[string]*SecurityScheme `protobuf:"bytes,1,rep,name=security,proto3" json:"security,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityDefinitions) Reset() { + *x = SecurityDefinitions{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDefinitions) ProtoMessage() {} + +func (x *SecurityDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityDefinitions) GetSecurity() map[string]*SecurityScheme { + if x != nil { + return x.Security + } + return nil +} + +func (x *SecurityDefinitions) SetSecurity(v map[string]*SecurityScheme) { + x.Security = v +} + +type SecurityDefinitions_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + Security map[string]*SecurityScheme +} + +func (b0 SecurityDefinitions_builder) Build() *SecurityDefinitions { + m0 := &SecurityDefinitions{} + b, x := &b0, m0 + _, _ = b, x + x.Security = b.Security + return m0 +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +type SecurityScheme struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type SecurityScheme_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Type" json:"type,omitempty"` + // A short description for security scheme. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // The name of the header or query parameter to be used. + // Valid for apiKey. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In SecurityScheme_In `protobuf:"varint,4,opt,name=in,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_In" json:"in,omitempty"` + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow SecurityScheme_Flow `protobuf:"varint,5,opt,name=flow,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Flow" json:"flow,omitempty"` + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + AuthorizationUrl string `protobuf:"bytes,6,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + TokenUrl string `protobuf:"bytes,7,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes *Scopes `protobuf:"bytes,8,opt,name=scopes,proto3" json:"scopes,omitempty"` + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityScheme) Reset() { + *x = SecurityScheme{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityScheme) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScheme) ProtoMessage() {} + +func (x *SecurityScheme) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityScheme) GetType() SecurityScheme_Type { + if x != nil { + return x.Type + } + return SecurityScheme_TYPE_INVALID +} + +func (x *SecurityScheme) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SecurityScheme) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SecurityScheme) GetIn() SecurityScheme_In { + if x != nil { + return x.In + } + return SecurityScheme_IN_INVALID +} + +func (x *SecurityScheme) GetFlow() SecurityScheme_Flow { + if x != nil { + return x.Flow + } + return SecurityScheme_FLOW_INVALID +} + +func (x *SecurityScheme) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *SecurityScheme) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *SecurityScheme) GetScopes() *Scopes { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *SecurityScheme) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.Extensions + } + return nil +} + +func (x *SecurityScheme) SetType(v SecurityScheme_Type) { + x.Type = v +} + +func (x *SecurityScheme) SetDescription(v string) { + x.Description = v +} + +func (x *SecurityScheme) SetName(v string) { + x.Name = v +} + +func (x *SecurityScheme) SetIn(v SecurityScheme_In) { + x.In = v +} + +func (x *SecurityScheme) SetFlow(v SecurityScheme_Flow) { + x.Flow = v +} + +func (x *SecurityScheme) SetAuthorizationUrl(v string) { + x.AuthorizationUrl = v +} + +func (x *SecurityScheme) SetTokenUrl(v string) { + x.TokenUrl = v +} + +func (x *SecurityScheme) SetScopes(v *Scopes) { + x.Scopes = v +} + +func (x *SecurityScheme) SetExtensions(v map[string]*structpb.Value) { + x.Extensions = v +} + +func (x *SecurityScheme) HasScopes() bool { + if x == nil { + return false + } + return x.Scopes != nil +} + +func (x *SecurityScheme) ClearScopes() { + x.Scopes = nil +} + +type SecurityScheme_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type SecurityScheme_Type + // A short description for security scheme. + Description string + // The name of the header or query parameter to be used. + // Valid for apiKey. + Name string + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In SecurityScheme_In + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow SecurityScheme_Flow + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + AuthorizationUrl string + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + TokenUrl string + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes *Scopes + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 SecurityScheme_builder) Build() *SecurityScheme { + m0 := &SecurityScheme{} + b, x := &b0, m0 + _, _ = b, x + x.Type = b.Type + x.Description = b.Description + x.Name = b.Name + x.In = b.In + x.Flow = b.Flow + x.AuthorizationUrl = b.AuthorizationUrl + x.TokenUrl = b.TokenUrl + x.Scopes = b.Scopes + x.Extensions = b.Extensions + return m0 +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +type SecurityRequirement struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue `protobuf:"bytes,1,rep,name=security_requirement,json=securityRequirement,proto3" json:"security_requirement,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement) GetSecurityRequirement() map[string]*SecurityRequirement_SecurityRequirementValue { + if x != nil { + return x.SecurityRequirement + } + return nil +} + +func (x *SecurityRequirement) SetSecurityRequirement(v map[string]*SecurityRequirement_SecurityRequirementValue) { + x.SecurityRequirement = v +} + +type SecurityRequirement_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue +} + +func (b0 SecurityRequirement_builder) Build() *SecurityRequirement { + m0 := &SecurityRequirement{} + b, x := &b0, m0 + _, _ = b, x + x.SecurityRequirement = b.SecurityRequirement + return m0 +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +type Scopes struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Maps between a name of a scope to a short description of it (as the value + // of the property). + Scope map[string]string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Scopes) Reset() { + *x = Scopes{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Scopes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Scopes) ProtoMessage() {} + +func (x *Scopes) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Scopes) GetScope() map[string]string { + if x != nil { + return x.Scope + } + return nil +} + +func (x *Scopes) SetScope(v map[string]string) { + x.Scope = v +} + +type Scopes_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Maps between a name of a scope to a short description of it (as the value + // of the property). + Scope map[string]string +} + +func (b0 Scopes_builder) Build() *Scopes { + m0 := &Scopes{} + b, x := &b0, m0 + _, _ = b, x + x.Scope = b.Scope + return m0 +} + +// 'FieldConfiguration' provides additional field level properties used when generating the OpenAPI v2 file. +// These properties are not defined by OpenAPIv2, but they are used to control the generation. +type JSONSchema_FieldConfiguration struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + PathParamName string `protobuf:"bytes,47,opt,name=path_param_name,json=pathParamName,proto3" json:"path_param_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema_FieldConfiguration) Reset() { + *x = JSONSchema_FieldConfiguration{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema_FieldConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema_FieldConfiguration) ProtoMessage() {} + +func (x *JSONSchema_FieldConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema_FieldConfiguration) GetPathParamName() string { + if x != nil { + return x.PathParamName + } + return "" +} + +func (x *JSONSchema_FieldConfiguration) SetPathParamName(v string) { + x.PathParamName = v +} + +type JSONSchema_FieldConfiguration_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + PathParamName string +} + +func (b0 JSONSchema_FieldConfiguration_builder) Build() *JSONSchema_FieldConfiguration { + m0 := &JSONSchema_FieldConfiguration{} + b, x := &b0, m0 + _, _ = b, x + x.PathParamName = b.PathParamName + return m0 +} + +// If the security scheme is of type "oauth2", then the value is a list of +// scope names required for the execution. For other security scheme types, +// the array MUST be empty. +type SecurityRequirement_SecurityRequirementValue struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Scope []string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement_SecurityRequirementValue) Reset() { + *x = SecurityRequirement_SecurityRequirementValue{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement_SecurityRequirementValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement_SecurityRequirementValue) ProtoMessage() {} + +func (x *SecurityRequirement_SecurityRequirementValue) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement_SecurityRequirementValue) GetScope() []string { + if x != nil { + return x.Scope + } + return nil +} + +func (x *SecurityRequirement_SecurityRequirementValue) SetScope(v []string) { + x.Scope = v +} + +type SecurityRequirement_SecurityRequirementValue_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Scope []string +} + +func (b0 SecurityRequirement_SecurityRequirementValue_builder) Build() *SecurityRequirement_SecurityRequirementValue { + m0 := &SecurityRequirement_SecurityRequirementValue{} + b, x := &b0, m0 + _, _ = b, x + x.Scope = b.Scope + return m0 +} + +var File_protoc_gen_openapiv2_options_openapiv2_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, 0x08, 0x0a, 0x07, 0x53, 0x77, 0x61, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x12, 0x43, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x61, 0x73, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xd6, 0x07, + 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x55, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0x62, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x0f, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x45, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, + 0x22, 0xd8, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, + 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, + 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, + 0x0e, 0x10, 0x0f, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, + 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, 0x22, 0x9a, 0x05, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x5a, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x12, 0x63, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6d, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x03, 0x0a, 0x04, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x45, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x4b, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0xaa, 0x02, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x56, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x6a, + 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x22, 0xe8, 0x03, 0x0a, 0x0a, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, + 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, + 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, + 0x0a, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x78, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, + 0x22, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x12, 0x5f, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x23, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x4b, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x2e, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x7a, 0x0a, 0x13, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x12, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x12, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x74, + 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x77, 0x0a, 0x15, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x52, 0x52, 0x41, 0x59, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, + 0x10, 0x13, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x4a, 0x04, + 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x4a, 0x04, 0x08, 0x1d, 0x10, 0x1e, + 0x4a, 0x04, 0x08, 0x1e, 0x10, 0x22, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x2a, 0x4a, 0x04, 0x08, 0x2a, + 0x10, 0x2b, 0x4a, 0x04, 0x08, 0x2b, 0x10, 0x2e, 0x22, 0xd9, 0x02, 0x0a, 0x03, 0x54, 0x61, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x5e, 0x0a, + 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, + 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x68, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x76, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, + 0x06, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x12, 0x52, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x02, 0x69, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x10, + 0x03, 0x22, 0x31, 0x0a, 0x02, 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x5f, 0x51, 0x55, + 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x44, + 0x45, 0x52, 0x10, 0x02, 0x22, 0x6a, 0x0a, 0x04, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x0c, + 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, + 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, + 0x52, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x41, 0x50, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x04, + 0x22, 0xf6, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x30, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x01, 0x0a, 0x06, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x2a, 0x3b, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x57, 0x53, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x57, 0x53, 0x53, 0x10, 0x04, 0x42, + 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = []any{ + (Scheme)(0), // 0: grpc.gateway.protoc_gen_openapiv2.options.Scheme + (HeaderParameter_Type)(0), // 1: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + (JSONSchema_JSONSchemaSimpleTypes)(0), // 2: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + (SecurityScheme_Type)(0), // 3: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + (SecurityScheme_In)(0), // 4: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + (SecurityScheme_Flow)(0), // 5: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Parameters)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Parameters + (*HeaderParameter)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + (*Header)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Header + (*Response)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.Response + (*Info)(nil), // 12: grpc.gateway.protoc_gen_openapiv2.options.Info + (*Contact)(nil), // 13: grpc.gateway.protoc_gen_openapiv2.options.Contact + (*License)(nil), // 14: grpc.gateway.protoc_gen_openapiv2.options.License + (*ExternalDocumentation)(nil), // 15: grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + (*Schema)(nil), // 16: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 17: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*JSONSchema)(nil), // 18: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + (*Tag)(nil), // 19: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*SecurityDefinitions)(nil), // 20: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + (*SecurityScheme)(nil), // 21: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + (*SecurityRequirement)(nil), // 22: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + (*Scopes)(nil), // 23: grpc.gateway.protoc_gen_openapiv2.options.Scopes + nil, // 24: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + nil, // 25: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + nil, // 26: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + nil, // 27: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + nil, // 28: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + nil, // 29: grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + nil, // 30: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + nil, // 31: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + nil, // 32: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + (*JSONSchema_FieldConfiguration)(nil), // 33: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + nil, // 34: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + nil, // 35: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + nil, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + nil, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + (*SecurityRequirement_SecurityRequirementValue)(nil), // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + nil, // 39: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + nil, // 40: grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + (*structpb.Value)(nil), // 41: google.protobuf.Value +} +var file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = []int32{ + 12, // 0: grpc.gateway.protoc_gen_openapiv2.options.Swagger.info:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info + 0, // 1: grpc.gateway.protoc_gen_openapiv2.options.Swagger.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 24, // 2: grpc.gateway.protoc_gen_openapiv2.options.Swagger.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + 20, // 3: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security_definitions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + 22, // 4: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 19, // 5: grpc.gateway.protoc_gen_openapiv2.options.Swagger.tags:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 15, // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 25, // 7: grpc.gateway.protoc_gen_openapiv2.options.Swagger.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + 15, // 8: grpc.gateway.protoc_gen_openapiv2.options.Operation.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 26, // 9: grpc.gateway.protoc_gen_openapiv2.options.Operation.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + 0, // 10: grpc.gateway.protoc_gen_openapiv2.options.Operation.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 22, // 11: grpc.gateway.protoc_gen_openapiv2.options.Operation.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 27, // 12: grpc.gateway.protoc_gen_openapiv2.options.Operation.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + 8, // 13: grpc.gateway.protoc_gen_openapiv2.options.Operation.parameters:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Parameters + 9, // 14: grpc.gateway.protoc_gen_openapiv2.options.Parameters.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + 1, // 15: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + 16, // 16: grpc.gateway.protoc_gen_openapiv2.options.Response.schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 28, // 17: grpc.gateway.protoc_gen_openapiv2.options.Response.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + 29, // 18: grpc.gateway.protoc_gen_openapiv2.options.Response.examples:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + 30, // 19: grpc.gateway.protoc_gen_openapiv2.options.Response.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + 13, // 20: grpc.gateway.protoc_gen_openapiv2.options.Info.contact:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Contact + 14, // 21: grpc.gateway.protoc_gen_openapiv2.options.Info.license:type_name -> grpc.gateway.protoc_gen_openapiv2.options.License + 31, // 22: grpc.gateway.protoc_gen_openapiv2.options.Info.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + 18, // 23: grpc.gateway.protoc_gen_openapiv2.options.Schema.json_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 15, // 24: grpc.gateway.protoc_gen_openapiv2.options.Schema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 15, // 25: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 32, // 26: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + 2, // 27: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + 33, // 28: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.field_configuration:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + 34, // 29: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + 15, // 30: grpc.gateway.protoc_gen_openapiv2.options.Tag.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 35, // 31: grpc.gateway.protoc_gen_openapiv2.options.Tag.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + 36, // 32: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + 3, // 33: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + 4, // 34: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.in:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + 5, // 35: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.flow:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + 23, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.scopes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes + 37, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + 39, // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.security_requirement:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + 40, // 39: grpc.gateway.protoc_gen_openapiv2.options.Scopes.scope:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + 11, // 40: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 41: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry.value:type_name -> google.protobuf.Value + 11, // 42: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 43: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry.value:type_name -> google.protobuf.Value + 10, // 44: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Header + 41, // 45: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 46: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 47: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 48: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 49: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry.value:type_name -> google.protobuf.Value + 21, // 50: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + 41, // 51: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry.value:type_name -> google.protobuf.Value + 38, // 52: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + 53, // [53:53] is the sub-list for method output_type + 53, // [53:53] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_openapiv2_proto_init() } +func file_protoc_gen_openapiv2_options_openapiv2_proto_init() { + if File_protoc_gen_openapiv2_options_openapiv2_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc, + NumEnums: 6, + NumMessages: 35, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs, + EnumInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes, + MessageInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes, + }.Build() + File_protoc_gen_openapiv2_options_openapiv2_proto = out.File + file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = nil +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.proto b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.proto new file mode 100644 index 0000000000..5313f0818a --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2.proto @@ -0,0 +1,759 @@ +syntax = "proto3"; + +package grpc.gateway.protoc_gen_openapiv2.options; + +import "google/protobuf/struct.proto"; + +option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options"; + +// Scheme describes the schemes supported by the OpenAPI Swagger +// and Operation objects. +enum Scheme { + UNKNOWN = 0; + HTTP = 1; + HTTPS = 2; + WS = 3; + WSS = 4; +} + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// schemes: HTTPS; +// consumes: "application/json"; +// produces: "application/json"; +// }; +// +message Swagger { + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + string swagger = 1; + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info info = 2; + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + string host = 3; + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + string base_path = 4; + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + repeated Scheme schemes = 5; + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + repeated string consumes = 6; + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + repeated string produces = 7; + // field 8 is reserved for 'paths'. + reserved 8; + // field 9 is reserved for 'definitions', which at this time are already + // exposed as and customizable as proto messages. + reserved 9; + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + map responses = 10; + // Security scheme definitions that can be used across the specification. + SecurityDefinitions security_definitions = 11; + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + repeated SecurityRequirement security = 12; + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + repeated Tag tags = 13; + // Additional external documentation. + ExternalDocumentation external_docs = 14; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 15; +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +// +// Example: +// +// service EchoService { +// rpc Echo(SimpleMessage) returns (SimpleMessage) { +// option (google.api.http) = { +// get: "/v1/example/echo/{id}" +// }; +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { +// summary: "Get a message."; +// operation_id: "getMessage"; +// tags: "echo"; +// responses: { +// key: "200" +// value: { +// description: "OK"; +// } +// } +// }; +// } +// } +message Operation { + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + repeated string tags = 1; + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + string summary = 2; + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + string description = 3; + // Additional external documentation for this operation. + ExternalDocumentation external_docs = 4; + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + string operation_id = 5; + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + repeated string consumes = 6; + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + repeated string produces = 7; + // field 8 is reserved for 'parameters'. + reserved 8; + // The list of possible responses as they are returned from executing this + // operation. + map responses = 9; + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + repeated Scheme schemes = 10; + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + bool deprecated = 11; + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + repeated SecurityRequirement security = 12; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 13; + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters parameters = 14; +} + +// `Parameters` is a representation of OpenAPI v2 specification's parameters object. +// Note: This technically breaks compatibility with the OpenAPI 2 definition structure as we only +// allow header parameters to be set here since we do not want users specifying custom non-header +// parameters beyond those inferred from the Protobuf schema. +// See: https://swagger.io/specification/v2/#parameter-object +message Parameters { + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + repeated HeaderParameter headers = 1; +} + +// `HeaderParameter` a HTTP header parameter. +// See: https://swagger.io/specification/v2/#parameter-object +message HeaderParameter { + // `Type` is a supported HTTP header type. + // See https://swagger.io/specification/v2/#parameterType. + enum Type { + UNKNOWN = 0; + STRING = 1; + NUMBER = 2; + INTEGER = 3; + BOOLEAN = 4; + } + + // `Name` is the header name. + string name = 1; + // `Description` is a short description of the header. + string description = 2; + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type type = 3; + // `Format` The extending format for the previously mentioned type. + string format = 4; + // `Required` indicates if the header is optional + bool required = 5; + // field 6 is reserved for 'items', but in OpenAPI-specific way. + reserved 6; + // field 7 is reserved `Collection Format`. Determines the format of the array if type array is used. + reserved 7; +} + +// `Header` is a representation of OpenAPI v2 specification's Header object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject +// +message Header { + // `Description` is a short description of the header. + string description = 1; + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + string type = 2; + // `Format` The extending format for the previously mentioned type. + string format = 3; + // field 4 is reserved for 'items', but in OpenAPI-specific way. + reserved 4; + // field 5 is reserved `Collection Format` Determines the format of the array if type array is used. + reserved 5; + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + string default = 6; + // field 7 is reserved for 'maximum'. + reserved 7; + // field 8 is reserved for 'exclusiveMaximum'. + reserved 8; + // field 9 is reserved for 'minimum'. + reserved 9; + // field 10 is reserved for 'exclusiveMinimum'. + reserved 10; + // field 11 is reserved for 'maxLength'. + reserved 11; + // field 12 is reserved for 'minLength'. + reserved 12; + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + string pattern = 13; + // field 14 is reserved for 'maxItems'. + reserved 14; + // field 15 is reserved for 'minItems'. + reserved 15; + // field 16 is reserved for 'uniqueItems'. + reserved 16; + // field 17 is reserved for 'enum'. + reserved 17; + // field 18 is reserved for 'multipleOf'. + reserved 18; +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +// +message Response { + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + string description = 1; + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema schema = 2; + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + map headers = 3; + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + map examples = 4; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 5; +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// ... +// }; +// +message Info { + // The title of the application. + string title = 1; + // A short description of the application. GFM syntax can be used for rich + // text representation. + string description = 2; + // The Terms of Service for the API. + string terms_of_service = 3; + // The contact information for the exposed API. + Contact contact = 4; + // The license information for the exposed API. + License license = 5; + // Provides the version of the application API (not to be confused + // with the specification version). + string version = 6; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 7; +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// ... +// }; +// ... +// }; +// +message Contact { + // The identifying name of the contact person/organization. + string name = 1; + // The URL pointing to the contact information. MUST be in the format of a + // URL. + string url = 2; + // The email address of the contact person/organization. MUST be in the format + // of an email address. + string email = 3; +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// ... +// }; +// ... +// }; +// +message License { + // The license name used for the API. + string name = 1; + // A URL to the license used for the API. MUST be in the format of a URL. + string url = 2; +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// ... +// external_docs: { +// description: "More about gRPC-Gateway"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// } +// ... +// }; +// +message ExternalDocumentation { + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + string description = 1; + // The URL for the target documentation. Value MUST be in the format + // of a URL. + string url = 2; +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +message Schema { + JSONSchema json_schema = 1; + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + string discriminator = 2; + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + bool read_only = 3; + // field 4 is reserved for 'xml'. + reserved 4; + // Additional external documentation for this schema. + ExternalDocumentation external_docs = 5; + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + string example = 6; +} + +// `EnumSchema` is subset of fields from the OpenAPI v2 specification's Schema object. +// Only fields that are applicable to Enums are included +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = { +// ... +// title: "MyEnum"; +// description:"This is my nice enum"; +// example: "ZERO"; +// required: true; +// ... +// }; +// +message EnumSchema { + // A short description of the schema. + string description = 1; + string default = 2; + // The title of the schema. + string title = 3; + bool required = 4; + bool read_only = 5; + // Additional external documentation for this schema. + ExternalDocumentation external_docs = 6; + string example = 7; + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // `ref: ".google.protobuf.Timestamp"`. + string ref = 8; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 9; +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +// +// Example: +// +// message SimpleMessage { +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { +// json_schema: { +// title: "SimpleMessage" +// description: "A simple message." +// required: ["id"] +// } +// }; +// +// // Id represents the message identifier. +// string id = 1; [ +// (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { +// description: "The unique identifier of the simple message." +// }]; +// } +// +message JSONSchema { + // field 1 is reserved for '$id', omitted from OpenAPI v2. + reserved 1; + // field 2 is reserved for '$schema', omitted from OpenAPI v2. + reserved 2; + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // `ref: ".google.protobuf.Timestamp"`. + string ref = 3; + // field 4 is reserved for '$comment', omitted from OpenAPI v2. + reserved 4; + // The title of the schema. + string title = 5; + // A short description of the schema. + string description = 6; + string default = 7; + bool read_only = 8; + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + string example = 9; + double multiple_of = 10; + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + double maximum = 11; + bool exclusive_maximum = 12; + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + double minimum = 13; + bool exclusive_minimum = 14; + uint64 max_length = 15; + uint64 min_length = 16; + string pattern = 17; + // field 18 is reserved for 'additionalItems', omitted from OpenAPI v2. + reserved 18; + // field 19 is reserved for 'items', but in OpenAPI-specific way. + // TODO(ivucica): add 'items'? + reserved 19; + uint64 max_items = 20; + uint64 min_items = 21; + bool unique_items = 22; + // field 23 is reserved for 'contains', omitted from OpenAPI v2. + reserved 23; + uint64 max_properties = 24; + uint64 min_properties = 25; + repeated string required = 26; + // field 27 is reserved for 'additionalProperties', but in OpenAPI-specific + // way. TODO(ivucica): add 'additionalProperties'? + reserved 27; + // field 28 is reserved for 'definitions', omitted from OpenAPI v2. + reserved 28; + // field 29 is reserved for 'properties', but in OpenAPI-specific way. + // TODO(ivucica): add 'additionalProperties'? + reserved 29; + // following fields are reserved, as the properties have been omitted from + // OpenAPI v2: + // patternProperties, dependencies, propertyNames, const + reserved 30 to 33; + // Items in 'array' must be unique. + repeated string array = 34; + + enum JSONSchemaSimpleTypes { + UNKNOWN = 0; + ARRAY = 1; + BOOLEAN = 2; + INTEGER = 3; + NULL = 4; + NUMBER = 5; + OBJECT = 6; + STRING = 7; + } + + repeated JSONSchemaSimpleTypes type = 35; + // `Format` + string format = 36; + // following fields are reserved, as the properties have been omitted from + // OpenAPI v2: contentMediaType, contentEncoding, if, then, else + reserved 37 to 41; + // field 42 is reserved for 'allOf', but in OpenAPI-specific way. + // TODO(ivucica): add 'allOf'? + reserved 42; + // following fields are reserved, as the properties have been omitted from + // OpenAPI v2: + // anyOf, oneOf, not + reserved 43 to 45; + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + repeated string enum = 46; + + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration field_configuration = 1001; + + // 'FieldConfiguration' provides additional field level properties used when generating the OpenAPI v2 file. + // These properties are not defined by OpenAPIv2, but they are used to control the generation. + message FieldConfiguration { + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + string path_param_name = 47; + } + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 48; +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +// +message Tag { + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + string name = 1; + // A short description for the tag. GFM syntax can be used for rich text + // representation. + string description = 2; + // Additional external documentation for this tag. + ExternalDocumentation external_docs = 3; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 4; +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +message SecurityDefinitions { + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + map security = 1; +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +message SecurityScheme { + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + enum Type { + TYPE_INVALID = 0; + TYPE_BASIC = 1; + TYPE_API_KEY = 2; + TYPE_OAUTH2 = 3; + } + + // The location of the API key. Valid values are "query" or "header". + enum In { + IN_INVALID = 0; + IN_QUERY = 1; + IN_HEADER = 2; + } + + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + enum Flow { + FLOW_INVALID = 0; + FLOW_IMPLICIT = 1; + FLOW_PASSWORD = 2; + FLOW_APPLICATION = 3; + FLOW_ACCESS_CODE = 4; + } + + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type type = 1; + // A short description for security scheme. + string description = 2; + // The name of the header or query parameter to be used. + // Valid for apiKey. + string name = 3; + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In in = 4; + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow flow = 5; + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + string authorization_url = 6; + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + string token_url = 7; + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes scopes = 8; + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + map extensions = 9; +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +message SecurityRequirement { + // If the security scheme is of type "oauth2", then the value is a list of + // scope names required for the execution. For other security scheme types, + // the array MUST be empty. + message SecurityRequirementValue { + repeated string scope = 1; + } + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + map security_requirement = 1; +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +message Scopes { + // Maps between a name of a scope to a short description of it (as the value + // of the property). + map scope = 1; +} diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2_protoopaque.pb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2_protoopaque.pb.go new file mode 100644 index 0000000000..1f0e0c2691 --- /dev/null +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options/openapiv2_protoopaque.pb.go @@ -0,0 +1,4055 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: protoc-gen-openapiv2/options/openapiv2.proto + +//go:build protoopaque + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Scheme describes the schemes supported by the OpenAPI Swagger +// and Operation objects. +type Scheme int32 + +const ( + Scheme_UNKNOWN Scheme = 0 + Scheme_HTTP Scheme = 1 + Scheme_HTTPS Scheme = 2 + Scheme_WS Scheme = 3 + Scheme_WSS Scheme = 4 +) + +// Enum value maps for Scheme. +var ( + Scheme_name = map[int32]string{ + 0: "UNKNOWN", + 1: "HTTP", + 2: "HTTPS", + 3: "WS", + 4: "WSS", + } + Scheme_value = map[string]int32{ + "UNKNOWN": 0, + "HTTP": 1, + "HTTPS": 2, + "WS": 3, + "WSS": 4, + } +) + +func (x Scheme) Enum() *Scheme { + p := new(Scheme) + *p = x + return p +} + +func (x Scheme) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Scheme) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0].Descriptor() +} + +func (Scheme) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[0] +} + +func (x Scheme) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Type` is a supported HTTP header type. +// See https://swagger.io/specification/v2/#parameterType. +type HeaderParameter_Type int32 + +const ( + HeaderParameter_UNKNOWN HeaderParameter_Type = 0 + HeaderParameter_STRING HeaderParameter_Type = 1 + HeaderParameter_NUMBER HeaderParameter_Type = 2 + HeaderParameter_INTEGER HeaderParameter_Type = 3 + HeaderParameter_BOOLEAN HeaderParameter_Type = 4 +) + +// Enum value maps for HeaderParameter_Type. +var ( + HeaderParameter_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STRING", + 2: "NUMBER", + 3: "INTEGER", + 4: "BOOLEAN", + } + HeaderParameter_Type_value = map[string]int32{ + "UNKNOWN": 0, + "STRING": 1, + "NUMBER": 2, + "INTEGER": 3, + "BOOLEAN": 4, + } +) + +func (x HeaderParameter_Type) Enum() *HeaderParameter_Type { + p := new(HeaderParameter_Type) + *p = x + return p +} + +func (x HeaderParameter_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (HeaderParameter_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1].Descriptor() +} + +func (HeaderParameter_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[1] +} + +func (x HeaderParameter_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +type JSONSchema_JSONSchemaSimpleTypes int32 + +const ( + JSONSchema_UNKNOWN JSONSchema_JSONSchemaSimpleTypes = 0 + JSONSchema_ARRAY JSONSchema_JSONSchemaSimpleTypes = 1 + JSONSchema_BOOLEAN JSONSchema_JSONSchemaSimpleTypes = 2 + JSONSchema_INTEGER JSONSchema_JSONSchemaSimpleTypes = 3 + JSONSchema_NULL JSONSchema_JSONSchemaSimpleTypes = 4 + JSONSchema_NUMBER JSONSchema_JSONSchemaSimpleTypes = 5 + JSONSchema_OBJECT JSONSchema_JSONSchemaSimpleTypes = 6 + JSONSchema_STRING JSONSchema_JSONSchemaSimpleTypes = 7 +) + +// Enum value maps for JSONSchema_JSONSchemaSimpleTypes. +var ( + JSONSchema_JSONSchemaSimpleTypes_name = map[int32]string{ + 0: "UNKNOWN", + 1: "ARRAY", + 2: "BOOLEAN", + 3: "INTEGER", + 4: "NULL", + 5: "NUMBER", + 6: "OBJECT", + 7: "STRING", + } + JSONSchema_JSONSchemaSimpleTypes_value = map[string]int32{ + "UNKNOWN": 0, + "ARRAY": 1, + "BOOLEAN": 2, + "INTEGER": 3, + "NULL": 4, + "NUMBER": 5, + "OBJECT": 6, + "STRING": 7, + } +) + +func (x JSONSchema_JSONSchemaSimpleTypes) Enum() *JSONSchema_JSONSchemaSimpleTypes { + p := new(JSONSchema_JSONSchemaSimpleTypes) + *p = x + return p +} + +func (x JSONSchema_JSONSchemaSimpleTypes) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (JSONSchema_JSONSchemaSimpleTypes) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2].Descriptor() +} + +func (JSONSchema_JSONSchemaSimpleTypes) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[2] +} + +func (x JSONSchema_JSONSchemaSimpleTypes) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The type of the security scheme. Valid values are "basic", +// "apiKey" or "oauth2". +type SecurityScheme_Type int32 + +const ( + SecurityScheme_TYPE_INVALID SecurityScheme_Type = 0 + SecurityScheme_TYPE_BASIC SecurityScheme_Type = 1 + SecurityScheme_TYPE_API_KEY SecurityScheme_Type = 2 + SecurityScheme_TYPE_OAUTH2 SecurityScheme_Type = 3 +) + +// Enum value maps for SecurityScheme_Type. +var ( + SecurityScheme_Type_name = map[int32]string{ + 0: "TYPE_INVALID", + 1: "TYPE_BASIC", + 2: "TYPE_API_KEY", + 3: "TYPE_OAUTH2", + } + SecurityScheme_Type_value = map[string]int32{ + "TYPE_INVALID": 0, + "TYPE_BASIC": 1, + "TYPE_API_KEY": 2, + "TYPE_OAUTH2": 3, + } +) + +func (x SecurityScheme_Type) Enum() *SecurityScheme_Type { + p := new(SecurityScheme_Type) + *p = x + return p +} + +func (x SecurityScheme_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3].Descriptor() +} + +func (SecurityScheme_Type) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[3] +} + +func (x SecurityScheme_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The location of the API key. Valid values are "query" or "header". +type SecurityScheme_In int32 + +const ( + SecurityScheme_IN_INVALID SecurityScheme_In = 0 + SecurityScheme_IN_QUERY SecurityScheme_In = 1 + SecurityScheme_IN_HEADER SecurityScheme_In = 2 +) + +// Enum value maps for SecurityScheme_In. +var ( + SecurityScheme_In_name = map[int32]string{ + 0: "IN_INVALID", + 1: "IN_QUERY", + 2: "IN_HEADER", + } + SecurityScheme_In_value = map[string]int32{ + "IN_INVALID": 0, + "IN_QUERY": 1, + "IN_HEADER": 2, + } +) + +func (x SecurityScheme_In) Enum() *SecurityScheme_In { + p := new(SecurityScheme_In) + *p = x + return p +} + +func (x SecurityScheme_In) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_In) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4].Descriptor() +} + +func (SecurityScheme_In) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[4] +} + +func (x SecurityScheme_In) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// The flow used by the OAuth2 security scheme. Valid values are +// "implicit", "password", "application" or "accessCode". +type SecurityScheme_Flow int32 + +const ( + SecurityScheme_FLOW_INVALID SecurityScheme_Flow = 0 + SecurityScheme_FLOW_IMPLICIT SecurityScheme_Flow = 1 + SecurityScheme_FLOW_PASSWORD SecurityScheme_Flow = 2 + SecurityScheme_FLOW_APPLICATION SecurityScheme_Flow = 3 + SecurityScheme_FLOW_ACCESS_CODE SecurityScheme_Flow = 4 +) + +// Enum value maps for SecurityScheme_Flow. +var ( + SecurityScheme_Flow_name = map[int32]string{ + 0: "FLOW_INVALID", + 1: "FLOW_IMPLICIT", + 2: "FLOW_PASSWORD", + 3: "FLOW_APPLICATION", + 4: "FLOW_ACCESS_CODE", + } + SecurityScheme_Flow_value = map[string]int32{ + "FLOW_INVALID": 0, + "FLOW_IMPLICIT": 1, + "FLOW_PASSWORD": 2, + "FLOW_APPLICATION": 3, + "FLOW_ACCESS_CODE": 4, + } +) + +func (x SecurityScheme_Flow) Enum() *SecurityScheme_Flow { + p := new(SecurityScheme_Flow) + *p = x + return p +} + +func (x SecurityScheme_Flow) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SecurityScheme_Flow) Descriptor() protoreflect.EnumDescriptor { + return file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5].Descriptor() +} + +func (SecurityScheme_Flow) Type() protoreflect.EnumType { + return &file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes[5] +} + +func (x SecurityScheme_Flow) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// `Swagger` is a representation of OpenAPI v2 specification's Swagger object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#swaggerObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// schemes: HTTPS; +// consumes: "application/json"; +// produces: "application/json"; +// }; +type Swagger struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Swagger string `protobuf:"bytes,1,opt,name=swagger,proto3" json:"swagger,omitempty"` + xxx_hidden_Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + xxx_hidden_Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"` + xxx_hidden_BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath,proto3" json:"base_path,omitempty"` + xxx_hidden_Schemes []Scheme `protobuf:"varint,5,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + xxx_hidden_Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + xxx_hidden_Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + xxx_hidden_Responses map[string]*Response `protobuf:"bytes,10,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,11,opt,name=security_definitions,json=securityDefinitions,proto3" json:"security_definitions,omitempty"` + xxx_hidden_Security *[]*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + xxx_hidden_Tags *[]*Tag `protobuf:"bytes,13,rep,name=tags,proto3" json:"tags,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,14,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,15,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Swagger) Reset() { + *x = Swagger{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Swagger) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Swagger) ProtoMessage() {} + +func (x *Swagger) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Swagger) GetSwagger() string { + if x != nil { + return x.xxx_hidden_Swagger + } + return "" +} + +func (x *Swagger) GetInfo() *Info { + if x != nil { + return x.xxx_hidden_Info + } + return nil +} + +func (x *Swagger) GetHost() string { + if x != nil { + return x.xxx_hidden_Host + } + return "" +} + +func (x *Swagger) GetBasePath() string { + if x != nil { + return x.xxx_hidden_BasePath + } + return "" +} + +func (x *Swagger) GetSchemes() []Scheme { + if x != nil { + return x.xxx_hidden_Schemes + } + return nil +} + +func (x *Swagger) GetConsumes() []string { + if x != nil { + return x.xxx_hidden_Consumes + } + return nil +} + +func (x *Swagger) GetProduces() []string { + if x != nil { + return x.xxx_hidden_Produces + } + return nil +} + +func (x *Swagger) GetResponses() map[string]*Response { + if x != nil { + return x.xxx_hidden_Responses + } + return nil +} + +func (x *Swagger) GetSecurityDefinitions() *SecurityDefinitions { + if x != nil { + return x.xxx_hidden_SecurityDefinitions + } + return nil +} + +func (x *Swagger) GetSecurity() []*SecurityRequirement { + if x != nil { + if x.xxx_hidden_Security != nil { + return *x.xxx_hidden_Security + } + } + return nil +} + +func (x *Swagger) GetTags() []*Tag { + if x != nil { + if x.xxx_hidden_Tags != nil { + return *x.xxx_hidden_Tags + } + } + return nil +} + +func (x *Swagger) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Swagger) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Swagger) SetSwagger(v string) { + x.xxx_hidden_Swagger = v +} + +func (x *Swagger) SetInfo(v *Info) { + x.xxx_hidden_Info = v +} + +func (x *Swagger) SetHost(v string) { + x.xxx_hidden_Host = v +} + +func (x *Swagger) SetBasePath(v string) { + x.xxx_hidden_BasePath = v +} + +func (x *Swagger) SetSchemes(v []Scheme) { + x.xxx_hidden_Schemes = v +} + +func (x *Swagger) SetConsumes(v []string) { + x.xxx_hidden_Consumes = v +} + +func (x *Swagger) SetProduces(v []string) { + x.xxx_hidden_Produces = v +} + +func (x *Swagger) SetResponses(v map[string]*Response) { + x.xxx_hidden_Responses = v +} + +func (x *Swagger) SetSecurityDefinitions(v *SecurityDefinitions) { + x.xxx_hidden_SecurityDefinitions = v +} + +func (x *Swagger) SetSecurity(v []*SecurityRequirement) { + x.xxx_hidden_Security = &v +} + +func (x *Swagger) SetTags(v []*Tag) { + x.xxx_hidden_Tags = &v +} + +func (x *Swagger) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Swagger) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Swagger) HasInfo() bool { + if x == nil { + return false + } + return x.xxx_hidden_Info != nil +} + +func (x *Swagger) HasSecurityDefinitions() bool { + if x == nil { + return false + } + return x.xxx_hidden_SecurityDefinitions != nil +} + +func (x *Swagger) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Swagger) ClearInfo() { + x.xxx_hidden_Info = nil +} + +func (x *Swagger) ClearSecurityDefinitions() { + x.xxx_hidden_SecurityDefinitions = nil +} + +func (x *Swagger) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type Swagger_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Specifies the OpenAPI Specification version being used. It can be + // used by the OpenAPI UI and other clients to interpret the API listing. The + // value MUST be "2.0". + Swagger string + // Provides metadata about the API. The metadata can be used by the + // clients if needed. + Info *Info + // The host (name or ip) serving the API. This MUST be the host only and does + // not include the scheme nor sub-paths. It MAY include a port. If the host is + // not included, the host serving the documentation is to be used (including + // the port). The host does not support path templating. + Host string + // The base path on which the API is served, which is relative to the host. If + // it is not included, the API is served directly under the host. The value + // MUST start with a leading slash (/). The basePath does not support path + // templating. + // Note that using `base_path` does not change the endpoint paths that are + // generated in the resulting OpenAPI file. If you wish to use `base_path` + // with relatively generated OpenAPI paths, the `base_path` prefix must be + // manually removed from your `google.api.http` paths and your code changed to + // serve the API from the `base_path`. + BasePath string + // The transfer protocol of the API. Values MUST be from the list: "http", + // "https", "ws", "wss". If the schemes is not included, the default scheme to + // be used is the one used to access the OpenAPI definition itself. + Schemes []Scheme + // A list of MIME types the APIs can consume. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Consumes []string + // A list of MIME types the APIs can produce. This is global to all APIs but + // can be overridden on specific API calls. Value MUST be as described under + // Mime Types. + Produces []string + // An object to hold responses that can be used across operations. This + // property does not define global responses for all operations. + Responses map[string]*Response + // Security scheme definitions that can be used across the specification. + SecurityDefinitions *SecurityDefinitions + // A declaration of which security schemes are applied for the API as a whole. + // The list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). + // Individual operations can override this definition. + Security []*SecurityRequirement + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []*Tag + // Additional external documentation. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Swagger_builder) Build() *Swagger { + m0 := &Swagger{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Swagger = b.Swagger + x.xxx_hidden_Info = b.Info + x.xxx_hidden_Host = b.Host + x.xxx_hidden_BasePath = b.BasePath + x.xxx_hidden_Schemes = b.Schemes + x.xxx_hidden_Consumes = b.Consumes + x.xxx_hidden_Produces = b.Produces + x.xxx_hidden_Responses = b.Responses + x.xxx_hidden_SecurityDefinitions = b.SecurityDefinitions + x.xxx_hidden_Security = &b.Security + x.xxx_hidden_Tags = &b.Tags + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Operation` is a representation of OpenAPI v2 specification's Operation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#operationObject +// +// Example: +// +// service EchoService { +// rpc Echo(SimpleMessage) returns (SimpleMessage) { +// option (google.api.http) = { +// get: "/v1/example/echo/{id}" +// }; +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { +// summary: "Get a message."; +// operation_id: "getMessage"; +// tags: "echo"; +// responses: { +// key: "200" +// value: { +// description: "OK"; +// } +// } +// }; +// } +// } +type Operation struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + xxx_hidden_Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + xxx_hidden_Consumes []string `protobuf:"bytes,6,rep,name=consumes,proto3" json:"consumes,omitempty"` + xxx_hidden_Produces []string `protobuf:"bytes,7,rep,name=produces,proto3" json:"produces,omitempty"` + xxx_hidden_Responses map[string]*Response `protobuf:"bytes,9,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Schemes []Scheme `protobuf:"varint,10,rep,packed,name=schemes,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.Scheme" json:"schemes,omitempty"` + xxx_hidden_Deprecated bool `protobuf:"varint,11,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + xxx_hidden_Security *[]*SecurityRequirement `protobuf:"bytes,12,rep,name=security,proto3" json:"security,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,13,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Parameters *Parameters `protobuf:"bytes,14,opt,name=parameters,proto3" json:"parameters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Operation) Reset() { + *x = Operation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.xxx_hidden_Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.xxx_hidden_Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.xxx_hidden_OperationId + } + return "" +} + +func (x *Operation) GetConsumes() []string { + if x != nil { + return x.xxx_hidden_Consumes + } + return nil +} + +func (x *Operation) GetProduces() []string { + if x != nil { + return x.xxx_hidden_Produces + } + return nil +} + +func (x *Operation) GetResponses() map[string]*Response { + if x != nil { + return x.xxx_hidden_Responses + } + return nil +} + +func (x *Operation) GetSchemes() []Scheme { + if x != nil { + return x.xxx_hidden_Schemes + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.xxx_hidden_Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + if x.xxx_hidden_Security != nil { + return *x.xxx_hidden_Security + } + } + return nil +} + +func (x *Operation) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Operation) GetParameters() *Parameters { + if x != nil { + return x.xxx_hidden_Parameters + } + return nil +} + +func (x *Operation) SetTags(v []string) { + x.xxx_hidden_Tags = v +} + +func (x *Operation) SetSummary(v string) { + x.xxx_hidden_Summary = v +} + +func (x *Operation) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Operation) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Operation) SetOperationId(v string) { + x.xxx_hidden_OperationId = v +} + +func (x *Operation) SetConsumes(v []string) { + x.xxx_hidden_Consumes = v +} + +func (x *Operation) SetProduces(v []string) { + x.xxx_hidden_Produces = v +} + +func (x *Operation) SetResponses(v map[string]*Response) { + x.xxx_hidden_Responses = v +} + +func (x *Operation) SetSchemes(v []Scheme) { + x.xxx_hidden_Schemes = v +} + +func (x *Operation) SetDeprecated(v bool) { + x.xxx_hidden_Deprecated = v +} + +func (x *Operation) SetSecurity(v []*SecurityRequirement) { + x.xxx_hidden_Security = &v +} + +func (x *Operation) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Operation) SetParameters(v *Parameters) { + x.xxx_hidden_Parameters = v +} + +func (x *Operation) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Operation) HasParameters() bool { + if x == nil { + return false + } + return x.xxx_hidden_Parameters != nil +} + +func (x *Operation) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +func (x *Operation) ClearParameters() { + x.xxx_hidden_Parameters = nil +} + +type Operation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A list of tags for API documentation control. Tags can be used for logical + // grouping of operations by resources or any other qualifier. + Tags []string + // A short summary of what the operation does. For maximum readability in the + // swagger-ui, this field SHOULD be less than 120 characters. + Summary string + // A verbose explanation of the operation behavior. GFM syntax can be used for + // rich text representation. + Description string + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation + // Unique string used to identify the operation. The id MUST be unique among + // all operations described in the API. Tools and libraries MAY use the + // operationId to uniquely identify an operation, therefore, it is recommended + // to follow common programming naming conventions. + OperationId string + // A list of MIME types the operation can consume. This overrides the consumes + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Consumes []string + // A list of MIME types the operation can produce. This overrides the produces + // definition at the OpenAPI Object. An empty value MAY be used to clear the + // global definition. Value MUST be as described under Mime Types. + Produces []string + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response + // The transfer protocol for the operation. Values MUST be from the list: + // "http", "https", "ws", "wss". The value overrides the OpenAPI Object + // schemes definition. + Schemes []Scheme + // Declares this operation to be deprecated. Usage of the declared operation + // should be refrained. Default value is false. + Deprecated bool + // A declaration of which security schemes are applied for this operation. The + // list of values describes alternative security schemes that can be used + // (that is, there is a logical OR between the security requirements). This + // definition overrides any declared top-level security. To remove a top-level + // security declaration, an empty array can be used. + Security []*SecurityRequirement + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value + // Custom parameters such as HTTP request headers. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/ + // and https://swagger.io/specification/v2/#parameter-object. + Parameters *Parameters +} + +func (b0 Operation_builder) Build() *Operation { + m0 := &Operation{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Tags = b.Tags + x.xxx_hidden_Summary = b.Summary + x.xxx_hidden_Description = b.Description + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_OperationId = b.OperationId + x.xxx_hidden_Consumes = b.Consumes + x.xxx_hidden_Produces = b.Produces + x.xxx_hidden_Responses = b.Responses + x.xxx_hidden_Schemes = b.Schemes + x.xxx_hidden_Deprecated = b.Deprecated + x.xxx_hidden_Security = &b.Security + x.xxx_hidden_Extensions = b.Extensions + x.xxx_hidden_Parameters = b.Parameters + return m0 +} + +// `Parameters` is a representation of OpenAPI v2 specification's parameters object. +// Note: This technically breaks compatibility with the OpenAPI 2 definition structure as we only +// allow header parameters to be set here since we do not want users specifying custom non-header +// parameters beyond those inferred from the Protobuf schema. +// See: https://swagger.io/specification/v2/#parameter-object +type Parameters struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Headers *[]*HeaderParameter `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Parameters) Reset() { + *x = Parameters{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Parameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameters) ProtoMessage() {} + +func (x *Parameters) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Parameters) GetHeaders() []*HeaderParameter { + if x != nil { + if x.xxx_hidden_Headers != nil { + return *x.xxx_hidden_Headers + } + } + return nil +} + +func (x *Parameters) SetHeaders(v []*HeaderParameter) { + x.xxx_hidden_Headers = &v +} + +type Parameters_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Headers` is one or more HTTP header parameter. + // See: https://swagger.io/docs/specification/2-0/describing-parameters/#header-parameters + Headers []*HeaderParameter +} + +func (b0 Parameters_builder) Build() *Parameters { + m0 := &Parameters{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Headers = &b.Headers + return m0 +} + +// `HeaderParameter` a HTTP header parameter. +// See: https://swagger.io/specification/v2/#parameter-object +type HeaderParameter struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Type HeaderParameter_Type `protobuf:"varint,3,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter_Type" json:"type,omitempty"` + xxx_hidden_Format string `protobuf:"bytes,4,opt,name=format,proto3" json:"format,omitempty"` + xxx_hidden_Required bool `protobuf:"varint,5,opt,name=required,proto3" json:"required,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HeaderParameter) Reset() { + *x = HeaderParameter{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HeaderParameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderParameter) ProtoMessage() {} + +func (x *HeaderParameter) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *HeaderParameter) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *HeaderParameter) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *HeaderParameter) GetType() HeaderParameter_Type { + if x != nil { + return x.xxx_hidden_Type + } + return HeaderParameter_UNKNOWN +} + +func (x *HeaderParameter) GetFormat() string { + if x != nil { + return x.xxx_hidden_Format + } + return "" +} + +func (x *HeaderParameter) GetRequired() bool { + if x != nil { + return x.xxx_hidden_Required + } + return false +} + +func (x *HeaderParameter) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *HeaderParameter) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *HeaderParameter) SetType(v HeaderParameter_Type) { + x.xxx_hidden_Type = v +} + +func (x *HeaderParameter) SetFormat(v string) { + x.xxx_hidden_Format = v +} + +func (x *HeaderParameter) SetRequired(v bool) { + x.xxx_hidden_Required = v +} + +type HeaderParameter_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Name` is the header name. + Name string + // `Description` is a short description of the header. + Description string + // `Type` is the type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + // See: https://swagger.io/specification/v2/#parameterType. + Type HeaderParameter_Type + // `Format` The extending format for the previously mentioned type. + Format string + // `Required` indicates if the header is optional + Required bool +} + +func (b0 HeaderParameter_builder) Build() *HeaderParameter { + m0 := &HeaderParameter{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Format = b.Format + x.xxx_hidden_Required = b.Required + return m0 +} + +// `Header` is a representation of OpenAPI v2 specification's Header object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#headerObject +type Header struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + xxx_hidden_Format string `protobuf:"bytes,3,opt,name=format,proto3" json:"format,omitempty"` + xxx_hidden_Default string `protobuf:"bytes,6,opt,name=default,proto3" json:"default,omitempty"` + xxx_hidden_Pattern string `protobuf:"bytes,13,opt,name=pattern,proto3" json:"pattern,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Header) Reset() { + *x = Header{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Header) GetType() string { + if x != nil { + return x.xxx_hidden_Type + } + return "" +} + +func (x *Header) GetFormat() string { + if x != nil { + return x.xxx_hidden_Format + } + return "" +} + +func (x *Header) GetDefault() string { + if x != nil { + return x.xxx_hidden_Default + } + return "" +} + +func (x *Header) GetPattern() string { + if x != nil { + return x.xxx_hidden_Pattern + } + return "" +} + +func (x *Header) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Header) SetType(v string) { + x.xxx_hidden_Type = v +} + +func (x *Header) SetFormat(v string) { + x.xxx_hidden_Format = v +} + +func (x *Header) SetDefault(v string) { + x.xxx_hidden_Default = v +} + +func (x *Header) SetPattern(v string) { + x.xxx_hidden_Pattern = v +} + +type Header_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the header. + Description string + // The type of the object. The value MUST be one of "string", "number", "integer", or "boolean". The "array" type is not supported. + Type string + // `Format` The extending format for the previously mentioned type. + Format string + // `Default` Declares the value of the header that the server will use if none is provided. + // See: https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. + // Unlike JSON Schema this value MUST conform to the defined type for the header. + Default string + // 'Pattern' See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. + Pattern string +} + +func (b0 Header_builder) Build() *Header { + m0 := &Header{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Format = b.Format + x.xxx_hidden_Default = b.Default + x.xxx_hidden_Pattern = b.Pattern + return m0 +} + +// `Response` is a representation of OpenAPI v2 specification's Response object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#responseObject +type Response struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Schema *Schema `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` + xxx_hidden_Headers map[string]*Header `protobuf:"bytes,3,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Examples map[string]string `protobuf:"bytes,4,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Response) GetSchema() *Schema { + if x != nil { + return x.xxx_hidden_Schema + } + return nil +} + +func (x *Response) GetHeaders() map[string]*Header { + if x != nil { + return x.xxx_hidden_Headers + } + return nil +} + +func (x *Response) GetExamples() map[string]string { + if x != nil { + return x.xxx_hidden_Examples + } + return nil +} + +func (x *Response) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Response) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Response) SetSchema(v *Schema) { + x.xxx_hidden_Schema = v +} + +func (x *Response) SetHeaders(v map[string]*Header) { + x.xxx_hidden_Headers = v +} + +func (x *Response) SetExamples(v map[string]string) { + x.xxx_hidden_Examples = v +} + +func (x *Response) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Response) HasSchema() bool { + if x == nil { + return false + } + return x.xxx_hidden_Schema != nil +} + +func (x *Response) ClearSchema() { + x.xxx_hidden_Schema = nil +} + +type Response_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // `Description` is a short description of the response. + // GFM syntax can be used for rich text representation. + Description string + // `Schema` optionally defines the structure of the response. + // If `Schema` is not provided, it means there is no content to the response. + Schema *Schema + // `Headers` A list of headers that are sent with the response. + // `Header` name is expected to be a string in the canonical format of the MIME header key + // See: https://golang.org/pkg/net/textproto/#CanonicalMIMEHeaderKey + Headers map[string]*Header + // `Examples` gives per-mimetype response examples. + // See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#example-object + Examples map[string]string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Response_builder) Build() *Response { + m0 := &Response{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Schema = b.Schema + x.xxx_hidden_Headers = b.Headers + x.xxx_hidden_Examples = b.Examples + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Info` is a representation of OpenAPI v2 specification's Info object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#infoObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// title: "Echo API"; +// version: "1.0"; +// description: ""; +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// }; +// ... +// }; +type Info struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_TermsOfService string `protobuf:"bytes,3,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + xxx_hidden_Contact *Contact `protobuf:"bytes,4,opt,name=contact,proto3" json:"contact,omitempty"` + xxx_hidden_License *License `protobuf:"bytes,5,opt,name=license,proto3" json:"license,omitempty"` + xxx_hidden_Version string `protobuf:"bytes,6,opt,name=version,proto3" json:"version,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,7,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Info) Reset() { + *x = Info{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.xxx_hidden_Title + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.xxx_hidden_TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.xxx_hidden_Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.xxx_hidden_License + } + return nil +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.xxx_hidden_Version + } + return "" +} + +func (x *Info) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Info) SetTitle(v string) { + x.xxx_hidden_Title = v +} + +func (x *Info) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Info) SetTermsOfService(v string) { + x.xxx_hidden_TermsOfService = v +} + +func (x *Info) SetContact(v *Contact) { + x.xxx_hidden_Contact = v +} + +func (x *Info) SetLicense(v *License) { + x.xxx_hidden_License = v +} + +func (x *Info) SetVersion(v string) { + x.xxx_hidden_Version = v +} + +func (x *Info) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Info) HasContact() bool { + if x == nil { + return false + } + return x.xxx_hidden_Contact != nil +} + +func (x *Info) HasLicense() bool { + if x == nil { + return false + } + return x.xxx_hidden_License != nil +} + +func (x *Info) ClearContact() { + x.xxx_hidden_Contact = nil +} + +func (x *Info) ClearLicense() { + x.xxx_hidden_License = nil +} + +type Info_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The title of the application. + Title string + // A short description of the application. GFM syntax can be used for rich + // text representation. + Description string + // The Terms of Service for the API. + TermsOfService string + // The contact information for the exposed API. + Contact *Contact + // The license information for the exposed API. + License *License + // Provides the version of the application API (not to be confused + // with the specification version). + Version string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Info_builder) Build() *Info { + m0 := &Info{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Title = b.Title + x.xxx_hidden_Description = b.Description + x.xxx_hidden_TermsOfService = b.TermsOfService + x.xxx_hidden_Contact = b.Contact + x.xxx_hidden_License = b.License + x.xxx_hidden_Version = b.Version + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Contact` is a representation of OpenAPI v2 specification's Contact object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#contactObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// contact: { +// name: "gRPC-Gateway project"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// email: "none@example.com"; +// }; +// ... +// }; +// ... +// }; +type Contact struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + xxx_hidden_Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Contact) Reset() { + *x = Contact{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Contact) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.xxx_hidden_Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.xxx_hidden_Email + } + return "" +} + +func (x *Contact) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *Contact) SetUrl(v string) { + x.xxx_hidden_Url = v +} + +func (x *Contact) SetEmail(v string) { + x.xxx_hidden_Email = v +} + +type Contact_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The identifying name of the contact person/organization. + Name string + // The URL pointing to the contact information. MUST be in the format of a + // URL. + Url string + // The email address of the contact person/organization. MUST be in the format + // of an email address. + Email string +} + +func (b0 Contact_builder) Build() *Contact { + m0 := &Contact{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Url = b.Url + x.xxx_hidden_Email = b.Email + return m0 +} + +// `License` is a representation of OpenAPI v2 specification's License object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#licenseObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// info: { +// ... +// license: { +// name: "BSD 3-Clause License"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE"; +// }; +// ... +// }; +// ... +// }; +type License struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *License) Reset() { + *x = License{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *License) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.xxx_hidden_Url + } + return "" +} + +func (x *License) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *License) SetUrl(v string) { + x.xxx_hidden_Url = v +} + +type License_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The license name used for the API. + Name string + // A URL to the license used for the API. MUST be in the format of a URL. + Url string +} + +func (b0 License_builder) Build() *License { + m0 := &License{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Url = b.Url + return m0 +} + +// `ExternalDocumentation` is a representation of OpenAPI v2 specification's +// ExternalDocumentation object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#externalDocumentationObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { +// ... +// external_docs: { +// description: "More about gRPC-Gateway"; +// url: "https://github.com/grpc-ecosystem/grpc-gateway"; +// } +// ... +// }; +type ExternalDocumentation struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalDocumentation) Reset() { + *x = ExternalDocumentation{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalDocumentation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocumentation) ProtoMessage() {} + +func (x *ExternalDocumentation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *ExternalDocumentation) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *ExternalDocumentation) GetUrl() string { + if x != nil { + return x.xxx_hidden_Url + } + return "" +} + +func (x *ExternalDocumentation) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *ExternalDocumentation) SetUrl(v string) { + x.xxx_hidden_Url = v +} + +type ExternalDocumentation_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the target documentation. GFM syntax can be used for + // rich text representation. + Description string + // The URL for the target documentation. Value MUST be in the format + // of a URL. + Url string +} + +func (b0 ExternalDocumentation_builder) Build() *ExternalDocumentation { + m0 := &ExternalDocumentation{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Url = b.Url + return m0 +} + +// `Schema` is a representation of OpenAPI v2 specification's Schema object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +type Schema struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_JsonSchema *JSONSchema `protobuf:"bytes,1,opt,name=json_schema,json=jsonSchema,proto3" json:"json_schema,omitempty"` + xxx_hidden_Discriminator string `protobuf:"bytes,2,opt,name=discriminator,proto3" json:"discriminator,omitempty"` + xxx_hidden_ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,5,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Example string `protobuf:"bytes,6,opt,name=example,proto3" json:"example,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Schema) Reset() { + *x = Schema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Schema) GetJsonSchema() *JSONSchema { + if x != nil { + return x.xxx_hidden_JsonSchema + } + return nil +} + +func (x *Schema) GetDiscriminator() string { + if x != nil { + return x.xxx_hidden_Discriminator + } + return "" +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.xxx_hidden_ReadOnly + } + return false +} + +func (x *Schema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Schema) GetExample() string { + if x != nil { + return x.xxx_hidden_Example + } + return "" +} + +func (x *Schema) SetJsonSchema(v *JSONSchema) { + x.xxx_hidden_JsonSchema = v +} + +func (x *Schema) SetDiscriminator(v string) { + x.xxx_hidden_Discriminator = v +} + +func (x *Schema) SetReadOnly(v bool) { + x.xxx_hidden_ReadOnly = v +} + +func (x *Schema) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Schema) SetExample(v string) { + x.xxx_hidden_Example = v +} + +func (x *Schema) HasJsonSchema() bool { + if x == nil { + return false + } + return x.xxx_hidden_JsonSchema != nil +} + +func (x *Schema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Schema) ClearJsonSchema() { + x.xxx_hidden_JsonSchema = nil +} + +func (x *Schema) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type Schema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + JsonSchema *JSONSchema + // Adds support for polymorphism. The discriminator is the schema property + // name that is used to differentiate between other schema that inherit this + // schema. The property name used MUST be defined at this schema and it MUST + // be in the required property list. When used, the value MUST be the name of + // this schema or any schema that inherits it. + Discriminator string + // Relevant only for Schema "properties" definitions. Declares the property as + // "read only". This means that it MAY be sent as part of a response but MUST + // NOT be sent as part of the request. Properties marked as readOnly being + // true SHOULD NOT be in the required list of the defined schema. Default + // value is false. + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + // A free-form property to include an example of an instance for this schema in JSON. + // This is copied verbatim to the output. + Example string +} + +func (b0 Schema_builder) Build() *Schema { + m0 := &Schema{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_JsonSchema = b.JsonSchema + x.xxx_hidden_Discriminator = b.Discriminator + x.xxx_hidden_ReadOnly = b.ReadOnly + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Example = b.Example + return m0 +} + +// `EnumSchema` is subset of fields from the OpenAPI v2 specification's Schema object. +// Only fields that are applicable to Enums are included +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// Example: +// +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_enum) = { +// ... +// title: "MyEnum"; +// description:"This is my nice enum"; +// example: "ZERO"; +// required: true; +// ... +// }; +type EnumSchema struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` + xxx_hidden_Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + xxx_hidden_Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + xxx_hidden_ReadOnly bool `protobuf:"varint,5,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,6,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Example string `protobuf:"bytes,7,opt,name=example,proto3" json:"example,omitempty"` + xxx_hidden_Ref string `protobuf:"bytes,8,opt,name=ref,proto3" json:"ref,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnumSchema) Reset() { + *x = EnumSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnumSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnumSchema) ProtoMessage() {} + +func (x *EnumSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *EnumSchema) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *EnumSchema) GetDefault() string { + if x != nil { + return x.xxx_hidden_Default + } + return "" +} + +func (x *EnumSchema) GetTitle() string { + if x != nil { + return x.xxx_hidden_Title + } + return "" +} + +func (x *EnumSchema) GetRequired() bool { + if x != nil { + return x.xxx_hidden_Required + } + return false +} + +func (x *EnumSchema) GetReadOnly() bool { + if x != nil { + return x.xxx_hidden_ReadOnly + } + return false +} + +func (x *EnumSchema) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *EnumSchema) GetExample() string { + if x != nil { + return x.xxx_hidden_Example + } + return "" +} + +func (x *EnumSchema) GetRef() string { + if x != nil { + return x.xxx_hidden_Ref + } + return "" +} + +func (x *EnumSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *EnumSchema) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *EnumSchema) SetDefault(v string) { + x.xxx_hidden_Default = v +} + +func (x *EnumSchema) SetTitle(v string) { + x.xxx_hidden_Title = v +} + +func (x *EnumSchema) SetRequired(v bool) { + x.xxx_hidden_Required = v +} + +func (x *EnumSchema) SetReadOnly(v bool) { + x.xxx_hidden_ReadOnly = v +} + +func (x *EnumSchema) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *EnumSchema) SetExample(v string) { + x.xxx_hidden_Example = v +} + +func (x *EnumSchema) SetRef(v string) { + x.xxx_hidden_Ref = v +} + +func (x *EnumSchema) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *EnumSchema) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *EnumSchema) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type EnumSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A short description of the schema. + Description string + Default string + // The title of the schema. + Title string + Required bool + ReadOnly bool + // Additional external documentation for this schema. + ExternalDocs *ExternalDocumentation + Example string + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 EnumSchema_builder) Build() *EnumSchema { + m0 := &EnumSchema{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Default = b.Default + x.xxx_hidden_Title = b.Title + x.xxx_hidden_Required = b.Required + x.xxx_hidden_ReadOnly = b.ReadOnly + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Example = b.Example + x.xxx_hidden_Ref = b.Ref + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `JSONSchema` represents properties from JSON Schema taken, and as used, in +// the OpenAPI v2 spec. +// +// This includes changes made by OpenAPI v2. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject +// +// See also: https://cswr.github.io/JsonSchema/spec/basic_types/, +// https://github.com/json-schema-org/json-schema-spec/blob/master/schema.json +// +// Example: +// +// message SimpleMessage { +// option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { +// json_schema: { +// title: "SimpleMessage" +// description: "A simple message." +// required: ["id"] +// } +// }; +// +// // Id represents the message identifier. +// string id = 1; [ +// (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { +// description: "The unique identifier of the simple message." +// }]; +// } +type JSONSchema struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Ref string `protobuf:"bytes,3,opt,name=ref,proto3" json:"ref,omitempty"` + xxx_hidden_Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Default string `protobuf:"bytes,7,opt,name=default,proto3" json:"default,omitempty"` + xxx_hidden_ReadOnly bool `protobuf:"varint,8,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + xxx_hidden_Example string `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"` + xxx_hidden_MultipleOf float64 `protobuf:"fixed64,10,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + xxx_hidden_Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + xxx_hidden_ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + xxx_hidden_Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + xxx_hidden_ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + xxx_hidden_MaxLength uint64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + xxx_hidden_MinLength uint64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + xxx_hidden_Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + xxx_hidden_MaxItems uint64 `protobuf:"varint,20,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + xxx_hidden_MinItems uint64 `protobuf:"varint,21,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + xxx_hidden_UniqueItems bool `protobuf:"varint,22,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + xxx_hidden_MaxProperties uint64 `protobuf:"varint,24,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + xxx_hidden_MinProperties uint64 `protobuf:"varint,25,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + xxx_hidden_Required []string `protobuf:"bytes,26,rep,name=required,proto3" json:"required,omitempty"` + xxx_hidden_Array []string `protobuf:"bytes,34,rep,name=array,proto3" json:"array,omitempty"` + xxx_hidden_Type []JSONSchema_JSONSchemaSimpleTypes `protobuf:"varint,35,rep,packed,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.JSONSchema_JSONSchemaSimpleTypes" json:"type,omitempty"` + xxx_hidden_Format string `protobuf:"bytes,36,opt,name=format,proto3" json:"format,omitempty"` + xxx_hidden_Enum []string `protobuf:"bytes,46,rep,name=enum,proto3" json:"enum,omitempty"` + xxx_hidden_FieldConfiguration *JSONSchema_FieldConfiguration `protobuf:"bytes,1001,opt,name=field_configuration,json=fieldConfiguration,proto3" json:"field_configuration,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,48,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema) Reset() { + *x = JSONSchema{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema) ProtoMessage() {} + +func (x *JSONSchema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema) GetRef() string { + if x != nil { + return x.xxx_hidden_Ref + } + return "" +} + +func (x *JSONSchema) GetTitle() string { + if x != nil { + return x.xxx_hidden_Title + } + return "" +} + +func (x *JSONSchema) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *JSONSchema) GetDefault() string { + if x != nil { + return x.xxx_hidden_Default + } + return "" +} + +func (x *JSONSchema) GetReadOnly() bool { + if x != nil { + return x.xxx_hidden_ReadOnly + } + return false +} + +func (x *JSONSchema) GetExample() string { + if x != nil { + return x.xxx_hidden_Example + } + return "" +} + +func (x *JSONSchema) GetMultipleOf() float64 { + if x != nil { + return x.xxx_hidden_MultipleOf + } + return 0 +} + +func (x *JSONSchema) GetMaximum() float64 { + if x != nil { + return x.xxx_hidden_Maximum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMaximum() bool { + if x != nil { + return x.xxx_hidden_ExclusiveMaximum + } + return false +} + +func (x *JSONSchema) GetMinimum() float64 { + if x != nil { + return x.xxx_hidden_Minimum + } + return 0 +} + +func (x *JSONSchema) GetExclusiveMinimum() bool { + if x != nil { + return x.xxx_hidden_ExclusiveMinimum + } + return false +} + +func (x *JSONSchema) GetMaxLength() uint64 { + if x != nil { + return x.xxx_hidden_MaxLength + } + return 0 +} + +func (x *JSONSchema) GetMinLength() uint64 { + if x != nil { + return x.xxx_hidden_MinLength + } + return 0 +} + +func (x *JSONSchema) GetPattern() string { + if x != nil { + return x.xxx_hidden_Pattern + } + return "" +} + +func (x *JSONSchema) GetMaxItems() uint64 { + if x != nil { + return x.xxx_hidden_MaxItems + } + return 0 +} + +func (x *JSONSchema) GetMinItems() uint64 { + if x != nil { + return x.xxx_hidden_MinItems + } + return 0 +} + +func (x *JSONSchema) GetUniqueItems() bool { + if x != nil { + return x.xxx_hidden_UniqueItems + } + return false +} + +func (x *JSONSchema) GetMaxProperties() uint64 { + if x != nil { + return x.xxx_hidden_MaxProperties + } + return 0 +} + +func (x *JSONSchema) GetMinProperties() uint64 { + if x != nil { + return x.xxx_hidden_MinProperties + } + return 0 +} + +func (x *JSONSchema) GetRequired() []string { + if x != nil { + return x.xxx_hidden_Required + } + return nil +} + +func (x *JSONSchema) GetArray() []string { + if x != nil { + return x.xxx_hidden_Array + } + return nil +} + +func (x *JSONSchema) GetType() []JSONSchema_JSONSchemaSimpleTypes { + if x != nil { + return x.xxx_hidden_Type + } + return nil +} + +func (x *JSONSchema) GetFormat() string { + if x != nil { + return x.xxx_hidden_Format + } + return "" +} + +func (x *JSONSchema) GetEnum() []string { + if x != nil { + return x.xxx_hidden_Enum + } + return nil +} + +func (x *JSONSchema) GetFieldConfiguration() *JSONSchema_FieldConfiguration { + if x != nil { + return x.xxx_hidden_FieldConfiguration + } + return nil +} + +func (x *JSONSchema) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *JSONSchema) SetRef(v string) { + x.xxx_hidden_Ref = v +} + +func (x *JSONSchema) SetTitle(v string) { + x.xxx_hidden_Title = v +} + +func (x *JSONSchema) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *JSONSchema) SetDefault(v string) { + x.xxx_hidden_Default = v +} + +func (x *JSONSchema) SetReadOnly(v bool) { + x.xxx_hidden_ReadOnly = v +} + +func (x *JSONSchema) SetExample(v string) { + x.xxx_hidden_Example = v +} + +func (x *JSONSchema) SetMultipleOf(v float64) { + x.xxx_hidden_MultipleOf = v +} + +func (x *JSONSchema) SetMaximum(v float64) { + x.xxx_hidden_Maximum = v +} + +func (x *JSONSchema) SetExclusiveMaximum(v bool) { + x.xxx_hidden_ExclusiveMaximum = v +} + +func (x *JSONSchema) SetMinimum(v float64) { + x.xxx_hidden_Minimum = v +} + +func (x *JSONSchema) SetExclusiveMinimum(v bool) { + x.xxx_hidden_ExclusiveMinimum = v +} + +func (x *JSONSchema) SetMaxLength(v uint64) { + x.xxx_hidden_MaxLength = v +} + +func (x *JSONSchema) SetMinLength(v uint64) { + x.xxx_hidden_MinLength = v +} + +func (x *JSONSchema) SetPattern(v string) { + x.xxx_hidden_Pattern = v +} + +func (x *JSONSchema) SetMaxItems(v uint64) { + x.xxx_hidden_MaxItems = v +} + +func (x *JSONSchema) SetMinItems(v uint64) { + x.xxx_hidden_MinItems = v +} + +func (x *JSONSchema) SetUniqueItems(v bool) { + x.xxx_hidden_UniqueItems = v +} + +func (x *JSONSchema) SetMaxProperties(v uint64) { + x.xxx_hidden_MaxProperties = v +} + +func (x *JSONSchema) SetMinProperties(v uint64) { + x.xxx_hidden_MinProperties = v +} + +func (x *JSONSchema) SetRequired(v []string) { + x.xxx_hidden_Required = v +} + +func (x *JSONSchema) SetArray(v []string) { + x.xxx_hidden_Array = v +} + +func (x *JSONSchema) SetType(v []JSONSchema_JSONSchemaSimpleTypes) { + x.xxx_hidden_Type = v +} + +func (x *JSONSchema) SetFormat(v string) { + x.xxx_hidden_Format = v +} + +func (x *JSONSchema) SetEnum(v []string) { + x.xxx_hidden_Enum = v +} + +func (x *JSONSchema) SetFieldConfiguration(v *JSONSchema_FieldConfiguration) { + x.xxx_hidden_FieldConfiguration = v +} + +func (x *JSONSchema) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *JSONSchema) HasFieldConfiguration() bool { + if x == nil { + return false + } + return x.xxx_hidden_FieldConfiguration != nil +} + +func (x *JSONSchema) ClearFieldConfiguration() { + x.xxx_hidden_FieldConfiguration = nil +} + +type JSONSchema_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Ref is used to define an external reference to include in the message. + // This could be a fully qualified proto message reference, and that type must + // be imported into the protofile. If no message is identified, the Ref will + // be used verbatim in the output. + // For example: + // + // `ref: ".google.protobuf.Timestamp"`. + Ref string + // The title of the schema. + Title string + // A short description of the schema. + Description string + Default string + ReadOnly bool + // A free-form property to include a JSON example of this field. This is copied + // verbatim to the output swagger.json. Quotes must be escaped. + // This property is the same for 2.0 and 3.0.0 https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/3.0.0.md#schemaObject https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#schemaObject + Example string + MultipleOf float64 + // Maximum represents an inclusive upper limit for a numeric instance. The + // value of MUST be a number, + Maximum float64 + ExclusiveMaximum bool + // minimum represents an inclusive lower limit for a numeric instance. The + // value of MUST be a number, + Minimum float64 + ExclusiveMinimum bool + MaxLength uint64 + MinLength uint64 + Pattern string + MaxItems uint64 + MinItems uint64 + UniqueItems bool + MaxProperties uint64 + MinProperties uint64 + Required []string + // Items in 'array' must be unique. + Array []string + Type []JSONSchema_JSONSchemaSimpleTypes + // `Format` + Format string + // Items in `enum` must be unique https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1 + Enum []string + // Additional field level properties used when generating the OpenAPI v2 file. + FieldConfiguration *JSONSchema_FieldConfiguration + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 JSONSchema_builder) Build() *JSONSchema { + m0 := &JSONSchema{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Ref = b.Ref + x.xxx_hidden_Title = b.Title + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Default = b.Default + x.xxx_hidden_ReadOnly = b.ReadOnly + x.xxx_hidden_Example = b.Example + x.xxx_hidden_MultipleOf = b.MultipleOf + x.xxx_hidden_Maximum = b.Maximum + x.xxx_hidden_ExclusiveMaximum = b.ExclusiveMaximum + x.xxx_hidden_Minimum = b.Minimum + x.xxx_hidden_ExclusiveMinimum = b.ExclusiveMinimum + x.xxx_hidden_MaxLength = b.MaxLength + x.xxx_hidden_MinLength = b.MinLength + x.xxx_hidden_Pattern = b.Pattern + x.xxx_hidden_MaxItems = b.MaxItems + x.xxx_hidden_MinItems = b.MinItems + x.xxx_hidden_UniqueItems = b.UniqueItems + x.xxx_hidden_MaxProperties = b.MaxProperties + x.xxx_hidden_MinProperties = b.MinProperties + x.xxx_hidden_Required = b.Required + x.xxx_hidden_Array = b.Array + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Format = b.Format + x.xxx_hidden_Enum = b.Enum + x.xxx_hidden_FieldConfiguration = b.FieldConfiguration + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `Tag` is a representation of OpenAPI v2 specification's Tag object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#tagObject +type Tag struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_ExternalDocs *ExternalDocumentation `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,4,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Tag) Reset() { + *x = Tag{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Tag) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.xxx_hidden_ExternalDocs + } + return nil +} + +func (x *Tag) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *Tag) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *Tag) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *Tag) SetExternalDocs(v *ExternalDocumentation) { + x.xxx_hidden_ExternalDocs = v +} + +func (x *Tag) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *Tag) HasExternalDocs() bool { + if x == nil { + return false + } + return x.xxx_hidden_ExternalDocs != nil +} + +func (x *Tag) ClearExternalDocs() { + x.xxx_hidden_ExternalDocs = nil +} + +type Tag_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The name of the tag. Use it to allow override of the name of a + // global Tag object, then use that name to reference the tag throughout the + // OpenAPI file. + Name string + // A short description for the tag. GFM syntax can be used for rich text + // representation. + Description string + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 Tag_builder) Build() *Tag { + m0 := &Tag{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Description = b.Description + x.xxx_hidden_ExternalDocs = b.ExternalDocs + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `SecurityDefinitions` is a representation of OpenAPI v2 specification's +// Security Definitions object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityDefinitionsObject +// +// A declaration of the security schemes available to be used in the +// specification. This does not enforce the security schemes on the operations +// and only serves to provide the relevant details for each scheme. +type SecurityDefinitions struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Security map[string]*SecurityScheme `protobuf:"bytes,1,rep,name=security,proto3" json:"security,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityDefinitions) Reset() { + *x = SecurityDefinitions{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityDefinitions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityDefinitions) ProtoMessage() {} + +func (x *SecurityDefinitions) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityDefinitions) GetSecurity() map[string]*SecurityScheme { + if x != nil { + return x.xxx_hidden_Security + } + return nil +} + +func (x *SecurityDefinitions) SetSecurity(v map[string]*SecurityScheme) { + x.xxx_hidden_Security = v +} + +type SecurityDefinitions_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // A single security scheme definition, mapping a "name" to the scheme it + // defines. + Security map[string]*SecurityScheme +} + +func (b0 SecurityDefinitions_builder) Build() *SecurityDefinitions { + m0 := &SecurityDefinitions{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Security = b.Security + return m0 +} + +// `SecurityScheme` is a representation of OpenAPI v2 specification's +// Security Scheme object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securitySchemeObject +// +// Allows the definition of a security scheme that can be used by the +// operations. Supported schemes are basic authentication, an API key (either as +// a header or as a query parameter) and OAuth2's common flows (implicit, +// password, application and access code). +type SecurityScheme struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Type SecurityScheme_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Type" json:"type,omitempty"` + xxx_hidden_Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + xxx_hidden_Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + xxx_hidden_In SecurityScheme_In `protobuf:"varint,4,opt,name=in,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_In" json:"in,omitempty"` + xxx_hidden_Flow SecurityScheme_Flow `protobuf:"varint,5,opt,name=flow,proto3,enum=grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme_Flow" json:"flow,omitempty"` + xxx_hidden_AuthorizationUrl string `protobuf:"bytes,6,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + xxx_hidden_TokenUrl string `protobuf:"bytes,7,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + xxx_hidden_Scopes *Scopes `protobuf:"bytes,8,opt,name=scopes,proto3" json:"scopes,omitempty"` + xxx_hidden_Extensions map[string]*structpb.Value `protobuf:"bytes,9,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityScheme) Reset() { + *x = SecurityScheme{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityScheme) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScheme) ProtoMessage() {} + +func (x *SecurityScheme) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityScheme) GetType() SecurityScheme_Type { + if x != nil { + return x.xxx_hidden_Type + } + return SecurityScheme_TYPE_INVALID +} + +func (x *SecurityScheme) GetDescription() string { + if x != nil { + return x.xxx_hidden_Description + } + return "" +} + +func (x *SecurityScheme) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *SecurityScheme) GetIn() SecurityScheme_In { + if x != nil { + return x.xxx_hidden_In + } + return SecurityScheme_IN_INVALID +} + +func (x *SecurityScheme) GetFlow() SecurityScheme_Flow { + if x != nil { + return x.xxx_hidden_Flow + } + return SecurityScheme_FLOW_INVALID +} + +func (x *SecurityScheme) GetAuthorizationUrl() string { + if x != nil { + return x.xxx_hidden_AuthorizationUrl + } + return "" +} + +func (x *SecurityScheme) GetTokenUrl() string { + if x != nil { + return x.xxx_hidden_TokenUrl + } + return "" +} + +func (x *SecurityScheme) GetScopes() *Scopes { + if x != nil { + return x.xxx_hidden_Scopes + } + return nil +} + +func (x *SecurityScheme) GetExtensions() map[string]*structpb.Value { + if x != nil { + return x.xxx_hidden_Extensions + } + return nil +} + +func (x *SecurityScheme) SetType(v SecurityScheme_Type) { + x.xxx_hidden_Type = v +} + +func (x *SecurityScheme) SetDescription(v string) { + x.xxx_hidden_Description = v +} + +func (x *SecurityScheme) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *SecurityScheme) SetIn(v SecurityScheme_In) { + x.xxx_hidden_In = v +} + +func (x *SecurityScheme) SetFlow(v SecurityScheme_Flow) { + x.xxx_hidden_Flow = v +} + +func (x *SecurityScheme) SetAuthorizationUrl(v string) { + x.xxx_hidden_AuthorizationUrl = v +} + +func (x *SecurityScheme) SetTokenUrl(v string) { + x.xxx_hidden_TokenUrl = v +} + +func (x *SecurityScheme) SetScopes(v *Scopes) { + x.xxx_hidden_Scopes = v +} + +func (x *SecurityScheme) SetExtensions(v map[string]*structpb.Value) { + x.xxx_hidden_Extensions = v +} + +func (x *SecurityScheme) HasScopes() bool { + if x == nil { + return false + } + return x.xxx_hidden_Scopes != nil +} + +func (x *SecurityScheme) ClearScopes() { + x.xxx_hidden_Scopes = nil +} + +type SecurityScheme_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // The type of the security scheme. Valid values are "basic", + // "apiKey" or "oauth2". + Type SecurityScheme_Type + // A short description for security scheme. + Description string + // The name of the header or query parameter to be used. + // Valid for apiKey. + Name string + // The location of the API key. Valid values are "query" or + // "header". + // Valid for apiKey. + In SecurityScheme_In + // The flow used by the OAuth2 security scheme. Valid values are + // "implicit", "password", "application" or "accessCode". + // Valid for oauth2. + Flow SecurityScheme_Flow + // The authorization URL to be used for this flow. This SHOULD be in + // the form of a URL. + // Valid for oauth2/implicit and oauth2/accessCode. + AuthorizationUrl string + // The token URL to be used for this flow. This SHOULD be in the + // form of a URL. + // Valid for oauth2/password, oauth2/application and oauth2/accessCode. + TokenUrl string + // The available scopes for the OAuth2 security scheme. + // Valid for oauth2. + Scopes *Scopes + // Custom properties that start with "x-" such as "x-foo" used to describe + // extra functionality that is not covered by the standard OpenAPI Specification. + // See: https://swagger.io/docs/specification/2-0/swagger-extensions/ + Extensions map[string]*structpb.Value +} + +func (b0 SecurityScheme_builder) Build() *SecurityScheme { + m0 := &SecurityScheme{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Type = b.Type + x.xxx_hidden_Description = b.Description + x.xxx_hidden_Name = b.Name + x.xxx_hidden_In = b.In + x.xxx_hidden_Flow = b.Flow + x.xxx_hidden_AuthorizationUrl = b.AuthorizationUrl + x.xxx_hidden_TokenUrl = b.TokenUrl + x.xxx_hidden_Scopes = b.Scopes + x.xxx_hidden_Extensions = b.Extensions + return m0 +} + +// `SecurityRequirement` is a representation of OpenAPI v2 specification's +// Security Requirement object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#securityRequirementObject +// +// Lists the required security schemes to execute this operation. The object can +// have multiple security schemes declared in it which are all required (that +// is, there is a logical AND between the schemes). +// +// The name used for each property MUST correspond to a security scheme +// declared in the Security Definitions. +type SecurityRequirement struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue `protobuf:"bytes,1,rep,name=security_requirement,json=securityRequirement,proto3" json:"security_requirement,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement) GetSecurityRequirement() map[string]*SecurityRequirement_SecurityRequirementValue { + if x != nil { + return x.xxx_hidden_SecurityRequirement + } + return nil +} + +func (x *SecurityRequirement) SetSecurityRequirement(v map[string]*SecurityRequirement_SecurityRequirementValue) { + x.xxx_hidden_SecurityRequirement = v +} + +type SecurityRequirement_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Each name must correspond to a security scheme which is declared in + // the Security Definitions. If the security scheme is of type "oauth2", + // then the value is a list of scope names required for the execution. + // For other security scheme types, the array MUST be empty. + SecurityRequirement map[string]*SecurityRequirement_SecurityRequirementValue +} + +func (b0 SecurityRequirement_builder) Build() *SecurityRequirement { + m0 := &SecurityRequirement{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_SecurityRequirement = b.SecurityRequirement + return m0 +} + +// `Scopes` is a representation of OpenAPI v2 specification's Scopes object. +// +// See: https://github.com/OAI/OpenAPI-Specification/blob/3.0.0/versions/2.0.md#scopesObject +// +// Lists the available scopes for an OAuth2 security scheme. +type Scopes struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Scope map[string]string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Scopes) Reset() { + *x = Scopes{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Scopes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Scopes) ProtoMessage() {} + +func (x *Scopes) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Scopes) GetScope() map[string]string { + if x != nil { + return x.xxx_hidden_Scope + } + return nil +} + +func (x *Scopes) SetScope(v map[string]string) { + x.xxx_hidden_Scope = v +} + +type Scopes_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Maps between a name of a scope to a short description of it (as the value + // of the property). + Scope map[string]string +} + +func (b0 Scopes_builder) Build() *Scopes { + m0 := &Scopes{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Scope = b.Scope + return m0 +} + +// 'FieldConfiguration' provides additional field level properties used when generating the OpenAPI v2 file. +// These properties are not defined by OpenAPIv2, but they are used to control the generation. +type JSONSchema_FieldConfiguration struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_PathParamName string `protobuf:"bytes,47,opt,name=path_param_name,json=pathParamName,proto3" json:"path_param_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *JSONSchema_FieldConfiguration) Reset() { + *x = JSONSchema_FieldConfiguration{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JSONSchema_FieldConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JSONSchema_FieldConfiguration) ProtoMessage() {} + +func (x *JSONSchema_FieldConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *JSONSchema_FieldConfiguration) GetPathParamName() string { + if x != nil { + return x.xxx_hidden_PathParamName + } + return "" +} + +func (x *JSONSchema_FieldConfiguration) SetPathParamName(v string) { + x.xxx_hidden_PathParamName = v +} + +type JSONSchema_FieldConfiguration_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Alternative parameter name when used as path parameter. If set, this will + // be used as the complete parameter name when this field is used as a path + // parameter. Use this to avoid having auto generated path parameter names + // for overlapping paths. + PathParamName string +} + +func (b0 JSONSchema_FieldConfiguration_builder) Build() *JSONSchema_FieldConfiguration { + m0 := &JSONSchema_FieldConfiguration{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_PathParamName = b.PathParamName + return m0 +} + +// If the security scheme is of type "oauth2", then the value is a list of +// scope names required for the execution. For other security scheme types, +// the array MUST be empty. +type SecurityRequirement_SecurityRequirementValue struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Scope []string `protobuf:"bytes,1,rep,name=scope,proto3" json:"scope,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecurityRequirement_SecurityRequirementValue) Reset() { + *x = SecurityRequirement_SecurityRequirementValue{} + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement_SecurityRequirementValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement_SecurityRequirementValue) ProtoMessage() {} + +func (x *SecurityRequirement_SecurityRequirementValue) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes[32] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *SecurityRequirement_SecurityRequirementValue) GetScope() []string { + if x != nil { + return x.xxx_hidden_Scope + } + return nil +} + +func (x *SecurityRequirement_SecurityRequirementValue) SetScope(v []string) { + x.xxx_hidden_Scope = v +} + +type SecurityRequirement_SecurityRequirementValue_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Scope []string +} + +func (b0 SecurityRequirement_SecurityRequirementValue_builder) Build() *SecurityRequirement_SecurityRequirementValue { + m0 := &SecurityRequirement_SecurityRequirementValue{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Scope = b.Scope + return m0 +} + +var File_protoc_gen_openapiv2_options_openapiv2_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb3, 0x08, 0x0a, 0x07, 0x53, 0x77, 0x61, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x12, 0x43, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x61, 0x73, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5a, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xd6, 0x07, + 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x12, 0x61, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x55, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0x62, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x0f, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x3f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x45, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, + 0x41, 0x4e, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, + 0x22, 0xd8, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, + 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, + 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, + 0x0e, 0x10, 0x0f, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, + 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, 0x22, 0x9a, 0x05, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x5a, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x5d, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x12, 0x63, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6d, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x03, 0x0a, 0x04, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x72, + 0x6d, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x45, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x2f, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x4b, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0xaa, 0x02, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x56, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x6a, + 0x73, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, 0x0d, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, + 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x22, 0xe8, 0x03, 0x0a, 0x0a, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x65, 0x0a, + 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, + 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, + 0x0a, 0x0a, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x61, 0x78, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x18, + 0x22, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x61, 0x72, 0x72, 0x61, 0x79, 0x12, 0x5f, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x23, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x4b, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x2e, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x7a, 0x0a, 0x13, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x12, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x12, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x74, + 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x55, 0x0a, 0x0f, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x77, 0x0a, 0x15, 0x4a, 0x53, 0x4f, 0x4e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x52, 0x52, 0x41, 0x59, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, + 0x10, 0x13, 0x4a, 0x04, 0x08, 0x13, 0x10, 0x14, 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x4a, 0x04, + 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x4a, 0x04, 0x08, 0x1d, 0x10, 0x1e, + 0x4a, 0x04, 0x08, 0x1e, 0x10, 0x22, 0x4a, 0x04, 0x08, 0x25, 0x10, 0x2a, 0x4a, 0x04, 0x08, 0x2a, + 0x10, 0x2b, 0x4a, 0x04, 0x08, 0x2b, 0x10, 0x2e, 0x22, 0xd9, 0x02, 0x0a, 0x03, 0x54, 0x61, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x5e, 0x0a, + 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, + 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x68, 0x0a, 0x08, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x76, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, + 0x06, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x12, 0x52, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x02, 0x69, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x52, 0x0a, 0x04, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x12, 0x69, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x55, 0x0a, + 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x10, + 0x03, 0x22, 0x31, 0x0a, 0x02, 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x5f, 0x51, 0x55, + 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x44, + 0x45, 0x52, 0x10, 0x02, 0x22, 0x6a, 0x0a, 0x04, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x0c, + 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, + 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, + 0x52, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x41, 0x50, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x04, + 0x22, 0xf6, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8a, 0x01, 0x0a, 0x14, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x13, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x30, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x9f, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x6d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x01, 0x0a, 0x06, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0x38, 0x0a, 0x0a, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x2a, 0x3b, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x12, 0x06, + 0x0a, 0x02, 0x57, 0x53, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x57, 0x53, 0x53, 0x10, 0x04, 0x42, + 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes = make([]protoimpl.MessageInfo, 35) +var file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = []any{ + (Scheme)(0), // 0: grpc.gateway.protoc_gen_openapiv2.options.Scheme + (HeaderParameter_Type)(0), // 1: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + (JSONSchema_JSONSchemaSimpleTypes)(0), // 2: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + (SecurityScheme_Type)(0), // 3: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + (SecurityScheme_In)(0), // 4: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + (SecurityScheme_Flow)(0), // 5: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + (*Swagger)(nil), // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv2.options.Operation + (*Parameters)(nil), // 8: grpc.gateway.protoc_gen_openapiv2.options.Parameters + (*HeaderParameter)(nil), // 9: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + (*Header)(nil), // 10: grpc.gateway.protoc_gen_openapiv2.options.Header + (*Response)(nil), // 11: grpc.gateway.protoc_gen_openapiv2.options.Response + (*Info)(nil), // 12: grpc.gateway.protoc_gen_openapiv2.options.Info + (*Contact)(nil), // 13: grpc.gateway.protoc_gen_openapiv2.options.Contact + (*License)(nil), // 14: grpc.gateway.protoc_gen_openapiv2.options.License + (*ExternalDocumentation)(nil), // 15: grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + (*Schema)(nil), // 16: grpc.gateway.protoc_gen_openapiv2.options.Schema + (*EnumSchema)(nil), // 17: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema + (*JSONSchema)(nil), // 18: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + (*Tag)(nil), // 19: grpc.gateway.protoc_gen_openapiv2.options.Tag + (*SecurityDefinitions)(nil), // 20: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + (*SecurityScheme)(nil), // 21: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + (*SecurityRequirement)(nil), // 22: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + (*Scopes)(nil), // 23: grpc.gateway.protoc_gen_openapiv2.options.Scopes + nil, // 24: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + nil, // 25: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + nil, // 26: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + nil, // 27: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + nil, // 28: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + nil, // 29: grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + nil, // 30: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + nil, // 31: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + nil, // 32: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + (*JSONSchema_FieldConfiguration)(nil), // 33: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + nil, // 34: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + nil, // 35: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + nil, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + nil, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + (*SecurityRequirement_SecurityRequirementValue)(nil), // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + nil, // 39: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + nil, // 40: grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + (*structpb.Value)(nil), // 41: google.protobuf.Value +} +var file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = []int32{ + 12, // 0: grpc.gateway.protoc_gen_openapiv2.options.Swagger.info:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info + 0, // 1: grpc.gateway.protoc_gen_openapiv2.options.Swagger.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 24, // 2: grpc.gateway.protoc_gen_openapiv2.options.Swagger.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry + 20, // 3: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security_definitions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions + 22, // 4: grpc.gateway.protoc_gen_openapiv2.options.Swagger.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 19, // 5: grpc.gateway.protoc_gen_openapiv2.options.Swagger.tags:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag + 15, // 6: grpc.gateway.protoc_gen_openapiv2.options.Swagger.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 25, // 7: grpc.gateway.protoc_gen_openapiv2.options.Swagger.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry + 15, // 8: grpc.gateway.protoc_gen_openapiv2.options.Operation.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 26, // 9: grpc.gateway.protoc_gen_openapiv2.options.Operation.responses:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry + 0, // 10: grpc.gateway.protoc_gen_openapiv2.options.Operation.schemes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scheme + 22, // 11: grpc.gateway.protoc_gen_openapiv2.options.Operation.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement + 27, // 12: grpc.gateway.protoc_gen_openapiv2.options.Operation.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry + 8, // 13: grpc.gateway.protoc_gen_openapiv2.options.Operation.parameters:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Parameters + 9, // 14: grpc.gateway.protoc_gen_openapiv2.options.Parameters.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter + 1, // 15: grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.HeaderParameter.Type + 16, // 16: grpc.gateway.protoc_gen_openapiv2.options.Response.schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Schema + 28, // 17: grpc.gateway.protoc_gen_openapiv2.options.Response.headers:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry + 29, // 18: grpc.gateway.protoc_gen_openapiv2.options.Response.examples:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExamplesEntry + 30, // 19: grpc.gateway.protoc_gen_openapiv2.options.Response.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry + 13, // 20: grpc.gateway.protoc_gen_openapiv2.options.Info.contact:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Contact + 14, // 21: grpc.gateway.protoc_gen_openapiv2.options.Info.license:type_name -> grpc.gateway.protoc_gen_openapiv2.options.License + 31, // 22: grpc.gateway.protoc_gen_openapiv2.options.Info.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry + 18, // 23: grpc.gateway.protoc_gen_openapiv2.options.Schema.json_schema:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema + 15, // 24: grpc.gateway.protoc_gen_openapiv2.options.Schema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 15, // 25: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 32, // 26: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry + 2, // 27: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.JSONSchemaSimpleTypes + 33, // 28: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.field_configuration:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.FieldConfiguration + 34, // 29: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry + 15, // 30: grpc.gateway.protoc_gen_openapiv2.options.Tag.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv2.options.ExternalDocumentation + 35, // 31: grpc.gateway.protoc_gen_openapiv2.options.Tag.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry + 36, // 32: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.security:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry + 3, // 33: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.type:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Type + 4, // 34: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.in:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.In + 5, // 35: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.flow:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.Flow + 23, // 36: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.scopes:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes + 37, // 37: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.extensions:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry + 39, // 38: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.security_requirement:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry + 40, // 39: grpc.gateway.protoc_gen_openapiv2.options.Scopes.scope:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Scopes.ScopeEntry + 11, // 40: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 41: grpc.gateway.protoc_gen_openapiv2.options.Swagger.ExtensionsEntry.value:type_name -> google.protobuf.Value + 11, // 42: grpc.gateway.protoc_gen_openapiv2.options.Operation.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Response + 41, // 43: grpc.gateway.protoc_gen_openapiv2.options.Operation.ExtensionsEntry.value:type_name -> google.protobuf.Value + 10, // 44: grpc.gateway.protoc_gen_openapiv2.options.Response.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.Header + 41, // 45: grpc.gateway.protoc_gen_openapiv2.options.Response.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 46: grpc.gateway.protoc_gen_openapiv2.options.Info.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 47: grpc.gateway.protoc_gen_openapiv2.options.EnumSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 48: grpc.gateway.protoc_gen_openapiv2.options.JSONSchema.ExtensionsEntry.value:type_name -> google.protobuf.Value + 41, // 49: grpc.gateway.protoc_gen_openapiv2.options.Tag.ExtensionsEntry.value:type_name -> google.protobuf.Value + 21, // 50: grpc.gateway.protoc_gen_openapiv2.options.SecurityDefinitions.SecurityEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme + 41, // 51: grpc.gateway.protoc_gen_openapiv2.options.SecurityScheme.ExtensionsEntry.value:type_name -> google.protobuf.Value + 38, // 52: grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv2.options.SecurityRequirement.SecurityRequirementValue + 53, // [53:53] is the sub-list for method output_type + 53, // [53:53] is the sub-list for method input_type + 53, // [53:53] is the sub-list for extension type_name + 53, // [53:53] is the sub-list for extension extendee + 0, // [0:53] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv2_options_openapiv2_proto_init() } +func file_protoc_gen_openapiv2_options_openapiv2_proto_init() { + if File_protoc_gen_openapiv2_options_openapiv2_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc, + NumEnums: 6, + NumMessages: 35, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs, + EnumInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_enumTypes, + MessageInfos: file_protoc_gen_openapiv2_options_openapiv2_proto_msgTypes, + }.Build() + File_protoc_gen_openapiv2_options_openapiv2_proto = out.File + file_protoc_gen_openapiv2_options_openapiv2_proto_rawDesc = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_goTypes = nil + file_protoc_gen_openapiv2_options_openapiv2_proto_depIdxs = nil +} diff --git a/vendor/github.com/modern-go/reflect2/safe_type.go b/vendor/github.com/modern-go/reflect2/safe_type.go index ee4e7bb6ed..5646309e09 100644 --- a/vendor/github.com/modern-go/reflect2/safe_type.go +++ b/vendor/github.com/modern-go/reflect2/safe_type.go @@ -6,10 +6,12 @@ import ( ) type safeType struct { - reflect.Type - cfg *frozenConfig + Type reflect.Type + cfg *frozenConfig } +var _ Type = &safeType{} + func (type2 *safeType) New() interface{} { return reflect.New(type2.Type).Interface() } @@ -18,6 +20,22 @@ func (type2 *safeType) UnsafeNew() unsafe.Pointer { panic("does not support unsafe operation") } +func (type2 *safeType) Kind() reflect.Kind { + return type2.Type.Kind() +} + +func (type2 *safeType) Len() int { + return type2.Type.Len() +} + +func (type2 *safeType) NumField() int { + return type2.Type.NumField() +} + +func (type2 *safeType) String() string { + return type2.Type.String() +} + func (type2 *safeType) Elem() Type { return type2.cfg.Type2(type2.Type.Elem()) } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go index 8e16d2bb03..f3439a3f0c 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go @@ -90,6 +90,9 @@ func FinalizeProfilesAndReportsForSuites(suites TestSuites, cliConfig types.CLIC if reporterConfig.JSONReport != "" { reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.JSONReport, GenerateFunc: reporters.GenerateJSONReport, MergeFunc: reporters.MergeAndCleanupJSONReports}) } + if reporterConfig.GoJSONReport != "" { + reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.GoJSONReport, GenerateFunc: reporters.GenerateGoTestJSONReport, MergeFunc: reporters.MergeAndCleanupGoTestJSONReports}) + } if reporterConfig.JUnitReport != "" { reportFormats = append(reportFormats, reportFormat{ReportName: reporterConfig.JUnitReport, GenerateFunc: reporters.GenerateJUnitReport, MergeFunc: reporters.MergeAndCleanupJUnitReports}) } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go index 41052ea19d..30d8096cd6 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go @@ -107,6 +107,9 @@ func runSerial(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig t if reporterConfig.JSONReport != "" { reporterConfig.JSONReport = AbsPathForGeneratedAsset(reporterConfig.JSONReport, suite, cliConfig, 0) } + if reporterConfig.GoJSONReport != "" { + reporterConfig.GoJSONReport = AbsPathForGeneratedAsset(reporterConfig.GoJSONReport, suite, cliConfig, 0) + } if reporterConfig.JUnitReport != "" { reporterConfig.JUnitReport = AbsPathForGeneratedAsset(reporterConfig.JUnitReport, suite, cliConfig, 0) } @@ -179,6 +182,9 @@ func runParallel(suite TestSuite, ginkgoConfig types.SuiteConfig, reporterConfig if reporterConfig.JSONReport != "" { reporterConfig.JSONReport = AbsPathForGeneratedAsset(reporterConfig.JSONReport, suite, cliConfig, 0) } + if reporterConfig.GoJSONReport != "" { + reporterConfig.GoJSONReport = AbsPathForGeneratedAsset(reporterConfig.GoJSONReport, suite, cliConfig, 0) + } if reporterConfig.JUnitReport != "" { reporterConfig.JUnitReport = AbsPathForGeneratedAsset(reporterConfig.JUnitReport, suite, cliConfig, 0) } diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go index bd6b8fbff3..419589b48c 100644 --- a/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go @@ -3,7 +3,6 @@ package main import ( "fmt" "os" - _ "go.uber.org/automaxprocs" "github.com/onsi/ginkgo/v2/ginkgo/build" "github.com/onsi/ginkgo/v2/ginkgo/command" "github.com/onsi/ginkgo/v2/ginkgo/generators" diff --git a/vendor/github.com/onsi/ginkgo/v2/ginkgo/maxprocs.go b/vendor/github.com/onsi/ginkgo/v2/ginkgo/maxprocs.go new file mode 100644 index 0000000000..a7d2b37d6b --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/ginkgo/maxprocs.go @@ -0,0 +1,8 @@ +//go:build !go1.25 +// +build !go1.25 + +package main + +import ( + _ "go.uber.org/automaxprocs" +) diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go new file mode 100644 index 0000000000..8b7a9ceabf --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go @@ -0,0 +1,158 @@ +package reporters + +import ( + "errors" + "fmt" + "strings" + "time" + + "github.com/onsi/ginkgo/v2/types" + "golang.org/x/tools/go/packages" +) + +func ptr[T any](in T) *T { + return &in +} + +type encoder interface { + Encode(v any) error +} + +// gojsonEvent matches the format from go internals +// https://github.com/golang/go/blob/master/src/cmd/internal/test2json/test2json.go#L31-L41 +// https://pkg.go.dev/cmd/test2json +type gojsonEvent struct { + Time *time.Time `json:",omitempty"` + Action GoJSONAction + Package string `json:",omitempty"` + Test string `json:",omitempty"` + Elapsed *float64 `json:",omitempty"` + Output *string `json:",omitempty"` + FailedBuild string `json:",omitempty"` +} + +type GoJSONAction string + +const ( + // start - the test binary is about to be executed + GoJSONStart GoJSONAction = "start" + // run - the test has started running + GoJSONRun GoJSONAction = "run" + // pause - the test has been paused + GoJSONPause GoJSONAction = "pause" + // cont - the test has continued running + GoJSONCont GoJSONAction = "cont" + // pass - the test passed + GoJSONPass GoJSONAction = "pass" + // bench - the benchmark printed log output but did not fail + GoJSONBench GoJSONAction = "bench" + // fail - the test or benchmark failed + GoJSONFail GoJSONAction = "fail" + // output - the test printed output + GoJSONOutput GoJSONAction = "output" + // skip - the test was skipped or the package contained no tests + GoJSONSkip GoJSONAction = "skip" +) + +func goJSONActionFromSpecState(state types.SpecState) GoJSONAction { + switch state { + case types.SpecStateInvalid: + return GoJSONFail + case types.SpecStatePending: + return GoJSONSkip + case types.SpecStateSkipped: + return GoJSONSkip + case types.SpecStatePassed: + return GoJSONPass + case types.SpecStateFailed: + return GoJSONFail + case types.SpecStateAborted: + return GoJSONFail + case types.SpecStatePanicked: + return GoJSONFail + case types.SpecStateInterrupted: + return GoJSONFail + case types.SpecStateTimedout: + return GoJSONFail + default: + panic("unexpected state should not happen") + } +} + +// gojsonReport wraps types.Report and calcualtes extra fields requires by gojson +type gojsonReport struct { + o types.Report + // Extra calculated fields + goPkg string + elapsed float64 +} + +func newReport(in types.Report) *gojsonReport { + return &gojsonReport{ + o: in, + } +} + +func (r *gojsonReport) Fill() error { + // NOTE: could the types.Report include the go package name? + goPkg, err := suitePathToPkg(r.o.SuitePath) + if err != nil { + return err + } + r.goPkg = goPkg + r.elapsed = r.o.RunTime.Seconds() + return nil +} + +// gojsonSpecReport wraps types.SpecReport and calculates extra fields required by gojson +type gojsonSpecReport struct { + o types.SpecReport + // extra calculated fields + testName string + elapsed float64 + action GoJSONAction +} + +func newSpecReport(in types.SpecReport) *gojsonSpecReport { + return &gojsonSpecReport{ + o: in, + } +} + +func (sr *gojsonSpecReport) Fill() error { + sr.elapsed = sr.o.RunTime.Seconds() + sr.testName = createTestName(sr.o) + sr.action = goJSONActionFromSpecState(sr.o.State) + return nil +} + +func suitePathToPkg(dir string) (string, error) { + cfg := &packages.Config{ + Mode: packages.NeedFiles | packages.NeedSyntax, + } + pkgs, err := packages.Load(cfg, dir) + if err != nil { + return "", err + } + if len(pkgs) != 1 { + return "", errors.New("error") + } + return pkgs[0].ID, nil +} + +func createTestName(spec types.SpecReport) string { + name := fmt.Sprintf("[%s]", spec.LeafNodeType) + if spec.FullText() != "" { + name = name + " " + spec.FullText() + } + labels := spec.Labels() + if len(labels) > 0 { + name = name + " [" + strings.Join(labels, ", ") + "]" + } + semVerConstraints := spec.SemVerConstraints() + if len(semVerConstraints) > 0 { + name = name + " [" + strings.Join(semVerConstraints, ", ") + "]" + } + name = strings.TrimSpace(name) + return name +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go new file mode 100644 index 0000000000..ec5311d069 --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go @@ -0,0 +1,111 @@ +package reporters + +type GoJSONEventWriter struct { + enc encoder + specSystemErrFn specSystemExtractFn + specSystemOutFn specSystemExtractFn +} + +func NewGoJSONEventWriter(enc encoder, errFn specSystemExtractFn, outFn specSystemExtractFn) *GoJSONEventWriter { + return &GoJSONEventWriter{ + enc: enc, + specSystemErrFn: errFn, + specSystemOutFn: outFn, + } +} + +func (r *GoJSONEventWriter) writeEvent(e *gojsonEvent) error { + return r.enc.Encode(e) +} + +func (r *GoJSONEventWriter) WriteSuiteStart(report *gojsonReport) error { + e := &gojsonEvent{ + Time: &report.o.StartTime, + Action: GoJSONStart, + Package: report.goPkg, + Output: nil, + FailedBuild: "", + } + return r.writeEvent(e) +} + +func (r *GoJSONEventWriter) WriteSuiteResult(report *gojsonReport) error { + var action GoJSONAction + switch { + case report.o.PreRunStats.SpecsThatWillRun == 0: + action = GoJSONSkip + case report.o.SuiteSucceeded: + action = GoJSONPass + default: + action = GoJSONFail + } + e := &gojsonEvent{ + Time: &report.o.EndTime, + Action: action, + Package: report.goPkg, + Output: nil, + FailedBuild: "", + Elapsed: ptr(report.elapsed), + } + return r.writeEvent(e) +} + +func (r *GoJSONEventWriter) WriteSpecStart(report *gojsonReport, specReport *gojsonSpecReport) error { + e := &gojsonEvent{ + Time: &specReport.o.StartTime, + Action: GoJSONRun, + Test: specReport.testName, + Package: report.goPkg, + Output: nil, + FailedBuild: "", + } + return r.writeEvent(e) +} + +func (r *GoJSONEventWriter) WriteSpecOut(report *gojsonReport, specReport *gojsonSpecReport) error { + events := []*gojsonEvent{} + + stdErr := r.specSystemErrFn(specReport.o) + if stdErr != "" { + events = append(events, &gojsonEvent{ + Time: &specReport.o.EndTime, + Action: GoJSONOutput, + Test: specReport.testName, + Package: report.goPkg, + Output: ptr(stdErr), + FailedBuild: "", + }) + } + stdOut := r.specSystemOutFn(specReport.o) + if stdOut != "" { + events = append(events, &gojsonEvent{ + Time: &specReport.o.EndTime, + Action: GoJSONOutput, + Test: specReport.testName, + Package: report.goPkg, + Output: ptr(stdOut), + FailedBuild: "", + }) + } + + for _, ev := range events { + err := r.writeEvent(ev) + if err != nil { + return err + } + } + return nil +} + +func (r *GoJSONEventWriter) WriteSpecResult(report *gojsonReport, specReport *gojsonSpecReport) error { + e := &gojsonEvent{ + Time: &specReport.o.EndTime, + Action: specReport.action, + Test: specReport.testName, + Package: report.goPkg, + Elapsed: ptr(specReport.elapsed), + Output: nil, + FailedBuild: "", + } + return r.writeEvent(e) +} diff --git a/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go new file mode 100644 index 0000000000..633e49b88d --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go @@ -0,0 +1,45 @@ +package reporters + +import ( + "github.com/onsi/ginkgo/v2/types" +) + +type GoJSONReporter struct { + ev *GoJSONEventWriter +} + +type specSystemExtractFn func (spec types.SpecReport) string + +func NewGoJSONReporter(enc encoder, errFn specSystemExtractFn, outFn specSystemExtractFn) *GoJSONReporter { + return &GoJSONReporter{ + ev: NewGoJSONEventWriter(enc, errFn, outFn), + } +} + +func (r *GoJSONReporter) Write(originalReport types.Report) error { + // suite start events + report := newReport(originalReport) + err := report.Fill() + if err != nil { + return err + } + r.ev.WriteSuiteStart(report) + for _, originalSpecReport := range originalReport.SpecReports { + specReport := newSpecReport(originalSpecReport) + err := specReport.Fill() + if err != nil { + return err + } + if specReport.o.LeafNodeType == types.NodeTypeIt { + // handle any It leaf node as a spec + r.ev.WriteSpecStart(report, specReport) + r.ev.WriteSpecOut(report, specReport) + r.ev.WriteSpecResult(report, specReport) + } else { + // handle any other leaf node as generic output + r.ev.WriteSpecOut(report, specReport) + } + } + r.ev.WriteSuiteResult(report) + return nil +} diff --git a/vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go b/vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go new file mode 100644 index 0000000000..d02fb7a1ae --- /dev/null +++ b/vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go @@ -0,0 +1,61 @@ +package reporters + +import ( + "encoding/json" + "fmt" + "os" + "path" + + "github.com/onsi/ginkgo/v2/internal/reporters" + "github.com/onsi/ginkgo/v2/types" +) + +// GenerateGoTestJSONReport produces a JSON-formatted in the test2json format used by `go test -json` +func GenerateGoTestJSONReport(report types.Report, destination string) error { + // walk report and generate test2json-compatible objects + // JSON-encode the objects into filename + if err := os.MkdirAll(path.Dir(destination), 0770); err != nil { + return err + } + f, err := os.Create(destination) + if err != nil { + return err + } + defer f.Close() + enc := json.NewEncoder(f) + r := reporters.NewGoJSONReporter( + enc, + systemErrForUnstructuredReporters, + systemOutForUnstructuredReporters, + ) + return r.Write(report) +} + +// MergeJSONReports produces a single JSON-formatted report at the passed in destination by merging the JSON-formatted reports provided in sources +// It skips over reports that fail to decode but reports on them via the returned messages []string +func MergeAndCleanupGoTestJSONReports(sources []string, destination string) ([]string, error) { + messages := []string{} + if err := os.MkdirAll(path.Dir(destination), 0770); err != nil { + return messages, err + } + f, err := os.Create(destination) + if err != nil { + return messages, err + } + defer f.Close() + + for _, source := range sources { + data, err := os.ReadFile(source) + if err != nil { + messages = append(messages, fmt.Sprintf("Could not open %s:\n%s", source, err.Error())) + continue + } + _, err = f.Write(data) + if err != nil { + messages = append(messages, fmt.Sprintf("Could not write to %s:\n%s", destination, err.Error())) + continue + } + os.Remove(source) + } + return messages, nil +} diff --git a/vendor/github.com/onsi/ginkgo/v2/types/config.go b/vendor/github.com/onsi/ginkgo/v2/types/config.go index b99a9e15e9..f847036046 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/config.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/config.go @@ -96,6 +96,7 @@ type ReporterConfig struct { ForceNewlines bool JSONReport string + GoJSONReport string JUnitReport string TeamcityReport string } @@ -112,7 +113,7 @@ func (rc ReporterConfig) Verbosity() VerbosityLevel { } func (rc ReporterConfig) WillGenerateReport() bool { - return rc.JSONReport != "" || rc.JUnitReport != "" || rc.TeamcityReport != "" + return rc.JSONReport != "" || rc.GoJSONReport != "" || rc.JUnitReport != "" || rc.TeamcityReport != "" } func NewDefaultReporterConfig() ReporterConfig { @@ -359,6 +360,8 @@ var ReporterConfigFlags = GinkgoFlags{ {KeyPath: "R.JSONReport", Name: "json-report", UsageArgument: "filename.json", SectionKey: "output", Usage: "If set, Ginkgo will generate a JSON-formatted test report at the specified location."}, + {KeyPath: "R.GoJSONReport", Name: "gojson-report", UsageArgument: "filename.json", SectionKey: "output", + Usage: "If set, Ginkgo will generate a Go JSON-formatted test report at the specified location."}, {KeyPath: "R.JUnitReport", Name: "junit-report", UsageArgument: "filename.xml", SectionKey: "output", DeprecatedName: "reportFile", DeprecatedDocLink: "improved-reporting-infrastructure", Usage: "If set, Ginkgo will generate a conformant junit test report in the specified file."}, {KeyPath: "R.TeamcityReport", Name: "teamcity-report", UsageArgument: "filename", SectionKey: "output", diff --git a/vendor/github.com/onsi/ginkgo/v2/types/version.go b/vendor/github.com/onsi/ginkgo/v2/types/version.go index 6aca6efa81..a30e68be1a 100644 --- a/vendor/github.com/onsi/ginkgo/v2/types/version.go +++ b/vendor/github.com/onsi/ginkgo/v2/types/version.go @@ -1,3 +1,3 @@ package types -const VERSION = "2.25.3" +const VERSION = "2.26.0" diff --git a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml deleted file mode 100644 index e56801b1e7..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml +++ /dev/null @@ -1,164 +0,0 @@ -kind: CustomResourceDefinition -apiVersion: apiextensions.k8s.io/v1 -metadata: - name: clusteroperators.config.openshift.io - annotations: - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: ClusterOperator - listKind: ClusterOperatorList - plural: clusteroperators - singular: clusteroperator - shortNames: - - co - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.versions[?(@.name=="operator")].version - description: The version the operator is at. - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=="Available")].status - description: Whether the operator is running and stable. - name: Available - type: string - - jsonPath: .status.conditions[?(@.type=="Progressing")].status - description: Whether the operator is processing changes. - name: Progressing - type: string - - jsonPath: .status.conditions[?(@.type=="Degraded")].status - description: Whether the operator is degraded. - name: Degraded - type: string - - jsonPath: .status.conditions[?(@.type=="Available")].lastTransitionTime - description: The time the operator's Available status last changed. - name: Since - type: date - schema: - openAPIV3Schema: - description: ClusterOperator is the Custom Resource object which holds the - current state of an operator. This object is used by operators to convey - their state to the rest of the cluster. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds configuration that could apply to any operator. - type: object - status: - description: status holds the information about the state of an operator. It - is consistent with status information across the Kubernetes ecosystem. - type: object - properties: - conditions: - description: conditions describes the state of the operator's managed - and monitored components. - type: array - items: - description: ClusterOperatorStatusCondition represents the state - of the operator's managed and monitored components. - type: object - required: - - lastTransitionTime - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the time of the last update - to the current status property. - type: string - format: date-time - message: - description: message provides additional information about the - current condition. This is only to be consumed by humans. It - may contain Line Feed characters (U+000A), which should be - rendered as new lines. - type: string - reason: - description: reason is the CamelCase reason for the condition's - current status. - type: string - status: - description: status of the condition, one of True, False, Unknown. - type: string - type: - description: type specifies the aspect reported by this condition. - type: string - extension: - description: extension contains any additional status information - specific to the operator which owns this status object. - type: object - nullable: true - x-kubernetes-preserve-unknown-fields: true - relatedObjects: - description: 'relatedObjects is a list of objects that are "interesting" - or related to this operator. Common uses are: 1. the detailed resource - driving the operator 2. operator namespaces 3. operand namespaces' - type: array - items: - description: ObjectReference contains enough information to let - you inspect or modify the referred object. - type: object - required: - - group - - name - - resource - properties: - group: - description: group of the referent. - type: string - name: - description: name of the referent. - type: string - namespace: - description: namespace of the referent. - type: string - resource: - description: resource of the referent. - type: string - versions: - description: versions is a slice of operator and operand version tuples. Operators - which manage multiple operands will have multiple operand entries - in the array. Available operators must report the version of the - operator itself with the name "operator". An operator reports a - new "operator" version when it has rolled out the new version to - all of its operands. - type: array - items: - type: object - required: - - name - - version - properties: - name: - description: name is the name of the particular operand this - version is for. It usually matches container images, not - operators. - type: string - version: - description: version indicates which version of a particular - operand is currently being managed. It must always match - the Available operand. If 1.0.0 is Available, then this must - indicate 1.0.0 even if the operator is trying to rollout 1.1.0 - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml deleted file mode 100644 index c5be735b6a..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml +++ /dev/null @@ -1,334 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterversions.config.openshift.io - annotations: - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - versions: - - name: v1 - served: true - storage: true - schema: - openAPIV3Schema: - description: ClusterVersion is the configuration for the ClusterVersionOperator. - This is where parameters related to automatic updates can be set. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec is the desired state of the cluster version - the operator - will work to ensure that the desired version is applied to the cluster. - type: object - required: - - clusterID - properties: - channel: - description: channel is an identifier for explicitly requesting that - a non-default set of updates be applied to this cluster. The default - channel will be contain stable updates that are appropriate for - production clusters. - type: string - clusterID: - description: clusterID uniquely identifies this cluster. This is expected - to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - in hexadecimal values). This is a required field. - type: string - desiredUpdate: - description: "desiredUpdate is an optional field that indicates the - desired value of the cluster version. Setting this value will trigger - an upgrade (if the current version does not match the desired version). - The set of recommended update values is listed as part of available - updates in status, and setting values outside that range may cause - the upgrade to fail. You may specify the version field without setting - image if an update exists with that version in the availableUpdates - or history. \n If an upgrade fails the operator will halt and report - status about the failing component. Setting the desired update value - back to the previous version will cause a rollback to be attempted. - Not all rollbacks will succeed." - type: object - properties: - force: - description: "force allows an administrator to update to an image - that has failed verification, does not appear in the availableUpdates - list, or otherwise would be blocked by normal protections on - update. This option should only be used when the authenticity - of the provided image has been verified out of band because - the provided image will run with full administrative access - to the cluster. Do not use this flag with images that comes - from unknown or potentially malicious sources. \n This flag - does not override other forms of consistency checking that are - required before a new update is deployed." - type: boolean - image: - description: image is a container image location that contains - the update. When this field is part of spec, image is optional - if version is specified and the availableUpdates field contains - a matching version. - type: string - version: - description: version is a semantic versioning identifying the - update version. When this field is part of spec, version is - optional if image is specified. - type: string - overrides: - description: overrides is list of overides for components that are - managed by cluster version operator. Marking a component unmanaged - will prevent the operator from creating or updating the object. - type: array - items: - description: ComponentOverride allows overriding cluster version - operator's behavior for a component. - type: object - required: - - group - - kind - - name - - namespace - - unmanaged - properties: - group: - description: group identifies the API group that the kind is - in. - type: string - kind: - description: kind indentifies which object to override. - type: string - name: - description: name is the component's name. - type: string - namespace: - description: namespace is the component's namespace. If the - resource is cluster scoped, the namespace should be empty. - type: string - unmanaged: - description: 'unmanaged controls if cluster version operator - should stop managing the resources in this cluster. Default: - false' - type: boolean - upstream: - description: upstream may be used to specify the preferred update - server. By default it will use the appropriate update server for - the cluster and region. - type: string - status: - description: status contains information about the available updates and - any in-progress updates. - type: object - required: - - availableUpdates - - desired - - observedGeneration - - versionHash - properties: - availableUpdates: - description: availableUpdates contains the list of updates that are - appropriate for this cluster. This list may be empty if no updates - are recommended, if the update service is unavailable, or if an - invalid channel has been specified. - type: array - items: - description: Release represents an OpenShift release image and associated - metadata. - type: object - properties: - channels: - description: channels is the set of Cincinnati channels to which - the release currently belongs. - type: array - items: - type: string - image: - description: image is a container image location that contains - the update. When this field is part of spec, image is optional - if version is specified and the availableUpdates field contains - a matching version. - type: string - url: - description: url contains information about this release. This - URL is set by the 'url' metadata property on a release or - the metadata returned by the update API and should be displayed - as a link in user interfaces. The URL field may not be set - for test or nightly releases. - type: string - version: - description: version is a semantic versioning identifying the - update version. When this field is part of spec, version is - optional if image is specified. - type: string - nullable: true - conditions: - description: conditions provides information about the cluster version. - The condition "Available" is set to true if the desiredUpdate has - been reached. The condition "Progressing" is set to true if an update - is being applied. The condition "Degraded" is set to true if an - update is currently blocked by a temporary or permanent error. Conditions - are only valid for the current desiredUpdate when metadata.generation - is equal to status.generation. - type: array - items: - description: ClusterOperatorStatusCondition represents the state - of the operator's managed and monitored components. - type: object - required: - - lastTransitionTime - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the time of the last update - to the current status property. - type: string - format: date-time - message: - description: message provides additional information about the - current condition. This is only to be consumed by humans. It - may contain Line Feed characters (U+000A), which should be - rendered as new lines. - type: string - reason: - description: reason is the CamelCase reason for the condition's - current status. - type: string - status: - description: status of the condition, one of True, False, Unknown. - type: string - type: - description: type specifies the aspect reported by this condition. - type: string - desired: - description: desired is the version that the cluster is reconciling - towards. If the cluster is not yet fully initialized desired will - be set with the information available, which may be an image or - a tag. - type: object - properties: - channels: - description: channels is the set of Cincinnati channels to which - the release currently belongs. - type: array - items: - type: string - image: - description: image is a container image location that contains - the update. When this field is part of spec, image is optional - if version is specified and the availableUpdates field contains - a matching version. - type: string - url: - description: url contains information about this release. This - URL is set by the 'url' metadata property on a release or the - metadata returned by the update API and should be displayed - as a link in user interfaces. The URL field may not be set for - test or nightly releases. - type: string - version: - description: version is a semantic versioning identifying the - update version. When this field is part of spec, version is - optional if image is specified. - type: string - history: - description: history contains a list of the most recent versions applied - to the cluster. This value may be empty during cluster startup, - and then will be updated when a new update is being applied. The - newest update is first in the list and it is ordered by recency. - Updates in the history have state Completed if the rollout completed - - if an update was failing or halfway applied the state will be - Partial. Only a limited amount of update history is preserved. - type: array - items: - description: UpdateHistory is a single attempted update to the cluster. - type: object - required: - - completionTime - - image - - startedTime - - state - - verified - properties: - completionTime: - description: completionTime, if set, is when the update was - fully applied. The update that is currently being applied - will have a null completion time. Completion time will always - be set for entries that are not the current update (usually - to the started time of the next update). - type: string - format: date-time - nullable: true - image: - description: image is a container image location that contains - the update. This value is always populated. - type: string - startedTime: - description: startedTime is the time at which the update was - started. - type: string - format: date-time - state: - description: state reflects whether the update was fully applied. - The Partial state indicates the update is not fully applied, - while the Completed state indicates the update was successfully - rolled out at least once (all parts of the update successfully - applied). - type: string - verified: - description: verified indicates whether the provided update - was properly verified before it was installed. If this is - false the cluster may not be trusted. - type: boolean - version: - description: version is a semantic versioning identifying the - update version. If the requested image does not define a version, - or if a failure occurs retrieving the image, this value may - be empty. - type: string - observedGeneration: - description: observedGeneration reports which version of the spec - is being synced. If this value is not equal to metadata.generation, - then the desired and conditions fields may represent a previous - version. - type: integer - format: int64 - versionHash: - description: versionHash is a fingerprint of the content that the - cluster will be updated with. It is used by the operator to avoid - unnecessary work and is for internal use only. - type: string - subresources: - status: {} - additionalPrinterColumns: - - name: Version - type: string - jsonPath: .status.history[?(@.state=="Completed")].version - - name: Available - type: string - jsonPath: .status.conditions[?(@.type=="Available")].status - - name: Progressing - type: string - jsonPath: .status.conditions[?(@.type=="Progressing")].status - - name: Since - type: date - jsonPath: .status.conditions[?(@.type=="Progressing")].lastTransitionTime - - name: Status - type: string - jsonPath: .status.conditions[?(@.type=="Progressing")].message - names: - plural: clusterversions - singular: clusterversion - kind: ClusterVersion diff --git a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_operatorhub.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_operatorhub.crd.yaml deleted file mode 100644 index 8ea625945a..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_operatorhub.crd.yaml +++ /dev/null @@ -1,105 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: operatorhubs.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: OperatorHub - listKind: OperatorHubList - plural: operatorhubs - singular: operatorhub - scope: Cluster - versions: - - name: v1 - subresources: - status: {} - served: true - storage: true - "schema": - "openAPIV3Schema": - description: OperatorHub is the Schema for the operatorhubs API. It can be - used to change the state of the default hub sources for OperatorHub on the - cluster from enabled to disabled and vice versa. - type: object - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OperatorHubSpec defines the desired state of OperatorHub - type: object - properties: - disableAllDefaultSources: - description: disableAllDefaultSources allows you to disable all the - default hub sources. If this is true, a specific entry in sources - can be used to enable a default source. If this is false, a specific - entry in sources can be used to disable or enable a default source. - type: boolean - sources: - description: sources is the list of default hub sources and their - configuration. If the list is empty, it implies that the default - hub sources are enabled on the cluster unless disableAllDefaultSources - is true. If disableAllDefaultSources is true and sources is not - empty, the configuration present in sources will take precedence. - The list of default hub sources and their current state will always - be reflected in the status block. - type: array - items: - description: HubSource is used to specify the hub source and its - configuration - type: object - properties: - disabled: - description: disabled is used to disable a default hub source - on cluster - type: boolean - name: - description: name is the name of one of the default hub sources - type: string - maxLength: 253 - minLength: 1 - status: - description: OperatorHubStatus defines the observed state of OperatorHub. - The current state of the default hub sources will always be reflected - here. - type: object - properties: - sources: - description: sources encapsulates the result of applying the configuration - for each hub source - type: array - items: - description: HubSourceStatus is used to reflect the current state - of applying the configuration to a default source - type: object - properties: - disabled: - description: disabled is used to disable a default hub source - on cluster - type: boolean - message: - description: message provides more information regarding failures - type: string - name: - description: name is the name of one of the default hub sources - type: string - maxLength: 253 - minLength: 1 - status: - description: status indicates success or failure in applying - the configuration - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml deleted file mode 100644 index ddd5d700de..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml +++ /dev/null @@ -1,103 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: proxies.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Proxy - listKind: ProxyList - plural: proxies - singular: proxy - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Proxy holds cluster-wide information on how to configure default - proxies for the cluster. The canonical name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec holds user-settable values for the proxy configuration - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. Empty - means unset and will not result in an env var. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS requests. Empty - means unset and will not result in an env var. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames and/or - CIDRs for which the proxy should not be used. Empty means unset - and will not result in an env var. - type: string - readinessEndpoints: - description: readinessEndpoints is a list of endpoints used to verify - readiness of the proxy. - type: array - items: - type: string - trustedCA: - description: "trustedCA is a reference to a ConfigMap containing a - CA certificate bundle. The trustedCA field should only be consumed - by a proxy validator. The validator is responsible for reading the - certificate bundle from the required key \"ca-bundle.crt\", merging - it with the system default trust bundle, and writing the merged - trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" - namespace. Clients that expect to make proxy connections must use - the trusted-ca-bundle for all HTTPS requests to the proxy, and may - use the trusted-ca-bundle for non-proxy HTTPS requests as well. - \n The namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". - Here is an example ConfigMap (in yaml): \n apiVersion: v1 kind: - ConfigMap metadata: name: user-ca-bundle namespace: openshift-config - \ data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- Custom - CA certificate bundle. -----END CERTIFICATE-----" - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS requests. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames and/or - CIDRs for which the proxy should not be used. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver.crd.yaml deleted file mode 100644 index bd730570ca..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver.crd.yaml +++ /dev/null @@ -1,260 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: apiservers.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: APIServer - singular: apiserver - plural: apiservers - listKind: APIServerList - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - "openAPIV3Schema": - description: APIServer holds configuration (like serving certificates, client - CA and CORS domains) shared by all API servers in the system, among them - especially kube-apiserver and openshift-apiserver. The canonical name of - an instance is 'cluster'. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - additionalCORSAllowedOrigins: - description: additionalCORSAllowedOrigins lists additional, user-defined - regular expressions describing hosts for which the API server allows - access using the CORS headers. This may be needed to access the - API and the integrated OAuth server from JavaScript applications. - The values are regular expressions that correspond to the Golang - regular expression language. - type: array - items: - type: string - audit: - description: audit specifies the settings for audit configuration - to be applied to all OpenShift-provided API servers in the cluster. - type: object - default: - profile: Default - properties: - profile: - description: "profile specifies the name of the desired audit - policy configuration to be deployed to all OpenShift-provided - API servers in the cluster. \n The following profiles are provided: - - Default: the existing default policy. - WriteRequestBodies: - like 'Default', but logs request and response HTTP payloads - for write requests (create, update, patch). - AllRequestBodies: - like 'WriteRequestBodies', but also logs request and response - HTTP payloads for read requests (get, list). \n If unset, the - 'Default' profile is used as the default." - type: string - default: Default - enum: - - Default - - WriteRequestBodies - - AllRequestBodies - clientCA: - description: 'clientCA references a ConfigMap containing a certificate - bundle for the signers that will be recognized for incoming client - certificates in addition to the operator managed signers. If this - is empty, then only operator managed signers are valid. You usually - only have to set this if you have your own PKI you wish to honor - client certificates from. The ConfigMap must exist in the openshift-config - namespace and contain the following required fields: - ConfigMap.Data["ca-bundle.crt"] - - CA bundle.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - encryption: - description: encryption allows the configuration of encryption of - resources at the datastore layer. - type: object - properties: - type: - description: "type defines what encryption type should be used - to encrypt resources at the datastore layer. When this field - is unset (i.e. when it is set to the empty string), identity - is implied. The behavior of unset can and will change over time. - \ Even if encryption is enabled by default, the meaning of unset - may change to a different encryption type based on changes in - best practices. \n When encryption is enabled, all sensitive - resources shipped with the platform are encrypted. This list - of sensitive resources can and will change over time. The current - authoritative list is: \n 1. secrets 2. configmaps 3. - routes.route.openshift.io 4. oauthaccesstokens.oauth.openshift.io - \ 5. oauthauthorizetokens.oauth.openshift.io" - type: string - enum: - - "" - - identity - - aescbc - servingCerts: - description: servingCert is the TLS cert info for serving secure traffic. - If not specified, operator managed certificates will be used for - serving secure traffic. - type: object - properties: - namedCertificates: - description: namedCertificates references secrets containing the - TLS cert info for serving secure traffic to specific hostnames. - If no named certificates are provided, or no named certificates - match the server name as understood by a client, the defaultServingCertificate - will be used. - type: array - items: - description: APIServerNamedServingCert maps a server DNS name, - as understood by a client, to a certificate. - type: object - properties: - names: - description: names is a optional list of explicit DNS names - (leading wildcards allowed) that should use this certificate - to serve secure traffic. If no names are provided, the - implicit names will be extracted from the certificates. - Exact names trump over wildcard names. Explicit names - defined here trump over extracted implicit names. - type: array - items: - type: string - servingCertificate: - description: 'servingCertificate references a kubernetes.io/tls - type secret containing the TLS cert info for serving secure - traffic. The secret must exist in the openshift-config - namespace and contain the following required fields: - - Secret.Data["tls.key"] - TLS private key. - Secret.Data["tls.crt"] - - TLS certificate.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - tlsSecurityProfile: - description: "tlsSecurityProfile specifies settings for TLS connections - for externally exposed servers. \n If unset, a default (which may - change between releases) is chosen. Note that only Old and Intermediate - profiles are currently supported, and the maximum available MinTLSVersions - is VersionTLS12." - type: object - properties: - custom: - description: "custom is a user-defined TLS security profile. Be - extremely careful using a custom profile as invalid configurations - can be catastrophic. An example custom profile looks like this: - \n ciphers: - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - \ - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - \ minTLSVersion: TLSv1.1" - type: object - properties: - ciphers: - description: "ciphers is used to specify the cipher algorithms - that are negotiated during the TLS handshake. Operators - may remove entries their operands do not support. For example, - to use DES-CBC3-SHA (yaml): \n ciphers: - DES-CBC3-SHA" - type: array - items: - type: string - minTLSVersion: - description: "minTLSVersion is used to specify the minimal - version of the TLS protocol that is negotiated during the - TLS handshake. For example, to use TLS versions 1.1, 1.2 - and 1.3 (yaml): \n minTLSVersion: TLSv1.1 \n NOTE: currently - the highest minTLSVersion allowed is VersionTLS12" - type: string - enum: - - VersionTLS10 - - VersionTLS11 - - VersionTLS12 - - VersionTLS13 - nullable: true - intermediate: - description: "intermediate is a TLS security profile based on: - \n https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29 - \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - \ - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - \ - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - \ - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - \ - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - \ - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 - \ minTLSVersion: TLSv1.2" - type: object - nullable: true - modern: - description: "modern is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility - \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - \ - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - \ minTLSVersion: TLSv1.3 \n NOTE: Currently unsupported." - type: object - nullable: true - old: - description: "old is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility - \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - \ - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - \ - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - \ - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - \ - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - \ - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 - \ - DHE-RSA-CHACHA20-POLY1305 - ECDHE-ECDSA-AES128-SHA256 - \ - ECDHE-RSA-AES128-SHA256 - ECDHE-ECDSA-AES128-SHA - \ - ECDHE-RSA-AES128-SHA - ECDHE-ECDSA-AES256-SHA384 - \ - ECDHE-RSA-AES256-SHA384 - ECDHE-ECDSA-AES256-SHA - \ - ECDHE-RSA-AES256-SHA - DHE-RSA-AES128-SHA256 - - DHE-RSA-AES256-SHA256 - AES128-GCM-SHA256 - AES256-GCM-SHA384 - \ - AES128-SHA256 - AES256-SHA256 - AES128-SHA - - AES256-SHA - DES-CBC3-SHA minTLSVersion: TLSv1.0" - type: object - nullable: true - type: - description: "type is one of Old, Intermediate, Modern or Custom. - Custom provides the ability to specify individual TLS security - profile parameters. Old, Intermediate and Modern are TLS security - profiles based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations - \n The profiles are intent based, so they may change over time - as new ciphers are developed and existing ciphers are found - to be insecure. Depending on precisely which ciphers are available - to a process, the list may be reduced. \n Note that the Modern - profile is currently not supported because it is not yet well - adopted by common software libraries." - type: string - enum: - - Old - - Intermediate - - Modern - - Custom - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml deleted file mode 100644 index b90d578f3e..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml +++ /dev/null @@ -1,161 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: authentications.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Authentication - listKind: AuthenticationList - plural: authentications - singular: authentication - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Authentication specifies cluster-wide settings for authentication - (like OAuth and webhook token authenticators). The canonical name of an - instance is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - oauthMetadata: - description: 'oauthMetadata contains the discovery endpoint data for - OAuth 2.0 Authorization Server Metadata for an external OAuth server. - This discovery document can be viewed from its served location: - oc get --raw ''/.well-known/oauth-authorization-server'' For further - details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 - If oauthMetadata.name is non-empty, this value has precedence over - any metadata reference stored in status. The key "oauthMetadata" - is used to locate the data. If specified and the config map or expected - key is not found, no metadata is served. If the specified metadata - is not valid, no metadata is served. The namespace for this config - map is openshift-config.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - serviceAccountIssuer: - description: 'serviceAccountIssuer is the identifier of the bound - service account token issuer. The default is https://kubernetes.default.svc - WARNING: Updating this field will result in the invalidation of - all bound tokens with the previous issuer value. Unless the holder - of a bound token has explicit support for a change in issuer, they - will not request a new bound token until pod restart or until their - existing token exceeds 80% of its duration.' - type: string - type: - description: type identifies the cluster managed, user facing authentication - mode in use. Specifically, it manages the component that responds - to login attempts. The default is IntegratedOAuth. - type: string - webhookTokenAuthenticator: - description: webhookTokenAuthenticator configures a remote token reviewer. - These remote authentication webhooks can be used to verify bearer - tokens via the tokenreviews.authentication.k8s.io REST API. This - is required to honor bearer tokens that are provisioned by an external - authentication service. - type: object - required: - - kubeConfig - properties: - kubeConfig: - description: "kubeConfig references a secret that contains kube - config file data which describes how to access the remote webhook - service. The namespace for the referenced secret is openshift-config. - \n For further details, see: \n https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication - \n The key \"kubeConfig\" is used to locate the data. If the - secret or expected key is not found, the webhook is not honored. - If the specified kube config data is not valid, the webhook - is not honored." - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - webhookTokenAuthenticators: - description: webhookTokenAuthenticators is DEPRECATED, setting it - has no effect. - type: array - items: - description: deprecatedWebhookTokenAuthenticator holds the necessary - configuration options for a remote token authenticator. It's the - same as WebhookTokenAuthenticator but it's missing the 'required' - validation on KubeConfig field. - type: object - properties: - kubeConfig: - description: 'kubeConfig contains kube config file data which - describes how to access the remote webhook service. For further - details, see: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication - The key "kubeConfig" is used to locate the data. If the secret - or expected key is not found, the webhook is not honored. - If the specified kube config data is not valid, the webhook - is not honored. The namespace for this secret is determined - by the point of use.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - integratedOAuthMetadata: - description: 'integratedOAuthMetadata contains the discovery endpoint - data for OAuth 2.0 Authorization Server Metadata for the in-cluster - integrated OAuth server. This discovery document can be viewed from - its served location: oc get --raw ''/.well-known/oauth-authorization-server'' - For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 - This contains the observed value based on cluster state. An explicitly - set value in spec.oauthMetadata has precedence over this field. - This field has no meaning if authentication spec.type is not set - to IntegratedOAuth. The key "oauthMetadata" is used to locate the - data. If the config map or expected key is not found, no metadata - is served. If the specified metadata is not valid, no metadata is - served. The namespace for this config map is openshift-config-managed.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml deleted file mode 100644 index fd0eea93c3..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml +++ /dev/null @@ -1,400 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: builds.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - preserveUnknownFields: false - names: - kind: Build - singular: build - plural: builds - listKind: BuildList - versions: - - name: v1 - subresources: - status: {} - served: true - storage: true - "schema": - "openAPIV3Schema": - description: "Build configures the behavior of OpenShift builds for the entire - cluster. This includes default settings that can be overridden in BuildConfig - objects, and overrides which are applied to all builds. \n The canonical - name is \"cluster\"" - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec holds user-settable values for the build controller - configuration - type: object - properties: - additionalTrustedCA: - description: "AdditionalTrustedCA is a reference to a ConfigMap containing - additional CAs that should be trusted for image pushes and pulls - during builds. The namespace for this config map is openshift-config. - \n DEPRECATED: Additional CAs for image pull and push should be - set on image.config.openshift.io/cluster instead." - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - buildDefaults: - description: BuildDefaults controls the default information for Builds - type: object - properties: - defaultProxy: - description: "DefaultProxy contains the default proxy settings - for all build operations, including image pull/push and source - download. \n Values can be overrode by setting the `HTTP_PROXY`, - `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build - config's strategy." - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. Empty - means unset and will not result in an env var. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS - requests. Empty means unset and will not result in an env - var. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames - and/or CIDRs for which the proxy should not be used. Empty - means unset and will not result in an env var. - type: string - readinessEndpoints: - description: readinessEndpoints is a list of endpoints used - to verify readiness of the proxy. - type: array - items: - type: string - trustedCA: - description: "trustedCA is a reference to a ConfigMap containing - a CA certificate bundle. The trustedCA field should only - be consumed by a proxy validator. The validator is responsible - for reading the certificate bundle from the required key - \"ca-bundle.crt\", merging it with the system default trust - bundle, and writing the merged trust bundle to a ConfigMap - named \"trusted-ca-bundle\" in the \"openshift-config-managed\" - namespace. Clients that expect to make proxy connections - must use the trusted-ca-bundle for all HTTPS requests to - the proxy, and may use the trusted-ca-bundle for non-proxy - HTTPS requests as well. \n The namespace for the ConfigMap - referenced by trustedCA is \"openshift-config\". Here is - an example ConfigMap (in yaml): \n apiVersion: v1 kind: - ConfigMap metadata: name: user-ca-bundle namespace: openshift-config - \ data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- - \ Custom CA certificate bundle. -----END CERTIFICATE-----" - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - env: - description: Env is a set of default environment variables that - will be applied to the build if the specified variables do not - exist on the build - type: array - items: - description: EnvVar represents an environment variable present - in a Container. - type: object - required: - - name - properties: - name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previous defined environment variables in the - container and any service environment variables. If a - variable cannot be resolved, the reference in the input - string will be unchanged. The $(VAR_NAME) syntax can be - escaped with a double $$, ie: $$(VAR_NAME). Escaped references - will never be expanded, regardless of whether the variable - exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - type: object - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - type: object - required: - - key - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, - metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - type: object - required: - - fieldPath - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - resourceFieldRef: - description: 'Selects a resource of the container: only - resources limits and requests (limits.cpu, limits.memory, - limits.ephemeral-storage, requests.cpu, requests.memory - and requests.ephemeral-storage) are currently supported.' - type: object - required: - - resource - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - type: object - required: - - key - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - gitProxy: - description: "GitProxy contains the proxy settings for git operations - only. If set, this will override any Proxy settings for all - git commands, such as git clone. \n Values that are not set - here will be inherited from DefaultProxy." - type: object - properties: - httpProxy: - description: httpProxy is the URL of the proxy for HTTP requests. Empty - means unset and will not result in an env var. - type: string - httpsProxy: - description: httpsProxy is the URL of the proxy for HTTPS - requests. Empty means unset and will not result in an env - var. - type: string - noProxy: - description: noProxy is a comma-separated list of hostnames - and/or CIDRs for which the proxy should not be used. Empty - means unset and will not result in an env var. - type: string - readinessEndpoints: - description: readinessEndpoints is a list of endpoints used - to verify readiness of the proxy. - type: array - items: - type: string - trustedCA: - description: "trustedCA is a reference to a ConfigMap containing - a CA certificate bundle. The trustedCA field should only - be consumed by a proxy validator. The validator is responsible - for reading the certificate bundle from the required key - \"ca-bundle.crt\", merging it with the system default trust - bundle, and writing the merged trust bundle to a ConfigMap - named \"trusted-ca-bundle\" in the \"openshift-config-managed\" - namespace. Clients that expect to make proxy connections - must use the trusted-ca-bundle for all HTTPS requests to - the proxy, and may use the trusted-ca-bundle for non-proxy - HTTPS requests as well. \n The namespace for the ConfigMap - referenced by trustedCA is \"openshift-config\". Here is - an example ConfigMap (in yaml): \n apiVersion: v1 kind: - ConfigMap metadata: name: user-ca-bundle namespace: openshift-config - \ data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- - \ Custom CA certificate bundle. -----END CERTIFICATE-----" - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - imageLabels: - description: ImageLabels is a list of docker labels that are applied - to the resulting image. User can override a default label by - providing a label with the same name in their Build/BuildConfig. - type: array - items: - type: object - properties: - name: - description: Name defines the name of the label. It must - have non-zero length. - type: string - value: - description: Value defines the literal value of the label. - type: string - resources: - description: Resources defines resource requirements to execute - the build. - type: object - properties: - limits: - description: 'Limits describes the maximum amount of compute - resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - requests: - description: 'Requests describes the minimum amount of compute - resources required. If Requests is omitted for a container, - it defaults to Limits if that is explicitly specified, otherwise - to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' - type: object - additionalProperties: - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - anyOf: - - type: integer - - type: string - x-kubernetes-int-or-string: true - buildOverrides: - description: BuildOverrides controls override settings for builds - type: object - properties: - forcePull: - description: ForcePull overrides, if set, the equivalent value - in the builds, i.e. false disables force pull for all builds, - true enables force pull for all builds, independently of what - each build specifies itself - type: boolean - imageLabels: - description: ImageLabels is a list of docker labels that are applied - to the resulting image. If user provided a label in their Build/BuildConfig - with the same name as one in this list, the user's label will - be overwritten. - type: array - items: - type: object - properties: - name: - description: Name defines the name of the label. It must - have non-zero length. - type: string - value: - description: Value defines the literal value of the label. - type: string - nodeSelector: - description: NodeSelector is a selector which must be true for - the build pod to fit on a node - type: object - additionalProperties: - type: string - tolerations: - description: Tolerations is a list of Tolerations that will override - any existing tolerations set on a build pod. - type: array - items: - description: The pod this Toleration is attached to tolerates - any taint that matches the triple using - the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. - Empty means match all taint effects. When specified, allowed - values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies - to. Empty means match all taint keys. If the key is empty, - operator must be Exists; this combination means to match - all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to - the value. Valid operators are Exists and Equal. Defaults - to Equal. Exists is equivalent to wildcard for value, - so that a pod can tolerate all taints of a particular - category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of - time the toleration (which must be of effect NoExecute, - otherwise this field is ignored) tolerates the taint. - By default, it is not set, which means tolerate the taint - forever (do not evict). Zero and negative values will - be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches - to. If the operator is Exists, the value should be empty, - otherwise just a regular string. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml deleted file mode 100644 index d7084ba8f7..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml +++ /dev/null @@ -1,73 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: consoles.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - scope: Cluster - group: config.openshift.io - names: - kind: Console - listKind: ConsoleList - plural: consoles - singular: console - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Console holds cluster-wide configuration for the web console, - including the logout URL, and reports the public URL of the console. The - canonical name is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - authentication: - description: ConsoleAuthentication defines a list of optional configuration - for console authentication. - type: object - properties: - logoutRedirect: - description: 'An optional, absolute URL to redirect web browsers - to after logging out of the console. If not specified, it will - redirect to the default login page. This is required when using - an identity provider that supports single sign-on (SSO) such - as: - OpenID (Keycloak, Azure) - RequestHeader (GSSAPI, SSPI, - SAML) - OAuth (GitHub, GitLab, Google) Logging out of the console - will destroy the user''s token. The logoutRedirect provides - the user the option to perform single logout (SLO) through the - identity provider to destroy their single sign-on session.' - type: string - pattern: ^$|^((https):\/\/?)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/?))$ - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - consoleURL: - description: The URL for the console. This will be derived from the - host for the route that is created for the console. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml deleted file mode 100644 index c05562e64a..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml +++ /dev/null @@ -1,103 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: dnses.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: DNS - listKind: DNSList - plural: dnses - singular: dns - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - "schema": - "openAPIV3Schema": - description: DNS holds cluster-wide information about DNS. The canonical name - is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - baseDomain: - description: "baseDomain is the base domain of the cluster. All managed - DNS records will be sub-domains of this base. \n For example, given - the base domain `openshift.example.com`, an API server DNS record - may be created for `cluster-api.openshift.example.com`. \n Once - set, this field cannot be changed." - type: string - privateZone: - description: "privateZone is the location where all the DNS records - that are only available internally to the cluster exist. \n If this - field is nil, no private records should be created. \n Once set, - this field cannot be changed." - type: object - properties: - id: - description: "id is the identifier that can be used to find the - DNS hosted zone. \n on AWS zone can be fetched using `ID` as - id in [1] on Azure zone can be fetched using `ID` as a pre-determined - name in [2], on GCP zone can be fetched using `ID` as a pre-determined - name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options - [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show - [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get" - type: string - tags: - description: "tags can be used to query the DNS hosted zone. \n - on AWS, resourcegroupstaggingapi [1] can be used to fetch a - zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options" - type: object - additionalProperties: - type: string - publicZone: - description: "publicZone is the location where all the DNS records - that are publicly accessible to the internet exist. \n If this field - is nil, no public records should be created. \n Once set, this field - cannot be changed." - type: object - properties: - id: - description: "id is the identifier that can be used to find the - DNS hosted zone. \n on AWS zone can be fetched using `ID` as - id in [1] on Azure zone can be fetched using `ID` as a pre-determined - name in [2], on GCP zone can be fetched using `ID` as a pre-determined - name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options - [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show - [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get" - type: string - tags: - description: "tags can be used to query the DNS hosted zone. \n - on AWS, resourcegroupstaggingapi [1] can be used to fetch a - zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options" - type: object - additionalProperties: - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml deleted file mode 100644 index 8bba554b46..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml +++ /dev/null @@ -1,78 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: featuregates.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: FeatureGate - listKind: FeatureGateList - plural: featuregates - singular: featuregate - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Feature holds cluster-wide information about feature gates. The - canonical name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - customNoUpgrade: - description: customNoUpgrade allows the enabling or disabling of any - feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE - UNDONE, and PREVENTS UPGRADES. Because of its nature, this setting - cannot be validated. If you have any typos or accidentally apply - invalid combinations your cluster may fail in an unrecoverable way. featureSet - must equal "CustomNoUpgrade" must be set to use this field. - type: object - properties: - disabled: - description: disabled is a list of all feature gates that you - want to force off - type: array - items: - type: string - enabled: - description: enabled is a list of all feature gates that you want - to force on - type: array - items: - type: string - nullable: true - featureSet: - description: featureSet changes the list of features in the cluster. The - default is empty. Be very careful adjusting this setting. Turning - on or off features may cause irreversible changes in your cluster - which cannot be undone. - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml deleted file mode 100644 index daed0de9fe..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml +++ /dev/null @@ -1,161 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: images.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Image - singular: image - plural: images - listKind: ImageList - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Image governs policies related to imagestream imports and runtime - configuration for external registries. It allows cluster admins to configure - which registries OpenShift is allowed to import images from, extra CA trust - bundles for external registries, and policies to block or allow registry - hostnames. When exposing OpenShift's image registry to the public, this - also lets cluster admins specify the external hostname. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - additionalTrustedCA: - description: additionalTrustedCA is a reference to a ConfigMap containing - additional CAs that should be trusted during imagestream import, - pod image pull, build image pull, and imageregistry pullthrough. - The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - allowedRegistriesForImport: - description: allowedRegistriesForImport limits the container image - registries that normal users may import images from. Set this list - to the registries that you trust to contain valid Docker images - and that you want applications to be able to import from. Users - with permission to create Images or ImageStreamMappings via the - API are not affected by this policy - typically only administrators - or system integrations will have those permissions. - type: array - items: - description: RegistryLocation contains a location of the registry - specified by the registry domain name. The domain name might include - wildcards, like '*' or '??'. - type: object - properties: - domainName: - description: domainName specifies a domain name for the registry - In case the registry use non-standard (80 or 443) port, the - port should be included in the domain name as well. - type: string - insecure: - description: insecure indicates whether the registry is secure - (https) or insecure (http) By default (if not specified) the - registry is assumed as secure. - type: boolean - externalRegistryHostnames: - description: externalRegistryHostnames provides the hostnames for - the default external image registry. The external hostname should - be set only when the image registry is exposed externally. The first - value is used in 'publicDockerImageRepository' field in ImageStreams. - The value must be in "hostname[:port]" format. - type: array - items: - type: string - registrySources: - description: registrySources contains configuration that determines - how the container runtime should treat individual registries when - accessing images for builds+pods. (e.g. whether or not to allow - insecure access). It does not contain configuration for the internal - cluster registry. - type: object - properties: - allowedRegistries: - description: "allowedRegistries are the only registries permitted - for image pull and push actions. All other registries are denied. - \n Only one of BlockedRegistries or AllowedRegistries may be - set." - type: array - items: - type: string - blockedRegistries: - description: "blockedRegistries cannot be used for image pull - and push actions. All other registries are permitted. \n Only - one of BlockedRegistries or AllowedRegistries may be set." - type: array - items: - type: string - containerRuntimeSearchRegistries: - description: 'containerRuntimeSearchRegistries are registries - that will be searched when pulling images that do not have fully - qualified domains in their pull specs. Registries will be searched - in the order provided in the list. Note: this search list only - works with the container runtime, i.e CRI-O. Will NOT work with - builds or imagestream imports.' - type: array - format: hostname - minItems: 1 - items: - type: string - x-kubernetes-list-type: set - insecureRegistries: - description: insecureRegistries are registries which do not have - a valid TLS certificates or only support HTTP connections. - type: array - items: - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - externalRegistryHostnames: - description: externalRegistryHostnames provides the hostnames for - the default external image registry. The external hostname should - be set only when the image registry is exposed externally. The first - value is used in 'publicDockerImageRepository' field in ImageStreams. - The value must be in "hostname[:port]" format. - type: array - items: - type: string - internalRegistryHostname: - description: internalRegistryHostname sets the hostname for the default - internal image registry. The value must be in "hostname[:port]" - format. This value is set by the image registry operator which controls - the internal registry hostname. For backward compatibility, users - can still use OPENSHIFT_DEFAULT_REGISTRY environment variable but - this setting overrides the environment variable. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml deleted file mode 100644 index d8623cd85f..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure.crd.yaml +++ /dev/null @@ -1,541 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: infrastructures.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: Infrastructure - listKind: InfrastructureList - plural: infrastructures - singular: infrastructure - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Infrastructure holds cluster-wide information about Infrastructure. The - canonical name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - cloudConfig: - description: "cloudConfig is a reference to a ConfigMap containing - the cloud provider configuration file. This configuration file is - used to configure the Kubernetes cloud provider integration when - using the built-in cloud provider integration or the external cloud - controller manager. The namespace for this config map is openshift-config. - \n cloudConfig should only be consumed by the kube_cloud_config - controller. The controller is responsible for using the user configuration - in the spec for various platforms and combining that with the user - provided ConfigMap in this field to create a stitched kube cloud - config. The controller generates a ConfigMap `kube-cloud-config` - in `openshift-config-managed` namespace with the kube cloud config - is stored in `cloud.conf` key. All the clients are expected to use - the generated ConfigMap only." - type: object - properties: - key: - description: Key allows pointing to a specific key/value inside - of the configmap. This is useful for logical file references. - type: string - name: - type: string - platformSpec: - description: platformSpec holds desired information specific to the - underlying infrastructure provider. - type: object - properties: - aws: - description: AWS contains settings specific to the Amazon Web - Services infrastructure provider. - type: object - properties: - serviceEndpoints: - description: serviceEndpoints list contains custom endpoints - which will override default service endpoint of AWS Services. - There must be only one ServiceEndpoint for a service. - type: array - items: - description: AWSServiceEndpoint store the configuration - of a custom url to override existing defaults of AWS Services. - type: object - properties: - name: - description: name is the name of the AWS service. The - list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html - This must be provided and cannot be empty. - type: string - pattern: ^[a-z0-9-]+$ - url: - description: url is fully qualified URI with scheme - https, that overrides the default generated endpoint - for a client. This must be provided and cannot be - empty. - type: string - pattern: ^https:// - azure: - description: Azure contains settings specific to the Azure infrastructure - provider. - type: object - baremetal: - description: BareMetal contains settings specific to the BareMetal - platform. - type: object - equinixMetal: - description: EquinixMetal contains settings specific to the Equinix - Metal infrastructure provider. - type: object - gcp: - description: GCP contains settings specific to the Google Cloud - Platform infrastructure provider. - type: object - ibmcloud: - description: IBMCloud contains settings specific to the IBMCloud - infrastructure provider. - type: object - kubevirt: - description: Kubevirt contains settings specific to the kubevirt - infrastructure provider. - type: object - openstack: - description: OpenStack contains settings specific to the OpenStack - infrastructure provider. - type: object - ovirt: - description: Ovirt contains settings specific to the oVirt infrastructure - provider. - type: object - type: - description: type is the underlying infrastructure provider for - the cluster. This value controls whether infrastructure automation - such as service load balancers, dynamic volume provisioning, - machine creation and deletion, and other integrations are enabled. - If None, no infrastructure automation is enabled. Allowed values - are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", "OpenStack", - "VSphere", "oVirt", "KubeVirt", "EquinixMetal", and "None". - Individual components may not support all platforms, and must - handle unrecognized platforms as None if they do not support - that platform. - type: string - enum: - - "" - - AWS - - Azure - - BareMetal - - GCP - - Libvirt - - OpenStack - - None - - VSphere - - oVirt - - IBMCloud - - KubeVirt - - EquinixMetal - vsphere: - description: VSphere contains settings specific to the VSphere - infrastructure provider. - type: object - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - apiServerInternalURI: - description: apiServerInternalURL is a valid URI with scheme 'https', - address and optionally a port (defaulting to 443). apiServerInternalURL - can be used by components like kubelets, to contact the Kubernetes - API server using the infrastructure provider rather than Kubernetes - networking. - type: string - apiServerURL: - description: apiServerURL is a valid URI with scheme 'https', address - and optionally a port (defaulting to 443). apiServerURL can be - used by components like the web console to tell users where to find - the Kubernetes API. - type: string - controlPlaneTopology: - description: controlPlaneTopology expresses the expectations for operands - that normally run on control nodes. The default is 'HighlyAvailable', - which represents the behavior operators have in a "normal" cluster. - The 'SingleReplica' mode will be used in single-node deployments - and the operators should not configure the operand for highly-available - operation - type: string - default: HighlyAvailable - enum: - - HighlyAvailable - - SingleReplica - etcdDiscoveryDomain: - description: 'etcdDiscoveryDomain is the domain used to fetch the - SRV records for discovering etcd servers and clients. For more info: - https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery - deprecated: as of 4.7, this field is no longer set or honored. It - will be removed in a future release.' - type: string - infrastructureName: - description: infrastructureName uniquely identifies a cluster with - a human friendly name. Once set it should not be changed. Must be - of max length 27 and must have only alphanumeric or hyphen characters. - type: string - infrastructureTopology: - description: infrastructureTopology expresses the expectations for - infrastructure services that do not run on control plane nodes, - usually indicated by a node selector for a `role` value other than - `master`. The default is 'HighlyAvailable', which represents the - behavior operators have in a "normal" cluster. The 'SingleReplica' - mode will be used in single-node deployments and the operators should - not configure the operand for highly-available operation - type: string - default: HighlyAvailable - enum: - - HighlyAvailable - - SingleReplica - platform: - description: "platform is the underlying infrastructure provider for - the cluster. \n Deprecated: Use platformStatus.type instead." - type: string - enum: - - "" - - AWS - - Azure - - BareMetal - - GCP - - Libvirt - - OpenStack - - None - - VSphere - - oVirt - - IBMCloud - - KubeVirt - - EquinixMetal - platformStatus: - description: platformStatus holds status information specific to the - underlying infrastructure provider. - type: object - properties: - aws: - description: AWS contains settings specific to the Amazon Web - Services infrastructure provider. - type: object - properties: - region: - description: region holds the default AWS region for new AWS - resources created by the cluster. - type: string - resourceTags: - description: resourceTags is a list of additional tags to - apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html - for information on tagging AWS resources. AWS supports a - maximum of 50 tags per resource. OpenShift reserves 25 tags - for its use, leaving 25 tags available for the user. - type: array - maxItems: 25 - items: - description: AWSResourceTag is a tag to apply to AWS resources - created for the cluster. - type: object - required: - - key - - value - properties: - key: - description: key is the key of the tag - type: string - maxLength: 128 - minLength: 1 - pattern: ^[0-9A-Za-z_.:/=+-@]+$ - value: - description: value is the value of the tag. Some AWS - service do not support empty values. Since tags are - added to resources in many services, the length of - the tag value must meet the requirements of all services. - type: string - maxLength: 256 - minLength: 1 - pattern: ^[0-9A-Za-z_.:/=+-@]+$ - serviceEndpoints: - description: ServiceEndpoints list contains custom endpoints - which will override default service endpoint of AWS Services. - There must be only one ServiceEndpoint for a service. - type: array - items: - description: AWSServiceEndpoint store the configuration - of a custom url to override existing defaults of AWS Services. - type: object - properties: - name: - description: name is the name of the AWS service. The - list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html - This must be provided and cannot be empty. - type: string - pattern: ^[a-z0-9-]+$ - url: - description: url is fully qualified URI with scheme - https, that overrides the default generated endpoint - for a client. This must be provided and cannot be - empty. - type: string - pattern: ^https:// - azure: - description: Azure contains settings specific to the Azure infrastructure - provider. - type: object - properties: - cloudName: - description: cloudName is the name of the Azure cloud environment - which can be used to configure the Azure SDK with the appropriate - Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`. - type: string - enum: - - "" - - AzurePublicCloud - - AzureUSGovernmentCloud - - AzureChinaCloud - - AzureGermanCloud - networkResourceGroupName: - description: networkResourceGroupName is the Resource Group - for network resources like the Virtual Network and Subnets - used by the cluster. If empty, the value is same as ResourceGroupName. - type: string - resourceGroupName: - description: resourceGroupName is the Resource Group for new - Azure resources created for the cluster. - type: string - baremetal: - description: BareMetal contains settings specific to the BareMetal - platform. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: nodeDNSIP is the IP address for the internal - DNS used by the nodes. Unlike the one managed by the DNS - operator, `NodeDNSIP` provides name resolution for the nodes - themselves. There is no DNS-as-a-service for BareMetal deployments. - In order to minimize necessary changes to the datacenter - DNS, a DNS service is hosted as a static pod to serve those - hostnames to the nodes in the cluster. - type: string - equinixMetal: - description: EquinixMetal contains settings specific to the Equinix - Metal infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - gcp: - description: GCP contains settings specific to the Google Cloud - Platform infrastructure provider. - type: object - properties: - projectID: - description: resourceGroupName is the Project ID for new GCP - resources created for the cluster. - type: string - region: - description: region holds the region for new GCP resources - created for the cluster. - type: string - ibmcloud: - description: IBMCloud contains settings specific to the IBMCloud - infrastructure provider. - type: object - properties: - location: - description: Location is where the cluster has been deployed - type: string - providerType: - description: ProviderType indicates the type of cluster that - was created - type: string - resourceGroupName: - description: ResourceGroupName is the Resource Group for new - IBMCloud resources created for the cluster. - type: string - kubevirt: - description: Kubevirt contains settings specific to the kubevirt - infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - openstack: - description: OpenStack contains settings specific to the OpenStack - infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - cloudName: - description: cloudName is the name of the desired OpenStack - cloud in the client configuration file (`clouds.yaml`). - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: nodeDNSIP is the IP address for the internal - DNS used by the nodes. Unlike the one managed by the DNS - operator, `NodeDNSIP` provides name resolution for the nodes - themselves. There is no DNS-as-a-service for OpenStack deployments. - In order to minimize necessary changes to the datacenter - DNS, a DNS service is hosted as a static pod to serve those - hostnames to the nodes in the cluster. - type: string - ovirt: - description: Ovirt contains settings specific to the oVirt infrastructure - provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: 'deprecated: as of 4.6, this field is no longer - set or honored. It will be removed in a future release.' - type: string - type: - description: "type is the underlying infrastructure provider for - the cluster. This value controls whether infrastructure automation - such as service load balancers, dynamic volume provisioning, - machine creation and deletion, and other integrations are enabled. - If None, no infrastructure automation is enabled. Allowed values - are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", - \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", and - \"None\". Individual components may not support all platforms, - and must handle unrecognized platforms as None if they do not - support that platform. \n This value will be synced with to - the `status.platform` and `status.platformStatus.type`. Currently - this value cannot be changed once set." - type: string - enum: - - "" - - AWS - - Azure - - BareMetal - - GCP - - Libvirt - - OpenStack - - None - - VSphere - - oVirt - - IBMCloud - - KubeVirt - - EquinixMetal - vsphere: - description: VSphere contains settings specific to the VSphere - infrastructure provider. - type: object - properties: - apiServerInternalIP: - description: apiServerInternalIP is an IP address to contact - the Kubernetes API server that can be used by components - inside the cluster, like kubelets using the infrastructure - rather than Kubernetes networking. It is the IP that the - Infrastructure.status.apiServerInternalURI points to. It - is the IP for a self-hosted load balancer in front of the - API servers. - type: string - ingressIP: - description: ingressIP is an external IP which routes to the - default ingress controller. The IP is a suitable target - of a wildcard DNS record used to resolve default route host - names. - type: string - nodeDNSIP: - description: nodeDNSIP is the IP address for the internal - DNS used by the nodes. Unlike the one managed by the DNS - operator, `NodeDNSIP` provides name resolution for the nodes - themselves. There is no DNS-as-a-service for vSphere deployments. - In order to minimize necessary changes to the datacenter - DNS, a DNS service is hosted as a static pod to serve those - hostnames to the nodes in the cluster. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml deleted file mode 100644 index 7c1b4f6d7b..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml +++ /dev/null @@ -1,299 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ingresses.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: Ingress - listKind: IngressList - plural: ingresses - singular: ingress - scope: Cluster - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - "schema": - "openAPIV3Schema": - description: Ingress holds cluster-wide information about ingress, including - the default ingress domain used for routes. The canonical name is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - appsDomain: - description: appsDomain is an optional domain to use instead of the - one specified in the domain field when a Route is created without - specifying an explicit host. If appsDomain is nonempty, this value - is used to generate default host values for Route. Unlike domain, - appsDomain may be modified after installation. This assumes a new - ingresscontroller has been setup with a wildcard certificate. - type: string - componentRoutes: - description: "componentRoutes is an optional list of routes that are - managed by OpenShift components that a cluster-admin is able to - configure the hostname and serving certificate for. The namespace - and name of each route in this list should match an existing entry - in the status.componentRoutes list. \n To determine the set of configurable - Routes, look at namespace and name of entries in the .status.componentRoutes - list, where participating operators write the status of configurable - routes." - type: array - items: - description: ComponentRouteSpec allows for configuration of a route's - hostname and serving certificate. - type: object - required: - - hostname - - name - - namespace - properties: - hostname: - description: hostname is the hostname that should be used by - the route. - type: string - format: hostname - name: - description: "name is the logical name of the route to customize. - \n The namespace and name of this componentRoute must match - a corresponding entry in the list of status.componentRoutes - if the route is to be customized." - type: string - maxLength: 256 - minLength: 1 - namespace: - description: "namespace is the namespace of the route to customize. - \n The namespace and name of this componentRoute must match - a corresponding entry in the list of status.componentRoutes - if the route is to be customized." - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - servingCertKeyPairSecret: - description: servingCertKeyPairSecret is a reference to a secret - of type `kubernetes.io/tls` in the openshift-config namespace. - The serving cert/key pair must match and will be used by the - operator to fulfill the intent of serving with this name. - If the custom hostname uses the default routing suffix of - the cluster, the Secret specification for a serving certificate - will not be needed. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - domain: - description: "domain is used to generate a default host name for a - route when the route's host name is empty. The generated host name - will follow this pattern: \"..\". - \n It is also used as the default wildcard domain suffix for ingress. - The default ingresscontroller domain will follow this pattern: \"*.\". - \n Once set, changing domain is not currently supported." - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - componentRoutes: - description: componentRoutes is where participating operators place - the current route status for routes whose hostnames and serving - certificates can be customized by the cluster-admin. - type: array - items: - description: ComponentRouteStatus contains information allowing - configuration of a route's hostname and serving certificate. - type: object - required: - - defaultHostname - - name - - namespace - - relatedObjects - properties: - conditions: - description: "conditions are used to communicate the state of - the componentRoutes entry. \n Supported conditions include - Available, Degraded and Progressing. \n If available is true, - the content served by the route can be accessed by users. - This includes cases where a default may continue to serve - content while the customized route specified by the cluster-admin - is being configured. \n If Degraded is true, that means something - has gone wrong trying to handle the componentRoutes entry. - The currentHostnames field may or may not be in effect. \n - If Progressing is true, that means the component is taking - some action related to the componentRoutes entry." - type: array - items: - description: "Condition contains details for one aspect of - the current state of this API Resource. --- This struct - is intended for direct use as an array at the field path - .status.conditions. For example, type FooStatus struct{ - \ // Represents the observations of a foo's current state. - \ // Known .status.conditions.type are: \"Available\", - \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // - +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - type: object - required: - - lastTransitionTime - - message - - reason - - status - - type - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should - be when the underlying condition changed. If that is - not known, then using the time when the API field changed - is acceptable. - type: string - format: date-time - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - type: string - maxLength: 32768 - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, - if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the - current state of the instance. - type: integer - format: int64 - minimum: 0 - reason: - description: reason contains a programmatic identifier - indicating the reason for the condition's last transition. - Producers of specific condition types may define expected - values and meanings for this field, and whether the - values are considered a guaranteed API. The value should - be a CamelCase string. This field may not be empty. - type: string - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - status: - description: status of the condition, one of True, False, - Unknown. - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across - resources like Available, but because arbitrary conditions - can be useful (see .node.status.conditions), the ability - to deconflict is important. The regex it matches is - (dns1123SubdomainFmt/)?(qualifiedNameFmt) - type: string - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - consumingUsers: - description: consumingUsers is a slice of ServiceAccounts that - need to have read permission on the servingCertKeyPairSecret - secret. - type: array - maxItems: 5 - items: - description: ConsumingUser is an alias for string which we - add validation to. Currently only service accounts are supported. - type: string - maxLength: 512 - minLength: 1 - pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - currentHostnames: - description: currentHostnames is the list of current names used - by the route. Typically, this list should consist of a single - hostname, but if multiple hostnames are supported by the route - the operator may write multiple entries to this list. - type: array - minItems: 1 - items: - description: Hostname is an alias for hostname string validation. - type: string - format: hostname - defaultHostname: - description: defaultHostname is the hostname of this route prior - to customization. - type: string - format: hostname - name: - description: "name is the logical name of the route to customize. - It does not have to be the actual name of a route resource - but it cannot be renamed. \n The namespace and name of this - componentRoute must match a corresponding entry in the list - of spec.componentRoutes if the route is to be customized." - type: string - maxLength: 256 - minLength: 1 - namespace: - description: "namespace is the namespace of the route to customize. - It must be a real namespace. Using an actual namespace ensures - that no two components will conflict and the same component - can be installed multiple times. \n The namespace and name - of this componentRoute must match a corresponding entry in - the list of spec.componentRoutes if the route is to be customized." - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - relatedObjects: - description: relatedObjects is a list of resources which are - useful when debugging or inspecting how spec.componentRoutes - is applied. - type: array - minItems: 1 - items: - description: ObjectReference contains enough information to - let you inspect or modify the referred object. - type: object - required: - - group - - name - - resource - properties: - group: - description: group of the referent. - type: string - name: - description: name of the referent. - type: string - namespace: - description: namespace of the referent. - type: string - resource: - description: resource of the referent. - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml deleted file mode 100644 index 10eb476ede..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml +++ /dev/null @@ -1,172 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networks.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - names: - kind: Network - listKind: NetworkList - plural: networks - singular: network - scope: Cluster - preserveUnknownFields: false - versions: - - name: v1 - served: true - storage: true - "schema": - "openAPIV3Schema": - description: 'Network holds cluster-wide information about Network. The canonical - name is `cluster`. It is used to configure the desired network configuration, - such as: IP address pools for services/pod IPs, network plugin, etc. Please - view network.spec for an explanation on what applies when configuring this - resource.' - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration. As a general - rule, this SHOULD NOT be read directly. Instead, you should consume - the NetworkStatus, as it indicates the currently deployed configuration. - Currently, most spec fields are immutable after installation. Please - view the individual ones for further details on each. - type: object - properties: - clusterNetwork: - description: IP address pool to use for pod IPs. This field is immutable - after installation. - type: array - items: - description: ClusterNetworkEntry is a contiguous block of IP addresses - from which pod IPs are allocated. - type: object - properties: - cidr: - description: The complete block for pod IPs. - type: string - hostPrefix: - description: The size (prefix) of block to allocate to each - node. If this field is not used by the plugin, it can be left - unset. - type: integer - format: int32 - minimum: 0 - externalIP: - description: externalIP defines configuration for controllers that - affect Service.ExternalIP. If nil, then ExternalIP is not allowed - to be set. - type: object - properties: - autoAssignCIDRs: - description: autoAssignCIDRs is a list of CIDRs from which to - automatically assign Service.ExternalIP. These are assigned - when the service is of type LoadBalancer. In general, this is - only useful for bare-metal clusters. In Openshift 3.x, this - was misleadingly called "IngressIPs". Automatically assigned - External IPs are not affected by any ExternalIPPolicy rules. - Currently, only one entry may be provided. - type: array - items: - type: string - policy: - description: policy is a set of restrictions applied to the ExternalIP - field. If nil or empty, then ExternalIP is not allowed to be - set. - type: object - properties: - allowedCIDRs: - description: allowedCIDRs is the list of allowed CIDRs. - type: array - items: - type: string - rejectedCIDRs: - description: rejectedCIDRs is the list of disallowed CIDRs. - These take precedence over allowedCIDRs. - type: array - items: - type: string - networkType: - description: 'NetworkType is the plugin that is to be deployed (e.g. - OpenShiftSDN). This should match a value that the cluster-network-operator - understands, or else no networking will be installed. Currently - supported values are: - OpenShiftSDN This field is immutable after - installation.' - type: string - serviceNetwork: - description: IP address pool for services. Currently, we only support - a single entry here. This field is immutable after installation. - type: array - items: - type: string - serviceNodePortRange: - description: The port range allowed for Services of type NodePort. - If not specified, the default of 30000-32767 will be used. Such - Services without a NodePort specified will have one automatically - allocated from this range. This parameter can be updated after the - cluster is installed. - type: string - pattern: ^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object - properties: - clusterNetwork: - description: IP address pool to use for pod IPs. - type: array - items: - description: ClusterNetworkEntry is a contiguous block of IP addresses - from which pod IPs are allocated. - type: object - properties: - cidr: - description: The complete block for pod IPs. - type: string - hostPrefix: - description: The size (prefix) of block to allocate to each - node. If this field is not used by the plugin, it can be left - unset. - type: integer - format: int32 - minimum: 0 - clusterNetworkMTU: - description: ClusterNetworkMTU is the MTU for inter-pod networking. - type: integer - migration: - description: Migration contains the cluster network migration configuration. - type: object - properties: - networkType: - description: 'NetworkType is the target plugin that is to be deployed. - Currently supported values are: OpenShiftSDN, OVNKubernetes' - type: string - enum: - - OpenShiftSDN - - OVNKubernetes - networkType: - description: NetworkType is the plugin that is deployed (e.g. OpenShiftSDN). - type: string - serviceNetwork: - description: IP address pool for services. Currently, we only support - a single entry here. - type: array - items: - type: string diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml deleted file mode 100644 index d3097b8745..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml +++ /dev/null @@ -1,676 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: oauths.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: OAuth - listKind: OAuthList - plural: oauths - singular: oauth - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: OAuth holds cluster-wide information about OAuth. The canonical - name is `cluster`. It is used to configure the integrated OAuth server. - This configuration is only honored when the top level Authentication config - has type set to IntegratedOAuth. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - identityProviders: - description: identityProviders is an ordered list of ways for a user - to identify themselves. When this list is empty, no identities are - provisioned for users. - type: array - items: - description: IdentityProvider provides identities for users authenticating - using credentials - type: object - properties: - basicAuth: - description: basicAuth contains configuration options for the - BasicAuth IdP - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - tlsClientCert: - description: tlsClientCert is an optional reference to a - secret by name that contains the PEM-encoded TLS client - certificate to present when connecting to the server. - The key "tls.crt" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - tlsClientKey: - description: tlsClientKey is an optional reference to a - secret by name that contains the PEM-encoded TLS private - key for the client certificate referenced in tlsClientCert. - The key "tls.key" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - url: - description: url is the remote URL to connect to - type: string - github: - description: github enables user authentication using GitHub - credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. This can only be configured when hostname is set - to a non-empty value. The namespace for this config map - is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - hostname: - description: hostname is the optional domain (e.g. "mycompany.com") - for use with a hosted instance of GitHub Enterprise. It - must match the GitHub Enterprise settings value configured - at /setup/settings#hostname. - type: string - organizations: - description: organizations optionally restricts which organizations - are allowed to log in - type: array - items: - type: string - teams: - description: teams optionally restricts which teams are - allowed to log in. Format is /. - type: array - items: - type: string - gitlab: - description: gitlab enables user authentication using GitLab - credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - url: - description: url is the oauth server base URL - type: string - google: - description: google enables user authentication using Google - credentials - type: object - properties: - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - hostedDomain: - description: hostedDomain is the optional Google App domain - (e.g. "mycompany.com") to restrict logins to - type: string - htpasswd: - description: htpasswd enables user authentication using an HTPasswd - file to validate credentials - type: object - properties: - fileData: - description: fileData is a required reference to a secret - by name containing the data to use as the htpasswd file. - The key "htpasswd" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. If the specified htpasswd data is not - valid, the identity provider is not honored. The namespace - for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - keystone: - description: keystone enables user authentication using keystone - password credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - domainName: - description: domainName is required for keystone v3 - type: string - tlsClientCert: - description: tlsClientCert is an optional reference to a - secret by name that contains the PEM-encoded TLS client - certificate to present when connecting to the server. - The key "tls.crt" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - tlsClientKey: - description: tlsClientKey is an optional reference to a - secret by name that contains the PEM-encoded TLS private - key for the client certificate referenced in tlsClientCert. - The key "tls.key" is used to locate the data. If specified - and the secret or expected key is not found, the identity - provider is not honored. If the specified certificate - data is not valid, the identity provider is not honored. - The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - url: - description: url is the remote URL to connect to - type: string - ldap: - description: ldap enables user authentication using LDAP credentials - type: object - properties: - attributes: - description: attributes maps LDAP attributes to identities - type: object - properties: - email: - description: email is the list of attributes whose values - should be used as the email address. Optional. If - unspecified, no email is set for the identity - type: array - items: - type: string - id: - description: id is the list of attributes whose values - should be used as the user ID. Required. First non-empty - attribute is used. At least one attribute is required. - If none of the listed attribute have a value, authentication - fails. LDAP standard identity attribute is "dn" - type: array - items: - type: string - name: - description: name is the list of attributes whose values - should be used as the display name. Optional. If unspecified, - no display name is set for the identity LDAP standard - display name attribute is "cn" - type: array - items: - type: string - preferredUsername: - description: preferredUsername is the list of attributes - whose values should be used as the preferred username. - LDAP standard login attribute is "uid" - type: array - items: - type: string - bindDN: - description: bindDN is an optional DN to bind with during - the search phase. - type: string - bindPassword: - description: bindPassword is an optional reference to a - secret by name containing a password to bind with during - the search phase. The key "bindPassword" is used to locate - the data. If specified and the secret or expected key - is not found, the identity provider is not honored. The - namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - insecure: - description: 'insecure, if true, indicates the connection - should not use TLS WARNING: Should not be set to `true` - with the URL scheme "ldaps://" as "ldaps://" URLs always attempt - to connect using TLS, even when `insecure` is set to `true` - When `true`, "ldap://" URLS connect insecurely. When `false`, - "ldap://" URLs are upgraded to a TLS connection using - StartTLS as specified in https://tools.ietf.org/html/rfc2830.' - type: boolean - url: - description: 'url is an RFC 2255 URL which specifies the - LDAP search parameters to use. The syntax of the URL is: - ldap://host:port/basedn?attribute?scope?filter' - type: string - mappingMethod: - description: mappingMethod determines how identities from this - provider are mapped to users Defaults to "claim" - type: string - name: - description: 'name is used to qualify the identities returned - by this provider. - It MUST be unique and not shared by any - other identity provider used - It MUST be a valid path segment: - name cannot equal "." or ".." or contain "/" or "%" or ":" Ref: - https://godoc.org/github.com/openshift/origin/pkg/user/apis/user/validation#ValidateIdentityProviderName' - type: string - openID: - description: openID enables user authentication using OpenID - credentials - type: object - properties: - ca: - description: ca is an optional reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. The key "ca.crt" is used to locate - the data. If specified and the config map or expected - key is not found, the identity provider is not honored. - If the specified ca data is not valid, the identity provider - is not honored. If empty, the default system roots are - used. The namespace for this config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - claims: - description: claims mappings - type: object - properties: - email: - description: email is the list of claims whose values - should be used as the email address. Optional. If - unspecified, no email is set for the identity - type: array - items: - type: string - name: - description: name is the list of claims whose values - should be used as the display name. Optional. If unspecified, - no display name is set for the identity - type: array - items: - type: string - preferredUsername: - description: preferredUsername is the list of claims - whose values should be used as the preferred username. - If unspecified, the preferred username is determined - from the value of the sub claim - type: array - items: - type: string - clientID: - description: clientID is the oauth client ID - type: string - clientSecret: - description: clientSecret is a required reference to the - secret by name containing the oauth client secret. The - key "clientSecret" is used to locate the data. If the - secret or expected key is not found, the identity provider - is not honored. The namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - secret - type: string - extraAuthorizeParameters: - description: extraAuthorizeParameters are any custom parameters - to add to the authorize request. - type: object - additionalProperties: - type: string - extraScopes: - description: extraScopes are any scopes to request in addition - to the standard "openid" scope. - type: array - items: - type: string - issuer: - description: issuer is the URL that the OpenID Provider - asserts as its Issuer Identifier. It must use the https - scheme with no query or fragment component. - type: string - requestHeader: - description: requestHeader enables user authentication using - request header credentials - type: object - properties: - ca: - description: ca is a required reference to a config map - by name containing the PEM-encoded CA bundle. It is used - as a trust anchor to validate the TLS certificate presented - by the remote server. Specifically, it allows verification - of incoming requests to prevent header spoofing. The key - "ca.crt" is used to locate the data. If the config map - or expected key is not found, the identity provider is - not honored. If the specified ca data is not valid, the - identity provider is not honored. The namespace for this - config map is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced - config map - type: string - challengeURL: - description: challengeURL is a URL to redirect unauthenticated - /authorize requests to Unauthenticated requests from OAuth - clients which expect WWW-Authenticate challenges will - be redirected here. ${url} is replaced with the current - URL, escaped to be safe in a query parameter https://www.example.com/sso-login?then=${url} - ${query} is replaced with the current query string https://www.example.com/auth-proxy/oauth/authorize?${query} - Required when challenge is set to true. - type: string - clientCommonNames: - description: clientCommonNames is an optional list of common - names to require a match from. If empty, any client certificate - validated against the clientCA bundle is considered authoritative. - type: array - items: - type: string - emailHeaders: - description: emailHeaders is the set of headers to check - for the email address - type: array - items: - type: string - headers: - description: headers is the set of headers to check for - identity information - type: array - items: - type: string - loginURL: - description: loginURL is a URL to redirect unauthenticated - /authorize requests to Unauthenticated requests from OAuth - clients which expect interactive logins will be redirected - here ${url} is replaced with the current URL, escaped - to be safe in a query parameter https://www.example.com/sso-login?then=${url} - ${query} is replaced with the current query string https://www.example.com/auth-proxy/oauth/authorize?${query} - Required when login is set to true. - type: string - nameHeaders: - description: nameHeaders is the set of headers to check - for the display name - type: array - items: - type: string - preferredUsernameHeaders: - description: preferredUsernameHeaders is the set of headers - to check for the preferred username - type: array - items: - type: string - type: - description: type identifies the identity provider type for - this entry. - type: string - templates: - description: templates allow you to customize pages like the login - page. - type: object - properties: - error: - description: error is the name of a secret that specifies a go - template to use to render error pages during the authentication - or grant flow. The key "errors.html" is used to locate the template - data. If specified and the secret or expected key is not found, - the default error page is used. If the specified template is - not valid, the default error page is used. If unspecified, the - default error page is used. The namespace for this secret is - openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - login: - description: login is the name of a secret that specifies a go - template to use to render the login page. The key "login.html" - is used to locate the template data. If specified and the secret - or expected key is not found, the default login page is used. - If the specified template is not valid, the default login page - is used. If unspecified, the default login page is used. The - namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - providerSelection: - description: providerSelection is the name of a secret that specifies - a go template to use to render the provider selection page. - The key "providers.html" is used to locate the template data. - If specified and the secret or expected key is not found, the - default provider selection page is used. If the specified template - is not valid, the default provider selection page is used. If - unspecified, the default provider selection page is used. The - namespace for this secret is openshift-config. - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced secret - type: string - tokenConfig: - description: tokenConfig contains options for authorization and access - tokens - type: object - properties: - accessTokenInactivityTimeout: - description: accessTokenInactivityTimeout defines the token inactivity - timeout for tokens granted by any client. The value represents - the maximum amount of time that can occur between consecutive - uses of the token. Tokens become invalid if they are not used - within this temporal window. The user will need to acquire a - new token to regain access once a token times out. Takes valid - time duration string such as "5m", "1.5h" or "2h45m". The minimum - allowed value for duration is 300s (5 minutes). If the timeout - is configured per client, then that value takes precedence. - If the timeout value is not specified and the client does not - override the value, then tokens are valid until their lifetime. - type: string - accessTokenInactivityTimeoutSeconds: - description: 'accessTokenInactivityTimeoutSeconds - DEPRECATED: - setting this field has no effect.' - type: integer - format: int32 - accessTokenMaxAgeSeconds: - description: accessTokenMaxAgeSeconds defines the maximum age - of access tokens - type: integer - format: int32 - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml deleted file mode 100644 index 6de3040722..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml +++ /dev/null @@ -1,66 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: projects.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Project - listKind: ProjectList - plural: projects - singular: project - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Project holds cluster-wide information about Project. The canonical - name is `cluster` - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - projectRequestMessage: - description: projectRequestMessage is the string presented to a user - if they are unable to request a project via the projectrequest api - endpoint - type: string - projectRequestTemplate: - description: projectRequestTemplate is the template to use for creating - projects in response to projectrequest. This must point to a template - in 'openshift-config' namespace. It is optional. If it is not specified, - a default template is used. - type: object - properties: - name: - description: name is the metadata.name of the referenced project - request template - type: string - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml deleted file mode 100644 index c66ec6ad95..0000000000 --- a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml +++ /dev/null @@ -1,106 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: schedulers.config.openshift.io - annotations: - include.release.openshift.io/ibm-cloud-managed: "true" - include.release.openshift.io/self-managed-high-availability: "true" - include.release.openshift.io/single-node-developer: "true" -spec: - group: config.openshift.io - scope: Cluster - names: - kind: Scheduler - singular: scheduler - plural: schedulers - listKind: SchedulerList - versions: - - name: v1 - served: true - storage: true - subresources: - status: {} - schema: - openAPIV3Schema: - description: Scheduler holds cluster-wide config information to run the Kubernetes - Scheduler and influence its placement decisions. The canonical name for - this config is `cluster`. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: spec holds user settable values for configuration - type: object - properties: - defaultNodeSelector: - description: 'defaultNodeSelector helps set the cluster-wide default - node selector to restrict pod placement to specific nodes. This - is applied to the pods created in all namespaces and creates an - intersection with any existing nodeSelectors already set on a pod, - additionally constraining that pod''s selector. For example, defaultNodeSelector: - "type=user-node,region=east" would set nodeSelector field in pod - spec to "type=user-node,region=east" to all pods created in all - namespaces. Namespaces having project-wide node selectors won''t - be impacted even if this field is set. This adds an annotation section - to the namespace. For example, if a new namespace is created with - node-selector=''type=user-node,region=east'', the annotation openshift.io/node-selector: - type=user-node,region=east gets added to the project. When the openshift.io/node-selector - annotation is set on the project the value is used in preference - to the value we are setting for defaultNodeSelector field. For instance, - openshift.io/node-selector: "type=user-node,region=west" means that - the default of "type=user-node,region=east" set in defaultNodeSelector - would not be applied.' - type: string - mastersSchedulable: - description: 'MastersSchedulable allows masters nodes to be schedulable. - When this flag is turned on, all the master nodes in the cluster - will be made schedulable, so that workload pods can run on them. - The default value for this field is false, meaning none of the master - nodes are schedulable. Important Note: Once the workload pods start - running on the master nodes, extreme care must be taken to ensure - that cluster-critical control plane components are not impacted. - Please turn on this field after doing due diligence.' - type: boolean - policy: - description: 'DEPRECATED: the scheduler Policy API has been deprecated - and will be removed in a future release. policy is a reference to - a ConfigMap containing scheduler policy which has user specified - predicates and priorities. If this ConfigMap is not available scheduler - will default to use DefaultAlgorithmProvider. The namespace for - this configmap is openshift-config.' - type: object - required: - - name - properties: - name: - description: name is the metadata.name of the referenced config - map - type: string - profile: - description: "profile sets which scheduling profile should be set - in order to configure scheduling decisions for new pods. \n Valid - values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" - Defaults to \"LowNodeUtilization\"" - type: string - enum: - - "" - - LowNodeUtilization - - HighNodeUtilization - - NoScoring - status: - description: status holds observed values from the cluster. They may not - be overridden. - type: object diff --git a/vendor/github.com/openshift/api/config/v1/Makefile b/vendor/github.com/openshift/api/config/v1/Makefile new file mode 100644 index 0000000000..66bf636305 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/Makefile @@ -0,0 +1,3 @@ +.PHONY: test +test: + make -C ../../tests test GINKGO_EXTRA_ARGS=--focus="config.openshift.io/v1" diff --git a/vendor/github.com/openshift/api/config/v1/doc.go b/vendor/github.com/openshift/api/config/v1/doc.go index 4ff5208f2c..f994547583 100644 --- a/vendor/github.com/openshift/api/config/v1/doc.go +++ b/vendor/github.com/openshift/api/config/v1/doc.go @@ -1,6 +1,7 @@ // +k8s:deepcopy-gen=package,register // +k8s:defaulter-gen=TypeMeta // +k8s:openapi-gen=true +// +openshift:featuregated-schema-gen=true // +kubebuilder:validation:Optional // +groupName=config.openshift.io diff --git a/vendor/github.com/openshift/api/config/v1/register.go b/vendor/github.com/openshift/api/config/v1/register.go index 35eace3701..222c7f0cc7 100644 --- a/vendor/github.com/openshift/api/config/v1/register.go +++ b/vendor/github.com/openshift/api/config/v1/register.go @@ -52,6 +52,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &InfrastructureList{}, &Ingress{}, &IngressList{}, + &Node{}, + &NodeList{}, &Network{}, &NetworkList{}, &OAuth{}, @@ -64,6 +66,18 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ProxyList{}, &Scheduler{}, &SchedulerList{}, + &ImageContentPolicy{}, + &ImageContentPolicyList{}, + &ImageDigestMirrorSet{}, + &ImageDigestMirrorSetList{}, + &ImageTagMirrorSet{}, + &ImageTagMirrorSetList{}, + &ImagePolicy{}, + &ImagePolicyList{}, + &ClusterImagePolicy{}, + &ClusterImagePolicyList{}, + &InsightsDataGather{}, + &InsightsDataGatherList{}, ) metav1.AddToGroupVersion(scheme, GroupVersion) return nil diff --git a/vendor/github.com/openshift/api/config/v1/types.go b/vendor/github.com/openshift/api/config/v1/types.go index 1427484236..3e17ca0ccb 100644 --- a/vendor/github.com/openshift/api/config/v1/types.go +++ b/vendor/github.com/openshift/api/config/v1/types.go @@ -9,7 +9,7 @@ import ( // The namespace must be specified at the point of use. type ConfigMapFileReference struct { Name string `json:"name"` - // Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. + // key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. Key string `json:"key,omitempty"` } @@ -17,7 +17,6 @@ type ConfigMapFileReference struct { // The namespace must be specified at the point of use. type ConfigMapNameReference struct { // name is the metadata.name of the referenced config map - // +kubebuilder:validation:Required // +required Name string `json:"name"` } @@ -26,7 +25,6 @@ type ConfigMapNameReference struct { // The namespace must be specified at the point of use. type SecretNameReference struct { // name is the metadata.name of the referenced secret - // +kubebuilder:validation:Required // +required Name string `json:"name"` } @@ -35,47 +33,47 @@ type SecretNameReference struct { type HTTPServingInfo struct { // ServingInfo is the HTTP serving information ServingInfo `json:",inline"` - // MaxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit. + // maxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit. MaxRequestsInFlight int64 `json:"maxRequestsInFlight"` - // RequestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if + // requestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if // -1 there is no limit on requests. RequestTimeoutSeconds int64 `json:"requestTimeoutSeconds"` } // ServingInfo holds information about serving web pages type ServingInfo struct { - // BindAddress is the ip:port to serve on + // bindAddress is the ip:port to serve on BindAddress string `json:"bindAddress"` - // BindNetwork is the type of network to bind to - defaults to "tcp4", accepts "tcp", + // bindNetwork is the type of network to bind to - defaults to "tcp4", accepts "tcp", // "tcp4", and "tcp6" BindNetwork string `json:"bindNetwork"` // CertInfo is the TLS cert info for serving secure traffic. // this is anonymous so that we can inline it for serialization CertInfo `json:",inline"` - // ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates + // clientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates // +optional ClientCA string `json:"clientCA,omitempty"` - // NamedCertificates is a list of certificates to use to secure requests to specific hostnames + // namedCertificates is a list of certificates to use to secure requests to specific hostnames NamedCertificates []NamedCertificate `json:"namedCertificates,omitempty"` - // MinTLSVersion is the minimum TLS version supported. + // minTLSVersion is the minimum TLS version supported. // Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants MinTLSVersion string `json:"minTLSVersion,omitempty"` - // CipherSuites contains an overridden list of ciphers for the server to support. + // cipherSuites contains an overridden list of ciphers for the server to support. // Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants CipherSuites []string `json:"cipherSuites,omitempty"` } // CertInfo relates a certificate with a private key type CertInfo struct { - // CertFile is a file containing a PEM-encoded certificate + // certFile is a file containing a PEM-encoded certificate CertFile string `json:"certFile"` - // KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile + // keyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile KeyFile string `json:"keyFile"` } // NamedCertificate specifies a certificate/key, and the names it should be served for type NamedCertificate struct { - // Names is a list of DNS names this certificate should be used to secure + // names is a list of DNS names this certificate should be used to secure // A name can be a normal DNS name, or can contain leading wildcard segments. Names []string `json:"names,omitempty"` // CertInfo is the TLS cert info for serving secure traffic @@ -121,24 +119,24 @@ type StringSource struct { // StringSourceSpec specifies a string value, or external location type StringSourceSpec struct { - // Value specifies the cleartext value, or an encrypted value if keyFile is specified. + // value specifies the cleartext value, or an encrypted value if keyFile is specified. Value string `json:"value"` - // Env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified. + // env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified. Env string `json:"env"` - // File references a file containing the cleartext value, or an encrypted value if a keyFile is specified. + // file references a file containing the cleartext value, or an encrypted value if a keyFile is specified. File string `json:"file"` - // KeyFile references a file containing the key to use to decrypt the value. + // keyFile references a file containing the key to use to decrypt the value. KeyFile string `json:"keyFile"` } // RemoteConnectionInfo holds information necessary for establishing a remote connection type RemoteConnectionInfo struct { - // URL is the remote URL to connect to + // url is the remote URL to connect to URL string `json:"url"` - // CA is the CA for verifying TLS connections + // ca is the CA for verifying TLS connections CA string `json:"ca"` // CertInfo is the TLS client cert information to present // this is anonymous so that we can inline it for serialization @@ -160,11 +158,11 @@ type AdmissionConfig struct { // AdmissionPluginConfig holds the necessary configuration options for admission plugins type AdmissionPluginConfig struct { - // Location is the path to a configuration file that contains the plugin's + // location is the path to a configuration file that contains the plugin's // configuration Location string `json:"location"` - // Configuration is an embedded configuration object to be used as the plugin's + // configuration is an embedded configuration object to be used as the plugin's // configuration. If present, it will be used instead of the path to the configuration file. // +nullable // +kubebuilder:pruning:PreserveUnknownFields @@ -205,9 +203,9 @@ type AuditConfig struct { // Maximum size in megabytes of the log file before it gets rotated. Defaults to 100MB. MaximumFileSizeMegabytes int32 `json:"maximumFileSizeMegabytes"` - // PolicyFile is a path to the file that defines the audit policy configuration. + // policyFile is a path to the file that defines the audit policy configuration. PolicyFile string `json:"policyFile"` - // PolicyConfiguration is an embedded policy configuration object to be used + // policyConfiguration is an embedded policy configuration object to be used // as the audit policy configuration. If present, it will be used instead of // the path to the policy file. // +nullable @@ -225,9 +223,9 @@ type AuditConfig struct { // EtcdConnectionInfo holds information necessary for connecting to an etcd server type EtcdConnectionInfo struct { - // URLs are the URLs for etcd + // urls are the URLs for etcd URLs []string `json:"urls,omitempty"` - // CA is a file containing trusted roots for the etcd server certificates + // ca is a file containing trusted roots for the etcd server certificates CA string `json:"ca"` // CertInfo is the TLS client cert information for securing communication to etcd // this is anonymous so that we can inline it for serialization @@ -237,7 +235,7 @@ type EtcdConnectionInfo struct { type EtcdStorageConfig struct { EtcdConnectionInfo `json:",inline"` - // StoragePrefix is the path within etcd that the OpenShift resources will + // storagePrefix is the path within etcd that the OpenShift resources will // be rooted under. This value, if changed, will mean existing objects in etcd will // no longer be located. StoragePrefix string `json:"storagePrefix"` @@ -287,7 +285,7 @@ type ClientConnectionOverrides struct { // GenericControllerConfig provides information to configure a controller type GenericControllerConfig struct { - // ServingInfo is the HTTP serving information for the controller's endpoints + // servingInfo is the HTTP serving information for the controller's endpoints ServingInfo HTTPServingInfo `json:"servingInfo"` // leaderElection provides information to elect a leader. Only override this if you have a specific need @@ -310,3 +308,124 @@ type DelegatedAuthorization struct { // disabled indicates that authorization should be disabled. By default it will use delegated authorization. Disabled bool `json:"disabled,omitempty"` } +type RequiredHSTSPolicy struct { + // namespaceSelector specifies a label selector such that the policy applies only to those routes that + // are in namespaces with labels that match the selector, and are in one of the DomainPatterns. + // Defaults to the empty LabelSelector, which matches everything. + // +optional + NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty"` + + // domainPatterns is a list of domains for which the desired HSTS annotations are required. + // If domainPatterns is specified and a route is created with a spec.host matching one of the domains, + // the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy. + // + // The use of wildcards is allowed like this: *.foo.com matches everything under foo.com. + // foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*. + // +kubebuilder:validation:MinItems=1 + // +required + DomainPatterns []string `json:"domainPatterns"` + + // maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. + // If set to 0, it negates the effect, and hosts are removed as HSTS hosts. + // If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. + // maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS + // policy will eventually expire on that client. + MaxAge MaxAgePolicy `json:"maxAge"` + + // preloadPolicy directs the client to include hosts in its host preload list so that + // it never needs to do an initial load to get the HSTS header (note that this is not defined + // in RFC 6797 and is therefore client implementation-dependent). + // +optional + PreloadPolicy PreloadPolicy `json:"preloadPolicy,omitempty"` + + // includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host's + // domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: + // - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com + // - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com + // - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com + // - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com + // +optional + IncludeSubDomainsPolicy IncludeSubDomainsPolicy `json:"includeSubDomainsPolicy,omitempty"` +} + +// MaxAgePolicy contains a numeric range for specifying a compliant HSTS max-age for the enclosing RequiredHSTSPolicy +type MaxAgePolicy struct { + // The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age + // This value can be left unspecified, in which case no upper limit is enforced. + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=2147483647 + LargestMaxAge *int32 `json:"largestMaxAge,omitempty"` + + // The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age + // Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary + // tool for administrators to quickly correct mistakes. + // This value can be left unspecified, in which case no lower limit is enforced. + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=2147483647 + SmallestMaxAge *int32 `json:"smallestMaxAge,omitempty"` +} + +// PreloadPolicy contains a value for specifying a compliant HSTS preload policy for the enclosing RequiredHSTSPolicy +// +kubebuilder:validation:Enum=RequirePreload;RequireNoPreload;NoOpinion +type PreloadPolicy string + +const ( + // RequirePreloadPolicy means HSTS "preload" is required by the RequiredHSTSPolicy + RequirePreloadPolicy PreloadPolicy = "RequirePreload" + + // RequireNoPreloadPolicy means HSTS "preload" is forbidden by the RequiredHSTSPolicy + RequireNoPreloadPolicy PreloadPolicy = "RequireNoPreload" + + // NoOpinionPreloadPolicy means HSTS "preload" doesn't matter to the RequiredHSTSPolicy + NoOpinionPreloadPolicy PreloadPolicy = "NoOpinion" +) + +// IncludeSubDomainsPolicy contains a value for specifying a compliant HSTS includeSubdomains policy +// for the enclosing RequiredHSTSPolicy +// +kubebuilder:validation:Enum=RequireIncludeSubDomains;RequireNoIncludeSubDomains;NoOpinion +type IncludeSubDomainsPolicy string + +const ( + // RequireIncludeSubDomains means HSTS "includeSubDomains" is required by the RequiredHSTSPolicy + RequireIncludeSubDomains IncludeSubDomainsPolicy = "RequireIncludeSubDomains" + + // RequireNoIncludeSubDomains means HSTS "includeSubDomains" is forbidden by the RequiredHSTSPolicy + RequireNoIncludeSubDomains IncludeSubDomainsPolicy = "RequireNoIncludeSubDomains" + + // NoOpinionIncludeSubDomains means HSTS "includeSubDomains" doesn't matter to the RequiredHSTSPolicy + NoOpinionIncludeSubDomains IncludeSubDomainsPolicy = "NoOpinion" +) + +// IBMCloudServiceName contains a value specifying the name of an IBM Cloud Service, +// which are used by MAPI, CIRO, CIO, Installer, etc. +// +kubebuilder:validation:Enum=CIS;COS;COSConfig;DNSServices;GlobalCatalog;GlobalSearch;GlobalTagging;HyperProtect;IAM;KeyProtect;ResourceController;ResourceManager;VPC +type IBMCloudServiceName string + +const ( + // IBMCloudServiceCIS is the name for IBM Cloud CIS. + IBMCloudServiceCIS IBMCloudServiceName = "CIS" + // IBMCloudServiceCOS is the name for IBM Cloud COS. + IBMCloudServiceCOS IBMCloudServiceName = "COS" + // IBMCloudServiceCOSConfig is the name for IBM Cloud COS Config service. + IBMCloudServiceCOSConfig IBMCloudServiceName = "COSConfig" + // IBMCloudServiceDNSServices is the name for IBM Cloud DNS Services. + IBMCloudServiceDNSServices IBMCloudServiceName = "DNSServices" + // IBMCloudServiceGlobalCatalog is the name for IBM Cloud Global Catalog service. + IBMCloudServiceGlobalCatalog IBMCloudServiceName = "GlobalCatalog" + // IBMCloudServiceGlobalSearch is the name for IBM Cloud Global Search. + IBMCloudServiceGlobalSearch IBMCloudServiceName = "GlobalSearch" + // IBMCloudServiceGlobalTagging is the name for IBM Cloud Global Tagging. + IBMCloudServiceGlobalTagging IBMCloudServiceName = "GlobalTagging" + // IBMCloudServiceHyperProtect is the name for IBM Cloud Hyper Protect. + IBMCloudServiceHyperProtect IBMCloudServiceName = "HyperProtect" + // IBMCloudServiceIAM is the name for IBM Cloud IAM. + IBMCloudServiceIAM IBMCloudServiceName = "IAM" + // IBMCloudServiceKeyProtect is the name for IBM Cloud Key Protect. + IBMCloudServiceKeyProtect IBMCloudServiceName = "KeyProtect" + // IBMCloudServiceResourceController is the name for IBM Cloud Resource Controller. + IBMCloudServiceResourceController IBMCloudServiceName = "ResourceController" + // IBMCloudServiceResourceManager is the name for IBM Cloud Resource Manager. + IBMCloudServiceResourceManager IBMCloudServiceName = "ResourceManager" + // IBMCloudServiceVPC is the name for IBM Cloud VPC. + IBMCloudServiceVPC IBMCloudServiceName = "VPC" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_apiserver.go b/vendor/github.com/openshift/api/config/v1/types_apiserver.go index 42268db39b..0afe7b1d8d 100644 --- a/vendor/github.com/openshift/api/config/v1/types_apiserver.go +++ b/vendor/github.com/openshift/api/config/v1/types_apiserver.go @@ -11,11 +11,22 @@ import ( // APIServer holds configuration (like serving certificates, client CA and CORS domains) // shared by all API servers in the system, among them especially kube-apiserver // and openshift-apiserver. The canonical name of an instance is 'cluster'. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=apiservers,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type APIServer struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec APIServerSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -40,15 +51,15 @@ type APIServerSpec struct { // server from JavaScript applications. // The values are regular expressions that correspond to the Golang regular expression language. // +optional + // +listType=atomic AdditionalCORSAllowedOrigins []string `json:"additionalCORSAllowedOrigins,omitempty"` // encryption allows the configuration of encryption of resources at the datastore layer. // +optional Encryption APIServerEncryption `json:"encryption"` // tlsSecurityProfile specifies settings for TLS connections for externally exposed servers. // - // If unset, a default (which may change between releases) is chosen. Note that only Old and - // Intermediate profiles are currently supported, and the maximum available MinTLSVersions - // is VersionTLS12. + // When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. + // The current default is the Intermediate profile. // +optional TLSSecurityProfile *TLSSecurityProfile `json:"tlsSecurityProfile,omitempty"` // audit specifies the settings for audit configuration to be applied to all OpenShift-provided @@ -59,12 +70,15 @@ type APIServerSpec struct { } // AuditProfileType defines the audit policy profile type. -// +kubebuilder:validation:Enum=Default;WriteRequestBodies;AllRequestBodies +// +kubebuilder:validation:Enum=Default;WriteRequestBodies;AllRequestBodies;None type AuditProfileType string const ( + // "None" disables audit logs. + NoneAuditProfileType AuditProfileType = "None" + // "Default" is the existing default audit configuration policy. - AuditProfileDefaultType AuditProfileType = "Default" + DefaultAuditProfileType AuditProfileType = "Default" // "WriteRequestBodies" is similar to Default but it logs request and response // HTTP payloads for write requests (create, update, patch) @@ -76,6 +90,47 @@ const ( ) type Audit struct { + // profile specifies the name of the desired top-level audit profile to be applied to all requests + // sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, + // openshift-apiserver and oauth-apiserver), with the exception of those requests that match + // one or more of the customRules. + // + // The following profiles are provided: + // - Default: default policy which means MetaData level logging with the exception of events + // (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody + // level). + // - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for + // write requests (create, update, patch). + // - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response + // HTTP payloads for read requests (get, list). + // - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. + // + // Warning: It is not recommended to disable audit logging by using the `None` profile unless you + // are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. + // If you disable audit logging and a support situation arises, you might need to enable audit logging + // and reproduce the issue in order to troubleshoot properly. + // + // If unset, the 'Default' profile is used as the default. + // + // +kubebuilder:default=Default + Profile AuditProfileType `json:"profile,omitempty"` + // customRules specify profiles per group. These profile take precedence over the + // top-level profile field if they apply. They are evaluation from top to bottom and + // the first one that matches, applies. + // +listType=map + // +listMapKey=group + // +optional + CustomRules []AuditCustomRule `json:"customRules,omitempty"` +} + +// AuditCustomRule describes a custom rule for an audit profile that takes precedence over +// the top-level profile. +type AuditCustomRule struct { + // group is a name of group a request user must be member of in order to this profile to apply. + // + // +kubebuilder:validation:MinLength=1 + // +required + Group string `json:"group"` // profile specifies the name of the desired audit policy configuration to be deployed to // all OpenShift-provided API servers in the cluster. // @@ -85,10 +140,12 @@ type Audit struct { // write requests (create, update, patch). // - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response // HTTP payloads for read requests (get, list). + // - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. // // If unset, the 'Default' profile is used as the default. - // +kubebuilder:default=Default - Profile AuditProfileType `json:"profile,omitempty"` + // + // +required + Profile AuditProfileType `json:"profile"` } type APIServerServingCerts struct { @@ -96,6 +153,8 @@ type APIServerServingCerts struct { // If no named certificates are provided, or no named certificates match the server name as understood by a client, // the defaultServingCertificate will be used. // +optional + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 NamedCertificates []APIServerNamedServingCert `json:"namedCertificates,omitempty"` } @@ -105,6 +164,8 @@ type APIServerNamedServingCert struct { // serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. // Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names. // +optional + // +listType=atomic + // +kubebuilder:validation:MaxItems=64 Names []string `json:"names,omitempty"` // servingCertificate references a kubernetes.io/tls type secret containing the TLS cert info for serving secure traffic. // The secret must exist in the openshift-config namespace and contain the following required fields: @@ -113,6 +174,9 @@ type APIServerNamedServingCert struct { ServingCertificate SecretNameReference `json:"servingCertificate"` } +// APIServerEncryption is used to encrypt sensitive resources on the cluster. +// +openshift:validation:FeatureGateAwareXValidation:featureGate=KMSEncryptionProvider,rule="has(self.type) && self.type == 'KMS' ? has(self.kms) : !has(self.kms)",message="kms config is required when encryption type is KMS, and forbidden otherwise" +// +union type APIServerEncryption struct { // type defines what encryption type should be used to encrypt resources at the datastore layer. // When this field is unset (i.e. when it is set to the empty string), identity is implied. @@ -131,9 +195,23 @@ type APIServerEncryption struct { // +unionDiscriminator // +optional Type EncryptionType `json:"type,omitempty"` + + // kms defines the configuration for the external KMS instance that manages the encryption keys, + // when KMS encryption is enabled sensitive resources will be encrypted using keys managed by an + // externally configured KMS instance. + // + // The Key Management Service (KMS) instance provides symmetric encryption and is responsible for + // managing the lifecyle of the encryption keys outside of the control plane. + // This allows integration with an external provider to manage the data encryption keys securely. + // + // +openshift:enable:FeatureGate=KMSEncryptionProvider + // +unionMember + // +optional + KMS *KMSConfig `json:"kms,omitempty"` } -// +kubebuilder:validation:Enum="";identity;aescbc +// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum="";identity;aescbc;aesgcm +// +openshift:validation:FeatureGateAwareEnum:featureGate=KMSEncryptionProvider,enum="";identity;aescbc;aesgcm;KMS type EncryptionType string const ( @@ -144,6 +222,15 @@ const ( // aescbc refers to a type where AES-CBC with PKCS#7 padding and a 32-byte key // is used to perform encryption at the datastore layer. EncryptionTypeAESCBC EncryptionType = "aescbc" + + // aesgcm refers to a type where AES-GCM with random nonce and a 32-byte key + // is used to perform encryption at the datastore layer. + EncryptionTypeAESGCM EncryptionType = "aesgcm" + + // kms refers to a type of encryption where the encryption keys are managed + // outside the control plane in a Key Management Service instance, + // encryption is still performed at the datastore layer. + EncryptionTypeKMS EncryptionType = "KMS" ) type APIServerStatus struct { @@ -151,8 +238,13 @@ type APIServerStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type APIServerList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []APIServer `json:"items"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_authentication.go b/vendor/github.com/openshift/api/config/v1/types_authentication.go index 0d1041bd5f..52a41b2fef 100644 --- a/vendor/github.com/openshift/api/config/v1/types_authentication.go +++ b/vendor/github.com/openshift/api/config/v1/types_authentication.go @@ -5,15 +5,27 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:validation:FeatureGateAwareXValidation:featureGate=ExternalOIDC;ExternalOIDCWithUIDAndExtraClaimMappings,rule="!has(self.spec.oidcProviders) || self.spec.oidcProviders.all(p, !has(p.oidcClients) || p.oidcClients.all(specC, self.status.oidcClients.exists(statusC, statusC.componentNamespace == specC.componentNamespace && statusC.componentName == specC.componentName) || (has(oldSelf.spec.oidcProviders) && oldSelf.spec.oidcProviders.exists(oldP, oldP.name == p.name && has(oldP.oidcClients) && oldP.oidcClients.exists(oldC, oldC.componentNamespace == specC.componentNamespace && oldC.componentName == specC.componentName)))))",message="all oidcClients in the oidcProviders must match their componentName and componentNamespace to either a previously configured oidcClient or they must exist in the status.oidcClients" // Authentication specifies cluster-wide settings for authentication (like OAuth and // webhook token authenticators). The canonical name of an instance is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=authentications,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Authentication struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec AuthenticationSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -44,26 +56,43 @@ type AuthenticationSpec struct { OAuthMetadata ConfigMapNameReference `json:"oauthMetadata"` // webhookTokenAuthenticators is DEPRECATED, setting it has no effect. + // +listType=atomic WebhookTokenAuthenticators []DeprecatedWebhookTokenAuthenticator `json:"webhookTokenAuthenticators,omitempty"` // webhookTokenAuthenticator configures a remote token reviewer. // These remote authentication webhooks can be used to verify bearer tokens // via the tokenreviews.authentication.k8s.io REST API. This is required to // honor bearer tokens that are provisioned by an external authentication service. + // + // Can only be set if "Type" is set to "None". + // // +optional WebhookTokenAuthenticator *WebhookTokenAuthenticator `json:"webhookTokenAuthenticator,omitempty"` // serviceAccountIssuer is the identifier of the bound service account token // issuer. // The default is https://kubernetes.default.svc - // WARNING: Updating this field will result in the invalidation of - // all bound tokens with the previous issuer value. Unless the - // holder of a bound token has explicit support for a change in - // issuer, they will not request a new bound token until pod - // restart or until their existing token exceeds 80% of its - // duration. + // WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the + // previous issuer value. Instead, the tokens issued by previous service account issuer will continue to + // be trusted for a time period chosen by the platform (currently set to 24h). + // This time period is subject to change over time. + // This allows internal components to transition to use new service account issuer without service distruption. // +optional ServiceAccountIssuer string `json:"serviceAccountIssuer"` + + // oidcProviders are OIDC identity providers that can issue tokens + // for this cluster + // Can only be set if "Type" is set to "OIDC". + // + // At most one provider can be configured. + // + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MaxItems=1 + // +openshift:enable:FeatureGate=ExternalOIDC + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + // +optional + OIDCProviders []OIDCProvider `json:"oidcProviders,omitempty"` } type AuthenticationStatus struct { @@ -80,35 +109,54 @@ type AuthenticationStatus struct { // If the config map or expected key is not found, no metadata is served. // If the specified metadata is not valid, no metadata is served. // The namespace for this config map is openshift-config-managed. + // +optional IntegratedOAuthMetadata ConfigMapNameReference `json:"integratedOAuthMetadata"` - // TODO if we add support for an in-cluster operator managed Keycloak instance - // KeycloakOAuthMetadata ConfigMapNameReference `json:"keycloakOAuthMetadata"` + // oidcClients is where participating operators place the current OIDC client status + // for OIDC clients that can be customized by the cluster-admin. + // + // +listType=map + // +listMapKey=componentNamespace + // +listMapKey=componentName + // +kubebuilder:validation:MaxItems=20 + // +openshift:enable:FeatureGate=ExternalOIDC + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + // +optional + OIDCClients []OIDCClientStatus `json:"oidcClients"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type AuthenticationList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Authentication `json:"items"` } +// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum="";None;IntegratedOAuth +// +openshift:validation:FeatureGateAwareEnum:featureGate=ExternalOIDC;ExternalOIDCWithUIDAndExtraClaimMappings,enum="";None;IntegratedOAuth;OIDC type AuthenticationType string const ( // None means that no cluster managed authentication system is in place. // Note that user login will only work if a manually configured system is in place and - // referenced in authentication spec via oauthMetadata and webhookTokenAuthenticators. + // referenced in authentication spec via oauthMetadata and + // webhookTokenAuthenticator/oidcProviders AuthenticationTypeNone AuthenticationType = "None" // IntegratedOAuth refers to the cluster managed OAuth server. // It is configured via the top level OAuth config. AuthenticationTypeIntegratedOAuth AuthenticationType = "IntegratedOAuth" - // TODO if we add support for an in-cluster operator managed Keycloak instance - // AuthenticationTypeKeycloak AuthenticationType = "Keycloak" + // AuthenticationTypeOIDC refers to a configuration with an external + // OIDC server configured directly with the kube-apiserver. + AuthenticationTypeOIDC AuthenticationType = "OIDC" ) // deprecatedWebhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator. @@ -137,7 +185,6 @@ type WebhookTokenAuthenticator struct { // The key "kubeConfig" is used to locate the data. // If the secret or expected key is not found, the webhook is not honored. // If the specified kube config data is not valid, the webhook is not honored. - // +kubebuilder:validation:Required // +required KubeConfig SecretNameReference `json:"kubeConfig"` } @@ -149,3 +196,578 @@ const ( // KubeConfigKey is the key for the kube config file data in a secret KubeConfigKey = "kubeConfig" ) + +type OIDCProvider struct { + // name is a required field that configures the unique human-readable identifier + // associated with the identity provider. + // It is used to distinguish between multiple identity providers + // and has no impact on token validation or authentication mechanics. + // + // name must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + Name string `json:"name"` + + // issuer is a required field that configures how the platform interacts + // with the identity provider and how tokens issued from the identity provider + // are evaluated by the Kubernetes API server. + // + // +required + Issuer TokenIssuer `json:"issuer"` + + // oidcClients is an optional field that configures how on-cluster, + // platform clients should request tokens from the identity provider. + // oidcClients must not exceed 20 entries and entries must have unique namespace/name pairs. + // + // +listType=map + // +listMapKey=componentNamespace + // +listMapKey=componentName + // +kubebuilder:validation:MaxItems=20 + // +optional + OIDCClients []OIDCClientConfig `json:"oidcClients"` + + // claimMappings is a required field that configures the rules to be used by + // the Kubernetes API server for translating claims in a JWT token, issued + // by the identity provider, to a cluster identity. + // + // +required + ClaimMappings TokenClaimMappings `json:"claimMappings"` + + // claimValidationRules is an optional field that configures the rules to + // be used by the Kubernetes API server for validating the claims in a JWT + // token issued by the identity provider. + // + // Validation rules are joined via an AND operation. + // + // +listType=atomic + // +optional + ClaimValidationRules []TokenClaimValidationRule `json:"claimValidationRules,omitempty"` +} + +// +kubebuilder:validation:MinLength=1 +type TokenAudience string + +type TokenIssuer struct { + // issuerURL is a required field that configures the URL used to issue tokens + // by the identity provider. + // The Kubernetes API server determines how authentication tokens should be handled + // by matching the 'iss' claim in the JWT to the issuerURL of configured identity providers. + // + // Must be at least 1 character and must not exceed 512 characters in length. + // Must be a valid URL that uses the 'https' scheme and does not contain a query, fragment or user. + // + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="must be a valid URL" + // +kubebuilder:validation:XValidation:rule="isURL(self) && url(self).getScheme() == 'https'",message="must use the 'https' scheme" + // +kubebuilder:validation:XValidation:rule="isURL(self) && url(self).getQuery() == {}",message="must not have a query" + // +kubebuilder:validation:XValidation:rule="self.find('#(.+)$') == ''",message="must not have a fragment" + // +kubebuilder:validation:XValidation:rule="self.find('@') == ''",message="must not have user info" + // +kubebuilder:validation:MaxLength=512 + // +kubebuilder:validation:MinLength=1 + // +required + URL string `json:"issuerURL"` + + // audiences is a required field that configures the acceptable audiences + // the JWT token, issued by the identity provider, must be issued to. + // At least one of the entries must match the 'aud' claim in the JWT token. + // + // audiences must contain at least one entry and must not exceed ten entries. + // + // +listType=set + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=10 + // +required + Audiences []TokenAudience `json:"audiences"` + + // issuerCertificateAuthority is an optional field that configures the + // certificate authority, used by the Kubernetes API server, to validate + // the connection to the identity provider when fetching discovery information. + // + // When not specified, the system trust is used. + // + // When specified, it must reference a ConfigMap in the openshift-config + // namespace containing the PEM-encoded CA certificates under the 'ca-bundle.crt' + // key in the data field of the ConfigMap. + // + // +optional + CertificateAuthority ConfigMapNameReference `json:"issuerCertificateAuthority"` +} + +type TokenClaimMappings struct { + // username is a required field that configures how the username of a cluster identity + // should be constructed from the claims in a JWT token issued by the identity provider. + // + // +required + Username UsernameClaimMapping `json:"username"` + + // groups is an optional field that configures how the groups of a cluster identity + // should be constructed from the claims in a JWT token issued + // by the identity provider. + // When referencing a claim, if the claim is present in the JWT + // token, its value must be a list of groups separated by a comma (','). + // For example - '"example"' and '"exampleOne", "exampleTwo", "exampleThree"' are valid claim values. + // + // +optional + Groups PrefixedClaimMapping `json:"groups,omitempty"` + + // uid is an optional field for configuring the claim mapping + // used to construct the uid for the cluster identity. + // + // When using uid.claim to specify the claim it must be a single string value. + // When using uid.expression the expression must result in a single string value. + // + // When omitted, this means the user has no opinion and the platform + // is left to choose a default, which is subject to change over time. + // The current default is to use the 'sub' claim. + // + // +optional + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + UID *TokenClaimOrExpressionMapping `json:"uid,omitempty"` + + // extra is an optional field for configuring the mappings + // used to construct the extra attribute for the cluster identity. + // When omitted, no extra attributes will be present on the cluster identity. + // key values for extra mappings must be unique. + // A maximum of 32 extra attribute mappings may be provided. + // + // +optional + // +kubebuilder:validation:MaxItems=32 + // +listType=map + // +listMapKey=key + // +openshift:enable:FeatureGate=ExternalOIDCWithUIDAndExtraClaimMappings + Extra []ExtraMapping `json:"extra,omitempty"` +} + +// TokenClaimMapping allows specifying a JWT token +// claim to be used when mapping claims from an +// authentication token to cluster identities. +type TokenClaimMapping struct { + // claim is a required field that configures the JWT token + // claim whose value is assigned to the cluster identity + // field associated with this mapping. + // + // +required + Claim string `json:"claim"` +} + +// TokenClaimOrExpressionMapping allows specifying either a JWT +// token claim or CEL expression to be used when mapping claims +// from an authentication token to cluster identities. +// +kubebuilder:validation:XValidation:rule="has(self.claim) ? !has(self.expression) : has(self.expression)",message="precisely one of claim or expression must be set" +type TokenClaimOrExpressionMapping struct { + // claim is an optional field for specifying the + // JWT token claim that is used in the mapping. + // The value of this claim will be assigned to + // the field in which this mapping is associated. + // + // Precisely one of claim or expression must be set. + // claim must not be specified when expression is set. + // When specified, claim must be at least 1 character in length + // and must not exceed 256 characters in length. + // + // +optional + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:MinLength=1 + Claim string `json:"claim,omitempty"` + + // expression is an optional field for specifying a + // CEL expression that produces a string value from + // JWT token claims. + // + // CEL expressions have access to the token claims + // through a CEL variable, 'claims'. + // 'claims' is a map of claim names to claim values. + // For example, the 'sub' claim value can be accessed as 'claims.sub'. + // Nested claims can be accessed using dot notation ('claims.foo.bar'). + // + // Precisely one of claim or expression must be set. + // expression must not be specified when claim is set. + // When specified, expression must be at least 1 character in length + // and must not exceed 1024 characters in length. + // + // +optional + // +kubebuilder:validation:MaxLength=1024 + // +kubebuilder:validation:MinLength=1 + Expression string `json:"expression,omitempty"` +} + +// ExtraMapping allows specifying a key and CEL expression +// to evaluate the keys' value. It is used to create additional +// mappings and attributes added to a cluster identity from +// a provided authentication token. +type ExtraMapping struct { + // key is a required field that specifies the string + // to use as the extra attribute key. + // + // key must be a domain-prefix path (e.g 'example.org/foo'). + // key must not exceed 510 characters in length. + // key must contain the '/' character, separating the domain and path characters. + // key must not be empty. + // + // The domain portion of the key (string of characters prior to the '/') must be a valid RFC1123 subdomain. + // It must not exceed 253 characters in length. + // It must start and end with an alphanumeric character. + // It must only contain lower case alphanumeric characters and '-' or '.'. + // It must not use the reserved domains, or be subdomains of, "kubernetes.io", "k8s.io", and "openshift.io". + // + // The path portion of the key (string of characters after the '/') must not be empty and must consist of at least one + // alphanumeric character, percent-encoded octets, '-', '.', '_', '~', '!', '$', '&', ''', '(', ')', '*', '+', ',', ';', '=', and ':'. + // It must not exceed 256 characters in length. + // + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=510 + // +kubebuilder:validation:XValidation:rule="self.contains('/')",message="key must contain the '/' character" + // + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0].matches(\"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\")",message="the domain of the key must consist of only lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0].size() <= 253",message="the domain of the key must not exceed 253 characters in length" + // + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0] != 'kubernetes.io'",message="the domain 'kubernetes.io' is reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="!self.split('/', 2)[0].endsWith('.kubernetes.io')",message="the subdomains '*.kubernetes.io' are reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0] != 'k8s.io'",message="the domain 'k8s.io' is reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="!self.split('/', 2)[0].endsWith('.k8s.io')",message="the subdomains '*.k8s.io' are reserved for Kubernetes use" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[0] != 'openshift.io'",message="the domain 'openshift.io' is reserved for OpenShift use" + // +kubebuilder:validation:XValidation:rule="!self.split('/', 2)[0].endsWith('.openshift.io')",message="the subdomains '*.openshift.io' are reserved for OpenShift use" + // + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[1].matches('[A-Za-z0-9/\\\\-._~%!$&\\'()*+;=:]+')",message="the path of the key must not be empty and must consist of at least one alphanumeric character, percent-encoded octets, apostrophe, '-', '.', '_', '~', '!', '$', '&', '(', ')', '*', '+', ',', ';', '=', and ':'" + // +kubebuilder:validation:XValidation:rule="self.split('/', 2)[1].size() <= 256",message="the path of the key must not exceed 256 characters in length" + Key string `json:"key"` + + // valueExpression is a required field to specify the CEL expression to extract + // the extra attribute value from a JWT token's claims. + // valueExpression must produce a string or string array value. + // "", [], and null are treated as the extra mapping not being present. + // Empty string values within an array are filtered out. + // + // CEL expressions have access to the token claims + // through a CEL variable, 'claims'. + // 'claims' is a map of claim names to claim values. + // For example, the 'sub' claim value can be accessed as 'claims.sub'. + // Nested claims can be accessed using dot notation ('claims.foo.bar'). + // + // valueExpression must not exceed 1024 characters in length. + // valueExpression must not be empty. + // + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=1024 + ValueExpression string `json:"valueExpression"` +} + +// OIDCClientConfig configures how platform clients +// interact with identity providers as an authentication +// method +type OIDCClientConfig struct { + // componentName is a required field that specifies the name of the platform + // component being configured to use the identity provider as an authentication mode. + // It is used in combination with componentNamespace as a unique identifier. + // + // componentName must not be an empty string ("") and must not exceed 256 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +required + ComponentName string `json:"componentName"` + + // componentNamespace is a required field that specifies the namespace in which the + // platform component being configured to use the identity provider as an authentication + // mode is running. + // It is used in combination with componentName as a unique identifier. + // + // componentNamespace must not be an empty string ("") and must not exceed 63 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +required + ComponentNamespace string `json:"componentNamespace"` + + // clientID is a required field that configures the client identifier, from + // the identity provider, that the platform component uses for authentication + // requests made to the identity provider. + // The identity provider must accept this identifier for platform components + // to be able to use the identity provider as an authentication mode. + // + // clientID must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + ClientID string `json:"clientID"` + + // clientSecret is an optional field that configures the client secret used + // by the platform component when making authentication requests to the identity provider. + // + // When not specified, no client secret will be used when making authentication requests + // to the identity provider. + // + // When specified, clientSecret references a Secret in the 'openshift-config' + // namespace that contains the client secret in the 'clientSecret' key of the '.data' field. + // The client secret will be used when making authentication requests to the identity provider. + // + // Public clients do not require a client secret but private + // clients do require a client secret to work with the identity provider. + // + // +optional + ClientSecret SecretNameReference `json:"clientSecret"` + + // extraScopes is an optional field that configures the extra scopes that should + // be requested by the platform component when making authentication requests to the + // identity provider. + // This is useful if you have configured claim mappings that requires specific + // scopes to be requested beyond the standard OIDC scopes. + // + // When omitted, no additional scopes are requested. + // + // +listType=set + // +optional + ExtraScopes []string `json:"extraScopes"` +} + +// OIDCClientStatus represents the current state +// of platform components and how they interact with +// the configured identity providers. +type OIDCClientStatus struct { + // componentName is a required field that specifies the name of the platform + // component using the identity provider as an authentication mode. + // It is used in combination with componentNamespace as a unique identifier. + // + // componentName must not be an empty string ("") and must not exceed 256 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +required + ComponentName string `json:"componentName"` + + // componentNamespace is a required field that specifies the namespace in which the + // platform component using the identity provider as an authentication + // mode is running. + // It is used in combination with componentName as a unique identifier. + // + // componentNamespace must not be an empty string ("") and must not exceed 63 characters in length. + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +required + ComponentNamespace string `json:"componentNamespace"` + + // currentOIDCClients is an optional list of clients that the component is currently using. + // Entries must have unique issuerURL/clientID pairs. + // + // +listType=map + // +listMapKey=issuerURL + // +listMapKey=clientID + // +optional + CurrentOIDCClients []OIDCClientReference `json:"currentOIDCClients"` + + // consumingUsers is an optional list of ServiceAccounts requiring + // read permissions on the `clientSecret` secret. + // + // consumingUsers must not exceed 5 entries. + // + // +kubebuilder:validation:MaxItems=5 + // +listType=set + // +optional + ConsumingUsers []ConsumingUser `json:"consumingUsers"` + + // conditions are used to communicate the state of the `oidcClients` entry. + // + // Supported conditions include Available, Degraded and Progressing. + // + // If Available is true, the component is successfully using the configured client. + // If Degraded is true, that means something has gone wrong trying to handle the client configuration. + // If Progressing is true, that means the component is taking some action related to the `oidcClients` entry. + // + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// OIDCClientReference is a reference to a platform component +// client configuration. +type OIDCClientReference struct { + // oidcProviderName is a required reference to the 'name' of the identity provider + // configured in 'oidcProviders' that this client is associated with. + // + // oidcProviderName must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + OIDCProviderName string `json:"oidcProviderName"` + + // issuerURL is a required field that specifies the URL of the identity + // provider that this client is configured to make requests against. + // + // issuerURL must use the 'https' scheme. + // + // +kubebuilder:validation:Pattern=`^https:\/\/[^\s]` + // +required + IssuerURL string `json:"issuerURL"` + + // clientID is a required field that specifies the client identifier, from + // the identity provider, that the platform component is using for authentication + // requests made to the identity provider. + // + // clientID must not be empty. + // + // +kubebuilder:validation:MinLength=1 + // +required + ClientID string `json:"clientID"` +} + +// +kubebuilder:validation:XValidation:rule="has(self.prefixPolicy) && self.prefixPolicy == 'Prefix' ? (has(self.prefix) && size(self.prefix.prefixString) > 0) : !has(self.prefix)",message="prefix must be set if prefixPolicy is 'Prefix', but must remain unset otherwise" +// +union +type UsernameClaimMapping struct { + // claim is a required field that configures the JWT token + // claim whose value is assigned to the cluster identity + // field associated with this mapping. + // + // claim must not be an empty string ("") and must not exceed 256 characters. + // + // +required + // +kubebuilder:validation:MinLength:=1 + // +kubebuilder:validation:MaxLength:=256 + Claim string `json:"claim"` + + // prefixPolicy is an optional field that configures how a prefix should be + // applied to the value of the JWT claim specified in the 'claim' field. + // + // Allowed values are 'Prefix', 'NoPrefix', and omitted (not provided or an empty string). + // + // When set to 'Prefix', the value specified in the prefix field will be + // prepended to the value of the JWT claim. + // The prefix field must be set when prefixPolicy is 'Prefix'. + // + // When set to 'NoPrefix', no prefix will be prepended to the value + // of the JWT claim. + // + // When omitted, this means no opinion and the platform is left to choose + // any prefixes that are applied which is subject to change over time. + // Currently, the platform prepends `{issuerURL}#` to the value of the JWT claim + // when the claim is not 'email'. + // As an example, consider the following scenario: + // `prefix` is unset, `issuerURL` is set to `https://myoidc.tld`, + // the JWT claims include "username":"userA" and "email":"userA@myoidc.tld", + // and `claim` is set to: + // - "username": the mapped value will be "https://myoidc.tld#userA" + // - "email": the mapped value will be "userA@myoidc.tld" + // + // +kubebuilder:validation:Enum={"", "NoPrefix", "Prefix"} + // +optional + // +unionDiscriminator + PrefixPolicy UsernamePrefixPolicy `json:"prefixPolicy"` + + // prefix configures the prefix that should be prepended to the value + // of the JWT claim. + // + // prefix must be set when prefixPolicy is set to 'Prefix' and must be unset otherwise. + // + // +optional + // +unionMember + Prefix *UsernamePrefix `json:"prefix"` +} + +// UsernamePrefixPolicy configures how prefixes should be applied +// to values extracted from the JWT claims during the process of mapping +// JWT claims to cluster identity attributes. +// +enum +type UsernamePrefixPolicy string + +var ( + // NoOpinion let's the cluster assign prefixes. If the username claim is email, there is no prefix + // If the username claim is anything else, it is prefixed by the issuerURL + NoOpinion UsernamePrefixPolicy = "" + + // NoPrefix means the username claim value will not have any prefix + NoPrefix UsernamePrefixPolicy = "NoPrefix" + + // Prefix means the prefix value must be specified. It cannot be empty + Prefix UsernamePrefixPolicy = "Prefix" +) + +// UsernamePrefix configures the string that should +// be used as a prefix for username claim mappings. +type UsernamePrefix struct { + // prefixString is a required field that configures the prefix that will + // be applied to cluster identity username attribute + // during the process of mapping JWT claims to cluster identity attributes. + // + // prefixString must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + PrefixString string `json:"prefixString"` +} + +// PrefixedClaimMapping configures a claim mapping +// that allows for an optional prefix. +type PrefixedClaimMapping struct { + TokenClaimMapping `json:",inline"` + + // prefix is an optional field that configures the prefix that will be + // applied to the cluster identity attribute during the process of mapping + // JWT claims to cluster identity attributes. + // + // When omitted (""), no prefix is applied to the cluster identity attribute. + // + // Example: if `prefix` is set to "myoidc:" and the `claim` in JWT contains + // an array of strings "a", "b" and "c", the mapping will result in an + // array of string "myoidc:a", "myoidc:b" and "myoidc:c". + // + // +optional + Prefix string `json:"prefix"` +} + +// TokenValidationRuleType represents the different +// claim validation rule types that can be configured. +// +enum +type TokenValidationRuleType string + +const ( + TokenValidationRuleTypeRequiredClaim = "RequiredClaim" +) + +type TokenClaimValidationRule struct { + // type is an optional field that configures the type of the validation rule. + // + // Allowed values are 'RequiredClaim' and omitted (not provided or an empty string). + // + // When set to 'RequiredClaim', the Kubernetes API server + // will be configured to validate that the incoming JWT + // contains the required claim and that its value matches + // the required value. + // + // Defaults to 'RequiredClaim'. + // + // +kubebuilder:validation:Enum={"RequiredClaim"} + // +kubebuilder:default="RequiredClaim" + Type TokenValidationRuleType `json:"type"` + + // requiredClaim is an optional field that configures the required claim + // and value that the Kubernetes API server will use to validate if an incoming + // JWT is valid for this identity provider. + // + // +optional + RequiredClaim *TokenRequiredClaim `json:"requiredClaim,omitempty"` +} + +type TokenRequiredClaim struct { + // claim is a required field that configures the name of the required claim. + // When taken from the JWT claims, claim must be a string value. + // + // claim must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + Claim string `json:"claim"` + + // requiredValue is a required field that configures the value that 'claim' must + // have when taken from the incoming JWT claims. + // If the value in the JWT claims does not match, the token + // will be rejected for authentication. + // + // requiredValue must not be an empty string (""). + // + // +kubebuilder:validation:MinLength=1 + // +required + RequiredValue string `json:"requiredValue"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_build.go b/vendor/github.com/openshift/api/config/v1/types_build.go index 16882e1caf..dcde1fc5b8 100644 --- a/vendor/github.com/openshift/api/config/v1/types_build.go +++ b/vendor/github.com/openshift/api/config/v1/types_build.go @@ -13,18 +13,29 @@ import ( // This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds. // // The canonical name is "cluster" +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=openshift-controller-manager,operatorOrdering=01 +// +openshift:capability=Build +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=builds,scope=Cluster +// +kubebuilder:subresource:status type Build struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` - // Spec holds user-settable values for the build controller configuration - // +kubebuilder:validation:Required + // spec holds user-settable values for the build controller configuration // +required Spec BuildSpec `json:"spec"` } type BuildSpec struct { - // AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that + // additionalTrustedCA is a reference to a ConfigMap containing additional CAs that // should be trusted for image pushes and pulls during builds. // The namespace for this config map is openshift-config. // @@ -33,16 +44,16 @@ type BuildSpec struct { // // +optional AdditionalTrustedCA ConfigMapNameReference `json:"additionalTrustedCA"` - // BuildDefaults controls the default information for Builds + // buildDefaults controls the default information for Builds // +optional BuildDefaults BuildDefaults `json:"buildDefaults"` - // BuildOverrides controls override settings for builds + // buildOverrides controls override settings for builds // +optional BuildOverrides BuildOverrides `json:"buildOverrides"` } type BuildDefaults struct { - // DefaultProxy contains the default proxy settings for all build operations, including image pull/push + // defaultProxy contains the default proxy settings for all build operations, including image pull/push // and source download. // // Values can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables @@ -50,55 +61,55 @@ type BuildDefaults struct { // +optional DefaultProxy *ProxySpec `json:"defaultProxy,omitempty"` - // GitProxy contains the proxy settings for git operations only. If set, this will override + // gitProxy contains the proxy settings for git operations only. If set, this will override // any Proxy settings for all git commands, such as git clone. // // Values that are not set here will be inherited from DefaultProxy. // +optional GitProxy *ProxySpec `json:"gitProxy,omitempty"` - // Env is a set of default environment variables that will be applied to the + // env is a set of default environment variables that will be applied to the // build if the specified variables do not exist on the build // +optional Env []corev1.EnvVar `json:"env,omitempty"` - // ImageLabels is a list of docker labels that are applied to the resulting image. + // imageLabels is a list of docker labels that are applied to the resulting image. // User can override a default label by providing a label with the same name in their // Build/BuildConfig. // +optional ImageLabels []ImageLabel `json:"imageLabels,omitempty"` - // Resources defines resource requirements to execute the build. + // resources defines resource requirements to execute the build. // +optional Resources corev1.ResourceRequirements `json:"resources"` } type ImageLabel struct { - // Name defines the name of the label. It must have non-zero length. + // name defines the name of the label. It must have non-zero length. Name string `json:"name"` - // Value defines the literal value of the label. + // value defines the literal value of the label. // +optional Value string `json:"value,omitempty"` } type BuildOverrides struct { - // ImageLabels is a list of docker labels that are applied to the resulting image. + // imageLabels is a list of docker labels that are applied to the resulting image. // If user provided a label in their Build/BuildConfig with the same name as one in this // list, the user's label will be overwritten. // +optional ImageLabels []ImageLabel `json:"imageLabels,omitempty"` - // NodeSelector is a selector which must be true for the build pod to fit on a node + // nodeSelector is a selector which must be true for the build pod to fit on a node // +optional NodeSelector map[string]string `json:"nodeSelector,omitempty"` - // Tolerations is a list of Tolerations that will override any existing + // tolerations is a list of Tolerations that will override any existing // tolerations set on a build pod. // +optional Tolerations []corev1.Toleration `json:"tolerations,omitempty"` - // ForcePull overrides, if set, the equivalent value in the builds, + // forcePull overrides, if set, the equivalent value in the builds, // i.e. false disables force pull for all builds, // true enables force pull for all builds, // independently of what each build specifies itself @@ -108,8 +119,13 @@ type BuildOverrides struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type BuildList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Build `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go b/vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go new file mode 100644 index 0000000000..ca604e05c5 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go @@ -0,0 +1,87 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterImagePolicy holds cluster-wide configuration for image signature verification +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=clusterimagepolicies,scope=Cluster +// +kubebuilder:subresource:status +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2310 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +openshift:enable:FeatureGate=SigstoreImageVerification +// +openshift:compatibility-gen:level=1 +type ClusterImagePolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata"` + + // spec contains the configuration for the cluster image policy. + // +required + Spec ClusterImagePolicySpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ClusterImagePolicyStatus `json:"status"` +} + +// CLusterImagePolicySpec is the specification of the ClusterImagePolicy custom resource. +type ClusterImagePolicySpec struct { + // scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the "Docker Registry HTTP API V2". + // Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). + // More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository + // namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). + // Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. + // This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. + // In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories + // quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. + // If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. + // For additional details about the format, please refer to the document explaining the docker transport field, + // which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker + // +required + // +kubebuilder:validation:MaxItems=256 + // +listType=set + Scopes []ImageScope `json:"scopes"` + // policy is a required field that contains configuration to allow scopes to be verified, and defines how + // images not matching the verification policy will be treated. + // +required + Policy Policy `json:"policy"` +} + +// +k8s:deepcopy-gen=true +type ClusterImagePolicyStatus struct { + // conditions provide details on the status of this API Resource. + // +kubebuilder:validation:MaxItems=8 + // +kubebuilder:validation:MinItems=1 + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterImagePolicyList is a list of ClusterImagePolicy resources +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ClusterImagePolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +required + metav1.ListMeta `json:"metadata"` + + // items is a list of ClusterImagePolices + // +kubebuilder:validation:MaxItems=1000 + // +required + Items []ClusterImagePolicy `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go b/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go index 92f500dfd7..8323040389 100644 --- a/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go @@ -9,15 +9,30 @@ import ( // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// ClusterOperator is the Custom Resource object which holds the current state -// of an operator. This object is used by operators to convey their state to -// the rest of the cluster. +// ClusterOperator holds the status of a core or optional OpenShift component +// managed by the Cluster Version Operator (CVO). This object is used by +// operators to convey their state to the rest of the cluster. +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/497 +// +openshift:file-pattern=cvoRunLevel=0000_00,operatorName=cluster-version-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=clusteroperators,scope=Cluster,shortName=co +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name=Version,JSONPath=.status.versions[?(@.name=="operator")].version,type=string,description=The version the operator is at. +// +kubebuilder:printcolumn:name=Available,JSONPath=.status.conditions[?(@.type=="Available")].status,type=string,description=Whether the operator is running and stable. +// +kubebuilder:printcolumn:name=Progressing,JSONPath=.status.conditions[?(@.type=="Progressing")].status,type=string,description=Whether the operator is processing changes. +// +kubebuilder:printcolumn:name=Degraded,JSONPath=.status.conditions[?(@.type=="Degraded")].status,type=string,description=Whether the operator is degraded. +// +kubebuilder:printcolumn:name=Since,JSONPath=.status.conditions[?(@.type=="Available")].lastTransitionTime,type=date,description=The time the operator's Available status last changed. +// +kubebuilder:metadata:annotations=include.release.openshift.io/self-managed-high-availability=true type ClusterOperator struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata"` // spec holds configuration that could apply to any operator. - // +kubebuilder:validation:Required // +required Spec ClusterOperatorSpec `json:"spec"` @@ -37,6 +52,8 @@ type ClusterOperatorStatus struct { // conditions describes the state of the operator's managed and monitored components. // +patchMergeKey=type // +patchStrategy=merge + // +listType=map + // +listMapKey=type // +optional Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"` @@ -63,14 +80,12 @@ type ClusterOperatorStatus struct { type OperandVersion struct { // name is the name of the particular operand this version is for. It usually matches container images, not operators. - // +kubebuilder:validation:Required // +required Name string `json:"name"` // version indicates which version of a particular operand is currently being managed. It must always match the Available // operand. If 1.0.0 is Available, then this must indicate 1.0.0 even if the operator is trying to rollout // 1.1.0 - // +kubebuilder:validation:Required // +required Version string `json:"version"` } @@ -78,18 +93,15 @@ type OperandVersion struct { // ObjectReference contains enough information to let you inspect or modify the referred object. type ObjectReference struct { // group of the referent. - // +kubebuilder:validation:Required // +required Group string `json:"group"` // resource of the referent. - // +kubebuilder:validation:Required // +required Resource string `json:"resource"` // namespace of the referent. // +optional Namespace string `json:"namespace,omitempty"` // name of the referent. - // +kubebuilder:validation:Required // +required Name string `json:"name"` } @@ -111,17 +123,14 @@ const ( // +k8s:deepcopy-gen=true type ClusterOperatorStatusCondition struct { // type specifies the aspect reported by this condition. - // +kubebuilder:validation:Required // +required Type ClusterStatusConditionType `json:"type"` // status of the condition, one of True, False, Unknown. - // +kubebuilder:validation:Required // +required Status ConditionStatus `json:"status"` // lastTransitionTime is the time of the last update to the current status property. - // +kubebuilder:validation:Required // +required LastTransitionTime metav1.Time `json:"lastTransitionTime"` @@ -140,47 +149,76 @@ type ClusterOperatorStatusCondition struct { type ClusterStatusConditionType string const ( - // Available indicates that the operand (eg: openshift-apiserver for the - // openshift-apiserver-operator), is functional and available in the cluster. - // Available=False means at least part of the component is non-functional, - // and that the condition requires immediate administrator intervention. + // Available indicates that the component (operator and all configured operands) + // is functional and available in the cluster. Available=False means at least + // part of the component is non-functional, and that the condition requires + // immediate administrator intervention. + // A component must not report Available=False during the course of a normal upgrade. OperatorAvailable ClusterStatusConditionType = "Available" - // Progressing indicates that the operator is actively rolling out new code, - // propagating config changes, or otherwise moving from one steady state to - // another. Operators should not report progressing when they are reconciling - // a previously known state. + // Progressing indicates that the component (operator and all configured operands) + // is actively rolling out new code, propagating config changes (e.g, a version change), or otherwise + // moving from one steady state to another. Operators should not report + // Progressing when they are reconciling (without action) a previously known + // state. Operators should not report Progressing only because DaemonSets owned by them + // are adjusting to a new node from cluster scaleup or a node rebooting from cluster upgrade. + // If the observed cluster state has changed and the component is + // reacting to it (updated proxy configuration for instance), Progressing should become true + // since it is moving from one steady state to another. + // A component in a cluster with less than 250 nodes must complete a version + // change within a limited period of time: 90 minutes for Machine Config Operator and 20 minutes for others. + // Machine Config Operator is given more time as it needs to restart control plane nodes. OperatorProgressing ClusterStatusConditionType = "Progressing" - // Degraded indicates that the operator's current state does not match its - // desired state over a period of time resulting in a lower quality of service. - // The period of time may vary by component, but a Degraded state represents - // persistent observation of a condition. As a result, a component should not - // oscillate in and out of Degraded state. A service may be Available even - // if its degraded. For example, your service may desire 3 running pods, but 1 - // pod is crash-looping. The service is Available but Degraded because it - // may have a lower quality of service. A component may be Progressing but - // not Degraded because the transition from one state to another does not - // persist over a long enough period to report Degraded. A service should not - // report Degraded during the course of a normal upgrade. A service may report - // Degraded in response to a persistent infrastructure failure that requires - // eventual administrator intervention. For example, if a control plane host - // is unhealthy and must be replaced. An operator should report Degraded if - // unexpected errors occur over a period, but the expectation is that all - // unexpected errors are handled as operators mature. + // Degraded indicates that the component (operator and all configured operands) + // does not match its desired state over a period of time resulting in a lower + // quality of service. The period of time may vary by component, but a Degraded + // state represents persistent observation of a condition. As a result, a + // component should not oscillate in and out of Degraded state. A component may + // be Available even if its degraded. For example, a component may desire 3 + // running pods, but 1 pod is crash-looping. The component is Available but + // Degraded because it may have a lower quality of service. A component may be + // Progressing but not Degraded because the transition from one state to + // another does not persist over a long enough period to report Degraded. A + // component must not report Degraded during the course of a normal upgrade. + // A component may report Degraded in response to a persistent infrastructure + // failure that requires eventual administrator intervention. For example, if + // a control plane host is unhealthy and must be replaced. A component should + // report Degraded if unexpected errors occur over a period, but the + // expectation is that all unexpected errors are handled as operators mature. OperatorDegraded ClusterStatusConditionType = "Degraded" - // Upgradeable indicates whether the operator is in a state that is safe to upgrade. When status is `False` - // administrators should not upgrade their cluster and the message field should contain a human readable description - // of what the administrator should do to allow the operator to successfully update. A missing condition, True, - // and Unknown are all treated by the CVO as allowing an upgrade. + // Upgradeable indicates whether the component (operator and all configured + // operands) is safe to upgrade based on the current cluster state. When + // Upgradeable is False, the cluster-version operator will prevent the + // cluster from performing impacted updates unless forced. When set on + // ClusterVersion, the message will explain which updates (minor or patch) + // are impacted. When set on ClusterOperator, False will block minor + // OpenShift updates. The message field should contain a human readable + // description of what the administrator should do to allow the cluster or + // component to successfully update. The cluster-version operator will + // allow updates when this condition is not False, including when it is + // missing, True, or Unknown. OperatorUpgradeable ClusterStatusConditionType = "Upgradeable" + + // EvaluationConditionsDetected is used to indicate the result of the detection + // logic that was added to a component to evaluate the introduction of an + // invasive change that could potentially result in highly visible alerts, + // breakages or upgrade failures. You can concatenate multiple Reason using + // the "::" delimiter if you need to evaluate the introduction of multiple changes. + EvaluationConditionsDetected ClusterStatusConditionType = "EvaluationConditionsDetected" ) // ClusterOperatorList is a list of OperatorStatus resources. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 type ClusterOperatorList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []ClusterOperator `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_version.go b/vendor/github.com/openshift/api/config/v1/types_cluster_version.go index 58a65228da..7929f4b625 100644 --- a/vendor/github.com/openshift/api/config/v1/types_cluster_version.go +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_version.go @@ -10,13 +10,30 @@ import ( // ClusterVersion is the configuration for the ClusterVersionOperator. This is where // parameters related to automatic updates can be set. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/495 +// +openshift:file-pattern=cvoRunLevel=0000_00,operatorName=cluster-version-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:path=clusterversions,scope=Cluster +// +kubebuilder:validation:XValidation:rule="has(self.spec.capabilities) && has(self.spec.capabilities.additionalEnabledCapabilities) && self.spec.capabilities.baselineCapabilitySet == 'None' && 'marketplace' in self.spec.capabilities.additionalEnabledCapabilities ? 'OperatorLifecycleManager' in self.spec.capabilities.additionalEnabledCapabilities || (has(self.status) && has(self.status.capabilities) && has(self.status.capabilities.enabledCapabilities) && 'OperatorLifecycleManager' in self.status.capabilities.enabledCapabilities) : true",message="the `marketplace` capability requires the `OperatorLifecycleManager` capability, which is neither explicitly or implicitly enabled in this cluster, please enable the `OperatorLifecycleManager` capability" +// +kubebuilder:printcolumn:name=Version,JSONPath=.status.history[?(@.state=="Completed")].version,type=string +// +kubebuilder:printcolumn:name=Available,JSONPath=.status.conditions[?(@.type=="Available")].status,type=string +// +kubebuilder:printcolumn:name=Progressing,JSONPath=.status.conditions[?(@.type=="Progressing")].status,type=string +// +kubebuilder:printcolumn:name=Since,JSONPath=.status.conditions[?(@.type=="Progressing")].lastTransitionTime,type=date +// +kubebuilder:printcolumn:name=Status,JSONPath=.status.conditions[?(@.type=="Progressing")].message,type=string +// +kubebuilder:metadata:annotations=include.release.openshift.io/self-managed-high-availability=true type ClusterVersion struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec is the desired state of the cluster version - the operator will work // to ensure that the desired version is applied to the cluster. - // +kubebuilder:validation:Required // +required Spec ClusterVersionSpec `json:"spec"` // status contains information about the available updates and any in-progress @@ -33,7 +50,6 @@ type ClusterVersionSpec struct { // clusterID uniquely identifies this cluster. This is expected to be // an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in // hexadecimal values). This is a required field. - // +kubebuilder:validation:Required // +required ClusterID ClusterID `json:"clusterID"` @@ -42,13 +58,24 @@ type ClusterVersionSpec struct { // the current version does not match the desired version). The set of // recommended update values is listed as part of available updates in // status, and setting values outside that range may cause the upgrade - // to fail. You may specify the version field without setting image if - // an update exists with that version in the availableUpdates or history. + // to fail. + // + // Some of the fields are inter-related with restrictions and meanings described here. + // 1. image is specified, version is specified, architecture is specified. API validation error. + // 2. image is specified, version is specified, architecture is not specified. The version extracted from the referenced image must match the specified version. + // 3. image is specified, version is not specified, architecture is specified. API validation error. + // 4. image is specified, version is not specified, architecture is not specified. image is used. + // 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. + // 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. + // 7. image is not specified, version is not specified, architecture is specified. API validation error. + // 8. image is not specified, version is not specified, architecture is not specified. API validation error. // // If an upgrade fails the operator will halt and report status // about the failing component. Setting the desired update value back to - // the previous version will cause a rollback to be attempted. Not all - // rollbacks will succeed. + // the previous version will cause a rollback to be attempted if the + // previous version is within the current minor version. Not all + // rollbacks will succeed, and some may unrecoverably break the + // cluster. // // +optional DesiredUpdate *Update `json:"desiredUpdate,omitempty"` @@ -58,16 +85,45 @@ type ClusterVersionSpec struct { // // +optional Upstream URL `json:"upstream,omitempty"` - // channel is an identifier for explicitly requesting that a non-default - // set of updates be applied to this cluster. The default channel will be + // channel is an identifier for explicitly requesting a non-default set + // of updates to be applied to this cluster. The default channel will // contain stable updates that are appropriate for production clusters. // // +optional Channel string `json:"channel,omitempty"` + // capabilities configures the installation of optional, core + // cluster components. A null value here is identical to an + // empty object; see the child properties for default semantics. + // +optional + Capabilities *ClusterVersionCapabilitiesSpec `json:"capabilities,omitempty"` + + // signatureStores contains the upstream URIs to verify release signatures and optional + // reference to a config map by name containing the PEM-encoded CA bundle. + // + // By default, CVO will use existing signature stores if this property is empty. + // The CVO will check the release signatures in the local ConfigMaps first. It will search for a valid signature + // in these stores in parallel only when local ConfigMaps did not include a valid signature. + // Validation will fail if none of the signature stores reply with valid signature before timeout. + // Setting signatureStores will replace the default signature stores with custom signature stores. + // Default stores can be used with custom signature stores by adding them manually. + // + // A maximum of 32 signature stores may be configured. + // +kubebuilder:validation:MaxItems=32 + // +openshift:enable:FeatureGate=SignatureStores + // +listType=map + // +listMapKey=url + // +optional + SignatureStores []SignatureStore `json:"signatureStores"` + // overrides is list of overides for components that are managed by // cluster version operator. Marking a component unmanaged will prevent // the operator from creating or updating the object. + // +listType=map + // +listMapKey=kind + // +listMapKey=group + // +listMapKey=namespace + // +listMapKey=name // +optional Overrides []ComponentOverride `json:"overrides,omitempty"` } @@ -82,7 +138,6 @@ type ClusterVersionStatus struct { // desired is the version that the cluster is reconciling towards. // If the cluster is not yet fully initialized desired will be set // with the information available, which may be an image or a tag. - // +kubebuilder:validation:Required // +required Desired Release `json:"desired"` @@ -93,23 +148,26 @@ type ClusterVersionStatus struct { // Completed if the rollout completed - if an update was failing or halfway // applied the state will be Partial. Only a limited amount of update history // is preserved. + // +listType=atomic // +optional History []UpdateHistory `json:"history,omitempty"` // observedGeneration reports which version of the spec is being synced. // If this value is not equal to metadata.generation, then the desired // and conditions fields may represent a previous version. - // +kubebuilder:validation:Required // +required ObservedGeneration int64 `json:"observedGeneration"` // versionHash is a fingerprint of the content that the cluster will be // updated with. It is used by the operator to avoid unnecessary work // and is for internal use only. - // +kubebuilder:validation:Required // +required VersionHash string `json:"versionHash"` + // capabilities describes the state of optional, core cluster components. + // +optional + Capabilities ClusterVersionCapabilitiesStatus `json:"capabilities"` + // conditions provides information about the cluster version. The condition // "Available" is set to true if the desiredUpdate has been reached. The // condition "Progressing" is set to true if an update is being applied. @@ -117,17 +175,33 @@ type ClusterVersionStatus struct { // by a temporary or permanent error. Conditions are only valid for the // current desiredUpdate when metadata.generation is equal to // status.generation. + // +listType=map + // +listMapKey=type + // +patchMergeKey=type + // +patchStrategy=merge // +optional - Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty"` + Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"` - // availableUpdates contains the list of updates that are appropriate - // for this cluster. This list may be empty if no updates are recommended, - // if the update service is unavailable, or if an invalid channel has - // been specified. + // availableUpdates contains updates recommended for this + // cluster. Updates which appear in conditionalUpdates but not in + // availableUpdates may expose this cluster to known issues. This list + // may be empty if no updates are recommended, if the update service + // is unavailable, or if an invalid channel has been specified. // +nullable - // +kubebuilder:validation:Required + // +listType=atomic // +required AvailableUpdates []Release `json:"availableUpdates"` + + // conditionalUpdates contains the list of updates that may be + // recommended for this cluster if it meets specific required + // conditions. Consumers interested in the set of updates that are + // actually recommended for this cluster should use + // availableUpdates. This list may be empty if no updates are + // recommended, if the update service is unavailable, or if an empty + // or invalid channel has been specified. + // +listType=atomic + // +optional + ConditionalUpdates []ConditionalUpdate `json:"conditionalUpdates,omitempty"` } // UpdateState is a constant representing whether an update was successfully @@ -149,71 +223,463 @@ type UpdateHistory struct { // indicates the update is not fully applied, while the Completed state // indicates the update was successfully rolled out at least once (all // parts of the update successfully applied). - // +kubebuilder:validation:Required // +required State UpdateState `json:"state"` // startedTime is the time at which the update was started. - // +kubebuilder:validation:Required // +required StartedTime metav1.Time `json:"startedTime"` + // completionTime, if set, is when the update was fully applied. The update // that is currently being applied will have a null completion time. // Completion time will always be set for entries that are not the current // update (usually to the started time of the next update). - // +kubebuilder:validation:Required // +required // +nullable CompletionTime *metav1.Time `json:"completionTime"` - // version is a semantic versioning identifying the update version. If the + // version is a semantic version identifying the update version. If the // requested image does not define a version, or if a failure occurs // retrieving the image, this value may be empty. // // +optional Version string `json:"version"` + // image is a container image location that contains the update. This value // is always populated. - // +kubebuilder:validation:Required // +required Image string `json:"image"` + // verified indicates whether the provided update was properly verified // before it was installed. If this is false the cluster may not be trusted. - // +kubebuilder:validation:Required + // Verified does not cover upgradeable checks that depend on the cluster + // state at the time when the update target was accepted. // +required Verified bool `json:"verified"` + + // acceptedRisks records risks which were accepted to initiate the update. + // For example, it may menition an Upgradeable=False or missing signature + // that was overridden via desiredUpdate.force, or an update that was + // initiated despite not being in the availableUpdates set of recommended + // update targets. + // +optional + AcceptedRisks string `json:"acceptedRisks,omitempty"` } // ClusterID is string RFC4122 uuid. type ClusterID string +// ClusterVersionArchitecture enumerates valid cluster architectures. +// +kubebuilder:validation:Enum="Multi";"" +type ClusterVersionArchitecture string + +const ( + // ClusterVersionArchitectureMulti identifies a multi architecture. A multi + // architecture cluster is capable of running nodes with multiple architectures. + ClusterVersionArchitectureMulti ClusterVersionArchitecture = "Multi" +) + +// ClusterVersionCapability enumerates optional, core cluster components. +// +kubebuilder:validation:Enum=openshift-samples;baremetal;marketplace;Console;Insights;Storage;CSISnapshot;NodeTuning;MachineAPI;Build;DeploymentConfig;ImageRegistry;OperatorLifecycleManager;CloudCredential;Ingress;CloudControllerManager;OperatorLifecycleManagerV1 +type ClusterVersionCapability string + +const ( + // ClusterVersionCapabilityOpenShiftSamples manages the sample + // image streams and templates stored in the openshift + // namespace, and any registry credentials, stored as a secret, + // needed for the image streams to import the images they + // reference. + ClusterVersionCapabilityOpenShiftSamples ClusterVersionCapability = "openshift-samples" + + // ClusterVersionCapabilityBaremetal manages the cluster + // baremetal operator which is responsible for running the metal3 + // deployment. + ClusterVersionCapabilityBaremetal ClusterVersionCapability = "baremetal" + + // ClusterVersionCapabilityMarketplace manages the Marketplace operator which + // supplies Operator Lifecycle Manager (OLM) users with default catalogs of + // "optional" operators. + // + // Note that Marketplace has a hard requirement on OLM. OLM can not be disabled + // while Marketplace is enabled. + ClusterVersionCapabilityMarketplace ClusterVersionCapability = "marketplace" + + // ClusterVersionCapabilityConsole manages the Console operator which + // installs and maintains the web console. + ClusterVersionCapabilityConsole ClusterVersionCapability = "Console" + + // ClusterVersionCapabilityInsights manages the Insights operator which + // collects anonymized information about the cluster to generate + // recommendations for possible cluster issues. + ClusterVersionCapabilityInsights ClusterVersionCapability = "Insights" + + // ClusterVersionCapabilityStorage manages the storage operator which + // is responsible for providing cluster-wide storage defaults + // WARNING: Do not disable this capability when deployed to + // RHEV and OpenStack without reading the docs. + // These clusters heavily rely on that capability and may cause + // damage to the cluster. + ClusterVersionCapabilityStorage ClusterVersionCapability = "Storage" + + // ClusterVersionCapabilityCSISnapshot manages the csi snapshot + // controller operator which is responsible for watching the + // VolumeSnapshot CRD objects and manages the creation and deletion + // lifecycle of volume snapshots + ClusterVersionCapabilityCSISnapshot ClusterVersionCapability = "CSISnapshot" + + // ClusterVersionCapabilityNodeTuning manages the Node Tuning Operator + // which is responsible for watching the Tuned and Profile CRD + // objects and manages the containerized TuneD daemon which controls + // system level tuning of Nodes + ClusterVersionCapabilityNodeTuning ClusterVersionCapability = "NodeTuning" + + // ClusterVersionCapabilityMachineAPI manages + // machine-api-operator + // cluster-autoscaler-operator + // cluster-control-plane-machine-set-operator + // which is responsible for machines configuration and heavily + // targeted for SNO clusters. + // + // The following CRDs are disabled as well + // machines + // machineset + // controlplanemachineset + // + // WARNING: Do not disable that capability without reading + // documentation. This is important part of openshift system + // and may cause cluster damage + ClusterVersionCapabilityMachineAPI ClusterVersionCapability = "MachineAPI" + + // ClusterVersionCapabilityBuild manages the Build API which is responsible + // for watching the Build API objects and managing their lifecycle. + // The functionality is located under openshift-apiserver and openshift-controller-manager. + // + // The following resources are taken into account: + // - builds + // - buildconfigs + ClusterVersionCapabilityBuild ClusterVersionCapability = "Build" + + // ClusterVersionCapabilityDeploymentConfig manages the DeploymentConfig API + // which is responsible for watching the DeploymentConfig API and managing their lifecycle. + // The functionality is located under openshift-apiserver and openshift-controller-manager. + // + // The following resources are taken into account: + // - deploymentconfigs + ClusterVersionCapabilityDeploymentConfig ClusterVersionCapability = "DeploymentConfig" + + // ClusterVersionCapabilityImageRegistry manages the image registry which + // allows to distribute Docker images + ClusterVersionCapabilityImageRegistry ClusterVersionCapability = "ImageRegistry" + + // ClusterVersionCapabilityOperatorLifecycleManager manages the Operator Lifecycle Manager (legacy) + // which itself manages the lifecycle of operators + ClusterVersionCapabilityOperatorLifecycleManager ClusterVersionCapability = "OperatorLifecycleManager" + + // ClusterVersionCapabilityOperatorLifecycleManagerV1 manages the Operator Lifecycle Manager (v1) + // which itself manages the lifecycle of operators + ClusterVersionCapabilityOperatorLifecycleManagerV1 ClusterVersionCapability = "OperatorLifecycleManagerV1" + + // ClusterVersionCapabilityCloudCredential manages credentials for cloud providers + // in openshift cluster + ClusterVersionCapabilityCloudCredential ClusterVersionCapability = "CloudCredential" + + // ClusterVersionCapabilityIngress manages the cluster ingress operator + // which is responsible for running the ingress controllers (including OpenShift router). + // + // The following CRDs are part of the capability as well: + // IngressController + // DNSRecord + // GatewayClass + // Gateway + // HTTPRoute + // ReferenceGrant + // + // WARNING: This capability cannot be disabled on the standalone OpenShift. + ClusterVersionCapabilityIngress ClusterVersionCapability = "Ingress" + + // ClusterVersionCapabilityCloudControllerManager manages various Cloud Controller + // Managers deployed on top of OpenShift. They help you to work with cloud + // provider API and embeds cloud-specific control logic. + ClusterVersionCapabilityCloudControllerManager ClusterVersionCapability = "CloudControllerManager" +) + +// KnownClusterVersionCapabilities includes all known optional, core cluster components. +var KnownClusterVersionCapabilities = []ClusterVersionCapability{ + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityOperatorLifecycleManagerV1, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, +} + +// ClusterVersionCapabilitySet defines sets of cluster version capabilities. +// +kubebuilder:validation:Enum=None;v4.11;v4.12;v4.13;v4.14;v4.15;v4.16;v4.17;v4.18;vCurrent +type ClusterVersionCapabilitySet string + +const ( + // ClusterVersionCapabilitySetNone is an empty set enabling + // no optional capabilities. + ClusterVersionCapabilitySetNone ClusterVersionCapabilitySet = "None" + + // ClusterVersionCapabilitySet4_11 is the recommended set of + // optional capabilities to enable for the 4.11 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_11 ClusterVersionCapabilitySet = "v4.11" + + // ClusterVersionCapabilitySet4_12 is the recommended set of + // optional capabilities to enable for the 4.12 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_12 ClusterVersionCapabilitySet = "v4.12" + + // ClusterVersionCapabilitySet4_13 is the recommended set of + // optional capabilities to enable for the 4.13 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_13 ClusterVersionCapabilitySet = "v4.13" + + // ClusterVersionCapabilitySet4_14 is the recommended set of + // optional capabilities to enable for the 4.14 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_14 ClusterVersionCapabilitySet = "v4.14" + + // ClusterVersionCapabilitySet4_15 is the recommended set of + // optional capabilities to enable for the 4.15 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_15 ClusterVersionCapabilitySet = "v4.15" + + // ClusterVersionCapabilitySet4_16 is the recommended set of + // optional capabilities to enable for the 4.16 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_16 ClusterVersionCapabilitySet = "v4.16" + + // ClusterVersionCapabilitySet4_17 is the recommended set of + // optional capabilities to enable for the 4.17 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_17 ClusterVersionCapabilitySet = "v4.17" + + // ClusterVersionCapabilitySet4_18 is the recommended set of + // optional capabilities to enable for the 4.18 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_18 ClusterVersionCapabilitySet = "v4.18" + + // ClusterVersionCapabilitySetCurrent is the recommended set + // of optional capabilities to enable for the cluster's + // current version of OpenShift. + ClusterVersionCapabilitySetCurrent ClusterVersionCapabilitySet = "vCurrent" +) + +// ClusterVersionCapabilitySets defines sets of cluster version capabilities. +var ClusterVersionCapabilitySets = map[ClusterVersionCapabilitySet][]ClusterVersionCapability{ + ClusterVersionCapabilitySetNone: {}, + ClusterVersionCapabilitySet4_11: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityMachineAPI, + }, + ClusterVersionCapabilitySet4_12: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityMachineAPI, + }, + ClusterVersionCapabilitySet4_13: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + }, + ClusterVersionCapabilitySet4_14: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + }, + ClusterVersionCapabilitySet4_15: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityCloudCredential, + }, + ClusterVersionCapabilitySet4_16: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, + ClusterVersionCapabilitySet4_17: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, + ClusterVersionCapabilitySet4_18: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityOperatorLifecycleManagerV1, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, + ClusterVersionCapabilitySetCurrent: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + ClusterVersionCapabilityMachineAPI, + ClusterVersionCapabilityBuild, + ClusterVersionCapabilityDeploymentConfig, + ClusterVersionCapabilityImageRegistry, + ClusterVersionCapabilityOperatorLifecycleManager, + ClusterVersionCapabilityOperatorLifecycleManagerV1, + ClusterVersionCapabilityCloudCredential, + ClusterVersionCapabilityIngress, + ClusterVersionCapabilityCloudControllerManager, + }, +} + +// ClusterVersionCapabilitiesSpec selects the managed set of +// optional, core cluster components. +// +k8s:deepcopy-gen=true +type ClusterVersionCapabilitiesSpec struct { + // baselineCapabilitySet selects an initial set of + // optional capabilities to enable, which can be extended via + // additionalEnabledCapabilities. If unset, the cluster will + // choose a default, and the default may change over time. + // The current default is vCurrent. + // +optional + BaselineCapabilitySet ClusterVersionCapabilitySet `json:"baselineCapabilitySet,omitempty"` + + // additionalEnabledCapabilities extends the set of managed + // capabilities beyond the baseline defined in + // baselineCapabilitySet. The default is an empty set. + // +listType=atomic + // +optional + AdditionalEnabledCapabilities []ClusterVersionCapability `json:"additionalEnabledCapabilities,omitempty"` +} + +// ClusterVersionCapabilitiesStatus describes the state of optional, +// core cluster components. +// +k8s:deepcopy-gen=true +type ClusterVersionCapabilitiesStatus struct { + // enabledCapabilities lists all the capabilities that are currently managed. + // +listType=atomic + // +optional + EnabledCapabilities []ClusterVersionCapability `json:"enabledCapabilities,omitempty"` + + // knownCapabilities lists all the capabilities known to the current cluster. + // +listType=atomic + // +optional + KnownCapabilities []ClusterVersionCapability `json:"knownCapabilities,omitempty"` +} + // ComponentOverride allows overriding cluster version operator's behavior // for a component. // +k8s:deepcopy-gen=true type ComponentOverride struct { // kind indentifies which object to override. - // +kubebuilder:validation:Required // +required Kind string `json:"kind"` // group identifies the API group that the kind is in. - // +kubebuilder:validation:Required // +required Group string `json:"group"` // namespace is the component's namespace. If the resource is cluster // scoped, the namespace should be empty. - // +kubebuilder:validation:Required // +required Namespace string `json:"namespace"` // name is the component's name. - // +kubebuilder:validation:Required // +required Name string `json:"name"` // unmanaged controls if cluster version operator should stop managing the // resources in this cluster. // Default: false - // +kubebuilder:validation:Required // +required Unmanaged bool `json:"unmanaged"` } @@ -222,30 +688,48 @@ type ComponentOverride struct { type URL string // Update represents an administrator update request. +// +kubebuilder:validation:XValidation:rule="has(self.architecture) && has(self.image) ? (self.architecture == \"\" || self.image == \"\") : true",message="cannot set both Architecture and Image" +// +kubebuilder:validation:XValidation:rule="has(self.architecture) && self.architecture != \"\" ? self.version != \"\" : true",message="Version must be set if Architecture is set" // +k8s:deepcopy-gen=true type Update struct { - // version is a semantic versioning identifying the update version. When this - // field is part of spec, version is optional if image is specified. + // architecture is an optional field that indicates the desired + // value of the cluster architecture. In this context cluster + // architecture means either a single architecture or a multi + // architecture. architecture can only be set to Multi thereby + // only allowing updates from single to multi architecture. If + // architecture is set, image cannot be set and version must be + // set. + // Valid values are 'Multi' and empty. + // + // +optional + Architecture ClusterVersionArchitecture `json:"architecture"` + + // version is a semantic version identifying the update version. + // version is required if architecture is specified. + // If both version and image are set, the version extracted from the referenced image must match the specified version. // // +optional Version string `json:"version"` - // image is a container image location that contains the update. When this - // field is part of spec, image is optional if version is specified and the - // availableUpdates field contains a matching version. + + // image is a container image location that contains the update. + // image should be used when the desired version does not exist in availableUpdates or history. + // When image is set, architecture cannot be specified. + // If both version and image are set, the version extracted from the referenced image must match the specified version. // // +optional Image string `json:"image"` + // force allows an administrator to update to an image that has failed - // verification, does not appear in the availableUpdates list, or otherwise - // would be blocked by normal protections on update. This option should only - // be used when the authenticity of the provided image has been verified out - // of band because the provided image will run with full administrative access + // verification or upgradeable checks that are designed to keep your + // cluster safe. Only use this if: + // * you are testing unsigned release images in short-lived test clusters or + // * you are working around a known bug in the cluster-version + // operator and you have verified the authenticity of the provided + // image yourself. + // The provided image will run with full administrative access // to the cluster. Do not use this flag with images that comes from unknown // or potentially malicious sources. // - // This flag does not override other forms of consistency checking that are - // required before a new update is deployed. - // // +optional Force bool `json:"force"` } @@ -253,7 +737,17 @@ type Update struct { // Release represents an OpenShift release image and associated metadata. // +k8s:deepcopy-gen=true type Release struct { - // version is a semantic versioning identifying the update version. When this + // architecture is an optional field that indicates the + // value of the cluster architecture. In this context cluster + // architecture means either a single architecture or a multi + // architecture. + // Valid values are 'Multi' and empty. + // + // +openshift:enable:FeatureGate=ImageStreamImportMode + // +optional + Architecture ClusterVersionArchitecture `json:"architecture,omitempty"` + + // version is a semantic version identifying the update version. When this // field is part of spec, version is optional if image is specified. // +required Version string `json:"version"` @@ -274,6 +768,7 @@ type Release struct { // channels is the set of Cincinnati channels to which the release // currently belongs. + // +listType=set // +optional Channels []string `json:"channels,omitempty"` } @@ -284,11 +779,136 @@ type Release struct { // availableUpdates field is accurate and recent. const RetrievedUpdates ClusterStatusConditionType = "RetrievedUpdates" +// ConditionalUpdate represents an update which is recommended to some +// clusters on the version the current cluster is reconciling, but which +// may not be recommended for the current cluster. +type ConditionalUpdate struct { + // release is the target of the update. + // +required + Release Release `json:"release"` + + // risks represents the range of issues associated with + // updating to the target release. The cluster-version + // operator will evaluate all entries, and only recommend the + // update if there is at least one entry and all entries + // recommend the update. + // +kubebuilder:validation:MinItems=1 + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +required + Risks []ConditionalUpdateRisk `json:"risks" patchStrategy:"merge" patchMergeKey:"name"` + + // conditions represents the observations of the conditional update's + // current status. Known types are: + // * Recommended, for whether the update is recommended for the current cluster. + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// ConditionalUpdateRisk represents a reason and cluster-state +// for not recommending a conditional update. +// +k8s:deepcopy-gen=true +type ConditionalUpdateRisk struct { + // url contains information about this risk. + // +kubebuilder:validation:Format=uri + // +kubebuilder:validation:MinLength=1 + // +required + URL string `json:"url"` + + // name is the CamelCase reason for not recommending a + // conditional update, in the event that matchingRules match the + // cluster state. + // +kubebuilder:validation:MinLength=1 + // +required + Name string `json:"name"` + + // message provides additional information about the risk of + // updating, in the event that matchingRules match the cluster + // state. This is only to be consumed by humans. It may + // contain Line Feed characters (U+000A), which should be + // rendered as new lines. + // +kubebuilder:validation:MinLength=1 + // +required + Message string `json:"message"` + + // matchingRules is a slice of conditions for deciding which + // clusters match the risk and which do not. The slice is + // ordered by decreasing precedence. The cluster-version + // operator will walk the slice in order, and stop after the + // first it can successfully evaluate. If no condition can be + // successfully evaluated, the update will not be recommended. + // +kubebuilder:validation:MinItems=1 + // +listType=atomic + // +required + MatchingRules []ClusterCondition `json:"matchingRules"` +} + +// ClusterCondition is a union of typed cluster conditions. The 'type' +// property determines which of the type-specific properties are relevant. +// When evaluated on a cluster, the condition may match, not match, or +// fail to evaluate. +// +k8s:deepcopy-gen=true +type ClusterCondition struct { + // type represents the cluster-condition type. This defines + // the members and semantics of any additional properties. + // +kubebuilder:validation:Enum={"Always","PromQL"} + // +required + Type string `json:"type"` + + // promql represents a cluster condition based on PromQL. + // +optional + PromQL *PromQLClusterCondition `json:"promql,omitempty"` +} + +// PromQLClusterCondition represents a cluster condition based on PromQL. +type PromQLClusterCondition struct { + // promql is a PromQL query classifying clusters. This query + // query should return a 1 in the match case and a 0 in the + // does-not-match case. Queries which return no time + // series, or which return values besides 0 or 1, are + // evaluation failures. + // +required + PromQL string `json:"promql"` +} + // ClusterVersionList is a list of ClusterVersion resources. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 type ClusterVersionList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []ClusterVersion `json:"items"` } + +// SignatureStore represents the URL of custom Signature Store +type SignatureStore struct { + + // url contains the upstream custom signature store URL. + // url should be a valid absolute http/https URI of an upstream signature store as per rfc1738. + // This must be provided and cannot be empty. + // + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="url must be a valid absolute URL" + // +required + URL string `json:"url"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the signature store is not honored. + // If the specified ca data is not valid, the signature store is not honored. + // If empty, we fall back to the CA configured via Proxy, which is appended to the default system roots. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_console.go b/vendor/github.com/openshift/api/config/v1/types_console.go index d64219300d..dc6967bf15 100644 --- a/vendor/github.com/openshift/api/config/v1/types_console.go +++ b/vendor/github.com/openshift/api/config/v1/types_console.go @@ -11,12 +11,23 @@ import ( // Console holds cluster-wide configuration for the web console, including the // logout URL, and reports the public URL of the console. The canonical name is // `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=consoles,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Console struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec ConsoleSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -34,13 +45,19 @@ type ConsoleSpec struct { type ConsoleStatus struct { // The URL for the console. This will be derived from the host for the route that // is created for the console. + // +optional ConsoleURL string `json:"consoleURL"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ConsoleList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Console `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_dns.go b/vendor/github.com/openshift/api/config/v1/types_dns.go index 989ef99c3c..06eb75ccf7 100644 --- a/vendor/github.com/openshift/api/config/v1/types_dns.go +++ b/vendor/github.com/openshift/api/config/v1/types_dns.go @@ -7,12 +7,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // DNS holds cluster-wide information about DNS. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=dnses,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type DNS struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec DNSSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -47,6 +58,12 @@ type DNSSpec struct { // // +optional PrivateZone *DNSZone `json:"privateZone,omitempty"` + // platform holds configuration specific to the underlying + // infrastructure provider for DNS. + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // +optional + Platform DNSPlatformSpec `json:"platform,omitempty"` } // DNSZone is used to define a DNS hosted zone. @@ -79,9 +96,45 @@ type DNSStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type DNSList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []DNS `json:"items"` } + +// DNSPlatformSpec holds cloud-provider-specific configuration +// for DNS administration. +// +union +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'AWS' ? has(self.aws) : !has(self.aws)",message="aws configuration is required when platform is AWS, and forbidden otherwise" +type DNSPlatformSpec struct { + // type is the underlying infrastructure provider for the cluster. + // Allowed values: "", "AWS". + // + // Individual components may not support all platforms, + // and must handle unrecognized platforms with best-effort defaults. + // + // +unionDiscriminator + // +required + // +kubebuilder:validation:XValidation:rule="self in ['','AWS']",message="allowed values are '' and 'AWS'" + Type PlatformType `json:"type"` + + // aws contains DNS configuration specific to the Amazon Web Services cloud provider. + // +optional + AWS *AWSDNSSpec `json:"aws"` +} + +// AWSDNSSpec contains DNS configuration specific to the Amazon Web Services cloud provider. +type AWSDNSSpec struct { + // privateZoneIAMRole contains the ARN of an IAM role that should be assumed when performing + // operations on the cluster's private hosted zone specified in the cluster DNS config. + // When left empty, no role should be assumed. + // +kubebuilder:validation:Pattern:=`^arn:(aws|aws-cn|aws-us-gov):iam::[0-9]{12}:role\/.*$` + // +optional + PrivateZoneIAMRole string `json:"privateZoneIAMRole"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_feature.go b/vendor/github.com/openshift/api/config/v1/types_feature.go index b083e6d1f6..169e29c5c5 100644 --- a/vendor/github.com/openshift/api/config/v1/types_feature.go +++ b/vendor/github.com/openshift/api/config/v1/types_feature.go @@ -1,19 +1,33 @@ package v1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Feature holds cluster-wide information about feature gates. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=featuregates,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type FeatureGate struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required + // +kubebuilder:validation:XValidation:rule="has(oldSelf.featureSet) ? has(self.featureSet) : true",message=".spec.featureSet cannot be removed" Spec FeatureGateSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. // +optional @@ -30,16 +44,17 @@ var ( // this feature set on CANNOT BE UNDONE and PREVENTS UPGRADES. TechPreviewNoUpgrade FeatureSet = "TechPreviewNoUpgrade" + // DevPreviewNoUpgrade turns on dev preview features that are not part of the normal supported platform. Turning + // this feature set on CANNOT BE UNDONE and PREVENTS UPGRADES. + DevPreviewNoUpgrade FeatureSet = "DevPreviewNoUpgrade" + // CustomNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. // Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations // your cluster may fail in an unrecoverable way. CustomNoUpgrade FeatureSet = "CustomNoUpgrade" - // TopologyManager enables ToplogyManager support. Upgrades are enabled with this feature. - LatencySensitive FeatureSet = "LatencySensitive" - - // IPv6DualStackNoUpgrade enables dual-stack. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. - IPv6DualStackNoUpgrade FeatureSet = "IPv6DualStackNoUpgrade" + // AllFixedFeatureSets are the featuresets that have known featuregates. Custom doesn't for instance. LatencySensitive is dead + AllFixedFeatureSets = []FeatureSet{Default, TechPreviewNoUpgrade, DevPreviewNoUpgrade} ) type FeatureGateSpec struct { @@ -52,6 +67,10 @@ type FeatureGateSelection struct { // Turning on or off features may cause irreversible changes in your cluster which cannot be undone. // +unionDiscriminator // +optional + // +kubebuilder:validation:Enum=CustomNoUpgrade;DevPreviewNoUpgrade;TechPreviewNoUpgrade;"" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'CustomNoUpgrade' ? self == 'CustomNoUpgrade' : true",message="CustomNoUpgrade may not be changed" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'TechPreviewNoUpgrade' ? self == 'TechPreviewNoUpgrade' : true",message="TechPreviewNoUpgrade may not be changed" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'DevPreviewNoUpgrade' ? self == 'DevPreviewNoUpgrade' : true",message="DevPreviewNoUpgrade may not be changed" FeatureSet FeatureSet `json:"featureSet,omitempty"` // customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. @@ -65,144 +84,70 @@ type FeatureGateSelection struct { type CustomFeatureGates struct { // enabled is a list of all feature gates that you want to force on // +optional - Enabled []string `json:"enabled,omitempty"` + Enabled []FeatureGateName `json:"enabled,omitempty"` // disabled is a list of all feature gates that you want to force off // +optional - Disabled []string `json:"disabled,omitempty"` + Disabled []FeatureGateName `json:"disabled,omitempty"` } -type FeatureGateStatus struct { -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// FeatureGateName is a string to enforce patterns on the name of a FeatureGate +// +kubebuilder:validation:Pattern=`^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$` +type FeatureGateName string -type FeatureGateList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` - - Items []FeatureGate `json:"items"` -} - -type FeatureGateEnabledDisabled struct { - Enabled []string - Disabled []string -} - -// FeatureSets Contains a map of Feature names to Enabled/Disabled Feature. -// -// NOTE: The caller needs to make sure to check for the existence of the value -// using golang's existence field. A possible scenario is an upgrade where new -// FeatureSets are added and a controller has not been upgraded with a newer -// version of this file. In this upgrade scenario the map could return nil. -// -// example: -// if featureSet, ok := FeatureSets["SomeNewFeature"]; ok { } -// -// If you put an item in either of these lists, put your area and name on it so we can find owners. -var FeatureSets = map[FeatureSet]*FeatureGateEnabledDisabled{ - Default: defaultFeatures, - CustomNoUpgrade: { - Enabled: []string{}, - Disabled: []string{}, - }, - TechPreviewNoUpgrade: newDefaultFeatures(). - with("CSIDriverAzureDisk"). // sig-storage, jsafrane, OCP specific - with("CSIDriverVSphere"). // sig-storage, jsafrane, OCP specific - with("CSIMigrationAWS"). // sig-storage, jsafrane, Kubernetes feature gate - with("CSIMigrationOpenStack"). // sig-storage, jsafrane, Kubernetes feature gate - toFeatures(), - LatencySensitive: newDefaultFeatures(). - with( - "TopologyManager", // sig-pod, sjenning - ). - toFeatures(), - IPv6DualStackNoUpgrade: newDefaultFeatures(). - with( - "IPv6DualStack", // sig-network, danwinship - ). - toFeatures(), -} - -var defaultFeatures = &FeatureGateEnabledDisabled{ - Enabled: []string{ - "APIPriorityAndFairness", // sig-apimachinery, deads2k - "RotateKubeletServerCertificate", // sig-pod, sjenning - "SupportPodPidsLimit", // sig-pod, sjenning - "NodeDisruptionExclusion", // sig-scheduling, ccoleman - "ServiceNodeExclusion", // sig-scheduling, ccoleman - "DownwardAPIHugePages", // sig-node, rphillips - }, - Disabled: []string{ - "LegacyNodeRoleBehavior", // sig-scheduling, ccoleman - }, +type FeatureGateStatus struct { + // conditions represent the observations of the current state. + // Known .status.conditions.type are: "DeterminationDegraded" + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` + + // featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. + // Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate + // the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. + // The enabled/disabled values for a particular version may change during the life of the cluster as various + // .spec.featureSet values are selected. + // Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable + // lists is beyond the scope of this API and is the responsibility of individual operators. + // Only featureGates with .version in the ClusterVersion.status will be present in this list. + // +listType=map + // +listMapKey=version + // +optional + FeatureGates []FeatureGateDetails `json:"featureGates"` } -type featureSetBuilder struct { - forceOn []string - forceOff []string +type FeatureGateDetails struct { + // version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field. + // +required + Version string `json:"version"` + // enabled is a list of all feature gates that are enabled in the cluster for the named version. + // +optional + Enabled []FeatureGateAttributes `json:"enabled"` + // disabled is a list of all feature gates that are disabled in the cluster for the named version. + // +optional + Disabled []FeatureGateAttributes `json:"disabled"` } -func newDefaultFeatures() *featureSetBuilder { - return &featureSetBuilder{} -} +type FeatureGateAttributes struct { + // name is the name of the FeatureGate. + // +required + Name FeatureGateName `json:"name"` -func (f *featureSetBuilder) with(forceOn ...string) *featureSetBuilder { - f.forceOn = append(f.forceOn, forceOn...) - return f + // possible (probable?) future additions include + // 1. support level (Stable, ServiceDeliveryOnly, TechPreview, DevPreview) + // 2. description } -func (f *featureSetBuilder) without(forceOff ...string) *featureSetBuilder { - f.forceOff = append(f.forceOff, forceOff...) - return f -} +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -func (f *featureSetBuilder) isForcedOff(needle string) bool { - for _, forcedOff := range f.forceOff { - if needle == forcedOff { - return true - } - } - return false -} +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type FeatureGateList struct { + metav1.TypeMeta `json:",inline"` -func (f *featureSetBuilder) isForcedOn(needle string) bool { - for _, forceOn := range f.forceOn { - if needle == forceOn { - return true - } - } - return false -} + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` -func (f *featureSetBuilder) toFeatures() *FeatureGateEnabledDisabled { - finalOn := []string{} - finalOff := []string{} - - // only add the default enabled features if they haven't been explicitly set off - for _, defaultOn := range defaultFeatures.Enabled { - if !f.isForcedOff(defaultOn) { - finalOn = append(finalOn, defaultOn) - } - } - for _, currOn := range f.forceOn { - if f.isForcedOff(currOn) { - panic("coding error, you can't have features both on and off") - } - finalOn = append(finalOn, currOn) - } - - // only add the default disabled features if they haven't been explicitly set on - for _, defaultOff := range defaultFeatures.Disabled { - if !f.isForcedOn(defaultOff) { - finalOff = append(finalOff, defaultOff) - } - } - for _, currOff := range f.forceOff { - finalOff = append(finalOff, currOff) - } - - return &FeatureGateEnabledDisabled{ - Enabled: finalOn, - Disabled: finalOff, - } + Items []FeatureGate `json:"items"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_image.go b/vendor/github.com/openshift/api/config/v1/types_image.go index 8b762a5a69..82f46c8b6c 100644 --- a/vendor/github.com/openshift/api/config/v1/types_image.go +++ b/vendor/github.com/openshift/api/config/v1/types_image.go @@ -12,12 +12,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // registries, and policies to block or allow registry hostnames. // When exposing OpenShift's image registry to the public, this also lets cluster // admins specify the external hostname. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=images,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Image struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec ImageSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -25,6 +36,23 @@ type Image struct { Status ImageStatus `json:"status"` } +// ImportModeType describes how to import an image manifest. +// +enum +// +kubebuilder:validation:Enum:="";Legacy;PreserveOriginal +type ImportModeType string + +const ( + // ImportModeLegacy indicates that the legacy behaviour should be used. + // For manifest lists, the legacy behaviour will discard the manifest list and import a single + // sub-manifest. In this case, the platform is chosen in the following order of priority: + // 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. + // This mode is the default. + ImportModeLegacy ImportModeType = "Legacy" + // ImportModePreserveOriginal indicates that the original manifest will be preserved. + // For manifest lists, the manifest list and all its sub-manifests will be imported. + ImportModePreserveOriginal ImportModeType = "PreserveOriginal" +) + type ImageSpec struct { // allowedRegistriesForImport limits the container image registries that normal users may import // images from. Set this list to the registries that you trust to contain valid Docker @@ -33,6 +61,7 @@ type ImageSpec struct { // this policy - typically only administrators or system integrations will have those // permissions. // +optional + // +listType=atomic AllowedRegistriesForImport []RegistryLocation `json:"allowedRegistriesForImport,omitempty"` // externalRegistryHostnames provides the hostnames for the default external image @@ -40,6 +69,7 @@ type ImageSpec struct { // is exposed externally. The first value is used in 'publicDockerImageRepository' // field in ImageStreams. The value must be in "hostname[:port]" format. // +optional + // +listType=atomic ExternalRegistryHostnames []string `json:"externalRegistryHostnames,omitempty"` // additionalTrustedCA is a reference to a ConfigMap containing additional CAs that @@ -55,15 +85,28 @@ type ImageSpec struct { // internal cluster registry. // +optional RegistrySources RegistrySources `json:"registrySources"` + + // imageStreamImportMode controls the import mode behaviour of imagestreams. + // It can be set to `Legacy` or `PreserveOriginal` or the empty string. If this value + // is specified, this setting is applied to all newly created imagestreams which do not have the + // value set. `Legacy` indicates that the legacy behaviour should be used. + // For manifest lists, the legacy behaviour will discard the manifest list and import a single + // sub-manifest. In this case, the platform is chosen in the following order of priority: + // 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. + // `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, + // the manifest list and all its sub-manifests will be imported. When empty, the behaviour will be + // decided based on the payload type advertised by the ClusterVersion status, i.e single arch payload + // implies the import mode is Legacy and multi payload implies PreserveOriginal. + // +openshift:enable:FeatureGate=ImageStreamImportMode + // +optional + ImageStreamImportMode ImportModeType `json:"imageStreamImportMode"` } type ImageStatus struct { - // internalRegistryHostname sets the hostname for the default internal image // registry. The value must be in "hostname[:port]" format. // This value is set by the image registry operator which controls the internal registry - // hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY - // environment variable but this setting overrides the environment variable. + // hostname. // +optional InternalRegistryHostname string `json:"internalRegistryHostname,omitempty"` @@ -72,13 +115,33 @@ type ImageStatus struct { // is exposed externally. The first value is used in 'publicDockerImageRepository' // field in ImageStreams. The value must be in "hostname[:port]" format. // +optional + // +listType=atomic ExternalRegistryHostnames []string `json:"externalRegistryHostnames,omitempty"` + + // imageStreamImportMode controls the import mode behaviour of imagestreams. It can be + // `Legacy` or `PreserveOriginal`. `Legacy` indicates that the legacy behaviour should be used. + // For manifest lists, the legacy behaviour will discard the manifest list and import a single + // sub-manifest. In this case, the platform is chosen in the following order of priority: + // 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. + // `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, + // the manifest list and all its sub-manifests will be imported. This value will be reconciled based + // on either the spec value or if no spec value is specified, the image registry operator would look + // at the ClusterVersion status to determine the payload type and set the import mode accordingly, + // i.e single arch payload implies the import mode is Legacy and multi payload implies PreserveOriginal. + // +openshift:enable:FeatureGate=ImageStreamImportMode + // +optional + ImageStreamImportMode ImportModeType `json:"imageStreamImportMode,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ImageList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Image `json:"items"` @@ -98,19 +161,24 @@ type RegistryLocation struct { } // RegistrySources holds cluster-wide information about how to handle the registries config. +// +// +kubebuilder:validation:XValidation:rule="has(self.blockedRegistries) ? !has(self.allowedRegistries) : true",message="Only one of blockedRegistries or allowedRegistries may be set" type RegistrySources struct { // insecureRegistries are registries which do not have a valid TLS certificates or only support HTTP connections. // +optional + // +listType=atomic InsecureRegistries []string `json:"insecureRegistries,omitempty"` // blockedRegistries cannot be used for image pull and push actions. All other registries are permitted. // // Only one of BlockedRegistries or AllowedRegistries may be set. // +optional + // +listType=atomic BlockedRegistries []string `json:"blockedRegistries,omitempty"` // allowedRegistries are the only registries permitted for image pull and push actions. All other registries are denied. // // Only one of BlockedRegistries or AllowedRegistries may be set. // +optional + // +listType=atomic AllowedRegistries []string `json:"allowedRegistries,omitempty"` // containerRuntimeSearchRegistries are registries that will be searched when pulling images that do not have fully qualified // domains in their pull specs. Registries will be searched in the order provided in the list. diff --git a/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go b/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go new file mode 100644 index 0000000000..0bd0d77705 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go @@ -0,0 +1,99 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/874 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagecontentpolicies,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type ImageContentPolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec ImageContentPolicySpec `json:"spec"` +} + +// ImageContentPolicySpec is the specification of the ImageContentPolicy CRD. +type ImageContentPolicySpec struct { + // repositoryDigestMirrors allows images referenced by image digests in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in RepositoryDigestMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To pull image from mirrors by tags, should set the "allowMirrorByTags". + // + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // +optional + // +listType=map + // +listMapKey=source + RepositoryDigestMirrors []RepositoryDigestMirrors `json:"repositoryDigestMirrors"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageContentPolicyList lists the items in the ImageContentPolicy CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageContentPolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageContentPolicy `json:"items"` +} + +// RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type RepositoryDigestMirrors struct { + // source is the repository that users refer to, e.g. in image pull specifications. + // +required + // +kubebuilder:validation:Pattern=`^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$` + Source string `json:"source"` + // allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. + // Pulling images by tag can potentially yield different images, depending on which endpoint + // we pull from. Forcing digest-pulls for mirrors avoids that issue. + // +optional + AllowMirrorByTags bool `json:"allowMirrorByTags,omitempty"` + // mirrors is zero or more repositories that may also contain the same images. + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. No mirror will be configured. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. Other cluster configuration, + // including (but not limited to) other repositoryDigestMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // +optional + // +listType=set + Mirrors []Mirror `json:"mirrors,omitempty"` +} + +// +kubebuilder:validation:Pattern=`^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$` +type Mirror string diff --git a/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go b/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go new file mode 100644 index 0000000000..df2258d12f --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go @@ -0,0 +1,141 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/1126 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagedigestmirrorsets,scope=Cluster,shortName=idms +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type ImageDigestMirrorSet struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec ImageDigestMirrorSetSpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImageDigestMirrorSetStatus `json:"status,omitempty"` +} + +// ImageDigestMirrorSetSpec is the specification of the ImageDigestMirrorSet CRD. +type ImageDigestMirrorSetSpec struct { + // imageDigestMirrors allows images referenced by image digests in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in imageDigestMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To use mirrors to pull images using tag specification, users should configure + // a list of mirrors using "ImageTagMirrorSet" CRD. + // + // If the image pull specification matches the repository of "source" in multiple imagedigestmirrorset objects, + // only the objects which define the most specific namespace match will be used. + // For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as + // the "source", only the objects using quay.io/libpod/busybox are going to apply + // for pull specification quay.io/libpod/busybox. + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order. + // +optional + // +listType=atomic + ImageDigestMirrors []ImageDigestMirrors `json:"imageDigestMirrors"` +} + +type ImageDigestMirrorSetStatus struct{} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageDigestMirrorSetList lists the items in the ImageDigestMirrorSet CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageDigestMirrorSetList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageDigestMirrorSet `json:"items"` +} + +// +kubebuilder:validation:Pattern=`^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` +type ImageMirror string + +// MirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. +// +kubebuilder:validation:Enum=NeverContactSource;AllowContactingSource +type MirrorSourcePolicy string + +const ( + // NeverContactSource prevents image pull from the specified repository in the pull spec if the image pull from the mirror list fails. + NeverContactSource MirrorSourcePolicy = "NeverContactSource" + + // AllowContactingSource allows falling back to the specified repository in the pull spec if the image pull from the mirror list fails. + AllowContactingSource MirrorSourcePolicy = "AllowContactingSource" +) + +// ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type ImageDigestMirrors struct { + // source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname + // e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. + // "source" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // [*.]host + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +required + // +kubebuilder:validation:Pattern=`^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` + Source string `json:"source"` + // mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. + // Images can be pulled from these mirrors only if they are referenced by their digests. + // The mirrored location is obtained by replacing the part of the input reference that + // matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, + // a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo + // repository to be used. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. + // If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be + // pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy" + // Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // "mirrors" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +optional + // +listType=set + Mirrors []ImageMirror `json:"mirrors,omitempty"` + // mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. + // If unset, the image will continue to be pulled from the the repository in the pull spec. + // sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + // +optional + MirrorSourcePolicy MirrorSourcePolicy `json:"mirrorSourcePolicy,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_image_policy.go b/vendor/github.com/openshift/api/config/v1/types_image_policy.go new file mode 100644 index 0000000000..54bd21adb4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_policy.go @@ -0,0 +1,322 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImagePolicy holds namespace-wide configuration for image signature verification +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagepolicies,scope=Namespaced +// +kubebuilder:subresource:status +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2310 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +openshift:enable:FeatureGate=SigstoreImageVerification +// +openshift:compatibility-gen:level=1 +type ImagePolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata"` + + // spec holds user settable values for configuration + // +required + Spec ImagePolicySpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImagePolicyStatus `json:"status"` +} + +// ImagePolicySpec is the specification of the ImagePolicy CRD. +type ImagePolicySpec struct { + // scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the "Docker Registry HTTP API V2". + // Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). + // More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository + // namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). + // Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. + // This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. + // In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories + // quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. + // If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. + // For additional details about the format, please refer to the document explaining the docker transport field, + // which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker + // +required + // +kubebuilder:validation:MaxItems=256 + // +listType=set + Scopes []ImageScope `json:"scopes"` + // policy is a required field that contains configuration to allow scopes to be verified, and defines how + // images not matching the verification policy will be treated. + // +required + Policy Policy `json:"policy"` +} + +// +kubebuilder:validation:XValidation:rule="size(self.split('/')[0].split('.')) == 1 ? self.split('/')[0].split('.')[0].split(':')[0] == 'localhost' : true",message="invalid image scope format, scope must contain a fully qualified domain name or 'localhost'" +// +kubebuilder:validation:XValidation:rule=`self.contains('*') ? self.matches('^\\*(?:\\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$') : true`,message="invalid image scope with wildcard, a wildcard can only be at the start of the domain and is only supported for subdomain matching, not path matching" +// +kubebuilder:validation:XValidation:rule=`!self.contains('*') ? self.matches('^((((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+(?::[0-9]+)?)|(localhost(?::[0-9]+)?))(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?)(?::([\\w][\\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$') : true`,message="invalid repository namespace or image specification in the image scope" +// +kubebuilder:validation:MaxLength=512 +type ImageScope string + +// Policy defines the verification policy for the items in the scopes list. +type Policy struct { + // rootOfTrust is a required field that defines the root of trust for verifying image signatures during retrieval. + // This allows image consumers to specify policyType and corresponding configuration of the policy, matching how the policy was generated. + // +required + RootOfTrust PolicyRootOfTrust `json:"rootOfTrust"` + // signedIdentity is an optional field specifies what image identity the signature claims about the image. This is useful when the image identity in the signature differs from the original image spec, such as when mirror registry is configured for the image scope, the signature from the mirror registry contains the image identity of the mirror instead of the original scope. + // The required matchPolicy field specifies the approach used in the verification process to verify the identity in the signature and the actual image identity, the default matchPolicy is "MatchRepoDigestOrExact". + // +optional + SignedIdentity *PolicyIdentity `json:"signedIdentity,omitempty"` +} + +// PolicyRootOfTrust defines the root of trust based on the selected policyType. +// +union +// +kubebuilder:validation:XValidation:rule="has(self.policyType) && self.policyType == 'PublicKey' ? has(self.publicKey) : !has(self.publicKey)",message="publicKey is required when policyType is PublicKey, and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="has(self.policyType) && self.policyType == 'FulcioCAWithRekor' ? has(self.fulcioCAWithRekor) : !has(self.fulcioCAWithRekor)",message="fulcioCAWithRekor is required when policyType is FulcioCAWithRekor, and forbidden otherwise" +// +openshift:validation:FeatureGateAwareXValidation:featureGate=SigstoreImageVerificationPKI,rule="has(self.policyType) && self.policyType == 'PKI' ? has(self.pki) : !has(self.pki)",message="pki is required when policyType is PKI, and forbidden otherwise" +type PolicyRootOfTrust struct { + // policyType is a required field specifies the type of the policy for verification. This field must correspond to how the policy was generated. + // Allowed values are "PublicKey", "FulcioCAWithRekor", and "PKI". + // When set to "PublicKey", the policy relies on a sigstore publicKey and may optionally use a Rekor verification. + // When set to "FulcioCAWithRekor", the policy is based on the Fulcio certification and incorporates a Rekor verification. + // When set to "PKI", the policy is based on the certificates from Bring Your Own Public Key Infrastructure (BYOPKI). This value is enabled by turning on the SigstoreImageVerificationPKI feature gate. + // +unionDiscriminator + // +required + PolicyType PolicyType `json:"policyType"` + // publicKey defines the root of trust configuration based on a sigstore public key. Optionally include a Rekor public key for Rekor verification. + // publicKey is required when policyType is PublicKey, and forbidden otherwise. + // +optional + PublicKey *PublicKey `json:"publicKey,omitempty"` + // fulcioCAWithRekor defines the root of trust configuration based on the Fulcio certificate and the Rekor public key. + // fulcioCAWithRekor is required when policyType is FulcioCAWithRekor, and forbidden otherwise + // For more information about Fulcio and Rekor, please refer to the document at: + // https://github.com/sigstore/fulcio and https://github.com/sigstore/rekor + // +optional + FulcioCAWithRekor *FulcioCAWithRekor `json:"fulcioCAWithRekor,omitempty"` + // pki defines the root of trust configuration based on Bring Your Own Public Key Infrastructure (BYOPKI) Root CA(s) and corresponding intermediate certificates. + // pki is required when policyType is PKI, and forbidden otherwise. + // +optional + // +openshift:enable:FeatureGate=SigstoreImageVerificationPKI + PKI *PKI `json:"pki,omitempty"` +} + +// +openshift:validation:FeatureGateAwareEnum:featureGate="",enum=PublicKey;FulcioCAWithRekor +// +openshift:validation:FeatureGateAwareEnum:featureGate=SigstoreImageVerificationPKI,enum=PublicKey;FulcioCAWithRekor;PKI +type PolicyType string + +const ( + PublicKeyRootOfTrust PolicyType = "PublicKey" + FulcioCAWithRekorRootOfTrust PolicyType = "FulcioCAWithRekor" + PKIRootOfTrust PolicyType = "PKI" +) + +// PublicKey defines the root of trust based on a sigstore public key. +type PublicKey struct { + // keyData is a required field contains inline base64-encoded data for the PEM format public key. + // keyData must be at most 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:MinLength=68 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN PUBLIC KEY-----')",message="the keyData must start with base64 encoding of '-----BEGIN PUBLIC KEY-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END PUBLIC KEY-----\\n') || string(self).endsWith('-----END PUBLIC KEY-----')",message="the keyData must end with base64 encoding of '-----END PUBLIC KEY-----'." + KeyData []byte `json:"keyData"` + // rekorKeyData is an optional field contains inline base64-encoded data for the PEM format from the Rekor public key. + // rekorKeyData must be at most 8192 characters. + // +optional + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN PUBLIC KEY-----')",message="the rekorKeyData must start with base64 encoding of '-----BEGIN PUBLIC KEY-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END PUBLIC KEY-----\\n') || string(self).endsWith('-----END PUBLIC KEY-----')",message="the rekorKeyData must end with base64 encoding of '-----END PUBLIC KEY-----'." + RekorKeyData []byte `json:"rekorKeyData,omitempty"` +} + +// FulcioCAWithRekor defines the root of trust based on the Fulcio certificate and the Rekor public key. +type FulcioCAWithRekor struct { + // fulcioCAData is a required field contains inline base64-encoded data for the PEM format fulcio CA. + // fulcioCAData must be at most 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN CERTIFICATE-----')",message="the fulcioCAData must start with base64 encoding of '-----BEGIN CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END CERTIFICATE-----\\n') || string(self).endsWith('-----END CERTIFICATE-----')",message="the fulcioCAData must end with base64 encoding of '-----END CERTIFICATE-----'." + FulcioCAData []byte `json:"fulcioCAData"` + // rekorKeyData is a required field contains inline base64-encoded data for the PEM format from the Rekor public key. + // rekorKeyData must be at most 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN PUBLIC KEY-----')",message="the rekorKeyData must start with base64 encoding of '-----BEGIN PUBLIC KEY-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END PUBLIC KEY-----\\n') || string(self).endsWith('-----END PUBLIC KEY-----')",message="the rekorKeyData must end with base64 encoding of '-----END PUBLIC KEY-----'." + RekorKeyData []byte `json:"rekorKeyData"` + // fulcioSubject is a required field specifies OIDC issuer and the email of the Fulcio authentication configuration. + // +required + FulcioSubject PolicyFulcioSubject `json:"fulcioSubject"` +} + +// PolicyFulcioSubject defines the OIDC issuer and the email of the Fulcio authentication configuration. +type PolicyFulcioSubject struct { + // oidcIssuer is a required filed contains the expected OIDC issuer. The oidcIssuer must be a valid URL and at most 2048 characters in length. + // It will be verified that the Fulcio-issued certificate contains a (Fulcio-defined) certificate extension pointing at this OIDC issuer URL. + // When Fulcio issues certificates, it includes a value based on an URL inside the client-provided ID token. + // Example: "https://expected.OIDC.issuer/" + // +required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="oidcIssuer must be a valid URL" + OIDCIssuer string `json:"oidcIssuer"` + // signedEmail is a required field holds the email address that the Fulcio certificate is issued for. + // The signedEmail must be a valid email address and at most 320 characters in length. + // Example: "expected-signing-user@example.com" + // +required + // +kubebuilder:validation:MaxLength=320 + // +kubebuilder:validation:XValidation:rule=`self.matches('^\\S+@\\S+$')`,message="invalid email address" + SignedEmail string `json:"signedEmail"` +} + +// PKI defines the root of trust based on Root CA(s) and corresponding intermediate certificates. +type PKI struct { + // caRootsData contains base64-encoded data of a certificate bundle PEM file, which contains one or more CA roots in the PEM format. The total length of the data must not exceed 8192 characters. + // +required + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:MinLength=72 + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN CERTIFICATE-----')",message="the caRootsData must start with base64 encoding of '-----BEGIN CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END CERTIFICATE-----\\n') || string(self).endsWith('-----END CERTIFICATE-----')",message="the caRootsData must end with base64 encoding of '-----END CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).findAll('-----BEGIN CERTIFICATE-----').size() == string(self).findAll('-----END CERTIFICATE-----').size()",message="caRootsData must be base64 encoding of valid PEM format data contain the same number of '-----BEGIN CERTIFICATE-----' and '-----END CERTIFICATE-----' markers." + CertificateAuthorityRootsData []byte `json:"caRootsData"` + // caIntermediatesData contains base64-encoded data of a certificate bundle PEM file, which contains one or more intermediate certificates in the PEM format. The total length of the data must not exceed 8192 characters. + // caIntermediatesData requires caRootsData to be set. + // +optional + // +kubebuilder:validation:XValidation:rule="string(self).startsWith('-----BEGIN CERTIFICATE-----')",message="the caIntermediatesData must start with base64 encoding of '-----BEGIN CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).endsWith('-----END CERTIFICATE-----\\n') || string(self).endsWith('-----END CERTIFICATE-----')",message="the caIntermediatesData must end with base64 encoding of '-----END CERTIFICATE-----'." + // +kubebuilder:validation:XValidation:rule="string(self).findAll('-----BEGIN CERTIFICATE-----').size() == string(self).findAll('-----END CERTIFICATE-----').size()",message="caIntermediatesData must be base64 encoding of valid PEM format data contain the same number of '-----BEGIN CERTIFICATE-----' and '-----END CERTIFICATE-----' markers." + // +kubebuilder:validation:MaxLength=8192 + // +kubebuilder:validation:MinLength=72 + CertificateAuthorityIntermediatesData []byte `json:"caIntermediatesData,omitempty"` + + // pkiCertificateSubject defines the requirements imposed on the subject to which the certificate was issued. + // +required + PKICertificateSubject PKICertificateSubject `json:"pkiCertificateSubject"` +} + +// PKICertificateSubject defines the requirements imposed on the subject to which the certificate was issued. +// +kubebuilder:validation:XValidation:rule="has(self.email) || has(self.hostname)", message="at least one of email or hostname must be set in pkiCertificateSubject" +// +openshift:enable:FeatureGate=SigstoreImageVerificationPKI +type PKICertificateSubject struct { + // email specifies the expected email address imposed on the subject to which the certificate was issued, and must match the email address listed in the Subject Alternative Name (SAN) field of the certificate. + // The email must be a valid email address and at most 320 characters in length. + // +optional + // +kubebuilder:validation:MaxLength:=320 + // +kubebuilder:validation:XValidation:rule=`self.matches('^\\S+@\\S+$')`,message="invalid email address" + Email string `json:"email,omitempty"` + // hostname specifies the expected hostname imposed on the subject to which the certificate was issued, and it must match the hostname listed in the Subject Alternative Name (SAN) DNS field of the certificate. + // The hostname must be a valid dns 1123 subdomain name, optionally prefixed by '*.', and at most 253 characters in length. + // It must consist only of lowercase alphanumeric characters, hyphens, periods and the optional preceding asterisk. + // +optional + // +kubebuilder:validation:MaxLength:=253 + // +kubebuilder:validation:XValidation:rule="self.startsWith('*.') ? !format.dns1123Subdomain().validate(self.replace('*.', '', 1)).hasValue() : !format.dns1123Subdomain().validate(self).hasValue()",message="hostname must be a valid dns 1123 subdomain name, optionally prefixed by '*.'. It must consist only of lowercase alphanumeric characters, hyphens, periods and the optional preceding asterisk." + Hostname string `json:"hostname,omitempty"` +} + +// PolicyIdentity defines image identity the signature claims about the image. When omitted, the default matchPolicy is "MatchRepoDigestOrExact". +// +kubebuilder:validation:XValidation:rule="(has(self.matchPolicy) && self.matchPolicy == 'ExactRepository') ? has(self.exactRepository) : !has(self.exactRepository)",message="exactRepository is required when matchPolicy is ExactRepository, and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="(has(self.matchPolicy) && self.matchPolicy == 'RemapIdentity') ? has(self.remapIdentity) : !has(self.remapIdentity)",message="remapIdentity is required when matchPolicy is RemapIdentity, and forbidden otherwise" +// +union +type PolicyIdentity struct { + // matchPolicy is a required filed specifies matching strategy to verify the image identity in the signature against the image scope. + // Allowed values are "MatchRepoDigestOrExact", "MatchRepository", "ExactRepository", "RemapIdentity". When omitted, the default value is "MatchRepoDigestOrExact". + // When set to "MatchRepoDigestOrExact", the identity in the signature must be in the same repository as the image identity if the image identity is referenced by a digest. Otherwise, the identity in the signature must be the same as the image identity. + // When set to "MatchRepository", the identity in the signature must be in the same repository as the image identity. + // When set to "ExactRepository", the exactRepository must be specified. The identity in the signature must be in the same repository as a specific identity specified by "repository". + // When set to "RemapIdentity", the remapIdentity must be specified. The signature must be in the same as the remapped image identity. Remapped image identity is obtained by replacing the "prefix" with the specified “signedPrefix” if the the image identity matches the specified remapPrefix. + // +unionDiscriminator + // +required + MatchPolicy IdentityMatchPolicy `json:"matchPolicy"` + // exactRepository specifies the repository that must be exactly matched by the identity in the signature. + // exactRepository is required if matchPolicy is set to "ExactRepository". It is used to verify that the signature claims an identity matching this exact repository, rather than the original image identity. + // +optional + PolicyMatchExactRepository *PolicyMatchExactRepository `json:"exactRepository,omitempty"` + // remapIdentity specifies the prefix remapping rule for verifying image identity. + // remapIdentity is required if matchPolicy is set to "RemapIdentity". It is used to verify that the signature claims a different registry/repository prefix than the original image. + // +optional + PolicyMatchRemapIdentity *PolicyMatchRemapIdentity `json:"remapIdentity,omitempty"` +} + +// +kubebuilder:validation:MaxLength=512 +// +kubebuilder:validation:XValidation:rule=`self.matches('.*:([\\w][\\w.-]{0,127})$')? self.matches('^(localhost:[0-9]+)$'): true`,message="invalid repository or prefix in the signedIdentity, should not include the tag or digest" +// +kubebuilder:validation:XValidation:rule=`self.matches('^(((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+(?::[0-9]+)?)|(localhost(?::[0-9]+)?))(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$')`,message="invalid repository or prefix in the signedIdentity. The repository or prefix must starts with 'localhost' or a valid '.' separated domain. If contains registry paths, the path component names must start with at least one letter or number, with following parts able to be separated by one period, one or two underscore and multiple dashes." +type IdentityRepositoryPrefix string + +type PolicyMatchExactRepository struct { + // repository is the reference of the image identity to be matched. + // repository is required if matchPolicy is set to "ExactRepository". + // The value should be a repository name (by omitting the tag or digest) in a registry implementing the "Docker Registry HTTP API V2". For example, docker.io/library/busybox + // +required + Repository IdentityRepositoryPrefix `json:"repository"` +} + +type PolicyMatchRemapIdentity struct { + // prefix is required if matchPolicy is set to "RemapIdentity". + // prefix is the prefix of the image identity to be matched. + // If the image identity matches the specified prefix, that prefix is replaced by the specified “signedPrefix” (otherwise it is used as unchanged and no remapping takes place). + // This is useful when verifying signatures for a mirror of some other repository namespace that preserves the vendor’s repository structure. + // The prefix and signedPrefix values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, + // or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. + // For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox. + // +required + Prefix IdentityRepositoryPrefix `json:"prefix"` + // signedPrefix is required if matchPolicy is set to "RemapIdentity". + // signedPrefix is the prefix of the image identity to be matched in the signature. The format is the same as "prefix". The values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, + // or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. + // For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox. + // +required + SignedPrefix IdentityRepositoryPrefix `json:"signedPrefix"` +} + +// IdentityMatchPolicy defines the type of matching for "matchPolicy". +// +kubebuilder:validation:Enum=MatchRepoDigestOrExact;MatchRepository;ExactRepository;RemapIdentity +type IdentityMatchPolicy string + +const ( + IdentityMatchPolicyMatchRepoDigestOrExact IdentityMatchPolicy = "MatchRepoDigestOrExact" + IdentityMatchPolicyMatchRepository IdentityMatchPolicy = "MatchRepository" + IdentityMatchPolicyExactRepository IdentityMatchPolicy = "ExactRepository" + IdentityMatchPolicyRemapIdentity IdentityMatchPolicy = "RemapIdentity" +) + +// +k8s:deepcopy-gen=true +type ImagePolicyStatus struct { + // conditions provide details on the status of this API Resource. + // condition type 'Pending' indicates that the customer resource contains a policy that cannot take effect. It is either overwritten by a global policy or the image scope is not valid. + // +kubebuilder:validation:MaxItems=8 + // +kubebuilder:validation:MinItems=1 + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImagePolicyList is a list of ImagePolicy resources +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImagePolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +required + metav1.ListMeta `json:"metadata"` + + // items is a list of ImagePolicies + // +kubebuilder:validation:MaxItems=1000 + // +required + Items []ImagePolicy `json:"items"` +} + +const ( + // ImagePolicyPending indicates that the customer resource contains a policy that cannot take effect. It is either overwritten by a global policy or the image scope is not valid. + ImagePolicyPending = "Pending" + // ImagePolicyApplied indicates that the policy has been applied + ImagePolicyApplied = "Applied" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go b/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go new file mode 100644 index 0000000000..b7e1a6a873 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go @@ -0,0 +1,128 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/1126 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=imagetagmirrorsets,scope=Cluster,shortName=itms +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type ImageTagMirrorSet struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec ImageTagMirrorSetSpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImageTagMirrorSetStatus `json:"status,omitempty"` +} + +// ImageTagMirrorSetSpec is the specification of the ImageTagMirrorSet CRD. +type ImageTagMirrorSetSpec struct { + // imageTagMirrors allows images referenced by image tags in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in imageTagMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To use mirrors to pull images using digest specification only, users should configure + // a list of mirrors using "ImageDigestMirrorSet" CRD. + // + // If the image pull specification matches the repository of "source" in multiple imagetagmirrorset objects, + // only the objects which define the most specific namespace match will be used. + // For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as + // the "source", only the objects using quay.io/libpod/busybox are going to apply + // for pull specification quay.io/libpod/busybox. + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order. + // +optional + // +listType=atomic + ImageTagMirrors []ImageTagMirrors `json:"imageTagMirrors"` +} + +type ImageTagMirrorSetStatus struct{} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagMirrorSetList lists the items in the ImageTagMirrorSet CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageTagMirrorSetList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageTagMirrorSet `json:"items"` +} + +// ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type ImageTagMirrors struct { + // source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname + // e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. + // "source" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // [*.]host + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +required + // +kubebuilder:validation:Pattern=`^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` + Source string `json:"source"` + // mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. + // Images can be pulled from these mirrors only if they are referenced by their tags. + // The mirrored location is obtained by replacing the part of the input reference that + // matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, + // a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo + // repository to be used. + // Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. + // Configuring a list of mirrors using "ImageDigestMirrorSet" CRD and forcing digest-pulls for mirrors avoids that issue. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. + // If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be + // pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy". + // Other cluster configuration, including (but not limited to) other imageTagMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // "mirrors" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +optional + // +listType=set + Mirrors []ImageMirror `json:"mirrors,omitempty"` + // mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. + // If unset, the image will continue to be pulled from the repository in the pull spec. + // sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + // +optional + MirrorSourcePolicy MirrorSourcePolicy `json:"mirrorSourcePolicy,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go index 6e78d5ea6d..005702e993 100644 --- a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go +++ b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go @@ -1,6 +1,8 @@ package v1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +genclient // +genclient:nonNamespaced @@ -8,12 +10,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +kubebuilder:subresource:status // Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=infrastructures,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Infrastructure struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec InfrastructureSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -49,11 +62,13 @@ type InfrastructureStatus struct { // infrastructureName uniquely identifies a cluster with a human friendly name. // Once set it should not be changed. Must be of max length 27 and must have only // alphanumeric or hyphen characters. + // +optional InfrastructureName string `json:"infrastructureName"` // platform is the underlying infrastructure provider for the cluster. // // Deprecated: Use platformStatus.type instead. + // +optional Platform PlatformType `json:"platform,omitempty"` // platformStatus holds status information specific to the underlying @@ -65,24 +80,34 @@ type InfrastructureStatus struct { // etcd servers and clients. // For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery // deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release. + // +optional EtcdDiscoveryDomain string `json:"etcdDiscoveryDomain"` // apiServerURL is a valid URI with scheme 'https', address and // optionally a port (defaulting to 443). apiServerURL can be used by components like the web console // to tell users where to find the Kubernetes API. + // +optional APIServerURL string `json:"apiServerURL"` // apiServerInternalURL is a valid URI with scheme 'https', // address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components // like kubelets, to contact the Kubernetes API server using the // infrastructure provider rather than Kubernetes networking. + // +optional APIServerInternalURL string `json:"apiServerInternalURI"` // controlPlaneTopology expresses the expectations for operands that normally run on control nodes. // The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. // The 'SingleReplica' mode will be used in single-node deployments // and the operators should not configure the operand for highly-available operation + // The 'External' mode indicates that the control plane is hosted externally to the cluster and that + // its components are not visible within the cluster. // +kubebuilder:default=HighlyAvailable + // +openshift:validation:FeatureGateAwareEnum:featureGate="",enum=HighlyAvailable;SingleReplica;External + // +openshift:validation:FeatureGateAwareEnum:featureGate=HighlyAvailableArbiter,enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;External + // +openshift:validation:FeatureGateAwareEnum:featureGate=DualReplica,enum=HighlyAvailable;SingleReplica;DualReplica;External + // +openshift:validation:FeatureGateAwareEnum:requiredFeatureGate=HighlyAvailableArbiter;DualReplica,enum=HighlyAvailable;HighlyAvailableArbiter;SingleReplica;DualReplica;External + // +optional ControlPlaneTopology TopologyMode `json:"controlPlaneTopology"` // infrastructureTopology expresses the expectations for infrastructure services that do not run on control @@ -91,24 +116,75 @@ type InfrastructureStatus struct { // The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. // The 'SingleReplica' mode will be used in single-node deployments // and the operators should not configure the operand for highly-available operation + // NOTE: External topology mode is not applicable for this field. // +kubebuilder:default=HighlyAvailable - InfrastructureTopology TopologyMode `json:"infrastructureTopology"` + // +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica + // +optional + InfrastructureTopology TopologyMode `json:"infrastructureTopology,omitempty"` + + // cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. + // CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. + // Valid values are "None" and "AllNodes". When omitted, the default value is "None". + // The default value of "None" indicates that no nodes will be setup with CPU partitioning. + // The "AllNodes" value indicates that all nodes have been setup with CPU partitioning, + // and can then be further configured via the PerformanceProfile API. + // +kubebuilder:default=None + // +default="None" + // +kubebuilder:validation:Enum=None;AllNodes + // +optional + CPUPartitioning CPUPartitioningMode `json:"cpuPartitioning,omitempty"` } // TopologyMode defines the topology mode of the control/infra nodes. -// +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica +// NOTE: Enum validation is specified in each field that uses this type, +// given that External value is not applicable to the InfrastructureTopology +// field. type TopologyMode string const ( // "HighlyAvailable" is for operators to configure high-availability as much as possible. HighlyAvailableTopologyMode TopologyMode = "HighlyAvailable" + // "HighlyAvailableArbiter" is for operators to configure for an arbiter HA deployment. + HighlyAvailableArbiterMode TopologyMode = "HighlyAvailableArbiter" + // "SingleReplica" is for operators to avoid spending resources for high-availability purpose. SingleReplicaTopologyMode TopologyMode = "SingleReplica" + + // "DualReplica" is for operators to configure for two node topology. + DualReplicaTopologyMode TopologyMode = "DualReplica" + + // "External" indicates that the component is running externally to the cluster. When specified + // as the control plane topology, operators should avoid scheduling workloads to masters or assume + // that any of the control plane components such as kubernetes API server or etcd are visible within + // the cluster. + ExternalTopologyMode TopologyMode = "External" +) + +// CPUPartitioningMode defines the mode for CPU partitioning +type CPUPartitioningMode string + +const ( + // CPUPartitioningNone means that no CPU Partitioning is on in this cluster infrastructure + CPUPartitioningNone CPUPartitioningMode = "None" + + // CPUPartitioningAllNodes means that all nodes are configured with CPU Partitioning in this cluster + CPUPartitioningAllNodes CPUPartitioningMode = "AllNodes" +) + +// PlatformLoadBalancerType defines the type of load balancer used by the cluster. +type PlatformLoadBalancerType string + +const ( + // LoadBalancerTypeUserManaged is a load balancer with control-plane VIPs managed outside of the cluster by the customer. + LoadBalancerTypeUserManaged PlatformLoadBalancerType = "UserManaged" + + // LoadBalancerTypeOpenShiftManagedDefault is the default load balancer with control-plane VIPs managed by the OpenShift cluster. + LoadBalancerTypeOpenShiftManagedDefault PlatformLoadBalancerType = "OpenShiftManagedDefault" ) // PlatformType is a specific supported infrastructure provider. -// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud;KubeVirt;EquinixMetal +// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud;KubeVirt;EquinixMetal;PowerVS;AlibabaCloud;Nutanix;External type PlatformType string const ( @@ -147,6 +223,18 @@ const ( // EquinixMetalPlatformType represents Equinix Metal infrastructure. EquinixMetalPlatformType PlatformType = "EquinixMetal" + + // PowerVSPlatformType represents IBM Power Systems Virtual Servers infrastructure. + PowerVSPlatformType PlatformType = "PowerVS" + + // AlibabaCloudPlatformType represents Alibaba Cloud infrastructure. + AlibabaCloudPlatformType PlatformType = "AlibabaCloud" + + // NutanixPlatformType represents Nutanix infrastructure. + NutanixPlatformType PlatformType = "Nutanix" + + // ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately. + ExternalPlatformType PlatformType = "External" ) // IBMCloudProviderType is a specific supported IBM Cloud provider cluster type @@ -158,63 +246,157 @@ const ( // VPC means that the IBM Cloud cluster is using VPC infrastructure IBMCloudProviderTypeVPC IBMCloudProviderType = "VPC" + + // IBMCloudProviderTypeUPI means that the IBM Cloud cluster is using user provided infrastructure. + // This is utilized in IBM Cloud Satellite environments. + IBMCloudProviderTypeUPI IBMCloudProviderType = "UPI" ) +// DNSType indicates whether the cluster DNS is hosted by the cluster or Core DNS . +type DNSType string + +const ( + // ClusterHosted indicates that a DNS solution other than the default provided by the + // cloud platform is in use. In this mode, the cluster hosts a DNS solution during installation and the + // user is expected to provide their own DNS solution post-install. + // When the DNS solution is `ClusterHosted`, the cluster will continue to use the + // default Load Balancers provided by the cloud platform. + ClusterHostedDNSType DNSType = "ClusterHosted" + + // PlatformDefault indicates that the cluster is using the default DNS solution for the + // cloud platform. OpenShift is responsible for all the LB and DNS configuration needed for the + // cluster to be functional with no intervention from the user. To accomplish this, OpenShift + // configures the default LB and DNS solutions provided by the underlying cloud. + PlatformDefaultDNSType DNSType = "PlatformDefault" +) + +// ExternalPlatformSpec holds the desired state for the generic External infrastructure provider. +type ExternalPlatformSpec struct { + // platformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. + // This field is solely for informational and reporting purposes and is not expected to be used for decision-making. + // +kubebuilder:default:="Unknown" + // +default="Unknown" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'Unknown' || self == oldSelf",message="platform name cannot be changed once set" + // +optional + PlatformName string `json:"platformName,omitempty"` +} + // PlatformSpec holds the desired state specific to the underlying infrastructure provider // of the current cluster. Since these are used at spec-level for the underlying cluster, it // is supposed that only one of the spec structs is set. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.vsphere) && has(self.vsphere) ? size(self.vsphere.vcenters) < 2 : true",message="vcenters can have at most 1 item when configured post-install" type PlatformSpec struct { // type is the underlying infrastructure provider for the cluster. This // value controls whether infrastructure automation such as service load // balancers, dynamic volume provisioning, machine creation and deletion, and // other integrations are enabled. If None, no infrastructure automation is // enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", - // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", and "None". Individual components may not support - // all platforms, and must handle unrecognized platforms as None if they do - // not support that platform. + // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", + // "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, + // and must handle unrecognized platforms as None if they do not support that platform. // // +unionDiscriminator Type PlatformType `json:"type"` - // AWS contains settings specific to the Amazon Web Services infrastructure provider. + // aws contains settings specific to the Amazon Web Services infrastructure provider. // +optional AWS *AWSPlatformSpec `json:"aws,omitempty"` - // Azure contains settings specific to the Azure infrastructure provider. + // azure contains settings specific to the Azure infrastructure provider. // +optional Azure *AzurePlatformSpec `json:"azure,omitempty"` - // GCP contains settings specific to the Google Cloud Platform infrastructure provider. + // gcp contains settings specific to the Google Cloud Platform infrastructure provider. // +optional GCP *GCPPlatformSpec `json:"gcp,omitempty"` - // BareMetal contains settings specific to the BareMetal platform. + // baremetal contains settings specific to the BareMetal platform. // +optional BareMetal *BareMetalPlatformSpec `json:"baremetal,omitempty"` - // OpenStack contains settings specific to the OpenStack infrastructure provider. + // openstack contains settings specific to the OpenStack infrastructure provider. // +optional OpenStack *OpenStackPlatformSpec `json:"openstack,omitempty"` - // Ovirt contains settings specific to the oVirt infrastructure provider. + // ovirt contains settings specific to the oVirt infrastructure provider. // +optional Ovirt *OvirtPlatformSpec `json:"ovirt,omitempty"` - // VSphere contains settings specific to the VSphere infrastructure provider. + // vsphere contains settings specific to the VSphere infrastructure provider. // +optional VSphere *VSpherePlatformSpec `json:"vsphere,omitempty"` - // IBMCloud contains settings specific to the IBMCloud infrastructure provider. + // ibmcloud contains settings specific to the IBMCloud infrastructure provider. // +optional IBMCloud *IBMCloudPlatformSpec `json:"ibmcloud,omitempty"` - // Kubevirt contains settings specific to the kubevirt infrastructure provider. + // kubevirt contains settings specific to the kubevirt infrastructure provider. // +optional Kubevirt *KubevirtPlatformSpec `json:"kubevirt,omitempty"` - // EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + // equinixMetal contains settings specific to the Equinix Metal infrastructure provider. // +optional EquinixMetal *EquinixMetalPlatformSpec `json:"equinixMetal,omitempty"` + + // powervs contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider. + // +optional + PowerVS *PowerVSPlatformSpec `json:"powervs,omitempty"` + + // alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + // +optional + AlibabaCloud *AlibabaCloudPlatformSpec `json:"alibabaCloud,omitempty"` + + // nutanix contains settings specific to the Nutanix infrastructure provider. + // +optional + Nutanix *NutanixPlatformSpec `json:"nutanix,omitempty"` + + // ExternalPlatformType represents generic infrastructure provider. + // Platform-specific components should be supplemented separately. + // +optional + External *ExternalPlatformSpec `json:"external,omitempty"` +} + +// CloudControllerManagerState defines whether Cloud Controller Manager presence is expected or not +type CloudControllerManagerState string + +const ( + // Cloud Controller Manager is enabled and expected to be installed. + // This value indicates that new nodes should be tainted as uninitialized when created, + // preventing them from running workloads until they are initialized by the cloud controller manager. + CloudControllerManagerExternal CloudControllerManagerState = "External" + + // Cloud Controller Manager is disabled and not expected to be installed. + // This value indicates that new nodes should not be tainted + // and no extra node initialization is expected from the cloud controller manager. + CloudControllerManagerNone CloudControllerManagerState = "None" +) + +// CloudControllerManagerStatus holds the state of Cloud Controller Manager (a.k.a. CCM or CPI) related settings +// +kubebuilder:validation:XValidation:rule="(has(self.state) == has(oldSelf.state)) || (!has(oldSelf.state) && self.state != \"External\")",message="state may not be added or removed once set" +type CloudControllerManagerStatus struct { + // state determines whether or not an external Cloud Controller Manager is expected to + // be installed within the cluster. + // https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/#running-cloud-controller-manager + // + // Valid values are "External", "None" and omitted. + // When set to "External", new nodes will be tainted as uninitialized when created, + // preventing them from running workloads until they are initialized by the cloud controller manager. + // When omitted or set to "None", new nodes will be not tainted + // and no extra initialization from the cloud controller manager is expected. + // +kubebuilder:validation:Enum="";External;None + // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="state is immutable once set" + // +optional + State CloudControllerManagerState `json:"state"` +} + +// ExternalPlatformStatus holds the current status of the generic External infrastructure provider. +// +kubebuilder:validation:XValidation:rule="has(self.cloudControllerManager) == has(oldSelf.cloudControllerManager)",message="cloudControllerManager may not be added or removed once set" +type ExternalPlatformStatus struct { + // cloudControllerManager contains settings specific to the external Cloud Controller Manager (a.k.a. CCM or CPI). + // When omitted, new nodes will be not tainted + // and no extra initialization from the cloud controller manager is expected. + // +optional + CloudControllerManager CloudControllerManagerStatus `json:"cloudControllerManager"` } // PlatformStatus holds the current status specific to the underlying infrastructure provider @@ -226,53 +408,69 @@ type PlatformStatus struct { // balancers, dynamic volume provisioning, machine creation and deletion, and // other integrations are enabled. If None, no infrastructure automation is // enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", - // "OpenStack", "VSphere", "oVirt", "EquinixMetal", and "None". Individual components may not support - // all platforms, and must handle unrecognized platforms as None if they do - // not support that platform. + // "OpenStack", "VSphere", "oVirt", "EquinixMetal", "PowerVS", "AlibabaCloud", "Nutanix" and "None". + // Individual components may not support all platforms, and must handle + // unrecognized platforms as None if they do not support that platform. // // This value will be synced with to the `status.platform` and `status.platformStatus.type`. // Currently this value cannot be changed once set. Type PlatformType `json:"type"` - // AWS contains settings specific to the Amazon Web Services infrastructure provider. + // aws contains settings specific to the Amazon Web Services infrastructure provider. // +optional AWS *AWSPlatformStatus `json:"aws,omitempty"` - // Azure contains settings specific to the Azure infrastructure provider. + // azure contains settings specific to the Azure infrastructure provider. // +optional Azure *AzurePlatformStatus `json:"azure,omitempty"` - // GCP contains settings specific to the Google Cloud Platform infrastructure provider. + // gcp contains settings specific to the Google Cloud Platform infrastructure provider. // +optional GCP *GCPPlatformStatus `json:"gcp,omitempty"` - // BareMetal contains settings specific to the BareMetal platform. + // baremetal contains settings specific to the BareMetal platform. // +optional BareMetal *BareMetalPlatformStatus `json:"baremetal,omitempty"` - // OpenStack contains settings specific to the OpenStack infrastructure provider. + // openstack contains settings specific to the OpenStack infrastructure provider. // +optional OpenStack *OpenStackPlatformStatus `json:"openstack,omitempty"` - // Ovirt contains settings specific to the oVirt infrastructure provider. + // ovirt contains settings specific to the oVirt infrastructure provider. // +optional Ovirt *OvirtPlatformStatus `json:"ovirt,omitempty"` - // VSphere contains settings specific to the VSphere infrastructure provider. + // vsphere contains settings specific to the VSphere infrastructure provider. // +optional VSphere *VSpherePlatformStatus `json:"vsphere,omitempty"` - // IBMCloud contains settings specific to the IBMCloud infrastructure provider. + // ibmcloud contains settings specific to the IBMCloud infrastructure provider. // +optional IBMCloud *IBMCloudPlatformStatus `json:"ibmcloud,omitempty"` - // Kubevirt contains settings specific to the kubevirt infrastructure provider. + // kubevirt contains settings specific to the kubevirt infrastructure provider. // +optional Kubevirt *KubevirtPlatformStatus `json:"kubevirt,omitempty"` - // EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + // equinixMetal contains settings specific to the Equinix Metal infrastructure provider. // +optional EquinixMetal *EquinixMetalPlatformStatus `json:"equinixMetal,omitempty"` + + // powervs contains settings specific to the Power Systems Virtual Servers infrastructure provider. + // +optional + PowerVS *PowerVSPlatformStatus `json:"powervs,omitempty"` + + // alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + // +optional + AlibabaCloud *AlibabaCloudPlatformStatus `json:"alibabaCloud,omitempty"` + + // nutanix contains settings specific to the Nutanix infrastructure provider. + // +optional + Nutanix *NutanixPlatformStatus `json:"nutanix,omitempty"` + + // external contains settings specific to the generic External infrastructure provider. + // +optional + External *ExternalPlatformStatus `json:"external,omitempty"` } // AWSServiceEndpoint store the configuration of a custom url to @@ -293,12 +491,28 @@ type AWSServiceEndpoint struct { URL string `json:"url"` } +// IPFamilyType represents the IP protocol family that cloud platform resources should use. +// +kubebuilder:validation:Enum=IPv4;DualStackIPv6Primary;DualStackIPv4Primary +type IPFamilyType string + +const ( + // IPv4 indicates that cloud platform resources should use IPv4 addressing only. + IPv4 IPFamilyType = "IPv4" + + // DualStackIPv6Primary indicates that cloud platform resources should use dual-stack networking with IPv6 as primary. + DualStackIPv6Primary IPFamilyType = "DualStackIPv6Primary" + + // DualStackIPv4Primary indicates that cloud platform resources should use dual-stack networking with IPv4 as primary. + DualStackIPv4Primary IPFamilyType = "DualStackIPv4Primary" +) + // AWSPlatformSpec holds the desired state of the Amazon Web Services infrastructure provider. // This only includes fields that can be modified in the cluster. type AWSPlatformSpec struct { // serviceEndpoints list contains custom endpoints which will override default // service endpoint of AWS Services. // There must be only one ServiceEndpoint for a service. + // +listType=atomic // +optional ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"` } @@ -308,9 +522,10 @@ type AWSPlatformStatus struct { // region holds the default AWS region for new AWS resources created by the cluster. Region string `json:"region"` - // ServiceEndpoints list contains custom endpoints which will override default + // serviceEndpoints list contains custom endpoints which will override default // service endpoint of AWS Services. // There must be only one ServiceEndpoint for a service. + // +listType=atomic // +optional ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"` @@ -319,26 +534,55 @@ type AWSPlatformStatus struct { // AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags // available for the user. // +kubebuilder:validation:MaxItems=25 + // +listType=atomic // +optional ResourceTags []AWSResourceTag `json:"resourceTags,omitempty"` + + // cloudLoadBalancerConfig holds configuration related to DNS and cloud + // load balancers. It allows configuration of in-cluster DNS as an alternative + // to the platform default DNS implementation. + // When using the ClusterHosted DNS type, Load Balancer IP addresses + // must be provided for the API and internal API load balancers as well as the + // ingress load balancer. + // + // +default={"dnsType": "PlatformDefault"} + // +kubebuilder:default={"dnsType": "PlatformDefault"} + // +openshift:enable:FeatureGate=AWSClusterHostedDNSInstall + // +optional + // +nullable + CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"` + + // ipFamily specifies the IP protocol family that should be used for AWS + // network resources. This controls whether AWS resources are created with + // IPv4-only, or dual-stack networking with IPv4 or IPv6 as the primary + // protocol family. + // + // +default="IPv4" + // +kubebuilder:default="IPv4" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="ipFamily is immutable once set" + // +openshift:enable:FeatureGate=AWSDualStackInstall + // +optional + IPFamily IPFamilyType `json:"ipFamily,omitempty"` } // AWSResourceTag is a tag to apply to AWS resources created for the cluster. type AWSResourceTag struct { - // key is the key of the tag - // +kubebuilder:validation:Required + // key sets the key of the AWS resource tag key-value pair. Key is required when defining an AWS resource tag. + // Key should consist of between 1 and 128 characters, and may + // contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'. // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=128 - // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$` + // +kubebuilder:validation:XValidation:rule=`self.matches('^[0-9A-Za-z_.:/=+-@ ]+$')`,message="invalid AWS resource tag key. The string can contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', '@'" // +required Key string `json:"key"` - // value is the value of the tag. + // value sets the value of the AWS resource tag key-value pair. Value is required when defining an AWS resource tag. + // Value should consist of between 1 and 256 characters, and may + // contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'. // Some AWS service do not support empty values. Since tags are added to resources in many services, the // length of the tag value must meet the requirements of all services. - // +kubebuilder:validation:Required // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=256 - // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$` + // +kubebuilder:validation:XValidation:rule=`self.matches('^[0-9A-Za-z_.:/=+-@ ]+$')`,message="invalid AWS resource tag value. The string can contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', '@'" // +required Value string `json:"value"` } @@ -348,6 +592,7 @@ type AWSResourceTag struct { type AzurePlatformSpec struct{} // AzurePlatformStatus holds the current status of the Azure infrastructure provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)",message="resourceTags may only be configured during installation" type AzurePlatformStatus struct { // resourceGroupName is the Resource Group for new Azure resources created for the cluster. ResourceGroupName string `json:"resourceGroupName"` @@ -362,10 +607,68 @@ type AzurePlatformStatus struct { // If empty, the value is equal to `AzurePublicCloud`. // +optional CloudName AzureCloudEnvironment `json:"cloudName,omitempty"` + + // armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack. + // +optional + ARMEndpoint string `json:"armEndpoint,omitempty"` + + // resourceTags is a list of additional tags to apply to Azure resources created for the cluster. + // See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. + // Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags + // may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration. + // +kubebuilder:validation:MaxItems=10 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceTags are immutable and may only be configured during installation" + // +listType=atomic + // +optional + ResourceTags []AzureResourceTag `json:"resourceTags,omitempty"` + + // cloudLoadBalancerConfig holds configuration related to DNS and cloud + // load balancers. It allows configuration of in-cluster DNS as an alternative + // to the platform default DNS implementation. + // When using the ClusterHosted DNS type, Load Balancer IP addresses + // must be provided for the API and internal API load balancers as well as the + // ingress load balancer. + // + // +default={"dnsType": "PlatformDefault"} + // +kubebuilder:default={"dnsType": "PlatformDefault"} + // +openshift:enable:FeatureGate=AzureClusterHostedDNSInstall + // +optional + CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"` + + // ipFamily specifies the IP protocol family that should be used for Azure + // network resources. This controls whether Azure resources are created with + // IPv4-only, or dual-stack networking with IPv4 or IPv6 as the primary + // protocol family. + // + // +default="IPv4" + // +kubebuilder:default="IPv4" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="ipFamily is immutable once set" + // +openshift:enable:FeatureGate=AzureDualStackInstall + // +optional + IPFamily IPFamilyType `json:"ipFamily,omitempty"` +} + +// AzureResourceTag is a tag to apply to Azure resources created for the cluster. +type AzureResourceTag struct { + // key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key + // must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric + // characters and the following special characters `_ . -`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +kubebuilder:validation:Pattern=`^[a-zA-Z]([0-9A-Za-z_.-]*[0-9A-Za-z_])?$` + Key string `json:"key"` + // value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value + // must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.=+-@]+$` + Value string `json:"value"` } // AzureCloudEnvironment is the name of the Azure cloud environment -// +kubebuilder:validation:Enum="";AzurePublicCloud;AzureUSGovernmentCloud;AzureChinaCloud;AzureGermanCloud +// +kubebuilder:validation:Enum="";AzurePublicCloud;AzureUSGovernmentCloud;AzureChinaCloud;AzureGermanCloud;AzureStackCloud type AzureCloudEnvironment string const ( @@ -380,24 +683,341 @@ const ( // AzureGermanCloud is the Azure cloud environment used in Germany. AzureGermanCloud AzureCloudEnvironment = "AzureGermanCloud" + + // AzureStackCloud is the Azure cloud environment used at the edge and on premises. + AzureStackCloud AzureCloudEnvironment = "AzureStackCloud" +) + +// GCPServiceEndpointName is the name of the GCP Service Endpoint. +// +kubebuilder:validation:Enum=Compute;Container;CloudResourceManager;DNS;File;IAM;IAMCredentials;OAuth;ServiceUsage;Storage;STS +type GCPServiceEndpointName string + +const ( + // GCPServiceEndpointNameCompute is the name used for the GCP Compute Service endpoint. + GCPServiceEndpointNameCompute GCPServiceEndpointName = "Compute" + + // GCPServiceEndpointNameContainer is the name used for the GCP Container Service endpoint. + GCPServiceEndpointNameContainer GCPServiceEndpointName = "Container" + + // GCPServiceEndpointNameCloudResource is the name used for the GCP Resource Manager Service endpoint. + GCPServiceEndpointNameCloudResource GCPServiceEndpointName = "CloudResourceManager" + + // GCPServiceEndpointNameDNS is the name used for the GCP DNS Service endpoint. + GCPServiceEndpointNameDNS GCPServiceEndpointName = "DNS" + + // GCPServiceEndpointNameFile is the name used for the GCP File Service endpoint. + GCPServiceEndpointNameFile GCPServiceEndpointName = "File" + + // GCPServiceEndpointNameIAM is the name used for the GCP IAM Service endpoint. + GCPServiceEndpointNameIAM GCPServiceEndpointName = "IAM" + + // GCPServiceEndpointNameIAMCredentials is the name used for the GCP IAM Credentials Service endpoint. + GCPServiceEndpointNameIAMCredentials GCPServiceEndpointName = "IAMCredentials" + + // GCPServiceEndpointNameOAuth is the name used for the GCP OAuth2 Service endpoint. + GCPServiceEndpointNameOAuth GCPServiceEndpointName = "OAuth" + + // GCPServiceEndpointNameServiceUsage is the name used for the GCP Service Usage Service endpoint. + GCPServiceEndpointNameServiceUsage GCPServiceEndpointName = "ServiceUsage" + + // GCPServiceEndpointNameStorage is the name used for the GCP Storage Service endpoint. + GCPServiceEndpointNameStorage GCPServiceEndpointName = "Storage" + + // GCPServiceEndpointNameSTS is the name used for the GCP STS Service endpoint. + GCPServiceEndpointNameSTS GCPServiceEndpointName = "STS" ) +// GCPServiceEndpoint store the configuration of a custom url to +// override existing defaults of GCP Services. +type GCPServiceEndpoint struct { + // name is the name of the GCP service whose endpoint is being overridden. + // This must be provided and cannot be empty. + // + // Allowed values are Compute, Container, CloudResourceManager, DNS, File, IAM, ServiceUsage, + // Storage, and TagManager. + // + // As an example, when setting the name to Compute all requests made by the caller to the GCP Compute + // Service will be directed to the endpoint specified in the url field. + // + // +required + Name GCPServiceEndpointName `json:"name"` + + // url is a fully qualified URI that overrides the default endpoint for a client using the GCP service specified + // in the name field. + // url is required, must use the scheme https, must not be more than 253 characters in length, + // and must be a valid URL according to Go's net/url package (https://pkg.go.dev/net/url#URL) + // + // An example of a valid endpoint that overrides the Compute Service: "https://compute-myendpoint1.p.googleapis.com" + // + // +required + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="must be a valid URL" + // +kubebuilder:validation:XValidation:rule="isURL(self) ? (url(self).getScheme() == \"https\") : true",message="scheme must be https" + // +kubebuilder:validation:XValidation:rule="url(self).getEscapedPath() == \"\" || url(self).getEscapedPath() == \"/\"",message="url must consist only of a scheme and domain. The url path must be empty." + URL string `json:"url"` +} + // GCPPlatformSpec holds the desired state of the Google Cloud Platform infrastructure provider. // This only includes fields that can be modified in the cluster. type GCPPlatformSpec struct{} // GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceLabels) && !has(self.resourceLabels) || has(oldSelf.resourceLabels) && has(self.resourceLabels)",message="resourceLabels may only be configured during installation" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)",message="resourceTags may only be configured during installation" type GCPPlatformStatus struct { // resourceGroupName is the Project ID for new GCP resources created for the cluster. ProjectID string `json:"projectID"` // region holds the region for new GCP resources created for the cluster. Region string `json:"region"` + + // resourceLabels is a list of additional labels to apply to GCP resources created for the cluster. + // See https://cloud.google.com/compute/docs/labeling-resources for information on labeling GCP resources. + // GCP supports a maximum of 64 labels per resource. OpenShift reserves 32 labels for internal use, + // allowing 32 labels for user configuration. + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceLabels are immutable and may only be configured during installation" + // +listType=map + // +listMapKey=key + // +optional + ResourceLabels []GCPResourceLabel `json:"resourceLabels,omitempty"` + + // resourceTags is a list of additional tags to apply to GCP resources created for the cluster. + // See https://cloud.google.com/resource-manager/docs/tags/tags-overview for information on + // tagging GCP resources. GCP supports a maximum of 50 tags per resource. + // +kubebuilder:validation:MaxItems=50 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceTags are immutable and may only be configured during installation" + // +listType=map + // +listMapKey=key + // +optional + ResourceTags []GCPResourceTag `json:"resourceTags,omitempty"` + + // This field was introduced and removed under tech preview. + // To avoid conflicts with serialisation, this field name may never be used again. + // Tombstone the field as a reminder. + // ClusterHostedDNS ClusterHostedDNS `json:"clusterHostedDNS,omitempty"` + + // cloudLoadBalancerConfig holds configuration related to DNS and cloud + // load balancers. It allows configuration of in-cluster DNS as an alternative + // to the platform default DNS implementation. + // When using the ClusterHosted DNS type, Load Balancer IP addresses + // must be provided for the API and internal API load balancers as well as the + // ingress load balancer. + // + // +default={"dnsType": "PlatformDefault"} + // +kubebuilder:default={"dnsType": "PlatformDefault"} + // +openshift:enable:FeatureGate=GCPClusterHostedDNSInstall + // +optional + // +nullable + CloudLoadBalancerConfig *CloudLoadBalancerConfig `json:"cloudLoadBalancerConfig,omitempty"` + + // serviceEndpoints specifies endpoints that override the default endpoints + // used when creating clients to interact with GCP services. + // When not specified, the default endpoint for the GCP region will be used. + // Only 1 endpoint override is permitted for each GCP service. + // The maximum number of endpoint overrides allowed is 11. + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MaxItems=11 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x.name == y.name))",message="only 1 endpoint override is permitted per GCP service name" + // +optional + // +openshift:enable:FeatureGate=GCPCustomAPIEndpointsInstall + ServiceEndpoints []GCPServiceEndpoint `json:"serviceEndpoints,omitempty"` +} + +// GCPResourceLabel is a label to apply to GCP resources created for the cluster. +type GCPResourceLabel struct { + // key is the key part of the label. A label key can have a maximum of 63 characters and cannot be empty. + // Label key must begin with a lowercase letter, and must contain only lowercase letters, numeric characters, + // and the following special characters `_-`. Label key must not have the reserved prefixes `kubernetes-io` + // and `openshift-io`. + // +kubebuilder:validation:XValidation:rule="!self.startsWith('openshift-io') && !self.startsWith('kubernetes-io')",message="label keys must not start with either `openshift-io` or `kubernetes-io`" + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[a-z][0-9a-z_-]{0,62}$` + Key string `json:"key"` + + // value is the value part of the label. A label value can have a maximum of 63 characters and cannot be empty. + // Value must contain only lowercase letters, numeric characters, and the following special characters `_-`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[0-9a-z_-]{1,63}$` + Value string `json:"value"` +} + +// GCPResourceTag is a tag to apply to GCP resources created for the cluster. +type GCPResourceTag struct { + // parentID is the ID of the hierarchical resource where the tags are defined, + // e.g. at the Organization or the Project level. To find the Organization or Project ID refer to the following pages: + // https://cloud.google.com/resource-manager/docs/creating-managing-organization#retrieving_your_organization_id, + // https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects. + // An OrganizationID must consist of decimal numbers, and cannot have leading zeroes. + // A ProjectID must be 6 to 30 characters in length, can only contain lowercase letters, numbers, + // and hyphens, and must start with a letter, and cannot end with a hyphen. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=32 + // +kubebuilder:validation:Pattern=`(^[1-9][0-9]{0,31}$)|(^[a-z][a-z0-9-]{4,28}[a-z0-9]$)` + ParentID string `json:"parentID"` + + // key is the key part of the tag. A tag key can have a maximum of 63 characters and cannot be empty. + // Tag key must begin and end with an alphanumeric character, and must contain only uppercase, lowercase + // alphanumeric characters, and the following special characters `._-`. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[a-zA-Z0-9]([0-9A-Za-z_.-]{0,61}[a-zA-Z0-9])?$` + Key string `json:"key"` + + // value is the value part of the tag. A tag value can have a maximum of 63 characters and cannot be empty. + // Tag value must begin and end with an alphanumeric character, and must contain only uppercase, lowercase + // alphanumeric characters, and the following special characters `_-.@%=+:,*#&(){}[]` and spaces. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Pattern=`^[a-zA-Z0-9]([0-9A-Za-z_.@%=+:,*#&()\[\]{}\-\s]{0,61}[a-zA-Z0-9])?$` + Value string `json:"value"` +} + +// CloudLoadBalancerConfig contains an union discriminator indicating the type of DNS +// solution in use within the cluster. When the DNSType is `ClusterHosted`, the cloud's +// Load Balancer configuration needs to be provided so that the DNS solution hosted +// within the cluster can be configured with those values. +// +kubebuilder:validation:XValidation:rule="has(self.dnsType) && self.dnsType != 'ClusterHosted' ? !has(self.clusterHosted) : true",message="clusterHosted is permitted only when dnsType is ClusterHosted" +// +union +type CloudLoadBalancerConfig struct { + // dnsType indicates the type of DNS solution in use within the cluster. Its default value of + // `PlatformDefault` indicates that the cluster's DNS is the default provided by the cloud platform. + // It can be set to `ClusterHosted` to bypass the configuration of the cloud default DNS. In this mode, + // the cluster needs to provide a self-hosted DNS solution for the cluster's installation to succeed. + // The cluster's use of the cloud's Load Balancers is unaffected by this setting. + // The value is immutable after it has been set at install time. + // Currently, there is no way for the customer to add additional DNS entries into the cluster hosted DNS. + // Enabling this functionality allows the user to start their own DNS solution outside the cluster after + // installation is complete. The customer would be responsible for configuring this custom DNS solution, + // and it can be run in addition to the in-cluster DNS solution. + // +default="PlatformDefault" + // +kubebuilder:default:="PlatformDefault" + // +kubebuilder:validation:Enum="ClusterHosted";"PlatformDefault" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="dnsType is immutable" + // +optional + // +unionDiscriminator + DNSType DNSType `json:"dnsType,omitempty"` + + // clusterHosted holds the IP addresses of API, API-Int and Ingress Load + // Balancers on Cloud Platforms. The DNS solution hosted within the cluster + // use these IP addresses to provide resolution for API, API-Int and Ingress + // services. + // +optional + // +unionMember,optional + ClusterHosted *CloudLoadBalancerIPs `json:"clusterHosted,omitempty"` +} + +// CloudLoadBalancerIPs contains the Load Balancer IPs for the cloud's API, +// API-Int and Ingress Load balancers. They will be populated as soon as the +// respective Load Balancers have been configured. These values are utilized +// to configure the DNS solution hosted within the cluster. +type CloudLoadBalancerIPs struct { + // apiIntLoadBalancerIPs holds Load Balancer IPs for the internal API service. + // These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. + // Entries in the apiIntLoadBalancerIPs must be unique. + // A maximum of 16 IP addresses are permitted. + // +kubebuilder:validation:Format=ip + // +listType=set + // +kubebuilder:validation:MaxItems=16 + // +optional + APIIntLoadBalancerIPs []IP `json:"apiIntLoadBalancerIPs,omitempty"` + + // apiLoadBalancerIPs holds Load Balancer IPs for the API service. + // These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. + // Could be empty for private clusters. + // Entries in the apiLoadBalancerIPs must be unique. + // A maximum of 16 IP addresses are permitted. + // +kubebuilder:validation:Format=ip + // +listType=set + // +kubebuilder:validation:MaxItems=16 + // +optional + APILoadBalancerIPs []IP `json:"apiLoadBalancerIPs,omitempty"` + + // ingressLoadBalancerIPs holds IPs for Ingress Load Balancers. + // These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. + // Entries in the ingressLoadBalancerIPs must be unique. + // A maximum of 16 IP addresses are permitted. + // +kubebuilder:validation:Format=ip + // +listType=set + // +kubebuilder:validation:MaxItems=16 + // +optional + IngressLoadBalancerIPs []IP `json:"ingressLoadBalancerIPs,omitempty"` +} + +// BareMetalPlatformLoadBalancer defines the load balancer used by the cluster on BareMetal platform. +// +union +type BareMetalPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on BareMetal platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` } // BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. // This only includes fields that can be modified in the cluster. -type BareMetalPlatformSpec struct{} +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)",message="apiServerInternalIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.ingressIPs) || has(self.ingressIPs)",message="ingressIPs list is required once set" +type BareMetalPlatformSpec struct { + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.apiServerInternalIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + APIServerInternalIPs []IP `json:"apiServerInternalIPs"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.ingressIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + IngressIPs []IP `json:"ingressIPs"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster + // nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, + // for example "10.0.0.0/8" or "fd00::/8". + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} // BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. // For more information about the network architecture used with the BareMetal platform type, see: @@ -407,12 +1027,39 @@ type BareMetalPlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + IngressIPs []string `json:"ingressIPs"` + // nodeDNSIP is the IP address for the internal DNS used by the // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` // provides name resolution for the nodes themselves. There is no DNS-as-a-service for @@ -420,11 +1067,87 @@ type BareMetalPlatformStatus struct { // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames // to the nodes in the cluster. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *BareMetalPlatformLoadBalancer `json:"loadBalancer,omitempty"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster nodes. + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} + +// OpenStackPlatformLoadBalancer defines the load balancer used by the cluster on OpenStack platform. +// +union +type OpenStackPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on OpenStack platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` } // OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. // This only includes fields that can be modified in the cluster. -type OpenStackPlatformSpec struct{} +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)",message="apiServerInternalIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.ingressIPs) || has(self.ingressIPs)",message="ingressIPs list is required once set" +type OpenStackPlatformSpec struct { + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.apiServerInternalIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + APIServerInternalIPs []IP `json:"apiServerInternalIPs"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.ingressIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + IngressIPs []IP `json:"ingressIPs"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster + // nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, + // for example "10.0.0.0/8" or "fd00::/8". + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} // OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider. type OpenStackPlatformStatus struct { @@ -432,16 +1155,43 @@ type OpenStackPlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // cloudName is the name of the desired OpenStack cloud in the // client configuration file (`clouds.yaml`). CloudName string `json:"cloudName,omitempty"` // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + IngressIPs []string `json:"ingressIPs"` + // nodeDNSIP is the IP address for the internal DNS used by the // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` // provides name resolution for the nodes themselves. There is no DNS-as-a-service for @@ -449,6 +1199,40 @@ type OpenStackPlatformStatus struct { // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames // to the nodes in the cluster. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *OpenStackPlatformLoadBalancer `json:"loadBalancer,omitempty"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster nodes. + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} + +// OvirtPlatformLoadBalancer defines the load balancer used by the cluster on Ovirt platform. +// +union +type OvirtPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on Ovirt platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` } // OvirtPlatformSpec holds the desired state of the oVirt infrastructure provider. @@ -461,19 +1245,442 @@ type OvirtPlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + IngressIPs []string `json:"ingressIPs"` + // deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *OvirtPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// VSpherePlatformLoadBalancer defines the load balancer used by the cluster on VSphere platform. +// +union +type VSpherePlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on VSphere platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// The VSphereFailureDomainZoneType is a string representation of a failure domain +// zone type. There are two supportable types HostGroup and ComputeCluster +// +enum +type VSphereFailureDomainZoneType string + +// The VSphereFailureDomainRegionType is a string representation of a failure domain +// region type. There are two supportable types ComputeCluster and Datacenter +// +enum +type VSphereFailureDomainRegionType string + +const ( + // HostGroupFailureDomainZone is a failure domain zone for a vCenter vm-host group. + HostGroupFailureDomainZone VSphereFailureDomainZoneType = "HostGroup" + // ComputeClusterFailureDomainZone is a failure domain zone for a vCenter compute cluster. + ComputeClusterFailureDomainZone VSphereFailureDomainZoneType = "ComputeCluster" + // DatacenterFailureDomainRegion is a failure domain region for a vCenter datacenter. + DatacenterFailureDomainRegion VSphereFailureDomainRegionType = "Datacenter" + // ComputeClusterFailureDomainRegion is a failure domain region for a vCenter compute cluster. + ComputeClusterFailureDomainRegion VSphereFailureDomainRegionType = "ComputeCluster" +) + +// VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain. +// +openshift:validation:FeatureGateAwareXValidation:featureGate=VSphereHostVMGroupZonal,rule="has(self.zoneAffinity) && self.zoneAffinity.type == 'HostGroup' ? has(self.regionAffinity) && self.regionAffinity.type == 'ComputeCluster' : true",message="when zoneAffinity type is HostGroup, regionAffinity type must be ComputeCluster" +// +openshift:validation:FeatureGateAwareXValidation:featureGate=VSphereHostVMGroupZonal,rule="has(self.zoneAffinity) && self.zoneAffinity.type == 'ComputeCluster' ? has(self.regionAffinity) && self.regionAffinity.type == 'Datacenter' : true",message="when zoneAffinity type is ComputeCluster, regionAffinity type must be Datacenter" +type VSpherePlatformFailureDomainSpec struct { + // name defines the arbitrary but unique name + // of a failure domain. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + Name string `json:"name"` + + // region defines the name of a region tag that will + // be attached to a vCenter datacenter. The tag + // category in vCenter must be named openshift-region. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + Region string `json:"region"` + + // zone defines the name of a zone tag that will + // be attached to a vCenter cluster. The tag + // category in vCenter must be named openshift-zone. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + Zone string `json:"zone"` + + // regionAffinity holds the type of region, Datacenter or ComputeCluster. + // When set to Datacenter, this means the region is a vCenter Datacenter as defined in topology. + // When set to ComputeCluster, this means the region is a vCenter Cluster as defined in topology. + // +openshift:validation:featureGate=VSphereHostVMGroupZonal + // +optional + RegionAffinity *VSphereFailureDomainRegionAffinity `json:"regionAffinity,omitempty"` + + // zoneAffinity holds the type of the zone and the hostGroup which + // vmGroup and the hostGroup names in vCenter corresponds to + // a vm-host group of type Virtual Machine and Host respectively. Is also + // contains the vmHostRule which is an affinity vm-host rule in vCenter. + // +openshift:validation:featureGate=VSphereHostVMGroupZonal + // +optional + ZoneAffinity *VSphereFailureDomainZoneAffinity `json:"zoneAffinity,omitempty"` + + // server is the fully-qualified domain name or the IP address of the vCenter server. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=255 + // --- + // + Validation is applied via a patch, we validate the format as either ipv4, ipv6 or hostname + Server string `json:"server"` + + // topology describes a given failure domain using vSphere constructs + // +required + Topology VSpherePlatformTopology `json:"topology"` +} + +// VSpherePlatformTopology holds the required and optional vCenter objects - datacenter, +// computeCluster, networks, datastore and resourcePool - to provision virtual machines. +type VSpherePlatformTopology struct { + // datacenter is the name of vCenter datacenter in which virtual machines will be located. + // The maximum length of the datacenter name is 80 characters. + // +required + // +kubebuilder:validation:MaxLength=80 + Datacenter string `json:"datacenter"` + + // computeCluster the absolute path of the vCenter cluster + // in which virtual machine will be located. + // The absolute path is of the form //host/. + // The maximum length of the path is 2048 characters. + // +required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/host/.*?` + ComputeCluster string `json:"computeCluster"` + + // networks is the list of port group network names within this failure domain. + // If feature gate VSphereMultiNetworks is enabled, up to 10 network adapters may be defined. + // 10 is the maximum number of virtual network devices which may be attached to a VM as defined by: + // https://configmax.esp.vmware.com/guest?vmwareproduct=vSphere&release=vSphere%208.0&categories=1-0 + // The available networks (port groups) can be listed using + // `govc ls 'network/*'` + // Networks should be in the form of an absolute path: + // //network/. + // +required + // +openshift:validation:FeatureGateAwareMaxItems:featureGate="",maxItems=1 + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=VSphereMultiNetworks,maxItems=10 + // +kubebuilder:validation:MinItems=1 + // +listType=atomic + Networks []string `json:"networks"` + + // datastore is the absolute path of the datastore in which the + // virtual machine is located. + // The absolute path is of the form //datastore/ + // The maximum length of the path is 2048 characters. + // +required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/datastore/.*?` + Datastore string `json:"datastore"` + + // resourcePool is the absolute path of the resource pool where virtual machines will be + // created. The absolute path is of the form //host//Resources/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/host/.*?/Resources.*` + // +optional + ResourcePool string `json:"resourcePool,omitempty"` + + // folder is the absolute path of the folder where + // virtual machines are located. The absolute path + // is of the form //vm/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/vm/.*?` + // +optional + Folder string `json:"folder,omitempty"` + + // template is the full inventory path of the virtual machine or template + // that will be cloned when creating new machines in this failure domain. + // The maximum length of the path is 2048 characters. + // + // When omitted, the template will be calculated by the control plane + // machineset operator based on the region and zone defined in + // VSpherePlatformFailureDomainSpec. + // For example, for zone=zonea, region=region1, and infrastructure name=test, + // the template path would be calculated as //vm/test-rhcos-region1-zonea. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/vm/.*?` + // +optional + Template string `json:"template,omitempty"` +} + +// VSphereFailureDomainZoneAffinity contains the vCenter cluster vm-host group (virtual machine and host types) +// and the vm-host affinity rule that together creates an affinity configuration for vm-host based zonal. +// This configuration within vCenter creates the required association between a failure domain, virtual machines +// and ESXi hosts to create a vm-host based zone. +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'HostGroup' ? has(self.hostGroup) : !has(self.hostGroup)",message="hostGroup is required when type is HostGroup, and forbidden otherwise" +// +union +type VSphereFailureDomainZoneAffinity struct { + // type determines the vSphere object type for a zone within this failure domain. + // Available types are ComputeCluster and HostGroup. + // When set to ComputeCluster, this means the vCenter cluster defined is the zone. + // When set to HostGroup, hostGroup must be configured with hostGroup, vmGroup and vmHostRule and + // this means the zone is defined by the grouping of those fields. + // +kubebuilder:validation:Enum:=HostGroup;ComputeCluster + // +required + // +unionDiscriminator + Type VSphereFailureDomainZoneType `json:"type"` + + // hostGroup holds the vmGroup and the hostGroup names in vCenter + // corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also + // contains the vmHostRule which is an affinity vm-host rule in vCenter. + // +unionMember + // +optional + HostGroup *VSphereFailureDomainHostGroup `json:"hostGroup,omitempty"` +} + +// VSphereFailureDomainRegionAffinity contains the region type which is the string representation of the +// VSphereFailureDomainRegionType with available options of Datacenter and ComputeCluster. +// +union +type VSphereFailureDomainRegionAffinity struct { + // type determines the vSphere object type for a region within this failure domain. + // Available types are Datacenter and ComputeCluster. + // When set to Datacenter, this means the vCenter Datacenter defined is the region. + // When set to ComputeCluster, this means the vCenter cluster defined is the region. + // +kubebuilder:validation:Enum:=ComputeCluster;Datacenter + // +required + // +unionDiscriminator + Type VSphereFailureDomainRegionType `json:"type"` +} + +// VSphereFailureDomainHostGroup holds the vmGroup and the hostGroup names in vCenter +// corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also +// contains the vmHostRule which is an affinity vm-host rule in vCenter. +type VSphereFailureDomainHostGroup struct { + // vmGroup is the name of the vm-host group of type virtual machine within vCenter for this failure domain. + // vmGroup is limited to 80 characters. + // This field is required when the VSphereFailureDomain ZoneType is HostGroup + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + VMGroup string `json:"vmGroup"` + + // hostGroup is the name of the vm-host group of type host within vCenter for this failure domain. + // hostGroup is limited to 80 characters. + // This field is required when the VSphereFailureDomain ZoneType is HostGroup + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + HostGroup string `json:"hostGroup"` + + // vmHostRule is the name of the affinity vm-host rule within vCenter for this failure domain. + // vmHostRule is limited to 80 characters. + // This field is required when the VSphereFailureDomain ZoneType is HostGroup + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +required + VMHostRule string `json:"vmHostRule"` +} + +// VSpherePlatformVCenterSpec stores the vCenter connection fields. +// This is used by the vSphere CCM. +type VSpherePlatformVCenterSpec struct { + + // server is the fully-qualified domain name or the IP address of the vCenter server. + // +required + // +kubebuilder:validation:MaxLength=255 + // --- + // + Validation is applied via a patch, we validate the format as either ipv4, ipv6 or hostname + Server string `json:"server"` + + // port is the TCP port that will be used to communicate to + // the vCenter endpoint. + // When omitted, this means the user has no opinion and + // it is up to the platform to choose a sensible default, + // which is subject to change over time. + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=32767 + // +optional + Port int32 `json:"port,omitempty"` + + // The vCenter Datacenters in which the RHCOS + // vm guests are located. This field will + // be used by the Cloud Controller Manager. + // Each datacenter listed here should be used within + // a topology. + // +required + // +kubebuilder:validation:MinItems=1 + // +listType=set + Datacenters []string `json:"datacenters"` +} + +// VSpherePlatformNodeNetworkingSpec holds the network CIDR(s) and port group name for +// including and excluding IP ranges in the cloud provider. +// This would be used for example when multiple network adapters are attached to +// a guest to help determine which IP address the cloud config manager should use +// for the external and internal node networking. +type VSpherePlatformNodeNetworkingSpec struct { + // networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs + // that will be used in respective status.addresses fields. + // --- + // + Validation is applied via a patch, we validate the format as cidr + // +listType=set + // +optional + NetworkSubnetCIDR []string `json:"networkSubnetCidr,omitempty"` + + // network VirtualMachine's VM Network names that will be used to when searching + // for status.addresses fields. Note that if internal.networkSubnetCIDR and + // external.networkSubnetCIDR are not set, then the vNIC associated to this network must + // only have a single IP address assigned to it. + // The available networks (port groups) can be listed using + // `govc ls 'network/*'` + // +optional + Network string `json:"network,omitempty"` + + // excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting + // the IP address from the VirtualMachine's VM for use in the status.addresses fields. + // --- + // + Validation is applied via a patch, we validate the format as cidr + // +listType=atomic + // +optional + ExcludeNetworkSubnetCIDR []string `json:"excludeNetworkSubnetCidr,omitempty"` +} + +// VSpherePlatformNodeNetworking holds the external and internal node networking spec. +type VSpherePlatformNodeNetworking struct { + // external represents the network configuration of the node that is externally routable. + // +optional + External VSpherePlatformNodeNetworkingSpec `json:"external"` + // internal represents the network configuration of the node that is routable only within the cluster. + // +optional + Internal VSpherePlatformNodeNetworkingSpec `json:"internal"` } // VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. -// This only includes fields that can be modified in the cluster. -type VSpherePlatformSpec struct{} +// In the future the cloud provider operator, storage operator and machine operator will +// use these fields for configuration. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.apiServerInternalIPs) || has(self.apiServerInternalIPs)",message="apiServerInternalIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.ingressIPs) || has(self.ingressIPs)",message="ingressIPs list is required once set" +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.vcenters) && has(self.vcenters) ? size(self.vcenters) < 2 : true",message="vcenters can have at most 1 item when configured post-install" +type VSpherePlatformSpec struct { + // vcenters holds the connection details for services to communicate with vCenter. + // Currently, only a single vCenter is supported, but in tech preview 3 vCenters are supported. + // Once the cluster has been installed, you are unable to change the current number of defined + // vCenters except in the case where the cluster has been upgraded from a version of OpenShift + // where the vsphere platform spec was not present. You may make modifications to the existing + // vCenters that are defined in the vcenters list in order to match with any added or modified + // failure domains. + // --- + // + If VCenters is not defined use the existing cloud-config configmap defined + // + in openshift-config. + // +kubebuilder:validation:MinItems=0 + // +kubebuilder:validation:MaxItems=3 + // +kubebuilder:validation:XValidation:rule="size(self) != size(oldSelf) ? size(oldSelf) == 0 && size(self) < 2 : true",message="vcenters cannot be added or removed once set" + // +listType=atomic + // +optional + VCenters []VSpherePlatformVCenterSpec `json:"vcenters,omitempty"` + + // failureDomains contains the definition of region, zone and the vCenter topology. + // If this is omitted failure domains (regions and zones) will not be used. + // +listType=map + // +listMapKey=name + // +optional + FailureDomains []VSpherePlatformFailureDomainSpec `json:"failureDomains,omitempty"` + + // nodeNetworking contains the definition of internal and external network constraints for + // assigning the node's networking. + // If this field is omitted, networking defaults to the legacy + // address selection behavior which is to only support a single address and + // return the first one found. + // +optional + NodeNetworking VSpherePlatformNodeNetworking `json:"nodeNetworking,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.apiServerInternalIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + APIServerInternalIPs []IP `json:"apiServerInternalIPs"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. + // In dual stack clusters this list contains two IP addresses, one from IPv4 + // family and one from IPv6. + // In single stack clusters a single IP address is expected. + // When omitted, values from the status.ingressIPs will be used. + // Once set, the list cannot be completely removed (but its second entry can). + // + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + // +optional + IngressIPs []IP `json:"ingressIPs"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster + // nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, + // for example "10.0.0.0/8" or "fd00::/8". + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} // VSpherePlatformStatus holds the current status of the vSphere infrastructure provider. type VSpherePlatformStatus struct { @@ -481,12 +1688,39 @@ type VSpherePlatformStatus struct { // by components inside the cluster, like kubelets using the infrastructure rather // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + // ingressIP is an external IP which routes to the default ingress controller. // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. IngressIP string `json:"ingressIP,omitempty"` + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=atomic + IngressIPs []string `json:"ingressIPs"` + // nodeDNSIP is the IP address for the internal DNS used by the // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` // provides name resolution for the nodes themselves. There is no DNS-as-a-service for @@ -494,22 +1728,96 @@ type VSpherePlatformStatus struct { // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames // to the nodes in the cluster. NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *VSpherePlatformLoadBalancer `json:"loadBalancer,omitempty"` + + // machineNetworks are IP networks used to connect all the OpenShift cluster nodes. + // +listType=atomic + // +kubebuilder:validation:MaxItems=32 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))" + // +optional + MachineNetworks []CIDR `json:"machineNetworks"` +} + +// IBMCloudServiceEndpoint stores the configuration of a custom url to +// override existing defaults of IBM Cloud Services. +type IBMCloudServiceEndpoint struct { + // name is the name of the IBM Cloud service. + // Possible values are: CIS, COS, COSConfig, DNSServices, GlobalCatalog, GlobalSearch, GlobalTagging, HyperProtect, IAM, KeyProtect, ResourceController, ResourceManager, or VPC. + // For example, the IBM Cloud Private IAM service could be configured with the + // service `name` of `IAM` and `url` of `https://private.iam.cloud.ibm.com` + // Whereas the IBM Cloud Private VPC service for US South (Dallas) could be configured + // with the service `name` of `VPC` and `url` of `https://us.south.private.iaas.cloud.ibm.com` + // + // +required + Name IBMCloudServiceName `json:"name"` + + // url is fully qualified URI with scheme https, that overrides the default generated + // endpoint for a client. + // This must be provided and cannot be empty. The path must follow the pattern + // /v[0,9]+ or /api/v[0,9]+ + // + // +required + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:MaxLength=300 + // +kubebuilder:validation:XValidation:rule="isURL(self)",message="url must be a valid absolute URL" + // +openshift:validation:FeatureGateAwareXValidation:featureGate=DyanmicServiceEndpointIBMCloud,rule="url(self).getScheme() == \"https\"",message="url must use https scheme" + // +openshift:validation:FeatureGateAwareXValidation:featureGate=DyanmicServiceEndpointIBMCloud,rule=`matches((url(self).getEscapedPath()), '^/(api/)?v[0-9]+/{0,1}$')`,message="url path must match /v[0,9]+ or /api/v[0,9]+" + URL string `json:"url"` } // IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. // This only includes fields that can be modified in the cluster. -type IBMCloudPlatformSpec struct{} +type IBMCloudPlatformSpec struct { + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of an IBM service. These endpoints are used by components + // within the cluster when trying to reach the IBM Cloud Services that have been + // overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each + // endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus + // are updated to reflect the same custom endpoints. + // A maximum of 13 service endpoints overrides are supported. + // +kubebuilder:validation:MaxItems=13 + // +listType=map + // +listMapKey=name + // +optional + // +openshift:enable:FeatureGate=DyanmicServiceEndpointIBMCloud + ServiceEndpoints []IBMCloudServiceEndpoint `json:"serviceEndpoints,omitempty"` +} -//IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider. +// IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider. type IBMCloudPlatformStatus struct { - // Location is where the cluster has been deployed + // location is where the cluster has been deployed Location string `json:"location,omitempty"` - // ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. + // resourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. ResourceGroupName string `json:"resourceGroupName,omitempty"` - // ProviderType indicates the type of cluster that was created + // providerType indicates the type of cluster that was created ProviderType IBMCloudProviderType `json:"providerType,omitempty"` + + // cisInstanceCRN is the CRN of the Cloud Internet Services instance managing + // the DNS zone for the cluster's base domain + CISInstanceCRN string `json:"cisInstanceCRN,omitempty"` + + // dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone + // for the cluster's base domain + DNSInstanceCRN string `json:"dnsInstanceCRN,omitempty"` + + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of an IBM service. These endpoints are used by components + // within the cluster when trying to reach the IBM Cloud Services that have been + // overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each + // endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus + // are updated to reflect the same custom endpoints. + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=DyanmicServiceEndpointIBMCloud,maxItems=13 + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []IBMCloudServiceEndpoint `json:"serviceEndpoints,omitempty"` } // KubevirtPlatformSpec holds the desired state of the kubevirt infrastructure provider. @@ -546,12 +1854,329 @@ type EquinixMetalPlatformStatus struct { IngressIP string `json:"ingressIP,omitempty"` } +// PowervsServiceEndpoint stores the configuration of a custom url to +// override existing defaults of PowerVS Services. +type PowerVSServiceEndpoint struct { + // name is the name of the Power VS service. + // Few of the services are + // IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api + // ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller + // Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + // + // +required + // +kubebuilder:validation:Enum=CIS;COS;COSConfig;DNSServices;GlobalCatalog;GlobalSearch;GlobalTagging;HyperProtect;IAM;KeyProtect;Power;ResourceController;ResourceManager;VPC + Name string `json:"name"` + + // url is fully qualified URI with scheme https, that overrides the default generated + // endpoint for a client. + // This must be provided and cannot be empty. + // + // +required + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Format=uri + // +kubebuilder:validation:Pattern=`^https://` + URL string `json:"url"` +} + +// PowerVSPlatformSpec holds the desired state of the IBM Power Systems Virtual Servers infrastructure provider. +// This only includes fields that can be modified in the cluster. +type PowerVSPlatformSpec struct { + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of a Power VS service. + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []PowerVSServiceEndpoint `json:"serviceEndpoints,omitempty"` +} + +// PowerVSPlatformStatus holds the current status of the IBM Power Systems Virtual Servers infrastrucutre provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceGroup) || has(self.resourceGroup)",message="cannot unset resourceGroup once set" +type PowerVSPlatformStatus struct { + // region holds the default Power VS region for new Power VS resources created by the cluster. + Region string `json:"region"` + + // zone holds the default zone for the new Power VS resources created by the cluster. + // Note: Currently only single-zone OCP clusters are supported + Zone string `json:"zone"` + + // resourceGroup is the resource group name for new IBMCloud resources created for a cluster. + // The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. + // More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. + // When omitted, the image registry operator won't be able to configure storage, + // which results in the image registry cluster operator not being in an available state. + // + // +kubebuilder:validation:Pattern=^[a-zA-Z0-9-_ ]+$ + // +kubebuilder:validation:MaxLength=40 + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="resourceGroup is immutable once set" + // +optional + ResourceGroup string `json:"resourceGroup"` + + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of a Power VS service. + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []PowerVSServiceEndpoint `json:"serviceEndpoints,omitempty"` + + // cisInstanceCRN is the CRN of the Cloud Internet Services instance managing + // the DNS zone for the cluster's base domain + CISInstanceCRN string `json:"cisInstanceCRN,omitempty"` + + // dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone + // for the cluster's base domain + DNSInstanceCRN string `json:"dnsInstanceCRN,omitempty"` +} + +// AlibabaCloudPlatformSpec holds the desired state of the Alibaba Cloud infrastructure provider. +// This only includes fields that can be modified in the cluster. +type AlibabaCloudPlatformSpec struct{} + +// AlibabaCloudPlatformStatus holds the current status of the Alibaba Cloud infrastructure provider. +type AlibabaCloudPlatformStatus struct { + // region specifies the region for Alibaba Cloud resources created for the cluster. + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z-]+$` + // +required + Region string `json:"region"` + // resourceGroupID is the ID of the resource group for the cluster. + // +kubebuilder:validation:Pattern=`^(rg-[0-9A-Za-z]+)?$` + // +optional + ResourceGroupID string `json:"resourceGroupID,omitempty"` + // resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster. + // +kubebuilder:validation:MaxItems=20 + // +listType=map + // +listMapKey=key + // +optional + ResourceTags []AlibabaCloudResourceTag `json:"resourceTags,omitempty"` +} + +// AlibabaCloudResourceTag is the set of tags to add to apply to resources. +type AlibabaCloudResourceTag struct { + // key is the key of the tag. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +required + Key string `json:"key"` + // value is the value of the tag. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +required + Value string `json:"value"` +} + +// NutanixPlatformLoadBalancer defines the load balancer used by the cluster on Nutanix platform. +// +union +type NutanixPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on Nutanix platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// NutanixPlatformSpec holds the desired state of the Nutanix infrastructure provider. +// This only includes fields that can be modified in the cluster. +type NutanixPlatformSpec struct { + // prismCentral holds the endpoint address and port to access the Nutanix Prism Central. + // When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. + // Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the + // proxy spec.noProxy list. + // +required + PrismCentral NutanixPrismEndpoint `json:"prismCentral"` + + // prismElements holds one or more endpoint address and port data to access the Nutanix + // Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one + // Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) + // used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) + // spread over multiple Prism Elements (clusters) of the Prism Central. + // +required + // +listType=map + // +listMapKey=name + PrismElements []NutanixPrismElementEndpoint `json:"prismElements"` + + // failureDomains configures failure domains information for the Nutanix platform. + // When set, the failure domains defined here may be used to spread Machines across + // prism element clusters to improve fault tolerance of the cluster. + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=NutanixMultiSubnets,maxItems=32 + // +listType=map + // +listMapKey=name + // +optional + FailureDomains []NutanixFailureDomain `json:"failureDomains"` +} + +// NutanixFailureDomain configures failure domain information for the Nutanix platform. +type NutanixFailureDomain struct { + // name defines the unique name of a failure domain. + // Name is required and must be at most 64 characters in length. + // It must consist of only lower case alphanumeric characters and hyphens (-). + // It must start and end with an alphanumeric character. + // This value is arbitrary and is used to identify the failure domain within the platform. + // +required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=64 + // +kubebuilder:validation:Pattern=`[a-z0-9]([-a-z0-9]*[a-z0-9])?` + Name string `json:"name"` + + // cluster is to identify the cluster (the Prism Element under management of the Prism Central), + // in which the Machine's VM will be created. The cluster identifier (uuid or name) can be obtained + // from the Prism Central console or using the prism_central API. + // +required + Cluster NutanixResourceIdentifier `json:"cluster"` + + // subnets holds a list of identifiers (one or more) of the cluster's network subnets + // If the feature gate NutanixMultiSubnets is enabled, up to 32 subnets may be configured. + // for the Machine's VM to connect to. The subnet identifiers (uuid or name) can be + // obtained from the Prism Central console or using the prism_central API. + // +required + // +kubebuilder:validation:MinItems=1 + // +openshift:validation:FeatureGateAwareMaxItems:featureGate="",maxItems=1 + // +openshift:validation:FeatureGateAwareMaxItems:featureGate=NutanixMultiSubnets,maxItems=32 + // +openshift:validation:FeatureGateAwareXValidation:featureGate=NutanixMultiSubnets,rule="self.all(x, self.exists_one(y, x == y))",message="each subnet must be unique" + // +listType=atomic + Subnets []NutanixResourceIdentifier `json:"subnets"` +} + +// NutanixIdentifierType is an enumeration of different resource identifier types. +// +kubebuilder:validation:Enum:=UUID;Name +type NutanixIdentifierType string + +const ( + // NutanixIdentifierUUID is a resource identifier identifying the object by UUID. + NutanixIdentifierUUID NutanixIdentifierType = "UUID" + + // NutanixIdentifierName is a resource identifier identifying the object by Name. + NutanixIdentifierName NutanixIdentifierType = "Name" +) + +// NutanixResourceIdentifier holds the identity of a Nutanix PC resource (cluster, image, subnet, etc.) +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'UUID' ? has(self.uuid) : !has(self.uuid)",message="uuid configuration is required when type is UUID, and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'Name' ? has(self.name) : !has(self.name)",message="name configuration is required when type is Name, and forbidden otherwise" +// +union +type NutanixResourceIdentifier struct { + // type is the identifier type to use for this resource. + // +unionDiscriminator + // +required + Type NutanixIdentifierType `json:"type"` + + // uuid is the UUID of the resource in the PC. It cannot be empty if the type is UUID. + // +optional + UUID *string `json:"uuid,omitempty"` + + // name is the resource name in the PC. It cannot be empty if the type is Name. + // +optional + Name *string `json:"name,omitempty"` +} + +// NutanixPrismEndpoint holds the endpoint address and port to access the Nutanix Prism Central or Element (cluster) +type NutanixPrismEndpoint struct { + // address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + // +required + // +kubebuilder:validation:MaxLength=256 + Address string `json:"address"` + + // port is the port number to access the Nutanix Prism Central or Element (cluster) + // +required + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=65535 + Port int32 `json:"port"` +} + +// NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster) +type NutanixPrismElementEndpoint struct { + // name is the name of the Prism Element (cluster). This value will correspond with + // the cluster field configured on other resources (eg Machines, PVCs, etc). + // +required + // +kubebuilder:validation:MaxLength=256 + Name string `json:"name"` + + // endpoint holds the endpoint address and port data of the Prism Element (cluster). + // When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. + // Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the + // proxy spec.noProxy list. + // +required + Endpoint NutanixPrismEndpoint `json:"endpoint"` +} + +// NutanixPlatformStatus holds the current status of the Nutanix infrastructure provider. +type NutanixPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="apiServerInternalIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self == oldSelf || (size(self) == 2 && isIP(self[0]) && isIP(self[1]) ? ip(self[0]).family() != ip(self[1]).family() : true)",message="ingressIPs must contain at most one IPv4 address and at most one IPv6 address" + // +listType=set + IngressIPs []string `json:"ingressIPs"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *NutanixPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // InfrastructureList is +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type InfrastructureList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Infrastructure `json:"items"` } + +// IP is an IP address (for example, "10.0.0.0" or "fd00::"). +// +kubebuilder:validation:XValidation:rule="isIP(self)",message="value must be a valid IP address" +// +kubebuilder:validation:MaxLength:=39 +// +kubebuilder:validation:MinLength:=1 +type IP string + +// CIDR is an IP address range in CIDR notation (for example, "10.0.0.0/8" or "fd00::/8"). +// +kubebuilder:validation:XValidation:rule="isCIDR(self)",message="value must be a valid CIDR network address" +// +kubebuilder:validation:MaxLength:=43 +// +kubebuilder:validation:MinLength:=1 +type CIDR string diff --git a/vendor/github.com/openshift/api/config/v1/types_ingress.go b/vendor/github.com/openshift/api/config/v1/types_ingress.go index 9451adc278..f70fe8f440 100644 --- a/vendor/github.com/openshift/api/config/v1/types_ingress.go +++ b/vendor/github.com/openshift/api/config/v1/types_ingress.go @@ -10,12 +10,23 @@ import ( // Ingress holds cluster-wide information about ingress, including the default ingress domain // used for routes. The canonical name is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=ingresses,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Ingress struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec IngressSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -53,24 +64,153 @@ type IngressSpec struct { // .status.componentRoutes list, where participating operators write the status of // configurable routes. // +optional + // +listType=map + // +listMapKey=namespace + // +listMapKey=name ComponentRoutes []ComponentRouteSpec `json:"componentRoutes,omitempty"` + + // requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes + // matching the domainPattern/s and namespaceSelector/s that are specified in the policy. + // Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route + // annotation, and affect route admission. + // + // A candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: + // "haproxy.router.openshift.io/hsts_header" + // E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains + // + // - For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, + // then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route + // is rejected. + // - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies + // determines the route's admission status. + // - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, + // then it may use any HSTS Policy annotation. + // + // The HSTS policy configuration may be changed after routes have already been created. An update to a previously + // admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. + // However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working. + // + // Note that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid. + // +optional + RequiredHSTSPolicies []RequiredHSTSPolicy `json:"requiredHSTSPolicies,omitempty"` + + // loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure + // provider of the current cluster and are required for Ingress Controller to work on OpenShift. + // +optional + LoadBalancer LoadBalancer `json:"loadBalancer,omitempty"` +} + +// IngressPlatformSpec holds the desired state of Ingress specific to the underlying infrastructure provider +// of the current cluster. Since these are used at spec-level for the underlying cluster, it +// is supposed that only one of the spec structs is set. +// +union +type IngressPlatformSpec struct { + // type is the underlying infrastructure provider for the cluster. + // Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", + // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", + // "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, + // and must handle unrecognized platforms as None if they do not support that platform. + // + // +unionDiscriminator + Type PlatformType `json:"type"` + + // aws contains settings specific to the Amazon Web Services infrastructure provider. + // +optional + AWS *AWSIngressSpec `json:"aws,omitempty"` +} + +type LoadBalancer struct { + // platform holds configuration specific to the underlying + // infrastructure provider for the ingress load balancers. + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // +optional + Platform IngressPlatformSpec `json:"platform,omitempty"` +} + +// AWSIngressSpec holds the desired state of the Ingress for Amazon Web Services infrastructure provider. +// This only includes fields that can be modified in the cluster. +// +union +type AWSIngressSpec struct { + // type allows user to set a load balancer type. + // When this field is set the default ingresscontroller will get created using the specified LBType. + // If this field is not set then the default ingress controller of LBType Classic will be created. + // Valid values are: + // + // * "Classic": A Classic Load Balancer that makes routing decisions at either + // the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See + // the following for additional details: + // + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb + // + // * "NLB": A Network Load Balancer that makes routing decisions at the + // transport layer (TCP/SSL). See the following for additional details: + // + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb + // +unionDiscriminator + // +kubebuilder:validation:Enum:=NLB;Classic + // +required + Type AWSLBType `json:"type"` } +type AWSLBType string + +const ( + // NLB is the Network Load Balancer Type of AWS. Using NLB one can set NLB load balancer type for the default ingress controller. + NLB AWSLBType = "NLB" + + // Classic is the Classic Load Balancer Type of AWS. Using CLassic one can set Classic load balancer type for the default ingress controller. + Classic AWSLBType = "Classic" +) + // ConsumingUser is an alias for string which we add validation to. Currently only service accounts are supported. // +kubebuilder:validation:Pattern="^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$" // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=512 type ConsumingUser string -// Hostname is an alias for hostname string validation. -// +kubebuilder:validation:Format=hostname +// Hostname is a host name as defined by RFC-1123. +// + --- +// + The left operand of the | is the original kubebuilder hostname validation format, which is incorrect because it +// + allows upper case letters, disallows hyphen or number in the TLD, and allows labels to start/end in non-alphanumeric +// + characters. See https://bugzilla.redhat.com/show_bug.cgi?id=2039256. +// + ^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$ +// + +// + The right operand of the | is a new pattern that mimics the current API route admission validation on hostname, +// + except that it allows hostnames longer than the maximum length: +// + ^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ +// + +// + Both operand patterns are made available so that modifications on ingress spec can still happen after an invalid hostname +// + was saved via validation by the incorrect left operand of the | operator. +// + +// +kubebuilder:validation:Pattern=`^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$|^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$` type Hostname string type IngressStatus struct { // componentRoutes is where participating operators place the current route status for routes whose // hostnames and serving certificates can be customized by the cluster-admin. // +optional + // +listType=map + // +listMapKey=namespace + // +listMapKey=name ComponentRoutes []ComponentRouteStatus `json:"componentRoutes,omitempty"` + + // defaultPlacement is set at installation time to control which + // nodes will host the ingress router pods by default. The options are + // control-plane nodes or worker nodes. + // + // This field works by dictating how the Cluster Ingress Operator will + // consider unset replicas and nodePlacement fields in IngressController + // resources when creating the corresponding Deployments. + // + // See the documentation for the IngressController replicas and nodePlacement + // fields for more information. + // + // When omitted, the default value is Workers + // + // +kubebuilder:validation:Enum:="ControlPlane";"Workers";"" + // +optional + DefaultPlacement DefaultPlacement `json:"defaultPlacement"` } // ComponentRouteSpec allows for configuration of a route's hostname and serving certificate. @@ -82,7 +222,6 @@ type ComponentRouteSpec struct { // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=63 - // +kubebuilder:validation:Required // +required Namespace string `json:"namespace"` @@ -92,12 +231,10 @@ type ComponentRouteSpec struct { // entry in the list of status.componentRoutes if the route is to be customized. // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=256 - // +kubebuilder:validation:Required // +required Name string `json:"name"` // hostname is the hostname that should be used by the route. - // +kubebuilder:validation:Required // +required Hostname Hostname `json:"hostname"` @@ -119,7 +256,6 @@ type ComponentRouteStatus struct { // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=63 - // +kubebuilder:validation:Required // +required Namespace string `json:"namespace"` @@ -130,12 +266,10 @@ type ComponentRouteStatus struct { // entry in the list of spec.componentRoutes if the route is to be customized. // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=256 - // +kubebuilder:validation:Required // +required Name string `json:"name"` // defaultHostname is the hostname of this route prior to customization. - // +kubebuilder:validation:Required // +required DefaultHostname Hostname `json:"defaultHostname"` @@ -163,19 +297,36 @@ type ComponentRouteStatus struct { // // If Progressing is true, that means the component is taking some action related to the componentRoutes entry. // +optional + // +listType=map + // +listMapKey=type Conditions []metav1.Condition `json:"conditions,omitempty"` // relatedObjects is a list of resources which are useful when debugging or inspecting how spec.componentRoutes is applied. // +kubebuilder:validation:MinItems=1 - // +kubebuilder:validation:Required // +required RelatedObjects []ObjectReference `json:"relatedObjects"` } +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 type IngressList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Ingress `json:"items"` } + +// DefaultPlacement defines the default placement of ingress router pods. +type DefaultPlacement string + +const ( + // "Workers" is for having router pods placed on worker nodes by default. + DefaultPlacementWorkers DefaultPlacement = "Workers" + + // "ControlPlane" is for having router pods placed on control-plane nodes by default. + DefaultPlacementControlPlane DefaultPlacement = "ControlPlane" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_insights.go b/vendor/github.com/openshift/api/config/v1/types_insights.go new file mode 100644 index 0000000000..b0959881f1 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_insights.go @@ -0,0 +1,230 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// InsightsDataGather provides data gather configuration options for the Insights Operator. +// +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=insightsdatagathers,scope=Cluster +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/2448 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +openshift:enable:FeatureGate=InsightsConfig +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type InsightsDataGather struct { + metav1.TypeMeta `json:",inline"` + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + // spec holds user settable values for configuration + // +required + Spec InsightsDataGatherSpec `json:"spec,omitempty,omitzero"` +} + +// InsightsDataGatherSpec contains the configuration for the data gathering. +type InsightsDataGatherSpec struct { + // gatherConfig is a required spec attribute that includes all the configuration options related to gathering of the Insights data and its uploading to the ingress. + // +required + GatherConfig GatherConfig `json:"gatherConfig,omitempty,omitzero"` +} + +// GatherConfig provides data gathering configuration options. +type GatherConfig struct { + // dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. + // It may not exceed 2 items and must not contain duplicates. + // Valid values are ObfuscateNetworking and WorkloadNames. + // When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. + // When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. + // When omitted no obfuscation is applied. + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=2 + // +kubebuilder:validation:XValidation:rule="self.all(x, self.exists_one(y, x == y))",message="dataPolicy items must be unique" + // +listType=atomic + // +optional + DataPolicy []DataPolicyOption `json:"dataPolicy,omitempty"` + // gatherers is a required field that specifies the configuration of the gatherers. + // +required + Gatherers Gatherers `json:"gatherers,omitempty,omitzero"` + // storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. + // If omitted, the gathering job will use ephemeral storage. + // +optional + Storage Storage `json:"storage,omitempty,omitzero"` +} + +// Gatherers specifies the configuration of the gatherers +// +kubebuilder:validation:XValidation:rule="has(self.mode) && self.mode == 'Custom' ? has(self.custom) : !has(self.custom)",message="custom is required when mode is Custom, and forbidden otherwise" +// +union +type Gatherers struct { + // mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. + // When set to All, all gatherers will run and gather data. + // When set to None, all gatherers will be disabled and no data will be gathered. + // When set to Custom, the custom configuration from the custom field will be applied. + // +unionDiscriminator + // +required + Mode GatheringMode `json:"mode,omitempty"` + // custom provides gathering configuration. + // It is required when mode is Custom, and forbidden otherwise. + // Custom configuration allows user to disable only a subset of gatherers. + // Gatherers that are not explicitly disabled in custom configuration will run. + // +unionMember + // +optional + Custom Custom `json:"custom,omitempty,omitzero"` +} + +// Custom provides the custom configuration of gatherers +type Custom struct { + // configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. + // It may not exceed 100 items and each gatherer can be present only once. + // It is possible to disable an entire set of gatherers while allowing a specific function within that set. + // The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. + // Run the following command to get the names of last active gatherers: + // "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=100 + // +listType=map + // +listMapKey=name + // +required + Configs []GathererConfig `json:"configs,omitempty"` +} + +// GatheringMode defines the valid gathering modes. +// +kubebuilder:validation:Enum=All;None;Custom +type GatheringMode string + +const ( + // Enabled enables all gatherers + GatheringModeAll GatheringMode = "All" + // Disabled disables all gatherers + GatheringModeNone GatheringMode = "None" + // Custom applies the configuration from GatheringConfig. + GatheringModeCustom GatheringMode = "Custom" +) + +// DataPolicyOption declares valid data policy options +// +kubebuilder:validation:Enum=ObfuscateNetworking;WorkloadNames +type DataPolicyOption string + +const ( + // IP addresses and cluster domain name are obfuscated + DataPolicyOptionObfuscateNetworking DataPolicyOption = "ObfuscateNetworking" + // Data from Deployment Validation Operator are obfuscated + DataPolicyOptionObfuscateWorkloadNames DataPolicyOption = "WorkloadNames" +) + +// Storage provides persistent storage configuration options for gathering jobs. +// If the type is set to PersistentVolume, then the PersistentVolume must be defined. +// If the type is set to Ephemeral, then the PersistentVolume must not be defined. +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'PersistentVolume' ? has(self.persistentVolume) : !has(self.persistentVolume)",message="persistentVolume is required when type is PersistentVolume, and forbidden otherwise" +// +union +type Storage struct { + // type is a required field that specifies the type of storage that will be used to store the Insights data archive. + // Valid values are "PersistentVolume" and "Ephemeral". + // When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. + // When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field. + // +unionDiscriminator + // +required + Type StorageType `json:"type,omitempty"` + // persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. + // The PersistentVolume must be created in the openshift-insights namespace. + // +unionMember + // +optional + PersistentVolume PersistentVolumeConfig `json:"persistentVolume,omitempty,omitzero"` +} + +// StorageType declares valid storage types +// +kubebuilder:validation:Enum=PersistentVolume;Ephemeral +type StorageType string + +const ( + // StorageTypePersistentVolume storage type + StorageTypePersistentVolume StorageType = "PersistentVolume" + // StorageTypeEphemeral storage type + StorageTypeEphemeral StorageType = "Ephemeral" +) + +// PersistentVolumeConfig provides configuration options for PersistentVolume storage. +type PersistentVolumeConfig struct { + // claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. + // The PersistentVolumeClaim must be created in the openshift-insights namespace. + // +required + Claim PersistentVolumeClaimReference `json:"claim,omitempty,omitzero"` + // mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. + // When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. + // The current default mount path is /var/lib/insights-operator + // The path may not exceed 1024 characters and must not contain a colon. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=1024 + // +kubebuilder:validation:XValidation:rule="!self.contains(':')",message="mountPath must not contain a colon" + // +optional + MountPath string `json:"mountPath,omitempty"` +} + +// PersistentVolumeClaimReference is a reference to a PersistentVolumeClaim. +type PersistentVolumeClaimReference struct { + // name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. + // It is a string that follows the DNS1123 subdomain format. + // It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character. + // +kubebuilder:validation:XValidation:rule="!format.dns1123Subdomain().validate(self).hasValue()",message="a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character." + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=253 + // +required + Name string `json:"name,omitempty"` +} + +// GathererConfig allows to configure specific gatherers +type GathererConfig struct { + // name is the required name of a specific gatherer. + // It may not exceed 256 characters. + // The format for a gatherer name is: {gatherer}/{function} where the function is optional. + // Gatherer consists of a lowercase letters only that may include underscores (_). + // Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). + // The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. + // Run the following command to get the names of last active gatherers: + // "oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'" + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:XValidation:rule=`self.matches("^[a-z]+[_a-z]*[a-z]([/a-z][_a-z]*)?[a-z]$")`,message=`gatherer name must be in the format of {gatherer}/{function} where the gatherer and function are lowercase letters only that may include underscores (_) and are separated by a forward slash (/) if the function is provided` + // +required + Name string `json:"name,omitempty"` + // state is a required field that allows you to configure specific gatherer. Valid values are "Enabled" and "Disabled". + // When set to Enabled the gatherer will run. + // When set to Disabled the gatherer will not run. + // +required + State GathererState `json:"state,omitempty"` +} + +// GathererState declares valid gatherer state types. +// +kubebuilder:validation:Enum=Enabled;Disabled +type GathererState string + +const ( + // GathererStateEnabled gatherer state, which means that the gatherer will run. + GathererStateEnabled GathererState = "Enabled" + // GathererStateDisabled gatherer state, which means that the gatherer will not run. + GathererStateDisabled GathererState = "Disabled" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// InsightsDataGatherList is a collection of items +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type InsightsDataGatherList struct { + metav1.TypeMeta `json:",inline"` + // metadata is the required standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +required + metav1.ListMeta `json:"metadata,omitempty"` + // items is the required list of InsightsDataGather objects + // it may not exceed 100 items + // +kubebuilder:validation:MinItems=0 + // +kubebuilder:validation:MaxItems=100 + // +required + Items []InsightsDataGather `json:"items,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_kmsencryption.go b/vendor/github.com/openshift/api/config/v1/types_kmsencryption.go new file mode 100644 index 0000000000..3293204fa4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_kmsencryption.go @@ -0,0 +1,55 @@ +package v1 + +// KMSConfig defines the configuration for the KMS instance +// that will be used with KMSEncryptionProvider encryption +// +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'AWS' ? has(self.aws) : !has(self.aws)",message="aws config is required when kms provider type is AWS, and forbidden otherwise" +// +union +type KMSConfig struct { + // type defines the kind of platform for the KMS provider. + // Available provider types are AWS only. + // + // +unionDiscriminator + // +required + Type KMSProviderType `json:"type"` + + // aws defines the key config for using an AWS KMS instance + // for the encryption. The AWS KMS instance is managed + // by the user outside the purview of the control plane. + // + // +unionMember + // +optional + AWS *AWSKMSConfig `json:"aws,omitempty"` +} + +// AWSKMSConfig defines the KMS config specific to AWS KMS provider +type AWSKMSConfig struct { + // keyARN specifies the Amazon Resource Name (ARN) of the AWS KMS key used for encryption. + // The value must adhere to the format `arn:aws:kms:::key/`, where: + // - `` is the AWS region consisting of lowercase letters and hyphens followed by a number. + // - `` is a 12-digit numeric identifier for the AWS account. + // - `` is a unique identifier for the KMS key, consisting of lowercase hexadecimal characters and hyphens. + // + // +kubebuilder:validation:MaxLength=128 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:XValidation:rule="self.matches('^arn:aws:kms:[a-z0-9-]+:[0-9]{12}:key/[a-f0-9-]+$')",message="keyARN must follow the format `arn:aws:kms:::key/`. The account ID must be a 12 digit number and the region and key ID should consist only of lowercase hexadecimal characters and hyphens (-)." + // +required + KeyARN string `json:"keyARN"` + // region specifies the AWS region where the KMS instance exists, and follows the format + // `--`, e.g.: `us-east-1`. + // Only lowercase letters and hyphens followed by numbers are allowed. + // + // +kubebuilder:validation:MaxLength=64 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:XValidation:rule="self.matches('^[a-z0-9]+(-[a-z0-9]+)*$')",message="region must be a valid AWS region, consisting of lowercase characters, digits and hyphens (-) only." + // +required + Region string `json:"region"` +} + +// KMSProviderType is a specific supported KMS provider +// +kubebuilder:validation:Enum=AWS +type KMSProviderType string + +const ( + // AWSKMSProvider represents a supported KMS provider for use with AWS KMS + AWSKMSProvider KMSProviderType = "AWS" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_network.go b/vendor/github.com/openshift/api/config/v1/types_network.go index ebfdf01626..c0d1602b37 100644 --- a/vendor/github.com/openshift/api/config/v1/types_network.go +++ b/vendor/github.com/openshift/api/config/v1/types_network.go @@ -1,6 +1,9 @@ package v1 -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) // +genclient // +genclient:nonNamespaced @@ -8,15 +11,25 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. // Please view network.spec for an explanation on what applies when configuring this resource. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:compatibility-gen:level=1 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=networks,scope=Cluster +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Network struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration. // As a general rule, this SHOULD NOT be read directly. Instead, you should // consume the NetworkStatus, as it indicates the currently deployed configuration. // Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. - // +kubebuilder:validation:Required // +required Spec NetworkSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -28,21 +41,24 @@ type Network struct { // As a general rule, this SHOULD NOT be read directly. Instead, you should // consume the NetworkStatus, as it indicates the currently deployed configuration. // Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. +// +openshift:validation:FeatureGateAwareXValidation:featureGate=NetworkDiagnosticsConfig,rule="!has(self.networkDiagnostics) || !has(self.networkDiagnostics.mode) || self.networkDiagnostics.mode!='Disabled' || !has(self.networkDiagnostics.sourcePlacement) && !has(self.networkDiagnostics.targetPlacement)",message="cannot set networkDiagnostics.sourcePlacement and networkDiagnostics.targetPlacement when networkDiagnostics.mode is Disabled" type NetworkSpec struct { // IP address pool to use for pod IPs. // This field is immutable after installation. + // +listType=atomic ClusterNetwork []ClusterNetworkEntry `json:"clusterNetwork"` // IP address pool for services. // Currently, we only support a single entry here. // This field is immutable after installation. + // +listType=atomic ServiceNetwork []string `json:"serviceNetwork"` - // NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). + // networkType is the plugin that is to be deployed (e.g. OVNKubernetes). // This should match a value that the cluster-network-operator understands, // or else no networking will be installed. // Currently supported values are: - // - OpenShiftSDN + // - OVNKubernetes // This field is immutable after installation. NetworkType string `json:"networkType"` @@ -60,25 +76,51 @@ type NetworkSpec struct { // installed. // +kubebuilder:validation:Pattern=`^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$` ServiceNodePortRange string `json:"serviceNodePortRange,omitempty"` + + // networkDiagnostics defines network diagnostics configuration. + // + // Takes precedence over spec.disableNetworkDiagnostics in network.operator.openshift.io. + // If networkDiagnostics is not specified or is empty, + // and the spec.disableNetworkDiagnostics flag in network.operator.openshift.io is set to true, + // the network diagnostics feature will be disabled. + // + // +optional + // +openshift:enable:FeatureGate=NetworkDiagnosticsConfig + NetworkDiagnostics NetworkDiagnostics `json:"networkDiagnostics"` } // NetworkStatus is the current network configuration. type NetworkStatus struct { // IP address pool to use for pod IPs. + // +listType=atomic + // +optional ClusterNetwork []ClusterNetworkEntry `json:"clusterNetwork,omitempty"` // IP address pool for services. // Currently, we only support a single entry here. + // +listType=atomic + // +optional ServiceNetwork []string `json:"serviceNetwork,omitempty"` - // NetworkType is the plugin that is deployed (e.g. OpenShiftSDN). + // networkType is the plugin that is deployed (e.g. OVNKubernetes). + // +optional NetworkType string `json:"networkType,omitempty"` - // ClusterNetworkMTU is the MTU for inter-pod networking. + // clusterNetworkMTU is the MTU for inter-pod networking. + // +optional ClusterNetworkMTU int `json:"clusterNetworkMTU,omitempty"` - // Migration contains the cluster network migration configuration. + // migration contains the cluster network migration configuration. + // +optional Migration *NetworkMigration `json:"migration,omitempty"` + + // conditions represents the observations of a network.config current state. + // Known .status.conditions.type are: "NetworkDiagnosticsAvailable" + // +optional + // +listType=map + // +listMapKey=type + // +openshift:enable:FeatureGate=NetworkDiagnosticsConfig + Conditions []metav1.Condition `json:"conditions,omitempty"` } // ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs @@ -110,6 +152,7 @@ type ExternalIPConfig struct { // ExternalIPPolicy rules. // Currently, only one entry may be provided. // +optional + // +listType=atomic AutoAssignCIDRs []string `json:"autoAssignCIDRs,omitempty"` } @@ -118,27 +161,148 @@ type ExternalIPConfig struct { // The policy controller always allows automatically assigned external IPs. type ExternalIPPolicy struct { // allowedCIDRs is the list of allowed CIDRs. + // +listType=atomic AllowedCIDRs []string `json:"allowedCIDRs,omitempty"` // rejectedCIDRs is the list of disallowed CIDRs. These take precedence // over allowedCIDRs. // +optional + // +listType=atomic RejectedCIDRs []string `json:"rejectedCIDRs,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type NetworkList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Network `json:"items"` } -// NetworkMigration represents the cluster network configuration. +// NetworkMigration represents the network migration status. type NetworkMigration struct { - // NetworkType is the target plugin that is to be deployed. - // Currently supported values are: OpenShiftSDN, OVNKubernetes - // +kubebuilder:validation:Enum={"OpenShiftSDN","OVNKubernetes"} - NetworkType string `json:"networkType"` + // networkType is the target plugin that is being deployed. + // DEPRECATED: network type migration is no longer supported, + // so this should always be unset. + // +optional + NetworkType string `json:"networkType,omitempty"` + + // mtu is the MTU configuration that is being deployed. + // +optional + MTU *MTUMigration `json:"mtu,omitempty"` +} + +// MTUMigration contains infomation about MTU migration. +type MTUMigration struct { + // network contains MTU migration configuration for the default network. + // +optional + Network *MTUMigrationValues `json:"network,omitempty"` + + // machine contains MTU migration configuration for the machine's uplink. + // +optional + Machine *MTUMigrationValues `json:"machine,omitempty"` +} + +// MTUMigrationValues contains the values for a MTU migration. +type MTUMigrationValues struct { + // to is the MTU to migrate to. + // +kubebuilder:validation:Minimum=0 + To *uint32 `json:"to"` + + // from is the MTU to migrate from. + // +kubebuilder:validation:Minimum=0 + // +optional + From *uint32 `json:"from,omitempty"` +} + +// NetworkDiagnosticsMode is an enumeration of the available network diagnostics modes +// Valid values are "", "All", "Disabled". +// +kubebuilder:validation:Enum:="";All;Disabled +type NetworkDiagnosticsMode string + +const ( + // NetworkDiagnosticsNoOpinion means that the user has no opinion and the platform is left + // to choose reasonable default. The current default is All and is a subject to change over time. + NetworkDiagnosticsNoOpinion NetworkDiagnosticsMode = "" + // NetworkDiagnosticsAll means that all network diagnostics checks are enabled + NetworkDiagnosticsAll NetworkDiagnosticsMode = "All" + // NetworkDiagnosticsDisabled means that network diagnostics is disabled + NetworkDiagnosticsDisabled NetworkDiagnosticsMode = "Disabled" +) + +// NetworkDiagnostics defines network diagnostics configuration + +type NetworkDiagnostics struct { + // mode controls the network diagnostics mode + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is All. + // + // +optional + Mode NetworkDiagnosticsMode `json:"mode"` + + // sourcePlacement controls the scheduling of network diagnostics source deployment + // + // See NetworkDiagnosticsSourcePlacement for more details about default values. + // + // +optional + SourcePlacement NetworkDiagnosticsSourcePlacement `json:"sourcePlacement"` + + // targetPlacement controls the scheduling of network diagnostics target daemonset + // + // See NetworkDiagnosticsTargetPlacement for more details about default values. + // + // +optional + TargetPlacement NetworkDiagnosticsTargetPlacement `json:"targetPlacement"` +} + +// NetworkDiagnosticsSourcePlacement defines node scheduling configuration network diagnostics source components +type NetworkDiagnosticsSourcePlacement struct { + // nodeSelector is the node selector applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is `kubernetes.io/os: linux`. + // + // +optional + NodeSelector map[string]string `json:"nodeSelector"` + + // tolerations is a list of tolerations applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is an empty list. + // + // +optional + // +listType=atomic + Tolerations []corev1.Toleration `json:"tolerations"` +} + +// NetworkDiagnosticsTargetPlacement defines node scheduling configuration network diagnostics target components +type NetworkDiagnosticsTargetPlacement struct { + // nodeSelector is the node selector applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is `kubernetes.io/os: linux`. + // + // +optional + NodeSelector map[string]string `json:"nodeSelector"` + + // tolerations is a list of tolerations applied to network diagnostics components + // + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // The current default is `- operator: "Exists"` which means that all taints are tolerated. + // + // +optional + // +listType=atomic + Tolerations []corev1.Toleration `json:"tolerations"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_node.go b/vendor/github.com/openshift/api/config/v1/types_node.go new file mode 100644 index 0000000000..1282f33158 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_node.go @@ -0,0 +1,142 @@ +package v1 + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Node holds cluster-wide information about node specific features. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/1107 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=nodes,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true +type Node struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +required + Spec NodeSpec `json:"spec"` + + // status holds observed values. + // +optional + Status NodeStatus `json:"status"` +} + +type NodeSpec struct { + // cgroupMode determines the cgroups version on the node + // +optional + CgroupMode CgroupMode `json:"cgroupMode,omitempty"` + + // workerLatencyProfile determins the how fast the kubelet is updating + // the status and corresponding reaction of the cluster + // +optional + WorkerLatencyProfile WorkerLatencyProfileType `json:"workerLatencyProfile,omitempty"` + + // minimumKubeletVersion is the lowest version of a kubelet that can join the cluster. + // Specifically, the apiserver will deny most authorization requests of kubelets that are older + // than the specified version, only allowing the kubelet to get and update its node object, and perform + // subjectaccessreviews. + // This means any kubelet that attempts to join the cluster will not be able to run any assigned workloads, + // and will eventually be marked as not ready. + // Its max length is 8, so maximum version allowed is either "9.999.99" or "99.99.99". + // Since the kubelet reports the version of the kubernetes release, not Openshift, this field references + // the underlying kubernetes version this version of Openshift is based off of. + // In other words: if an admin wishes to ensure no nodes run an older version than Openshift 4.17, then + // they should set the minimumKubeletVersion to 1.30.0. + // When comparing versions, the kubelet's version is stripped of any contents outside of major.minor.patch version. + // Thus, a kubelet with version "1.0.0-ec.0" will be compatible with minimumKubeletVersion "1.0.0" or earlier. + // +kubebuilder:validation:XValidation:rule="self == \"\" || self.matches('^[0-9]*.[0-9]*.[0-9]*$')",message="minmumKubeletVersion must be in a semver compatible format of x.y.z, or empty" + // +kubebuilder:validation:MaxLength:=8 + // +openshift:enable:FeatureGate=MinimumKubeletVersion + // +optional + MinimumKubeletVersion string `json:"minimumKubeletVersion"` +} + +type NodeStatus struct { + // conditions contain the details and the current state of the nodes.config object + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` +} + +// +kubebuilder:validation:Enum=v2;"" +type CgroupMode string + +const ( + CgroupModeEmpty CgroupMode = "" // Empty string indicates to honor user set value on the system that should not be overridden by OpenShift + CgroupModeV1 CgroupMode = "v1" + CgroupModeV2 CgroupMode = "v2" + CgroupModeDefault CgroupMode = CgroupModeV2 +) + +// +kubebuilder:validation:Enum=Default;MediumUpdateAverageReaction;LowUpdateSlowReaction +type WorkerLatencyProfileType string + +const ( + // Medium Kubelet Update Frequency (heart-beat) and Average Reaction Time to unresponsive Node + MediumUpdateAverageReaction WorkerLatencyProfileType = "MediumUpdateAverageReaction" + + // Low Kubelet Update Frequency (heart-beat) and Slow Reaction Time to unresponsive Node + LowUpdateSlowReaction WorkerLatencyProfileType = "LowUpdateSlowReaction" + + // Default values of relavent Kubelet, Kube Controller Manager and Kube API Server + DefaultUpdateDefaultReaction WorkerLatencyProfileType = "Default" +) + +const ( + // DefaultNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNodeStatusUpdateFrequency = 10 * time.Second + // DefaultNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNodeMonitorGracePeriod = 40 * time.Second + // DefaultNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNotReadyTolerationSeconds = 300 + // DefaultUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultUnreachableTolerationSeconds = 300 + + // MediumNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNodeStatusUpdateFrequency = 20 * time.Second + // MediumNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNodeMonitorGracePeriod = 2 * time.Minute + // MediumNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNotReadyTolerationSeconds = 60 + // MediumUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumUnreachableTolerationSeconds = 60 + + // LowNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNodeStatusUpdateFrequency = 1 * time.Minute + // LowNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNodeMonitorGracePeriod = 5 * time.Minute + // LowNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNotReadyTolerationSeconds = 60 + // LowUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowUnreachableTolerationSeconds = 60 +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type NodeList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Node `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_oauth.go b/vendor/github.com/openshift/api/config/v1/types_oauth.go index fcbd191aa6..20845e4dbe 100644 --- a/vendor/github.com/openshift/api/config/v1/types_oauth.go +++ b/vendor/github.com/openshift/api/config/v1/types_oauth.go @@ -11,11 +11,22 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. // It is used to configure the integrated OAuth server. // This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=oauths,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type OAuth struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec OAuthSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -28,6 +39,7 @@ type OAuthSpec struct { // identityProviders is an ordered list of ways for a user to identify themselves. // When this list is empty, no identities are provisioned for users. // +optional + // +listType=atomic IdentityProviders []IdentityProvider `json:"identityProviders,omitempty"` // tokenConfig contains options for authorization and access tokens @@ -63,6 +75,8 @@ type TokenConfig struct { // per client, then that value takes precedence. If the timeout value is // not specified and the client does not override the value, then tokens // are valid until their lifetime. + // + // WARNING: existing tokens' timeout will not be affected (lowered) by changing this value // +optional AccessTokenInactivityTimeout *metav1.Duration `json:"accessTokenInactivityTimeout,omitempty"` } @@ -527,35 +541,56 @@ type OpenIDIdentityProvider struct { // UserIDClaim is the claim used to provide a stable identifier for OIDC identities. // Per http://openid.net/specs/openid-connect-core-1_0.html#ClaimStability -// "The sub (subject) and iss (issuer) Claims, used together, are the only Claims that an RP can -// rely upon as a stable identifier for the End-User, since the sub Claim MUST be locally unique -// and never reassigned within the Issuer for a particular End-User, as described in Section 2. -// Therefore, the only guaranteed unique identifier for a given End-User is the combination of the -// iss Claim and the sub Claim." +// +// "The sub (subject) and iss (issuer) Claims, used together, are the only Claims that an RP can +// rely upon as a stable identifier for the End-User, since the sub Claim MUST be locally unique +// and never reassigned within the Issuer for a particular End-User, as described in Section 2. +// Therefore, the only guaranteed unique identifier for a given End-User is the combination of the +// iss Claim and the sub Claim." const UserIDClaim = "sub" +// OpenIDClaim represents a claim retrieved from an OpenID provider's tokens or userInfo +// responses +// +kubebuilder:validation:MinLength=1 +type OpenIDClaim string + // OpenIDClaims contains a list of OpenID claims to use when authenticating with an OpenID identity provider type OpenIDClaims struct { // preferredUsername is the list of claims whose values should be used as the preferred username. // If unspecified, the preferred username is determined from the value of the sub claim + // +listType=atomic // +optional PreferredUsername []string `json:"preferredUsername,omitempty"` // name is the list of claims whose values should be used as the display name. Optional. // If unspecified, no display name is set for the identity + // +listType=atomic // +optional Name []string `json:"name,omitempty"` // email is the list of claims whose values should be used as the email address. Optional. // If unspecified, no email is set for the identity + // +listType=atomic // +optional Email []string `json:"email,omitempty"` + + // groups is the list of claims value of which should be used to synchronize groups + // from the OIDC provider to OpenShift for the user. + // If multiple claims are specified, the first one with a non-empty value is used. + // +listType=atomic + // +optional + Groups []OpenIDClaim `json:"groups,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type OAuthList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []OAuth `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_operatorhub.go b/vendor/github.com/openshift/api/config/v1/types_operatorhub.go index 1b2b7f82e9..a4971a20c5 100644 --- a/vendor/github.com/openshift/api/config/v1/types_operatorhub.go +++ b/vendor/github.com/openshift/api/config/v1/types_operatorhub.go @@ -28,6 +28,7 @@ type OperatorHubSpec struct { type OperatorHubStatus struct { // sources encapsulates the result of applying the configuration for each // hub source + // +optional Sources []HubSourceStatus `json:"sources,omitempty"` } @@ -36,11 +37,22 @@ type OperatorHubStatus struct { // OperatorHub is the Schema for the operatorhubs API. It can be used to change // the state of the default hub sources for OperatorHub on the cluster from // enabled to disabled and vice versa. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=operatorhubs,scope=Cluster // +kubebuilder:subresource:status // +genclient // +genclient:nonNamespaced +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_03,operatorName=marketplace,operatorOrdering=01 +// +openshift:capability=marketplace +// +openshift:compatibility-gen:level=1 type OperatorHub struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata"` Spec OperatorHubSpec `json:"spec"` @@ -50,8 +62,14 @@ type OperatorHub struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // OperatorHubList contains a list of OperatorHub +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type OperatorHubList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []OperatorHub `json:"items"` } diff --git a/vendor/github.com/openshift/api/config/v1/types_project.go b/vendor/github.com/openshift/api/config/v1/types_project.go index 244ce3ef8f..3d219862be 100644 --- a/vendor/github.com/openshift/api/config/v1/types_project.go +++ b/vendor/github.com/openshift/api/config/v1/types_project.go @@ -7,12 +7,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Project holds cluster-wide information about Project. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=projects,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Project struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec ProjectSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -46,8 +57,13 @@ type ProjectStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ProjectList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Project `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_proxy.go b/vendor/github.com/openshift/api/config/v1/types_proxy.go index 211e501e08..ed40176ce3 100644 --- a/vendor/github.com/openshift/api/config/v1/types_proxy.go +++ b/vendor/github.com/openshift/api/config/v1/types_proxy.go @@ -9,12 +9,23 @@ import ( // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_03,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=proxies,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Proxy struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` - // Spec holds user-settable values for the proxy configuration - // +kubebuilder:validation:Required + // spec holds user-settable values for the proxy configuration // +required Spec ProxySpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -32,7 +43,7 @@ type ProxySpec struct { // +optional HTTPSProxy string `json:"httpsProxy,omitempty"` - // noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used. + // noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. // Empty means unset and will not result in an env var. // +optional NoProxy string `json:"noProxy,omitempty"` @@ -86,8 +97,13 @@ type ProxyStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type ProxyList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Proxy `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_scheduling.go b/vendor/github.com/openshift/api/config/v1/types_scheduling.go index 570f8affce..c90d5633f6 100644 --- a/vendor/github.com/openshift/api/config/v1/types_scheduling.go +++ b/vendor/github.com/openshift/api/config/v1/types_scheduling.go @@ -8,12 +8,23 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // Scheduler holds cluster-wide config information to run the Kubernetes Scheduler // and influence its placement decisions. The canonical name for this config is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +openshift:api-approved.openshift.io=https://github.com/openshift/api/pull/470 +// +openshift:file-pattern=cvoRunLevel=0000_10,operatorName=config-operator,operatorOrdering=01 +// +kubebuilder:object:root=true +// +kubebuilder:resource:path=schedulers,scope=Cluster +// +kubebuilder:subresource:status +// +kubebuilder:metadata:annotations=release.openshift.io/bootstrap-required=true type Scheduler struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty"` // spec holds user settable values for configuration - // +kubebuilder:validation:Required // +required Spec SchedulerSpec `json:"spec"` // status holds observed values from the cluster. They may not be overridden. @@ -36,6 +47,10 @@ type SchedulerSpec struct { // Defaults to "LowNodeUtilization" // +optional Profile SchedulerProfile `json:"profile,omitempty"` + // profileCustomizations contains configuration for modifying the default behavior of existing scheduler profiles. + // +openshift:enable:FeatureGate=DynamicResourceAllocation + // +optional + ProfileCustomizations ProfileCustomizations `json:"profileCustomizations"` // defaultNodeSelector helps set the cluster-wide default node selector to // restrict pod placement to specific nodes. This is applied to the pods // created in all namespaces and creates an intersection with any existing @@ -58,7 +73,7 @@ type SchedulerSpec struct { // would not be applied. // +optional DefaultNodeSelector string `json:"defaultNodeSelector,omitempty"` - // MastersSchedulable allows masters nodes to be schedulable. When this flag is + // mastersSchedulable allows masters nodes to be schedulable. When this flag is // turned on, all the master nodes in the cluster will be made schedulable, // so that workload pods can run on them. The default value for this field is false, // meaning none of the master nodes are schedulable. @@ -87,13 +102,42 @@ var ( NoScoring SchedulerProfile = "NoScoring" ) +// ProfileCustomizations contains various parameters for modifying the default behavior of certain profiles +type ProfileCustomizations struct { + // dynamicResourceAllocation allows to enable or disable dynamic resource allocation within the scheduler. + // Dynamic resource allocation is an API for requesting and sharing resources between pods and containers inside a pod. + // Third-party resource drivers are responsible for tracking and allocating resources. + // Different kinds of resources support arbitrary parameters for defining requirements and initialization. + // Valid values are Enabled, Disabled and omitted. + // When omitted, this means no opinion and the platform is left to choose a reasonable default, + // which is subject to change over time. + // The current default is Disabled. + // +optional + DynamicResourceAllocation DRAEnablement `json:"dynamicResourceAllocation"` +} + +// +kubebuilder:validation:Enum:="";"Enabled";"Disabled" +type DRAEnablement string + +var ( + // DRAEnablementEnabled enables dynamic resource allocation feature + DRAEnablementEnabled DRAEnablement = "Enabled" + // DRAEnablementDisabled disables dynamic resource allocation feature + DRAEnablementDisabled DRAEnablement = "Disabled" +) + type SchedulerStatus struct { } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type SchedulerList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata"` Items []Scheduler `json:"items"` diff --git a/vendor/github.com/openshift/api/config/v1/types_testreporting.go b/vendor/github.com/openshift/api/config/v1/types_testreporting.go new file mode 100644 index 0000000000..00953957f4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_testreporting.go @@ -0,0 +1,45 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// TestReporting is used for origin (and potentially others) to report the test names for a given FeatureGate into +// the payload for later analysis on a per-payload basis. +// This doesn't need any CRD because it's never stored in the cluster. +// +// Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support. +// +openshift:compatibility-gen:internal +type TestReporting struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // +required + Spec TestReportingSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status TestReportingStatus `json:"status"` +} + +type TestReportingSpec struct { + // testsForFeatureGates is a list, indexed by FeatureGate and includes information about testing. + TestsForFeatureGates []FeatureGateTests `json:"testsForFeatureGates"` +} + +type FeatureGateTests struct { + // featureGate is the name of the FeatureGate as it appears in The FeatureGate CR instance. + FeatureGate string `json:"featureGate"` + + // tests contains an item for every TestName + Tests []TestDetails `json:"tests"` +} + +type TestDetails struct { + // testName is the name of the test as it appears in junit XMLs. + // It does not include the suite name since the same test can be executed in many suites. + TestName string `json:"testName"` +} + +type TestReportingStatus struct { +} diff --git a/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go b/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go index 9dbacb9966..b18ef647c2 100644 --- a/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go +++ b/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go @@ -27,36 +27,66 @@ type TLSSecurityProfile struct { // and looks like this (yaml): // // ciphers: + // // - TLS_AES_128_GCM_SHA256 + // // - TLS_AES_256_GCM_SHA384 + // // - TLS_CHACHA20_POLY1305_SHA256 + // // - ECDHE-ECDSA-AES128-GCM-SHA256 + // // - ECDHE-RSA-AES128-GCM-SHA256 + // // - ECDHE-ECDSA-AES256-GCM-SHA384 + // // - ECDHE-RSA-AES256-GCM-SHA384 + // // - ECDHE-ECDSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-CHACHA20-POLY1305 + // // - DHE-RSA-AES128-GCM-SHA256 + // // - DHE-RSA-AES256-GCM-SHA384 + // // - DHE-RSA-CHACHA20-POLY1305 + // // - ECDHE-ECDSA-AES128-SHA256 + // // - ECDHE-RSA-AES128-SHA256 + // // - ECDHE-ECDSA-AES128-SHA + // // - ECDHE-RSA-AES128-SHA + // // - ECDHE-ECDSA-AES256-SHA384 + // // - ECDHE-RSA-AES256-SHA384 + // // - ECDHE-ECDSA-AES256-SHA + // // - ECDHE-RSA-AES256-SHA + // // - DHE-RSA-AES128-SHA256 + // // - DHE-RSA-AES256-SHA256 + // // - AES128-GCM-SHA256 + // // - AES256-GCM-SHA384 + // // - AES128-SHA256 + // // - AES256-SHA256 + // // - AES128-SHA + // // - AES256-SHA + // // - DES-CBC3-SHA - // minTLSVersion: TLSv1.0 + // + // minTLSVersion: VersionTLS10 // // +optional // +nullable @@ -68,18 +98,30 @@ type TLSSecurityProfile struct { // and looks like this (yaml): // // ciphers: + // // - TLS_AES_128_GCM_SHA256 + // // - TLS_AES_256_GCM_SHA384 + // // - TLS_CHACHA20_POLY1305_SHA256 + // // - ECDHE-ECDSA-AES128-GCM-SHA256 + // // - ECDHE-RSA-AES128-GCM-SHA256 + // // - ECDHE-ECDSA-AES256-GCM-SHA384 + // // - ECDHE-RSA-AES256-GCM-SHA384 + // // - ECDHE-ECDSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-CHACHA20-POLY1305 + // // - DHE-RSA-AES128-GCM-SHA256 + // // - DHE-RSA-AES256-GCM-SHA384 - // minTLSVersion: TLSv1.2 + // + // minTLSVersion: VersionTLS12 // // +optional // +nullable @@ -91,12 +133,14 @@ type TLSSecurityProfile struct { // and looks like this (yaml): // // ciphers: + // // - TLS_AES_128_GCM_SHA256 + // // - TLS_AES_256_GCM_SHA384 + // // - TLS_CHACHA20_POLY1305_SHA256 - // minTLSVersion: TLSv1.3 // - // NOTE: Currently unsupported. + // minTLSVersion: VersionTLS13 // // +optional // +nullable @@ -106,11 +150,16 @@ type TLSSecurityProfile struct { // looks like this: // // ciphers: + // // - ECDHE-ECDSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-CHACHA20-POLY1305 + // // - ECDHE-RSA-AES128-GCM-SHA256 + // // - ECDHE-ECDSA-AES128-GCM-SHA256 - // minTLSVersion: TLSv1.1 + // + // minTLSVersion: VersionTLS11 // // +optional // +nullable @@ -162,12 +211,13 @@ type TLSProfileSpec struct { // ciphers: // - DES-CBC3-SHA // + // +listType=atomic Ciphers []string `json:"ciphers"` // minTLSVersion is used to specify the minimal version of the TLS protocol // that is negotiated during the TLS handshake. For example, to use TLS // versions 1.1, 1.2 and 1.3 (yaml): // - // minTLSVersion: TLSv1.1 + // minTLSVersion: VersionTLS11 // // NOTE: currently the highest minTLSVersion allowed is VersionTLS12 // @@ -177,7 +227,7 @@ type TLSProfileSpec struct { // TLSProtocolVersion is a way to specify the protocol version used for TLS connections. // Protocol versions are based on the following most common TLS configurations: // -// https://ssl-config.mozilla.org/ +// https://ssl-config.mozilla.org/ // // Note that SSLv3.0 is not a supported protocol version due to well known // vulnerabilities such as POODLE: https://en.wikipedia.org/wiki/POODLE diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go index cb933dac08..0863934f22 100644 --- a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go @@ -1,6 +1,7 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated -// Code generated by deepcopy-gen. DO NOT EDIT. +// Code generated by codegen. DO NOT EDIT. package v1 @@ -41,6 +42,11 @@ func (in *APIServer) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *APIServerEncryption) DeepCopyInto(out *APIServerEncryption) { *out = *in + if in.KMS != nil { + in, out := &in.KMS, &out.KMS + *out = new(KMSConfig) + (*in).DeepCopyInto(*out) + } return } @@ -142,13 +148,13 @@ func (in *APIServerSpec) DeepCopyInto(out *APIServerSpec) { *out = make([]string, len(*in)) copy(*out, *in) } - out.Encryption = in.Encryption + in.Encryption.DeepCopyInto(&out.Encryption) if in.TLSSecurityProfile != nil { in, out := &in.TLSSecurityProfile, &out.TLSSecurityProfile *out = new(TLSSecurityProfile) (*in).DeepCopyInto(*out) } - out.Audit = in.Audit + in.Audit.DeepCopyInto(&out.Audit) return } @@ -178,6 +184,54 @@ func (in *APIServerStatus) DeepCopy() *APIServerStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSDNSSpec) DeepCopyInto(out *AWSDNSSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSDNSSpec. +func (in *AWSDNSSpec) DeepCopy() *AWSDNSSpec { + if in == nil { + return nil + } + out := new(AWSDNSSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSIngressSpec) DeepCopyInto(out *AWSIngressSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSIngressSpec. +func (in *AWSIngressSpec) DeepCopy() *AWSIngressSpec { + if in == nil { + return nil + } + out := new(AWSIngressSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSKMSConfig) DeepCopyInto(out *AWSKMSConfig) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSKMSConfig. +func (in *AWSKMSConfig) DeepCopy() *AWSKMSConfig { + if in == nil { + return nil + } + out := new(AWSKMSConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AWSPlatformSpec) DeepCopyInto(out *AWSPlatformSpec) { *out = *in @@ -212,6 +266,11 @@ func (in *AWSPlatformStatus) DeepCopyInto(out *AWSPlatformStatus) { *out = make([]AWSResourceTag, len(*in)) copy(*out, *in) } + if in.CloudLoadBalancerConfig != nil { + in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig + *out = new(CloudLoadBalancerConfig) + (*in).DeepCopyInto(*out) + } return } @@ -307,9 +366,67 @@ func (in *AdmissionPluginConfig) DeepCopy() *AdmissionPluginConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudPlatformSpec) DeepCopyInto(out *AlibabaCloudPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudPlatformSpec. +func (in *AlibabaCloudPlatformSpec) DeepCopy() *AlibabaCloudPlatformSpec { + if in == nil { + return nil + } + out := new(AlibabaCloudPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudPlatformStatus) DeepCopyInto(out *AlibabaCloudPlatformStatus) { + *out = *in + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AlibabaCloudResourceTag, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudPlatformStatus. +func (in *AlibabaCloudPlatformStatus) DeepCopy() *AlibabaCloudPlatformStatus { + if in == nil { + return nil + } + out := new(AlibabaCloudPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudResourceTag) DeepCopyInto(out *AlibabaCloudResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudResourceTag. +func (in *AlibabaCloudResourceTag) DeepCopy() *AlibabaCloudResourceTag { + if in == nil { + return nil + } + out := new(AlibabaCloudResourceTag) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Audit) DeepCopyInto(out *Audit) { *out = *in + if in.CustomRules != nil { + in, out := &in.CustomRules, &out.CustomRules + *out = make([]AuditCustomRule, len(*in)) + copy(*out, *in) + } return } @@ -340,13 +457,29 @@ func (in *AuditConfig) DeepCopy() *AuditConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuditCustomRule) DeepCopyInto(out *AuditCustomRule) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuditCustomRule. +func (in *AuditCustomRule) DeepCopy() *AuditCustomRule { + if in == nil { + return nil + } + out := new(AuditCustomRule) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Authentication) DeepCopyInto(out *Authentication) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } @@ -415,6 +548,13 @@ func (in *AuthenticationSpec) DeepCopyInto(out *AuthenticationSpec) { *out = new(WebhookTokenAuthenticator) **out = **in } + if in.OIDCProviders != nil { + in, out := &in.OIDCProviders, &out.OIDCProviders + *out = make([]OIDCProvider, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -432,6 +572,13 @@ func (in *AuthenticationSpec) DeepCopy() *AuthenticationSpec { func (in *AuthenticationStatus) DeepCopyInto(out *AuthenticationStatus) { *out = *in out.IntegratedOAuthMetadata = in.IntegratedOAuthMetadata + if in.OIDCClients != nil { + in, out := &in.OIDCClients, &out.OIDCClients + *out = make([]OIDCClientStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -464,6 +611,16 @@ func (in *AzurePlatformSpec) DeepCopy() *AzurePlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AzurePlatformStatus) DeepCopyInto(out *AzurePlatformStatus) { *out = *in + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AzureResourceTag, len(*in)) + copy(*out, *in) + } + if in.CloudLoadBalancerConfig != nil { + in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig + *out = new(CloudLoadBalancerConfig) + (*in).DeepCopyInto(*out) + } return } @@ -477,9 +634,56 @@ func (in *AzurePlatformStatus) DeepCopy() *AzurePlatformStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureResourceTag) DeepCopyInto(out *AzureResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureResourceTag. +func (in *AzureResourceTag) DeepCopy() *AzureResourceTag { + if in == nil { + return nil + } + out := new(AzureResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalPlatformLoadBalancer) DeepCopyInto(out *BareMetalPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalPlatformLoadBalancer. +func (in *BareMetalPlatformLoadBalancer) DeepCopy() *BareMetalPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(BareMetalPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BareMetalPlatformSpec) DeepCopyInto(out *BareMetalPlatformSpec) { *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } return } @@ -496,6 +700,26 @@ func (in *BareMetalPlatformSpec) DeepCopy() *BareMetalPlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BareMetalPlatformStatus) DeepCopyInto(out *BareMetalPlatformStatus) { *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(BareMetalPlatformLoadBalancer) + **out = **in + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } return } @@ -717,43 +941,116 @@ func (in *ClientConnectionOverrides) DeepCopy() *ClientConnectionOverrides { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) { +func (in *CloudControllerManagerStatus) DeepCopyInto(out *CloudControllerManagerStatus) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry. -func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudControllerManagerStatus. +func (in *CloudControllerManagerStatus) DeepCopy() *CloudControllerManagerStatus { if in == nil { return nil } - out := new(ClusterNetworkEntry) + out := new(CloudControllerManagerStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperator) DeepCopyInto(out *ClusterOperator) { +func (in *CloudLoadBalancerConfig) DeepCopyInto(out *CloudLoadBalancerConfig) { + *out = *in + if in.ClusterHosted != nil { + in, out := &in.ClusterHosted, &out.ClusterHosted + *out = new(CloudLoadBalancerIPs) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudLoadBalancerConfig. +func (in *CloudLoadBalancerConfig) DeepCopy() *CloudLoadBalancerConfig { + if in == nil { + return nil + } + out := new(CloudLoadBalancerConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CloudLoadBalancerIPs) DeepCopyInto(out *CloudLoadBalancerIPs) { + *out = *in + if in.APIIntLoadBalancerIPs != nil { + in, out := &in.APIIntLoadBalancerIPs, &out.APIIntLoadBalancerIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.APILoadBalancerIPs != nil { + in, out := &in.APILoadBalancerIPs, &out.APILoadBalancerIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressLoadBalancerIPs != nil { + in, out := &in.IngressLoadBalancerIPs, &out.IngressLoadBalancerIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudLoadBalancerIPs. +func (in *CloudLoadBalancerIPs) DeepCopy() *CloudLoadBalancerIPs { + if in == nil { + return nil + } + out := new(CloudLoadBalancerIPs) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterCondition) DeepCopyInto(out *ClusterCondition) { + *out = *in + if in.PromQL != nil { + in, out := &in.PromQL, &out.PromQL + *out = new(PromQLClusterCondition) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterCondition. +func (in *ClusterCondition) DeepCopy() *ClusterCondition { + if in == nil { + return nil + } + out := new(ClusterCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterImagePolicy) DeepCopyInto(out *ClusterImagePolicy) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec + in.Spec.DeepCopyInto(&out.Spec) in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperator. -func (in *ClusterOperator) DeepCopy() *ClusterOperator { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicy. +func (in *ClusterImagePolicy) DeepCopy() *ClusterImagePolicy { if in == nil { return nil } - out := new(ClusterOperator) + out := new(ClusterImagePolicy) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterOperator) DeepCopyObject() runtime.Object { +func (in *ClusterImagePolicy) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -761,13 +1058,13 @@ func (in *ClusterOperator) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { +func (in *ClusterImagePolicyList) DeepCopyInto(out *ClusterImagePolicyList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]ClusterOperator, len(*in)) + *out = make([]ClusterImagePolicy, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -775,18 +1072,18 @@ func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorList. -func (in *ClusterOperatorList) DeepCopy() *ClusterOperatorList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicyList. +func (in *ClusterImagePolicyList) DeepCopy() *ClusterImagePolicyList { if in == nil { return nil } - out := new(ClusterOperatorList) + out := new(ClusterImagePolicyList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { +func (in *ClusterImagePolicyList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -794,100 +1091,269 @@ func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorSpec) DeepCopyInto(out *ClusterOperatorSpec) { +func (in *ClusterImagePolicySpec) DeepCopyInto(out *ClusterImagePolicySpec) { *out = *in + if in.Scopes != nil { + in, out := &in.Scopes, &out.Scopes + *out = make([]ImageScope, len(*in)) + copy(*out, *in) + } + in.Policy.DeepCopyInto(&out.Policy) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorSpec. -func (in *ClusterOperatorSpec) DeepCopy() *ClusterOperatorSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicySpec. +func (in *ClusterImagePolicySpec) DeepCopy() *ClusterImagePolicySpec { if in == nil { return nil } - out := new(ClusterOperatorSpec) + out := new(ClusterImagePolicySpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorStatus) DeepCopyInto(out *ClusterOperatorStatus) { +func (in *ClusterImagePolicyStatus) DeepCopyInto(out *ClusterImagePolicyStatus) { *out = *in if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make([]ClusterOperatorStatusCondition, len(*in)) + *out = make([]metav1.Condition, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } } - if in.Versions != nil { - in, out := &in.Versions, &out.Versions - *out = make([]OperandVersion, len(*in)) - copy(*out, *in) - } - if in.RelatedObjects != nil { - in, out := &in.RelatedObjects, &out.RelatedObjects - *out = make([]ObjectReference, len(*in)) - copy(*out, *in) - } - in.Extension.DeepCopyInto(&out.Extension) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatus. -func (in *ClusterOperatorStatus) DeepCopy() *ClusterOperatorStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterImagePolicyStatus. +func (in *ClusterImagePolicyStatus) DeepCopy() *ClusterImagePolicyStatus { if in == nil { return nil } - out := new(ClusterOperatorStatus) + out := new(ClusterImagePolicyStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterOperatorStatusCondition) DeepCopyInto(out *ClusterOperatorStatusCondition) { +func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) { *out = *in - in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatusCondition. -func (in *ClusterOperatorStatusCondition) DeepCopy() *ClusterOperatorStatusCondition { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry. +func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry { if in == nil { return nil } - out := new(ClusterOperatorStatusCondition) + out := new(ClusterNetworkEntry) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterVersion) DeepCopyInto(out *ClusterVersion) { +func (in *ClusterOperator) DeepCopyInto(out *ClusterOperator) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) + out.Spec = in.Spec in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersion. -func (in *ClusterVersion) DeepCopy() *ClusterVersion { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperator. +func (in *ClusterOperator) DeepCopy() *ClusterOperator { if in == nil { return nil } - out := new(ClusterVersion) + out := new(ClusterOperator) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterVersion) DeepCopyObject() runtime.Object { +func (in *ClusterOperator) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterOperator, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorList. +func (in *ClusterOperatorList) DeepCopy() *ClusterOperatorList { + if in == nil { + return nil + } + out := new(ClusterOperatorList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorSpec) DeepCopyInto(out *ClusterOperatorSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorSpec. +func (in *ClusterOperatorSpec) DeepCopy() *ClusterOperatorSpec { + if in == nil { + return nil + } + out := new(ClusterOperatorSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorStatus) DeepCopyInto(out *ClusterOperatorStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]ClusterOperatorStatusCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Versions != nil { + in, out := &in.Versions, &out.Versions + *out = make([]OperandVersion, len(*in)) + copy(*out, *in) + } + if in.RelatedObjects != nil { + in, out := &in.RelatedObjects, &out.RelatedObjects + *out = make([]ObjectReference, len(*in)) + copy(*out, *in) + } + in.Extension.DeepCopyInto(&out.Extension) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatus. +func (in *ClusterOperatorStatus) DeepCopy() *ClusterOperatorStatus { + if in == nil { + return nil + } + out := new(ClusterOperatorStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorStatusCondition) DeepCopyInto(out *ClusterOperatorStatusCondition) { + *out = *in + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatusCondition. +func (in *ClusterOperatorStatusCondition) DeepCopy() *ClusterOperatorStatusCondition { + if in == nil { + return nil + } + out := new(ClusterOperatorStatusCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersion) DeepCopyInto(out *ClusterVersion) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersion. +func (in *ClusterVersion) DeepCopy() *ClusterVersion { + if in == nil { + return nil + } + out := new(ClusterVersion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterVersion) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionCapabilitiesSpec) DeepCopyInto(out *ClusterVersionCapabilitiesSpec) { + *out = *in + if in.AdditionalEnabledCapabilities != nil { + in, out := &in.AdditionalEnabledCapabilities, &out.AdditionalEnabledCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionCapabilitiesSpec. +func (in *ClusterVersionCapabilitiesSpec) DeepCopy() *ClusterVersionCapabilitiesSpec { + if in == nil { + return nil + } + out := new(ClusterVersionCapabilitiesSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionCapabilitiesStatus) DeepCopyInto(out *ClusterVersionCapabilitiesStatus) { + *out = *in + if in.EnabledCapabilities != nil { + in, out := &in.EnabledCapabilities, &out.EnabledCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + if in.KnownCapabilities != nil { + in, out := &in.KnownCapabilities, &out.KnownCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionCapabilitiesStatus. +func (in *ClusterVersionCapabilitiesStatus) DeepCopy() *ClusterVersionCapabilitiesStatus { + if in == nil { + return nil + } + out := new(ClusterVersionCapabilitiesStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ClusterVersionList) DeepCopyInto(out *ClusterVersionList) { *out = *in @@ -929,6 +1395,16 @@ func (in *ClusterVersionSpec) DeepCopyInto(out *ClusterVersionSpec) { *out = new(Update) **out = **in } + if in.Capabilities != nil { + in, out := &in.Capabilities, &out.Capabilities + *out = new(ClusterVersionCapabilitiesSpec) + (*in).DeepCopyInto(*out) + } + if in.SignatureStores != nil { + in, out := &in.SignatureStores, &out.SignatureStores + *out = make([]SignatureStore, len(*in)) + copy(*out, *in) + } if in.Overrides != nil { in, out := &in.Overrides, &out.Overrides *out = make([]ComponentOverride, len(*in)) @@ -958,6 +1434,7 @@ func (in *ClusterVersionStatus) DeepCopyInto(out *ClusterVersionStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + in.Capabilities.DeepCopyInto(&out.Capabilities) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]ClusterOperatorStatusCondition, len(*in)) @@ -972,6 +1449,13 @@ func (in *ClusterVersionStatus) DeepCopyInto(out *ClusterVersionStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ConditionalUpdates != nil { + in, out := &in.ConditionalUpdates, &out.ConditionalUpdates + *out = make([]ConditionalUpdate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -1056,6 +1540,60 @@ func (in *ComponentRouteStatus) DeepCopy() *ComponentRouteStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConditionalUpdate) DeepCopyInto(out *ConditionalUpdate) { + *out = *in + in.Release.DeepCopyInto(&out.Release) + if in.Risks != nil { + in, out := &in.Risks, &out.Risks + *out = make([]ConditionalUpdateRisk, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConditionalUpdate. +func (in *ConditionalUpdate) DeepCopy() *ConditionalUpdate { + if in == nil { + return nil + } + out := new(ConditionalUpdate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConditionalUpdateRisk) DeepCopyInto(out *ConditionalUpdateRisk) { + *out = *in + if in.MatchingRules != nil { + in, out := &in.MatchingRules, &out.MatchingRules + *out = make([]ClusterCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConditionalUpdateRisk. +func (in *ConditionalUpdateRisk) DeepCopy() *ConditionalUpdateRisk { + if in == nil { + return nil + } + out := new(ConditionalUpdateRisk) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ConfigMapFileReference) DeepCopyInto(out *ConfigMapFileReference) { *out = *in @@ -1198,17 +1736,38 @@ func (in *ConsoleStatus) DeepCopy() *ConsoleStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Custom) DeepCopyInto(out *Custom) { + *out = *in + if in.Configs != nil { + in, out := &in.Configs, &out.Configs + *out = make([]GathererConfig, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Custom. +func (in *Custom) DeepCopy() *Custom { + if in == nil { + return nil + } + out := new(Custom) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomFeatureGates) DeepCopyInto(out *CustomFeatureGates) { *out = *in if in.Enabled != nil { in, out := &in.Enabled, &out.Enabled - *out = make([]string, len(*in)) + *out = make([]FeatureGateName, len(*in)) copy(*out, *in) } if in.Disabled != nil { in, out := &in.Disabled, &out.Disabled - *out = make([]string, len(*in)) + *out = make([]FeatureGateName, len(*in)) copy(*out, *in) } return @@ -1302,6 +1861,27 @@ func (in *DNSList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSPlatformSpec) DeepCopyInto(out *DNSPlatformSpec) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSDNSSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSPlatformSpec. +func (in *DNSPlatformSpec) DeepCopy() *DNSPlatformSpec { + if in == nil { + return nil + } + out := new(DNSPlatformSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DNSSpec) DeepCopyInto(out *DNSSpec) { *out = *in @@ -1315,6 +1895,7 @@ func (in *DNSSpec) DeepCopyInto(out *DNSSpec) { *out = new(DNSZone) (*in).DeepCopyInto(*out) } + in.Platform.DeepCopyInto(&out.Platform) return } @@ -1540,55 +2121,120 @@ func (in *ExternalIPPolicy) DeepCopy() *ExternalIPPolicy { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FeatureGate) DeepCopyInto(out *FeatureGate) { +func (in *ExternalPlatformSpec) DeepCopyInto(out *ExternalPlatformSpec) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate. -func (in *FeatureGate) DeepCopy() *FeatureGate { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalPlatformSpec. +func (in *ExternalPlatformSpec) DeepCopy() *ExternalPlatformSpec { if in == nil { return nil } - out := new(FeatureGate) + out := new(ExternalPlatformSpec) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *FeatureGate) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *FeatureGateEnabledDisabled) DeepCopyInto(out *FeatureGateEnabledDisabled) { +func (in *ExternalPlatformStatus) DeepCopyInto(out *ExternalPlatformStatus) { *out = *in - if in.Enabled != nil { - in, out := &in.Enabled, &out.Enabled - *out = make([]string, len(*in)) + out.CloudControllerManager = in.CloudControllerManager + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalPlatformStatus. +func (in *ExternalPlatformStatus) DeepCopy() *ExternalPlatformStatus { + if in == nil { + return nil + } + out := new(ExternalPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExtraMapping) DeepCopyInto(out *ExtraMapping) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtraMapping. +func (in *ExtraMapping) DeepCopy() *ExtraMapping { + if in == nil { + return nil + } + out := new(ExtraMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGate) DeepCopyInto(out *FeatureGate) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate. +func (in *FeatureGate) DeepCopy() *FeatureGate { + if in == nil { + return nil + } + out := new(FeatureGate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *FeatureGate) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateAttributes) DeepCopyInto(out *FeatureGateAttributes) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateAttributes. +func (in *FeatureGateAttributes) DeepCopy() *FeatureGateAttributes { + if in == nil { + return nil + } + out := new(FeatureGateAttributes) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateDetails) DeepCopyInto(out *FeatureGateDetails) { + *out = *in + if in.Enabled != nil { + in, out := &in.Enabled, &out.Enabled + *out = make([]FeatureGateAttributes, len(*in)) copy(*out, *in) } if in.Disabled != nil { in, out := &in.Disabled, &out.Disabled - *out = make([]string, len(*in)) + *out = make([]FeatureGateAttributes, len(*in)) copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateEnabledDisabled. -func (in *FeatureGateEnabledDisabled) DeepCopy() *FeatureGateEnabledDisabled { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateDetails. +func (in *FeatureGateDetails) DeepCopy() *FeatureGateDetails { if in == nil { return nil } - out := new(FeatureGateEnabledDisabled) + out := new(FeatureGateDetails) in.DeepCopyInto(out) return out } @@ -1667,6 +2313,20 @@ func (in *FeatureGateSpec) DeepCopy() *FeatureGateSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FeatureGateStatus) DeepCopyInto(out *FeatureGateStatus) { *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FeatureGates != nil { + in, out := &in.FeatureGates, &out.FeatureGates + *out = make([]FeatureGateDetails, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -1680,6 +2340,54 @@ func (in *FeatureGateStatus) DeepCopy() *FeatureGateStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateTests) DeepCopyInto(out *FeatureGateTests) { + *out = *in + if in.Tests != nil { + in, out := &in.Tests, &out.Tests + *out = make([]TestDetails, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateTests. +func (in *FeatureGateTests) DeepCopy() *FeatureGateTests { + if in == nil { + return nil + } + out := new(FeatureGateTests) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FulcioCAWithRekor) DeepCopyInto(out *FulcioCAWithRekor) { + *out = *in + if in.FulcioCAData != nil { + in, out := &in.FulcioCAData, &out.FulcioCAData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.RekorKeyData != nil { + in, out := &in.RekorKeyData, &out.RekorKeyData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + out.FulcioSubject = in.FulcioSubject + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FulcioCAWithRekor. +func (in *FulcioCAWithRekor) DeepCopy() *FulcioCAWithRekor { + if in == nil { + return nil + } + out := new(FulcioCAWithRekor) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GCPPlatformSpec) DeepCopyInto(out *GCPPlatformSpec) { *out = *in @@ -1699,6 +2407,26 @@ func (in *GCPPlatformSpec) DeepCopy() *GCPPlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GCPPlatformStatus) DeepCopyInto(out *GCPPlatformStatus) { *out = *in + if in.ResourceLabels != nil { + in, out := &in.ResourceLabels, &out.ResourceLabels + *out = make([]GCPResourceLabel, len(*in)) + copy(*out, *in) + } + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]GCPResourceTag, len(*in)) + copy(*out, *in) + } + if in.CloudLoadBalancerConfig != nil { + in, out := &in.CloudLoadBalancerConfig, &out.CloudLoadBalancerConfig + *out = new(CloudLoadBalancerConfig) + (*in).DeepCopyInto(*out) + } + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]GCPServiceEndpoint, len(*in)) + copy(*out, *in) + } return } @@ -1712,6 +2440,110 @@ func (in *GCPPlatformStatus) DeepCopy() *GCPPlatformStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPResourceLabel) DeepCopyInto(out *GCPResourceLabel) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPResourceLabel. +func (in *GCPResourceLabel) DeepCopy() *GCPResourceLabel { + if in == nil { + return nil + } + out := new(GCPResourceLabel) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPResourceTag) DeepCopyInto(out *GCPResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPResourceTag. +func (in *GCPResourceTag) DeepCopy() *GCPResourceTag { + if in == nil { + return nil + } + out := new(GCPResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPServiceEndpoint) DeepCopyInto(out *GCPServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPServiceEndpoint. +func (in *GCPServiceEndpoint) DeepCopy() *GCPServiceEndpoint { + if in == nil { + return nil + } + out := new(GCPServiceEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GatherConfig) DeepCopyInto(out *GatherConfig) { + *out = *in + if in.DataPolicy != nil { + in, out := &in.DataPolicy, &out.DataPolicy + *out = make([]DataPolicyOption, len(*in)) + copy(*out, *in) + } + in.Gatherers.DeepCopyInto(&out.Gatherers) + out.Storage = in.Storage + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GatherConfig. +func (in *GatherConfig) DeepCopy() *GatherConfig { + if in == nil { + return nil + } + out := new(GatherConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GathererConfig) DeepCopyInto(out *GathererConfig) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GathererConfig. +func (in *GathererConfig) DeepCopy() *GathererConfig { + if in == nil { + return nil + } + out := new(GathererConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Gatherers) DeepCopyInto(out *Gatherers) { + *out = *in + in.Custom.DeepCopyInto(&out.Custom) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Gatherers. +func (in *Gatherers) DeepCopy() *Gatherers { + if in == nil { + return nil + } + out := new(Gatherers) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GenericAPIServerConfig) DeepCopyInto(out *GenericAPIServerConfig) { *out = *in @@ -1891,6 +2723,11 @@ func (in *HubSourceStatus) DeepCopy() *HubSourceStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IBMCloudPlatformSpec) DeepCopyInto(out *IBMCloudPlatformSpec) { *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]IBMCloudServiceEndpoint, len(*in)) + copy(*out, *in) + } return } @@ -1907,6 +2744,11 @@ func (in *IBMCloudPlatformSpec) DeepCopy() *IBMCloudPlatformSpec { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IBMCloudPlatformStatus) DeepCopyInto(out *IBMCloudPlatformStatus) { *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]IBMCloudServiceEndpoint, len(*in)) + copy(*out, *in) + } return } @@ -1920,6 +2762,22 @@ func (in *IBMCloudPlatformStatus) DeepCopy() *IBMCloudPlatformStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IBMCloudServiceEndpoint) DeepCopyInto(out *IBMCloudServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IBMCloudServiceEndpoint. +func (in *IBMCloudServiceEndpoint) DeepCopy() *IBMCloudServiceEndpoint { + if in == nil { + return nil + } + out := new(IBMCloudServiceEndpoint) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IdentityProvider) DeepCopyInto(out *IdentityProvider) { *out = *in @@ -2027,29 +2885,40 @@ func (in *Image) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageLabel) DeepCopyInto(out *ImageLabel) { +func (in *ImageContentPolicy) DeepCopyInto(out *ImageContentPolicy) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageLabel. -func (in *ImageLabel) DeepCopy() *ImageLabel { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicy. +func (in *ImageContentPolicy) DeepCopy() *ImageContentPolicy { if in == nil { return nil } - out := new(ImageLabel) + out := new(ImageContentPolicy) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageContentPolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageList) DeepCopyInto(out *ImageList) { +func (in *ImageContentPolicyList) DeepCopyInto(out *ImageContentPolicyList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Image, len(*in)) + *out = make([]ImageContentPolicy, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2057,18 +2926,18 @@ func (in *ImageList) DeepCopyInto(out *ImageList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageList. -func (in *ImageList) DeepCopy() *ImageList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicyList. +func (in *ImageContentPolicyList) DeepCopy() *ImageContentPolicyList { if in == nil { return nil } - out := new(ImageList) + out := new(ImageContentPolicyList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ImageList) DeepCopyObject() runtime.Object { +func (in *ImageContentPolicyList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2076,76 +2945,50 @@ func (in *ImageList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageSpec) DeepCopyInto(out *ImageSpec) { +func (in *ImageContentPolicySpec) DeepCopyInto(out *ImageContentPolicySpec) { *out = *in - if in.AllowedRegistriesForImport != nil { - in, out := &in.AllowedRegistriesForImport, &out.AllowedRegistriesForImport - *out = make([]RegistryLocation, len(*in)) - copy(*out, *in) - } - if in.ExternalRegistryHostnames != nil { - in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames - *out = make([]string, len(*in)) - copy(*out, *in) + if in.RepositoryDigestMirrors != nil { + in, out := &in.RepositoryDigestMirrors, &out.RepositoryDigestMirrors + *out = make([]RepositoryDigestMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - out.AdditionalTrustedCA = in.AdditionalTrustedCA - in.RegistrySources.DeepCopyInto(&out.RegistrySources) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageSpec. -func (in *ImageSpec) DeepCopy() *ImageSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicySpec. +func (in *ImageContentPolicySpec) DeepCopy() *ImageContentPolicySpec { if in == nil { return nil } - out := new(ImageSpec) + out := new(ImageContentPolicySpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ImageStatus) DeepCopyInto(out *ImageStatus) { - *out = *in - if in.ExternalRegistryHostnames != nil { - in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageStatus. -func (in *ImageStatus) DeepCopy() *ImageStatus { - if in == nil { - return nil - } - out := new(ImageStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Infrastructure) DeepCopyInto(out *Infrastructure) { +func (in *ImageDigestMirrorSet) DeepCopyInto(out *ImageDigestMirrorSet) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Infrastructure. -func (in *Infrastructure) DeepCopy() *Infrastructure { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSet. +func (in *ImageDigestMirrorSet) DeepCopy() *ImageDigestMirrorSet { if in == nil { return nil } - out := new(Infrastructure) + out := new(ImageDigestMirrorSet) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Infrastructure) DeepCopyObject() runtime.Object { +func (in *ImageDigestMirrorSet) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2153,13 +2996,13 @@ func (in *Infrastructure) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { +func (in *ImageDigestMirrorSetList) DeepCopyInto(out *ImageDigestMirrorSetList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Infrastructure, len(*in)) + *out = make([]ImageDigestMirrorSet, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2167,18 +3010,18 @@ func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureList. -func (in *InfrastructureList) DeepCopy() *InfrastructureList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetList. +func (in *ImageDigestMirrorSetList) DeepCopy() *ImageDigestMirrorSetList { if in == nil { return nil } - out := new(InfrastructureList) + out := new(ImageDigestMirrorSetList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *InfrastructureList) DeepCopyObject() runtime.Object { +func (in *ImageDigestMirrorSetList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2186,80 +3029,89 @@ func (in *InfrastructureList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InfrastructureSpec) DeepCopyInto(out *InfrastructureSpec) { +func (in *ImageDigestMirrorSetSpec) DeepCopyInto(out *ImageDigestMirrorSetSpec) { *out = *in - out.CloudConfig = in.CloudConfig - in.PlatformSpec.DeepCopyInto(&out.PlatformSpec) + if in.ImageDigestMirrors != nil { + in, out := &in.ImageDigestMirrors, &out.ImageDigestMirrors + *out = make([]ImageDigestMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureSpec. -func (in *InfrastructureSpec) DeepCopy() *InfrastructureSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetSpec. +func (in *ImageDigestMirrorSetSpec) DeepCopy() *ImageDigestMirrorSetSpec { if in == nil { return nil } - out := new(InfrastructureSpec) + out := new(ImageDigestMirrorSetSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *InfrastructureStatus) DeepCopyInto(out *InfrastructureStatus) { +func (in *ImageDigestMirrorSetStatus) DeepCopyInto(out *ImageDigestMirrorSetStatus) { *out = *in - if in.PlatformStatus != nil { - in, out := &in.PlatformStatus, &out.PlatformStatus - *out = new(PlatformStatus) - (*in).DeepCopyInto(*out) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureStatus. -func (in *InfrastructureStatus) DeepCopy() *InfrastructureStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetStatus. +func (in *ImageDigestMirrorSetStatus) DeepCopy() *ImageDigestMirrorSetStatus { if in == nil { return nil } - out := new(InfrastructureStatus) + out := new(ImageDigestMirrorSetStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Ingress) DeepCopyInto(out *Ingress) { +func (in *ImageDigestMirrors) DeepCopyInto(out *ImageDigestMirrors) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]ImageMirror, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. -func (in *Ingress) DeepCopy() *Ingress { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrors. +func (in *ImageDigestMirrors) DeepCopy() *ImageDigestMirrors { if in == nil { return nil } - out := new(Ingress) + out := new(ImageDigestMirrors) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Ingress) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageLabel) DeepCopyInto(out *ImageLabel) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageLabel. +func (in *ImageLabel) DeepCopy() *ImageLabel { + if in == nil { + return nil } - return nil + out := new(ImageLabel) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IngressList) DeepCopyInto(out *IngressList) { +func (in *ImageList) DeepCopyInto(out *ImageList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Ingress, len(*in)) + *out = make([]Image, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2267,18 +3119,18 @@ func (in *IngressList) DeepCopyInto(out *IngressList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressList. -func (in *IngressList) DeepCopy() *IngressList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageList. +func (in *ImageList) DeepCopy() *ImageList { if in == nil { return nil } - out := new(IngressList) + out := new(ImageList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *IngressList) DeepCopyObject() runtime.Object { +func (in *ImageList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2286,32 +3138,41 @@ func (in *IngressList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { +func (in *ImagePolicy) DeepCopyInto(out *ImagePolicy) { *out = *in - if in.ComponentRoutes != nil { - in, out := &in.ComponentRoutes, &out.ComponentRoutes - *out = make([]ComponentRouteSpec, len(*in)) - copy(*out, *in) - } + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressSpec. -func (in *IngressSpec) DeepCopy() *IngressSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicy. +func (in *ImagePolicy) DeepCopy() *ImagePolicy { if in == nil { return nil } - out := new(IngressSpec) + out := new(ImagePolicy) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImagePolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { +func (in *ImagePolicyList) DeepCopyInto(out *ImagePolicyList) { *out = *in - if in.ComponentRoutes != nil { - in, out := &in.ComponentRoutes, &out.ComponentRoutes - *out = make([]ComponentRouteStatus, len(*in)) + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImagePolicy, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2319,212 +3180,341 @@ func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressStatus. -func (in *IngressStatus) DeepCopy() *IngressStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicyList. +func (in *ImagePolicyList) DeepCopy() *ImagePolicyList { if in == nil { return nil } - out := new(IngressStatus) + out := new(ImagePolicyList) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImagePolicyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IntermediateTLSProfile) DeepCopyInto(out *IntermediateTLSProfile) { +func (in *ImagePolicySpec) DeepCopyInto(out *ImagePolicySpec) { *out = *in + if in.Scopes != nil { + in, out := &in.Scopes, &out.Scopes + *out = make([]ImageScope, len(*in)) + copy(*out, *in) + } + in.Policy.DeepCopyInto(&out.Policy) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IntermediateTLSProfile. -func (in *IntermediateTLSProfile) DeepCopy() *IntermediateTLSProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicySpec. +func (in *ImagePolicySpec) DeepCopy() *ImagePolicySpec { if in == nil { return nil } - out := new(IntermediateTLSProfile) + out := new(ImagePolicySpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KeystoneIdentityProvider) DeepCopyInto(out *KeystoneIdentityProvider) { +func (in *ImagePolicyStatus) DeepCopyInto(out *ImagePolicyStatus) { *out = *in - out.OAuthRemoteConnectionInfo = in.OAuthRemoteConnectionInfo + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeystoneIdentityProvider. -func (in *KeystoneIdentityProvider) DeepCopy() *KeystoneIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImagePolicyStatus. +func (in *ImagePolicyStatus) DeepCopy() *ImagePolicyStatus { if in == nil { return nil } - out := new(KeystoneIdentityProvider) + out := new(ImagePolicyStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeClientConfig) DeepCopyInto(out *KubeClientConfig) { +func (in *ImageSpec) DeepCopyInto(out *ImageSpec) { *out = *in - out.ConnectionOverrides = in.ConnectionOverrides + if in.AllowedRegistriesForImport != nil { + in, out := &in.AllowedRegistriesForImport, &out.AllowedRegistriesForImport + *out = make([]RegistryLocation, len(*in)) + copy(*out, *in) + } + if in.ExternalRegistryHostnames != nil { + in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.AdditionalTrustedCA = in.AdditionalTrustedCA + in.RegistrySources.DeepCopyInto(&out.RegistrySources) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeClientConfig. -func (in *KubeClientConfig) DeepCopy() *KubeClientConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageSpec. +func (in *ImageSpec) DeepCopy() *ImageSpec { if in == nil { return nil } - out := new(KubeClientConfig) + out := new(ImageSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevirtPlatformSpec) DeepCopyInto(out *KubevirtPlatformSpec) { +func (in *ImageStatus) DeepCopyInto(out *ImageStatus) { *out = *in + if in.ExternalRegistryHostnames != nil { + in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformSpec. -func (in *KubevirtPlatformSpec) DeepCopy() *KubevirtPlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageStatus. +func (in *ImageStatus) DeepCopy() *ImageStatus { if in == nil { return nil } - out := new(KubevirtPlatformSpec) + out := new(ImageStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevirtPlatformStatus) DeepCopyInto(out *KubevirtPlatformStatus) { +func (in *ImageTagMirrorSet) DeepCopyInto(out *ImageTagMirrorSet) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformStatus. -func (in *KubevirtPlatformStatus) DeepCopy() *KubevirtPlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSet. +func (in *ImageTagMirrorSet) DeepCopy() *ImageTagMirrorSet { if in == nil { return nil } - out := new(KubevirtPlatformStatus) + out := new(ImageTagMirrorSet) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagMirrorSet) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LDAPAttributeMapping) DeepCopyInto(out *LDAPAttributeMapping) { +func (in *ImageTagMirrorSetList) DeepCopyInto(out *ImageTagMirrorSetList) { *out = *in - if in.ID != nil { - in, out := &in.ID, &out.ID - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PreferredUsername != nil { - in, out := &in.PreferredUsername, &out.PreferredUsername - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Name != nil { - in, out := &in.Name, &out.Name - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Email != nil { - in, out := &in.Email, &out.Email - *out = make([]string, len(*in)) - copy(*out, *in) + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImageTagMirrorSet, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPAttributeMapping. -func (in *LDAPAttributeMapping) DeepCopy() *LDAPAttributeMapping { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetList. +func (in *ImageTagMirrorSetList) DeepCopy() *ImageTagMirrorSetList { if in == nil { return nil } - out := new(LDAPAttributeMapping) + out := new(ImageTagMirrorSetList) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagMirrorSetList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LDAPIdentityProvider) DeepCopyInto(out *LDAPIdentityProvider) { +func (in *ImageTagMirrorSetSpec) DeepCopyInto(out *ImageTagMirrorSetSpec) { *out = *in - out.BindPassword = in.BindPassword - out.CA = in.CA - in.Attributes.DeepCopyInto(&out.Attributes) + if in.ImageTagMirrors != nil { + in, out := &in.ImageTagMirrors, &out.ImageTagMirrors + *out = make([]ImageTagMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPIdentityProvider. -func (in *LDAPIdentityProvider) DeepCopy() *LDAPIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetSpec. +func (in *ImageTagMirrorSetSpec) DeepCopy() *ImageTagMirrorSetSpec { if in == nil { return nil } - out := new(LDAPIdentityProvider) + out := new(ImageTagMirrorSetSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LeaderElection) DeepCopyInto(out *LeaderElection) { +func (in *ImageTagMirrorSetStatus) DeepCopyInto(out *ImageTagMirrorSetStatus) { *out = *in - out.LeaseDuration = in.LeaseDuration - out.RenewDeadline = in.RenewDeadline - out.RetryPeriod = in.RetryPeriod return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaderElection. -func (in *LeaderElection) DeepCopy() *LeaderElection { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetStatus. +func (in *ImageTagMirrorSetStatus) DeepCopy() *ImageTagMirrorSetStatus { if in == nil { return nil } - out := new(LeaderElection) + out := new(ImageTagMirrorSetStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ModernTLSProfile) DeepCopyInto(out *ModernTLSProfile) { +func (in *ImageTagMirrors) DeepCopyInto(out *ImageTagMirrors) { *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]ImageMirror, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModernTLSProfile. -func (in *ModernTLSProfile) DeepCopy() *ModernTLSProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrors. +func (in *ImageTagMirrors) DeepCopy() *ImageTagMirrors { if in == nil { return nil } - out := new(ModernTLSProfile) + out := new(ImageTagMirrors) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamedCertificate) DeepCopyInto(out *NamedCertificate) { +func (in *Infrastructure) DeepCopyInto(out *Infrastructure) { *out = *in - if in.Names != nil { - in, out := &in.Names, &out.Names - *out = make([]string, len(*in)) - copy(*out, *in) + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Infrastructure. +func (in *Infrastructure) DeepCopy() *Infrastructure { + if in == nil { + return nil + } + out := new(Infrastructure) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Infrastructure) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Infrastructure, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - out.CertInfo = in.CertInfo return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedCertificate. -func (in *NamedCertificate) DeepCopy() *NamedCertificate { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureList. +func (in *InfrastructureList) DeepCopy() *InfrastructureList { if in == nil { return nil } - out := new(NamedCertificate) + out := new(InfrastructureList) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *InfrastructureList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Network) DeepCopyInto(out *Network) { +func (in *InfrastructureSpec) DeepCopyInto(out *InfrastructureSpec) { + *out = *in + out.CloudConfig = in.CloudConfig + in.PlatformSpec.DeepCopyInto(&out.PlatformSpec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureSpec. +func (in *InfrastructureSpec) DeepCopy() *InfrastructureSpec { + if in == nil { + return nil + } + out := new(InfrastructureSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureStatus) DeepCopyInto(out *InfrastructureStatus) { + *out = *in + if in.PlatformStatus != nil { + in, out := &in.PlatformStatus, &out.PlatformStatus + *out = new(PlatformStatus) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureStatus. +func (in *InfrastructureStatus) DeepCopy() *InfrastructureStatus { + if in == nil { + return nil + } + out := new(InfrastructureStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Ingress) DeepCopyInto(out *Ingress) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) @@ -2533,18 +3523,18 @@ func (in *Network) DeepCopyInto(out *Network) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Network. -func (in *Network) DeepCopy() *Network { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. +func (in *Ingress) DeepCopy() *Ingress { if in == nil { return nil } - out := new(Network) + out := new(Ingress) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Network) DeepCopyObject() runtime.Object { +func (in *Ingress) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2552,13 +3542,13 @@ func (in *Network) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkList) DeepCopyInto(out *NetworkList) { +func (in *IngressList) DeepCopyInto(out *IngressList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Network, len(*in)) + *out = make([]Ingress, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2566,18 +3556,18 @@ func (in *NetworkList) DeepCopyInto(out *NetworkList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkList. -func (in *NetworkList) DeepCopy() *NetworkList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressList. +func (in *IngressList) DeepCopy() *IngressList { if in == nil { return nil } - out := new(NetworkList) + out := new(IngressList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NetworkList) DeepCopyObject() runtime.Object { +func (in *IngressList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2585,105 +3575,99 @@ func (in *NetworkList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkMigration) DeepCopyInto(out *NetworkMigration) { +func (in *IngressPlatformSpec) DeepCopyInto(out *IngressPlatformSpec) { *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSIngressSpec) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkMigration. -func (in *NetworkMigration) DeepCopy() *NetworkMigration { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressPlatformSpec. +func (in *IngressPlatformSpec) DeepCopy() *IngressPlatformSpec { if in == nil { return nil } - out := new(NetworkMigration) + out := new(IngressPlatformSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { +func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { *out = *in - if in.ClusterNetwork != nil { - in, out := &in.ClusterNetwork, &out.ClusterNetwork - *out = make([]ClusterNetworkEntry, len(*in)) - copy(*out, *in) - } - if in.ServiceNetwork != nil { - in, out := &in.ServiceNetwork, &out.ServiceNetwork - *out = make([]string, len(*in)) + if in.ComponentRoutes != nil { + in, out := &in.ComponentRoutes, &out.ComponentRoutes + *out = make([]ComponentRouteSpec, len(*in)) copy(*out, *in) } - if in.ExternalIP != nil { - in, out := &in.ExternalIP, &out.ExternalIP - *out = new(ExternalIPConfig) - (*in).DeepCopyInto(*out) + if in.RequiredHSTSPolicies != nil { + in, out := &in.RequiredHSTSPolicies, &out.RequiredHSTSPolicies + *out = make([]RequiredHSTSPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } + in.LoadBalancer.DeepCopyInto(&out.LoadBalancer) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec. -func (in *NetworkSpec) DeepCopy() *NetworkSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressSpec. +func (in *IngressSpec) DeepCopy() *IngressSpec { if in == nil { return nil } - out := new(NetworkSpec) + out := new(IngressSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { +func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { *out = *in - if in.ClusterNetwork != nil { - in, out := &in.ClusterNetwork, &out.ClusterNetwork - *out = make([]ClusterNetworkEntry, len(*in)) - copy(*out, *in) - } - if in.ServiceNetwork != nil { - in, out := &in.ServiceNetwork, &out.ServiceNetwork - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Migration != nil { - in, out := &in.Migration, &out.Migration - *out = new(NetworkMigration) - **out = **in + if in.ComponentRoutes != nil { + in, out := &in.ComponentRoutes, &out.ComponentRoutes + *out = make([]ComponentRouteStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkStatus. -func (in *NetworkStatus) DeepCopy() *NetworkStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressStatus. +func (in *IngressStatus) DeepCopy() *IngressStatus { if in == nil { return nil } - out := new(NetworkStatus) + out := new(IngressStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuth) DeepCopyInto(out *OAuth) { +func (in *InsightsDataGather) DeepCopyInto(out *InsightsDataGather) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuth. -func (in *OAuth) DeepCopy() *OAuth { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InsightsDataGather. +func (in *InsightsDataGather) DeepCopy() *InsightsDataGather { if in == nil { return nil } - out := new(OAuth) + out := new(InsightsDataGather) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OAuth) DeepCopyObject() runtime.Object { +func (in *InsightsDataGather) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2691,13 +3675,13 @@ func (in *OAuth) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthList) DeepCopyInto(out *OAuthList) { +func (in *InsightsDataGatherList) DeepCopyInto(out *InsightsDataGatherList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]OAuth, len(*in)) + *out = make([]InsightsDataGather, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -2705,18 +3689,18 @@ func (in *OAuthList) DeepCopyInto(out *OAuthList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthList. -func (in *OAuthList) DeepCopy() *OAuthList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InsightsDataGatherList. +func (in *InsightsDataGatherList) DeepCopy() *InsightsDataGatherList { if in == nil { return nil } - out := new(OAuthList) + out := new(InsightsDataGatherList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OAuthList) DeepCopyObject() runtime.Object { +func (in *InsightsDataGatherList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -2724,120 +3708,134 @@ func (in *OAuthList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthRemoteConnectionInfo) DeepCopyInto(out *OAuthRemoteConnectionInfo) { +func (in *InsightsDataGatherSpec) DeepCopyInto(out *InsightsDataGatherSpec) { *out = *in - out.CA = in.CA - out.TLSClientCert = in.TLSClientCert - out.TLSClientKey = in.TLSClientKey + in.GatherConfig.DeepCopyInto(&out.GatherConfig) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthRemoteConnectionInfo. -func (in *OAuthRemoteConnectionInfo) DeepCopy() *OAuthRemoteConnectionInfo { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InsightsDataGatherSpec. +func (in *InsightsDataGatherSpec) DeepCopy() *InsightsDataGatherSpec { if in == nil { return nil } - out := new(OAuthRemoteConnectionInfo) + out := new(InsightsDataGatherSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthSpec) DeepCopyInto(out *OAuthSpec) { +func (in *IntermediateTLSProfile) DeepCopyInto(out *IntermediateTLSProfile) { *out = *in - if in.IdentityProviders != nil { - in, out := &in.IdentityProviders, &out.IdentityProviders - *out = make([]IdentityProvider, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.TokenConfig.DeepCopyInto(&out.TokenConfig) - out.Templates = in.Templates return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthSpec. -func (in *OAuthSpec) DeepCopy() *OAuthSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IntermediateTLSProfile. +func (in *IntermediateTLSProfile) DeepCopy() *IntermediateTLSProfile { if in == nil { return nil } - out := new(OAuthSpec) + out := new(IntermediateTLSProfile) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthStatus) DeepCopyInto(out *OAuthStatus) { +func (in *KMSConfig) DeepCopyInto(out *KMSConfig) { *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSKMSConfig) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthStatus. -func (in *OAuthStatus) DeepCopy() *OAuthStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KMSConfig. +func (in *KMSConfig) DeepCopy() *KMSConfig { if in == nil { return nil } - out := new(OAuthStatus) + out := new(KMSConfig) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OAuthTemplates) DeepCopyInto(out *OAuthTemplates) { +func (in *KeystoneIdentityProvider) DeepCopyInto(out *KeystoneIdentityProvider) { *out = *in - out.Login = in.Login - out.ProviderSelection = in.ProviderSelection - out.Error = in.Error + out.OAuthRemoteConnectionInfo = in.OAuthRemoteConnectionInfo return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthTemplates. -func (in *OAuthTemplates) DeepCopy() *OAuthTemplates { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeystoneIdentityProvider. +func (in *KeystoneIdentityProvider) DeepCopy() *KeystoneIdentityProvider { if in == nil { return nil } - out := new(OAuthTemplates) + out := new(KeystoneIdentityProvider) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ObjectReference) DeepCopyInto(out *ObjectReference) { +func (in *KubeClientConfig) DeepCopyInto(out *KubeClientConfig) { *out = *in + out.ConnectionOverrides = in.ConnectionOverrides return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference. -func (in *ObjectReference) DeepCopy() *ObjectReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeClientConfig. +func (in *KubeClientConfig) DeepCopy() *KubeClientConfig { if in == nil { return nil } - out := new(ObjectReference) + out := new(KubeClientConfig) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OldTLSProfile) DeepCopyInto(out *OldTLSProfile) { +func (in *KubevirtPlatformSpec) DeepCopyInto(out *KubevirtPlatformSpec) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OldTLSProfile. -func (in *OldTLSProfile) DeepCopy() *OldTLSProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformSpec. +func (in *KubevirtPlatformSpec) DeepCopy() *KubevirtPlatformSpec { if in == nil { return nil } - out := new(OldTLSProfile) + out := new(KubevirtPlatformSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { +func (in *KubevirtPlatformStatus) DeepCopyInto(out *KubevirtPlatformStatus) { *out = *in - if in.PreferredUsername != nil { + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformStatus. +func (in *KubevirtPlatformStatus) DeepCopy() *KubevirtPlatformStatus { + if in == nil { + return nil + } + out := new(KubevirtPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LDAPAttributeMapping) DeepCopyInto(out *LDAPAttributeMapping) { + *out = *in + if in.ID != nil { + in, out := &in.ID, &out.ID + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PreferredUsername != nil { in, out := &in.PreferredUsername, &out.PreferredUsername *out = make([]string, len(*in)) copy(*out, *in) @@ -2855,384 +3853,439 @@ func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDClaims. -func (in *OpenIDClaims) DeepCopy() *OpenIDClaims { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPAttributeMapping. +func (in *LDAPAttributeMapping) DeepCopy() *LDAPAttributeMapping { if in == nil { return nil } - out := new(OpenIDClaims) + out := new(LDAPAttributeMapping) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenIDIdentityProvider) DeepCopyInto(out *OpenIDIdentityProvider) { +func (in *LDAPIdentityProvider) DeepCopyInto(out *LDAPIdentityProvider) { *out = *in - out.ClientSecret = in.ClientSecret + out.BindPassword = in.BindPassword out.CA = in.CA - if in.ExtraScopes != nil { - in, out := &in.ExtraScopes, &out.ExtraScopes - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.ExtraAuthorizeParameters != nil { - in, out := &in.ExtraAuthorizeParameters, &out.ExtraAuthorizeParameters - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - in.Claims.DeepCopyInto(&out.Claims) + in.Attributes.DeepCopyInto(&out.Attributes) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDIdentityProvider. -func (in *OpenIDIdentityProvider) DeepCopy() *OpenIDIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPIdentityProvider. +func (in *LDAPIdentityProvider) DeepCopy() *LDAPIdentityProvider { if in == nil { return nil } - out := new(OpenIDIdentityProvider) + out := new(LDAPIdentityProvider) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenStackPlatformSpec) DeepCopyInto(out *OpenStackPlatformSpec) { +func (in *LeaderElection) DeepCopyInto(out *LeaderElection) { *out = *in + out.LeaseDuration = in.LeaseDuration + out.RenewDeadline = in.RenewDeadline + out.RetryPeriod = in.RetryPeriod return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformSpec. -func (in *OpenStackPlatformSpec) DeepCopy() *OpenStackPlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaderElection. +func (in *LeaderElection) DeepCopy() *LeaderElection { if in == nil { return nil } - out := new(OpenStackPlatformSpec) + out := new(LeaderElection) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OpenStackPlatformStatus) DeepCopyInto(out *OpenStackPlatformStatus) { +func (in *LoadBalancer) DeepCopyInto(out *LoadBalancer) { *out = *in + in.Platform.DeepCopyInto(&out.Platform) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformStatus. -func (in *OpenStackPlatformStatus) DeepCopy() *OpenStackPlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancer. +func (in *LoadBalancer) DeepCopy() *LoadBalancer { if in == nil { return nil } - out := new(OpenStackPlatformStatus) + out := new(LoadBalancer) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperandVersion) DeepCopyInto(out *OperandVersion) { +func (in *MTUMigration) DeepCopyInto(out *MTUMigration) { *out = *in + if in.Network != nil { + in, out := &in.Network, &out.Network + *out = new(MTUMigrationValues) + (*in).DeepCopyInto(*out) + } + if in.Machine != nil { + in, out := &in.Machine, &out.Machine + *out = new(MTUMigrationValues) + (*in).DeepCopyInto(*out) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperandVersion. -func (in *OperandVersion) DeepCopy() *OperandVersion { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MTUMigration. +func (in *MTUMigration) DeepCopy() *MTUMigration { if in == nil { return nil } - out := new(OperandVersion) + out := new(MTUMigration) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHub) DeepCopyInto(out *OperatorHub) { +func (in *MTUMigrationValues) DeepCopyInto(out *MTUMigrationValues) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) + if in.To != nil { + in, out := &in.To, &out.To + *out = new(uint32) + **out = **in + } + if in.From != nil { + in, out := &in.From, &out.From + *out = new(uint32) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHub. -func (in *OperatorHub) DeepCopy() *OperatorHub { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MTUMigrationValues. +func (in *MTUMigrationValues) DeepCopy() *MTUMigrationValues { if in == nil { return nil } - out := new(OperatorHub) + out := new(MTUMigrationValues) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OperatorHub) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHubList) DeepCopyInto(out *OperatorHubList) { +func (in *MaxAgePolicy) DeepCopyInto(out *MaxAgePolicy) { *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]OperatorHub, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } + if in.LargestMaxAge != nil { + in, out := &in.LargestMaxAge, &out.LargestMaxAge + *out = new(int32) + **out = **in + } + if in.SmallestMaxAge != nil { + in, out := &in.SmallestMaxAge, &out.SmallestMaxAge + *out = new(int32) + **out = **in } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubList. -func (in *OperatorHubList) DeepCopy() *OperatorHubList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MaxAgePolicy. +func (in *MaxAgePolicy) DeepCopy() *MaxAgePolicy { if in == nil { return nil } - out := new(OperatorHubList) + out := new(MaxAgePolicy) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OperatorHubList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHubSpec) DeepCopyInto(out *OperatorHubSpec) { +func (in *ModernTLSProfile) DeepCopyInto(out *ModernTLSProfile) { *out = *in - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make([]HubSource, len(*in)) - copy(*out, *in) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubSpec. -func (in *OperatorHubSpec) DeepCopy() *OperatorHubSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModernTLSProfile. +func (in *ModernTLSProfile) DeepCopy() *ModernTLSProfile { if in == nil { return nil } - out := new(OperatorHubSpec) + out := new(ModernTLSProfile) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OperatorHubStatus) DeepCopyInto(out *OperatorHubStatus) { +func (in *NamedCertificate) DeepCopyInto(out *NamedCertificate) { *out = *in - if in.Sources != nil { - in, out := &in.Sources, &out.Sources - *out = make([]HubSourceStatus, len(*in)) + if in.Names != nil { + in, out := &in.Names, &out.Names + *out = make([]string, len(*in)) copy(*out, *in) } + out.CertInfo = in.CertInfo return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubStatus. -func (in *OperatorHubStatus) DeepCopy() *OperatorHubStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedCertificate. +func (in *NamedCertificate) DeepCopy() *NamedCertificate { if in == nil { return nil } - out := new(OperatorHubStatus) + out := new(NamedCertificate) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OvirtPlatformSpec) DeepCopyInto(out *OvirtPlatformSpec) { +func (in *Network) DeepCopyInto(out *Network) { *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformSpec. -func (in *OvirtPlatformSpec) DeepCopy() *OvirtPlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Network. +func (in *Network) DeepCopy() *Network { if in == nil { return nil } - out := new(OvirtPlatformSpec) + out := new(Network) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Network) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OvirtPlatformStatus) DeepCopyInto(out *OvirtPlatformStatus) { +func (in *NetworkDiagnostics) DeepCopyInto(out *NetworkDiagnostics) { *out = *in + in.SourcePlacement.DeepCopyInto(&out.SourcePlacement) + in.TargetPlacement.DeepCopyInto(&out.TargetPlacement) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformStatus. -func (in *OvirtPlatformStatus) DeepCopy() *OvirtPlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDiagnostics. +func (in *NetworkDiagnostics) DeepCopy() *NetworkDiagnostics { if in == nil { return nil } - out := new(OvirtPlatformStatus) + out := new(NetworkDiagnostics) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PlatformSpec) DeepCopyInto(out *PlatformSpec) { +func (in *NetworkDiagnosticsSourcePlacement) DeepCopyInto(out *NetworkDiagnosticsSourcePlacement) { *out = *in - if in.AWS != nil { - in, out := &in.AWS, &out.AWS - *out = new(AWSPlatformSpec) - (*in).DeepCopyInto(*out) - } - if in.Azure != nil { - in, out := &in.Azure, &out.Azure - *out = new(AzurePlatformSpec) - **out = **in - } - if in.GCP != nil { - in, out := &in.GCP, &out.GCP - *out = new(GCPPlatformSpec) - **out = **in - } - if in.BareMetal != nil { - in, out := &in.BareMetal, &out.BareMetal - *out = new(BareMetalPlatformSpec) - **out = **in - } - if in.OpenStack != nil { - in, out := &in.OpenStack, &out.OpenStack - *out = new(OpenStackPlatformSpec) - **out = **in - } - if in.Ovirt != nil { - in, out := &in.Ovirt, &out.Ovirt - *out = new(OvirtPlatformSpec) - **out = **in + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } } - if in.VSphere != nil { - in, out := &in.VSphere, &out.VSphere - *out = new(VSpherePlatformSpec) - **out = **in + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]corev1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } - if in.IBMCloud != nil { - in, out := &in.IBMCloud, &out.IBMCloud - *out = new(IBMCloudPlatformSpec) - **out = **in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDiagnosticsSourcePlacement. +func (in *NetworkDiagnosticsSourcePlacement) DeepCopy() *NetworkDiagnosticsSourcePlacement { + if in == nil { + return nil } - if in.Kubevirt != nil { - in, out := &in.Kubevirt, &out.Kubevirt - *out = new(KubevirtPlatformSpec) - **out = **in + out := new(NetworkDiagnosticsSourcePlacement) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkDiagnosticsTargetPlacement) DeepCopyInto(out *NetworkDiagnosticsTargetPlacement) { + *out = *in + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } } - if in.EquinixMetal != nil { - in, out := &in.EquinixMetal, &out.EquinixMetal - *out = new(EquinixMetalPlatformSpec) - **out = **in + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]corev1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformSpec. -func (in *PlatformSpec) DeepCopy() *PlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDiagnosticsTargetPlacement. +func (in *NetworkDiagnosticsTargetPlacement) DeepCopy() *NetworkDiagnosticsTargetPlacement { if in == nil { return nil } - out := new(PlatformSpec) + out := new(NetworkDiagnosticsTargetPlacement) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PlatformStatus) DeepCopyInto(out *PlatformStatus) { +func (in *NetworkList) DeepCopyInto(out *NetworkList) { *out = *in - if in.AWS != nil { - in, out := &in.AWS, &out.AWS - *out = new(AWSPlatformStatus) + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Network, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkList. +func (in *NetworkList) DeepCopy() *NetworkList { + if in == nil { + return nil + } + out := new(NetworkList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NetworkList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkMigration) DeepCopyInto(out *NetworkMigration) { + *out = *in + if in.MTU != nil { + in, out := &in.MTU, &out.MTU + *out = new(MTUMigration) (*in).DeepCopyInto(*out) } - if in.Azure != nil { - in, out := &in.Azure, &out.Azure - *out = new(AzurePlatformStatus) - **out = **in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkMigration. +func (in *NetworkMigration) DeepCopy() *NetworkMigration { + if in == nil { + return nil } - if in.GCP != nil { - in, out := &in.GCP, &out.GCP - *out = new(GCPPlatformStatus) - **out = **in + out := new(NetworkMigration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { + *out = *in + if in.ClusterNetwork != nil { + in, out := &in.ClusterNetwork, &out.ClusterNetwork + *out = make([]ClusterNetworkEntry, len(*in)) + copy(*out, *in) } - if in.BareMetal != nil { - in, out := &in.BareMetal, &out.BareMetal - *out = new(BareMetalPlatformStatus) - **out = **in + if in.ServiceNetwork != nil { + in, out := &in.ServiceNetwork, &out.ServiceNetwork + *out = make([]string, len(*in)) + copy(*out, *in) } - if in.OpenStack != nil { - in, out := &in.OpenStack, &out.OpenStack - *out = new(OpenStackPlatformStatus) - **out = **in + if in.ExternalIP != nil { + in, out := &in.ExternalIP, &out.ExternalIP + *out = new(ExternalIPConfig) + (*in).DeepCopyInto(*out) } - if in.Ovirt != nil { - in, out := &in.Ovirt, &out.Ovirt - *out = new(OvirtPlatformStatus) - **out = **in + in.NetworkDiagnostics.DeepCopyInto(&out.NetworkDiagnostics) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec. +func (in *NetworkSpec) DeepCopy() *NetworkSpec { + if in == nil { + return nil } - if in.VSphere != nil { - in, out := &in.VSphere, &out.VSphere - *out = new(VSpherePlatformStatus) - **out = **in + out := new(NetworkSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { + *out = *in + if in.ClusterNetwork != nil { + in, out := &in.ClusterNetwork, &out.ClusterNetwork + *out = make([]ClusterNetworkEntry, len(*in)) + copy(*out, *in) } - if in.IBMCloud != nil { - in, out := &in.IBMCloud, &out.IBMCloud - *out = new(IBMCloudPlatformStatus) - **out = **in + if in.ServiceNetwork != nil { + in, out := &in.ServiceNetwork, &out.ServiceNetwork + *out = make([]string, len(*in)) + copy(*out, *in) } - if in.Kubevirt != nil { - in, out := &in.Kubevirt, &out.Kubevirt - *out = new(KubevirtPlatformStatus) - **out = **in + if in.Migration != nil { + in, out := &in.Migration, &out.Migration + *out = new(NetworkMigration) + (*in).DeepCopyInto(*out) } - if in.EquinixMetal != nil { - in, out := &in.EquinixMetal, &out.EquinixMetal - *out = new(EquinixMetalPlatformStatus) - **out = **in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformStatus. -func (in *PlatformStatus) DeepCopy() *PlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkStatus. +func (in *NetworkStatus) DeepCopy() *NetworkStatus { if in == nil { return nil } - out := new(PlatformStatus) + out := new(NetworkStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Project) DeepCopyInto(out *Project) { +func (in *Node) DeepCopyInto(out *Node) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) out.Spec = in.Spec - out.Status = in.Status + in.Status.DeepCopyInto(&out.Status) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Project. -func (in *Project) DeepCopy() *Project { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node. +func (in *Node) DeepCopy() *Node { if in == nil { return nil } - out := new(Project) + out := new(Node) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Project) DeepCopyObject() runtime.Object { +func (in *Node) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -3240,13 +4293,13 @@ func (in *Project) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProjectList) DeepCopyInto(out *ProjectList) { +func (in *NodeList) DeepCopyInto(out *NodeList) { *out = *in out.TypeMeta = in.TypeMeta in.ListMeta.DeepCopyInto(&out.ListMeta) if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]Project, len(*in)) + *out = make([]Node, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -3254,18 +4307,18 @@ func (in *ProjectList) DeepCopyInto(out *ProjectList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectList. -func (in *ProjectList) DeepCopy() *ProjectList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeList. +func (in *NodeList) DeepCopy() *NodeList { if in == nil { return nil } - out := new(ProjectList) + out := new(NodeList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ProjectList) DeepCopyObject() runtime.Object { +func (in *NodeList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -3273,74 +4326,96 @@ func (in *ProjectList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProjectSpec) DeepCopyInto(out *ProjectSpec) { +func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { *out = *in - out.ProjectRequestTemplate = in.ProjectRequestTemplate return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSpec. -func (in *ProjectSpec) DeepCopy() *ProjectSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSpec. +func (in *NodeSpec) DeepCopy() *NodeSpec { if in == nil { return nil } - out := new(ProjectSpec) + out := new(NodeSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProjectStatus) DeepCopyInto(out *ProjectStatus) { +func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectStatus. -func (in *ProjectStatus) DeepCopy() *ProjectStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeStatus. +func (in *NodeStatus) DeepCopy() *NodeStatus { if in == nil { return nil } - out := new(ProjectStatus) + out := new(NodeStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Proxy) DeepCopyInto(out *Proxy) { +func (in *NutanixFailureDomain) DeepCopyInto(out *NutanixFailureDomain) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status + in.Cluster.DeepCopyInto(&out.Cluster) + if in.Subnets != nil { + in, out := &in.Subnets, &out.Subnets + *out = make([]NutanixResourceIdentifier, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. -func (in *Proxy) DeepCopy() *Proxy { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixFailureDomain. +func (in *NutanixFailureDomain) DeepCopy() *NutanixFailureDomain { if in == nil { return nil } - out := new(Proxy) + out := new(NutanixFailureDomain) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Proxy) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPlatformLoadBalancer) DeepCopyInto(out *NutanixPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformLoadBalancer. +func (in *NutanixPlatformLoadBalancer) DeepCopy() *NutanixPlatformLoadBalancer { + if in == nil { + return nil } - return nil + out := new(NutanixPlatformLoadBalancer) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxyList) DeepCopyInto(out *ProxyList) { +func (in *NutanixPlatformSpec) DeepCopyInto(out *NutanixPlatformSpec) { *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Proxy, len(*in)) + out.PrismCentral = in.PrismCentral + if in.PrismElements != nil { + in, out := &in.PrismElements, &out.PrismElements + *out = make([]NutanixPrismElementEndpoint, len(*in)) + copy(*out, *in) + } + if in.FailureDomains != nil { + in, out := &in.FailureDomains, &out.FailureDomains + *out = make([]NutanixFailureDomain, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -3348,525 +4423,2423 @@ func (in *ProxyList) DeepCopyInto(out *ProxyList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyList. -func (in *ProxyList) DeepCopy() *ProxyList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformSpec. +func (in *NutanixPlatformSpec) DeepCopy() *NutanixPlatformSpec { if in == nil { return nil } - out := new(ProxyList) + out := new(NutanixPlatformSpec) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ProxyList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxySpec) DeepCopyInto(out *ProxySpec) { +func (in *NutanixPlatformStatus) DeepCopyInto(out *NutanixPlatformStatus) { *out = *in - if in.ReadinessEndpoints != nil { - in, out := &in.ReadinessEndpoints, &out.ReadinessEndpoints + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs *out = make([]string, len(*in)) copy(*out, *in) } - out.TrustedCA = in.TrustedCA + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(NutanixPlatformLoadBalancer) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxySpec. -func (in *ProxySpec) DeepCopy() *ProxySpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformStatus. +func (in *NutanixPlatformStatus) DeepCopy() *NutanixPlatformStatus { if in == nil { return nil } - out := new(ProxySpec) + out := new(NutanixPlatformStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxyStatus) DeepCopyInto(out *ProxyStatus) { +func (in *NutanixPrismElementEndpoint) DeepCopyInto(out *NutanixPrismElementEndpoint) { *out = *in + out.Endpoint = in.Endpoint return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyStatus. -func (in *ProxyStatus) DeepCopy() *ProxyStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPrismElementEndpoint. +func (in *NutanixPrismElementEndpoint) DeepCopy() *NutanixPrismElementEndpoint { if in == nil { return nil } - out := new(ProxyStatus) + out := new(NutanixPrismElementEndpoint) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RegistryLocation) DeepCopyInto(out *RegistryLocation) { +func (in *NutanixPrismEndpoint) DeepCopyInto(out *NutanixPrismEndpoint) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryLocation. -func (in *RegistryLocation) DeepCopy() *RegistryLocation { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPrismEndpoint. +func (in *NutanixPrismEndpoint) DeepCopy() *NutanixPrismEndpoint { if in == nil { return nil } - out := new(RegistryLocation) + out := new(NutanixPrismEndpoint) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RegistrySources) DeepCopyInto(out *RegistrySources) { +func (in *NutanixResourceIdentifier) DeepCopyInto(out *NutanixResourceIdentifier) { *out = *in - if in.InsecureRegistries != nil { - in, out := &in.InsecureRegistries, &out.InsecureRegistries - *out = make([]string, len(*in)) - copy(*out, *in) + if in.UUID != nil { + in, out := &in.UUID, &out.UUID + *out = new(string) + **out = **in } - if in.BlockedRegistries != nil { - in, out := &in.BlockedRegistries, &out.BlockedRegistries - *out = make([]string, len(*in)) - copy(*out, *in) + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = new(string) + **out = **in } - if in.AllowedRegistries != nil { - in, out := &in.AllowedRegistries, &out.AllowedRegistries - *out = make([]string, len(*in)) - copy(*out, *in) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixResourceIdentifier. +func (in *NutanixResourceIdentifier) DeepCopy() *NutanixResourceIdentifier { + if in == nil { + return nil } - if in.ContainerRuntimeSearchRegistries != nil { - in, out := &in.ContainerRuntimeSearchRegistries, &out.ContainerRuntimeSearchRegistries + out := new(NutanixResourceIdentifier) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuth) DeepCopyInto(out *OAuth) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuth. +func (in *OAuth) DeepCopy() *OAuth { + if in == nil { + return nil + } + out := new(OAuth) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OAuth) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthList) DeepCopyInto(out *OAuthList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OAuth, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthList. +func (in *OAuthList) DeepCopy() *OAuthList { + if in == nil { + return nil + } + out := new(OAuthList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OAuthList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthRemoteConnectionInfo) DeepCopyInto(out *OAuthRemoteConnectionInfo) { + *out = *in + out.CA = in.CA + out.TLSClientCert = in.TLSClientCert + out.TLSClientKey = in.TLSClientKey + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthRemoteConnectionInfo. +func (in *OAuthRemoteConnectionInfo) DeepCopy() *OAuthRemoteConnectionInfo { + if in == nil { + return nil + } + out := new(OAuthRemoteConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthSpec) DeepCopyInto(out *OAuthSpec) { + *out = *in + if in.IdentityProviders != nil { + in, out := &in.IdentityProviders, &out.IdentityProviders + *out = make([]IdentityProvider, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.TokenConfig.DeepCopyInto(&out.TokenConfig) + out.Templates = in.Templates + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthSpec. +func (in *OAuthSpec) DeepCopy() *OAuthSpec { + if in == nil { + return nil + } + out := new(OAuthSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthStatus) DeepCopyInto(out *OAuthStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthStatus. +func (in *OAuthStatus) DeepCopy() *OAuthStatus { + if in == nil { + return nil + } + out := new(OAuthStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthTemplates) DeepCopyInto(out *OAuthTemplates) { + *out = *in + out.Login = in.Login + out.ProviderSelection = in.ProviderSelection + out.Error = in.Error + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthTemplates. +func (in *OAuthTemplates) DeepCopy() *OAuthTemplates { + if in == nil { + return nil + } + out := new(OAuthTemplates) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCClientConfig) DeepCopyInto(out *OIDCClientConfig) { + *out = *in + out.ClientSecret = in.ClientSecret + if in.ExtraScopes != nil { + in, out := &in.ExtraScopes, &out.ExtraScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCClientConfig. +func (in *OIDCClientConfig) DeepCopy() *OIDCClientConfig { + if in == nil { + return nil + } + out := new(OIDCClientConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCClientReference) DeepCopyInto(out *OIDCClientReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCClientReference. +func (in *OIDCClientReference) DeepCopy() *OIDCClientReference { + if in == nil { + return nil + } + out := new(OIDCClientReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCClientStatus) DeepCopyInto(out *OIDCClientStatus) { + *out = *in + if in.CurrentOIDCClients != nil { + in, out := &in.CurrentOIDCClients, &out.CurrentOIDCClients + *out = make([]OIDCClientReference, len(*in)) + copy(*out, *in) + } + if in.ConsumingUsers != nil { + in, out := &in.ConsumingUsers, &out.ConsumingUsers + *out = make([]ConsumingUser, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCClientStatus. +func (in *OIDCClientStatus) DeepCopy() *OIDCClientStatus { + if in == nil { + return nil + } + out := new(OIDCClientStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OIDCProvider) DeepCopyInto(out *OIDCProvider) { + *out = *in + in.Issuer.DeepCopyInto(&out.Issuer) + if in.OIDCClients != nil { + in, out := &in.OIDCClients, &out.OIDCClients + *out = make([]OIDCClientConfig, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.ClaimMappings.DeepCopyInto(&out.ClaimMappings) + if in.ClaimValidationRules != nil { + in, out := &in.ClaimValidationRules, &out.ClaimValidationRules + *out = make([]TokenClaimValidationRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCProvider. +func (in *OIDCProvider) DeepCopy() *OIDCProvider { + if in == nil { + return nil + } + out := new(OIDCProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObjectReference) DeepCopyInto(out *ObjectReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference. +func (in *ObjectReference) DeepCopy() *ObjectReference { + if in == nil { + return nil + } + out := new(ObjectReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OldTLSProfile) DeepCopyInto(out *OldTLSProfile) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OldTLSProfile. +func (in *OldTLSProfile) DeepCopy() *OldTLSProfile { + if in == nil { + return nil + } + out := new(OldTLSProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { + *out = *in + if in.PreferredUsername != nil { + in, out := &in.PreferredUsername, &out.PreferredUsername + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Email != nil { + in, out := &in.Email, &out.Email + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Groups != nil { + in, out := &in.Groups, &out.Groups + *out = make([]OpenIDClaim, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDClaims. +func (in *OpenIDClaims) DeepCopy() *OpenIDClaims { + if in == nil { + return nil + } + out := new(OpenIDClaims) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenIDIdentityProvider) DeepCopyInto(out *OpenIDIdentityProvider) { + *out = *in + out.ClientSecret = in.ClientSecret + out.CA = in.CA + if in.ExtraScopes != nil { + in, out := &in.ExtraScopes, &out.ExtraScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExtraAuthorizeParameters != nil { + in, out := &in.ExtraAuthorizeParameters, &out.ExtraAuthorizeParameters + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + in.Claims.DeepCopyInto(&out.Claims) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDIdentityProvider. +func (in *OpenIDIdentityProvider) DeepCopy() *OpenIDIdentityProvider { + if in == nil { + return nil + } + out := new(OpenIDIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformLoadBalancer) DeepCopyInto(out *OpenStackPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformLoadBalancer. +func (in *OpenStackPlatformLoadBalancer) DeepCopy() *OpenStackPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(OpenStackPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformSpec) DeepCopyInto(out *OpenStackPlatformSpec) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformSpec. +func (in *OpenStackPlatformSpec) DeepCopy() *OpenStackPlatformSpec { + if in == nil { + return nil + } + out := new(OpenStackPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformStatus) DeepCopyInto(out *OpenStackPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(OpenStackPlatformLoadBalancer) + **out = **in + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformStatus. +func (in *OpenStackPlatformStatus) DeepCopy() *OpenStackPlatformStatus { + if in == nil { + return nil + } + out := new(OpenStackPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperandVersion) DeepCopyInto(out *OperandVersion) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperandVersion. +func (in *OperandVersion) DeepCopy() *OperandVersion { + if in == nil { + return nil + } + out := new(OperandVersion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHub) DeepCopyInto(out *OperatorHub) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHub. +func (in *OperatorHub) DeepCopy() *OperatorHub { + if in == nil { + return nil + } + out := new(OperatorHub) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperatorHub) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubList) DeepCopyInto(out *OperatorHubList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OperatorHub, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubList. +func (in *OperatorHubList) DeepCopy() *OperatorHubList { + if in == nil { + return nil + } + out := new(OperatorHubList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperatorHubList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubSpec) DeepCopyInto(out *OperatorHubSpec) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]HubSource, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubSpec. +func (in *OperatorHubSpec) DeepCopy() *OperatorHubSpec { + if in == nil { + return nil + } + out := new(OperatorHubSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubStatus) DeepCopyInto(out *OperatorHubStatus) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]HubSourceStatus, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubStatus. +func (in *OperatorHubStatus) DeepCopy() *OperatorHubStatus { + if in == nil { + return nil + } + out := new(OperatorHubStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformLoadBalancer) DeepCopyInto(out *OvirtPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformLoadBalancer. +func (in *OvirtPlatformLoadBalancer) DeepCopy() *OvirtPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(OvirtPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformSpec) DeepCopyInto(out *OvirtPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformSpec. +func (in *OvirtPlatformSpec) DeepCopy() *OvirtPlatformSpec { + if in == nil { + return nil + } + out := new(OvirtPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformStatus) DeepCopyInto(out *OvirtPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(OvirtPlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformStatus. +func (in *OvirtPlatformStatus) DeepCopy() *OvirtPlatformStatus { + if in == nil { + return nil + } + out := new(OvirtPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PKI) DeepCopyInto(out *PKI) { + *out = *in + if in.CertificateAuthorityRootsData != nil { + in, out := &in.CertificateAuthorityRootsData, &out.CertificateAuthorityRootsData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.CertificateAuthorityIntermediatesData != nil { + in, out := &in.CertificateAuthorityIntermediatesData, &out.CertificateAuthorityIntermediatesData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + out.PKICertificateSubject = in.PKICertificateSubject + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PKI. +func (in *PKI) DeepCopy() *PKI { + if in == nil { + return nil + } + out := new(PKI) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PKICertificateSubject) DeepCopyInto(out *PKICertificateSubject) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PKICertificateSubject. +func (in *PKICertificateSubject) DeepCopy() *PKICertificateSubject { + if in == nil { + return nil + } + out := new(PKICertificateSubject) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PersistentVolumeClaimReference) DeepCopyInto(out *PersistentVolumeClaimReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeClaimReference. +func (in *PersistentVolumeClaimReference) DeepCopy() *PersistentVolumeClaimReference { + if in == nil { + return nil + } + out := new(PersistentVolumeClaimReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PersistentVolumeConfig) DeepCopyInto(out *PersistentVolumeConfig) { + *out = *in + out.Claim = in.Claim + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeConfig. +func (in *PersistentVolumeConfig) DeepCopy() *PersistentVolumeConfig { + if in == nil { + return nil + } + out := new(PersistentVolumeConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlatformSpec) DeepCopyInto(out *PlatformSpec) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzurePlatformSpec) + **out = **in + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPPlatformSpec) + **out = **in + } + if in.BareMetal != nil { + in, out := &in.BareMetal, &out.BareMetal + *out = new(BareMetalPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.OpenStack != nil { + in, out := &in.OpenStack, &out.OpenStack + *out = new(OpenStackPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Ovirt != nil { + in, out := &in.Ovirt, &out.Ovirt + *out = new(OvirtPlatformSpec) + **out = **in + } + if in.VSphere != nil { + in, out := &in.VSphere, &out.VSphere + *out = new(VSpherePlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.IBMCloud != nil { + in, out := &in.IBMCloud, &out.IBMCloud + *out = new(IBMCloudPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Kubevirt != nil { + in, out := &in.Kubevirt, &out.Kubevirt + *out = new(KubevirtPlatformSpec) + **out = **in + } + if in.EquinixMetal != nil { + in, out := &in.EquinixMetal, &out.EquinixMetal + *out = new(EquinixMetalPlatformSpec) + **out = **in + } + if in.PowerVS != nil { + in, out := &in.PowerVS, &out.PowerVS + *out = new(PowerVSPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.AlibabaCloud != nil { + in, out := &in.AlibabaCloud, &out.AlibabaCloud + *out = new(AlibabaCloudPlatformSpec) + **out = **in + } + if in.Nutanix != nil { + in, out := &in.Nutanix, &out.Nutanix + *out = new(NutanixPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalPlatformSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformSpec. +func (in *PlatformSpec) DeepCopy() *PlatformSpec { + if in == nil { + return nil + } + out := new(PlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlatformStatus) DeepCopyInto(out *PlatformStatus) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzurePlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.BareMetal != nil { + in, out := &in.BareMetal, &out.BareMetal + *out = new(BareMetalPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.OpenStack != nil { + in, out := &in.OpenStack, &out.OpenStack + *out = new(OpenStackPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Ovirt != nil { + in, out := &in.Ovirt, &out.Ovirt + *out = new(OvirtPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.VSphere != nil { + in, out := &in.VSphere, &out.VSphere + *out = new(VSpherePlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.IBMCloud != nil { + in, out := &in.IBMCloud, &out.IBMCloud + *out = new(IBMCloudPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Kubevirt != nil { + in, out := &in.Kubevirt, &out.Kubevirt + *out = new(KubevirtPlatformStatus) + **out = **in + } + if in.EquinixMetal != nil { + in, out := &in.EquinixMetal, &out.EquinixMetal + *out = new(EquinixMetalPlatformStatus) + **out = **in + } + if in.PowerVS != nil { + in, out := &in.PowerVS, &out.PowerVS + *out = new(PowerVSPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.AlibabaCloud != nil { + in, out := &in.AlibabaCloud, &out.AlibabaCloud + *out = new(AlibabaCloudPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Nutanix != nil { + in, out := &in.Nutanix, &out.Nutanix + *out = new(NutanixPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalPlatformStatus) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformStatus. +func (in *PlatformStatus) DeepCopy() *PlatformStatus { + if in == nil { + return nil + } + out := new(PlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Policy) DeepCopyInto(out *Policy) { + *out = *in + in.RootOfTrust.DeepCopyInto(&out.RootOfTrust) + if in.SignedIdentity != nil { + in, out := &in.SignedIdentity, &out.SignedIdentity + *out = new(PolicyIdentity) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Policy. +func (in *Policy) DeepCopy() *Policy { + if in == nil { + return nil + } + out := new(Policy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyFulcioSubject) DeepCopyInto(out *PolicyFulcioSubject) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyFulcioSubject. +func (in *PolicyFulcioSubject) DeepCopy() *PolicyFulcioSubject { + if in == nil { + return nil + } + out := new(PolicyFulcioSubject) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyIdentity) DeepCopyInto(out *PolicyIdentity) { + *out = *in + if in.PolicyMatchExactRepository != nil { + in, out := &in.PolicyMatchExactRepository, &out.PolicyMatchExactRepository + *out = new(PolicyMatchExactRepository) + **out = **in + } + if in.PolicyMatchRemapIdentity != nil { + in, out := &in.PolicyMatchRemapIdentity, &out.PolicyMatchRemapIdentity + *out = new(PolicyMatchRemapIdentity) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyIdentity. +func (in *PolicyIdentity) DeepCopy() *PolicyIdentity { + if in == nil { + return nil + } + out := new(PolicyIdentity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyMatchExactRepository) DeepCopyInto(out *PolicyMatchExactRepository) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyMatchExactRepository. +func (in *PolicyMatchExactRepository) DeepCopy() *PolicyMatchExactRepository { + if in == nil { + return nil + } + out := new(PolicyMatchExactRepository) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyMatchRemapIdentity) DeepCopyInto(out *PolicyMatchRemapIdentity) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyMatchRemapIdentity. +func (in *PolicyMatchRemapIdentity) DeepCopy() *PolicyMatchRemapIdentity { + if in == nil { + return nil + } + out := new(PolicyMatchRemapIdentity) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PolicyRootOfTrust) DeepCopyInto(out *PolicyRootOfTrust) { + *out = *in + if in.PublicKey != nil { + in, out := &in.PublicKey, &out.PublicKey + *out = new(PublicKey) + (*in).DeepCopyInto(*out) + } + if in.FulcioCAWithRekor != nil { + in, out := &in.FulcioCAWithRekor, &out.FulcioCAWithRekor + *out = new(FulcioCAWithRekor) + (*in).DeepCopyInto(*out) + } + if in.PKI != nil { + in, out := &in.PKI, &out.PKI + *out = new(PKI) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRootOfTrust. +func (in *PolicyRootOfTrust) DeepCopy() *PolicyRootOfTrust { + if in == nil { + return nil + } + out := new(PolicyRootOfTrust) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSPlatformSpec) DeepCopyInto(out *PowerVSPlatformSpec) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]PowerVSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSPlatformSpec. +func (in *PowerVSPlatformSpec) DeepCopy() *PowerVSPlatformSpec { + if in == nil { + return nil + } + out := new(PowerVSPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSPlatformStatus) DeepCopyInto(out *PowerVSPlatformStatus) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]PowerVSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSPlatformStatus. +func (in *PowerVSPlatformStatus) DeepCopy() *PowerVSPlatformStatus { + if in == nil { + return nil + } + out := new(PowerVSPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSServiceEndpoint) DeepCopyInto(out *PowerVSServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSServiceEndpoint. +func (in *PowerVSServiceEndpoint) DeepCopy() *PowerVSServiceEndpoint { + if in == nil { + return nil + } + out := new(PowerVSServiceEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PrefixedClaimMapping) DeepCopyInto(out *PrefixedClaimMapping) { + *out = *in + out.TokenClaimMapping = in.TokenClaimMapping + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrefixedClaimMapping. +func (in *PrefixedClaimMapping) DeepCopy() *PrefixedClaimMapping { + if in == nil { + return nil + } + out := new(PrefixedClaimMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProfileCustomizations) DeepCopyInto(out *ProfileCustomizations) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProfileCustomizations. +func (in *ProfileCustomizations) DeepCopy() *ProfileCustomizations { + if in == nil { + return nil + } + out := new(ProfileCustomizations) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Project) DeepCopyInto(out *Project) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Project. +func (in *Project) DeepCopy() *Project { + if in == nil { + return nil + } + out := new(Project) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Project) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectList) DeepCopyInto(out *ProjectList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Project, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectList. +func (in *ProjectList) DeepCopy() *ProjectList { + if in == nil { + return nil + } + out := new(ProjectList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ProjectList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectSpec) DeepCopyInto(out *ProjectSpec) { + *out = *in + out.ProjectRequestTemplate = in.ProjectRequestTemplate + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSpec. +func (in *ProjectSpec) DeepCopy() *ProjectSpec { + if in == nil { + return nil + } + out := new(ProjectSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectStatus) DeepCopyInto(out *ProjectStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectStatus. +func (in *ProjectStatus) DeepCopy() *ProjectStatus { + if in == nil { + return nil + } + out := new(ProjectStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromQLClusterCondition) DeepCopyInto(out *PromQLClusterCondition) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromQLClusterCondition. +func (in *PromQLClusterCondition) DeepCopy() *PromQLClusterCondition { + if in == nil { + return nil + } + out := new(PromQLClusterCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Proxy) DeepCopyInto(out *Proxy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. +func (in *Proxy) DeepCopy() *Proxy { + if in == nil { + return nil + } + out := new(Proxy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Proxy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxyList) DeepCopyInto(out *ProxyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Proxy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyList. +func (in *ProxyList) DeepCopy() *ProxyList { + if in == nil { + return nil + } + out := new(ProxyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ProxyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxySpec) DeepCopyInto(out *ProxySpec) { + *out = *in + if in.ReadinessEndpoints != nil { + in, out := &in.ReadinessEndpoints, &out.ReadinessEndpoints + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.TrustedCA = in.TrustedCA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxySpec. +func (in *ProxySpec) DeepCopy() *ProxySpec { + if in == nil { + return nil + } + out := new(ProxySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxyStatus) DeepCopyInto(out *ProxyStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyStatus. +func (in *ProxyStatus) DeepCopy() *ProxyStatus { + if in == nil { + return nil + } + out := new(ProxyStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PublicKey) DeepCopyInto(out *PublicKey) { + *out = *in + if in.KeyData != nil { + in, out := &in.KeyData, &out.KeyData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.RekorKeyData != nil { + in, out := &in.RekorKeyData, &out.RekorKeyData + *out = make([]byte, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PublicKey. +func (in *PublicKey) DeepCopy() *PublicKey { + if in == nil { + return nil + } + out := new(PublicKey) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RegistryLocation) DeepCopyInto(out *RegistryLocation) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryLocation. +func (in *RegistryLocation) DeepCopy() *RegistryLocation { + if in == nil { + return nil + } + out := new(RegistryLocation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RegistrySources) DeepCopyInto(out *RegistrySources) { + *out = *in + if in.InsecureRegistries != nil { + in, out := &in.InsecureRegistries, &out.InsecureRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.BlockedRegistries != nil { + in, out := &in.BlockedRegistries, &out.BlockedRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.AllowedRegistries != nil { + in, out := &in.AllowedRegistries, &out.AllowedRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ContainerRuntimeSearchRegistries != nil { + in, out := &in.ContainerRuntimeSearchRegistries, &out.ContainerRuntimeSearchRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistrySources. +func (in *RegistrySources) DeepCopy() *RegistrySources { + if in == nil { + return nil + } + out := new(RegistrySources) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Release) DeepCopyInto(out *Release) { + *out = *in + if in.Channels != nil { + in, out := &in.Channels, &out.Channels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Release. +func (in *Release) DeepCopy() *Release { + if in == nil { + return nil + } + out := new(Release) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RemoteConnectionInfo) DeepCopyInto(out *RemoteConnectionInfo) { + *out = *in + out.CertInfo = in.CertInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteConnectionInfo. +func (in *RemoteConnectionInfo) DeepCopy() *RemoteConnectionInfo { + if in == nil { + return nil + } + out := new(RemoteConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RepositoryDigestMirrors) DeepCopyInto(out *RepositoryDigestMirrors) { + *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]Mirror, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepositoryDigestMirrors. +func (in *RepositoryDigestMirrors) DeepCopy() *RepositoryDigestMirrors { + if in == nil { + return nil + } + out := new(RepositoryDigestMirrors) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RequestHeaderIdentityProvider) DeepCopyInto(out *RequestHeaderIdentityProvider) { + *out = *in + out.ClientCA = in.ClientCA + if in.ClientCommonNames != nil { + in, out := &in.ClientCommonNames, &out.ClientCommonNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Headers != nil { + in, out := &in.Headers, &out.Headers + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PreferredUsernameHeaders != nil { + in, out := &in.PreferredUsernameHeaders, &out.PreferredUsernameHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NameHeaders != nil { + in, out := &in.NameHeaders, &out.NameHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.EmailHeaders != nil { + in, out := &in.EmailHeaders, &out.EmailHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestHeaderIdentityProvider. +func (in *RequestHeaderIdentityProvider) DeepCopy() *RequestHeaderIdentityProvider { + if in == nil { + return nil + } + out := new(RequestHeaderIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RequiredHSTSPolicy) DeepCopyInto(out *RequiredHSTSPolicy) { + *out = *in + if in.NamespaceSelector != nil { + in, out := &in.NamespaceSelector, &out.NamespaceSelector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.DomainPatterns != nil { + in, out := &in.DomainPatterns, &out.DomainPatterns + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.MaxAge.DeepCopyInto(&out.MaxAge) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequiredHSTSPolicy. +func (in *RequiredHSTSPolicy) DeepCopy() *RequiredHSTSPolicy { + if in == nil { + return nil + } + out := new(RequiredHSTSPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Scheduler) DeepCopyInto(out *Scheduler) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Scheduler. +func (in *Scheduler) DeepCopy() *Scheduler { + if in == nil { + return nil + } + out := new(Scheduler) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Scheduler) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerList) DeepCopyInto(out *SchedulerList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Scheduler, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerList. +func (in *SchedulerList) DeepCopy() *SchedulerList { + if in == nil { + return nil + } + out := new(SchedulerList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SchedulerList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerSpec) DeepCopyInto(out *SchedulerSpec) { + *out = *in + out.Policy = in.Policy + out.ProfileCustomizations = in.ProfileCustomizations + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerSpec. +func (in *SchedulerSpec) DeepCopy() *SchedulerSpec { + if in == nil { + return nil + } + out := new(SchedulerSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerStatus) DeepCopyInto(out *SchedulerStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerStatus. +func (in *SchedulerStatus) DeepCopy() *SchedulerStatus { + if in == nil { + return nil + } + out := new(SchedulerStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretNameReference) DeepCopyInto(out *SecretNameReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNameReference. +func (in *SecretNameReference) DeepCopy() *SecretNameReference { + if in == nil { + return nil + } + out := new(SecretNameReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServingInfo) DeepCopyInto(out *ServingInfo) { + *out = *in + out.CertInfo = in.CertInfo + if in.NamedCertificates != nil { + in, out := &in.NamedCertificates, &out.NamedCertificates + *out = make([]NamedCertificate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.CipherSuites != nil { + in, out := &in.CipherSuites, &out.CipherSuites + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingInfo. +func (in *ServingInfo) DeepCopy() *ServingInfo { + if in == nil { + return nil + } + out := new(ServingInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SignatureStore) DeepCopyInto(out *SignatureStore) { + *out = *in + out.CA = in.CA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SignatureStore. +func (in *SignatureStore) DeepCopy() *SignatureStore { + if in == nil { + return nil + } + out := new(SignatureStore) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Storage) DeepCopyInto(out *Storage) { + *out = *in + out.PersistentVolume = in.PersistentVolume + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Storage. +func (in *Storage) DeepCopy() *Storage { + if in == nil { + return nil + } + out := new(Storage) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StringSource) DeepCopyInto(out *StringSource) { + *out = *in + out.StringSourceSpec = in.StringSourceSpec + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSource. +func (in *StringSource) DeepCopy() *StringSource { + if in == nil { + return nil + } + out := new(StringSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StringSourceSpec) DeepCopyInto(out *StringSourceSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSourceSpec. +func (in *StringSourceSpec) DeepCopy() *StringSourceSpec { + if in == nil { + return nil + } + out := new(StringSourceSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TLSProfileSpec) DeepCopyInto(out *TLSProfileSpec) { + *out = *in + if in.Ciphers != nil { + in, out := &in.Ciphers, &out.Ciphers *out = make([]string, len(*in)) copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistrySources. -func (in *RegistrySources) DeepCopy() *RegistrySources { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSProfileSpec. +func (in *TLSProfileSpec) DeepCopy() *TLSProfileSpec { + if in == nil { + return nil + } + out := new(TLSProfileSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TLSSecurityProfile) DeepCopyInto(out *TLSSecurityProfile) { + *out = *in + if in.Old != nil { + in, out := &in.Old, &out.Old + *out = new(OldTLSProfile) + **out = **in + } + if in.Intermediate != nil { + in, out := &in.Intermediate, &out.Intermediate + *out = new(IntermediateTLSProfile) + **out = **in + } + if in.Modern != nil { + in, out := &in.Modern, &out.Modern + *out = new(ModernTLSProfile) + **out = **in + } + if in.Custom != nil { + in, out := &in.Custom, &out.Custom + *out = new(CustomTLSProfile) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSSecurityProfile. +func (in *TLSSecurityProfile) DeepCopy() *TLSSecurityProfile { + if in == nil { + return nil + } + out := new(TLSSecurityProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TemplateReference) DeepCopyInto(out *TemplateReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateReference. +func (in *TemplateReference) DeepCopy() *TemplateReference { + if in == nil { + return nil + } + out := new(TemplateReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestDetails) DeepCopyInto(out *TestDetails) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestDetails. +func (in *TestDetails) DeepCopy() *TestDetails { + if in == nil { + return nil + } + out := new(TestDetails) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestReporting) DeepCopyInto(out *TestReporting) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestReporting. +func (in *TestReporting) DeepCopy() *TestReporting { + if in == nil { + return nil + } + out := new(TestReporting) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestReportingSpec) DeepCopyInto(out *TestReportingSpec) { + *out = *in + if in.TestsForFeatureGates != nil { + in, out := &in.TestsForFeatureGates, &out.TestsForFeatureGates + *out = make([]FeatureGateTests, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestReportingSpec. +func (in *TestReportingSpec) DeepCopy() *TestReportingSpec { + if in == nil { + return nil + } + out := new(TestReportingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TestReportingStatus) DeepCopyInto(out *TestReportingStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestReportingStatus. +func (in *TestReportingStatus) DeepCopy() *TestReportingStatus { + if in == nil { + return nil + } + out := new(TestReportingStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenClaimMapping) DeepCopyInto(out *TokenClaimMapping) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimMapping. +func (in *TokenClaimMapping) DeepCopy() *TokenClaimMapping { + if in == nil { + return nil + } + out := new(TokenClaimMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenClaimMappings) DeepCopyInto(out *TokenClaimMappings) { + *out = *in + in.Username.DeepCopyInto(&out.Username) + out.Groups = in.Groups + if in.UID != nil { + in, out := &in.UID, &out.UID + *out = new(TokenClaimOrExpressionMapping) + **out = **in + } + if in.Extra != nil { + in, out := &in.Extra, &out.Extra + *out = make([]ExtraMapping, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimMappings. +func (in *TokenClaimMappings) DeepCopy() *TokenClaimMappings { + if in == nil { + return nil + } + out := new(TokenClaimMappings) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenClaimOrExpressionMapping) DeepCopyInto(out *TokenClaimOrExpressionMapping) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimOrExpressionMapping. +func (in *TokenClaimOrExpressionMapping) DeepCopy() *TokenClaimOrExpressionMapping { if in == nil { return nil } - out := new(RegistrySources) + out := new(TokenClaimOrExpressionMapping) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Release) DeepCopyInto(out *Release) { +func (in *TokenClaimValidationRule) DeepCopyInto(out *TokenClaimValidationRule) { *out = *in - if in.Channels != nil { - in, out := &in.Channels, &out.Channels - *out = make([]string, len(*in)) - copy(*out, *in) + if in.RequiredClaim != nil { + in, out := &in.RequiredClaim, &out.RequiredClaim + *out = new(TokenRequiredClaim) + **out = **in } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Release. -func (in *Release) DeepCopy() *Release { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenClaimValidationRule. +func (in *TokenClaimValidationRule) DeepCopy() *TokenClaimValidationRule { if in == nil { return nil } - out := new(Release) + out := new(TokenClaimValidationRule) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RemoteConnectionInfo) DeepCopyInto(out *RemoteConnectionInfo) { +func (in *TokenConfig) DeepCopyInto(out *TokenConfig) { *out = *in - out.CertInfo = in.CertInfo + if in.AccessTokenInactivityTimeout != nil { + in, out := &in.AccessTokenInactivityTimeout, &out.AccessTokenInactivityTimeout + *out = new(metav1.Duration) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteConnectionInfo. -func (in *RemoteConnectionInfo) DeepCopy() *RemoteConnectionInfo { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenConfig. +func (in *TokenConfig) DeepCopy() *TokenConfig { if in == nil { return nil } - out := new(RemoteConnectionInfo) + out := new(TokenConfig) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RequestHeaderIdentityProvider) DeepCopyInto(out *RequestHeaderIdentityProvider) { +func (in *TokenIssuer) DeepCopyInto(out *TokenIssuer) { *out = *in - out.ClientCA = in.ClientCA - if in.ClientCommonNames != nil { - in, out := &in.ClientCommonNames, &out.ClientCommonNames - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Headers != nil { - in, out := &in.Headers, &out.Headers - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.PreferredUsernameHeaders != nil { - in, out := &in.PreferredUsernameHeaders, &out.PreferredUsernameHeaders - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.NameHeaders != nil { - in, out := &in.NameHeaders, &out.NameHeaders - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.EmailHeaders != nil { - in, out := &in.EmailHeaders, &out.EmailHeaders - *out = make([]string, len(*in)) + if in.Audiences != nil { + in, out := &in.Audiences, &out.Audiences + *out = make([]TokenAudience, len(*in)) copy(*out, *in) } + out.CertificateAuthority = in.CertificateAuthority return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestHeaderIdentityProvider. -func (in *RequestHeaderIdentityProvider) DeepCopy() *RequestHeaderIdentityProvider { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenIssuer. +func (in *TokenIssuer) DeepCopy() *TokenIssuer { if in == nil { return nil } - out := new(RequestHeaderIdentityProvider) + out := new(TokenIssuer) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Scheduler) DeepCopyInto(out *Scheduler) { +func (in *TokenRequiredClaim) DeepCopyInto(out *TokenRequiredClaim) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - out.Status = in.Status return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Scheduler. -func (in *Scheduler) DeepCopy() *Scheduler { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenRequiredClaim. +func (in *TokenRequiredClaim) DeepCopy() *TokenRequiredClaim { if in == nil { return nil } - out := new(Scheduler) + out := new(TokenRequiredClaim) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Scheduler) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerList) DeepCopyInto(out *SchedulerList) { +func (in *Update) DeepCopyInto(out *Update) { *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Scheduler, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerList. -func (in *SchedulerList) DeepCopy() *SchedulerList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Update. +func (in *Update) DeepCopy() *Update { if in == nil { return nil } - out := new(SchedulerList) + out := new(Update) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *SchedulerList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerSpec) DeepCopyInto(out *SchedulerSpec) { +func (in *UpdateHistory) DeepCopyInto(out *UpdateHistory) { *out = *in - out.Policy = in.Policy + in.StartedTime.DeepCopyInto(&out.StartedTime) + if in.CompletionTime != nil { + in, out := &in.CompletionTime, &out.CompletionTime + *out = (*in).DeepCopy() + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerSpec. -func (in *SchedulerSpec) DeepCopy() *SchedulerSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateHistory. +func (in *UpdateHistory) DeepCopy() *UpdateHistory { if in == nil { return nil } - out := new(SchedulerSpec) + out := new(UpdateHistory) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerStatus) DeepCopyInto(out *SchedulerStatus) { +func (in *UsernameClaimMapping) DeepCopyInto(out *UsernameClaimMapping) { *out = *in + if in.Prefix != nil { + in, out := &in.Prefix, &out.Prefix + *out = new(UsernamePrefix) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerStatus. -func (in *SchedulerStatus) DeepCopy() *SchedulerStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UsernameClaimMapping. +func (in *UsernameClaimMapping) DeepCopy() *UsernameClaimMapping { if in == nil { return nil } - out := new(SchedulerStatus) + out := new(UsernameClaimMapping) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SecretNameReference) DeepCopyInto(out *SecretNameReference) { +func (in *UsernamePrefix) DeepCopyInto(out *UsernamePrefix) { *out = *in return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNameReference. -func (in *SecretNameReference) DeepCopy() *SecretNameReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UsernamePrefix. +func (in *UsernamePrefix) DeepCopy() *UsernamePrefix { if in == nil { return nil } - out := new(SecretNameReference) + out := new(UsernamePrefix) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServingInfo) DeepCopyInto(out *ServingInfo) { +func (in *VSphereFailureDomainHostGroup) DeepCopyInto(out *VSphereFailureDomainHostGroup) { *out = *in - out.CertInfo = in.CertInfo - if in.NamedCertificates != nil { - in, out := &in.NamedCertificates, &out.NamedCertificates - *out = make([]NamedCertificate, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.CipherSuites != nil { - in, out := &in.CipherSuites, &out.CipherSuites - *out = make([]string, len(*in)) - copy(*out, *in) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingInfo. -func (in *ServingInfo) DeepCopy() *ServingInfo { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereFailureDomainHostGroup. +func (in *VSphereFailureDomainHostGroup) DeepCopy() *VSphereFailureDomainHostGroup { if in == nil { return nil } - out := new(ServingInfo) + out := new(VSphereFailureDomainHostGroup) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StringSource) DeepCopyInto(out *StringSource) { +func (in *VSphereFailureDomainRegionAffinity) DeepCopyInto(out *VSphereFailureDomainRegionAffinity) { *out = *in - out.StringSourceSpec = in.StringSourceSpec return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSource. -func (in *StringSource) DeepCopy() *StringSource { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereFailureDomainRegionAffinity. +func (in *VSphereFailureDomainRegionAffinity) DeepCopy() *VSphereFailureDomainRegionAffinity { if in == nil { return nil } - out := new(StringSource) + out := new(VSphereFailureDomainRegionAffinity) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *StringSourceSpec) DeepCopyInto(out *StringSourceSpec) { +func (in *VSphereFailureDomainZoneAffinity) DeepCopyInto(out *VSphereFailureDomainZoneAffinity) { *out = *in + if in.HostGroup != nil { + in, out := &in.HostGroup, &out.HostGroup + *out = new(VSphereFailureDomainHostGroup) + **out = **in + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSourceSpec. -func (in *StringSourceSpec) DeepCopy() *StringSourceSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereFailureDomainZoneAffinity. +func (in *VSphereFailureDomainZoneAffinity) DeepCopy() *VSphereFailureDomainZoneAffinity { if in == nil { return nil } - out := new(StringSourceSpec) + out := new(VSphereFailureDomainZoneAffinity) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSProfileSpec) DeepCopyInto(out *TLSProfileSpec) { +func (in *VSpherePlatformFailureDomainSpec) DeepCopyInto(out *VSpherePlatformFailureDomainSpec) { *out = *in - if in.Ciphers != nil { - in, out := &in.Ciphers, &out.Ciphers - *out = make([]string, len(*in)) - copy(*out, *in) + if in.RegionAffinity != nil { + in, out := &in.RegionAffinity, &out.RegionAffinity + *out = new(VSphereFailureDomainRegionAffinity) + **out = **in + } + if in.ZoneAffinity != nil { + in, out := &in.ZoneAffinity, &out.ZoneAffinity + *out = new(VSphereFailureDomainZoneAffinity) + (*in).DeepCopyInto(*out) } + in.Topology.DeepCopyInto(&out.Topology) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSProfileSpec. -func (in *TLSProfileSpec) DeepCopy() *TLSProfileSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformFailureDomainSpec. +func (in *VSpherePlatformFailureDomainSpec) DeepCopy() *VSpherePlatformFailureDomainSpec { if in == nil { return nil } - out := new(TLSProfileSpec) + out := new(VSpherePlatformFailureDomainSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSSecurityProfile) DeepCopyInto(out *TLSSecurityProfile) { +func (in *VSpherePlatformLoadBalancer) DeepCopyInto(out *VSpherePlatformLoadBalancer) { *out = *in - if in.Old != nil { - in, out := &in.Old, &out.Old - *out = new(OldTLSProfile) - **out = **in - } - if in.Intermediate != nil { - in, out := &in.Intermediate, &out.Intermediate - *out = new(IntermediateTLSProfile) - **out = **in - } - if in.Modern != nil { - in, out := &in.Modern, &out.Modern - *out = new(ModernTLSProfile) - **out = **in - } - if in.Custom != nil { - in, out := &in.Custom, &out.Custom - *out = new(CustomTLSProfile) - (*in).DeepCopyInto(*out) - } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSSecurityProfile. -func (in *TLSSecurityProfile) DeepCopy() *TLSSecurityProfile { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformLoadBalancer. +func (in *VSpherePlatformLoadBalancer) DeepCopy() *VSpherePlatformLoadBalancer { if in == nil { return nil } - out := new(TLSSecurityProfile) + out := new(VSpherePlatformLoadBalancer) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateReference) DeepCopyInto(out *TemplateReference) { +func (in *VSpherePlatformNodeNetworking) DeepCopyInto(out *VSpherePlatformNodeNetworking) { *out = *in + in.External.DeepCopyInto(&out.External) + in.Internal.DeepCopyInto(&out.Internal) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateReference. -func (in *TemplateReference) DeepCopy() *TemplateReference { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformNodeNetworking. +func (in *VSpherePlatformNodeNetworking) DeepCopy() *VSpherePlatformNodeNetworking { if in == nil { return nil } - out := new(TemplateReference) + out := new(VSpherePlatformNodeNetworking) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TokenConfig) DeepCopyInto(out *TokenConfig) { +func (in *VSpherePlatformNodeNetworkingSpec) DeepCopyInto(out *VSpherePlatformNodeNetworkingSpec) { *out = *in - if in.AccessTokenInactivityTimeout != nil { - in, out := &in.AccessTokenInactivityTimeout, &out.AccessTokenInactivityTimeout - *out = new(metav1.Duration) - **out = **in + if in.NetworkSubnetCIDR != nil { + in, out := &in.NetworkSubnetCIDR, &out.NetworkSubnetCIDR + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExcludeNetworkSubnetCIDR != nil { + in, out := &in.ExcludeNetworkSubnetCIDR, &out.ExcludeNetworkSubnetCIDR + *out = make([]string, len(*in)) + copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenConfig. -func (in *TokenConfig) DeepCopy() *TokenConfig { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformNodeNetworkingSpec. +func (in *VSpherePlatformNodeNetworkingSpec) DeepCopy() *VSpherePlatformNodeNetworkingSpec { if in == nil { return nil } - out := new(TokenConfig) + out := new(VSpherePlatformNodeNetworkingSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Update) DeepCopyInto(out *Update) { +func (in *VSpherePlatformSpec) DeepCopyInto(out *VSpherePlatformSpec) { *out = *in + if in.VCenters != nil { + in, out := &in.VCenters, &out.VCenters + *out = make([]VSpherePlatformVCenterSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailureDomains != nil { + in, out := &in.FailureDomains, &out.FailureDomains + *out = make([]VSpherePlatformFailureDomainSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.NodeNetworking.DeepCopyInto(&out.NodeNetworking) + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]IP, len(*in)) + copy(*out, *in) + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Update. -func (in *Update) DeepCopy() *Update { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformSpec. +func (in *VSpherePlatformSpec) DeepCopy() *VSpherePlatformSpec { if in == nil { return nil } - out := new(Update) + out := new(VSpherePlatformSpec) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *UpdateHistory) DeepCopyInto(out *UpdateHistory) { +func (in *VSpherePlatformStatus) DeepCopyInto(out *VSpherePlatformStatus) { *out = *in - in.StartedTime.DeepCopyInto(&out.StartedTime) - if in.CompletionTime != nil { - in, out := &in.CompletionTime, &out.CompletionTime - *out = (*in).DeepCopy() + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(VSpherePlatformLoadBalancer) + **out = **in + } + if in.MachineNetworks != nil { + in, out := &in.MachineNetworks, &out.MachineNetworks + *out = make([]CIDR, len(*in)) + copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateHistory. -func (in *UpdateHistory) DeepCopy() *UpdateHistory { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformStatus. +func (in *VSpherePlatformStatus) DeepCopy() *VSpherePlatformStatus { if in == nil { return nil } - out := new(UpdateHistory) + out := new(VSpherePlatformStatus) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSpherePlatformSpec) DeepCopyInto(out *VSpherePlatformSpec) { +func (in *VSpherePlatformTopology) DeepCopyInto(out *VSpherePlatformTopology) { *out = *in + if in.Networks != nil { + in, out := &in.Networks, &out.Networks + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformSpec. -func (in *VSpherePlatformSpec) DeepCopy() *VSpherePlatformSpec { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformTopology. +func (in *VSpherePlatformTopology) DeepCopy() *VSpherePlatformTopology { if in == nil { return nil } - out := new(VSpherePlatformSpec) + out := new(VSpherePlatformTopology) in.DeepCopyInto(out) return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSpherePlatformStatus) DeepCopyInto(out *VSpherePlatformStatus) { +func (in *VSpherePlatformVCenterSpec) DeepCopyInto(out *VSpherePlatformVCenterSpec) { *out = *in + if in.Datacenters != nil { + in, out := &in.Datacenters, &out.Datacenters + *out = make([]string, len(*in)) + copy(*out, *in) + } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformStatus. -func (in *VSpherePlatformStatus) DeepCopy() *VSpherePlatformStatus { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformVCenterSpec. +func (in *VSpherePlatformVCenterSpec) DeepCopy() *VSpherePlatformVCenterSpec { if in == nil { return nil } - out := new(VSpherePlatformStatus) + out := new(VSpherePlatformVCenterSpec) in.DeepCopyInto(out) return out } diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml b/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml new file mode 100644 index 0000000000..03b091ead5 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml @@ -0,0 +1,591 @@ +apiservers.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: apiservers.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - KMSEncryptionProvider + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: APIServer + Labels: {} + PluralName: apiservers + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +authentications.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: authentications.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - ExternalOIDC + - ExternalOIDCWithUIDAndExtraClaimMappings + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Authentication + Labels: {} + PluralName: authentications + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +builds.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: builds.config.openshift.io + Capability: Build + Category: "" + FeatureGates: [] + FilenameOperatorName: openshift-controller-manager + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Build + Labels: {} + PluralName: builds + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +clusterimagepolicies.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/2310 + CRDName: clusterimagepolicies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - SigstoreImageVerification + - SigstoreImageVerificationPKI + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ClusterImagePolicy + Labels: {} + PluralName: clusterimagepolicies + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: + - SigstoreImageVerification + Version: v1 + +clusteroperators.config.openshift.io: + Annotations: + include.release.openshift.io/self-managed-high-availability: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/497 + CRDName: clusteroperators.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: cluster-version-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_00" + GroupName: config.openshift.io + HasStatus: true + KindName: ClusterOperator + Labels: {} + PluralName: clusteroperators + PrinterColumns: + - description: The version the operator is at. + jsonPath: .status.versions[?(@.name=="operator")].version + name: Version + type: string + - description: Whether the operator is running and stable. + jsonPath: .status.conditions[?(@.type=="Available")].status + name: Available + type: string + - description: Whether the operator is processing changes. + jsonPath: .status.conditions[?(@.type=="Progressing")].status + name: Progressing + type: string + - description: Whether the operator is degraded. + jsonPath: .status.conditions[?(@.type=="Degraded")].status + name: Degraded + type: string + - description: The time the operator's Available status last changed. + jsonPath: .status.conditions[?(@.type=="Available")].lastTransitionTime + name: Since + type: date + Scope: Cluster + ShortNames: + - co + TopLevelFeatureGates: [] + Version: v1 + +clusterversions.config.openshift.io: + Annotations: + include.release.openshift.io/self-managed-high-availability: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/495 + CRDName: clusterversions.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - ImageStreamImportMode + - SignatureStores + FilenameOperatorName: cluster-version-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_00" + GroupName: config.openshift.io + HasStatus: true + KindName: ClusterVersion + Labels: {} + PluralName: clusterversions + PrinterColumns: + - jsonPath: .status.history[?(@.state=="Completed")].version + name: Version + type: string + - jsonPath: .status.conditions[?(@.type=="Available")].status + name: Available + type: string + - jsonPath: .status.conditions[?(@.type=="Progressing")].status + name: Progressing + type: string + - jsonPath: .status.conditions[?(@.type=="Progressing")].lastTransitionTime + name: Since + type: date + - jsonPath: .status.conditions[?(@.type=="Progressing")].message + name: Status + type: string + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +consoles.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: consoles.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Console + Labels: {} + PluralName: consoles + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +dnses.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: dnses.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: DNS + Labels: {} + PluralName: dnses + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +featuregates.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: featuregates.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: FeatureGate + Labels: {} + PluralName: featuregates + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +images.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: images.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - ImageStreamImportMode + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Image + Labels: {} + PluralName: images + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +imagecontentpolicies.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/874 + CRDName: imagecontentpolicies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImageContentPolicy + Labels: {} + PluralName: imagecontentpolicies + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +imagedigestmirrorsets.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/1126 + CRDName: imagedigestmirrorsets.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImageDigestMirrorSet + Labels: {} + PluralName: imagedigestmirrorsets + PrinterColumns: [] + Scope: Cluster + ShortNames: + - idms + TopLevelFeatureGates: [] + Version: v1 + +imagepolicies.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/2310 + CRDName: imagepolicies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - SigstoreImageVerification + - SigstoreImageVerificationPKI + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImagePolicy + Labels: {} + PluralName: imagepolicies + PrinterColumns: [] + Scope: Namespaced + ShortNames: null + TopLevelFeatureGates: + - SigstoreImageVerification + Version: v1 + +imagetagmirrorsets.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/1126 + CRDName: imagetagmirrorsets.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: ImageTagMirrorSet + Labels: {} + PluralName: imagetagmirrorsets + PrinterColumns: [] + Scope: Cluster + ShortNames: + - itms + TopLevelFeatureGates: [] + Version: v1 + +infrastructures.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: infrastructures.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - AWSClusterHostedDNSInstall + - AWSDualStackInstall + - AzureClusterHostedDNSInstall + - AzureDualStackInstall + - DualReplica + - DyanmicServiceEndpointIBMCloud + - GCPClusterHostedDNSInstall + - GCPCustomAPIEndpointsInstall + - HighlyAvailableArbiter + - HighlyAvailableArbiter+DualReplica + - NutanixMultiSubnets + - VSphereHostVMGroupZonal + - VSphereMultiNetworks + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Infrastructure + Labels: {} + PluralName: infrastructures + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +ingresses.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: ingresses.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Ingress + Labels: {} + PluralName: ingresses + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +insightsdatagathers.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/2448 + CRDName: insightsdatagathers.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - InsightsConfig + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: false + KindName: InsightsDataGather + Labels: {} + PluralName: insightsdatagathers + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: + - InsightsConfig + Version: v1 + +networks.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: networks.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - NetworkDiagnosticsConfig + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: false + KindName: Network + Labels: {} + PluralName: networks + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +nodes.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/1107 + CRDName: nodes.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - MinimumKubeletVersion + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Node + Labels: {} + PluralName: nodes + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +oauths.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: oauths.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: OAuth + Labels: {} + PluralName: oauths + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +operatorhubs.config.openshift.io: + Annotations: {} + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: operatorhubs.config.openshift.io + Capability: marketplace + Category: "" + FeatureGates: [] + FilenameOperatorName: marketplace + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_03" + GroupName: config.openshift.io + HasStatus: true + KindName: OperatorHub + Labels: {} + PluralName: operatorhubs + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +projects.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: projects.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Project + Labels: {} + PluralName: projects + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +proxies.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: proxies.config.openshift.io + Capability: "" + Category: "" + FeatureGates: [] + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_03" + GroupName: config.openshift.io + HasStatus: true + KindName: Proxy + Labels: {} + PluralName: proxies + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + +schedulers.config.openshift.io: + Annotations: + release.openshift.io/bootstrap-required: "true" + ApprovedPRNumber: https://github.com/openshift/api/pull/470 + CRDName: schedulers.config.openshift.io + Capability: "" + Category: "" + FeatureGates: + - DynamicResourceAllocation + FilenameOperatorName: config-operator + FilenameOperatorOrdering: "01" + FilenameRunLevel: "0000_10" + GroupName: config.openshift.io + HasStatus: true + KindName: Scheduler + Labels: {} + PluralName: schedulers + PrinterColumns: [] + Scope: Cluster + ShortNames: null + TopLevelFeatureGates: [] + Version: v1 + diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go index 22de664b22..0d8587e1dc 100644 --- a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go @@ -22,8 +22,8 @@ func (AdmissionConfig) SwaggerDoc() map[string]string { var map_AdmissionPluginConfig = map[string]string{ "": "AdmissionPluginConfig holds the necessary configuration options for admission plugins", - "location": "Location is the path to a configuration file that contains the plugin's configuration", - "configuration": "Configuration is an embedded configuration object to be used as the plugin's configuration. If present, it will be used instead of the path to the configuration file.", + "location": "location is the path to a configuration file that contains the plugin's configuration", + "configuration": "configuration is an embedded configuration object to be used as the plugin's configuration. If present, it will be used instead of the path to the configuration file.", } func (AdmissionPluginConfig) SwaggerDoc() map[string]string { @@ -37,8 +37,8 @@ var map_AuditConfig = map[string]string{ "maximumFileRetentionDays": "Maximum number of days to retain old log files based on the timestamp encoded in their filename.", "maximumRetainedFiles": "Maximum number of old log files to retain.", "maximumFileSizeMegabytes": "Maximum size in megabytes of the log file before it gets rotated. Defaults to 100MB.", - "policyFile": "PolicyFile is a path to the file that defines the audit policy configuration.", - "policyConfiguration": "PolicyConfiguration is an embedded policy configuration object to be used as the audit policy configuration. If present, it will be used instead of the path to the policy file.", + "policyFile": "policyFile is a path to the file that defines the audit policy configuration.", + "policyConfiguration": "policyConfiguration is an embedded policy configuration object to be used as the audit policy configuration. If present, it will be used instead of the path to the policy file.", "logFormat": "Format of saved audits (legacy or json).", "webHookKubeConfig": "Path to a .kubeconfig formatted file that defines the audit webhook configuration.", "webHookMode": "Strategy for sending audit events (block or batch).", @@ -50,8 +50,8 @@ func (AuditConfig) SwaggerDoc() map[string]string { var map_CertInfo = map[string]string{ "": "CertInfo relates a certificate with a private key", - "certFile": "CertFile is a file containing a PEM-encoded certificate", - "keyFile": "KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile", + "certFile": "certFile is a file containing a PEM-encoded certificate", + "keyFile": "keyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile", } func (CertInfo) SwaggerDoc() map[string]string { @@ -71,7 +71,7 @@ func (ClientConnectionOverrides) SwaggerDoc() map[string]string { var map_ConfigMapFileReference = map[string]string{ "": "ConfigMapFileReference references a config map in a specific namespace. The namespace must be specified at the point of use.", - "key": "Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references.", + "key": "key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references.", } func (ConfigMapFileReference) SwaggerDoc() map[string]string { @@ -107,8 +107,8 @@ func (DelegatedAuthorization) SwaggerDoc() map[string]string { var map_EtcdConnectionInfo = map[string]string{ "": "EtcdConnectionInfo holds information necessary for connecting to an etcd server", - "urls": "URLs are the URLs for etcd", - "ca": "CA is a file containing trusted roots for the etcd server certificates", + "urls": "urls are the URLs for etcd", + "ca": "ca is a file containing trusted roots for the etcd server certificates", } func (EtcdConnectionInfo) SwaggerDoc() map[string]string { @@ -116,7 +116,7 @@ func (EtcdConnectionInfo) SwaggerDoc() map[string]string { } var map_EtcdStorageConfig = map[string]string{ - "storagePrefix": "StoragePrefix is the path within etcd that the OpenShift resources will be rooted under. This value, if changed, will mean existing objects in etcd will no longer be located.", + "storagePrefix": "storagePrefix is the path within etcd that the OpenShift resources will be rooted under. This value, if changed, will mean existing objects in etcd will no longer be located.", } func (EtcdStorageConfig) SwaggerDoc() map[string]string { @@ -138,7 +138,7 @@ func (GenericAPIServerConfig) SwaggerDoc() map[string]string { var map_GenericControllerConfig = map[string]string{ "": "GenericControllerConfig provides information to configure a controller", - "servingInfo": "ServingInfo is the HTTP serving information for the controller's endpoints", + "servingInfo": "servingInfo is the HTTP serving information for the controller's endpoints", "leaderElection": "leaderElection provides information to elect a leader. Only override this if you have a specific need", "authentication": "authentication allows configuration of authentication for the endpoints", "authorization": "authorization allows configuration of authentication for the endpoints", @@ -150,8 +150,8 @@ func (GenericControllerConfig) SwaggerDoc() map[string]string { var map_HTTPServingInfo = map[string]string{ "": "HTTPServingInfo holds configuration for serving HTTP", - "maxRequestsInFlight": "MaxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit.", - "requestTimeoutSeconds": "RequestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if -1 there is no limit on requests.", + "maxRequestsInFlight": "maxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit.", + "requestTimeoutSeconds": "requestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if -1 there is no limit on requests.", } func (HTTPServingInfo) SwaggerDoc() map[string]string { @@ -181,9 +181,19 @@ func (LeaderElection) SwaggerDoc() map[string]string { return map_LeaderElection } +var map_MaxAgePolicy = map[string]string{ + "": "MaxAgePolicy contains a numeric range for specifying a compliant HSTS max-age for the enclosing RequiredHSTSPolicy", + "largestMaxAge": "The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age This value can be left unspecified, in which case no upper limit is enforced.", + "smallestMaxAge": "The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary tool for administrators to quickly correct mistakes. This value can be left unspecified, in which case no lower limit is enforced.", +} + +func (MaxAgePolicy) SwaggerDoc() map[string]string { + return map_MaxAgePolicy +} + var map_NamedCertificate = map[string]string{ "": "NamedCertificate specifies a certificate/key, and the names it should be served for", - "names": "Names is a list of DNS names this certificate should be used to secure A name can be a normal DNS name, or can contain leading wildcard segments.", + "names": "names is a list of DNS names this certificate should be used to secure A name can be a normal DNS name, or can contain leading wildcard segments.", } func (NamedCertificate) SwaggerDoc() map[string]string { @@ -192,14 +202,26 @@ func (NamedCertificate) SwaggerDoc() map[string]string { var map_RemoteConnectionInfo = map[string]string{ "": "RemoteConnectionInfo holds information necessary for establishing a remote connection", - "url": "URL is the remote URL to connect to", - "ca": "CA is the CA for verifying TLS connections", + "url": "url is the remote URL to connect to", + "ca": "ca is the CA for verifying TLS connections", } func (RemoteConnectionInfo) SwaggerDoc() map[string]string { return map_RemoteConnectionInfo } +var map_RequiredHSTSPolicy = map[string]string{ + "namespaceSelector": "namespaceSelector specifies a label selector such that the policy applies only to those routes that are in namespaces with labels that match the selector, and are in one of the DomainPatterns. Defaults to the empty LabelSelector, which matches everything.", + "domainPatterns": "domainPatterns is a list of domains for which the desired HSTS annotations are required. If domainPatterns is specified and a route is created with a spec.host matching one of the domains, the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy.\n\nThe use of wildcards is allowed like this: *.foo.com matches everything under foo.com. foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*.", + "maxAge": "maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. If set to 0, it negates the effect, and hosts are removed as HSTS hosts. If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS policy will eventually expire on that client.", + "preloadPolicy": "preloadPolicy directs the client to include hosts in its host preload list so that it never needs to do an initial load to get the HSTS header (note that this is not defined in RFC 6797 and is therefore client implementation-dependent).", + "includeSubDomainsPolicy": "includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host's domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com", +} + +func (RequiredHSTSPolicy) SwaggerDoc() map[string]string { + return map_RequiredHSTSPolicy +} + var map_SecretNameReference = map[string]string{ "": "SecretNameReference references a secret in a specific namespace. The namespace must be specified at the point of use.", "name": "name is the metadata.name of the referenced secret", @@ -211,12 +233,12 @@ func (SecretNameReference) SwaggerDoc() map[string]string { var map_ServingInfo = map[string]string{ "": "ServingInfo holds information about serving web pages", - "bindAddress": "BindAddress is the ip:port to serve on", - "bindNetwork": "BindNetwork is the type of network to bind to - defaults to \"tcp4\", accepts \"tcp\", \"tcp4\", and \"tcp6\"", - "clientCA": "ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates", - "namedCertificates": "NamedCertificates is a list of certificates to use to secure requests to specific hostnames", - "minTLSVersion": "MinTLSVersion is the minimum TLS version supported. Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants", - "cipherSuites": "CipherSuites contains an overridden list of ciphers for the server to support. Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants", + "bindAddress": "bindAddress is the ip:port to serve on", + "bindNetwork": "bindNetwork is the type of network to bind to - defaults to \"tcp4\", accepts \"tcp\", \"tcp4\", and \"tcp6\"", + "clientCA": "clientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates", + "namedCertificates": "namedCertificates is a list of certificates to use to secure requests to specific hostnames", + "minTLSVersion": "minTLSVersion is the minimum TLS version supported. Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants", + "cipherSuites": "cipherSuites contains an overridden list of ciphers for the server to support. Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants", } func (ServingInfo) SwaggerDoc() map[string]string { @@ -233,10 +255,10 @@ func (StringSource) SwaggerDoc() map[string]string { var map_StringSourceSpec = map[string]string{ "": "StringSourceSpec specifies a string value, or external location", - "value": "Value specifies the cleartext value, or an encrypted value if keyFile is specified.", - "env": "Env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified.", - "file": "File references a file containing the cleartext value, or an encrypted value if a keyFile is specified.", - "keyFile": "KeyFile references a file containing the key to use to decrypt the value.", + "value": "value specifies the cleartext value, or an encrypted value if keyFile is specified.", + "env": "env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified.", + "file": "file references a file containing the cleartext value, or an encrypted value if a keyFile is specified.", + "keyFile": "keyFile references a file containing the key to use to decrypt the value.", } func (StringSourceSpec) SwaggerDoc() map[string]string { @@ -244,9 +266,10 @@ func (StringSourceSpec) SwaggerDoc() map[string]string { } var map_APIServer = map[string]string{ - "": "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (APIServer) SwaggerDoc() map[string]string { @@ -254,13 +277,24 @@ func (APIServer) SwaggerDoc() map[string]string { } var map_APIServerEncryption = map[string]string{ + "": "APIServerEncryption is used to encrypt sensitive resources on the cluster.", "type": "type defines what encryption type should be used to encrypt resources at the datastore layer. When this field is unset (i.e. when it is set to the empty string), identity is implied. The behavior of unset can and will change over time. Even if encryption is enabled by default, the meaning of unset may change to a different encryption type based on changes in best practices.\n\nWhen encryption is enabled, all sensitive resources shipped with the platform are encrypted. This list of sensitive resources can and will change over time. The current authoritative list is:\n\n 1. secrets\n 2. configmaps\n 3. routes.route.openshift.io\n 4. oauthaccesstokens.oauth.openshift.io\n 5. oauthauthorizetokens.oauth.openshift.io", + "kms": "kms defines the configuration for the external KMS instance that manages the encryption keys, when KMS encryption is enabled sensitive resources will be encrypted using keys managed by an externally configured KMS instance.\n\nThe Key Management Service (KMS) instance provides symmetric encryption and is responsible for managing the lifecyle of the encryption keys outside of the control plane. This allows integration with an external provider to manage the data encryption keys securely.", } func (APIServerEncryption) SwaggerDoc() map[string]string { return map_APIServerEncryption } +var map_APIServerList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (APIServerList) SwaggerDoc() map[string]string { + return map_APIServerList +} + var map_APIServerNamedServingCert = map[string]string{ "": "APIServerNamedServingCert maps a server DNS name, as understood by a client, to a certificate.", "names": "names is a optional list of explicit DNS names (leading wildcards allowed) that should use this certificate to serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names.", @@ -284,7 +318,7 @@ var map_APIServerSpec = map[string]string{ "clientCA": "clientCA references a ConfigMap containing a certificate bundle for the signers that will be recognized for incoming client certificates in addition to the operator managed signers. If this is empty, then only operator managed signers are valid. You usually only have to set this if you have your own PKI you wish to honor client certificates from. The ConfigMap must exist in the openshift-config namespace and contain the following required fields: - ConfigMap.Data[\"ca-bundle.crt\"] - CA bundle.", "additionalCORSAllowedOrigins": "additionalCORSAllowedOrigins lists additional, user-defined regular expressions describing hosts for which the API server allows access using the CORS headers. This may be needed to access the API and the integrated OAuth server from JavaScript applications. The values are regular expressions that correspond to the Golang regular expression language.", "encryption": "encryption allows the configuration of encryption of resources at the datastore layer.", - "tlsSecurityProfile": "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers.\n\nIf unset, a default (which may change between releases) is chosen. Note that only Old and Intermediate profiles are currently supported, and the maximum available MinTLSVersions is VersionTLS12.", + "tlsSecurityProfile": "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers.\n\nWhen omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. The current default is the Intermediate profile.", "audit": "audit specifies the settings for audit configuration to be applied to all OpenShift-provided API servers in the cluster.", } @@ -293,29 +327,51 @@ func (APIServerSpec) SwaggerDoc() map[string]string { } var map_Audit = map[string]string{ - "profile": "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster.\n\nThe following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list).\n\nIf unset, the 'Default' profile is used as the default.", + "profile": "profile specifies the name of the desired top-level audit profile to be applied to all requests sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, openshift-apiserver and oauth-apiserver), with the exception of those requests that match one or more of the customRules.\n\nThe following profiles are provided: - Default: default policy which means MetaData level logging with the exception of events\n (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody\n level).\n- WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens.\n\nWarning: It is not recommended to disable audit logging by using the `None` profile unless you are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. If you disable audit logging and a support situation arises, you might need to enable audit logging and reproduce the issue in order to troubleshoot properly.\n\nIf unset, the 'Default' profile is used as the default.", + "customRules": "customRules specify profiles per group. These profile take precedence over the top-level profile field if they apply. They are evaluation from top to bottom and the first one that matches, applies.", } func (Audit) SwaggerDoc() map[string]string { return map_Audit } +var map_AuditCustomRule = map[string]string{ + "": "AuditCustomRule describes a custom rule for an audit profile that takes precedence over the top-level profile.", + "group": "group is a name of group a request user must be member of in order to this profile to apply.", + "profile": "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster.\n\nThe following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens.\n\nIf unset, the 'Default' profile is used as the default.", +} + +func (AuditCustomRule) SwaggerDoc() map[string]string { + return map_AuditCustomRule +} + var map_Authentication = map[string]string{ - "": "Authentication specifies cluster-wide settings for authentication (like OAuth and webhook token authenticators). The canonical name of an instance is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Authentication specifies cluster-wide settings for authentication (like OAuth and webhook token authenticators). The canonical name of an instance is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Authentication) SwaggerDoc() map[string]string { return map_Authentication } +var map_AuthenticationList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (AuthenticationList) SwaggerDoc() map[string]string { + return map_AuthenticationList +} + var map_AuthenticationSpec = map[string]string{ "type": "type identifies the cluster managed, user facing authentication mode in use. Specifically, it manages the component that responds to login attempts. The default is IntegratedOAuth.", "oauthMetadata": "oauthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for an external OAuth server. This discovery document can be viewed from its served location: oc get --raw '/.well-known/oauth-authorization-server' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 If oauthMetadata.name is non-empty, this value has precedence over any metadata reference stored in status. The key \"oauthMetadata\" is used to locate the data. If specified and the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config.", "webhookTokenAuthenticators": "webhookTokenAuthenticators is DEPRECATED, setting it has no effect.", - "webhookTokenAuthenticator": "webhookTokenAuthenticator configures a remote token reviewer. These remote authentication webhooks can be used to verify bearer tokens via the tokenreviews.authentication.k8s.io REST API. This is required to honor bearer tokens that are provisioned by an external authentication service.", - "serviceAccountIssuer": "serviceAccountIssuer is the identifier of the bound service account token issuer. The default is https://kubernetes.default.svc WARNING: Updating this field will result in the invalidation of all bound tokens with the previous issuer value. Unless the holder of a bound token has explicit support for a change in issuer, they will not request a new bound token until pod restart or until their existing token exceeds 80% of its duration.", + "webhookTokenAuthenticator": "webhookTokenAuthenticator configures a remote token reviewer. These remote authentication webhooks can be used to verify bearer tokens via the tokenreviews.authentication.k8s.io REST API. This is required to honor bearer tokens that are provisioned by an external authentication service.\n\nCan only be set if \"Type\" is set to \"None\".", + "serviceAccountIssuer": "serviceAccountIssuer is the identifier of the bound service account token issuer. The default is https://kubernetes.default.svc WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the previous issuer value. Instead, the tokens issued by previous service account issuer will continue to be trusted for a time period chosen by the platform (currently set to 24h). This time period is subject to change over time. This allows internal components to transition to use new service account issuer without service distruption.", + "oidcProviders": "oidcProviders are OIDC identity providers that can issue tokens for this cluster Can only be set if \"Type\" is set to \"OIDC\".\n\nAt most one provider can be configured.", } func (AuthenticationSpec) SwaggerDoc() map[string]string { @@ -324,6 +380,7 @@ func (AuthenticationSpec) SwaggerDoc() map[string]string { var map_AuthenticationStatus = map[string]string{ "integratedOAuthMetadata": "integratedOAuthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for the in-cluster integrated OAuth server. This discovery document can be viewed from its served location: oc get --raw '/.well-known/oauth-authorization-server' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 This contains the observed value based on cluster state. An explicitly set value in spec.oauthMetadata has precedence over this field. This field has no meaning if authentication spec.type is not set to IntegratedOAuth. The key \"oauthMetadata\" is used to locate the data. If the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config-managed.", + "oidcClients": "oidcClients is where participating operators place the current OIDC client status for OIDC clients that can be customized by the cluster-admin.", } func (AuthenticationStatus) SwaggerDoc() map[string]string { @@ -339,6 +396,151 @@ func (DeprecatedWebhookTokenAuthenticator) SwaggerDoc() map[string]string { return map_DeprecatedWebhookTokenAuthenticator } +var map_ExtraMapping = map[string]string{ + "": "ExtraMapping allows specifying a key and CEL expression to evaluate the keys' value. It is used to create additional mappings and attributes added to a cluster identity from a provided authentication token.", + "key": "key is a required field that specifies the string to use as the extra attribute key.\n\nkey must be a domain-prefix path (e.g 'example.org/foo'). key must not exceed 510 characters in length. key must contain the '/' character, separating the domain and path characters. key must not be empty.\n\nThe domain portion of the key (string of characters prior to the '/') must be a valid RFC1123 subdomain. It must not exceed 253 characters in length. It must start and end with an alphanumeric character. It must only contain lower case alphanumeric characters and '-' or '.'. It must not use the reserved domains, or be subdomains of, \"kubernetes.io\", \"k8s.io\", and \"openshift.io\".\n\nThe path portion of the key (string of characters after the '/') must not be empty and must consist of at least one alphanumeric character, percent-encoded octets, '-', '.', '_', '~', '!', '$', '&', ''', '(', ')', '*', '+', ',', ';', '=', and ':'. It must not exceed 256 characters in length.", + "valueExpression": "valueExpression is a required field to specify the CEL expression to extract the extra attribute value from a JWT token's claims. valueExpression must produce a string or string array value. \"\", [], and null are treated as the extra mapping not being present. Empty string values within an array are filtered out.\n\nCEL expressions have access to the token claims through a CEL variable, 'claims'. 'claims' is a map of claim names to claim values. For example, the 'sub' claim value can be accessed as 'claims.sub'. Nested claims can be accessed using dot notation ('claims.foo.bar').\n\nvalueExpression must not exceed 1024 characters in length. valueExpression must not be empty.", +} + +func (ExtraMapping) SwaggerDoc() map[string]string { + return map_ExtraMapping +} + +var map_OIDCClientConfig = map[string]string{ + "": "OIDCClientConfig configures how platform clients interact with identity providers as an authentication method", + "componentName": "componentName is a required field that specifies the name of the platform component being configured to use the identity provider as an authentication mode. It is used in combination with componentNamespace as a unique identifier.\n\ncomponentName must not be an empty string (\"\") and must not exceed 256 characters in length.", + "componentNamespace": "componentNamespace is a required field that specifies the namespace in which the platform component being configured to use the identity provider as an authentication mode is running. It is used in combination with componentName as a unique identifier.\n\ncomponentNamespace must not be an empty string (\"\") and must not exceed 63 characters in length.", + "clientID": "clientID is a required field that configures the client identifier, from the identity provider, that the platform component uses for authentication requests made to the identity provider. The identity provider must accept this identifier for platform components to be able to use the identity provider as an authentication mode.\n\nclientID must not be an empty string (\"\").", + "clientSecret": "clientSecret is an optional field that configures the client secret used by the platform component when making authentication requests to the identity provider.\n\nWhen not specified, no client secret will be used when making authentication requests to the identity provider.\n\nWhen specified, clientSecret references a Secret in the 'openshift-config' namespace that contains the client secret in the 'clientSecret' key of the '.data' field. The client secret will be used when making authentication requests to the identity provider.\n\nPublic clients do not require a client secret but private clients do require a client secret to work with the identity provider.", + "extraScopes": "extraScopes is an optional field that configures the extra scopes that should be requested by the platform component when making authentication requests to the identity provider. This is useful if you have configured claim mappings that requires specific scopes to be requested beyond the standard OIDC scopes.\n\nWhen omitted, no additional scopes are requested.", +} + +func (OIDCClientConfig) SwaggerDoc() map[string]string { + return map_OIDCClientConfig +} + +var map_OIDCClientReference = map[string]string{ + "": "OIDCClientReference is a reference to a platform component client configuration.", + "oidcProviderName": "oidcProviderName is a required reference to the 'name' of the identity provider configured in 'oidcProviders' that this client is associated with.\n\noidcProviderName must not be an empty string (\"\").", + "issuerURL": "issuerURL is a required field that specifies the URL of the identity provider that this client is configured to make requests against.\n\nissuerURL must use the 'https' scheme.", + "clientID": "clientID is a required field that specifies the client identifier, from the identity provider, that the platform component is using for authentication requests made to the identity provider.\n\nclientID must not be empty.", +} + +func (OIDCClientReference) SwaggerDoc() map[string]string { + return map_OIDCClientReference +} + +var map_OIDCClientStatus = map[string]string{ + "": "OIDCClientStatus represents the current state of platform components and how they interact with the configured identity providers.", + "componentName": "componentName is a required field that specifies the name of the platform component using the identity provider as an authentication mode. It is used in combination with componentNamespace as a unique identifier.\n\ncomponentName must not be an empty string (\"\") and must not exceed 256 characters in length.", + "componentNamespace": "componentNamespace is a required field that specifies the namespace in which the platform component using the identity provider as an authentication mode is running. It is used in combination with componentName as a unique identifier.\n\ncomponentNamespace must not be an empty string (\"\") and must not exceed 63 characters in length.", + "currentOIDCClients": "currentOIDCClients is an optional list of clients that the component is currently using. Entries must have unique issuerURL/clientID pairs.", + "consumingUsers": "consumingUsers is an optional list of ServiceAccounts requiring read permissions on the `clientSecret` secret.\n\nconsumingUsers must not exceed 5 entries.", + "conditions": "conditions are used to communicate the state of the `oidcClients` entry.\n\nSupported conditions include Available, Degraded and Progressing.\n\nIf Available is true, the component is successfully using the configured client. If Degraded is true, that means something has gone wrong trying to handle the client configuration. If Progressing is true, that means the component is taking some action related to the `oidcClients` entry.", +} + +func (OIDCClientStatus) SwaggerDoc() map[string]string { + return map_OIDCClientStatus +} + +var map_OIDCProvider = map[string]string{ + "name": "name is a required field that configures the unique human-readable identifier associated with the identity provider. It is used to distinguish between multiple identity providers and has no impact on token validation or authentication mechanics.\n\nname must not be an empty string (\"\").", + "issuer": "issuer is a required field that configures how the platform interacts with the identity provider and how tokens issued from the identity provider are evaluated by the Kubernetes API server.", + "oidcClients": "oidcClients is an optional field that configures how on-cluster, platform clients should request tokens from the identity provider. oidcClients must not exceed 20 entries and entries must have unique namespace/name pairs.", + "claimMappings": "claimMappings is a required field that configures the rules to be used by the Kubernetes API server for translating claims in a JWT token, issued by the identity provider, to a cluster identity.", + "claimValidationRules": "claimValidationRules is an optional field that configures the rules to be used by the Kubernetes API server for validating the claims in a JWT token issued by the identity provider.\n\nValidation rules are joined via an AND operation.", +} + +func (OIDCProvider) SwaggerDoc() map[string]string { + return map_OIDCProvider +} + +var map_PrefixedClaimMapping = map[string]string{ + "": "PrefixedClaimMapping configures a claim mapping that allows for an optional prefix.", + "prefix": "prefix is an optional field that configures the prefix that will be applied to the cluster identity attribute during the process of mapping JWT claims to cluster identity attributes.\n\nWhen omitted (\"\"), no prefix is applied to the cluster identity attribute.\n\nExample: if `prefix` is set to \"myoidc:\" and the `claim` in JWT contains an array of strings \"a\", \"b\" and \"c\", the mapping will result in an array of string \"myoidc:a\", \"myoidc:b\" and \"myoidc:c\".", +} + +func (PrefixedClaimMapping) SwaggerDoc() map[string]string { + return map_PrefixedClaimMapping +} + +var map_TokenClaimMapping = map[string]string{ + "": "TokenClaimMapping allows specifying a JWT token claim to be used when mapping claims from an authentication token to cluster identities.", + "claim": "claim is a required field that configures the JWT token claim whose value is assigned to the cluster identity field associated with this mapping.", +} + +func (TokenClaimMapping) SwaggerDoc() map[string]string { + return map_TokenClaimMapping +} + +var map_TokenClaimMappings = map[string]string{ + "username": "username is a required field that configures how the username of a cluster identity should be constructed from the claims in a JWT token issued by the identity provider.", + "groups": "groups is an optional field that configures how the groups of a cluster identity should be constructed from the claims in a JWT token issued by the identity provider. When referencing a claim, if the claim is present in the JWT token, its value must be a list of groups separated by a comma (','). For example - '\"example\"' and '\"exampleOne\", \"exampleTwo\", \"exampleThree\"' are valid claim values.", + "uid": "uid is an optional field for configuring the claim mapping used to construct the uid for the cluster identity.\n\nWhen using uid.claim to specify the claim it must be a single string value. When using uid.expression the expression must result in a single string value.\n\nWhen omitted, this means the user has no opinion and the platform is left to choose a default, which is subject to change over time. The current default is to use the 'sub' claim.", + "extra": "extra is an optional field for configuring the mappings used to construct the extra attribute for the cluster identity. When omitted, no extra attributes will be present on the cluster identity. key values for extra mappings must be unique. A maximum of 32 extra attribute mappings may be provided.", +} + +func (TokenClaimMappings) SwaggerDoc() map[string]string { + return map_TokenClaimMappings +} + +var map_TokenClaimOrExpressionMapping = map[string]string{ + "": "TokenClaimOrExpressionMapping allows specifying either a JWT token claim or CEL expression to be used when mapping claims from an authentication token to cluster identities.", + "claim": "claim is an optional field for specifying the JWT token claim that is used in the mapping. The value of this claim will be assigned to the field in which this mapping is associated.\n\nPrecisely one of claim or expression must be set. claim must not be specified when expression is set. When specified, claim must be at least 1 character in length and must not exceed 256 characters in length.", + "expression": "expression is an optional field for specifying a CEL expression that produces a string value from JWT token claims.\n\nCEL expressions have access to the token claims through a CEL variable, 'claims'. 'claims' is a map of claim names to claim values. For example, the 'sub' claim value can be accessed as 'claims.sub'. Nested claims can be accessed using dot notation ('claims.foo.bar').\n\nPrecisely one of claim or expression must be set. expression must not be specified when claim is set. When specified, expression must be at least 1 character in length and must not exceed 1024 characters in length.", +} + +func (TokenClaimOrExpressionMapping) SwaggerDoc() map[string]string { + return map_TokenClaimOrExpressionMapping +} + +var map_TokenClaimValidationRule = map[string]string{ + "type": "type is an optional field that configures the type of the validation rule.\n\nAllowed values are 'RequiredClaim' and omitted (not provided or an empty string).\n\nWhen set to 'RequiredClaim', the Kubernetes API server will be configured to validate that the incoming JWT contains the required claim and that its value matches the required value.\n\nDefaults to 'RequiredClaim'.", + "requiredClaim": "requiredClaim is an optional field that configures the required claim and value that the Kubernetes API server will use to validate if an incoming JWT is valid for this identity provider.", +} + +func (TokenClaimValidationRule) SwaggerDoc() map[string]string { + return map_TokenClaimValidationRule +} + +var map_TokenIssuer = map[string]string{ + "issuerURL": "issuerURL is a required field that configures the URL used to issue tokens by the identity provider. The Kubernetes API server determines how authentication tokens should be handled by matching the 'iss' claim in the JWT to the issuerURL of configured identity providers.\n\nMust be at least 1 character and must not exceed 512 characters in length. Must be a valid URL that uses the 'https' scheme and does not contain a query, fragment or user.", + "audiences": "audiences is a required field that configures the acceptable audiences the JWT token, issued by the identity provider, must be issued to. At least one of the entries must match the 'aud' claim in the JWT token.\n\naudiences must contain at least one entry and must not exceed ten entries.", + "issuerCertificateAuthority": "issuerCertificateAuthority is an optional field that configures the certificate authority, used by the Kubernetes API server, to validate the connection to the identity provider when fetching discovery information.\n\nWhen not specified, the system trust is used.\n\nWhen specified, it must reference a ConfigMap in the openshift-config namespace containing the PEM-encoded CA certificates under the 'ca-bundle.crt' key in the data field of the ConfigMap.", +} + +func (TokenIssuer) SwaggerDoc() map[string]string { + return map_TokenIssuer +} + +var map_TokenRequiredClaim = map[string]string{ + "claim": "claim is a required field that configures the name of the required claim. When taken from the JWT claims, claim must be a string value.\n\nclaim must not be an empty string (\"\").", + "requiredValue": "requiredValue is a required field that configures the value that 'claim' must have when taken from the incoming JWT claims. If the value in the JWT claims does not match, the token will be rejected for authentication.\n\nrequiredValue must not be an empty string (\"\").", +} + +func (TokenRequiredClaim) SwaggerDoc() map[string]string { + return map_TokenRequiredClaim +} + +var map_UsernameClaimMapping = map[string]string{ + "claim": "claim is a required field that configures the JWT token claim whose value is assigned to the cluster identity field associated with this mapping.\n\nclaim must not be an empty string (\"\") and must not exceed 256 characters.", + "prefixPolicy": "prefixPolicy is an optional field that configures how a prefix should be applied to the value of the JWT claim specified in the 'claim' field.\n\nAllowed values are 'Prefix', 'NoPrefix', and omitted (not provided or an empty string).\n\nWhen set to 'Prefix', the value specified in the prefix field will be prepended to the value of the JWT claim. The prefix field must be set when prefixPolicy is 'Prefix'.\n\nWhen set to 'NoPrefix', no prefix will be prepended to the value of the JWT claim.\n\nWhen omitted, this means no opinion and the platform is left to choose any prefixes that are applied which is subject to change over time. Currently, the platform prepends `{issuerURL}#` to the value of the JWT claim when the claim is not 'email'. As an example, consider the following scenario:\n `prefix` is unset, `issuerURL` is set to `https://myoidc.tld`,\n the JWT claims include \"username\":\"userA\" and \"email\":\"userA@myoidc.tld\",\n and `claim` is set to:\n - \"username\": the mapped value will be \"https://myoidc.tld#userA\"\n - \"email\": the mapped value will be \"userA@myoidc.tld\"", + "prefix": "prefix configures the prefix that should be prepended to the value of the JWT claim.\n\nprefix must be set when prefixPolicy is set to 'Prefix' and must be unset otherwise.", +} + +func (UsernameClaimMapping) SwaggerDoc() map[string]string { + return map_UsernameClaimMapping +} + +var map_UsernamePrefix = map[string]string{ + "": "UsernamePrefix configures the string that should be used as a prefix for username claim mappings.", + "prefixString": "prefixString is a required field that configures the prefix that will be applied to cluster identity username attribute during the process of mapping JWT claims to cluster identity attributes.\n\nprefixString must not be an empty string (\"\").", +} + +func (UsernamePrefix) SwaggerDoc() map[string]string { + return map_UsernamePrefix +} + var map_WebhookTokenAuthenticator = map[string]string{ "": "webhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator", "kubeConfig": "kubeConfig references a secret that contains kube config file data which describes how to access the remote webhook service. The namespace for the referenced secret is openshift-config.\n\nFor further details, see:\n\nhttps://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication\n\nThe key \"kubeConfig\" is used to locate the data. If the secret or expected key is not found, the webhook is not honored. If the specified kube config data is not valid, the webhook is not honored.", @@ -349,8 +551,9 @@ func (WebhookTokenAuthenticator) SwaggerDoc() map[string]string { } var map_Build = map[string]string{ - "": "Build configures the behavior of OpenShift builds for the entire cluster. This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds.\n\nThe canonical name is \"cluster\"", - "spec": "Spec holds user-settable values for the build controller configuration", + "": "Build configures the behavior of OpenShift builds for the entire cluster. This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds.\n\nThe canonical name is \"cluster\"\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user-settable values for the build controller configuration", } func (Build) SwaggerDoc() map[string]string { @@ -358,22 +561,31 @@ func (Build) SwaggerDoc() map[string]string { } var map_BuildDefaults = map[string]string{ - "defaultProxy": "DefaultProxy contains the default proxy settings for all build operations, including image pull/push and source download.\n\nValues can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build config's strategy.", - "gitProxy": "GitProxy contains the proxy settings for git operations only. If set, this will override any Proxy settings for all git commands, such as git clone.\n\nValues that are not set here will be inherited from DefaultProxy.", - "env": "Env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", - "imageLabels": "ImageLabels is a list of docker labels that are applied to the resulting image. User can override a default label by providing a label with the same name in their Build/BuildConfig.", - "resources": "Resources defines resource requirements to execute the build.", + "defaultProxy": "defaultProxy contains the default proxy settings for all build operations, including image pull/push and source download.\n\nValues can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build config's strategy.", + "gitProxy": "gitProxy contains the proxy settings for git operations only. If set, this will override any Proxy settings for all git commands, such as git clone.\n\nValues that are not set here will be inherited from DefaultProxy.", + "env": "env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", + "imageLabels": "imageLabels is a list of docker labels that are applied to the resulting image. User can override a default label by providing a label with the same name in their Build/BuildConfig.", + "resources": "resources defines resource requirements to execute the build.", } func (BuildDefaults) SwaggerDoc() map[string]string { return map_BuildDefaults } +var map_BuildList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (BuildList) SwaggerDoc() map[string]string { + return map_BuildList +} + var map_BuildOverrides = map[string]string{ - "imageLabels": "ImageLabels is a list of docker labels that are applied to the resulting image. If user provided a label in their Build/BuildConfig with the same name as one in this list, the user's label will be overwritten.", - "nodeSelector": "NodeSelector is a selector which must be true for the build pod to fit on a node", - "tolerations": "Tolerations is a list of Tolerations that will override any existing tolerations set on a build pod.", - "forcePull": "ForcePull overrides, if set, the equivalent value in the builds, i.e. false disables force pull for all builds, true enables force pull for all builds, independently of what each build specifies itself", + "imageLabels": "imageLabels is a list of docker labels that are applied to the resulting image. If user provided a label in their Build/BuildConfig with the same name as one in this list, the user's label will be overwritten.", + "nodeSelector": "nodeSelector is a selector which must be true for the build pod to fit on a node", + "tolerations": "tolerations is a list of Tolerations that will override any existing tolerations set on a build pod.", + "forcePull": "forcePull overrides, if set, the equivalent value in the builds, i.e. false disables force pull for all builds, true enables force pull for all builds, independently of what each build specifies itself", } func (BuildOverrides) SwaggerDoc() map[string]string { @@ -381,9 +593,9 @@ func (BuildOverrides) SwaggerDoc() map[string]string { } var map_BuildSpec = map[string]string{ - "additionalTrustedCA": "AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted for image pushes and pulls during builds. The namespace for this config map is openshift-config.\n\nDEPRECATED: Additional CAs for image pull and push should be set on image.config.openshift.io/cluster instead.", - "buildDefaults": "BuildDefaults controls the default information for Builds", - "buildOverrides": "BuildOverrides controls override settings for builds", + "additionalTrustedCA": "additionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted for image pushes and pulls during builds. The namespace for this config map is openshift-config.\n\nDEPRECATED: Additional CAs for image pull and push should be set on image.config.openshift.io/cluster instead.", + "buildDefaults": "buildDefaults controls the default information for Builds", + "buildOverrides": "buildOverrides controls override settings for builds", } func (BuildSpec) SwaggerDoc() map[string]string { @@ -391,18 +603,58 @@ func (BuildSpec) SwaggerDoc() map[string]string { } var map_ImageLabel = map[string]string{ - "name": "Name defines the name of the label. It must have non-zero length.", - "value": "Value defines the literal value of the label.", + "name": "name defines the name of the label. It must have non-zero length.", + "value": "value defines the literal value of the label.", } func (ImageLabel) SwaggerDoc() map[string]string { return map_ImageLabel } +var map_ClusterImagePolicy = map[string]string{ + "": "ClusterImagePolicy holds cluster-wide configuration for image signature verification\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec contains the configuration for the cluster image policy.", + "status": "status contains the observed state of the resource.", +} + +func (ClusterImagePolicy) SwaggerDoc() map[string]string { + return map_ClusterImagePolicy +} + +var map_ClusterImagePolicyList = map[string]string{ + "": "ClusterImagePolicyList is a list of ClusterImagePolicy resources\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is a list of ClusterImagePolices", +} + +func (ClusterImagePolicyList) SwaggerDoc() map[string]string { + return map_ClusterImagePolicyList +} + +var map_ClusterImagePolicySpec = map[string]string{ + "": "CLusterImagePolicySpec is the specification of the ClusterImagePolicy custom resource.", + "scopes": "scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker", + "policy": "policy is a required field that contains configuration to allow scopes to be verified, and defines how images not matching the verification policy will be treated.", +} + +func (ClusterImagePolicySpec) SwaggerDoc() map[string]string { + return map_ClusterImagePolicySpec +} + +var map_ClusterImagePolicyStatus = map[string]string{ + "conditions": "conditions provide details on the status of this API Resource.", +} + +func (ClusterImagePolicyStatus) SwaggerDoc() map[string]string { + return map_ClusterImagePolicyStatus +} + var map_ClusterOperator = map[string]string{ - "": "ClusterOperator is the Custom Resource object which holds the current state of an operator. This object is used by operators to convey their state to the rest of the cluster.", - "spec": "spec holds configuration that could apply to any operator.", - "status": "status holds the information about the state of an operator. It is consistent with status information across the Kubernetes ecosystem.", + "": "ClusterOperator holds the status of a core or optional OpenShift component managed by the Cluster Version Operator (CVO). This object is used by operators to convey their state to the rest of the cluster. Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds configuration that could apply to any operator.", + "status": "status holds the information about the state of an operator. It is consistent with status information across the Kubernetes ecosystem.", } func (ClusterOperator) SwaggerDoc() map[string]string { @@ -410,7 +662,8 @@ func (ClusterOperator) SwaggerDoc() map[string]string { } var map_ClusterOperatorList = map[string]string{ - "": "ClusterOperatorList is a list of OperatorStatus resources.", + "": "ClusterOperatorList is a list of OperatorStatus resources.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (ClusterOperatorList) SwaggerDoc() map[string]string { @@ -471,18 +724,50 @@ func (OperandVersion) SwaggerDoc() map[string]string { return map_OperandVersion } +var map_ClusterCondition = map[string]string{ + "": "ClusterCondition is a union of typed cluster conditions. The 'type' property determines which of the type-specific properties are relevant. When evaluated on a cluster, the condition may match, not match, or fail to evaluate.", + "type": "type represents the cluster-condition type. This defines the members and semantics of any additional properties.", + "promql": "promql represents a cluster condition based on PromQL.", +} + +func (ClusterCondition) SwaggerDoc() map[string]string { + return map_ClusterCondition +} + var map_ClusterVersion = map[string]string{ - "": "ClusterVersion is the configuration for the ClusterVersionOperator. This is where parameters related to automatic updates can be set.", - "spec": "spec is the desired state of the cluster version - the operator will work to ensure that the desired version is applied to the cluster.", - "status": "status contains information about the available updates and any in-progress updates.", + "": "ClusterVersion is the configuration for the ClusterVersionOperator. This is where parameters related to automatic updates can be set.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec is the desired state of the cluster version - the operator will work to ensure that the desired version is applied to the cluster.", + "status": "status contains information about the available updates and any in-progress updates.", } func (ClusterVersion) SwaggerDoc() map[string]string { return map_ClusterVersion } +var map_ClusterVersionCapabilitiesSpec = map[string]string{ + "": "ClusterVersionCapabilitiesSpec selects the managed set of optional, core cluster components.", + "baselineCapabilitySet": "baselineCapabilitySet selects an initial set of optional capabilities to enable, which can be extended via additionalEnabledCapabilities. If unset, the cluster will choose a default, and the default may change over time. The current default is vCurrent.", + "additionalEnabledCapabilities": "additionalEnabledCapabilities extends the set of managed capabilities beyond the baseline defined in baselineCapabilitySet. The default is an empty set.", +} + +func (ClusterVersionCapabilitiesSpec) SwaggerDoc() map[string]string { + return map_ClusterVersionCapabilitiesSpec +} + +var map_ClusterVersionCapabilitiesStatus = map[string]string{ + "": "ClusterVersionCapabilitiesStatus describes the state of optional, core cluster components.", + "enabledCapabilities": "enabledCapabilities lists all the capabilities that are currently managed.", + "knownCapabilities": "knownCapabilities lists all the capabilities known to the current cluster.", +} + +func (ClusterVersionCapabilitiesStatus) SwaggerDoc() map[string]string { + return map_ClusterVersionCapabilitiesStatus +} + var map_ClusterVersionList = map[string]string{ - "": "ClusterVersionList is a list of ClusterVersion resources.", + "": "ClusterVersionList is a list of ClusterVersion resources.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (ClusterVersionList) SwaggerDoc() map[string]string { @@ -490,12 +775,14 @@ func (ClusterVersionList) SwaggerDoc() map[string]string { } var map_ClusterVersionSpec = map[string]string{ - "": "ClusterVersionSpec is the desired version state of the cluster. It includes the version the cluster should be at, how the cluster is identified, and where the cluster should look for version updates.", - "clusterID": "clusterID uniquely identifies this cluster. This is expected to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in hexadecimal values). This is a required field.", - "desiredUpdate": "desiredUpdate is an optional field that indicates the desired value of the cluster version. Setting this value will trigger an upgrade (if the current version does not match the desired version). The set of recommended update values is listed as part of available updates in status, and setting values outside that range may cause the upgrade to fail. You may specify the version field without setting image if an update exists with that version in the availableUpdates or history.\n\nIf an upgrade fails the operator will halt and report status about the failing component. Setting the desired update value back to the previous version will cause a rollback to be attempted. Not all rollbacks will succeed.", - "upstream": "upstream may be used to specify the preferred update server. By default it will use the appropriate update server for the cluster and region.", - "channel": "channel is an identifier for explicitly requesting that a non-default set of updates be applied to this cluster. The default channel will be contain stable updates that are appropriate for production clusters.", - "overrides": "overrides is list of overides for components that are managed by cluster version operator. Marking a component unmanaged will prevent the operator from creating or updating the object.", + "": "ClusterVersionSpec is the desired version state of the cluster. It includes the version the cluster should be at, how the cluster is identified, and where the cluster should look for version updates.", + "clusterID": "clusterID uniquely identifies this cluster. This is expected to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in hexadecimal values). This is a required field.", + "desiredUpdate": "desiredUpdate is an optional field that indicates the desired value of the cluster version. Setting this value will trigger an upgrade (if the current version does not match the desired version). The set of recommended update values is listed as part of available updates in status, and setting values outside that range may cause the upgrade to fail.\n\nSome of the fields are inter-related with restrictions and meanings described here. 1. image is specified, version is specified, architecture is specified. API validation error. 2. image is specified, version is specified, architecture is not specified. The version extracted from the referenced image must match the specified version. 3. image is specified, version is not specified, architecture is specified. API validation error. 4. image is specified, version is not specified, architecture is not specified. image is used. 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. 7. image is not specified, version is not specified, architecture is specified. API validation error. 8. image is not specified, version is not specified, architecture is not specified. API validation error.\n\nIf an upgrade fails the operator will halt and report status about the failing component. Setting the desired update value back to the previous version will cause a rollback to be attempted if the previous version is within the current minor version. Not all rollbacks will succeed, and some may unrecoverably break the cluster.", + "upstream": "upstream may be used to specify the preferred update server. By default it will use the appropriate update server for the cluster and region.", + "channel": "channel is an identifier for explicitly requesting a non-default set of updates to be applied to this cluster. The default channel will contain stable updates that are appropriate for production clusters.", + "capabilities": "capabilities configures the installation of optional, core cluster components. A null value here is identical to an empty object; see the child properties for default semantics.", + "signatureStores": "signatureStores contains the upstream URIs to verify release signatures and optional reference to a config map by name containing the PEM-encoded CA bundle.\n\nBy default, CVO will use existing signature stores if this property is empty. The CVO will check the release signatures in the local ConfigMaps first. It will search for a valid signature in these stores in parallel only when local ConfigMaps did not include a valid signature. Validation will fail if none of the signature stores reply with valid signature before timeout. Setting signatureStores will replace the default signature stores with custom signature stores. Default stores can be used with custom signature stores by adding them manually.\n\nA maximum of 32 signature stores may be configured.", + "overrides": "overrides is list of overides for components that are managed by cluster version operator. Marking a component unmanaged will prevent the operator from creating or updating the object.", } func (ClusterVersionSpec) SwaggerDoc() map[string]string { @@ -508,8 +795,10 @@ var map_ClusterVersionStatus = map[string]string{ "history": "history contains a list of the most recent versions applied to the cluster. This value may be empty during cluster startup, and then will be updated when a new update is being applied. The newest update is first in the list and it is ordered by recency. Updates in the history have state Completed if the rollout completed - if an update was failing or halfway applied the state will be Partial. Only a limited amount of update history is preserved.", "observedGeneration": "observedGeneration reports which version of the spec is being synced. If this value is not equal to metadata.generation, then the desired and conditions fields may represent a previous version.", "versionHash": "versionHash is a fingerprint of the content that the cluster will be updated with. It is used by the operator to avoid unnecessary work and is for internal use only.", + "capabilities": "capabilities describes the state of optional, core cluster components.", "conditions": "conditions provides information about the cluster version. The condition \"Available\" is set to true if the desiredUpdate has been reached. The condition \"Progressing\" is set to true if an update is being applied. The condition \"Degraded\" is set to true if an update is currently blocked by a temporary or permanent error. Conditions are only valid for the current desiredUpdate when metadata.generation is equal to status.generation.", - "availableUpdates": "availableUpdates contains the list of updates that are appropriate for this cluster. This list may be empty if no updates are recommended, if the update service is unavailable, or if an invalid channel has been specified.", + "availableUpdates": "availableUpdates contains updates recommended for this cluster. Updates which appear in conditionalUpdates but not in availableUpdates may expose this cluster to known issues. This list may be empty if no updates are recommended, if the update service is unavailable, or if an invalid channel has been specified.", + "conditionalUpdates": "conditionalUpdates contains the list of updates that may be recommended for this cluster if it meets specific required conditions. Consumers interested in the set of updates that are actually recommended for this cluster should use availableUpdates. This list may be empty if no updates are recommended, if the update service is unavailable, or if an empty or invalid channel has been specified.", } func (ClusterVersionStatus) SwaggerDoc() map[string]string { @@ -529,23 +818,67 @@ func (ComponentOverride) SwaggerDoc() map[string]string { return map_ComponentOverride } +var map_ConditionalUpdate = map[string]string{ + "": "ConditionalUpdate represents an update which is recommended to some clusters on the version the current cluster is reconciling, but which may not be recommended for the current cluster.", + "release": "release is the target of the update.", + "risks": "risks represents the range of issues associated with updating to the target release. The cluster-version operator will evaluate all entries, and only recommend the update if there is at least one entry and all entries recommend the update.", + "conditions": "conditions represents the observations of the conditional update's current status. Known types are: * Recommended, for whether the update is recommended for the current cluster.", +} + +func (ConditionalUpdate) SwaggerDoc() map[string]string { + return map_ConditionalUpdate +} + +var map_ConditionalUpdateRisk = map[string]string{ + "": "ConditionalUpdateRisk represents a reason and cluster-state for not recommending a conditional update.", + "url": "url contains information about this risk.", + "name": "name is the CamelCase reason for not recommending a conditional update, in the event that matchingRules match the cluster state.", + "message": "message provides additional information about the risk of updating, in the event that matchingRules match the cluster state. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines.", + "matchingRules": "matchingRules is a slice of conditions for deciding which clusters match the risk and which do not. The slice is ordered by decreasing precedence. The cluster-version operator will walk the slice in order, and stop after the first it can successfully evaluate. If no condition can be successfully evaluated, the update will not be recommended.", +} + +func (ConditionalUpdateRisk) SwaggerDoc() map[string]string { + return map_ConditionalUpdateRisk +} + +var map_PromQLClusterCondition = map[string]string{ + "": "PromQLClusterCondition represents a cluster condition based on PromQL.", + "promql": "promql is a PromQL query classifying clusters. This query query should return a 1 in the match case and a 0 in the does-not-match case. Queries which return no time series, or which return values besides 0 or 1, are evaluation failures.", +} + +func (PromQLClusterCondition) SwaggerDoc() map[string]string { + return map_PromQLClusterCondition +} + var map_Release = map[string]string{ - "": "Release represents an OpenShift release image and associated metadata.", - "version": "version is a semantic versioning identifying the update version. When this field is part of spec, version is optional if image is specified.", - "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", - "url": "url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases.", - "channels": "channels is the set of Cincinnati channels to which the release currently belongs.", + "": "Release represents an OpenShift release image and associated metadata.", + "architecture": "architecture is an optional field that indicates the value of the cluster architecture. In this context cluster architecture means either a single architecture or a multi architecture. Valid values are 'Multi' and empty.", + "version": "version is a semantic version identifying the update version. When this field is part of spec, version is optional if image is specified.", + "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", + "url": "url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases.", + "channels": "channels is the set of Cincinnati channels to which the release currently belongs.", } func (Release) SwaggerDoc() map[string]string { return map_Release } +var map_SignatureStore = map[string]string{ + "": "SignatureStore represents the URL of custom Signature Store", + "url": "url contains the upstream custom signature store URL. url should be a valid absolute http/https URI of an upstream signature store as per rfc1738. This must be provided and cannot be empty.", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the signature store is not honored. If the specified ca data is not valid, the signature store is not honored. If empty, we fall back to the CA configured via Proxy, which is appended to the default system roots. The namespace for this config map is openshift-config.", +} + +func (SignatureStore) SwaggerDoc() map[string]string { + return map_SignatureStore +} + var map_Update = map[string]string{ - "": "Update represents an administrator update request.", - "version": "version is a semantic versioning identifying the update version. When this field is part of spec, version is optional if image is specified.", - "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", - "force": "force allows an administrator to update to an image that has failed verification, does not appear in the availableUpdates list, or otherwise would be blocked by normal protections on update. This option should only be used when the authenticity of the provided image has been verified out of band because the provided image will run with full administrative access to the cluster. Do not use this flag with images that comes from unknown or potentially malicious sources.\n\nThis flag does not override other forms of consistency checking that are required before a new update is deployed.", + "": "Update represents an administrator update request.", + "architecture": "architecture is an optional field that indicates the desired value of the cluster architecture. In this context cluster architecture means either a single architecture or a multi architecture. architecture can only be set to Multi thereby only allowing updates from single to multi architecture. If architecture is set, image cannot be set and version must be set. Valid values are 'Multi' and empty.", + "version": "version is a semantic version identifying the update version. version is required if architecture is specified. If both version and image are set, the version extracted from the referenced image must match the specified version.", + "image": "image is a container image location that contains the update. image should be used when the desired version does not exist in availableUpdates or history. When image is set, architecture cannot be specified. If both version and image are set, the version extracted from the referenced image must match the specified version.", + "force": "force allows an administrator to update to an image that has failed verification or upgradeable checks that are designed to keep your cluster safe. Only use this if: * you are testing unsigned release images in short-lived test clusters or * you are working around a known bug in the cluster-version\n operator and you have verified the authenticity of the provided\n image yourself.\nThe provided image will run with full administrative access to the cluster. Do not use this flag with images that comes from unknown or potentially malicious sources.", } func (Update) SwaggerDoc() map[string]string { @@ -557,9 +890,10 @@ var map_UpdateHistory = map[string]string{ "state": "state reflects whether the update was fully applied. The Partial state indicates the update is not fully applied, while the Completed state indicates the update was successfully rolled out at least once (all parts of the update successfully applied).", "startedTime": "startedTime is the time at which the update was started.", "completionTime": "completionTime, if set, is when the update was fully applied. The update that is currently being applied will have a null completion time. Completion time will always be set for entries that are not the current update (usually to the started time of the next update).", - "version": "version is a semantic versioning identifying the update version. If the requested image does not define a version, or if a failure occurs retrieving the image, this value may be empty.", + "version": "version is a semantic version identifying the update version. If the requested image does not define a version, or if a failure occurs retrieving the image, this value may be empty.", "image": "image is a container image location that contains the update. This value is always populated.", - "verified": "verified indicates whether the provided update was properly verified before it was installed. If this is false the cluster may not be trusted.", + "verified": "verified indicates whether the provided update was properly verified before it was installed. If this is false the cluster may not be trusted. Verified does not cover upgradeable checks that depend on the cluster state at the time when the update target was accepted.", + "acceptedRisks": "acceptedRisks records risks which were accepted to initiate the update. For example, it may menition an Upgradeable=False or missing signature that was overridden via desiredUpdate.force, or an update that was initiated despite not being in the availableUpdates set of recommended update targets.", } func (UpdateHistory) SwaggerDoc() map[string]string { @@ -567,9 +901,10 @@ func (UpdateHistory) SwaggerDoc() map[string]string { } var map_Console = map[string]string{ - "": "Console holds cluster-wide configuration for the web console, including the logout URL, and reports the public URL of the console. The canonical name is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Console holds cluster-wide configuration for the web console, including the logout URL, and reports the public URL of the console. The canonical name is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Console) SwaggerDoc() map[string]string { @@ -585,6 +920,15 @@ func (ConsoleAuthentication) SwaggerDoc() map[string]string { return map_ConsoleAuthentication } +var map_ConsoleList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ConsoleList) SwaggerDoc() map[string]string { + return map_ConsoleList +} + var map_ConsoleSpec = map[string]string{ "": "ConsoleSpec is the specification of the desired behavior of the Console.", } @@ -602,20 +946,50 @@ func (ConsoleStatus) SwaggerDoc() map[string]string { return map_ConsoleStatus } +var map_AWSDNSSpec = map[string]string{ + "": "AWSDNSSpec contains DNS configuration specific to the Amazon Web Services cloud provider.", + "privateZoneIAMRole": "privateZoneIAMRole contains the ARN of an IAM role that should be assumed when performing operations on the cluster's private hosted zone specified in the cluster DNS config. When left empty, no role should be assumed.", +} + +func (AWSDNSSpec) SwaggerDoc() map[string]string { + return map_AWSDNSSpec +} + var map_DNS = map[string]string{ - "": "DNS holds cluster-wide information about DNS. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "DNS holds cluster-wide information about DNS. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (DNS) SwaggerDoc() map[string]string { return map_DNS } +var map_DNSList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (DNSList) SwaggerDoc() map[string]string { + return map_DNSList +} + +var map_DNSPlatformSpec = map[string]string{ + "": "DNSPlatformSpec holds cloud-provider-specific configuration for DNS administration.", + "type": "type is the underlying infrastructure provider for the cluster. Allowed values: \"\", \"AWS\".\n\nIndividual components may not support all platforms, and must handle unrecognized platforms with best-effort defaults.", + "aws": "aws contains DNS configuration specific to the Amazon Web Services cloud provider.", +} + +func (DNSPlatformSpec) SwaggerDoc() map[string]string { + return map_DNSPlatformSpec +} + var map_DNSSpec = map[string]string{ "baseDomain": "baseDomain is the base domain of the cluster. All managed DNS records will be sub-domains of this base.\n\nFor example, given the base domain `openshift.example.com`, an API server DNS record may be created for `cluster-api.openshift.example.com`.\n\nOnce set, this field cannot be changed.", "publicZone": "publicZone is the location where all the DNS records that are publicly accessible to the internet exist.\n\nIf this field is nil, no public records should be created.\n\nOnce set, this field cannot be changed.", "privateZone": "privateZone is the location where all the DNS records that are only available internally to the cluster exist.\n\nIf this field is nil, no private records should be created.\n\nOnce set, this field cannot be changed.", + "platform": "platform holds configuration specific to the underlying infrastructure provider for DNS. When omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time.", } func (DNSSpec) SwaggerDoc() map[string]string { @@ -642,15 +1016,43 @@ func (CustomFeatureGates) SwaggerDoc() map[string]string { } var map_FeatureGate = map[string]string{ - "": "Feature holds cluster-wide information about feature gates. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Feature holds cluster-wide information about feature gates. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (FeatureGate) SwaggerDoc() map[string]string { return map_FeatureGate } +var map_FeatureGateAttributes = map[string]string{ + "name": "name is the name of the FeatureGate.", +} + +func (FeatureGateAttributes) SwaggerDoc() map[string]string { + return map_FeatureGateAttributes +} + +var map_FeatureGateDetails = map[string]string{ + "version": "version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field.", + "enabled": "enabled is a list of all feature gates that are enabled in the cluster for the named version.", + "disabled": "disabled is a list of all feature gates that are disabled in the cluster for the named version.", +} + +func (FeatureGateDetails) SwaggerDoc() map[string]string { + return map_FeatureGateDetails +} + +var map_FeatureGateList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (FeatureGateList) SwaggerDoc() map[string]string { + return map_FeatureGateList +} + var map_FeatureGateSelection = map[string]string{ "featureSet": "featureSet changes the list of features in the cluster. The default is empty. Be very careful adjusting this setting. Turning on or off features may cause irreversible changes in your cluster which cannot be undone.", "customNoUpgrade": "customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations your cluster may fail in an unrecoverable way. featureSet must equal \"CustomNoUpgrade\" must be set to use this field.", @@ -660,21 +1062,41 @@ func (FeatureGateSelection) SwaggerDoc() map[string]string { return map_FeatureGateSelection } +var map_FeatureGateStatus = map[string]string{ + "conditions": "conditions represent the observations of the current state. Known .status.conditions.type are: \"DeterminationDegraded\"", + "featureGates": "featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. The enabled/disabled values for a particular version may change during the life of the cluster as various .spec.featureSet values are selected. Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable lists is beyond the scope of this API and is the responsibility of individual operators. Only featureGates with .version in the ClusterVersion.status will be present in this list.", +} + +func (FeatureGateStatus) SwaggerDoc() map[string]string { + return map_FeatureGateStatus +} + var map_Image = map[string]string{ - "": "Image governs policies related to imagestream imports and runtime configuration for external registries. It allows cluster admins to configure which registries OpenShift is allowed to import images from, extra CA trust bundles for external registries, and policies to block or allow registry hostnames. When exposing OpenShift's image registry to the public, this also lets cluster admins specify the external hostname.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Image governs policies related to imagestream imports and runtime configuration for external registries. It allows cluster admins to configure which registries OpenShift is allowed to import images from, extra CA trust bundles for external registries, and policies to block or allow registry hostnames. When exposing OpenShift's image registry to the public, this also lets cluster admins specify the external hostname.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Image) SwaggerDoc() map[string]string { return map_Image } +var map_ImageList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageList) SwaggerDoc() map[string]string { + return map_ImageList +} + var map_ImageSpec = map[string]string{ "allowedRegistriesForImport": "allowedRegistriesForImport limits the container image registries that normal users may import images from. Set this list to the registries that you trust to contain valid Docker images and that you want applications to be able to import from. Users with permission to create Images or ImageStreamMappings via the API are not affected by this policy - typically only administrators or system integrations will have those permissions.", "externalRegistryHostnames": "externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in \"hostname[:port]\" format.", "additionalTrustedCA": "additionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted during imagestream import, pod image pull, build image pull, and imageregistry pullthrough. The namespace for this config map is openshift-config.", "registrySources": "registrySources contains configuration that determines how the container runtime should treat individual registries when accessing images for builds+pods. (e.g. whether or not to allow insecure access). It does not contain configuration for the internal cluster registry.", + "imageStreamImportMode": "imageStreamImportMode controls the import mode behaviour of imagestreams. It can be set to `Legacy` or `PreserveOriginal` or the empty string. If this value is specified, this setting is applied to all newly created imagestreams which do not have the value set. `Legacy` indicates that the legacy behaviour should be used. For manifest lists, the legacy behaviour will discard the manifest list and import a single sub-manifest. In this case, the platform is chosen in the following order of priority: 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, the manifest list and all its sub-manifests will be imported. When empty, the behaviour will be decided based on the payload type advertised by the ClusterVersion status, i.e single arch payload implies the import mode is Legacy and multi payload implies PreserveOriginal.", } func (ImageSpec) SwaggerDoc() map[string]string { @@ -682,8 +1104,9 @@ func (ImageSpec) SwaggerDoc() map[string]string { } var map_ImageStatus = map[string]string{ - "internalRegistryHostname": "internalRegistryHostname sets the hostname for the default internal image registry. The value must be in \"hostname[:port]\" format. This value is set by the image registry operator which controls the internal registry hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY environment variable but this setting overrides the environment variable.", + "internalRegistryHostname": "internalRegistryHostname sets the hostname for the default internal image registry. The value must be in \"hostname[:port]\" format. This value is set by the image registry operator which controls the internal registry hostname.", "externalRegistryHostnames": "externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in \"hostname[:port]\" format.", + "imageStreamImportMode": "imageStreamImportMode controls the import mode behaviour of imagestreams. It can be `Legacy` or `PreserveOriginal`. `Legacy` indicates that the legacy behaviour should be used. For manifest lists, the legacy behaviour will discard the manifest list and import a single sub-manifest. In this case, the platform is chosen in the following order of priority: 1. tag annotations; 2. control plane arch/os; 3. linux/amd64; 4. the first manifest in the list. `PreserveOriginal` indicates that the original manifest will be preserved. For manifest lists, the manifest list and all its sub-manifests will be imported. This value will be reconciled based on either the spec value or if no spec value is specified, the image registry operator would look at the ClusterVersion status to determine the payload type and set the import mode accordingly, i.e single arch payload implies the import mode is Legacy and multi payload implies PreserveOriginal.", } func (ImageStatus) SwaggerDoc() map[string]string { @@ -712,6 +1135,266 @@ func (RegistrySources) SwaggerDoc() map[string]string { return map_RegistrySources } +var map_ImageContentPolicy = map[string]string{ + "": "ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", +} + +func (ImageContentPolicy) SwaggerDoc() map[string]string { + return map_ImageContentPolicy +} + +var map_ImageContentPolicyList = map[string]string{ + "": "ImageContentPolicyList lists the items in the ImageContentPolicy CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageContentPolicyList) SwaggerDoc() map[string]string { + return map_ImageContentPolicyList +} + +var map_ImageContentPolicySpec = map[string]string{ + "": "ImageContentPolicySpec is the specification of the ImageContentPolicy CRD.", + "repositoryDigestMirrors": "repositoryDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in RepositoryDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To pull image from mirrors by tags, should set the \"allowMirrorByTags\".\n\nEach “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified.", +} + +func (ImageContentPolicySpec) SwaggerDoc() map[string]string { + return map_ImageContentPolicySpec +} + +var map_RepositoryDigestMirrors = map[string]string{ + "": "RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source is the repository that users refer to, e.g. in image pull specifications.", + "allowMirrorByTags": "allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Forcing digest-pulls for mirrors avoids that issue.", + "mirrors": "mirrors is zero or more repositories that may also contain the same images. If the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec. No mirror will be configured. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. Other cluster configuration, including (but not limited to) other repositoryDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering.", +} + +func (RepositoryDigestMirrors) SwaggerDoc() map[string]string { + return map_RepositoryDigestMirrors +} + +var map_ImageDigestMirrorSet = map[string]string{ + "": "ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImageDigestMirrorSet) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSet +} + +var map_ImageDigestMirrorSetList = map[string]string{ + "": "ImageDigestMirrorSetList lists the items in the ImageDigestMirrorSet CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageDigestMirrorSetList) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSetList +} + +var map_ImageDigestMirrorSetSpec = map[string]string{ + "": "ImageDigestMirrorSetSpec is the specification of the ImageDigestMirrorSet CRD.", + "imageDigestMirrors": "imageDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using tag specification, users should configure a list of mirrors using \"ImageTagMirrorSet\" CRD.\n\nIf the image pull specification matches the repository of \"source\" in multiple imagedigestmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order.", +} + +func (ImageDigestMirrorSetSpec) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSetSpec +} + +var map_ImageDigestMirrors = map[string]string{ + "": "ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. \"source\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrors": "mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their digests. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by \"mirrorSourcePolicy\" Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. \"mirrors\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrorSourcePolicy": "mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list.", +} + +func (ImageDigestMirrors) SwaggerDoc() map[string]string { + return map_ImageDigestMirrors +} + +var map_FulcioCAWithRekor = map[string]string{ + "": "FulcioCAWithRekor defines the root of trust based on the Fulcio certificate and the Rekor public key.", + "fulcioCAData": "fulcioCAData is a required field contains inline base64-encoded data for the PEM format fulcio CA. fulcioCAData must be at most 8192 characters. ", + "rekorKeyData": "rekorKeyData is a required field contains inline base64-encoded data for the PEM format from the Rekor public key. rekorKeyData must be at most 8192 characters. ", + "fulcioSubject": "fulcioSubject is a required field specifies OIDC issuer and the email of the Fulcio authentication configuration.", +} + +func (FulcioCAWithRekor) SwaggerDoc() map[string]string { + return map_FulcioCAWithRekor +} + +var map_ImagePolicy = map[string]string{ + "": "ImagePolicy holds namespace-wide configuration for image signature verification\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImagePolicy) SwaggerDoc() map[string]string { + return map_ImagePolicy +} + +var map_ImagePolicyList = map[string]string{ + "": "ImagePolicyList is a list of ImagePolicy resources\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is a list of ImagePolicies", +} + +func (ImagePolicyList) SwaggerDoc() map[string]string { + return map_ImagePolicyList +} + +var map_ImagePolicySpec = map[string]string{ + "": "ImagePolicySpec is the specification of the ImagePolicy CRD.", + "scopes": "scopes is a required field that defines the list of image identities assigned to a policy. Each item refers to a scope in a registry implementing the \"Docker Registry HTTP API V2\". Scopes matching individual images are named Docker references in the fully expanded form, either using a tag or digest. For example, docker.io/library/busybox:latest (not busybox:latest). More general scopes are prefixes of individual-image scopes, and specify a repository (by omitting the tag or digest), a repository namespace, or a registry host (by only specifying the host name and possibly a port number) or a wildcard expression starting with `*.`, for matching all subdomains (not including a port number). Wildcards are only supported for subdomain matching, and may not be used in the middle of the host, i.e. *.example.com is a valid case, but example*.*.com is not. This support no more than 256 scopes in one object. If multiple scopes match a given image, only the policy requirements for the most specific scope apply. The policy requirements for more general scopes are ignored. In addition to setting a policy appropriate for your own deployed applications, make sure that a policy on the OpenShift image repositories quay.io/openshift-release-dev/ocp-release, quay.io/openshift-release-dev/ocp-v4.0-art-dev (or on a more general scope) allows deployment of the OpenShift images required for cluster operation. If a scope is configured in both the ClusterImagePolicy and the ImagePolicy, or if the scope in ImagePolicy is nested under one of the scopes from the ClusterImagePolicy, only the policy from the ClusterImagePolicy will be applied. For additional details about the format, please refer to the document explaining the docker transport field, which can be found at: https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md#docker", + "policy": "policy is a required field that contains configuration to allow scopes to be verified, and defines how images not matching the verification policy will be treated.", +} + +func (ImagePolicySpec) SwaggerDoc() map[string]string { + return map_ImagePolicySpec +} + +var map_ImagePolicyStatus = map[string]string{ + "conditions": "conditions provide details on the status of this API Resource. condition type 'Pending' indicates that the customer resource contains a policy that cannot take effect. It is either overwritten by a global policy or the image scope is not valid.", +} + +func (ImagePolicyStatus) SwaggerDoc() map[string]string { + return map_ImagePolicyStatus +} + +var map_PKI = map[string]string{ + "": "PKI defines the root of trust based on Root CA(s) and corresponding intermediate certificates.", + "caRootsData": "caRootsData contains base64-encoded data of a certificate bundle PEM file, which contains one or more CA roots in the PEM format. The total length of the data must not exceed 8192 characters. ", + "caIntermediatesData": "caIntermediatesData contains base64-encoded data of a certificate bundle PEM file, which contains one or more intermediate certificates in the PEM format. The total length of the data must not exceed 8192 characters. caIntermediatesData requires caRootsData to be set. ", + "pkiCertificateSubject": "pkiCertificateSubject defines the requirements imposed on the subject to which the certificate was issued.", +} + +func (PKI) SwaggerDoc() map[string]string { + return map_PKI +} + +var map_PKICertificateSubject = map[string]string{ + "": "PKICertificateSubject defines the requirements imposed on the subject to which the certificate was issued.", + "email": "email specifies the expected email address imposed on the subject to which the certificate was issued, and must match the email address listed in the Subject Alternative Name (SAN) field of the certificate. The email must be a valid email address and at most 320 characters in length.", + "hostname": "hostname specifies the expected hostname imposed on the subject to which the certificate was issued, and it must match the hostname listed in the Subject Alternative Name (SAN) DNS field of the certificate. The hostname must be a valid dns 1123 subdomain name, optionally prefixed by '*.', and at most 253 characters in length. It must consist only of lowercase alphanumeric characters, hyphens, periods and the optional preceding asterisk.", +} + +func (PKICertificateSubject) SwaggerDoc() map[string]string { + return map_PKICertificateSubject +} + +var map_Policy = map[string]string{ + "": "Policy defines the verification policy for the items in the scopes list.", + "rootOfTrust": "rootOfTrust is a required field that defines the root of trust for verifying image signatures during retrieval. This allows image consumers to specify policyType and corresponding configuration of the policy, matching how the policy was generated.", + "signedIdentity": "signedIdentity is an optional field specifies what image identity the signature claims about the image. This is useful when the image identity in the signature differs from the original image spec, such as when mirror registry is configured for the image scope, the signature from the mirror registry contains the image identity of the mirror instead of the original scope. The required matchPolicy field specifies the approach used in the verification process to verify the identity in the signature and the actual image identity, the default matchPolicy is \"MatchRepoDigestOrExact\".", +} + +func (Policy) SwaggerDoc() map[string]string { + return map_Policy +} + +var map_PolicyFulcioSubject = map[string]string{ + "": "PolicyFulcioSubject defines the OIDC issuer and the email of the Fulcio authentication configuration.", + "oidcIssuer": "oidcIssuer is a required filed contains the expected OIDC issuer. The oidcIssuer must be a valid URL and at most 2048 characters in length. It will be verified that the Fulcio-issued certificate contains a (Fulcio-defined) certificate extension pointing at this OIDC issuer URL. When Fulcio issues certificates, it includes a value based on an URL inside the client-provided ID token. Example: \"https://expected.OIDC.issuer/\"", + "signedEmail": "signedEmail is a required field holds the email address that the Fulcio certificate is issued for. The signedEmail must be a valid email address and at most 320 characters in length. Example: \"expected-signing-user@example.com\"", +} + +func (PolicyFulcioSubject) SwaggerDoc() map[string]string { + return map_PolicyFulcioSubject +} + +var map_PolicyIdentity = map[string]string{ + "": "PolicyIdentity defines image identity the signature claims about the image. When omitted, the default matchPolicy is \"MatchRepoDigestOrExact\".", + "matchPolicy": "matchPolicy is a required filed specifies matching strategy to verify the image identity in the signature against the image scope. Allowed values are \"MatchRepoDigestOrExact\", \"MatchRepository\", \"ExactRepository\", \"RemapIdentity\". When omitted, the default value is \"MatchRepoDigestOrExact\". When set to \"MatchRepoDigestOrExact\", the identity in the signature must be in the same repository as the image identity if the image identity is referenced by a digest. Otherwise, the identity in the signature must be the same as the image identity. When set to \"MatchRepository\", the identity in the signature must be in the same repository as the image identity. When set to \"ExactRepository\", the exactRepository must be specified. The identity in the signature must be in the same repository as a specific identity specified by \"repository\". When set to \"RemapIdentity\", the remapIdentity must be specified. The signature must be in the same as the remapped image identity. Remapped image identity is obtained by replacing the \"prefix\" with the specified “signedPrefix” if the the image identity matches the specified remapPrefix.", + "exactRepository": "exactRepository specifies the repository that must be exactly matched by the identity in the signature. exactRepository is required if matchPolicy is set to \"ExactRepository\". It is used to verify that the signature claims an identity matching this exact repository, rather than the original image identity.", + "remapIdentity": "remapIdentity specifies the prefix remapping rule for verifying image identity. remapIdentity is required if matchPolicy is set to \"RemapIdentity\". It is used to verify that the signature claims a different registry/repository prefix than the original image.", +} + +func (PolicyIdentity) SwaggerDoc() map[string]string { + return map_PolicyIdentity +} + +var map_PolicyMatchExactRepository = map[string]string{ + "repository": "repository is the reference of the image identity to be matched. repository is required if matchPolicy is set to \"ExactRepository\". The value should be a repository name (by omitting the tag or digest) in a registry implementing the \"Docker Registry HTTP API V2\". For example, docker.io/library/busybox", +} + +func (PolicyMatchExactRepository) SwaggerDoc() map[string]string { + return map_PolicyMatchExactRepository +} + +var map_PolicyMatchRemapIdentity = map[string]string{ + "prefix": "prefix is required if matchPolicy is set to \"RemapIdentity\". prefix is the prefix of the image identity to be matched. If the image identity matches the specified prefix, that prefix is replaced by the specified “signedPrefix” (otherwise it is used as unchanged and no remapping takes place). This is useful when verifying signatures for a mirror of some other repository namespace that preserves the vendor’s repository structure. The prefix and signedPrefix values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox.", + "signedPrefix": "signedPrefix is required if matchPolicy is set to \"RemapIdentity\". signedPrefix is the prefix of the image identity to be matched in the signature. The format is the same as \"prefix\". The values can be either host[:port] values (matching exactly the same host[:port], string), repository namespaces, or repositories (i.e. they must not contain tags/digests), and match as prefixes of the fully expanded form. For example, docker.io/library/busybox (not busybox) to specify that single repository, or docker.io/library (not an empty string) to specify the parent namespace of docker.io/library/busybox.", +} + +func (PolicyMatchRemapIdentity) SwaggerDoc() map[string]string { + return map_PolicyMatchRemapIdentity +} + +var map_PolicyRootOfTrust = map[string]string{ + "": "PolicyRootOfTrust defines the root of trust based on the selected policyType.", + "policyType": "policyType is a required field specifies the type of the policy for verification. This field must correspond to how the policy was generated. Allowed values are \"PublicKey\", \"FulcioCAWithRekor\", and \"PKI\". When set to \"PublicKey\", the policy relies on a sigstore publicKey and may optionally use a Rekor verification. When set to \"FulcioCAWithRekor\", the policy is based on the Fulcio certification and incorporates a Rekor verification. When set to \"PKI\", the policy is based on the certificates from Bring Your Own Public Key Infrastructure (BYOPKI). This value is enabled by turning on the SigstoreImageVerificationPKI feature gate.", + "publicKey": "publicKey defines the root of trust configuration based on a sigstore public key. Optionally include a Rekor public key for Rekor verification. publicKey is required when policyType is PublicKey, and forbidden otherwise.", + "fulcioCAWithRekor": "fulcioCAWithRekor defines the root of trust configuration based on the Fulcio certificate and the Rekor public key. fulcioCAWithRekor is required when policyType is FulcioCAWithRekor, and forbidden otherwise For more information about Fulcio and Rekor, please refer to the document at: https://github.com/sigstore/fulcio and https://github.com/sigstore/rekor", + "pki": "pki defines the root of trust configuration based on Bring Your Own Public Key Infrastructure (BYOPKI) Root CA(s) and corresponding intermediate certificates. pki is required when policyType is PKI, and forbidden otherwise.", +} + +func (PolicyRootOfTrust) SwaggerDoc() map[string]string { + return map_PolicyRootOfTrust +} + +var map_PublicKey = map[string]string{ + "": "PublicKey defines the root of trust based on a sigstore public key.", + "keyData": "keyData is a required field contains inline base64-encoded data for the PEM format public key. keyData must be at most 8192 characters. ", + "rekorKeyData": "rekorKeyData is an optional field contains inline base64-encoded data for the PEM format from the Rekor public key. rekorKeyData must be at most 8192 characters. ", +} + +func (PublicKey) SwaggerDoc() map[string]string { + return map_PublicKey +} + +var map_ImageTagMirrorSet = map[string]string{ + "": "ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImageTagMirrorSet) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSet +} + +var map_ImageTagMirrorSetList = map[string]string{ + "": "ImageTagMirrorSetList lists the items in the ImageTagMirrorSet CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageTagMirrorSetList) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSetList +} + +var map_ImageTagMirrorSetSpec = map[string]string{ + "": "ImageTagMirrorSetSpec is the specification of the ImageTagMirrorSet CRD.", + "imageTagMirrors": "imageTagMirrors allows images referenced by image tags in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageTagMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using digest specification only, users should configure a list of mirrors using \"ImageDigestMirrorSet\" CRD.\n\nIf the image pull specification matches the repository of \"source\" in multiple imagetagmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order.", +} + +func (ImageTagMirrorSetSpec) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSetSpec +} + +var map_ImageTagMirrors = map[string]string{ + "": "ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. \"source\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrors": "mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their tags. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Configuring a list of mirrors using \"ImageDigestMirrorSet\" CRD and forcing digest-pulls for mirrors avoids that issue. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by \"mirrorSourcePolicy\". Other cluster configuration, including (but not limited to) other imageTagMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. \"mirrors\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrorSourcePolicy": "mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list.", +} + +func (ImageTagMirrors) SwaggerDoc() map[string]string { + return map_ImageTagMirrors +} + var map_AWSPlatformSpec = map[string]string{ "": "AWSPlatformSpec holds the desired state of the Amazon Web Services infrastructure provider. This only includes fields that can be modified in the cluster.", "serviceEndpoints": "serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", @@ -722,10 +1405,12 @@ func (AWSPlatformSpec) SwaggerDoc() map[string]string { } var map_AWSPlatformStatus = map[string]string{ - "": "AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider.", - "region": "region holds the default AWS region for new AWS resources created by the cluster.", - "serviceEndpoints": "ServiceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", - "resourceTags": "resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user.", + "": "AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider.", + "region": "region holds the default AWS region for new AWS resources created by the cluster.", + "serviceEndpoints": "serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", + "resourceTags": "resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user.", + "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.", + "ipFamily": "ipFamily specifies the IP protocol family that should be used for AWS network resources. This controls whether AWS resources are created with IPv4-only, or dual-stack networking with IPv4 or IPv6 as the primary protocol family.", } func (AWSPlatformStatus) SwaggerDoc() map[string]string { @@ -734,8 +1419,8 @@ func (AWSPlatformStatus) SwaggerDoc() map[string]string { var map_AWSResourceTag = map[string]string{ "": "AWSResourceTag is a tag to apply to AWS resources created for the cluster.", - "key": "key is the key of the tag", - "value": "value is the value of the tag. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services.", + "key": "key sets the key of the AWS resource tag key-value pair. Key is required when defining an AWS resource tag. Key should consist of between 1 and 128 characters, and may contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'.", + "value": "value sets the value of the AWS resource tag key-value pair. Value is required when defining an AWS resource tag. Value should consist of between 1 and 256 characters, and may contain only the set of alphanumeric characters, space (' '), '_', '.', '/', '=', '+', '-', ':', and '@'. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services.", } func (AWSResourceTag) SwaggerDoc() map[string]string { @@ -752,6 +1437,35 @@ func (AWSServiceEndpoint) SwaggerDoc() map[string]string { return map_AWSServiceEndpoint } +var map_AlibabaCloudPlatformSpec = map[string]string{ + "": "AlibabaCloudPlatformSpec holds the desired state of the Alibaba Cloud infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (AlibabaCloudPlatformSpec) SwaggerDoc() map[string]string { + return map_AlibabaCloudPlatformSpec +} + +var map_AlibabaCloudPlatformStatus = map[string]string{ + "": "AlibabaCloudPlatformStatus holds the current status of the Alibaba Cloud infrastructure provider.", + "region": "region specifies the region for Alibaba Cloud resources created for the cluster.", + "resourceGroupID": "resourceGroupID is the ID of the resource group for the cluster.", + "resourceTags": "resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster.", +} + +func (AlibabaCloudPlatformStatus) SwaggerDoc() map[string]string { + return map_AlibabaCloudPlatformStatus +} + +var map_AlibabaCloudResourceTag = map[string]string{ + "": "AlibabaCloudResourceTag is the set of tags to add to apply to resources.", + "key": "key is the key of the tag.", + "value": "value is the value of the tag.", +} + +func (AlibabaCloudResourceTag) SwaggerDoc() map[string]string { + return map_AlibabaCloudResourceTag +} + var map_AzurePlatformSpec = map[string]string{ "": "AzurePlatformSpec holds the desired state of the Azure infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -765,14 +1479,40 @@ var map_AzurePlatformStatus = map[string]string{ "resourceGroupName": "resourceGroupName is the Resource Group for new Azure resources created for the cluster.", "networkResourceGroupName": "networkResourceGroupName is the Resource Group for network resources like the Virtual Network and Subnets used by the cluster. If empty, the value is same as ResourceGroupName.", "cloudName": "cloudName is the name of the Azure cloud environment which can be used to configure the Azure SDK with the appropriate Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`.", + "armEndpoint": "armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack.", + "resourceTags": "resourceTags is a list of additional tags to apply to Azure resources created for the cluster. See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration.", + "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.", + "ipFamily": "ipFamily specifies the IP protocol family that should be used for Azure network resources. This controls whether Azure resources are created with IPv4-only, or dual-stack networking with IPv4 or IPv6 as the primary protocol family.", } func (AzurePlatformStatus) SwaggerDoc() map[string]string { return map_AzurePlatformStatus } +var map_AzureResourceTag = map[string]string{ + "": "AzureResourceTag is a tag to apply to Azure resources created for the cluster.", + "key": "key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric characters and the following special characters `_ . -`.", + "value": "value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`.", +} + +func (AzureResourceTag) SwaggerDoc() map[string]string { + return map_AzureResourceTag +} + +var map_BareMetalPlatformLoadBalancer = map[string]string{ + "": "BareMetalPlatformLoadBalancer defines the load balancer used by the cluster on BareMetal platform.", + "type": "type defines the type of load balancer used by the cluster on BareMetal platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (BareMetalPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_BareMetalPlatformLoadBalancer +} + var map_BareMetalPlatformSpec = map[string]string{ - "": "BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. This only includes fields that can be modified in the cluster.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.apiServerInternalIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.ingressIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, for example \"10.0.0.0/8\" or \"fd00::/8\".", } func (BareMetalPlatformSpec) SwaggerDoc() map[string]string { @@ -780,16 +1520,50 @@ func (BareMetalPlatformSpec) SwaggerDoc() map[string]string { } var map_BareMetalPlatformStatus = map[string]string{ - "": "BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. For more information about the network architecture used with the BareMetal platform type, see: https://github.com/openshift/installer/blob/master/docs/design/baremetal/networking-infrastructure.md", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "": "BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. For more information about the network architecture used with the BareMetal platform type, see: https://github.com/openshift/installer/blob/master/docs/design/baremetal/networking-infrastructure.md", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes.", } func (BareMetalPlatformStatus) SwaggerDoc() map[string]string { return map_BareMetalPlatformStatus } +var map_CloudControllerManagerStatus = map[string]string{ + "": "CloudControllerManagerStatus holds the state of Cloud Controller Manager (a.k.a. CCM or CPI) related settings", + "state": "state determines whether or not an external Cloud Controller Manager is expected to be installed within the cluster. https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/#running-cloud-controller-manager\n\nValid values are \"External\", \"None\" and omitted. When set to \"External\", new nodes will be tainted as uninitialized when created, preventing them from running workloads until they are initialized by the cloud controller manager. When omitted or set to \"None\", new nodes will be not tainted and no extra initialization from the cloud controller manager is expected.", +} + +func (CloudControllerManagerStatus) SwaggerDoc() map[string]string { + return map_CloudControllerManagerStatus +} + +var map_CloudLoadBalancerConfig = map[string]string{ + "": "CloudLoadBalancerConfig contains an union discriminator indicating the type of DNS solution in use within the cluster. When the DNSType is `ClusterHosted`, the cloud's Load Balancer configuration needs to be provided so that the DNS solution hosted within the cluster can be configured with those values.", + "dnsType": "dnsType indicates the type of DNS solution in use within the cluster. Its default value of `PlatformDefault` indicates that the cluster's DNS is the default provided by the cloud platform. It can be set to `ClusterHosted` to bypass the configuration of the cloud default DNS. In this mode, the cluster needs to provide a self-hosted DNS solution for the cluster's installation to succeed. The cluster's use of the cloud's Load Balancers is unaffected by this setting. The value is immutable after it has been set at install time. Currently, there is no way for the customer to add additional DNS entries into the cluster hosted DNS. Enabling this functionality allows the user to start their own DNS solution outside the cluster after installation is complete. The customer would be responsible for configuring this custom DNS solution, and it can be run in addition to the in-cluster DNS solution.", + "clusterHosted": "clusterHosted holds the IP addresses of API, API-Int and Ingress Load Balancers on Cloud Platforms. The DNS solution hosted within the cluster use these IP addresses to provide resolution for API, API-Int and Ingress services.", +} + +func (CloudLoadBalancerConfig) SwaggerDoc() map[string]string { + return map_CloudLoadBalancerConfig +} + +var map_CloudLoadBalancerIPs = map[string]string{ + "": "CloudLoadBalancerIPs contains the Load Balancer IPs for the cloud's API, API-Int and Ingress Load balancers. They will be populated as soon as the respective Load Balancers have been configured. These values are utilized to configure the DNS solution hosted within the cluster.", + "apiIntLoadBalancerIPs": "apiIntLoadBalancerIPs holds Load Balancer IPs for the internal API service. These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. Entries in the apiIntLoadBalancerIPs must be unique. A maximum of 16 IP addresses are permitted.", + "apiLoadBalancerIPs": "apiLoadBalancerIPs holds Load Balancer IPs for the API service. These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. Could be empty for private clusters. Entries in the apiLoadBalancerIPs must be unique. A maximum of 16 IP addresses are permitted.", + "ingressLoadBalancerIPs": "ingressLoadBalancerIPs holds IPs for Ingress Load Balancers. These Load Balancer IP addresses can be IPv4 and/or IPv6 addresses. Entries in the ingressLoadBalancerIPs must be unique. A maximum of 16 IP addresses are permitted.", +} + +func (CloudLoadBalancerIPs) SwaggerDoc() map[string]string { + return map_CloudLoadBalancerIPs +} + var map_EquinixMetalPlatformSpec = map[string]string{ "": "EquinixMetalPlatformSpec holds the desired state of the Equinix Metal infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -808,6 +1582,24 @@ func (EquinixMetalPlatformStatus) SwaggerDoc() map[string]string { return map_EquinixMetalPlatformStatus } +var map_ExternalPlatformSpec = map[string]string{ + "": "ExternalPlatformSpec holds the desired state for the generic External infrastructure provider.", + "platformName": "platformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. This field is solely for informational and reporting purposes and is not expected to be used for decision-making.", +} + +func (ExternalPlatformSpec) SwaggerDoc() map[string]string { + return map_ExternalPlatformSpec +} + +var map_ExternalPlatformStatus = map[string]string{ + "": "ExternalPlatformStatus holds the current status of the generic External infrastructure provider.", + "cloudControllerManager": "cloudControllerManager contains settings specific to the external Cloud Controller Manager (a.k.a. CCM or CPI). When omitted, new nodes will be not tainted and no extra initialization from the cloud controller manager is expected.", +} + +func (ExternalPlatformStatus) SwaggerDoc() map[string]string { + return map_ExternalPlatformStatus +} + var map_GCPPlatformSpec = map[string]string{ "": "GCPPlatformSpec holds the desired state of the Google Cloud Platform infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -817,17 +1609,53 @@ func (GCPPlatformSpec) SwaggerDoc() map[string]string { } var map_GCPPlatformStatus = map[string]string{ - "": "GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider.", - "projectID": "resourceGroupName is the Project ID for new GCP resources created for the cluster.", - "region": "region holds the region for new GCP resources created for the cluster.", + "": "GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider.", + "projectID": "resourceGroupName is the Project ID for new GCP resources created for the cluster.", + "region": "region holds the region for new GCP resources created for the cluster.", + "resourceLabels": "resourceLabels is a list of additional labels to apply to GCP resources created for the cluster. See https://cloud.google.com/compute/docs/labeling-resources for information on labeling GCP resources. GCP supports a maximum of 64 labels per resource. OpenShift reserves 32 labels for internal use, allowing 32 labels for user configuration.", + "resourceTags": "resourceTags is a list of additional tags to apply to GCP resources created for the cluster. See https://cloud.google.com/resource-manager/docs/tags/tags-overview for information on tagging GCP resources. GCP supports a maximum of 50 tags per resource.", + "cloudLoadBalancerConfig": "cloudLoadBalancerConfig holds configuration related to DNS and cloud load balancers. It allows configuration of in-cluster DNS as an alternative to the platform default DNS implementation. When using the ClusterHosted DNS type, Load Balancer IP addresses must be provided for the API and internal API load balancers as well as the ingress load balancer.", + "serviceEndpoints": "serviceEndpoints specifies endpoints that override the default endpoints used when creating clients to interact with GCP services. When not specified, the default endpoint for the GCP region will be used. Only 1 endpoint override is permitted for each GCP service. The maximum number of endpoint overrides allowed is 11.", } func (GCPPlatformStatus) SwaggerDoc() map[string]string { return map_GCPPlatformStatus } +var map_GCPResourceLabel = map[string]string{ + "": "GCPResourceLabel is a label to apply to GCP resources created for the cluster.", + "key": "key is the key part of the label. A label key can have a maximum of 63 characters and cannot be empty. Label key must begin with a lowercase letter, and must contain only lowercase letters, numeric characters, and the following special characters `_-`. Label key must not have the reserved prefixes `kubernetes-io` and `openshift-io`.", + "value": "value is the value part of the label. A label value can have a maximum of 63 characters and cannot be empty. Value must contain only lowercase letters, numeric characters, and the following special characters `_-`.", +} + +func (GCPResourceLabel) SwaggerDoc() map[string]string { + return map_GCPResourceLabel +} + +var map_GCPResourceTag = map[string]string{ + "": "GCPResourceTag is a tag to apply to GCP resources created for the cluster.", + "parentID": "parentID is the ID of the hierarchical resource where the tags are defined, e.g. at the Organization or the Project level. To find the Organization or Project ID refer to the following pages: https://cloud.google.com/resource-manager/docs/creating-managing-organization#retrieving_your_organization_id, https://cloud.google.com/resource-manager/docs/creating-managing-projects#identifying_projects. An OrganizationID must consist of decimal numbers, and cannot have leading zeroes. A ProjectID must be 6 to 30 characters in length, can only contain lowercase letters, numbers, and hyphens, and must start with a letter, and cannot end with a hyphen.", + "key": "key is the key part of the tag. A tag key can have a maximum of 63 characters and cannot be empty. Tag key must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `._-`.", + "value": "value is the value part of the tag. A tag value can have a maximum of 63 characters and cannot be empty. Tag value must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%=+:,*#&(){}[]` and spaces.", +} + +func (GCPResourceTag) SwaggerDoc() map[string]string { + return map_GCPResourceTag +} + +var map_GCPServiceEndpoint = map[string]string{ + "": "GCPServiceEndpoint store the configuration of a custom url to override existing defaults of GCP Services.", + "name": "name is the name of the GCP service whose endpoint is being overridden. This must be provided and cannot be empty.\n\nAllowed values are Compute, Container, CloudResourceManager, DNS, File, IAM, ServiceUsage, Storage, and TagManager.\n\nAs an example, when setting the name to Compute all requests made by the caller to the GCP Compute Service will be directed to the endpoint specified in the url field.", + "url": "url is a fully qualified URI that overrides the default endpoint for a client using the GCP service specified in the name field. url is required, must use the scheme https, must not be more than 253 characters in length, and must be a valid URL according to Go's net/url package (https://pkg.go.dev/net/url#URL)\n\nAn example of a valid endpoint that overrides the Compute Service: \"https://compute-myendpoint1.p.googleapis.com\"", +} + +func (GCPServiceEndpoint) SwaggerDoc() map[string]string { + return map_GCPServiceEndpoint +} + var map_IBMCloudPlatformSpec = map[string]string{ - "": "IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. This only includes fields that can be modified in the cluster.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of an IBM service. These endpoints are used by components within the cluster when trying to reach the IBM Cloud Services that have been overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus are updated to reflect the same custom endpoints. A maximum of 13 service endpoints overrides are supported.", } func (IBMCloudPlatformSpec) SwaggerDoc() map[string]string { @@ -836,19 +1664,33 @@ func (IBMCloudPlatformSpec) SwaggerDoc() map[string]string { var map_IBMCloudPlatformStatus = map[string]string{ "": "IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider.", - "location": "Location is where the cluster has been deployed", - "resourceGroupName": "ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster.", - "providerType": "ProviderType indicates the type of cluster that was created", + "location": "location is where the cluster has been deployed", + "resourceGroupName": "resourceGroupName is the Resource Group for new IBMCloud resources created for the cluster.", + "providerType": "providerType indicates the type of cluster that was created", + "cisInstanceCRN": "cisInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain", + "dnsInstanceCRN": "dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of an IBM service. These endpoints are used by components within the cluster when trying to reach the IBM Cloud Services that have been overridden. The CCCMO reads in the IBMCloudPlatformSpec and validates each endpoint is resolvable. Once validated, the cloud config and IBMCloudPlatformStatus are updated to reflect the same custom endpoints.", } func (IBMCloudPlatformStatus) SwaggerDoc() map[string]string { return map_IBMCloudPlatformStatus } +var map_IBMCloudServiceEndpoint = map[string]string{ + "": "IBMCloudServiceEndpoint stores the configuration of a custom url to override existing defaults of IBM Cloud Services.", + "name": "name is the name of the IBM Cloud service. Possible values are: CIS, COS, COSConfig, DNSServices, GlobalCatalog, GlobalSearch, GlobalTagging, HyperProtect, IAM, KeyProtect, ResourceController, ResourceManager, or VPC. For example, the IBM Cloud Private IAM service could be configured with the service `name` of `IAM` and `url` of `https://private.iam.cloud.ibm.com` Whereas the IBM Cloud Private VPC service for US South (Dallas) could be configured with the service `name` of `VPC` and `url` of `https://us.south.private.iaas.cloud.ibm.com`", + "url": "url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. The path must follow the pattern /v[0,9]+ or /api/v[0,9]+", +} + +func (IBMCloudServiceEndpoint) SwaggerDoc() map[string]string { + return map_IBMCloudServiceEndpoint +} + var map_Infrastructure = map[string]string{ - "": "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Infrastructure) SwaggerDoc() map[string]string { @@ -856,7 +1698,8 @@ func (Infrastructure) SwaggerDoc() map[string]string { } var map_InfrastructureList = map[string]string{ - "": "InfrastructureList is", + "": "InfrastructureList is\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (InfrastructureList) SwaggerDoc() map[string]string { @@ -881,8 +1724,9 @@ var map_InfrastructureStatus = map[string]string{ "etcdDiscoveryDomain": "etcdDiscoveryDomain is the domain used to fetch the SRV records for discovering etcd servers and clients. For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release.", "apiServerURL": "apiServerURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerURL can be used by components like the web console to tell users where to find the Kubernetes API.", "apiServerInternalURI": "apiServerInternalURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components like kubelets, to contact the Kubernetes API server using the infrastructure provider rather than Kubernetes networking.", - "controlPlaneTopology": "controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation", - "infrastructureTopology": "infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation", + "controlPlaneTopology": "controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation The 'External' mode indicates that the control plane is hosted externally to the cluster and that its components are not visible within the cluster.", + "infrastructureTopology": "infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation NOTE: External topology mode is not applicable for this field.", + "cpuPartitioning": "cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. Valid values are \"None\" and \"AllNodes\". When omitted, the default value is \"None\". The default value of \"None\" indicates that no nodes will be setup with CPU partitioning. The \"AllNodes\" value indicates that all nodes have been setup with CPU partitioning, and can then be further configured via the PerformanceProfile API.", } func (InfrastructureStatus) SwaggerDoc() map[string]string { @@ -907,8 +1751,95 @@ func (KubevirtPlatformStatus) SwaggerDoc() map[string]string { return map_KubevirtPlatformStatus } +var map_NutanixFailureDomain = map[string]string{ + "": "NutanixFailureDomain configures failure domain information for the Nutanix platform.", + "name": "name defines the unique name of a failure domain. Name is required and must be at most 64 characters in length. It must consist of only lower case alphanumeric characters and hyphens (-). It must start and end with an alphanumeric character. This value is arbitrary and is used to identify the failure domain within the platform.", + "cluster": "cluster is to identify the cluster (the Prism Element under management of the Prism Central), in which the Machine's VM will be created. The cluster identifier (uuid or name) can be obtained from the Prism Central console or using the prism_central API.", + "subnets": "subnets holds a list of identifiers (one or more) of the cluster's network subnets If the feature gate NutanixMultiSubnets is enabled, up to 32 subnets may be configured. for the Machine's VM to connect to. The subnet identifiers (uuid or name) can be obtained from the Prism Central console or using the prism_central API.", +} + +func (NutanixFailureDomain) SwaggerDoc() map[string]string { + return map_NutanixFailureDomain +} + +var map_NutanixPlatformLoadBalancer = map[string]string{ + "": "NutanixPlatformLoadBalancer defines the load balancer used by the cluster on Nutanix platform.", + "type": "type defines the type of load balancer used by the cluster on Nutanix platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (NutanixPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_NutanixPlatformLoadBalancer +} + +var map_NutanixPlatformSpec = map[string]string{ + "": "NutanixPlatformSpec holds the desired state of the Nutanix infrastructure provider. This only includes fields that can be modified in the cluster.", + "prismCentral": "prismCentral holds the endpoint address and port to access the Nutanix Prism Central. When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list.", + "prismElements": "prismElements holds one or more endpoint address and port data to access the Nutanix Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) spread over multiple Prism Elements (clusters) of the Prism Central.", + "failureDomains": "failureDomains configures failure domains information for the Nutanix platform. When set, the failure domains defined here may be used to spread Machines across prism element clusters to improve fault tolerance of the cluster.", +} + +func (NutanixPlatformSpec) SwaggerDoc() map[string]string { + return map_NutanixPlatformSpec +} + +var map_NutanixPlatformStatus = map[string]string{ + "": "NutanixPlatformStatus holds the current status of the Nutanix infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (NutanixPlatformStatus) SwaggerDoc() map[string]string { + return map_NutanixPlatformStatus +} + +var map_NutanixPrismElementEndpoint = map[string]string{ + "": "NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster)", + "name": "name is the name of the Prism Element (cluster). This value will correspond with the cluster field configured on other resources (eg Machines, PVCs, etc).", + "endpoint": "endpoint holds the endpoint address and port data of the Prism Element (cluster). When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list.", +} + +func (NutanixPrismElementEndpoint) SwaggerDoc() map[string]string { + return map_NutanixPrismElementEndpoint +} + +var map_NutanixPrismEndpoint = map[string]string{ + "": "NutanixPrismEndpoint holds the endpoint address and port to access the Nutanix Prism Central or Element (cluster)", + "address": "address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster)", + "port": "port is the port number to access the Nutanix Prism Central or Element (cluster)", +} + +func (NutanixPrismEndpoint) SwaggerDoc() map[string]string { + return map_NutanixPrismEndpoint +} + +var map_NutanixResourceIdentifier = map[string]string{ + "": "NutanixResourceIdentifier holds the identity of a Nutanix PC resource (cluster, image, subnet, etc.)", + "type": "type is the identifier type to use for this resource.", + "uuid": "uuid is the UUID of the resource in the PC. It cannot be empty if the type is UUID.", + "name": "name is the resource name in the PC. It cannot be empty if the type is Name.", +} + +func (NutanixResourceIdentifier) SwaggerDoc() map[string]string { + return map_NutanixResourceIdentifier +} + +var map_OpenStackPlatformLoadBalancer = map[string]string{ + "": "OpenStackPlatformLoadBalancer defines the load balancer used by the cluster on OpenStack platform.", + "type": "type defines the type of load balancer used by the cluster on OpenStack platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (OpenStackPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_OpenStackPlatformLoadBalancer +} + var map_OpenStackPlatformSpec = map[string]string{ - "": "OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. This only includes fields that can be modified in the cluster.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.apiServerInternalIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.ingressIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, for example \"10.0.0.0/8\" or \"fd00::/8\".", } func (OpenStackPlatformSpec) SwaggerDoc() map[string]string { @@ -916,17 +1847,30 @@ func (OpenStackPlatformSpec) SwaggerDoc() map[string]string { } var map_OpenStackPlatformStatus = map[string]string{ - "": "OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider.", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "cloudName": "cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`).", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "": "OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "cloudName": "cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`).", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes.", } func (OpenStackPlatformStatus) SwaggerDoc() map[string]string { return map_OpenStackPlatformStatus } +var map_OvirtPlatformLoadBalancer = map[string]string{ + "": "OvirtPlatformLoadBalancer defines the load balancer used by the cluster on Ovirt platform.", + "type": "type defines the type of load balancer used by the cluster on Ovirt platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (OvirtPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_OvirtPlatformLoadBalancer +} + var map_OvirtPlatformSpec = map[string]string{ "": "OvirtPlatformSpec holds the desired state of the oVirt infrastructure provider. This only includes fields that can be modified in the cluster.", } @@ -936,10 +1880,13 @@ func (OvirtPlatformSpec) SwaggerDoc() map[string]string { } var map_OvirtPlatformStatus = map[string]string{ - "": "OvirtPlatformStatus holds the current status of the oVirt infrastructure provider.", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.", + "": "OvirtPlatformStatus holds the current status of the oVirt infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", } func (OvirtPlatformStatus) SwaggerDoc() map[string]string { @@ -948,17 +1895,21 @@ func (OvirtPlatformStatus) SwaggerDoc() map[string]string { var map_PlatformSpec = map[string]string{ "": "PlatformSpec holds the desired state specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.", - "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", - "aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.", - "azure": "Azure contains settings specific to the Azure infrastructure provider.", - "gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.", - "baremetal": "BareMetal contains settings specific to the BareMetal platform.", - "openstack": "OpenStack contains settings specific to the OpenStack infrastructure provider.", - "ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.", - "vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.", - "ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.", - "kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.", - "equinixMetal": "EquinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", + "azure": "azure contains settings specific to the Azure infrastructure provider.", + "gcp": "gcp contains settings specific to the Google Cloud Platform infrastructure provider.", + "baremetal": "baremetal contains settings specific to the BareMetal platform.", + "openstack": "openstack contains settings specific to the OpenStack infrastructure provider.", + "ovirt": "ovirt contains settings specific to the oVirt infrastructure provider.", + "vsphere": "vsphere contains settings specific to the VSphere infrastructure provider.", + "ibmcloud": "ibmcloud contains settings specific to the IBMCloud infrastructure provider.", + "kubevirt": "kubevirt contains settings specific to the kubevirt infrastructure provider.", + "equinixMetal": "equinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "powervs": "powervs contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider.", + "alibabaCloud": "alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider.", + "nutanix": "nutanix contains settings specific to the Nutanix infrastructure provider.", + "external": "ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately.", } func (PlatformSpec) SwaggerDoc() map[string]string { @@ -967,25 +1918,143 @@ func (PlatformSpec) SwaggerDoc() map[string]string { var map_PlatformStatus = map[string]string{ "": "PlatformStatus holds the current status specific to the underlying infrastructure provider of the current cluster. Since these are used at status-level for the underlying cluster, it is supposed that only one of the status structs is set.", - "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.\n\nThis value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set.", - "aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.", - "azure": "Azure contains settings specific to the Azure infrastructure provider.", - "gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.", - "baremetal": "BareMetal contains settings specific to the BareMetal platform.", - "openstack": "OpenStack contains settings specific to the OpenStack infrastructure provider.", - "ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.", - "vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.", - "ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.", - "kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.", - "equinixMetal": "EquinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.\n\nThis value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", + "azure": "azure contains settings specific to the Azure infrastructure provider.", + "gcp": "gcp contains settings specific to the Google Cloud Platform infrastructure provider.", + "baremetal": "baremetal contains settings specific to the BareMetal platform.", + "openstack": "openstack contains settings specific to the OpenStack infrastructure provider.", + "ovirt": "ovirt contains settings specific to the oVirt infrastructure provider.", + "vsphere": "vsphere contains settings specific to the VSphere infrastructure provider.", + "ibmcloud": "ibmcloud contains settings specific to the IBMCloud infrastructure provider.", + "kubevirt": "kubevirt contains settings specific to the kubevirt infrastructure provider.", + "equinixMetal": "equinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "powervs": "powervs contains settings specific to the Power Systems Virtual Servers infrastructure provider.", + "alibabaCloud": "alibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider.", + "nutanix": "nutanix contains settings specific to the Nutanix infrastructure provider.", + "external": "external contains settings specific to the generic External infrastructure provider.", } func (PlatformStatus) SwaggerDoc() map[string]string { return map_PlatformStatus } +var map_PowerVSPlatformSpec = map[string]string{ + "": "PowerVSPlatformSpec holds the desired state of the IBM Power Systems Virtual Servers infrastructure provider. This only includes fields that can be modified in the cluster.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service.", +} + +func (PowerVSPlatformSpec) SwaggerDoc() map[string]string { + return map_PowerVSPlatformSpec +} + +var map_PowerVSPlatformStatus = map[string]string{ + "": "PowerVSPlatformStatus holds the current status of the IBM Power Systems Virtual Servers infrastrucutre provider.", + "region": "region holds the default Power VS region for new Power VS resources created by the cluster.", + "zone": "zone holds the default zone for the new Power VS resources created by the cluster. Note: Currently only single-zone OCP clusters are supported", + "resourceGroup": "resourceGroup is the resource group name for new IBMCloud resources created for a cluster. The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. When omitted, the image registry operator won't be able to configure storage, which results in the image registry cluster operator not being in an available state.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service.", + "cisInstanceCRN": "cisInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain", + "dnsInstanceCRN": "dnsInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain", +} + +func (PowerVSPlatformStatus) SwaggerDoc() map[string]string { + return map_PowerVSPlatformStatus +} + +var map_PowerVSServiceEndpoint = map[string]string{ + "": "PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services.", + "name": "name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud", + "url": "url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty.", +} + +func (PowerVSServiceEndpoint) SwaggerDoc() map[string]string { + return map_PowerVSServiceEndpoint +} + +var map_VSphereFailureDomainHostGroup = map[string]string{ + "": "VSphereFailureDomainHostGroup holds the vmGroup and the hostGroup names in vCenter corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also contains the vmHostRule which is an affinity vm-host rule in vCenter.", + "vmGroup": "vmGroup is the name of the vm-host group of type virtual machine within vCenter for this failure domain. vmGroup is limited to 80 characters. This field is required when the VSphereFailureDomain ZoneType is HostGroup", + "hostGroup": "hostGroup is the name of the vm-host group of type host within vCenter for this failure domain. hostGroup is limited to 80 characters. This field is required when the VSphereFailureDomain ZoneType is HostGroup", + "vmHostRule": "vmHostRule is the name of the affinity vm-host rule within vCenter for this failure domain. vmHostRule is limited to 80 characters. This field is required when the VSphereFailureDomain ZoneType is HostGroup", +} + +func (VSphereFailureDomainHostGroup) SwaggerDoc() map[string]string { + return map_VSphereFailureDomainHostGroup +} + +var map_VSphereFailureDomainRegionAffinity = map[string]string{ + "": "VSphereFailureDomainRegionAffinity contains the region type which is the string representation of the VSphereFailureDomainRegionType with available options of Datacenter and ComputeCluster.", + "type": "type determines the vSphere object type for a region within this failure domain. Available types are Datacenter and ComputeCluster. When set to Datacenter, this means the vCenter Datacenter defined is the region. When set to ComputeCluster, this means the vCenter cluster defined is the region.", +} + +func (VSphereFailureDomainRegionAffinity) SwaggerDoc() map[string]string { + return map_VSphereFailureDomainRegionAffinity +} + +var map_VSphereFailureDomainZoneAffinity = map[string]string{ + "": "VSphereFailureDomainZoneAffinity contains the vCenter cluster vm-host group (virtual machine and host types) and the vm-host affinity rule that together creates an affinity configuration for vm-host based zonal. This configuration within vCenter creates the required association between a failure domain, virtual machines and ESXi hosts to create a vm-host based zone.", + "type": "type determines the vSphere object type for a zone within this failure domain. Available types are ComputeCluster and HostGroup. When set to ComputeCluster, this means the vCenter cluster defined is the zone. When set to HostGroup, hostGroup must be configured with hostGroup, vmGroup and vmHostRule and this means the zone is defined by the grouping of those fields.", + "hostGroup": "hostGroup holds the vmGroup and the hostGroup names in vCenter corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also contains the vmHostRule which is an affinity vm-host rule in vCenter.", +} + +func (VSphereFailureDomainZoneAffinity) SwaggerDoc() map[string]string { + return map_VSphereFailureDomainZoneAffinity +} + +var map_VSpherePlatformFailureDomainSpec = map[string]string{ + "": "VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain.", + "name": "name defines the arbitrary but unique name of a failure domain.", + "region": "region defines the name of a region tag that will be attached to a vCenter datacenter. The tag category in vCenter must be named openshift-region.", + "zone": "zone defines the name of a zone tag that will be attached to a vCenter cluster. The tag category in vCenter must be named openshift-zone.", + "regionAffinity": "regionAffinity holds the type of region, Datacenter or ComputeCluster. When set to Datacenter, this means the region is a vCenter Datacenter as defined in topology. When set to ComputeCluster, this means the region is a vCenter Cluster as defined in topology.", + "zoneAffinity": "zoneAffinity holds the type of the zone and the hostGroup which vmGroup and the hostGroup names in vCenter corresponds to a vm-host group of type Virtual Machine and Host respectively. Is also contains the vmHostRule which is an affinity vm-host rule in vCenter.", + "server": "server is the fully-qualified domain name or the IP address of the vCenter server.", + "topology": "topology describes a given failure domain using vSphere constructs", +} + +func (VSpherePlatformFailureDomainSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformFailureDomainSpec +} + +var map_VSpherePlatformLoadBalancer = map[string]string{ + "": "VSpherePlatformLoadBalancer defines the load balancer used by the cluster on VSphere platform.", + "type": "type defines the type of load balancer used by the cluster on VSphere platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (VSpherePlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_VSpherePlatformLoadBalancer +} + +var map_VSpherePlatformNodeNetworking = map[string]string{ + "": "VSpherePlatformNodeNetworking holds the external and internal node networking spec.", + "external": "external represents the network configuration of the node that is externally routable.", + "internal": "internal represents the network configuration of the node that is routable only within the cluster.", +} + +func (VSpherePlatformNodeNetworking) SwaggerDoc() map[string]string { + return map_VSpherePlatformNodeNetworking +} + +var map_VSpherePlatformNodeNetworkingSpec = map[string]string{ + "": "VSpherePlatformNodeNetworkingSpec holds the network CIDR(s) and port group name for including and excluding IP ranges in the cloud provider. This would be used for example when multiple network adapters are attached to a guest to help determine which IP address the cloud config manager should use for the external and internal node networking.", + "networkSubnetCidr": "networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields.", + "network": "network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'`", + "excludeNetworkSubnetCidr": "excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields.", +} + +func (VSpherePlatformNodeNetworkingSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformNodeNetworkingSpec +} + var map_VSpherePlatformSpec = map[string]string{ - "": "VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. This only includes fields that can be modified in the cluster.", + "": "VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. In the future the cloud provider operator, storage operator and machine operator will use these fields for configuration.", + "vcenters": "vcenters holds the connection details for services to communicate with vCenter. Currently, only a single vCenter is supported, but in tech preview 3 vCenters are supported. Once the cluster has been installed, you are unable to change the current number of defined vCenters except in the case where the cluster has been upgraded from a version of OpenShift where the vsphere platform spec was not present. You may make modifications to the existing vCenters that are defined in the vcenters list in order to match with any added or modified failure domains.", + "failureDomains": "failureDomains contains the definition of region, zone and the vCenter topology. If this is omitted failure domains (regions and zones) will not be used.", + "nodeNetworking": "nodeNetworking contains the definition of internal and external network constraints for assigning the node's networking. If this field is omitted, networking defaults to the legacy address selection behavior which is to only support a single address and return the first one found.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.apiServerInternalIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IP addresses, one from IPv4 family and one from IPv6. In single stack clusters a single IP address is expected. When omitted, values from the status.ingressIPs will be used. Once set, the list cannot be completely removed (but its second entry can).", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes. Each network is provided in the CIDR format and should be IPv4 or IPv6, for example \"10.0.0.0/8\" or \"fd00::/8\".", } func (VSpherePlatformSpec) SwaggerDoc() map[string]string { @@ -993,16 +2062,55 @@ func (VSpherePlatformSpec) SwaggerDoc() map[string]string { } var map_VSpherePlatformStatus = map[string]string{ - "": "VSpherePlatformStatus holds the current status of the vSphere infrastructure provider.", - "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", - "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", - "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "": "VSpherePlatformStatus holds the current status of the vSphere infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", + "machineNetworks": "machineNetworks are IP networks used to connect all the OpenShift cluster nodes.", } func (VSpherePlatformStatus) SwaggerDoc() map[string]string { return map_VSpherePlatformStatus } +var map_VSpherePlatformTopology = map[string]string{ + "": "VSpherePlatformTopology holds the required and optional vCenter objects - datacenter, computeCluster, networks, datastore and resourcePool - to provision virtual machines.", + "datacenter": "datacenter is the name of vCenter datacenter in which virtual machines will be located. The maximum length of the datacenter name is 80 characters.", + "computeCluster": "computeCluster the absolute path of the vCenter cluster in which virtual machine will be located. The absolute path is of the form //host/. The maximum length of the path is 2048 characters.", + "networks": "networks is the list of port group network names within this failure domain. If feature gate VSphereMultiNetworks is enabled, up to 10 network adapters may be defined. 10 is the maximum number of virtual network devices which may be attached to a VM as defined by: https://configmax.esp.vmware.com/guest?vmwareproduct=vSphere&release=vSphere%208.0&categories=1-0 The available networks (port groups) can be listed using `govc ls 'network/*'` Networks should be in the form of an absolute path: //network/.", + "datastore": "datastore is the absolute path of the datastore in which the virtual machine is located. The absolute path is of the form //datastore/ The maximum length of the path is 2048 characters.", + "resourcePool": "resourcePool is the absolute path of the resource pool where virtual machines will be created. The absolute path is of the form //host//Resources/. The maximum length of the path is 2048 characters.", + "folder": "folder is the absolute path of the folder where virtual machines are located. The absolute path is of the form //vm/. The maximum length of the path is 2048 characters.", + "template": "template is the full inventory path of the virtual machine or template that will be cloned when creating new machines in this failure domain. The maximum length of the path is 2048 characters.\n\nWhen omitted, the template will be calculated by the control plane machineset operator based on the region and zone defined in VSpherePlatformFailureDomainSpec. For example, for zone=zonea, region=region1, and infrastructure name=test, the template path would be calculated as //vm/test-rhcos-region1-zonea.", +} + +func (VSpherePlatformTopology) SwaggerDoc() map[string]string { + return map_VSpherePlatformTopology +} + +var map_VSpherePlatformVCenterSpec = map[string]string{ + "": "VSpherePlatformVCenterSpec stores the vCenter connection fields. This is used by the vSphere CCM.", + "server": "server is the fully-qualified domain name or the IP address of the vCenter server.", + "port": "port is the TCP port that will be used to communicate to the vCenter endpoint. When omitted, this means the user has no opinion and it is up to the platform to choose a sensible default, which is subject to change over time.", + "datacenters": "The vCenter Datacenters in which the RHCOS vm guests are located. This field will be used by the Cloud Controller Manager. Each datacenter listed here should be used within a topology.", +} + +func (VSpherePlatformVCenterSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformVCenterSpec +} + +var map_AWSIngressSpec = map[string]string{ + "": "AWSIngressSpec holds the desired state of the Ingress for Amazon Web Services infrastructure provider. This only includes fields that can be modified in the cluster.", + "type": "type allows user to set a load balancer type. When this field is set the default ingresscontroller will get created using the specified LBType. If this field is not set then the default ingress controller of LBType Classic will be created. Valid values are:\n\n* \"Classic\": A Classic Load Balancer that makes routing decisions at either\n the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See\n the following for additional details:\n\n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb\n\n* \"NLB\": A Network Load Balancer that makes routing decisions at the\n transport layer (TCP/SSL). See the following for additional details:\n\n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb", +} + +func (AWSIngressSpec) SwaggerDoc() map[string]string { + return map_AWSIngressSpec +} + var map_ComponentRouteSpec = map[string]string{ "": "ComponentRouteSpec allows for configuration of a route's hostname and serving certificate.", "namespace": "namespace is the namespace of the route to customize.\n\nThe namespace and name of this componentRoute must match a corresponding entry in the list of status.componentRoutes if the route is to be customized.", @@ -1031,19 +2139,41 @@ func (ComponentRouteStatus) SwaggerDoc() map[string]string { } var map_Ingress = map[string]string{ - "": "Ingress holds cluster-wide information about ingress, including the default ingress domain used for routes. The canonical name is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Ingress holds cluster-wide information about ingress, including the default ingress domain used for routes. The canonical name is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Ingress) SwaggerDoc() map[string]string { return map_Ingress } +var map_IngressList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (IngressList) SwaggerDoc() map[string]string { + return map_IngressList +} + +var map_IngressPlatformSpec = map[string]string{ + "": "IngressPlatformSpec holds the desired state of Ingress specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.", + "type": "type is the underlying infrastructure provider for the cluster. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", +} + +func (IngressPlatformSpec) SwaggerDoc() map[string]string { + return map_IngressPlatformSpec +} + var map_IngressSpec = map[string]string{ - "domain": "domain is used to generate a default host name for a route when the route's host name is empty. The generated host name will follow this pattern: \"..\".\n\nIt is also used as the default wildcard domain suffix for ingress. The default ingresscontroller domain will follow this pattern: \"*.\".\n\nOnce set, changing domain is not currently supported.", - "appsDomain": "appsDomain is an optional domain to use instead of the one specified in the domain field when a Route is created without specifying an explicit host. If appsDomain is nonempty, this value is used to generate default host values for Route. Unlike domain, appsDomain may be modified after installation. This assumes a new ingresscontroller has been setup with a wildcard certificate.", - "componentRoutes": "componentRoutes is an optional list of routes that are managed by OpenShift components that a cluster-admin is able to configure the hostname and serving certificate for. The namespace and name of each route in this list should match an existing entry in the status.componentRoutes list.\n\nTo determine the set of configurable Routes, look at namespace and name of entries in the .status.componentRoutes list, where participating operators write the status of configurable routes.", + "domain": "domain is used to generate a default host name for a route when the route's host name is empty. The generated host name will follow this pattern: \"..\".\n\nIt is also used as the default wildcard domain suffix for ingress. The default ingresscontroller domain will follow this pattern: \"*.\".\n\nOnce set, changing domain is not currently supported.", + "appsDomain": "appsDomain is an optional domain to use instead of the one specified in the domain field when a Route is created without specifying an explicit host. If appsDomain is nonempty, this value is used to generate default host values for Route. Unlike domain, appsDomain may be modified after installation. This assumes a new ingresscontroller has been setup with a wildcard certificate.", + "componentRoutes": "componentRoutes is an optional list of routes that are managed by OpenShift components that a cluster-admin is able to configure the hostname and serving certificate for. The namespace and name of each route in this list should match an existing entry in the status.componentRoutes list.\n\nTo determine the set of configurable Routes, look at namespace and name of entries in the .status.componentRoutes list, where participating operators write the status of configurable routes.", + "requiredHSTSPolicies": "requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes matching the domainPattern/s and namespaceSelector/s that are specified in the policy. Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route annotation, and affect route admission.\n\nA candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: \"haproxy.router.openshift.io/hsts_header\" E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains\n\n- For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route is rejected. - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies determines the route's admission status. - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, then it may use any HSTS Policy annotation.\n\nThe HSTS policy configuration may be changed after routes have already been created. An update to a previously admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working.\n\nNote that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid.", + "loadBalancer": "loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure provider of the current cluster and are required for Ingress Controller to work on OpenShift.", } func (IngressSpec) SwaggerDoc() map[string]string { @@ -1051,13 +2181,140 @@ func (IngressSpec) SwaggerDoc() map[string]string { } var map_IngressStatus = map[string]string{ - "componentRoutes": "componentRoutes is where participating operators place the current route status for routes whose hostnames and serving certificates can be customized by the cluster-admin.", + "componentRoutes": "componentRoutes is where participating operators place the current route status for routes whose hostnames and serving certificates can be customized by the cluster-admin.", + "defaultPlacement": "defaultPlacement is set at installation time to control which nodes will host the ingress router pods by default. The options are control-plane nodes or worker nodes.\n\nThis field works by dictating how the Cluster Ingress Operator will consider unset replicas and nodePlacement fields in IngressController resources when creating the corresponding Deployments.\n\nSee the documentation for the IngressController replicas and nodePlacement fields for more information.\n\nWhen omitted, the default value is Workers", } func (IngressStatus) SwaggerDoc() map[string]string { return map_IngressStatus } +var map_LoadBalancer = map[string]string{ + "platform": "platform holds configuration specific to the underlying infrastructure provider for the ingress load balancers. When omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time.", +} + +func (LoadBalancer) SwaggerDoc() map[string]string { + return map_LoadBalancer +} + +var map_Custom = map[string]string{ + "": "Custom provides the custom configuration of gatherers", + "configs": "configs is a required list of gatherers configurations that can be used to enable or disable specific gatherers. It may not exceed 100 items and each gatherer can be present only once. It is possible to disable an entire set of gatherers while allowing a specific function within that set. The particular gatherers IDs can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. Run the following command to get the names of last active gatherers: \"oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'\"", +} + +func (Custom) SwaggerDoc() map[string]string { + return map_Custom +} + +var map_GatherConfig = map[string]string{ + "": "GatherConfig provides data gathering configuration options.", + "dataPolicy": "dataPolicy is an optional list of DataPolicyOptions that allows user to enable additional obfuscation of the Insights archive data. It may not exceed 2 items and must not contain duplicates. Valid values are ObfuscateNetworking and WorkloadNames. When set to ObfuscateNetworking the IP addresses and the cluster domain name are obfuscated. When set to WorkloadNames, the gathered data about cluster resources will not contain the workload names for your deployments. Resources UIDs will be used instead. When omitted no obfuscation is applied.", + "gatherers": "gatherers is a required field that specifies the configuration of the gatherers.", + "storage": "storage is an optional field that allows user to define persistent storage for gathering jobs to store the Insights data archive. If omitted, the gathering job will use ephemeral storage.", +} + +func (GatherConfig) SwaggerDoc() map[string]string { + return map_GatherConfig +} + +var map_GathererConfig = map[string]string{ + "": "GathererConfig allows to configure specific gatherers", + "name": "name is the required name of a specific gatherer. It may not exceed 256 characters. The format for a gatherer name is: {gatherer}/{function} where the function is optional. Gatherer consists of a lowercase letters only that may include underscores (_). Function consists of a lowercase letters only that may include underscores (_) and is separated from the gatherer by a forward slash (/). The particular gatherers can be found at https://github.com/openshift/insights-operator/blob/master/docs/gathered-data.md. Run the following command to get the names of last active gatherers: \"oc get insightsoperators.operator.openshift.io cluster -o json | jq '.status.gatherStatus.gatherers[].name'\"", + "state": "state is a required field that allows you to configure specific gatherer. Valid values are \"Enabled\" and \"Disabled\". When set to Enabled the gatherer will run. When set to Disabled the gatherer will not run.", +} + +func (GathererConfig) SwaggerDoc() map[string]string { + return map_GathererConfig +} + +var map_Gatherers = map[string]string{ + "": "Gatherers specifies the configuration of the gatherers", + "mode": "mode is a required field that specifies the mode for gatherers. Allowed values are All, None, and Custom. When set to All, all gatherers will run and gather data. When set to None, all gatherers will be disabled and no data will be gathered. When set to Custom, the custom configuration from the custom field will be applied.", + "custom": "custom provides gathering configuration. It is required when mode is Custom, and forbidden otherwise. Custom configuration allows user to disable only a subset of gatherers. Gatherers that are not explicitly disabled in custom configuration will run.", +} + +func (Gatherers) SwaggerDoc() map[string]string { + return map_Gatherers +} + +var map_InsightsDataGather = map[string]string{ + "": "InsightsDataGather provides data gather configuration options for the Insights Operator.\n\n\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", +} + +func (InsightsDataGather) SwaggerDoc() map[string]string { + return map_InsightsDataGather +} + +var map_InsightsDataGatherList = map[string]string{ + "": "InsightsDataGatherList is a collection of items Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the required standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is the required list of InsightsDataGather objects it may not exceed 100 items", +} + +func (InsightsDataGatherList) SwaggerDoc() map[string]string { + return map_InsightsDataGatherList +} + +var map_InsightsDataGatherSpec = map[string]string{ + "": "InsightsDataGatherSpec contains the configuration for the data gathering.", + "gatherConfig": "gatherConfig is a required spec attribute that includes all the configuration options related to gathering of the Insights data and its uploading to the ingress.", +} + +func (InsightsDataGatherSpec) SwaggerDoc() map[string]string { + return map_InsightsDataGatherSpec +} + +var map_PersistentVolumeClaimReference = map[string]string{ + "": "PersistentVolumeClaimReference is a reference to a PersistentVolumeClaim.", + "name": "name is the name of the PersistentVolumeClaim that will be used to store the Insights data archive. It is a string that follows the DNS1123 subdomain format. It must be at most 253 characters in length, and must consist only of lower case alphanumeric characters, '-' and '.', and must start and end with an alphanumeric character.", +} + +func (PersistentVolumeClaimReference) SwaggerDoc() map[string]string { + return map_PersistentVolumeClaimReference +} + +var map_PersistentVolumeConfig = map[string]string{ + "": "PersistentVolumeConfig provides configuration options for PersistentVolume storage.", + "claim": "claim is a required field that specifies the configuration of the PersistentVolumeClaim that will be used to store the Insights data archive. The PersistentVolumeClaim must be created in the openshift-insights namespace.", + "mountPath": "mountPath is an optional field specifying the directory where the PVC will be mounted inside the Insights data gathering Pod. When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. The current default mount path is /var/lib/insights-operator The path may not exceed 1024 characters and must not contain a colon.", +} + +func (PersistentVolumeConfig) SwaggerDoc() map[string]string { + return map_PersistentVolumeConfig +} + +var map_Storage = map[string]string{ + "": "Storage provides persistent storage configuration options for gathering jobs. If the type is set to PersistentVolume, then the PersistentVolume must be defined. If the type is set to Ephemeral, then the PersistentVolume must not be defined.", + "type": "type is a required field that specifies the type of storage that will be used to store the Insights data archive. Valid values are \"PersistentVolume\" and \"Ephemeral\". When set to Ephemeral, the Insights data archive is stored in the ephemeral storage of the gathering job. When set to PersistentVolume, the Insights data archive is stored in the PersistentVolume that is defined by the persistentVolume field.", + "persistentVolume": "persistentVolume is an optional field that specifies the PersistentVolume that will be used to store the Insights data archive. The PersistentVolume must be created in the openshift-insights namespace.", +} + +func (Storage) SwaggerDoc() map[string]string { + return map_Storage +} + +var map_AWSKMSConfig = map[string]string{ + "": "AWSKMSConfig defines the KMS config specific to AWS KMS provider", + "keyARN": "keyARN specifies the Amazon Resource Name (ARN) of the AWS KMS key used for encryption. The value must adhere to the format `arn:aws:kms:::key/`, where: - `` is the AWS region consisting of lowercase letters and hyphens followed by a number. - `` is a 12-digit numeric identifier for the AWS account. - `` is a unique identifier for the KMS key, consisting of lowercase hexadecimal characters and hyphens.", + "region": "region specifies the AWS region where the KMS instance exists, and follows the format `--`, e.g.: `us-east-1`. Only lowercase letters and hyphens followed by numbers are allowed.", +} + +func (AWSKMSConfig) SwaggerDoc() map[string]string { + return map_AWSKMSConfig +} + +var map_KMSConfig = map[string]string{ + "": "KMSConfig defines the configuration for the KMS instance that will be used with KMSEncryptionProvider encryption", + "type": "type defines the kind of platform for the KMS provider. Available provider types are AWS only.", + "aws": "aws defines the key config for using an AWS KMS instance for the encryption. The AWS KMS instance is managed by the user outside the purview of the control plane.", +} + +func (KMSConfig) SwaggerDoc() map[string]string { + return map_KMSConfig +} + var map_ClusterNetworkEntry = map[string]string{ "": "ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs are allocated.", "cidr": "The complete block for pod IPs.", @@ -1088,19 +2345,80 @@ func (ExternalIPPolicy) SwaggerDoc() map[string]string { return map_ExternalIPPolicy } +var map_MTUMigration = map[string]string{ + "": "MTUMigration contains infomation about MTU migration.", + "network": "network contains MTU migration configuration for the default network.", + "machine": "machine contains MTU migration configuration for the machine's uplink.", +} + +func (MTUMigration) SwaggerDoc() map[string]string { + return map_MTUMigration +} + +var map_MTUMigrationValues = map[string]string{ + "": "MTUMigrationValues contains the values for a MTU migration.", + "to": "to is the MTU to migrate to.", + "from": "from is the MTU to migrate from.", +} + +func (MTUMigrationValues) SwaggerDoc() map[string]string { + return map_MTUMigrationValues +} + var map_Network = map[string]string{ - "": "Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. Please view network.spec for an explanation on what applies when configuring this resource.", - "spec": "spec holds user settable values for configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. Please view network.spec for an explanation on what applies when configuring this resource.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Network) SwaggerDoc() map[string]string { return map_Network } +var map_NetworkDiagnostics = map[string]string{ + "mode": "mode controls the network diagnostics mode\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is All.", + "sourcePlacement": "sourcePlacement controls the scheduling of network diagnostics source deployment\n\nSee NetworkDiagnosticsSourcePlacement for more details about default values.", + "targetPlacement": "targetPlacement controls the scheduling of network diagnostics target daemonset\n\nSee NetworkDiagnosticsTargetPlacement for more details about default values.", +} + +func (NetworkDiagnostics) SwaggerDoc() map[string]string { + return map_NetworkDiagnostics +} + +var map_NetworkDiagnosticsSourcePlacement = map[string]string{ + "": "NetworkDiagnosticsSourcePlacement defines node scheduling configuration network diagnostics source components", + "nodeSelector": "nodeSelector is the node selector applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is `kubernetes.io/os: linux`.", + "tolerations": "tolerations is a list of tolerations applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is an empty list.", +} + +func (NetworkDiagnosticsSourcePlacement) SwaggerDoc() map[string]string { + return map_NetworkDiagnosticsSourcePlacement +} + +var map_NetworkDiagnosticsTargetPlacement = map[string]string{ + "": "NetworkDiagnosticsTargetPlacement defines node scheduling configuration network diagnostics target components", + "nodeSelector": "nodeSelector is the node selector applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is `kubernetes.io/os: linux`.", + "tolerations": "tolerations is a list of tolerations applied to network diagnostics components\n\nWhen omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. The current default is `- operator: \"Exists\"` which means that all taints are tolerated.", +} + +func (NetworkDiagnosticsTargetPlacement) SwaggerDoc() map[string]string { + return map_NetworkDiagnosticsTargetPlacement +} + +var map_NetworkList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (NetworkList) SwaggerDoc() map[string]string { + return map_NetworkList +} + var map_NetworkMigration = map[string]string{ - "": "NetworkMigration represents the cluster network configuration.", - "networkType": "NetworkType is the target plugin that is to be deployed. Currently supported values are: OpenShiftSDN, OVNKubernetes", + "": "NetworkMigration represents the network migration status.", + "networkType": "networkType is the target plugin that is being deployed. DEPRECATED: network type migration is no longer supported, so this should always be unset.", + "mtu": "mtu is the MTU configuration that is being deployed.", } func (NetworkMigration) SwaggerDoc() map[string]string { @@ -1111,9 +2429,10 @@ var map_NetworkSpec = map[string]string{ "": "NetworkSpec is the desired network configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", "clusterNetwork": "IP address pool to use for pod IPs. This field is immutable after installation.", "serviceNetwork": "IP address pool for services. Currently, we only support a single entry here. This field is immutable after installation.", - "networkType": "NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). This should match a value that the cluster-network-operator understands, or else no networking will be installed. Currently supported values are: - OpenShiftSDN This field is immutable after installation.", + "networkType": "networkType is the plugin that is to be deployed (e.g. OVNKubernetes). This should match a value that the cluster-network-operator understands, or else no networking will be installed. Currently supported values are: - OVNKubernetes This field is immutable after installation.", "externalIP": "externalIP defines configuration for controllers that affect Service.ExternalIP. If nil, then ExternalIP is not allowed to be set.", "serviceNodePortRange": "The port range allowed for Services of type NodePort. If not specified, the default of 30000-32767 will be used. Such Services without a NodePort specified will have one automatically allocated from this range. This parameter can be updated after the cluster is installed.", + "networkDiagnostics": "networkDiagnostics defines network diagnostics configuration.\n\nTakes precedence over spec.disableNetworkDiagnostics in network.operator.openshift.io. If networkDiagnostics is not specified or is empty, and the spec.disableNetworkDiagnostics flag in network.operator.openshift.io is set to true, the network diagnostics feature will be disabled.", } func (NetworkSpec) SwaggerDoc() map[string]string { @@ -1124,15 +2443,54 @@ var map_NetworkStatus = map[string]string{ "": "NetworkStatus is the current network configuration.", "clusterNetwork": "IP address pool to use for pod IPs.", "serviceNetwork": "IP address pool for services. Currently, we only support a single entry here.", - "networkType": "NetworkType is the plugin that is deployed (e.g. OpenShiftSDN).", - "clusterNetworkMTU": "ClusterNetworkMTU is the MTU for inter-pod networking.", - "migration": "Migration contains the cluster network migration configuration.", + "networkType": "networkType is the plugin that is deployed (e.g. OVNKubernetes).", + "clusterNetworkMTU": "clusterNetworkMTU is the MTU for inter-pod networking.", + "migration": "migration contains the cluster network migration configuration.", + "conditions": "conditions represents the observations of a network.config current state. Known .status.conditions.type are: \"NetworkDiagnosticsAvailable\"", } func (NetworkStatus) SwaggerDoc() map[string]string { return map_NetworkStatus } +var map_Node = map[string]string{ + "": "Node holds cluster-wide information about node specific features.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values.", +} + +func (Node) SwaggerDoc() map[string]string { + return map_Node +} + +var map_NodeList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (NodeList) SwaggerDoc() map[string]string { + return map_NodeList +} + +var map_NodeSpec = map[string]string{ + "cgroupMode": "cgroupMode determines the cgroups version on the node", + "workerLatencyProfile": "workerLatencyProfile determins the how fast the kubelet is updating the status and corresponding reaction of the cluster", + "minimumKubeletVersion": "minimumKubeletVersion is the lowest version of a kubelet that can join the cluster. Specifically, the apiserver will deny most authorization requests of kubelets that are older than the specified version, only allowing the kubelet to get and update its node object, and perform subjectaccessreviews. This means any kubelet that attempts to join the cluster will not be able to run any assigned workloads, and will eventually be marked as not ready. Its max length is 8, so maximum version allowed is either \"9.999.99\" or \"99.99.99\". Since the kubelet reports the version of the kubernetes release, not Openshift, this field references the underlying kubernetes version this version of Openshift is based off of. In other words: if an admin wishes to ensure no nodes run an older version than Openshift 4.17, then they should set the minimumKubeletVersion to 1.30.0. When comparing versions, the kubelet's version is stripped of any contents outside of major.minor.patch version. Thus, a kubelet with version \"1.0.0-ec.0\" will be compatible with minimumKubeletVersion \"1.0.0\" or earlier.", +} + +func (NodeSpec) SwaggerDoc() map[string]string { + return map_NodeSpec +} + +var map_NodeStatus = map[string]string{ + "conditions": "conditions contain the details and the current state of the nodes.config object", +} + +func (NodeStatus) SwaggerDoc() map[string]string { + return map_NodeStatus +} + var map_BasicAuthIdentityProvider = map[string]string{ "": "BasicAuthPasswordIdentityProvider provides identities for users authenticating using HTTP basic auth credentials", } @@ -1251,15 +2609,25 @@ func (LDAPIdentityProvider) SwaggerDoc() map[string]string { } var map_OAuth = map[string]string{ - "": "OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. It is used to configure the integrated OAuth server. This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. It is used to configure the integrated OAuth server. This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (OAuth) SwaggerDoc() map[string]string { return map_OAuth } +var map_OAuthList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (OAuthList) SwaggerDoc() map[string]string { + return map_OAuthList +} + var map_OAuthRemoteConnectionInfo = map[string]string{ "": "OAuthRemoteConnectionInfo holds information necessary for establishing a remote connection", "url": "url is the remote URL to connect to", @@ -1307,6 +2675,7 @@ var map_OpenIDClaims = map[string]string{ "preferredUsername": "preferredUsername is the list of claims whose values should be used as the preferred username. If unspecified, the preferred username is determined from the value of the sub claim", "name": "name is the list of claims whose values should be used as the display name. Optional. If unspecified, no display name is set for the identity", "email": "email is the list of claims whose values should be used as the email address. Optional. If unspecified, no email is set for the identity", + "groups": "groups is the list of claims value of which should be used to synchronize groups from the OIDC provider to OpenShift for the user. If multiple claims are specified, the first one with a non-empty value is used.", } func (OpenIDClaims) SwaggerDoc() map[string]string { @@ -1348,7 +2717,7 @@ var map_TokenConfig = map[string]string{ "": "TokenConfig holds the necessary configuration options for authorization and access tokens", "accessTokenMaxAgeSeconds": "accessTokenMaxAgeSeconds defines the maximum age of access tokens", "accessTokenInactivityTimeoutSeconds": "accessTokenInactivityTimeoutSeconds - DEPRECATED: setting this field has no effect.", - "accessTokenInactivityTimeout": "accessTokenInactivityTimeout defines the token inactivity timeout for tokens granted by any client. The value represents the maximum amount of time that can occur between consecutive uses of the token. Tokens become invalid if they are not used within this temporal window. The user will need to acquire a new token to regain access once a token times out. Takes valid time duration string such as \"5m\", \"1.5h\" or \"2h45m\". The minimum allowed value for duration is 300s (5 minutes). If the timeout is configured per client, then that value takes precedence. If the timeout value is not specified and the client does not override the value, then tokens are valid until their lifetime.", + "accessTokenInactivityTimeout": "accessTokenInactivityTimeout defines the token inactivity timeout for tokens granted by any client. The value represents the maximum amount of time that can occur between consecutive uses of the token. Tokens become invalid if they are not used within this temporal window. The user will need to acquire a new token to regain access once a token times out. Takes valid time duration string such as \"5m\", \"1.5h\" or \"2h45m\". The minimum allowed value for duration is 300s (5 minutes). If the timeout is configured per client, then that value takes precedence. If the timeout value is not specified and the client does not override the value, then tokens are valid until their lifetime.\n\nWARNING: existing tokens' timeout will not be affected (lowered) by changing this value", } func (TokenConfig) SwaggerDoc() map[string]string { @@ -1376,7 +2745,8 @@ func (HubSourceStatus) SwaggerDoc() map[string]string { } var map_OperatorHub = map[string]string{ - "": "OperatorHub is the Schema for the operatorhubs API. It can be used to change the state of the default hub sources for OperatorHub on the cluster from enabled to disabled and vice versa.", + "": "OperatorHub is the Schema for the operatorhubs API. It can be used to change the state of the default hub sources for OperatorHub on the cluster from enabled to disabled and vice versa.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (OperatorHub) SwaggerDoc() map[string]string { @@ -1384,7 +2754,8 @@ func (OperatorHub) SwaggerDoc() map[string]string { } var map_OperatorHubList = map[string]string{ - "": "OperatorHubList contains a list of OperatorHub", + "": "OperatorHubList contains a list of OperatorHub\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", } func (OperatorHubList) SwaggerDoc() map[string]string { @@ -1411,15 +2782,25 @@ func (OperatorHubStatus) SwaggerDoc() map[string]string { } var map_Project = map[string]string{ - "": "Project holds cluster-wide information about Project. The canonical name is `cluster`", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Project holds cluster-wide information about Project. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Project) SwaggerDoc() map[string]string { return map_Project } +var map_ProjectList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ProjectList) SwaggerDoc() map[string]string { + return map_ProjectList +} + var map_ProjectSpec = map[string]string{ "": "ProjectSpec holds the project creation configuration.", "projectRequestMessage": "projectRequestMessage is the string presented to a user if they are unable to request a project via the projectrequest api endpoint", @@ -1440,20 +2821,30 @@ func (TemplateReference) SwaggerDoc() map[string]string { } var map_Proxy = map[string]string{ - "": "Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster`", - "spec": "Spec holds user-settable values for the proxy configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user-settable values for the proxy configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Proxy) SwaggerDoc() map[string]string { return map_Proxy } +var map_ProxyList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ProxyList) SwaggerDoc() map[string]string { + return map_ProxyList +} + var map_ProxySpec = map[string]string{ "": "ProxySpec contains cluster proxy creation configuration.", "httpProxy": "httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var.", "httpsProxy": "httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var.", - "noProxy": "noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used. Empty means unset and will not result in an env var.", + "noProxy": "noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. Empty means unset and will not result in an env var.", "readinessEndpoints": "readinessEndpoints is a list of endpoints used to verify readiness of the proxy.", "trustedCA": "trustedCA is a reference to a ConfigMap containing a CA certificate bundle. The trustedCA field should only be consumed by a proxy validator. The validator is responsible for reading the certificate bundle from the required key \"ca-bundle.crt\", merging it with the system default trust bundle, and writing the merged trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" namespace. Clients that expect to make proxy connections must use the trusted-ca-bundle for all HTTPS requests to the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as well.\n\nThe namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". Here is an example ConfigMap (in yaml):\n\napiVersion: v1 kind: ConfigMap metadata:\n name: user-ca-bundle\n namespace: openshift-config\n data:\n ca-bundle.crt: |", } @@ -1473,27 +2864,82 @@ func (ProxyStatus) SwaggerDoc() map[string]string { return map_ProxyStatus } +var map_ProfileCustomizations = map[string]string{ + "": "ProfileCustomizations contains various parameters for modifying the default behavior of certain profiles", + "dynamicResourceAllocation": "dynamicResourceAllocation allows to enable or disable dynamic resource allocation within the scheduler. Dynamic resource allocation is an API for requesting and sharing resources between pods and containers inside a pod. Third-party resource drivers are responsible for tracking and allocating resources. Different kinds of resources support arbitrary parameters for defining requirements and initialization. Valid values are Enabled, Disabled and omitted. When omitted, this means no opinion and the platform is left to choose a reasonable default, which is subject to change over time. The current default is Disabled.", +} + +func (ProfileCustomizations) SwaggerDoc() map[string]string { + return map_ProfileCustomizations +} + var map_Scheduler = map[string]string{ - "": "Scheduler holds cluster-wide config information to run the Kubernetes Scheduler and influence its placement decisions. The canonical name for this config is `cluster`.", - "spec": "spec holds user settable values for configuration", - "status": "status holds observed values from the cluster. They may not be overridden.", + "": "Scheduler holds cluster-wide config information to run the Kubernetes Scheduler and influence its placement decisions. The canonical name for this config is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", } func (Scheduler) SwaggerDoc() map[string]string { return map_Scheduler } +var map_SchedulerList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (SchedulerList) SwaggerDoc() map[string]string { + return map_SchedulerList +} + var map_SchedulerSpec = map[string]string{ - "policy": "DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. policy is a reference to a ConfigMap containing scheduler policy which has user specified predicates and priorities. If this ConfigMap is not available scheduler will default to use DefaultAlgorithmProvider. The namespace for this configmap is openshift-config.", - "profile": "profile sets which scheduling profile should be set in order to configure scheduling decisions for new pods.\n\nValid values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" Defaults to \"LowNodeUtilization\"", - "defaultNodeSelector": "defaultNodeSelector helps set the cluster-wide default node selector to restrict pod placement to specific nodes. This is applied to the pods created in all namespaces and creates an intersection with any existing nodeSelectors already set on a pod, additionally constraining that pod's selector. For example, defaultNodeSelector: \"type=user-node,region=east\" would set nodeSelector field in pod spec to \"type=user-node,region=east\" to all pods created in all namespaces. Namespaces having project-wide node selectors won't be impacted even if this field is set. This adds an annotation section to the namespace. For example, if a new namespace is created with node-selector='type=user-node,region=east', the annotation openshift.io/node-selector: type=user-node,region=east gets added to the project. When the openshift.io/node-selector annotation is set on the project the value is used in preference to the value we are setting for defaultNodeSelector field. For instance, openshift.io/node-selector: \"type=user-node,region=west\" means that the default of \"type=user-node,region=east\" set in defaultNodeSelector would not be applied.", - "mastersSchedulable": "MastersSchedulable allows masters nodes to be schedulable. When this flag is turned on, all the master nodes in the cluster will be made schedulable, so that workload pods can run on them. The default value for this field is false, meaning none of the master nodes are schedulable. Important Note: Once the workload pods start running on the master nodes, extreme care must be taken to ensure that cluster-critical control plane components are not impacted. Please turn on this field after doing due diligence.", + "policy": "DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. policy is a reference to a ConfigMap containing scheduler policy which has user specified predicates and priorities. If this ConfigMap is not available scheduler will default to use DefaultAlgorithmProvider. The namespace for this configmap is openshift-config.", + "profile": "profile sets which scheduling profile should be set in order to configure scheduling decisions for new pods.\n\nValid values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" Defaults to \"LowNodeUtilization\"", + "profileCustomizations": "profileCustomizations contains configuration for modifying the default behavior of existing scheduler profiles.", + "defaultNodeSelector": "defaultNodeSelector helps set the cluster-wide default node selector to restrict pod placement to specific nodes. This is applied to the pods created in all namespaces and creates an intersection with any existing nodeSelectors already set on a pod, additionally constraining that pod's selector. For example, defaultNodeSelector: \"type=user-node,region=east\" would set nodeSelector field in pod spec to \"type=user-node,region=east\" to all pods created in all namespaces. Namespaces having project-wide node selectors won't be impacted even if this field is set. This adds an annotation section to the namespace. For example, if a new namespace is created with node-selector='type=user-node,region=east', the annotation openshift.io/node-selector: type=user-node,region=east gets added to the project. When the openshift.io/node-selector annotation is set on the project the value is used in preference to the value we are setting for defaultNodeSelector field. For instance, openshift.io/node-selector: \"type=user-node,region=west\" means that the default of \"type=user-node,region=east\" set in defaultNodeSelector would not be applied.", + "mastersSchedulable": "mastersSchedulable allows masters nodes to be schedulable. When this flag is turned on, all the master nodes in the cluster will be made schedulable, so that workload pods can run on them. The default value for this field is false, meaning none of the master nodes are schedulable. Important Note: Once the workload pods start running on the master nodes, extreme care must be taken to ensure that cluster-critical control plane components are not impacted. Please turn on this field after doing due diligence.", } func (SchedulerSpec) SwaggerDoc() map[string]string { return map_SchedulerSpec } +var map_FeatureGateTests = map[string]string{ + "featureGate": "featureGate is the name of the FeatureGate as it appears in The FeatureGate CR instance.", + "tests": "tests contains an item for every TestName", +} + +func (FeatureGateTests) SwaggerDoc() map[string]string { + return map_FeatureGateTests +} + +var map_TestDetails = map[string]string{ + "testName": "testName is the name of the test as it appears in junit XMLs. It does not include the suite name since the same test can be executed in many suites.", +} + +func (TestDetails) SwaggerDoc() map[string]string { + return map_TestDetails +} + +var map_TestReporting = map[string]string{ + "": "TestReporting is used for origin (and potentially others) to report the test names for a given FeatureGate into the payload for later analysis on a per-payload basis. This doesn't need any CRD because it's never stored in the cluster.\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (TestReporting) SwaggerDoc() map[string]string { + return map_TestReporting +} + +var map_TestReportingSpec = map[string]string{ + "testsForFeatureGates": "testsForFeatureGates is a list, indexed by FeatureGate and includes information about testing.", +} + +func (TestReportingSpec) SwaggerDoc() map[string]string { + return map_TestReportingSpec +} + var map_CustomTLSProfile = map[string]string{ "": "CustomTLSProfile is a user-defined TLS security profile. Be extremely careful using a custom TLS profile as invalid configurations can be catastrophic.", } @@ -1529,7 +2975,7 @@ func (OldTLSProfile) SwaggerDoc() map[string]string { var map_TLSProfileSpec = map[string]string{ "": "TLSProfileSpec is the desired behavior of a TLSSecurityProfile.", "ciphers": "ciphers is used to specify the cipher algorithms that are negotiated during the TLS handshake. Operators may remove entries their operands do not support. For example, to use DES-CBC3-SHA (yaml):\n\n ciphers:\n - DES-CBC3-SHA", - "minTLSVersion": "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml):\n\n minTLSVersion: TLSv1.1\n\nNOTE: currently the highest minTLSVersion allowed is VersionTLS12", + "minTLSVersion": "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml):\n\n minTLSVersion: VersionTLS11\n\nNOTE: currently the highest minTLSVersion allowed is VersionTLS12", } func (TLSProfileSpec) SwaggerDoc() map[string]string { @@ -1539,10 +2985,10 @@ func (TLSProfileSpec) SwaggerDoc() map[string]string { var map_TLSSecurityProfile = map[string]string{ "": "TLSSecurityProfile defines the schema for a TLS security profile. This object is used by operators to apply TLS security settings to operands.", "type": "type is one of Old, Intermediate, Modern or Custom. Custom provides the ability to specify individual TLS security profile parameters. Old, Intermediate and Modern are TLS security profiles based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations\n\nThe profiles are intent based, so they may change over time as new ciphers are developed and existing ciphers are found to be insecure. Depending on precisely which ciphers are available to a process, the list may be reduced.\n\nNote that the Modern profile is currently not supported because it is not yet well adopted by common software libraries.", - "old": "old is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES256-GCM-SHA384\n - ECDHE-RSA-AES256-GCM-SHA384\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - DHE-RSA-AES128-GCM-SHA256\n - DHE-RSA-AES256-GCM-SHA384\n - DHE-RSA-CHACHA20-POLY1305\n - ECDHE-ECDSA-AES128-SHA256\n - ECDHE-RSA-AES128-SHA256\n - ECDHE-ECDSA-AES128-SHA\n - ECDHE-RSA-AES128-SHA\n - ECDHE-ECDSA-AES256-SHA384\n - ECDHE-RSA-AES256-SHA384\n - ECDHE-ECDSA-AES256-SHA\n - ECDHE-RSA-AES256-SHA\n - DHE-RSA-AES128-SHA256\n - DHE-RSA-AES256-SHA256\n - AES128-GCM-SHA256\n - AES256-GCM-SHA384\n - AES128-SHA256\n - AES256-SHA256\n - AES128-SHA\n - AES256-SHA\n - DES-CBC3-SHA\n minTLSVersion: TLSv1.0", - "intermediate": "intermediate is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES256-GCM-SHA384\n - ECDHE-RSA-AES256-GCM-SHA384\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - DHE-RSA-AES128-GCM-SHA256\n - DHE-RSA-AES256-GCM-SHA384\n minTLSVersion: TLSv1.2", - "modern": "modern is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n minTLSVersion: TLSv1.3\n\nNOTE: Currently unsupported.", - "custom": "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this:\n\n ciphers:\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n minTLSVersion: TLSv1.1", + "old": "old is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n\n - TLS_AES_128_GCM_SHA256\n\n - TLS_AES_256_GCM_SHA384\n\n - TLS_CHACHA20_POLY1305_SHA256\n\n - ECDHE-ECDSA-AES128-GCM-SHA256\n\n - ECDHE-RSA-AES128-GCM-SHA256\n\n - ECDHE-ECDSA-AES256-GCM-SHA384\n\n - ECDHE-RSA-AES256-GCM-SHA384\n\n - ECDHE-ECDSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-CHACHA20-POLY1305\n\n - DHE-RSA-AES128-GCM-SHA256\n\n - DHE-RSA-AES256-GCM-SHA384\n\n - DHE-RSA-CHACHA20-POLY1305\n\n - ECDHE-ECDSA-AES128-SHA256\n\n - ECDHE-RSA-AES128-SHA256\n\n - ECDHE-ECDSA-AES128-SHA\n\n - ECDHE-RSA-AES128-SHA\n\n - ECDHE-ECDSA-AES256-SHA384\n\n - ECDHE-RSA-AES256-SHA384\n\n - ECDHE-ECDSA-AES256-SHA\n\n - ECDHE-RSA-AES256-SHA\n\n - DHE-RSA-AES128-SHA256\n\n - DHE-RSA-AES256-SHA256\n\n - AES128-GCM-SHA256\n\n - AES256-GCM-SHA384\n\n - AES128-SHA256\n\n - AES256-SHA256\n\n - AES128-SHA\n\n - AES256-SHA\n\n - DES-CBC3-SHA\n\n minTLSVersion: VersionTLS10", + "intermediate": "intermediate is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29\n\nand looks like this (yaml):\n\n ciphers:\n\n - TLS_AES_128_GCM_SHA256\n\n - TLS_AES_256_GCM_SHA384\n\n - TLS_CHACHA20_POLY1305_SHA256\n\n - ECDHE-ECDSA-AES128-GCM-SHA256\n\n - ECDHE-RSA-AES128-GCM-SHA256\n\n - ECDHE-ECDSA-AES256-GCM-SHA384\n\n - ECDHE-RSA-AES256-GCM-SHA384\n\n - ECDHE-ECDSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-CHACHA20-POLY1305\n\n - DHE-RSA-AES128-GCM-SHA256\n\n - DHE-RSA-AES256-GCM-SHA384\n\n minTLSVersion: VersionTLS12", + "modern": "modern is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n\n - TLS_AES_128_GCM_SHA256\n\n - TLS_AES_256_GCM_SHA384\n\n - TLS_CHACHA20_POLY1305_SHA256\n\n minTLSVersion: VersionTLS13", + "custom": "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this:\n\n ciphers:\n\n - ECDHE-ECDSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-CHACHA20-POLY1305\n\n - ECDHE-RSA-AES128-GCM-SHA256\n\n - ECDHE-ECDSA-AES128-GCM-SHA256\n\n minTLSVersion: VersionTLS11", } func (TLSSecurityProfile) SwaggerDoc() map[string]string { diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml index f8924f9af4..2b10463bac 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml @@ -631,8 +631,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml index 20bb1a0394..b957a9badb 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -1382,8 +1382,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -1767,7 +1767,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1822,6 +1824,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1872,8 +1910,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -1900,7 +1938,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -2544,7 +2584,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -2597,10 +2637,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -2612,6 +2652,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -3213,7 +3304,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -3268,6 +3361,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -3318,8 +3447,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -3346,7 +3475,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -3969,7 +4100,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -4023,9 +4154,51 @@ spec: description: |- Restart policy for the container to manage the restart behavior of each container within a pod. - This may only be set for init containers. You cannot set this field on - ephemeral containers. + You cannot set this field on ephemeral containers. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. You cannot set this field on + ephemeral containers. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- Optional: SecurityContext defines the security options the ephemeral container should be run with. @@ -4541,7 +4714,9 @@ spec: hostNetwork: description: |- Host networking requested for this pod. Use the host's network namespace. - If this option is set, the ports that will be used must be specified. + When using HostNetwork you should specify ports so the scheduler is aware. + When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false. type: boolean hostPID: @@ -4566,6 +4741,19 @@ spec: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. type: string + hostnameOverride: + description: |- + HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + This field only specifies the pod's hostname and does not affect its DNS records. + When this field is set to a non-empty string: + - It takes precedence over the values set in `hostname` and `subdomain`. + - The Pod's hostname will be set to this value. + - `setHostnameAsFQDN` must be nil or set to false. + - `hostNetwork` must be set to false. + + This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + Requires the HostnameOverride feature gate to be enabled. + type: string imagePullSecrets: description: |- ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. @@ -4653,7 +4841,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -4708,6 +4898,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -4758,8 +4984,8 @@ spec: envFrom: description: |- List of sources to populate environment variables in the container. - The keys defined within a source must be a C_IDENTIFIER. All invalid keys - will be reported as an event when the container is starting. When a key exists in multiple + The keys defined within a source may consist of any printable ASCII characters except '='. + When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. @@ -4786,7 +5012,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -5430,7 +5658,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -5483,10 +5711,10 @@ spec: restartPolicy: description: |- RestartPolicy defines the restart behavior of individual containers in a pod. - This field may only be set for init containers, and the only allowed value is "Always". - For non-init containers or when this field is not specified, + This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. - Setting the RestartPolicy as "Always" for the init container will have the following effect: + Additionally, setting the RestartPolicy as "Always" for the init container will + have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy "Always" @@ -5498,6 +5726,57 @@ spec: init container is started, or after any startupProbe has successfully completed. type: string + restartPolicyRules: + description: |- + Represents a list of rules to be checked to determine if the + container should be restarted on exit. The rules are evaluated in + order. Once a rule matches a container exit condition, the remaining + rules are ignored. If no rule matches the container exit condition, + the Container-level restart policy determines the whether the container + is restarted or not. Constraints on the rules: + - At most 20 rules are allowed. + - Rules can have the same action. + - Identical rules are not forbidden in validations. + When rules are specified, container MUST set RestartPolicy explicitly + even it if matches the Pod's RestartPolicy. + type: array + items: + description: ContainerRestartRule describes how a container exit is handled. + type: object + required: + - action + properties: + action: + description: |- + Specifies the action taken on a container exit if the requirements + are satisfied. The only possible value is "Restart" to restart the + container. + type: string + exitCodes: + description: Represents the exit codes to check on container exits. + type: object + required: + - operator + properties: + operator: + description: |- + Represents the relationship between the container exit code(s) and the + specified values. Possible values are: + - In: the requirement is satisfied if the container exit code is in the + set of specified values. + - NotIn: the requirement is satisfied if the container exit code is + not in the set of specified values. + type: string + values: + description: |- + Specifies the set of values to check for container exit codes. + At most 255 elements are allowed. + type: array + items: + type: integer + format: int32 + x-kubernetes-list-type: set + x-kubernetes-list-type: atomic securityContext: description: |- SecurityContext defines the security options the container should be run with. @@ -6007,6 +6286,7 @@ spec: - spec.hostPID - spec.hostIPC - spec.hostUsers + - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile @@ -6158,7 +6438,7 @@ spec: description: |- Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for - "cpu" and "memory" resource names only. ResourceClaims are not supported. + "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. This field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod. @@ -6172,7 +6452,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -7406,15 +7686,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -7583,16 +7861,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -7667,7 +7942,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -8060,6 +8335,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -8186,7 +8565,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml index c388b9181e..10f465665c 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml @@ -618,8 +618,8 @@ spec: most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), - compute a sum by iterating through the elements of this field and adding - "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + compute a sum by iterating through the elements of this field and subtracting + "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. type: array items: @@ -968,7 +968,9 @@ spec: - name properties: name: - description: Name of the environment variable. Must be a C_IDENTIFIER. + description: |- + Name of the environment variable. + May consist of any printable ASCII characters except '='. type: string value: description: |- @@ -1023,6 +1025,42 @@ spec: description: Path of the field to select in the specified API version. type: string x-kubernetes-map-type: atomic + fileKeyRef: + description: |- + FileKeyRef selects a key of the env file. + Requires the EnvFiles feature gate to be enabled. + type: object + required: + - key + - path + - volumeName + properties: + key: + description: |- + The key within the env file. An invalid key will prevent the pod from starting. + The keys defined within a source may consist of any printable ASCII characters except '='. + During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + type: string + optional: + description: |- + Specify whether the file or its key must be defined. If the file or key + does not exist, then the env var is not published. + If optional is set to true and the specified key does not exist, + the environment variable will not be set in the Pod's containers. + + If optional is set to false and the specified key does not exist, + an error will be returned during Pod creation. + type: boolean + default: false + path: + description: |- + The path within the volume from which to select the file. + Must be relative and may not contain the '..' path or start with '..'. + type: string + volumeName: + description: The name of the volume mount containing the env file. + type: string + x-kubernetes-map-type: atomic resourceFieldRef: description: |- Selects a resource of the container: only resources limits and requests @@ -1098,7 +1136,9 @@ spec: type: boolean x-kubernetes-map-type: atomic prefix: - description: Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + description: |- + Optional text to prepend to the name of each environment variable. + May consist of any printable ASCII characters except '='. type: string secretRef: description: The Secret to select from @@ -1137,7 +1177,7 @@ spec: Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. - This is an alpha field and requires enabling the + This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. @@ -1987,15 +2027,13 @@ spec: volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - will be set by the persistentvolume controller if it exists. + it can be changed after the claim is created. An empty string or nil value indicates that no + VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). type: string volumeMode: description: |- @@ -2164,16 +2202,13 @@ spec: description: |- glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - More info: https://examples.k8s.io/volumes/glusterfs/README.md type: object required: - endpoints - path properties: endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod + description: endpoints is the endpoint name that details Glusterfs topology. type: string path: description: |- @@ -2248,7 +2283,7 @@ spec: description: |- iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. - More info: https://examples.k8s.io/volumes/iscsi/README.md + More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi type: object required: - iqn @@ -2641,6 +2676,110 @@ spec: type: string x-kubernetes-map-type: atomic x-kubernetes-list-type: atomic + podCertificate: + description: |- + Projects an auto-rotating credential bundle (private key and certificate + chain) that the pod can use either as a TLS client or server. + + Kubelet generates a private key and uses it to send a + PodCertificateRequest to the named signer. Once the signer approves the + request and issues a certificate chain, Kubelet writes the key and + certificate chain to the pod filesystem. The pod does not start until + certificates have been issued for each podCertificate projected volume + source in its spec. + + Kubelet will begin trying to rotate the certificate at the time indicated + by the signer using the PodCertificateRequest.Status.BeginRefreshAt + timestamp. + + Kubelet can write a single file, indicated by the credentialBundlePath + field, or separate files, indicated by the keyPath and + certificateChainPath fields. + + The credential bundle is a single file in PEM format. The first PEM + entry is the private key (in PKCS#8 format), and the remaining PEM + entries are the certificate chain issued by the signer (typically, + signers will return their certificate chain in leaf-to-root order). + + Prefer using the credential bundle format, since your application code + can read it atomically. If you use keyPath and certificateChainPath, + your application must make two separate file reads. If these coincide + with a certificate rotation, it is possible that the private key and leaf + certificate you read may not correspond to each other. Your application + will need to check for this condition, and re-read until they are + consistent. + + The named signer controls chooses the format of the certificate it + issues; consult the signer implementation's documentation to learn how to + use the certificates it issues. + type: object + required: + - keyType + - signerName + properties: + certificateChainPath: + description: |- + Write the certificate chain at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + credentialBundlePath: + description: |- + Write the credential bundle at this path in the projected volume. + + The credential bundle is a single file that contains multiple PEM blocks. + The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + key. + + The remaining blocks are CERTIFICATE blocks, containing the issued + certificate chain from the signer (leaf and any intermediates). + + Using credentialBundlePath lets your Pod's application code make a single + atomic read that retrieves a consistent key and certificate chain. If you + project them to separate files, your application code will need to + additionally check that the leaf certificate was issued to the key. + type: string + keyPath: + description: |- + Write the key at this path in the projected volume. + + Most applications should use credentialBundlePath. When using keyPath + and certificateChainPath, your application needs to check that the key + and leaf certificate are consistent, because it is possible to read the + files mid-rotation. + type: string + keyType: + description: |- + The type of keypair Kubelet will generate for the pod. + + Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + "ECDSAP521", and "ED25519". + type: string + maxExpirationSeconds: + description: |- + maxExpirationSeconds is the maximum lifetime permitted for the + certificate. + + Kubelet copies this value verbatim into the PodCertificateRequests it + generates for this projection. + + If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + will reject values shorter than 3600 (1 hour). The maximum allowable + value is 7862400 (91 days). + + The signer implementation is then free to issue a certificate with any + lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + seconds (1 hour). This constraint is enforced by kube-apiserver. + `kubernetes.io` signers will never issue certificates with a lifetime + longer than 24 hours. + type: integer + format: int32 + signerName: + description: Kubelet's generated CSRs will be addressed to this signer. + type: string secret: description: secret information about the secret data to project type: object @@ -2767,7 +2906,6 @@ spec: description: |- rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - More info: https://examples.k8s.io/volumes/rbd/README.md type: object required: - image diff --git a/vendor/github.com/operator-framework/api/crds/zz_defs.go b/vendor/github.com/operator-framework/api/crds/zz_defs.go index 50b1b0352a..06bb23be58 100644 --- a/vendor/github.com/operator-framework/api/crds/zz_defs.go +++ b/vendor/github.com/operator-framework/api/crds/zz_defs.go @@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x70\x17\x52\xbd\x85\xbb\x90\xc2\x5d\x48\xe1\x2e\x24\xdb\xc2\x5d\x48\xe1\x2e\xa4\x50\xc3\x2f\xd4\xf0\x0b\x35\xfc\xfa\x7f\x15\x6a\xf8\x35\xb7\x50\xc3\x6f\x48\x0b\x35\xfc\x7a\x8f\x1e\x6a\xf8\x85\x1a\x7e\xc3\x06\x0e\x35\xfc\x48\xa8\xe1\x17\x6a\xf8\x7d\xc1\x35\xfc\xc2\x5d\x48\x5f\xc4\x85\x20\xe1\x36\x90\x01\x63\x7f\x5e\xb7\x81\x84\xbb\x90\x5a\x07\x09\x77\x21\x05\xd6\x17\xee\x42\xfa\xdd\x72\xbf\x70\x17\x52\x8f\x41\xc2\x5d\x48\xe1\x2e\xa4\xd6\x16\xee\x42\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\xbb\x90\xc2\x5d\x48\xe1\x2e\xa4\x62\xe4\x70\x17\x52\xb8\x0b\x09\x5b\xb8\x0b\xa9\xc7\x08\xe1\x2e\xa4\x2f\xf5\x2e\xa4\x5a\x3e\xd0\x97\x7b\x21\xd2\xf0\x65\x84\x5b\x91\xc2\xad\x48\x0d\x2d\xdc\x8a\x14\x6e\x45\xda\xd5\xc2\xad\x48\xe1\x56\xa4\x96\x16\x2a\x20\xf6\x6c\xa1\x02\x62\xdf\x16\x2a\x20\x36\xb5\x50\x01\x71\xb3\x85\x0a\x88\xa1\x02\x62\xa8\x80\x18\x2a\x20\x6e\x0f\x18\x2a\x20\x86\x0a\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\xa8\x80\x18\x6e\x45\xfa\x2c\xaf\x14\x09\xf7\x89\x74\xb4\xcf\xe7\x3e\x91\x70\x2b\x52\xad\xf3\x70\x2b\x52\x60\x61\xe1\x56\xa4\x2f\x8e\x8b\x85\x5b\x91\x76\x74\x1e\x6e\x45\x0a\xb7\x22\x85\x5b\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\xb7\x22\x85\x5b\x91\xc2\xad\x48\xd8\xc2\xad\x48\xe1\x56\xa4\x70\x2b\xd2\xce\x8f\xe1\x5a\x4b\x1a\xe9\x63\xc1\x35\xf0\xc6\x9c\x9b\xbe\xe8\xfc\xb2\xd6\x9b\x39\x5d\x17\x6c\x99\x4b\xa7\xf7\x2f\xdf\x9f\x1e\x93\x88\x6a\x9a\x88\x25\x39\x15\xb1\x35\x2d\xe3\x17\xc5\xcf\x29\x68\x1a\x53\x4d\x0b\xaf\x84\xd1\x8f\x2f\x59\x8c\x4c\x35\x86\x6b\xc2\x52\xba\x04\xc3\xbc\x1a\x27\x91\x2b\x20\x94\x5c\x41\x92\x4c\x2f\xb8\xb8\xe2\xe4\x12\xa4\xaa\xb0\xeb\x4f\x22\x4b\x3f\x11\x05\xf2\xd2\xde\x2c\x04\xd7\x99\x41\x34\xa6\xed\xb9\xef\x67\x52\x1d\xae\x0c\x52\x3f\xb6\x4f\xcf\x30\xa8\xb7\xed\x92\x9e\x62\xed\xb8\x4c\x33\xa7\xa7\x46\xb0\x7f\x6a\x88\x3a\x57\x3e\xa2\x7e\xc1\x12\x98\xce\xa9\x82\xd8\x8f\xab\x0c\xad\x09\x19\xdb\xb9\xe5\x9a\x25\xec\x57\x70\xa7\x09\x50\x9d\xcb\xc6\x3c\x89\x1e\x02\x47\xb7\x21\x64\xea\xe7\xf1\x82\x35\x19\x31\xfa\x18\x2c\x22\x1a\xad\xe0\x05\x6b\x55\xe1\x6b\x48\x75\xec\x3e\xf0\x26\x89\x3d\x91\x59\x39\x68\x9f\xc4\x4c\x22\x13\x5a\x13\xa5\x85\xf4\x90\xcb\x24\x4c\x23\x9a\x44\x79\x82\x2c\xe7\xe8\xf4\xc4\x0e\xda\x7d\x5d\x56\x07\x29\x95\xeb\x1f\x30\x79\xff\x89\x9f\xfe\xee\x39\x6f\xef\x36\x0a\xa0\x68\x8f\xbc\xc9\xb4\x53\x48\x85\x5c\x9f\x53\xb9\x84\x1b\x93\xf0\x9b\x4a\x5f\x9b\x04\xfc\x87\x57\xef\xde\xbc\x7c\xf3\xfa\xe4\xcd\xc9\xb9\xe3\xcb\xde\x19\xb6\x49\xda\x4e\x6d\xb5\x16\x46\xb1\xd0\x6e\x8a\x24\x61\x29\xd3\xc5\x57\x96\x06\x9b\x55\x66\xcb\xb7\x31\x81\x2e\xe7\x9a\xa5\x60\x3d\x5f\x54\x6b\x23\xd2\x18\xfa\x48\x01\x34\xde\xcf\x95\xd2\x0b\x30\xcc\x95\x2c\x73\x2a\x29\xd7\xe0\x8f\x02\xa6\xed\x47\xb1\x20\x4a\x38\x45\x9e\xa9\xd2\x4b\xa6\x40\xdb\xb4\xa1\x53\xd1\xcc\x52\xb0\x87\x15\xbd\xb4\x17\x28\x2d\x84\xe1\xdf\x66\x53\x53\x11\xb3\x05\x8b\xac\x65\x88\xa4\x34\x2e\x52\x5d\x9c\x62\x01\xb2\x38\xfe\xca\x05\xb7\x51\xdf\x26\x98\x81\x5f\x32\x29\x38\x2a\x4c\x97\x54\x32\x3a\x4f\xa0\xf0\xff\x29\xd0\x76\xbc\x72\x41\x9c\xcc\xd7\x1a\x9a\xd9\x92\x1d\xc1\xed\x86\xbb\x79\xab\xb9\xbf\x47\x8d\xfd\x9c\x97\x39\x69\xa5\xb0\x62\xbe\x67\x2e\x59\x21\x06\xc5\x1c\xf3\x93\x10\xe7\x91\x07\x9d\xd0\x99\x64\x56\xfb\xa3\x05\xc6\x38\x66\x4c\x15\x49\x73\x73\x52\x1b\x29\x48\x29\x36\x4f\x60\x62\x64\x1d\xd6\x9c\x4c\x53\xf6\x31\x07\x03\x65\xec\x09\x25\x90\x4b\x30\xf8\x66\xf0\xd8\x8a\xba\x00\x46\x10\x12\x78\x09\x16\xb5\xe2\x8c\x77\x99\x9a\xf3\x38\x72\x0e\xf3\x93\x05\x59\x8b\x5c\xd6\xd8\xff\x8a\x1a\x3c\x46\xea\x6d\x9c\x88\x4b\x80\x43\x1e\x34\x21\x31\x18\xc5\x81\x71\x73\x12\x2d\x85\x88\x8d\xfe\x20\xc5\x35\x4b\x71\x14\x47\x00\xc5\xae\xcd\xd7\x24\x16\xf9\x3c\x29\xd0\xc4\xb0\x7c\x77\x5a\x65\x34\xba\x30\x73\xc0\x8e\xdb\x52\x17\x0f\x74\x9a\x1d\xe0\x5b\xee\xbf\xee\x4b\x35\xfb\x59\x09\x5e\x3a\x9d\x8b\x65\xcd\x7a\xed\x2e\x53\x64\x0e\x4a\x4f\x61\xb1\x10\x52\xff\xcd\xec\x6f\xce\x91\x68\xb8\x28\x00\xe8\x11\x08\x03\x0c\x10\xda\x98\x82\x52\xa7\x7a\x21\x77\x30\x90\x0a\xea\x35\xb1\xc0\xcc\xd0\xbb\xe4\x87\xe4\xff\xec\xfd\xfb\x8f\xbf\x4d\xf7\xbf\xdb\xdb\xfb\xf0\x6c\xfa\xd7\x8f\x7f\xdc\xfb\xf7\x0c\xff\xf1\x74\xff\xbb\xfd\xdf\xfc\x1f\x7f\xdc\xdf\xdf\xdb\xfb\xf0\xc3\x9b\x57\xe7\xa7\x2f\x3f\xb2\xfd\xdf\x3e\xf0\x3c\xbd\xb0\x7f\xfd\xb6\xf7\x01\x5e\x7e\xec\xd9\xc9\xfe\xfe\x77\x7f\x68\x98\x10\xe5\xeb\x77\x8b\x56\x22\xee\x95\xbd\x3b\xed\x73\x1e\xd5\x44\x3a\xc6\xf5\x54\xc8\xa9\xfd\xe0\x90\x68\x99\xef\x16\x65\x8d\xdc\xdb\xe5\x1a\xee\x7b\x1e\xbc\xad\xf4\xb5\xe1\x31\x72\x57\xd8\x39\x73\xa5\x99\x4d\xc1\xd9\x33\x2b\xdd\x2d\xcc\xb6\x7b\xb1\xbf\xf9\x88\x3b\xdb\xd1\x23\xca\xf3\xee\xcb\x27\xca\x47\x3e\x6c\xf4\xbf\x91\x84\x6b\x39\x7e\xdb\x58\x3d\x64\xa4\x61\x26\x98\xce\x2d\xcc\x24\x13\x92\xe9\xf5\x71\x42\x95\x7a\x4b\x53\xb8\xe9\x86\x9c\x2c\x4a\x35\x6c\x62\xe8\xd9\x9c\x3f\xee\x80\x76\xa1\x28\x6e\xc8\x66\x80\x9f\x2c\x50\x0f\xa9\xf4\xe3\x81\xea\xbf\x2d\x08\xd3\x93\xb8\x90\xe4\x57\x90\xc2\x5d\x66\x28\xc1\xea\x32\x8d\x23\xb8\xcf\xda\xf7\xa1\x05\x6c\x0a\xa2\x1c\xc1\x66\xe4\xa3\x6b\xa3\x51\x2c\xd8\xf2\xa6\xa0\x3b\xdb\xd5\x29\x89\x28\x37\x0b\xc5\xeb\x39\x17\xe4\x53\x02\x4b\x1a\xad\x3f\x99\x05\x7f\x92\x60\xa6\x68\x74\xc0\x4f\x56\x39\xa8\x89\xff\x2e\xea\x87\x29\x02\x0c\x6f\x6c\x65\xfc\x67\xab\x30\x7a\xed\xbb\x71\x26\x12\xeb\x0f\x64\x22\x9e\x99\x3d\x98\x6d\xac\x16\x59\x68\xf1\xb0\x10\x25\x3e\x3c\xfd\xb8\xf5\xa6\xb3\x66\x6a\x61\x95\xca\x2a\x71\xc8\x1c\xb9\x7e\x9b\x5c\xe3\x01\x42\x8e\xe2\x94\xa1\x09\x96\xec\x9d\x9e\x1d\xed\xd7\x56\x6e\xa4\x1c\x7b\x0e\xc7\x02\x7c\xdc\x8d\x19\x48\x95\xc6\x54\x3c\x43\x31\xc5\xd1\x92\x30\xe6\x38\xfa\xb9\x18\x00\xa3\x7d\xb5\x25\xad\xd7\x4f\xf6\xec\x88\x7c\x32\x12\x72\xc2\x38\xd8\x3d\xc8\x24\xbb\x64\x09\x2c\xcd\x4c\x2a\x81\x0c\xde\x25\xb3\x7b\x4f\x99\x32\xa7\x54\x1d\xbd\x53\xcc\xd1\xb5\x68\xdd\x82\xb7\xee\xe0\x76\x31\x25\x15\xeb\xde\x13\x85\xd3\xf3\x32\x71\x29\x2f\xd4\xde\x42\x74\xe0\x0b\x21\x23\x73\x9a\xef\x80\xa3\x76\x49\xec\x06\x34\xed\x02\x27\x9a\x7f\x0a\x2d\x92\x2a\x43\x7b\xb5\x0e\xaf\x68\xa5\x52\xc0\x8c\xbc\x33\x48\x78\xc5\x14\x4c\x0a\xa9\x77\x67\x17\x1e\xc3\xaf\x68\xb3\x9c\x58\xe9\xf6\x0c\xff\xb9\xb6\xde\x26\x67\x8e\x41\x74\x47\x39\xaa\x89\x5e\x88\x04\x65\xf8\x06\xe3\xf6\x2b\x16\x5b\xd1\x07\xa4\x14\x72\x66\x53\xf9\xad\x1e\x2c\x92\xb8\xe5\x94\x2c\xd4\x71\x23\xb2\xa0\xb1\xc9\xe2\x17\x47\x0e\xe6\xd0\x66\x37\x98\x1b\x70\xa3\x2e\xaf\x6a\x51\x2c\xa1\x45\x20\x7a\x23\x30\xff\xdf\x16\xd9\x30\xcb\xa0\x73\x91\x6b\x8b\x0f\x96\x7d\x2c\x44\xce\x63\x62\x38\xe3\x21\x59\x69\x9d\xa9\xc3\x83\x83\xf2\xe8\x9e\x31\x71\x10\x8b\x48\x1d\x44\x82\x47\x90\x69\x75\xe0\x09\xf9\x20\x13\xf1\xd4\xff\x31\xa5\x9e\x0e\x0f\xc6\x32\x4e\x42\x80\xe7\x2d\xb7\x79\x4e\x89\x5d\x6d\xcb\x0b\x25\x30\x77\xbe\xa4\x45\xe2\x22\x26\x1b\xcf\xc5\xfa\x1d\xaf\xe5\xfb\xc5\x1d\xb4\x85\xe0\x5f\x61\xa4\x4f\x54\xb5\xeb\xf6\x93\xa3\xcd\xb2\xdc\x61\x4b\xee\x6f\x9a\x3d\xf7\xbc\xd4\x48\xc3\xe5\x2a\x50\x0a\xd2\x9a\xe2\xf5\xb4\x46\x5d\xb2\x4f\x0c\x1b\xe4\x6b\x62\x58\xb5\x76\x77\x25\x5b\x93\x64\x9b\x66\xbf\x32\x72\x13\xd6\xb0\xf8\xa6\x70\xbb\x4d\x60\xb1\x80\x48\x7f\x5b\x31\x13\x15\x55\x18\x0a\xb7\xd6\x37\xfe\x5f\xdf\x36\x9f\xf2\xbd\x3c\x50\xfd\xc2\x4f\xec\x94\xda\x6d\xdf\xc3\x6c\xde\x2f\xb1\xc7\x0d\xf9\xc5\x02\xcf\x0e\x86\xea\x3d\xfa\xa6\x9d\x21\xd5\x7a\x25\x9c\x5c\x98\x24\xb5\x97\x3b\x03\x30\x90\xdf\x54\x0e\x04\x67\x82\x2d\xbd\x81\x40\xde\x0a\x57\xce\x06\x26\xe4\x14\xaf\x0c\x2e\x7f\xc1\x13\xf9\xad\xb0\x85\x6d\x3a\x2a\x95\xf4\x34\xd8\x76\xc6\xef\x0c\x83\xe7\x0f\x65\x38\x8f\x05\x4c\x2d\x9c\xa7\x24\xac\xaa\x1f\xac\x15\xb0\x17\xb0\xee\x84\xaa\x3b\xfc\x5c\x28\x11\xfa\x99\x26\x25\x8e\x7a\xcd\xc0\x46\x4a\xfc\xcd\x55\x3f\x10\xe9\x9c\x71\x3b\x15\x3b\xb0\xdf\x67\x1c\xdb\xef\x07\x8f\xf1\xcf\xee\x49\xf4\x84\x76\xbf\x98\xa2\x61\x20\x7f\x37\x20\x5e\xa8\xf0\x3c\x77\x81\x74\x57\x5c\x50\x25\x18\xe8\xe5\x2f\x39\x4d\x66\xe4\x85\x15\xaf\x11\x78\xf6\xa7\x2e\x72\xb3\x5d\x6c\xf9\xe3\xaf\x58\x12\x47\x54\xc6\xa8\x59\x59\xf6\x43\x94\xb0\x88\x43\xbd\xf4\xd6\xd1\xb7\x67\x80\x25\xf2\xd8\xcb\xbc\x49\x46\xa5\x66\x51\x9e\x50\x69\x18\x3e\x2c\x85\xec\x88\x47\xef\xb9\x99\x25\x36\x9f\x41\x24\x78\xdc\xe1\x39\x1c\xb6\xab\xe7\x9b\x9d\x57\xb7\x17\xe5\x36\x90\xcc\x55\x54\x61\x29\x6c\x92\xd7\x5e\x4d\x2b\xee\x18\x4b\x2c\x3c\xb3\x2b\x78\xcb\xc4\x0a\x57\x46\x8c\xab\x16\x7e\x62\xca\x47\xfb\xef\x57\x0e\x9c\x82\xda\x67\xe4\x1f\x6b\xaf\x73\x75\x85\x20\x31\xed\xfd\x50\x68\xc6\x71\xf3\x75\xa4\xe8\x76\xb2\x64\x23\x0b\x21\xe1\x12\x24\xd9\x8b\x05\x7e\x83\x05\x9c\xf6\x67\xe4\x5f\x46\x19\x6c\x73\xc3\xd8\xc6\x61\x69\x4b\x00\x39\xc2\x2e\x92\x30\x24\xa0\xdd\x9e\x2a\xf2\x8c\xec\xd9\xaa\x50\x2c\x4d\x21\x66\x54\x43\xb2\xde\xf7\xd2\xb7\x35\xab\xf5\xc1\x9a\x3e\xc5\xd2\x2a\x45\xd2\xbe\xfe\x73\xcb\x9b\x38\xd9\xdb\x44\xaa\x9f\xbc\xb9\xb9\x04\xac\x95\xa4\x37\xb0\xa7\xf0\x62\x76\x06\x29\x34\x46\xa4\x4d\x4a\x5e\x53\x11\x75\x3d\x6f\x2e\x70\xeb\x67\x83\xa0\x94\x48\x58\x22\x7d\x5a\x9a\xbb\x01\x75\xb2\x68\x77\xb9\xb7\x0e\x21\xa4\xdd\x23\x35\x25\x46\x17\xfc\xfa\xcf\x31\xd5\xb4\xe1\x05\x8b\x32\xeb\x6c\x17\xa9\x75\xc9\x36\x65\xe7\x4d\x7b\xdd\xc3\xf5\xe2\x86\x1f\xd5\x03\x2a\x35\xbb\xbe\xec\x83\x5d\x27\x68\x9b\xb6\xb1\x92\x1e\x0d\xa6\x12\x96\x4c\x69\xb9\xae\x38\x20\x9c\x0b\x53\x10\xc6\x95\xa6\x5c\x33\x64\xd5\xc4\xbf\x39\x75\xc6\xf7\x2b\xa6\x1b\xc2\x00\xdf\x19\xdd\x1d\x4d\xbb\x98\x89\x63\x8d\x1f\xe7\xeb\x0c\xc8\xdf\x2b\x7f\xbc\x92\x59\xb4\xfb\xfb\x93\x05\x71\x0c\xd4\xe2\x26\x8d\x63\x09\x6a\x9b\xb3\xed\xfa\xba\x15\x7c\xde\x58\x35\x16\x82\xa7\xde\xd8\xe5\x6a\x04\x2a\xc5\x96\x46\x49\xf1\xf5\x21\xbd\x2f\xa7\xa6\xac\x98\x5f\xdd\xc0\xd6\x33\x0b\x69\x71\x62\x32\xed\xd5\xc1\x48\x70\x95\xa7\xa5\x15\x21\x86\x0c\x78\x0c\x3c\x5a\x63\x49\xa8\xe4\x12\x1a\xc2\x78\x7e\x54\x0d\x28\x41\xc8\xff\x62\x4b\xa3\x76\xbb\xc9\x55\x25\x67\xef\x9d\xde\x98\x29\x53\x06\xf0\x0b\x90\x46\xf9\xc7\xcc\x1d\x23\xf4\xfa\x1e\x2a\x5e\x48\x57\xa3\xca\x07\x95\x6e\x4e\x16\x0b\x05\xee\x9e\xee\x79\x51\xdd\xd2\xfb\x2b\x3c\x4c\x2d\x07\x32\xe0\x58\x0a\xeb\xcd\xcf\x84\x62\xbe\x1c\x5c\x71\x2e\xd4\x2a\x64\x8a\x85\xad\x5f\xd9\x3c\x56\x3d\xcb\x0d\x03\xb1\x37\x16\x8d\xb6\xb7\x9c\xdb\xcd\x84\xaa\x45\xd3\xf3\xc2\x86\x1a\x9c\xe7\xdb\x5b\x5d\x44\xd1\x60\x6a\x5c\x7d\x69\xe5\x59\x26\x29\xbf\x80\x98\x24\x70\xcd\x22\xb1\x94\x34\x5b\xb1\x08\x8b\x1d\x5a\x57\xaf\xd1\x18\xb5\x0d\xa1\x6a\xc6\xf0\xa6\xd3\x2b\xcb\xe7\x09\x53\xab\xdd\x4e\xc3\x56\xe2\x50\x10\x49\xd0\x3b\x39\x5f\x1f\xda\x38\xb3\x9f\x97\xc2\x8f\x0f\x78\x77\xfd\xba\x7c\x11\x8b\xed\x3e\xb1\x94\x46\x91\x21\x6c\xef\x00\x05\x27\x09\x56\x88\xa8\x81\x43\x68\xef\x67\x32\xbd\x5c\x00\x64\x16\x9f\x31\x50\x4d\xa5\x68\x5b\x54\x8c\x47\x80\xc5\x1b\x5d\x11\x4e\x00\xef\x03\xd0\x92\x81\x95\x60\x01\xbd\x7e\x7e\x17\x81\xeb\xdd\x12\x67\xbb\x11\xa1\xc5\x80\xd0\x0e\xf1\x82\x17\x76\x02\xbd\xc2\x43\xbd\x50\x60\xfe\x6d\xc0\x8b\x4f\x86\x6e\xb6\xad\xd5\x79\x66\x43\xc1\x47\xf3\xc3\x1f\x6b\xbd\xb8\x18\x2e\x45\x56\xe2\xca\x0d\xb0\xc9\x31\x9c\x55\xce\xa3\x41\xcc\x54\x64\xd8\x4c\x83\xe1\xe8\x58\x70\xe5\x6b\x73\x52\x6e\xcb\x69\x5e\xd2\xc4\x25\xc8\xba\xc1\x32\x91\xa0\x1f\x34\xce\xbd\xbe\x6a\x53\x8f\x20\x9d\x43\x1c\x43\xec\xe3\xdd\xd7\xa4\xe1\xd0\xef\x10\x38\xba\x64\x02\x7f\x2c\x9e\x8a\x24\x69\x3f\xd3\x5b\x0d\x2b\x7d\xcc\x2a\x1e\x00\xbd\xe3\x4c\x3a\xc4\xcc\x13\x0f\x50\xa6\x0a\x8a\x2c\x1d\xd1\x88\x64\x46\x61\x29\xe0\x3e\x07\x7d\x05\xc0\x49\xb4\x82\xe8\x42\x95\x31\x76\xda\xd0\xe1\xc6\x46\xbb\x18\xaa\x76\x01\xb1\xca\x41\x0b\xc1\xd4\x6c\xa8\x4b\x72\x07\xc2\x8c\x5a\xc8\xe1\x6a\x33\x26\x6b\xfb\xe0\xa2\x97\x94\x25\x74\x9e\x74\x28\xcc\x27\x8b\xf2\xcd\x49\x75\xfe\xcc\x4b\x47\x59\x9e\x24\xce\x2b\x8d\x51\x2a\x5a\xd2\xc5\x82\x45\x18\xa4\x88\x51\x3a\x65\x54\xef\xce\xa5\x8f\x8a\xcc\x51\x9a\xea\x7c\x6b\xeb\x5b\xf0\xa6\x0d\x5f\x8c\x16\xca\x1a\xed\xad\x7d\x30\xe4\x7d\x5d\x83\x35\xb3\x03\xab\xa2\xd7\x1c\x5a\x33\xf2\x56\x68\x17\xed\xf6\x06\x94\x72\x91\x76\xe4\x3d\x50\x25\x78\xe5\x28\x40\xcd\x43\xb2\x25\xe3\x74\x77\x95\x02\xbb\xfe\xaa\xc5\xbc\x50\x34\xe9\x1a\x8b\x17\xb3\xa5\xa4\xba\xe0\xe0\xe5\x12\xdd\xa1\xe9\xc4\x82\x45\x8e\x11\x6f\xe4\x88\xaf\x11\x6d\x5c\x08\xdc\x6e\x9b\x2a\xe3\x5a\x8a\x38\x8f\xc0\x95\x69\xce\x55\xb5\xe3\x5b\x3d\x07\xea\xe1\x5f\x7e\x8c\x32\x9d\x20\x06\x4d\x99\xf3\x57\x0b\x0e\x84\xaa\xcc\x68\xf9\x1e\xdb\x73\x29\xf1\x44\xf5\xfb\x80\x87\xdd\xd1\xe9\x09\x79\x0f\x6d\x48\xd7\xc9\x77\xba\xe2\xfb\xa6\x24\xa1\x4a\x9f\x4b\xca\x15\x4e\xf8\x9c\xa5\x4d\x26\x0a\xa3\x59\x21\x06\x34\x3e\x97\x88\x15\x8d\x8f\x2d\x0a\x34\x3e\x6e\xe0\xde\x7d\x38\xe7\xf6\x1a\x6e\xc3\xda\xbf\xdd\x6b\x99\x1e\x69\xe4\x12\x6f\xeb\x29\x30\xca\x70\x12\xf7\x36\xb8\x52\xd6\x66\xab\x1d\xea\x63\xae\x0b\xaa\xdb\x6d\x0c\x04\x03\x6d\x4a\x2d\xfd\xca\xfb\x06\x73\x1e\x83\x4c\xd0\xe7\x56\x8e\x17\xad\x8c\x90\x1c\xcf\x9c\xf2\x4f\x0b\x3b\x0e\x86\xb9\x3a\xcf\x62\xe9\x34\xb0\x01\x73\xbe\x47\x83\x5d\xae\x86\xb8\xed\x06\x99\x6c\x14\x41\xa6\xdb\xb9\x6c\x2f\x9b\x9c\x37\xac\x18\x21\x61\xaa\x9b\xb1\xca\xe1\xd4\x6d\xec\x97\xeb\xca\xc6\xa4\xac\xf2\x94\x1a\x06\x45\x63\x0c\x90\x2b\x9e\x59\x1d\xc9\xea\x34\x96\x22\xad\xe3\xce\x3a\x5e\xfc\xf6\x75\xee\x90\x63\x5a\xb4\x48\xb5\xef\xb0\x96\xf4\x82\x59\x4a\xaf\x5f\x03\x5f\xea\xd5\x21\xf9\xd3\x57\xff\xf3\xeb\xbf\x34\xbc\x28\xe6\x36\xa6\xed\x15\x70\x67\x25\xba\x0d\xe8\x6d\xf7\xba\x69\xe6\x9c\xf9\x50\xec\xd9\xb2\x7c\xa7\x70\x28\x94\x58\x89\x4e\x68\xd0\x8e\x6f\xe7\x59\x3b\x38\xbf\xc7\x64\x02\xa5\x29\x8f\x60\x62\xc4\x81\x9d\xc3\x18\x55\xd6\xf2\xc8\x64\x4d\x9e\x7f\x35\xc1\x10\x4f\x9c\x94\xa5\xae\x59\xc9\xd6\x3f\x5c\x7f\x9c\xed\x58\x0c\x53\xe4\xaf\x93\x8d\x99\x32\x45\xcc\xde\x8b\x05\xa2\x69\xcb\x24\x51\xed\x93\x60\x79\xb6\x37\x02\x6c\xf3\x6c\x28\x56\xd2\x85\x09\x5d\xb6\xc9\x7e\x76\xc9\x94\x71\x96\xe6\xe9\x21\x79\xd6\xf0\x8a\xe5\xc8\xb7\x81\x1e\xb6\xa7\xf2\x3c\xa3\x86\x2d\x2f\x25\x4d\x53\xcc\xb8\x62\x31\x70\xcd\x16\x0c\x63\x5e\x0a\x12\x43\x3d\xde\x7e\xe8\xe3\xb4\x0a\xe0\x63\x08\x97\x61\xa3\xbd\x88\xee\xd4\x9e\xe3\x12\x85\x52\xe7\xb5\x8b\xaa\x9c\x77\x9d\x81\xa5\x4a\xab\x36\x10\xb8\xce\xac\x24\x57\xf1\x1f\xa5\x40\x39\xe3\x4b\x55\x46\x5b\x22\xff\x6b\x33\x8f\x9b\xcf\xae\x56\xe0\xa2\x1b\xa0\xea\x1d\xf4\xa5\x82\x8c\x28\x59\x06\x19\x63\xe0\x79\x3b\xfb\xd8\xb6\xc5\x1a\xa9\x2b\x85\xe4\x98\x2a\xe8\x61\x77\xad\xc4\x62\xfa\x6b\x15\x8a\xe4\xe0\x5b\x63\x40\xcf\x9f\x7d\xd5\x8a\x77\xc5\x7b\x8d\x2f\x95\x51\x9a\x1f\x8e\xa6\xff\xa2\xd3\x5f\x3f\xee\xb9\x7f\x3c\x9b\xfe\xf5\xff\x4e\x0e\x3f\x3e\xad\xfc\xf9\xb1\x39\xb8\x72\xb7\xe4\x5c\xb6\x1a\x0e\xbb\xb3\xd6\x8b\x55\x1e\x3f\x26\x3e\x98\xeb\x5c\xe6\x30\x21\xdf\xd3\x44\xc1\x84\xfc\xc8\xf1\x9c\xbc\x21\xd0\xda\xa3\x2b\x8c\x64\xf3\xd8\x8c\xfa\xb8\xfd\x15\x9c\x52\xfb\x3b\x6e\xba\x6d\x2a\x68\x3f\x20\x79\xcb\x42\x85\x11\xf2\x0a\x06\xda\xec\xae\x85\x10\x33\xb8\xa6\x69\x96\xc0\x2c\x12\xe9\x41\xf1\xfc\x16\x0f\xb9\xe7\x5f\xf7\xc0\x9e\xbd\x0f\x16\x47\x3e\xee\x7d\x98\xba\x7f\x3d\xf5\x3f\xed\x7f\xb7\xf7\xef\x59\xeb\xf3\xfd\xa7\x07\x18\xda\x5b\xa0\xda\xc7\x0f\xd3\x12\xed\x66\x1f\x9f\xee\x7f\x57\x79\xb6\xbf\x0b\x09\xb7\x93\xa8\x52\x9a\x4d\x2f\x1a\x2b\xc6\x35\x8a\xb2\x4d\xd9\x58\x29\xcd\x76\xa9\x78\x0b\xb6\x7c\x43\xb3\xf7\xb0\x00\x09\x3c\xea\x36\x21\x1d\x6f\x7d\x42\xf6\x62\x73\x84\x63\x0e\xde\xbe\x17\x5e\x65\xf1\xd4\x1d\x64\xc5\x77\x9e\xbb\x17\x17\x1e\x6d\xc6\xe4\xd4\x22\xdd\x26\xa5\x28\xb9\x43\x59\x2f\x7b\xbd\x7d\x17\x10\xa7\x0d\xe2\xe4\xb4\x8c\xba\x1b\x61\xe8\x31\xc7\x91\x35\x78\xb5\x69\x10\x3d\x90\xbc\x9f\xec\xcb\x5b\x42\x7f\x3b\x07\x29\xd6\x39\xba\x07\x7f\x0f\xc5\x4f\xd6\xee\x32\xba\x9f\x9c\x35\x2a\x97\x7d\xa5\x8b\x1f\x4f\x5e\x58\x9c\x41\xc6\x84\x12\xe5\x4a\x24\xb1\x22\x39\x67\xbf\xe4\x40\x4e\x5e\x14\xd5\x87\x18\x8f\x92\x1c\xef\xed\xf9\xf1\xc7\x93\x17\x6a\x46\xc8\x3f\x20\xa2\x46\xaf\xbf\x6a\x09\xe1\xc4\x52\x7b\xef\xde\xbe\xfe\xdf\x68\x01\xc0\x2f\xdd\xb5\x19\xae\xb0\x48\xc2\xa8\xb5\x48\xd9\xc3\xd7\xf4\x6a\xa3\x1b\x71\x46\x11\xcd\x9a\x6d\x0c\xc4\xd9\xed\xb8\x0d\xd2\x5d\x41\x92\x29\x4c\x3e\x22\x2a\x97\x6e\x35\x66\x40\x9b\x05\x81\x69\xe8\xce\x71\xee\xf3\xa9\x30\x5f\x6d\x54\x5c\x74\x24\x38\x87\x08\x23\x13\x8c\x10\xda\x87\x43\x54\xdf\xdf\x14\xf0\x77\x4a\xb4\x9b\x01\xce\xe5\x98\x9e\x7f\x78\x03\xe9\xed\x13\xba\xa1\xc8\x77\x4e\x94\xc7\x19\x8f\xa0\x6a\xe7\x5b\x1c\x8d\xdf\x66\x0e\x0e\x6e\x77\xce\x12\xb6\xd6\x3b\x6a\x44\x6b\xb4\x44\x67\xf0\xfb\x0e\xdb\x75\x3d\x2c\x73\xcb\xb2\xb1\x91\xdb\x8a\x06\xd4\xc2\x9f\xbc\xa2\x8a\xcc\x01\x38\xda\x73\xad\xdd\x0e\xb8\xc3\x79\x28\xad\xad\x79\x36\xd5\x62\xda\xa0\x5f\x75\x40\xae\x1b\x6a\x2d\xe6\x83\xda\xda\x8e\x06\x1b\x04\xae\x56\xeb\x5d\x30\x50\xe5\xad\x3d\x5e\x7a\x1a\xec\xa5\x6e\xd6\xca\x6a\x73\x76\x46\xd6\xe2\xd8\xc6\xbf\xb6\xa7\x64\xd4\xed\x9a\xe1\x49\x0b\x74\x2f\xd6\xa8\x79\xc4\x1c\xed\x36\x9f\x81\xbc\x64\x3d\x84\x8f\xf7\xf5\xf7\x7b\xb1\x96\x57\xef\x4f\x8f\x31\x3f\xcf\x7c\xe0\xfd\x13\x88\xfd\x55\xa9\xe2\xf6\x3d\x3a\x91\x0d\x35\x3a\xba\x7b\x82\xce\x84\x1c\x3f\x48\x26\x85\x16\x91\xe8\x70\x3a\xb5\xa6\xcc\x20\x68\xdb\x72\x8c\x86\xf4\x31\x54\xde\xb0\x7c\xac\x96\x95\xa6\xb4\x90\x86\x5c\x6b\xbf\xe5\xf3\xe2\x4e\xac\xb2\x77\xa7\xf5\x91\xff\xfc\xf7\xd1\xff\x0b\x00\x00\xff\xff\xbd\xa3\xb8\x4f\x69\x56\x01\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1c\xb7\x11\xe0\x77\xfd\x0a\x94\x2e\x55\x22\x95\xdd\xa5\xe4\xa4\x7c\x09\xe3\xd8\xc5\x50\xb2\x8e\x65\x3d\x58\x22\xed\xd4\x45\xd1\x9d\xb0\x33\xbd\xbb\x30\x67\x80\x31\x80\x21\xb9\x8e\xf3\xdf\xaf\xd0\x00\xe6\xb1\xbb\xf3\xe4\x4b\xf2\x01\x1f\x6c\x71\x67\x06\x8f\x46\x77\xa3\xdf\xa0\x19\xfb\x09\xa4\x62\x82\x1f\x12\x9a\x31\xb8\xd6\xc0\xcd\x5f\x6a\x76\xf1\x17\x35\x63\xe2\xe0\xf2\xf9\xa3\x0b\xc6\xe3\x43\x72\x9c\x2b\x2d\xd2\xf7\xa0\x44\x2e\x23\x78\x01\x0b\xc6\x99\x66\x82\x3f\x4a\x41\xd3\x98\x6a\x7a\xf8\x88\x10\xca\xb9\xd0\xd4\xfc\xac\xcc\x9f\x84\x44\x82\x6b\x29\x92\x04\xe4\x74\x09\x7c\x76\x91\xcf\x61\x9e\xb3\x24\x06\x89\x9d\xfb\xa1\x2f\x9f\xcd\x9e\xff\x65\xf6\xec\x11\x21\x9c\xa6\x70\x48\x22\xaa\x69\x22\x96\x76\x2c\x35\x13\x19\x48\xaa\x85\x54\xb3\x48\x48\x10\xe6\x7f\xe9\x23\x95\x41\x64\x06\x59\x4a\x91\x67\x87\x64\xe7\x3b\xb6\x3f\x3f\x17\xaa\x61\x29\x24\xf3\x7f\x13\x32\x25\x22\x49\xf1\xdf\x6e\x8d\x76\xd8\x33\x1c\x16\x7f\x4f\x98\xd2\x3f\x6c\x3f\x7b\xcd\x94\xc6\xe7\x59\x92\x4b\x9a\x6c\x4e\x18\x1f\xa9\x95\x90\xfa\x6d\x39\xbc\x19\x2e\xa2\x5a\xc9\xc8\x3e\x66\x7c\x99\x27\x54\x6e\x7c\xfb\x88\x10\x15\x89\x0c\x0e\x09\x7e\x9a\xd1\x08\xe2\x47\x84\x38\x48\xb9\xae\xa6\x84\xc6\x31\x42\x9f\x26\xa7\x92\x71\x0d\xf2\x58\x24\x79\xca\x8b\xa1\xcc\x3b\x31\xa8\x48\xb2\x4c\x23\x84\xcf\x57\x40\x32\x09\x5a\xaf\x11\x24\x44\x2c\x88\x5e\x81\x1f\xbb\xf8\x8a\x90\x9f\x95\xe0\xa7\x54\xaf\x0e\xc9\xcc\x40\x78\x16\x33\x95\x25\x74\x6d\x66\x53\x79\xcb\x6e\xd3\x0b\xfb\xac\xf2\xbb\x5e\x9b\xa9\x2b\x2d\x19\x5f\xb6\x4d\xc5\xbc\xd7\x7f\x0e\x16\x34\xe7\xeb\x6c\x7b\x0a\x1b\x3f\xf6\x1d\x3f\xcb\xe7\x09\x53\x2b\x90\xfd\x27\x51\x7c\xb2\x35\x87\xd3\x1d\x4f\x1a\x26\x52\xe9\xd4\xd3\xcd\x2c\x92\x80\x24\x73\xce\x52\x50\x9a\xa6\xd9\xd6\x00\x47\xcb\xed\x35\xc6\x54\xfb\x1f\xed\x4b\x97\xcf\x69\x92\xad\xe8\x73\xf7\xa3\x8a\x56\x90\xd2\x12\x1f\x44\x06\xfc\xe8\xf4\xe4\xa7\x3f\x9d\x6d\x3c\x20\x75\xe8\xd4\xf0\x9c\x30\x45\x28\x91\x90\x09\xc5\xb4\x90\x6b\x03\xad\xe3\xb3\x9f\xd4\x84\x1c\xbf\x7f\xa1\x26\x84\xf2\xb8\x20\x3c\x92\xd1\xe8\x82\x2e\x41\xcd\xb6\xe6\x2a\xe6\x3f\x43\xa4\x2b\x3f\x4b\xf8\x25\x67\x12\xe2\xea\x2c\x0c\x78\x3c\x4c\x36\x7e\x36\xf0\xaf\xfc\x94\x49\x33\xa6\xae\x10\xb2\x6d\x15\x66\x56\xfb\x7d\x63\x85\xbf\x4d\x37\x9e\x12\x62\x00\x63\xbf\x24\xb1\xe1\x6c\xa0\x10\x29\x1c\xd5\x41\xec\xa0\x69\x91\x85\x29\x03\x11\x09\x0a\xb8\xe5\x75\xe6\x67\xca\xdd\x2a\x67\x5b\x9d\x9f\x81\x34\x1d\x19\x86\x90\x27\xb1\x61\x89\x97\x20\x35\x91\x10\x89\x25\x67\xbf\x16\xbd\x2b\xa2\x05\x0e\x9b\x50\x0d\x4a\x13\xa4\x6b\x4e\x13\x72\x49\x93\x1c\x10\xd8\x5b\x7d\xa7\x74\x4d\x24\x98\x71\x49\xce\x2b\x3d\xe2\x27\x6a\x7b\x2e\x6f\x84\x04\xc2\xf8\x42\x1c\x92\x95\xd6\x99\x3a\x3c\x38\x58\x32\xed\x99\x7d\x24\xd2\x34\xe7\x4c\xaf\x0f\x90\x6f\xb3\x79\x6e\x18\xea\x41\x0c\x97\x90\x1c\x28\xb6\x9c\x52\x19\xad\x98\x86\x48\xe7\x12\x0e\x68\xc6\xa6\xb8\x18\x8e\x0c\x7f\x96\xc6\xff\x43\x42\x95\x03\x6e\xa2\xc1\x06\x35\x10\xcf\x77\x07\x6e\x96\xe1\xc7\x16\x31\x6d\x87\x76\xb1\xe5\x9e\x98\x9f\x0c\x18\xdf\xbf\x3c\x3b\x27\x7e\x46\x76\xdf\xec\x16\x95\xaf\xee\x80\x90\xdf\x2d\x03\x59\xc6\x17\x20\xed\x97\x0b\x29\x52\xec\x15\x78\x9c\x09\xc6\xb5\xe5\x1a\x09\x03\xae\x89\xca\xe7\x29\xd3\x0a\xd1\x1a\x94\x36\x1b\xb9\xdd\xf1\x31\x1e\x8e\x64\x0e\x24\xcf\x0c\xf1\xc6\xdb\xaf\x9c\x70\x72\x4c\x53\x48\x8e\xa9\x82\x7b\xdf\x3b\xb3\x47\x6a\x6a\x36\xa4\xf7\xee\x55\x8f\xfe\xed\x0f\xb6\xa8\x9e\x10\x7f\x66\xf7\x7a\xb9\x89\x4d\x10\xcb\x13\x76\x9d\x09\xa4\x85\x3b\x98\x46\xe3\x58\x82\xda\xf1\xa0\x1b\xeb\x4c\x3b\xb2\x9f\x5b\xe4\x5b\x09\x65\x90\x80\x6a\xf2\xee\xf5\x1b\x12\x51\x4e\x72\x05\x86\x84\x23\xc1\xb9\xc1\x32\x2d\x08\x35\x67\xee\x14\xae\x99\x42\xac\x94\xb0\x64\x4a\xcb\xf5\xf6\xde\x9a\xf6\xbd\x90\x29\xd5\x87\xe4\x1b\xff\xda\x14\x87\x10\x92\xb0\xec\xdb\xc3\x6f\x32\x21\xf5\xb7\x3b\x3f\x7c\xc7\x93\xb5\x19\x3c\x26\x57\x2b\xe0\xe4\xac\x80\x0c\xf9\x7b\xe5\x8f\x57\x32\x8b\x76\x0f\x7c\xb2\xe4\x42\xfa\xaf\x0d\x5a\x9f\xa4\x74\x09\x64\xc1\x20\x41\x42\x53\xb0\x83\xab\xb5\xa0\x05\xb1\x82\xdf\x82\x2d\xdf\xd0\x6c\x2c\xac\x8f\x7d\x07\x66\x06\x66\x52\x55\xb1\xa5\x7c\xa8\x05\x52\x94\x59\xbc\xf9\x27\x8d\x2e\x08\x75\x83\xa7\x34\x9b\x2a\xa4\xe6\x0e\xc0\xf7\x83\xdf\xb1\xef\xd4\xec\x48\xf9\xf3\x89\xe3\xd2\x83\x21\x54\x05\xc2\xe0\x6f\x4b\xa1\xac\x13\xbe\x6f\x76\x9d\xa9\x3d\xc6\x58\xca\x2c\x3a\x15\xb1\x5d\xf6\xd8\x5d\x7c\x55\xed\x84\xc0\x75\x26\x14\x28\x12\xb3\xc5\x02\xa4\xe1\x9c\xe2\x12\xa4\x64\x31\x28\xb2\x10\x12\xb7\x36\x13\x31\xb2\x89\x62\xab\x6b\xf2\xc8\xa9\xd8\xc1\x36\xc9\x20\x1a\x40\xa1\xc5\x62\x78\x17\x6e\xef\x64\x4a\xa4\x83\xc7\x98\x46\x17\xa8\x1e\xad\x77\x3f\xdd\x00\xdd\x91\x7b\xd9\x23\xba\x13\x45\x1d\x87\x7b\xa2\x0c\x48\x9e\xa8\xa2\xcf\xdd\xeb\xef\x9c\x72\x9f\x69\x9b\xc6\x45\x0c\x47\x1d\xd3\xdf\x5a\xc2\x0b\xfc\x63\x0e\x0a\x3f\x2f\xa6\x8a\x82\x4d\x9c\x27\xc8\xfb\xf2\xa4\xbe\xcb\x4d\xeb\xe8\xb9\x96\xbe\xeb\xb1\xef\xc1\x02\xa4\x84\xf8\x45\x6e\x50\xfd\xac\x98\x95\xe3\x7c\xf6\xe7\x97\xd7\x10\xe5\x4d\xe4\xd8\xb8\xf4\x06\xc4\xaf\x36\xa3\x70\x38\x48\x80\x24\x57\x2c\x49\xdc\x8c\x0c\xcb\xf2\x0f\x0c\x48\x50\x02\x34\x10\x54\xf6\x60\x51\x54\x33\xb5\x58\x77\x0e\x60\x20\x5a\xc0\x1c\xae\x8d\x70\x83\xda\x22\x12\x12\x5b\x30\x88\xc9\x7c\xed\xe4\x18\xc3\xd4\x27\x64\x9e\x6b\xc2\x34\x0a\x39\xd1\x4a\x08\xb5\x79\x88\x6e\x37\x6a\xb7\x16\xe7\x75\xc9\x04\xca\xa8\x44\x70\x30\xdc\x30\x35\x92\x89\xa3\xd7\xca\xf0\x33\x5c\x79\xf9\x19\xdb\x14\x2c\xb6\x5b\x6a\x4e\xbc\x62\xbb\x3c\x45\x98\x61\xae\x98\x5e\xe1\x1f\x4b\xa3\x2e\x19\xf9\x58\xe5\xa9\x19\xf4\x0a\xd8\x72\xa5\xd5\x84\xb0\xd9\x0e\xa1\x69\xb3\x19\x04\x04\x1a\xad\x2a\xd3\x4a\x01\xb4\x22\x34\x49\xfc\x12\xaa\x58\x6b\x25\x90\xd4\xc8\x8a\x64\xcf\x0b\x93\x9d\xa3\x38\x41\x70\x52\x48\x30\x9b\x88\xb7\x73\xbb\x26\x04\x74\x34\xdb\x9f\x74\x76\x1f\x89\x34\xcb\x35\x18\x09\x38\x4f\xcd\xd6\x32\x6d\x74\x30\x2b\xf8\x4a\x91\x2f\x2d\xa4\x20\x71\x13\xf7\x6a\x8b\x3d\xd1\x0d\xff\xa3\x71\xbc\x8b\xe7\x6f\xb6\xc7\x16\xb8\x8f\xbd\x66\x62\x86\x63\x16\x48\x08\xbf\x94\xea\x68\xe5\x94\xa5\x48\x48\x09\x2a\x13\xdc\xf4\x6c\x9f\xbc\x2c\xd7\xf6\x37\xf3\x4e\xe7\x78\xa6\xd3\x3d\xb5\x5f\x6e\xf6\x8a\x2d\x57\x7e\xaf\xa9\x04\xfc\xad\x8e\x23\x5d\x5b\x6e\x59\x09\x95\x92\x76\xd1\x11\xd3\x90\x76\x30\x12\x32\x82\xfa\x09\x39\xe2\x04\xd2\x4c\xaf\x2b\x88\x5d\x41\x31\x0d\x32\x2d\x00\x89\x58\x88\x6c\x4f\x59\x20\xb0\x34\x4b\x58\xc4\xb4\x43\x73\xf2\xac\xc7\x78\x7b\x86\x12\x08\xd3\xe6\xd0\x20\x5c\x4c\x45\xb6\x3f\x23\x47\x84\xe7\x05\xe3\x69\x9b\x02\x17\xc5\x0c\x5c\x47\x66\x5a\x4a\x94\x7d\x75\xf3\xa3\x7e\xec\xdb\xb6\x66\x21\x7f\xbb\x4d\xdd\xfc\x81\xf7\x20\x42\xf3\xba\x85\x5a\xe7\xab\x7d\x0f\x12\xff\xb6\x9f\x43\x9f\xb7\x37\x4f\x7b\x4b\x39\x0a\x12\x88\xb4\x39\x0d\x41\xa6\x13\x42\x95\x12\x11\x33\x5a\x61\x89\xfb\x75\x82\xb2\x2b\xe9\x86\x3d\x19\x0a\x7f\x32\x78\xfd\x04\x0d\x0f\x75\xfa\xee\xfb\xdd\x16\x34\x12\x66\x74\x9c\xc5\x06\x54\x6a\x7c\x77\xbe\xc6\xa7\x4f\x14\x49\xe8\x1c\x92\x1d\x4a\x7b\x53\xeb\x4f\xfc\x65\xeb\xc9\x06\x1a\x16\xd4\x8b\x21\x94\x6d\x13\x1b\x2a\xeb\x76\x26\x8e\x02\x4f\xcc\x51\x65\x54\x7b\xca\xb8\x72\xf6\x9d\x09\xa1\xe4\x02\xd6\xd6\x0e\x47\x79\x61\x8a\x1b\x34\x05\xec\x58\x82\x3d\xd0\x0d\xde\x5d\xc0\x1a\x3b\x6c\xb2\x21\xb5\x74\x35\x14\xef\x6c\x1b\xc2\x01\xca\x36\x35\x13\x1d\xf8\xc5\x08\x00\x0d\x27\x0d\xdb\x2e\xa0\x55\x7c\xde\xd5\xb6\xac\xd4\x88\xee\xb8\x1f\xb8\x49\x78\x02\x7b\x7c\xa0\x59\x96\x30\xd8\x6d\x6a\x6a\x6f\xad\x5a\x5f\x5b\xf3\xd0\xbb\xd1\xba\x06\x12\x88\x69\xef\x0b\x73\x9d\xc5\xf7\x27\xca\xe2\xab\xe1\x3b\x2b\x96\x59\x43\x8b\x02\x64\x23\xc3\x91\xd6\xb6\x9f\x68\xc2\x4a\x5b\xb6\x42\x61\xe3\x84\x4f\xc8\x5b\xa1\xcd\xff\x5e\x5e\x33\x65\x64\xcc\x17\x02\xd4\x5b\xa1\xf1\xcf\x19\x79\xa5\x2d\xe9\xbd\xee\xc9\x97\xcb\x36\x7a\x0f\xec\xfa\xee\x7b\x07\x8e\xb8\x65\xa2\x06\xc2\x55\xa3\xab\x9a\x91\x13\x2b\x0e\x16\x5e\x00\xa6\xc8\x09\x37\x4a\x81\x85\xdc\xe0\xa1\xd0\xee\x8e\x7d\xbb\x21\xd3\x5c\xa1\xd5\x94\x0b\x3e\x45\x31\x6a\xe7\x98\x76\x83\xcc\xb8\xd5\x2d\xba\xc5\xe1\x9b\x87\x7e\x85\x36\xba\xd7\x7a\x52\xf9\x78\xf0\xb8\x95\xc1\x56\xf4\x12\x45\x7b\xc6\x97\x49\x21\xc4\x4f\xc8\xd5\x8a\x45\x2b\xab\x3d\xce\xc1\x3a\x07\x32\x09\x46\x62\xa0\xca\x30\x7f\xf3\xcb\x12\xe4\x70\xd4\x3f\x37\xaa\x81\x1d\xdf\xba\x36\x12\x1a\x41\x4c\x62\x54\x59\xac\x95\x9d\x6a\x58\xb2\x88\xa4\x20\x97\x40\x32\x73\xf4\x8f\x43\xf8\x61\x27\xb1\x6d\x83\xcf\xe3\xea\x80\x23\x28\x8c\x90\xeb\xe9\x45\x3e\x07\xc9\x41\x83\x9a\x1a\xf9\x64\xea\x66\xaf\x45\xca\xa2\xde\x9d\xdd\x4a\x37\x28\x67\x7d\x6f\xf4\xb6\x7b\x12\xb1\x50\x47\x0c\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xf5\x6e\x41\xc4\xba\xf1\xf0\x41\xc4\x0a\x22\xd6\xbd\x8b\x58\xb5\x2e\x52\x9a\x0d\xed\xc1\xda\xe5\x46\x18\x02\xff\x69\x0d\xba\x9b\x96\x3f\x14\xf8\x7c\x08\x4b\xdd\x04\x68\xe4\x98\x33\x77\x38\x9d\xa3\xd9\x90\x59\x7f\xbd\xa4\x7c\x09\xe4\xf9\xf4\xf9\xb3\x67\x43\x0c\x84\x0e\x9d\x7b\x7d\xb1\x70\xc1\x09\x8c\xeb\x3f\x7d\xd5\xf1\xc5\x0d\x76\xa5\xc9\x5f\x72\x3f\x8e\x3a\xc7\x79\x0a\xdf\x4c\x4d\x44\x6e\xf0\xa5\xe1\x31\xc6\x85\x26\x29\x68\x42\xbb\x65\xb2\xaa\xd9\x9d\xa5\x30\x29\x9c\xde\xc8\x76\x5c\x84\x90\x77\x0a\xc6\x44\x70\xe7\x7a\x31\x9b\xdf\xbd\xb9\xa3\x56\x10\x01\xb5\x91\x2b\x73\x30\xab\xe8\x76\x05\x6a\xa2\x44\x6a\x66\xcd\xb8\xf6\x4c\xcc\x2c\x01\xfc\xc6\x90\x3d\x98\x2d\x67\x24\xce\xb1\x5b\xca\x5d\xc8\xd3\xbe\x5d\xad\x5a\x2b\x0d\x69\xb7\x2f\xd0\x1c\x86\x12\xff\x67\xc0\xa2\xe5\xda\x74\x06\x97\xc0\x75\x4e\x93\x64\x4d\xe0\x92\x45\xba\x80\x1f\x46\x68\x31\xad\x7a\x41\x6a\x80\x18\xdd\x5f\x74\x9e\x6e\x51\x68\xd7\x21\x35\x44\xf2\xdd\xea\xbb\x0f\xcf\xa9\x51\xc0\x7b\xb7\x92\x59\xa3\x4e\xa8\x4d\xbf\xd6\x6d\x8b\xff\x44\xe4\x7e\xf7\xbe\xdb\xcb\x46\x06\x9f\x3f\x03\xce\x9c\x71\xa2\x95\x73\x78\x09\xe9\x9c\x6f\xdb\x2b\xdd\xe1\xf2\xb2\x6b\xaf\x51\x8d\x58\xf4\x1c\x50\xaf\xc0\x3a\x29\x8f\xde\xbe\xe8\x07\x31\xe2\x82\x03\xce\x45\x26\x12\xb1\x5c\x57\xb7\xd7\x86\x48\xb3\x34\xf3\x4e\x5c\x4a\x54\x3e\x77\x22\xb8\xc1\xf9\xb7\x1b\xf8\x10\x5c\x43\xc1\x35\x14\xec\x16\xd8\x82\xdd\x22\xd8\x2d\x82\xdd\xa2\x5f\x0b\x76\x8b\x1b\x0f\x1f\xec\x16\xc1\x6e\x11\x5c\x43\xdb\x2d\x88\x58\xdd\x2d\x88\x58\xad\x2d\x88\x58\x45\x0b\x22\x56\x10\xb1\x82\x88\x15\x44\xac\x20\x62\xdd\x57\x37\x37\x75\x0d\xdd\x68\x0a\xe3\x06\xcf\x44\x7c\x83\xe4\xad\x4c\xc4\x2d\xb9\x5b\xd6\xa6\x1f\x89\x69\x22\x22\xaa\x5d\x46\xb5\xf9\xc4\x79\xa1\x14\x4d\xad\x9b\x62\x42\x7e\x15\x1c\x6c\x36\x8b\x21\x0f\x74\x16\x08\xbd\x02\x69\x5e\xdf\x53\xfb\xad\x29\x04\x21\xf7\x2b\xe4\x7e\x85\xdc\xaf\xc6\xf6\xd9\xe4\x7e\xad\xa8\xb2\x78\x6b\x8f\xc6\xe6\x54\xb0\x0a\x4f\x3a\x07\x99\xfe\x4e\x33\xc1\x0c\xba\x3b\x74\xc4\x7a\x20\x25\x4a\x59\xc8\xc4\xce\xe1\x0f\xf1\x69\x1d\x1e\x4e\xad\xc6\x45\xd1\x38\x86\x98\x64\x20\xa7\x16\x45\x05\x59\x30\x1e\xef\x58\xab\x87\x4f\x37\x7b\xb8\xc3\x54\xac\xfa\x3a\x7a\x7d\x73\x37\xf9\x58\xf5\x89\x8c\x70\x2a\x56\x3d\xa3\xb5\x43\xf0\xb3\xc8\xce\x1a\xaa\xa1\x4f\x89\x76\x0e\xc5\x1f\x7a\xea\xe8\xc3\xd5\x6c\x54\x8e\xbd\xfb\x71\xa4\xf9\x69\x90\x2a\x74\xe4\xf4\xf1\x5f\x72\x90\x6b\xac\x1b\x50\xaa\x9d\x45\xd9\x19\x17\x11\xc3\x14\x89\xa8\xb2\xc7\xea\x10\x51\xf9\x64\x61\xb3\x26\x79\x9e\x24\x13\xdb\xcf\x26\xb1\x7a\x36\x87\x78\xc0\x85\x79\x3e\xd8\x22\x36\xd0\x44\x33\xce\x06\x32\xde\x0b\x4b\x36\xf7\x69\xb3\x2b\x6b\x1b\xf3\xa6\x43\xbb\x2d\x3b\x6d\x87\x3b\xbc\xe9\x83\xfd\xe3\xb6\x8d\x55\x60\x46\xa9\x2f\x37\xd6\xd7\x5b\x60\x72\x03\xbb\x22\xbe\x3c\x78\x32\xb7\x63\x5b\x24\xe3\xed\x8b\x64\xb4\x8d\x91\x8c\xb2\x33\x92\xb1\xb6\x46\x72\x03\x7b\x23\x19\x67\x73\x24\x9b\xd8\x66\x76\xc8\x09\xbe\x77\x63\x7e\x24\x37\x53\xce\xc7\x9b\x21\xc9\x2d\x10\x56\x75\xfc\x4a\x11\xaf\xbb\xb3\x4b\x92\xbe\xb6\x49\x24\xab\x9a\x79\xf2\xbe\xf7\x65\x9c\x69\x92\xdc\xd2\xae\x38\xa3\x1d\x43\x5b\xd8\x7d\x19\x2b\xc9\xc3\x1b\x2c\x5b\xa7\xe0\x86\xef\x6d\xe1\x1b\x35\xfa\x0d\xac\x82\xe4\x46\x96\x41\x32\xde\x3a\x48\x6e\x8a\xec\xb7\x66\x25\xbc\xd5\xae\x50\x4e\x7a\x8d\x71\x68\x37\x90\xb6\x06\x53\x60\x65\x58\x2b\x5d\x60\x8d\xb2\x05\xf9\x8f\x11\x22\x10\x31\xff\x4b\x32\xca\xa4\x32\xda\x8d\xb3\x6b\x57\x9f\x39\xf3\x5d\xa5\x9b\xc1\x13\xc0\x22\x6d\xe6\x8c\xbf\xa4\x89\x11\x72\x6c\xd0\xaf\xb3\x41\x98\xb9\x6c\x8a\x90\x13\x72\xb5\x12\xca\x4a\x24\x45\x9d\xb9\xc7\x17\xb0\x7e\x3c\xe9\x65\x1e\xa8\xb7\x2a\x65\x3f\x3e\xe1\x8f\xad\xe8\xb4\x45\x97\x85\x9c\x25\x78\xb2\x26\x8f\xf1\xd9\xe3\xdb\x96\x51\x47\xc8\x47\xd5\x62\xbe\x63\xc5\x8f\x51\xe4\x74\x53\x03\x37\xa9\x61\xdf\x0f\xb0\x1e\x1b\x88\x30\x08\xe7\xdf\xd4\x46\xf4\x02\x35\xa2\x99\xd1\xdd\x0b\xb9\x09\x2d\xaa\x56\x64\x72\x36\x2a\x6b\xae\x62\x49\x32\x60\xb4\x39\x10\x4d\x2f\x00\x3d\x3c\x58\xdb\x51\xb1\x18\x0d\x6e\x82\x5b\xd4\xc1\x91\x0c\xca\xf8\x22\x84\x89\x10\x17\x79\xe6\x51\xcf\x17\x0e\x1d\x30\x24\xe3\x91\x48\x7d\x4c\xbd\x8d\x6b\x35\x54\xe1\xe8\x65\x6a\xcb\x9d\xda\xdf\x71\x60\x3c\x02\x9c\x69\xe2\x53\x4d\x31\xff\x44\xa8\x22\x9f\x50\xa8\xe4\x64\x0f\x3f\xdc\xff\x34\x24\xa4\xa0\x00\xa0\xb5\xbe\x8a\x1c\x39\x4b\x51\xd0\xb2\x62\xff\x2b\x60\xdb\x06\xb1\x01\x43\xfb\x4a\x71\x55\x60\xd8\x5a\x78\x64\x8f\x72\xcd\xf6\xcb\x82\x78\x04\xf1\x00\xa5\xe4\x58\xf0\x27\xda\xce\xcf\xf3\x35\xdf\xc1\x90\xa8\x83\x02\xee\xa5\xc7\xcf\x7a\x0b\xec\x96\xc7\xb0\xa0\x79\xa2\x5d\xe1\x59\xc3\xfa\xf0\xa4\x1f\x30\xc2\xb9\xf7\x97\x38\x81\x7f\x21\xe4\x9c\xc5\x31\x70\x4c\x71\xf0\xd3\x9f\x0b\x9f\x10\x54\xa2\xbb\xe1\x6c\xb5\x3d\x1e\x32\xec\x51\xa2\xc4\x64\xb3\xc7\xa8\x28\x4c\x6b\xa8\x08\xcb\x27\xd6\x06\x20\x4c\x19\xa0\x36\x54\x4a\xdc\xdd\xee\x25\xf4\xe7\xe6\x3c\x6f\x74\xe8\x15\x53\x0f\xc0\xf7\x36\x07\x0d\xac\xaf\x17\xeb\xe3\x42\x07\xee\xf7\xc5\x72\xbf\x2d\xa4\xbf\x0d\x06\xb8\xd5\x69\xe0\x81\x83\x79\x20\xf7\xf7\x53\x3c\xb0\x17\xc0\x1a\xc6\x6c\x14\xab\x9f\x92\x2a\x6d\x66\x98\xe8\x35\xce\x5e\xe6\xd3\xe0\x90\xcf\x62\x0f\xb1\x77\x86\xe6\xdc\xd5\xfd\xf7\x95\xa9\xdd\xb0\x96\x5f\x6c\xfa\xdc\x07\x8c\xe9\x15\x17\xc1\x41\xa1\x89\x1d\x8a\xf8\x8a\xca\x30\xd8\xeb\x90\xa5\x60\x2a\x5c\x69\x3e\xe4\xf1\x66\x72\x5c\xd9\x37\xda\xf5\x53\xa0\x5c\x91\xc7\x3e\xc4\xe3\x89\x2a\xdf\x78\x3c\x88\xde\x7c\xe9\xcb\x62\xec\xbd\xff\xfc\x77\xbf\x56\xee\xb2\x1c\x3a\xf8\x51\x82\x1f\xa5\xda\x82\x1f\x65\x7b\x12\xc1\x8f\xd2\xd4\x82\x1f\x65\xd4\xf8\xc1\x8f\x52\x6f\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\xc1\x8f\x12\xfc\x28\x7d\x3f\xba\x0d\x3f\x4a\xa9\x06\xdd\x87\x1e\x5d\x55\x59\x5d\x9c\xb8\xbd\x50\x8d\x6a\x16\x95\x59\xa1\xfe\x2d\xfb\xaf\x87\x52\xaa\xab\x6a\xf0\x4d\x55\xea\xaa\x82\xbe\x65\xc1\x18\xac\x51\x37\xea\xcf\x85\x86\xbd\x35\xc6\x2d\xa9\xd6\xbf\x73\xe3\x52\x25\x80\xf5\x3e\xc8\xe1\xdc\xa7\xb2\xb8\x3b\x1a\xe7\x50\xe6\xb9\xc4\x64\xcf\xdb\x5a\xf7\xcd\x86\x73\xa1\xeb\x0f\xb9\x66\xd3\xf2\x8d\x22\x40\x18\x4d\xc2\xbe\x9a\xdb\x10\xa0\x7b\x9d\xa5\xb4\x3d\xba\xfc\x9a\x22\xa1\xa3\xc4\x36\xc3\xff\x41\xd6\x66\xcb\x94\xbb\xc3\x12\x53\xd3\x64\xce\xb9\x11\x8f\x04\x77\x59\x1c\x03\x66\x62\x8f\x16\x6b\xe6\x75\x54\x69\x95\x29\x5c\x23\x6a\x54\xe5\x36\x55\x12\x00\xa8\xb6\x37\x62\xba\x9a\x4b\x82\x3b\x23\xb9\xf9\xc5\xf6\x33\x60\x12\x05\xc1\x22\x3c\x59\xb1\xa2\x21\xb4\xfa\x12\x69\xb4\x3a\x59\xa6\x70\x1f\x69\x92\x88\xab\x21\xe7\xd3\x40\x8a\x18\x5d\x1c\xb0\x37\xf6\x5e\x0d\xae\x22\xb8\x11\x2d\xdf\x57\x56\x0f\xa5\x06\x5b\x5b\x28\x35\xf8\x79\x94\x1a\xac\xf8\x41\xab\x35\x07\xbb\x61\x85\x35\x09\xef\xb4\xe6\x20\x21\xff\x74\x17\x6c\x4a\xb0\xce\xcb\x3c\xd1\x2c\x2b\xb3\x8c\x95\xdd\xa1\xc4\xaa\xd4\x0b\x97\x0d\x58\xa7\x5e\x33\x1b\x1a\xad\x3a\x87\xda\xa0\x72\x1c\x0f\xb3\x96\x15\x72\x53\x9b\x31\x87\xf6\x77\x5b\xe8\xcf\xeb\xda\x36\xed\x90\x3d\x74\x36\x55\x2f\xfe\xf7\xc2\x5d\xd5\x5c\xf5\x81\x2b\xb2\x67\x4e\xc7\x64\xed\xbc\xc6\x35\x46\x58\x3b\x56\x7b\x0c\x60\xed\x60\x97\xe0\x05\xd4\x25\xbb\x04\x5e\x9e\xbe\x7b\x6a\x7f\xdf\xcb\xc4\x9b\xf2\x43\x8f\xde\x6f\x22\x61\xf4\xe1\xda\x43\x25\x83\x8d\xf3\xbe\xc7\x08\x3b\x24\x82\x6f\x2a\xa7\xec\xb7\xdd\x32\x41\x8f\x41\x2c\x49\xfb\xf4\xcc\xca\x46\x97\xb2\x40\x67\x2f\x77\x98\x05\x37\x24\xd5\x6a\x98\x55\x7c\x44\x8a\xd5\xd8\x4a\x99\x77\x9b\x5a\x75\xa7\x69\x55\x5f\x4e\x41\xcb\x07\x76\xff\x7d\x01\xd5\x98\x3e\x13\x77\x5f\x28\xc7\xd4\xd4\x1e\xaa\x1c\xd3\x9d\xbb\xf3\xbe\xb8\xaa\x4c\xf7\xea\xbe\xbb\x1f\xd7\xdd\x17\x56\x95\xe9\x41\x5c\x75\x9f\x79\x7d\xa6\xbb\x73\xd1\x85\xe2\x47\x0f\x53\x5f\x72\xa8\x1b\x6e\x3c\x55\x3d\xa8\xfb\xed\x41\x5d\x6f\x0f\xef\x76\x1b\x25\xab\xdc\xd4\xdd\x36\x98\x4c\x6e\xea\x66\x1b\x13\xb2\x3f\x0e\x9f\xef\x2f\x45\xe9\x9e\x63\xf4\x3f\x8f\xd4\xa4\x07\x0a\xcc\x7f\xa8\xa0\xfc\xbb\x0d\xc8\x7f\x80\x54\xa4\x7b\x49\x43\x1a\x7a\xec\x0f\x3a\xec\x6f\xc6\xbb\xc6\x9c\xc8\x23\x53\x8e\x46\xf2\xaf\xfb\x4c\x35\xfa\x1d\xb0\xb0\x51\x29\x46\x81\x8b\x3d\x10\x17\xbb\xbd\x94\xa2\xfb\x4a\x27\xfa\x9d\xf1\xb2\x91\xa9\x43\xb7\x66\xdd\xbe\x9b\x94\xa1\xfb\x4e\x17\xba\x83\x54\xa1\x87\x48\x13\xba\x83\x14\xa1\xe0\x13\xe8\xd9\x82\x4f\xa0\x6f\x0b\x3e\x81\xa6\x16\x7c\x02\x9b\x2d\xf8\x04\x82\x4f\x20\xf8\x04\x82\x4f\x60\x7b\xc0\xe0\x13\x08\x3e\x81\x7e\x2d\xf8\x04\xee\xc7\x27\x30\x34\xed\x66\x1c\x2e\x3f\x4c\xba\xcd\xfd\xa6\xda\xdc\x7e\x9a\xcd\x03\xa6\xd8\xfc\xce\x0c\x2e\x83\xd3\x69\xc6\xa1\xf9\xe7\x92\x46\xf3\x79\xa4\xd0\x3c\x78\xfa\xcc\x4d\x53\x67\x6e\x27\x6d\x66\x00\xb6\x8f\xc4\xf3\x4c\xc4\x47\x5c\xb3\x9b\x5e\x7c\x54\x45\xc0\xa6\xdb\x8f\xe8\xa5\x60\x31\xc9\x72\xed\x2e\x5c\x09\x37\x20\x75\xe2\xc0\xfd\xdc\x80\x54\xdb\xbc\x70\x0d\x52\x5b\xfb\x6c\xae\x41\x6a\xda\xb3\x7b\xbc\x0b\x49\xe5\x73\x2d\x69\xa4\x07\x5d\x88\xe4\x1d\x8e\xe1\x4a\xa4\xad\x16\xae\x44\x0a\x57\x22\x85\x2b\x91\xc2\x95\x48\xa1\x94\x5f\x28\xe5\x57\x6d\x9f\x8d\x1f\x8f\x84\x52\x7e\x03\x3f\x0d\xa5\xfc\xba\x5a\x28\xe5\x17\x4a\xf9\x35\x8d\x1e\x4a\xf9\x85\x52\x7e\xc3\x06\x0e\xa5\xfc\x48\x28\xe5\x17\x4a\xf9\x7d\xc1\xa5\xfc\xc2\x95\x48\x5f\xc4\xbd\x20\xe1\x52\x90\x01\x63\x7f\x5e\x97\x82\x84\x2b\x91\x5a\x07\x09\x57\x22\x05\xd6\x17\xae\x44\xfa\xdd\x72\xbf\x70\x25\x52\x8f\x41\xc2\x95\x48\xe1\x4a\xa4\xd6\x16\xae\x44\x0a\x7e\x14\x12\xfc\x28\xc1\x8f\x32\xf4\xab\xe0\x47\x69\x6e\xc1\x8f\x32\xa4\x05\x3f\x4a\xef\xd1\x83\x1f\x25\xf8\x51\x86\x0d\x1c\xfc\x28\x24\xf8\x51\x82\x1f\xe5\x0b\xf6\xa3\x84\x2b\x91\xc2\x95\x48\xe1\x4a\xa4\x62\xe4\x70\x25\x52\xb8\x12\x09\x5b\xb8\x12\xa9\xc7\x08\xe1\x4a\xa4\x2f\xf5\x4a\xa4\x5a\x5a\xd0\x97\x7b\x2f\xd2\xf0\x65\x84\xcb\x91\xc2\xe5\x48\x0d\x2d\x5c\x8e\x14\x2e\x47\xda\xd5\xc2\xe5\x48\xe1\x72\xa4\x96\x16\x0a\x21\xf6\x6c\xa1\x10\x62\xdf\x16\x0a\x21\x36\xb5\x50\x08\x71\xb3\x85\x42\x88\xa1\x10\x62\x28\x84\x18\x0a\x21\x6e\x0f\x18\x0a\x21\x86\x42\x88\xfd\xda\xc3\x3b\xe0\xfe\xff\x28\x84\x18\x2e\x47\xfa\x2c\x6f\x16\x09\xd7\x8a\x74\xb4\xcf\xe7\x5a\x91\x70\x39\x52\xad\xf3\x70\x39\x52\x60\x61\xe1\x72\xa4\x2f\x8e\x8b\x85\xcb\x91\x76\x74\x1e\x2e\x47\x0a\x97\x23\x85\xcb\x91\x82\x4f\xa0\xb3\x05\x9f\x40\xf0\x09\x54\x5b\xf0\x09\x6c\xb6\xe0\x13\x08\x3e\x81\xe0\x13\x08\x3e\x81\xed\x01\x83\x4f\x20\xf8\x04\xfa\xb5\xe0\x13\x08\x97\x23\x85\xcb\x91\xc2\xe5\x48\xd8\xc2\xe5\x48\xe1\x72\xa4\x70\x39\xd2\xce\x8f\xe1\x1a\x2f\x37\x39\x16\x5c\x03\x6f\xcc\xb9\xe9\x8b\xce\x2f\x6b\xbd\x99\xd3\x75\xc1\x96\xb9\x74\x7a\xff\xf2\xfd\xe9\x31\x89\xa8\xa6\x89\x58\x92\x53\x11\x5b\xd3\x32\x7e\x51\xfc\x9c\x82\xa6\x31\xd5\xb4\xbc\x41\x25\x93\xe2\x92\xc5\xc8\x54\x63\xb8\x26\x2c\xa5\x4b\x30\xcc\xab\x71\x12\xb9\x02\x42\xc9\x15\x24\xc9\xf4\x82\x8b\x2b\x4e\x2e\x41\xaa\x0a\xbb\xfe\x24\xb2\xf4\x13\x51\x20\x2f\xed\x05\x43\x70\x9d\x19\x44\x63\xda\x9e\xfb\x7e\x26\xd5\xe1\xca\x20\xf5\x63\xfb\xf4\x0c\x83\x7a\xdb\xee\xea\x29\xd6\x8e\xcb\x34\x73\x7a\x6a\x04\xfb\xa7\x86\xa8\x73\xe5\x23\xea\x17\x2c\x81\xe9\x9c\x2a\x88\xfd\xb8\xca\xd0\x9a\x90\xb1\x9d\x5b\xae\x59\xc2\x7e\x05\x77\x9a\x00\xd5\xb9\x6c\xcc\x93\xe8\x21\x70\x74\x1b\x42\xa6\x7e\x1e\x2f\x58\x93\x11\xa3\x8f\xc1\x22\xa2\xd1\x0a\x5e\xb0\x56\x15\xbe\x86\x54\xc7\xee\x03\x6f\x92\xd8\x13\x99\x95\x83\xf6\x49\xcc\x24\x32\xa1\x35\x51\x5a\x48\x0f\xb9\x4c\xc2\x34\xa2\x49\x94\x27\xc8\x72\x8e\x4e\x4f\xec\xa0\xdd\xb7\x66\x75\x90\x52\xb9\xfe\x01\x93\xf7\x9f\xf8\xe9\xef\x9e\xf3\xf6\x6e\xa3\x00\x8a\xf6\xc8\x9b\x4c\x3b\x85\x54\xc8\xf5\x39\x95\x4b\xb8\x31\x09\xbf\xa9\xf4\xb5\x49\xc0\x7f\x78\xf5\xee\xcd\xcb\x37\xaf\x4f\xde\x9c\x9c\x3b\xbe\xec\x9d\x61\x9b\xa4\xed\xd4\x56\x6b\x61\x14\x0b\xed\xa6\x48\x12\x96\x32\x5d\x7c\x65\x69\xb0\x59\x65\xb6\x7c\x1b\x13\xe8\x72\xae\x59\x0a\xd6\xf3\x45\xb5\x36\x22\x8d\xa1\x8f\x14\x40\xe3\x35\x5d\x29\xbd\x00\xc3\x5c\xc9\x32\xa7\x92\x72\x0d\xfe\x28\x60\xda\x7e\x14\x0b\xa2\x84\x53\xe4\x99\x2a\xbd\x64\x0a\xb4\x4d\x1b\x3a\x15\xcd\x2c\x05\x7b\x58\xd1\x4b\x7b\x81\xd2\x42\x18\xfe\x6d\x36\x35\x15\x31\x5b\xb0\xc8\x5a\x86\x48\x4a\xe3\x22\xd5\xc5\x29\x16\x20\x8b\xe3\xaf\x5c\x70\x1b\xf5\x6d\x82\x19\xf8\x25\x93\x82\xa3\xc2\x74\x49\x25\xa3\xf3\x04\x0a\xff\x9f\x02\x6d\xc7\x2b\x17\xc4\xc9\x7c\xad\xa1\x99\x2d\xd9\x11\xdc\x6e\xb8\x0b\xb8\x9a\xfb\x7b\xd4\xd8\xcf\x79\x99\x93\x56\x0a\x2b\xe6\x7b\xe6\x92\x15\x62\x50\xcc\x31\x3f\x09\x71\x1e\x79\xd0\x09\x9d\x49\x66\xb5\x3f\x5a\x60\x8c\x63\xc6\x54\x91\x34\x37\x27\xb5\x91\x82\x94\x62\xf3\x04\x26\x46\xd6\x61\xcd\xc9\x34\x65\x1f\x73\x30\x50\xc6\x9e\x50\x02\xb9\x04\x83\x6f\x06\x8f\xad\xa8\x0b\x60\x04\x21\x81\x97\x60\x51\x2b\xce\x78\x97\xa9\x39\x8f\x23\xe7\x30\x3f\x59\x90\xb5\xc8\x65\x8d\xfd\xaf\xa8\xc1\x63\xa4\xde\xc6\x89\xb8\x04\x38\xe4\x41\x13\x12\x83\x51\x1c\x18\x37\x27\xd1\x52\x88\xd8\xe8\x0f\x52\x5c\xb3\x14\x47\x71\x04\x50\xec\xda\x7c\x4d\x62\x91\xcf\x93\x02\x4d\x0c\xcb\x77\xa7\x55\x46\xa3\x0b\x33\x07\xec\xb8\x2d\x75\xf1\x40\xa7\xd9\x01\xbe\xe5\xfe\xeb\xbe\x54\xb3\x9f\x95\xe0\xa5\xd3\xb9\x58\xd6\xac\xd7\xee\x32\x45\xe6\xa0\xf4\x14\x16\x0b\x21\xf5\xdf\xcc\xfe\xe6\x1c\x89\x86\x8b\x02\x80\x1e\x81\x30\xc0\x00\xa1\x8d\x29\x28\x75\xaa\x17\x72\x07\x03\xa9\xa0\x5e\x13\x0b\xcc\x0c\xbd\x4b\x7e\x48\xfe\xcf\xde\xbf\xff\xf8\xdb\x74\xff\xbb\xbd\xbd\x0f\xcf\xa6\x7f\xfd\xf8\xc7\xbd\x7f\xcf\xf0\x1f\x4f\xf7\xbf\xdb\xff\xcd\xff\xf1\xc7\xfd\xfd\xbd\xbd\x0f\x3f\xbc\x79\x75\x7e\xfa\xf2\x23\xdb\xff\xed\x03\xcf\xd3\x0b\xfb\xd7\x6f\x7b\x1f\xe0\xe5\xc7\x9e\x9d\xec\xef\x7f\xf7\x87\x86\x09\x51\xbe\x7e\xb7\x68\x25\xe2\x5e\xd9\xbb\xd3\x3e\xe7\x51\x4d\xa4\x63\x5c\x4f\x85\x9c\xda\x0f\x0e\x89\x96\xf9\x6e\x51\xd6\xc8\xbd\x5d\xae\xe1\xbe\xe7\xc1\xdb\x4a\x5f\x1b\x1e\x23\x77\x85\x9d\x33\x57\x9a\xd9\x14\x9c\x3d\xb3\xd2\xdd\xc2\x6c\xbb\x17\xfb\x9b\x8f\xb8\xb3\x1d\x3d\xa2\x3c\xef\xbe\x7c\xa2\x7c\xe4\xc3\x46\xff\x1b\x49\xb8\x96\xe3\xb7\x8d\xd5\x43\x46\x1a\x66\x82\xe9\xdc\xc2\x4c\x32\x21\x99\x5e\x1f\x27\x54\xa9\xb7\x34\x85\x9b\x6e\xc8\xc9\xa2\x54\xc3\x26\x86\x9e\xcd\xf9\xe3\x0e\x68\x17\x8a\xe2\x86\x6c\x06\xf8\xc9\x02\xf5\x90\x4a\x3f\x1e\xa8\xfe\xdb\x82\x30\x3d\x89\x0b\x49\x7e\x05\x29\xdc\x65\x86\x12\xac\x2e\xd3\x38\x82\xfb\xac\x7d\x1f\x5a\xc0\xa6\x20\xca\x11\x6c\x46\x3e\xba\x36\x1a\xc5\x82\x2d\x6f\x0a\xba\xb3\x5d\x9d\x92\x88\x72\xb3\x50\xbc\xa5\x73\x41\x3e\x25\xb0\xa4\xd1\xfa\x93\x59\xf0\x27\x09\x66\x8a\x46\x07\xfc\x64\x95\x83\x9a\xf8\xef\xa2\x7e\x98\x22\xc0\xf0\xe2\x56\xc6\x7f\xb6\x0a\xa3\xd7\xbe\x1b\x67\x22\xb1\xfe\x40\x26\xe2\x99\xd9\x83\xd9\xc6\x6a\x91\x85\x16\x0f\x0b\x51\xe2\xc3\xd3\x8f\x5b\x6f\x3a\x6b\xa6\x16\x56\xa9\xac\x12\x87\xcc\x91\xeb\xb7\xc9\x35\x1e\x20\xe4\x28\x4e\x19\x9a\x60\xc9\xde\xe9\xd9\xd1\x7e\x6d\xe5\x46\xca\xb1\xe7\x70\x2c\xc0\xc7\xdd\x98\x81\x54\x69\x4c\xc5\x33\x14\x53\x1c\x2d\x09\x63\x8e\xa3\x9f\x8b\x01\x30\xda\x57\x5b\xd2\x7a\xfd\x64\xcf\x8e\xc8\x27\x23\x21\x27\x8c\x83\xdd\x83\x4c\xb2\x4b\x96\xc0\xd2\xcc\xa4\x12\xc8\xe0\x5d\x32\xbb\xf7\x94\x29\x73\x4a\xd5\xd1\x3b\xc5\x1c\x5d\x8b\xd6\x2d\x78\xeb\x0e\x6e\x17\x53\x52\xb1\xee\x3d\x51\x38\x3d\x2f\x13\x97\xf2\x42\xed\x2d\x44\x07\xbe\x10\x32\x32\xa7\xf9\x0e\x38\x6a\x97\xc4\x6e\x40\xd3\x2e\x70\xa2\xf9\xa7\xd0\x22\xa9\x32\xb4\x57\xeb\xf0\x8a\x56\x2a\x05\xcc\xc8\x3b\x83\x84\x57\x4c\xc1\xa4\x90\x7a\x77\x76\xe1\x31\xfc\x8a\x36\xcb\x89\x95\x6e\xcf\xf0\x9f\x6b\xeb\x6d\x72\xe6\x18\x44\x77\x94\xa3\x9a\xe8\x85\x48\x50\x86\x6f\x30\x6e\xbf\x62\xb1\x15\x7d\x40\x4a\x21\x67\x36\x95\xdf\xea\xc1\x22\x89\x5b\x4e\xc9\x42\x1d\x37\x22\x0b\x1a\x9b\x2c\x7e\x71\xe4\x60\x0e\x6d\x76\x83\xb9\x01\x37\xea\xf2\xaa\x16\xc5\x12\x5a\x04\xa2\x37\x02\xf3\xff\x6d\x91\x0d\xb3\x0c\x3a\x17\xb9\xb6\xf8\x60\xd9\xc7\x42\xe4\x3c\x26\x86\x33\x1e\x92\x95\xd6\x99\x3a\x3c\x38\x28\x8f\xee\x19\x13\x07\xb1\x88\xd4\x41\x24\x78\x04\x99\x56\x07\x9e\x90\x0f\x32\x11\x4f\xfd\x1f\x53\xea\xe9\xf0\x60\x2c\xe3\x24\x04\x78\xde\x72\x9b\xe7\x94\xd8\xd5\xb6\xbc\x50\x02\x73\xe7\x4b\x5a\x24\x2e\x62\xb2\xf1\x5c\xac\xdf\xf1\x5a\xbe\x5f\xdc\x41\x5b\x08\xfe\x15\x46\xfa\x44\x55\xbb\x6e\x3f\x39\xda\x2c\xcb\x1d\xb6\xe4\xfe\xa6\xd9\x73\xcf\x4b\x8d\x34\x5c\xae\x02\xa5\x20\xad\x29\x5e\x4f\x6b\xd4\x25\xfb\xc4\xb0\x41\xbe\x26\x86\x55\x6b\x77\x65\xb2\x35\x49\xb6\x69\xf6\x2b\x23\x37\x61\x0d\x8b\x6f\x0a\xb7\xdb\x04\x16\x0b\x88\xf4\xb7\x15\x33\x51\x51\x85\xa1\x70\x6b\x7d\xe3\xff\xf5\x6d\xf3\x29\xdf\xcb\x03\xd5\x2f\xfc\xc4\x4e\xa9\xdd\xf6\x3d\xcc\xe6\xfd\x12\x7b\xdc\x90\x5f\x2c\xf0\xec\x60\xa8\xde\xa3\x6f\xda\x19\x52\xad\x57\xc2\xc9\x85\x49\x52\x7b\xb9\x33\x00\x03\xf9\x4d\xe5\x40\x70\x26\xd8\xd2\x1b\x08\xe4\xad\x70\xe5\x6c\x60\x42\x4e\xf1\xca\xe0\xf2\x17\x3c\x91\xdf\x0a\x5b\xd8\xa6\xa3\x52\x49\x4f\x83\x6d\x67\xfc\xce\x30\x78\xfe\x50\x86\xf3\x58\xc0\xd4\xc2\x79\x4a\xc2\xaa\xfa\xc1\x5a\x01\x7b\x01\xeb\x4e\xa8\xba\xc3\xcf\x85\x12\xa1\x9f\x69\x52\xe2\xa8\xd7\x0c\x6c\xa4\xc4\xdf\x5c\xf5\x03\x91\xce\x19\xb7\x53\xb1\x03\xfb\x7d\xc6\xb1\xfd\x7e\xf0\x18\xff\xec\x9e\x44\x4f\x68\xf7\x8b\x29\x1a\x06\xf2\x77\x03\xe2\x85\x0a\xcf\x73\x17\x48\x77\xc5\x05\x55\x82\x81\x5e\xfe\x92\xd3\x64\x46\x5e\x58\xf1\x1a\x81\x67\x7f\xea\x22\x37\xdb\xc5\x96\x3f\xfe\x8a\x25\x71\x44\x65\x8c\x9a\x95\x65\x3f\x44\x09\x8b\x38\xd4\x4b\x6f\x1d\x7d\x7b\x06\x58\x22\x8f\xbd\xcc\x9b\x64\x54\x6a\x16\xe5\x09\x95\x86\xe1\xc3\x52\xc8\x8e\x78\xf4\x9e\x9b\x59\x62\xf3\x19\x44\x82\xc7\x1d\x9e\xc3\x61\xbb\x7a\xbe\xd9\x79\x75\x7b\x51\x6e\x03\xc9\x5c\x45\x15\x96\xc2\x26\x79\xed\xd5\xb4\xe2\x8e\xb1\xc4\xc2\x33\xbb\x82\xb7\x4c\xac\x70\x65\xc4\xb8\x6a\xe1\x27\xa6\x7c\xb4\xff\x7e\xe5\xc0\x29\xa8\x7d\x46\xfe\xb1\xf6\x3a\x57\x57\x08\x12\xd3\xde\x0f\x85\x66\x1c\x37\x5f\x47\x8a\x6e\x27\x4b\x36\xb2\x10\x12\x2e\x41\x92\xbd\x58\xe0\x37\x58\xc0\x69\x7f\x46\xfe\x65\x94\xc1\x36\x37\x8c\x6d\x1c\x96\xb6\x04\x90\x23\xec\x22\x09\x43\x02\xda\xed\xa9\x22\xcf\xc8\x9e\xad\x0a\xc5\xd2\x14\x62\x46\x35\x24\xeb\x7d\x2f\x7d\x5b\xb3\x5a\x1f\xac\xe9\x53\x2c\xad\x52\x24\xed\xeb\x3f\xb7\xbc\x89\x93\xbd\x4d\xa4\xfa\xc9\x9b\x9b\x4b\xc0\x5a\x49\x7a\x03\x7b\x0a\x2f\x66\x67\x90\x42\x63\x44\xda\xa4\xe4\x35\x15\x51\xd7\xf3\xe6\x02\xb7\x7e\x36\x08\x4a\x89\x84\x25\xd2\xa7\xa5\xb9\x1b\x50\x27\x8b\x76\x97\x7b\xeb\x10\x42\xda\x3d\x52\x53\x62\x74\xc1\xaf\xff\x1c\x53\x4d\x1b\x5e\xb0\x28\xb3\xce\x76\x91\x5a\x97\x6c\x53\x76\xde\xb4\xd7\x3d\x5c\x2f\x6e\xf8\x51\x3d\xa0\x52\xb3\xeb\xcb\x3e\xd8\x75\x82\xb6\x69\x1b\x2b\xe9\xd1\x60\x2a\x61\xc9\x94\x96\xeb\x8a\x03\xc2\xb9\x30\x05\x61\x5c\x69\xca\x35\x43\x56\x4d\xfc\x9b\x53\x67\x7c\xbf\x62\xba\x21\x0c\xf0\x9d\xd1\xdd\xd1\xb4\x8b\x99\x38\xd6\xf8\x71\xbe\xce\x80\xfc\xbd\xf2\xc7\x2b\x99\x45\xbb\xbf\x3f\x59\x10\xc7\x40\x2d\x6e\xd2\x38\x96\xa0\xb6\x39\xdb\xae\xaf\x5b\xc1\xe7\x8d\x55\x63\x21\x78\xea\x8d\x5d\xae\x46\xa0\x52\x6c\x69\x94\x14\x5f\x1f\xd2\xfb\x72\x6a\xca\x8a\xf9\xd5\x0d\x6c\x3d\xb3\x90\x16\x27\x26\xd3\x5e\x1d\x8c\x04\x57\x79\x5a\x5a\x11\x62\xc8\x80\xc7\xc0\xa3\x35\x96\x84\x4a\x2e\xa1\x21\x8c\xe7\x47\xd5\x80\x12\x84\xfc\x2f\xb6\x34\x6a\xb7\x9b\x5c\x55\x72\xf6\xde\xe9\x8d\x99\x32\x65\x00\xbf\x00\x69\x94\x7f\xcc\xdc\x31\x42\xaf\xef\xa1\xe2\x85\x74\x35\xaa\x7c\x50\xe9\xe6\x64\xb1\x50\xe0\xee\xe9\x9e\x17\xd5\x2d\xbd\xbf\xc2\xc3\xd4\x72\x20\x03\x8e\xa5\xb0\xde\xfc\x4c\x28\xe6\xcb\xc1\x15\xe7\x42\xad\x42\xa6\x58\xd8\xfa\x95\xcd\x63\xd5\xb3\xdc\x30\x10\x7b\x63\xd1\x68\x7b\xcb\xb9\xdd\x4c\xa8\x5a\x34\x3d\x2f\x6c\xa8\xc1\x79\xbe\xbd\xd5\x45\x14\x0d\xa6\xc6\xd5\x97\x56\x9e\x65\x92\xf2\x0b\x88\x49\x02\xd7\x2c\x12\x4b\x49\xb3\x15\x8b\xb0\xd8\xa1\x75\xf5\x1a\x8d\x51\xdb\x10\xaa\x66\x0c\x6f\x3a\xbd\xb2\x7c\x9e\x30\xb5\xda\xed\x34\x6c\x25\x0e\x05\x91\x04\xbd\x93\xf3\xf5\xa1\x8d\x33\xfb\x79\x29\xfc\xf8\x80\x77\xd7\xaf\xcb\x17\xb1\xd8\xee\x13\x4b\x69\x14\x19\xc2\xf6\x0e\x50\x70\x92\x60\x85\x88\x1a\x38\x84\xf6\x7e\x26\xd3\xcb\x05\x40\x66\xf1\x19\x03\xd5\x54\x8a\xb6\x45\xc5\x78\x04\x58\xbc\xd1\x15\xe1\x04\xf0\x3e\x00\x2d\x19\x58\x09\x16\xd0\xeb\xe7\x77\x11\xb8\xde\x2d\x71\xb6\x1b\x11\x5a\x0c\x08\xed\x10\x2f\x78\x61\x27\xd0\x2b\x3c\xd4\x0b\x05\xe6\xdf\x06\xbc\xf8\x64\xe8\x66\xdb\x5a\x9d\x67\x36\x14\x7c\x34\x3f\xfc\xb1\xd6\x8b\x8b\xe1\x52\x64\x25\xae\xdc\x00\x9b\x1c\xc3\x59\xe5\x3c\x1a\xc4\x4c\x45\x86\xcd\x34\x18\x8e\x8e\x05\x57\xbe\x36\x27\xe5\xb6\x9c\xe6\x25\x4d\x5c\x82\xac\x1b\x2c\x13\x09\xfa\x41\xe3\xdc\xeb\xab\x36\xf5\x08\xd2\x39\xc4\x31\xc4\x3e\xde\x7d\x4d\x1a\x0e\xfd\x0e\x81\xa3\x4b\x26\xf0\xc7\xe2\xa9\x48\x92\xf6\x33\xbd\xd5\xb0\xd2\xc7\xac\xe2\x01\xd0\x3b\xce\xa4\x43\xcc\x3c\xf1\x00\x65\xaa\xa0\xc8\xd2\x11\x8d\x48\x66\x14\x96\x02\xee\x73\xd0\x57\x00\x9c\x44\x2b\x88\x2e\x54\x19\x63\xa7\x0d\x1d\x6e\x6c\xb4\x8b\xa1\x6a\x17\x10\xab\x1c\xb4\x10\x4c\xcd\x86\xba\x24\x77\x20\xcc\xa8\x85\x1c\xae\x36\x63\xb2\xb6\x0f\x2e\x7a\x49\x59\x42\xe7\x49\x87\xc2\x7c\xb2\x28\xdf\x9c\x54\xe7\xcf\xbc\x74\x94\xe5\x49\xe2\xbc\xd2\x18\xa5\xa2\x25\x5d\x2c\x58\x84\x41\x8a\x18\xa5\x53\x46\xf5\xee\x5c\xfa\xa8\xc8\x1c\xa5\xa9\xce\xb7\xb6\xbe\x05\x6f\xda\xf0\xc5\x68\xa1\xac\xd1\xde\xda\x07\x43\xde\xd7\x35\x58\x33\x3b\xb0\x2a\x7a\xcd\xa1\x35\x23\x6f\x85\x76\xd1\x6e\x6f\x40\x29\x17\x69\x47\xde\x03\x55\x82\x57\x8e\x02\xd4\x3c\x24\x5b\x32\x4e\x77\x57\x29\xb0\xeb\xaf\x5a\xcc\x0b\x45\x93\xae\xb1\x78\x31\x5b\x4a\xaa\x0b\x0e\x5e\x2e\xd1\x1d\x9a\x4e\x2c\x58\xe4\x18\xf1\x46\x8e\xf8\x1a\xd1\xc6\x85\xc0\xed\xb6\xa9\x32\xae\xa5\x88\xf3\x08\x5c\x99\xe6\x5c\x55\x3b\xbe\xd5\x73\xa0\x1e\xfe\xe5\xc7\x28\xd3\x09\x62\xd0\x94\x39\x7f\xb5\xe0\x40\xa8\xca\x8c\x96\xef\xb1\x3d\x97\x12\x4f\x54\xbf\x0f\x78\xd8\x1d\x9d\x9e\x90\xf7\xd0\x86\x74\x9d\x7c\xa7\x2b\xbe\x6f\x4a\x12\xaa\xf4\xb9\xa4\x5c\xe1\x84\xcf\x59\xda\x64\xa2\x30\x9a\x15\x62\x40\xe3\x73\x89\x58\xd1\xf8\xd8\xa2\x40\xe3\xe3\x06\xee\xdd\x87\x73\x6e\xaf\xe1\x36\xac\xfd\xdb\xbd\x96\xe9\x91\x46\x2e\xf1\xb6\x9e\x02\xa3\x0c\x27\x71\x6f\x83\x2b\x65\x6d\xb6\xda\xa1\x3e\xe6\xba\xa0\xba\xdd\xc6\x40\x30\xd0\xa6\xd4\xd2\xaf\xbc\x6f\x30\xe7\x31\xc8\x04\x7d\x6e\xe5\x78\xd1\xca\x08\xc9\xf1\xcc\x29\xff\xb4\xb0\xe3\x60\x98\xab\xf3\x2c\x96\x4e\x03\x1b\x30\xe7\x7b\x34\xd8\xe5\x6a\x88\xdb\x6e\x90\xc9\x46\x11\x64\xba\x9d\xcb\xf6\xb2\xc9\x79\xc3\x8a\x11\x12\xa6\xba\x19\xab\x1c\x4e\xdd\xc6\x7e\xb9\xae\x6c\x4c\xca\x2a\x4f\xa9\x61\x50\x34\xc6\x00\xb9\xe2\x99\xd5\x91\xac\x4e\x63\x29\xd2\x3a\xee\xac\xe3\xc5\x6f\x5f\xe7\x0e\x39\xa6\x45\x8b\x54\xfb\x0e\x6b\x49\x2f\x98\xa5\xf4\xfa\x35\xf0\xa5\x5e\x1d\x92\x3f\x7d\xf5\x3f\xbf\xfe\x4b\xc3\x8b\x62\x6e\x63\xda\x5e\x01\x77\x56\xa2\xdb\x80\xde\x76\xaf\x9b\x66\xce\x99\x0f\xc5\x9e\x2d\xcb\x77\x0a\x87\x42\x89\x95\xe8\x84\x06\xed\xf8\x76\x9e\xb5\x83\xf3\x7b\x4c\x26\x50\x9a\xf2\x08\x26\x46\x1c\xd8\x39\x8c\x51\x65\x2d\x8f\x4c\xd6\xe4\xf9\x57\x13\x0c\xf1\xc4\x49\x59\xea\x9a\x95\x6c\xfd\xc3\xf5\xc7\xd9\x8e\xc5\x30\x45\xfe\x3a\xd9\x98\x29\x53\xc4\xec\xbd\x58\x20\x9a\xb6\x4c\x12\xd5\x3e\x09\x96\x67\x7b\x23\xc0\x36\xcf\x86\x62\x25\x5d\x98\xd0\x65\x9b\xec\x67\x97\x4c\x19\x67\x69\x9e\x1e\x92\x67\x0d\xaf\x58\x8e\x7c\x1b\xe8\x61\x7b\x2a\xcf\x33\x6a\xd8\xf2\x52\xd2\x34\xc5\x8c\x2b\x16\x03\xd7\x6c\xc1\x30\xe6\xa5\x20\x31\xd4\xe3\xed\x87\x3e\x4e\xab\x00\x3e\x86\x70\x19\x36\xda\x8b\xe8\x4e\xed\x39\x2e\x51\x28\x75\x5e\xbb\xa8\xca\x79\xd7\x19\x58\xaa\xb4\x6a\x03\x81\xeb\xcc\x4a\x72\x15\xff\x51\x0a\x94\x33\xbe\x54\x65\xb4\x25\xf2\xbf\x36\xf3\xb8\xf9\xec\x6a\x05\x2e\xba\x01\xaa\xde\x41\x5f\x2a\xc8\x88\x92\x65\x90\x31\x06\x9e\xb7\xb3\x8f\x6d\x5b\xac\x91\xba\x52\x48\x8e\xa9\x82\x1e\x76\xd7\x4a\x2c\xa6\xbf\x56\xa1\x48\x0e\xbe\x35\x06\xf4\xfc\xd9\x57\xad\x78\x57\xbc\xd7\xf8\x52\x19\xa5\xf9\xe1\x68\xfa\x2f\x3a\xfd\xf5\xe3\x9e\xfb\xc7\xb3\xe9\x5f\xff\xef\xe4\xf0\xe3\xd3\xca\x9f\x1f\x9b\x83\x2b\x77\x4b\xce\x65\xab\xe1\xb0\x3b\x6b\xbd\x58\xe5\xf1\x63\xe2\x83\xb9\xce\x65\x0e\x13\xf2\x3d\x4d\x14\x4c\xc8\x8f\x1c\xcf\xc9\x1b\x02\xad\x3d\xba\xc2\x48\x36\x8f\xcd\xa8\x8f\xdb\x5f\xc1\x29\xb5\xbf\xe3\xa6\xdb\xa6\x82\xf6\x03\x92\xb7\x2c\x54\x18\x21\xaf\x60\xa0\xcd\xee\x5a\x08\x31\x83\x6b\x9a\x66\x09\xcc\x22\x91\x1e\x14\xcf\x6f\xf1\x90\x7b\xfe\x75\x0f\xec\xd9\xfb\x60\x71\xe4\xe3\xde\x87\xa9\xfb\xd7\x53\xff\xd3\xfe\x77\x7b\xff\x9e\xb5\x3e\xdf\x7f\x7a\x80\xa1\xbd\x05\xaa\x7d\xfc\x30\x2d\xd1\x6e\xf6\xf1\xe9\xfe\x77\x95\x67\xfb\xbb\x90\x70\x3b\x89\x2a\xa5\xd9\xf4\xa2\xb1\x62\x5c\xa3\x28\xdb\x94\x8d\x95\xd2\x6c\x97\x8a\xb7\x60\xcb\x37\x34\x7b\x0f\x0b\x90\xc0\xa3\x6e\x13\xd2\xf1\xd6\x27\x64\x2f\x36\x47\x38\xe6\xe0\xed\x7b\xe1\x55\x16\x4f\xdd\x41\x56\x7c\xe7\xb9\x7b\x71\xe1\xd1\x66\x4c\x4e\x2d\xd2\x6d\x52\x8a\x92\x3b\x94\xf5\xb2\xd7\xdb\x77\x01\x71\xda\x20\x4e\x4e\xcb\xa8\xbb\x11\x86\x1e\x73\x1c\x59\x83\x57\x9b\x06\xd1\x03\xc9\xfb\xc9\xbe\xbc\x25\xf4\xb7\x73\x90\x62\x9d\xa3\x7b\xf0\xf7\x50\xfc\x64\xed\x2e\xa3\xfb\xc9\x59\xa3\x72\xd9\x57\xba\xf8\xf1\xe4\x85\xc5\x19\x64\x4c\x28\x51\xae\x44\x12\x2b\x92\x73\xf6\x4b\x0e\xe4\xe4\x45\x51\x7d\x88\xf1\x28\xc9\xf1\xde\x9e\x1f\x7f\x3c\x79\xa1\x66\x84\xfc\x03\x22\x6a\xf4\xfa\xab\x96\x10\x4e\x2c\xb5\xf7\xee\xed\xeb\xff\x8d\x16\x00\xfc\xd2\x5d\x9b\xe1\x0a\x8b\x24\x8c\x5a\x8b\x94\x3d\x7c\x4d\xaf\x36\xba\x11\x67\x14\xd1\xac\xd9\xc6\x40\x9c\xdd\x8e\xdb\x20\xdd\x15\x24\x99\xc2\xe4\x23\xa2\x72\xe9\x56\x63\x06\xb4\x59\x10\x98\x86\xee\x1c\xe7\x3e\x9f\x0a\xf3\xd5\x46\xc5\x45\x47\x82\x73\x88\x30\x32\xc1\x08\xa1\x7d\x38\x44\xf5\xfd\x4d\x01\x7f\xa7\x44\xbb\x19\xe0\x5c\x8e\xe9\xf9\x87\x37\x90\xde\x3e\xa1\x1b\x8a\x7c\xe7\x44\x79\x9c\xf1\x08\xaa\x76\xbe\xc5\xd1\xf8\x6d\xe6\xe0\xe0\x76\xe7\x2c\x61\x6b\xbd\xa3\x46\xb4\x46\x4b\x74\x06\xbf\xef\xb0\x5d\xd7\xc3\x32\xb7\x2c\x1b\x1b\xb9\xad\x68\x40\x2d\xfc\xc9\x2b\xaa\xc8\x1c\x80\xa3\x3d\xd7\xda\xed\x80\x3b\x9c\x87\xd2\xda\x9a\x67\x53\x2d\xa6\x0d\xfa\x55\x07\xe4\xba\xa1\xd6\x62\x3e\xa8\xad\xed\x68\xb0\x41\xe0\x6a\xb5\xde\x05\x03\x55\xde\xda\xe3\xa5\xa7\xc1\x5e\xea\x66\xad\xac\x36\x67\x67\x64\x2d\x8e\x6d\xfc\x6b\x7b\x4a\x46\xdd\xae\x19\x9e\xb4\x40\xf7\x62\x8d\x9a\x47\xcc\xd1\x6e\xf3\x19\xc8\x4b\xd6\x43\xf8\x78\x5f\x7f\xbf\x17\x6b\x79\xf5\xfe\xf4\x18\xf3\xf3\xcc\x07\xde\x3f\x81\xd8\x5f\x95\x2a\x6e\xdf\xa3\x13\xd9\x50\xa3\xa3\xbb\x27\xe8\x4c\xc8\xf1\x83\x64\x52\x68\x11\x89\x0e\xa7\x53\x6b\xca\x0c\x82\xb6\x2d\xc7\x68\x48\x1f\x43\xe5\x0d\xcb\xc7\x6a\x59\x69\x4a\x0b\x69\xc8\xb5\xf6\x5b\x3e\x2f\xee\xc4\x2a\x7b\x77\x5a\x1f\xf9\xcf\x7f\x1f\xfd\xbf\x00\x00\x00\xff\xff\x78\xea\x72\xfc\x70\x56\x01\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -105,7 +105,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\x23\xb9\x95\x2f\xf8\xbf\x3f\x05\x42\xf6\xac\xa4\x31\x49\x55\xd9\x63\xef\x4c\xdd\xd9\x71\xe8\xaa\xd4\xdd\xda\xee\x52\x29\x24\xb9\xbc\x8e\x9e\xbe\x36\x98\x79\x48\x62\x94\x09\xe4\x00\x48\xaa\xe8\xdb\xf7\xbb\x6f\xe0\x00\xc8\x07\x1f\x12\x99\x80\x44\x56\x75\xc2\x11\xee\x12\x99\x04\x4e\xe2\x71\x70\x9e\xbf\x43\x0b\xf6\x09\xa4\x62\x82\xbf\x23\xb4\x60\xf0\x59\x03\x37\x7f\xa9\xd1\xc3\xbf\xaa\x11\x13\x67\xf3\xb7\xbf\x7a\x60\x3c\x7d\x47\x2e\x4a\xa5\x45\x7e\x0b\x4a\x94\x32\x81\xf7\x30\x61\x9c\x69\x26\xf8\xaf\x72\xd0\x34\xa5\x9a\xbe\xfb\x15\x21\x94\x73\xa1\xa9\xf9\x58\x99\x3f\x09\x49\x04\xd7\x52\x64\x19\xc8\xe1\x14\xf8\xe8\xa1\x1c\xc3\xb8\x64\x59\x0a\x12\x3b\xf7\x43\xcf\xdf\x8c\xde\xfe\xeb\xe8\xcd\xaf\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x73\x96\x80\x7b\x4c\x8d\x44\x01\x92\x6a\x21\xd5\x28\x11\x12\x84\xf9\x4f\xfe\x2b\x55\x40\x62\x06\x9b\x4a\x51\x16\xef\xc8\xda\x67\x6c\xbf\x9e\x26\xaa\x61\x2a\x24\xf3\x7f\x13\x32\x24\x22\xcb\xf1\xdf\xee\x5d\xed\xf0\x77\x76\x78\x37\x41\xf8\x7d\xc6\x94\xfe\x7e\xf3\x33\x3f\x30\xa5\xf1\xb9\x22\x2b\x25\xcd\x36\xbd\x08\x3e\xa2\x66\x42\xea\xeb\x9a\x2c\x43\x46\xa2\xe6\xcd\x7f\xbb\x07\x19\x9f\x96\x19\x95\x1b\x7a\xfb\x15\x21\x2a\x11\x05\xbc\x23\xd8\x59\x41\x13\x48\x7f\x45\x88\x1f\xcb\x76\x3e\x24\x34\x4d\x71\xbd\x68\x76\x23\x19\xd7\x20\x2f\x44\x56\xe6\xbc\x1a\xdc\x3c\x93\x82\x4a\x24\x2b\x34\xae\xc9\xfd\x0c\x70\xd6\x88\x98\x10\x3d\x03\x72\x71\xf7\xa9\x7a\x94\x90\xff\x52\x82\xdf\x50\x3d\x7b\x47\x46\x66\x01\x46\x29\x53\x45\x46\x17\x86\x84\xc6\x53\x76\x35\xdf\xdb\xef\x1a\x9f\xeb\x85\xa1\x57\x69\xc9\xf8\xf4\xa9\xf1\xdd\x4b\x6c\x47\xc2\xbc\xb1\x4e\xcd\xe1\x3f\xad\x7c\xbe\xed\xf0\xfe\xf5\xa9\x19\x99\xe8\x19\xd5\x44\xcf\x98\x22\x82\x03\x91\x50\x64\x34\x01\xf5\x04\x41\x6b\x1e\xb1\x14\xdd\xae\x7e\xb1\x81\xa4\x66\x97\x9a\xea\x52\x8d\x8a\x19\x55\xab\x53\x7c\xb3\xf4\xe9\x9a\xee\xec\x83\xf3\xb7\x34\x2b\x66\xf4\xad\xfb\x50\x25\x33\xc8\x69\xbd\x07\x44\x01\xfc\xfc\xe6\xea\xd3\xef\xef\x96\xbe\x20\xed\xd9\x59\xbb\xfb\x09\x53\x66\xaa\x90\x51\x10\xcf\x29\x70\xed\x16\x05\x90\xbf\xaf\xfd\xcd\x5d\x01\xc9\xdf\x47\x2b\x94\x8b\xf1\x7f\x41\xa2\x1b\x1f\x4b\xf8\xef\x92\x49\x48\x9b\x14\x99\x09\xf2\xdc\x67\xe9\x63\x33\xff\x8d\x8f\x0a\x69\xd8\x82\x6e\x1c\x79\xdb\x1a\xec\xaf\xf5\xf9\xd2\xdb\xfe\x3c\x5c\xfa\x96\x10\x33\x49\xee\xad\x53\xc3\x0b\x41\xe1\x0e\x75\x7b\x10\x52\x37\xb3\x76\xe7\x32\x65\xb6\x8b\x04\x05\xdc\x72\x47\xdc\x54\xdc\xbd\xe5\x68\xa5\x73\x33\x45\x20\x95\x61\x11\x65\x96\x1a\x26\x3a\x07\xa9\x89\x84\x44\x4c\x39\xfb\x47\xd5\xbb\x22\x5a\xe0\xb0\x19\xd5\xa0\x34\xc1\x73\xcd\x69\x46\xe6\x34\x2b\x61\x40\x28\x4f\x57\xfa\xce\xe9\x82\x48\x30\xe3\x92\x92\x37\x7a\xc4\x9f\xa8\x55\x5a\x3e\x08\x09\x84\xf1\x89\x78\x47\x66\x5a\x17\xea\xdd\xd9\xd9\x94\x69\x7f\x3d\x24\x22\xcf\x4b\xce\xf4\xe2\x0c\x39\x3d\x1b\x97\x86\xf5\x9e\xa5\x30\x87\xec\x4c\xb1\xe9\x90\xca\x64\xc6\x34\x24\xba\x94\x70\x46\x0b\x36\xc4\x97\xe1\x78\x45\x8c\xf2\xf4\xd7\xd2\x6d\x13\xb5\x34\xf0\xda\xf3\x40\x3c\x87\xde\x71\xb1\x0c\xc7\xb6\x9b\xd3\x76\x68\x5f\xb6\x5e\x13\xf3\x91\x99\xc6\xdb\xcb\xbb\x7b\xe2\x29\x72\x47\x1d\x97\xa8\x7e\x74\xcd\x0c\xf9\xd5\x32\x33\xcb\xf8\x04\xa4\xfd\xe5\x44\x8a\x1c\x7b\x05\x9e\x16\x82\x71\x8d\x7f\x24\x19\x03\xae\x89\x2a\xc7\x39\xd3\x0a\xb7\x35\x28\x6d\x16\x72\xb5\xe3\x0b\xbc\x4e\xc9\x18\x48\x59\xa4\x54\x43\xba\xfa\xc8\x15\x27\x17\x34\x87\xec\x82\x2a\x78\xf5\xb5\x33\x6b\xa4\x86\x66\x41\xb6\x5e\xbd\xa6\xb0\xb0\xfa\x83\x95\x53\x4f\x88\xbf\xdd\x77\x59\xee\x8d\x8c\x86\xa4\x90\x64\x54\x5a\x01\x85\x68\xc8\x32\xf2\xf1\x87\x0f\x64\x26\x1e\xcd\x41\x62\x5c\x69\x9a\x65\x78\x30\x9d\x10\xb1\xd2\x35\xde\x01\x09\xe5\x24\xa7\x9c\x4e\x81\xd0\xa2\x50\x64\x22\x24\xa1\x64\xca\xe6\xc0\x3d\x03\x58\x5e\x8b\x8d\xef\xb7\x89\xb3\x11\x7b\x23\xad\xbd\x55\xfd\xb7\x8e\xe0\xa5\x6f\x36\xf1\x3a\xd3\x56\xe4\xb3\xdd\x26\xd6\xb4\xf3\xba\x0b\x3c\x52\x9c\x94\x5c\x69\x59\xe2\x2e\x49\xc9\x03\x2c\xdc\xe9\xca\x69\x41\x94\x16\xe6\xc3\x47\xa6\x67\x84\x36\x4f\x16\xd5\x78\x5c\xc6\xab\xaf\x65\x9a\x02\x4d\xc6\x0b\x62\xa4\x51\x64\x67\x5a\x88\x0c\x79\x1d\xf6\x67\xd8\x1a\x91\xa0\x25\x83\x39\x10\x2a\xc7\x4c\x4b\x2a\x17\xd5\xde\x5a\x3d\x07\x4f\xce\x3f\xce\x4b\x43\x38\xda\x3c\x7b\xe4\xa9\x9d\x4d\xec\x75\xe2\x64\xb3\xb4\x92\x8f\xbb\x4f\xf4\xcd\x95\xdb\xc1\xb5\xb0\xad\xdc\x0e\x06\x45\xcc\x4e\x75\x62\x51\x25\xb5\x23\x01\x6e\x6b\xa6\x44\xc8\x6a\x6f\x91\xf1\x62\xed\x18\x8d\xad\x4e\xc6\x60\xd8\xa0\xa4\xdc\x4c\xfd\xda\x23\xd4\x61\x62\x9f\xda\x8c\xa6\x89\x47\xbe\x6e\xe7\x37\xfb\xa6\x52\xd2\xf5\xd4\x13\xc2\x34\xe4\x1b\x7a\x26\xcb\xd3\xdc\x9c\xcf\xea\x63\x43\xe0\x9c\xa5\x60\x26\x56\x53\x66\x77\x99\xe1\x09\x74\x2c\x4a\x6d\xe7\xd3\x3d\x92\x92\x39\xa3\x84\x4e\xa7\x12\xa6\xb8\xff\x37\x0e\xfb\xcc\x9c\xd8\xb6\xf9\xd8\xd7\x6d\x68\x95\x9a\x27\x9f\x30\xec\xf7\xc9\x07\xf8\x3a\xe6\xd1\x7c\x60\x55\x6e\x6e\xb7\xe7\xd6\xd0\x36\x9a\x98\x39\xf1\x53\x2b\xe4\x93\x0f\x6f\xb3\xb6\xb6\x3d\xb3\xc2\xb6\xb5\xd7\x79\x89\x10\xf7\xed\xd8\x9c\x99\xfa\x02\x30\x9c\x03\x1f\xac\x59\xfa\x18\x48\x01\x72\x22\x64\x6e\x0e\x0f\x27\x94\x24\x56\x94\xad\xf8\x16\x32\x5c\x9e\x3c\x35\x9d\x64\xdb\xf5\xb7\x6d\x9b\x5d\x60\xdb\x90\x14\x54\xcf\x9e\x79\x6c\xbb\xa5\xb2\xad\x39\x69\xcf\x3e\xfc\x0c\xe3\x5b\xe9\xbb\xbe\xb7\xa2\xf7\x6d\xa6\x21\x7a\xa7\x78\x65\x6d\xd3\xeb\x36\x9c\x7b\xb9\xdd\xd2\xc7\x0f\xa0\x94\x91\x17\x50\x08\x95\xf4\x91\x00\x4f\x84\xe1\x29\xff\xef\xdd\xc7\x6b\x3b\xfa\x3a\xee\xba\xda\xae\x34\x61\x79\x91\x41\x6e\x64\x51\xf2\xe3\x07\x2a\xd5\x8c\x66\x20\x7f\xc2\x5b\xf1\xc7\x3f\xf3\xbc\xfd\x49\x42\x37\x1f\xec\x66\x33\x42\xa6\x82\xd4\xb0\xbf\x14\x32\xba\xb0\x84\xa5\x90\x88\xd4\x5c\x0b\x42\x92\xc2\x28\x0b\x79\x51\x6a\x20\xd4\x7e\x8b\xef\xc0\xf8\x74\x1b\xca\x77\x5a\x0d\x62\x44\xaa\x9c\xea\x77\x64\xbc\xd0\xcf\x9d\x36\x42\x3e\x0f\xd3\x6d\xd9\x4e\x93\x98\xe7\x99\x8f\x6d\x5b\xb1\xa0\x66\xc7\xcf\xbe\xa5\x91\xb7\x29\xe3\x20\x6f\x84\xd4\xdb\xf0\x49\xa3\xd8\x4d\x61\x55\x1c\x6d\x36\x3f\x65\x8c\xeb\xdf\xff\xee\x89\x27\x53\x28\x32\xb1\x30\xfb\xe7\xf9\xe3\xb9\xe5\xfb\x6c\xcd\x4a\xb6\xed\x6f\x5b\xf6\xb1\x65\x7f\xd6\x34\x18\xa3\xa7\x75\xda\x67\xa7\x8e\x78\xac\x77\xab\x14\xe8\xbd\xdd\xb7\x37\x57\xde\xd6\x73\x0b\x13\x90\xc0\x13\xcf\xe7\xaa\x3f\xb5\x20\x94\x7c\x5f\x8e\x41\x72\xd0\xa0\x1a\x9a\xc0\xa2\x00\x6f\x58\x03\xfb\x03\x09\x92\x94\x9a\x65\xec\x1f\xeb\xcc\x11\xeb\xde\x2a\xfa\x4d\xfb\x8c\x4c\xe5\x1f\x7b\x46\xb2\xf2\x8f\x3d\x27\x5f\xd9\xb6\xcb\xd5\xfd\xfc\x2e\xb4\xad\xb5\x4e\x68\x04\x71\x1a\x43\xb5\x32\x69\x7b\x29\xa2\x73\xf2\xe7\xb7\xf9\x1a\x4a\x6f\xd0\x78\xde\x32\x3e\x6f\x22\x98\x9c\x6c\xf2\x4b\x8c\x8c\xc2\x3f\x42\x93\xf8\x8f\x3f\x8d\x6c\x97\xa7\x23\x72\x99\x17\x7a\xe1\xcd\x40\xec\x99\xce\x99\x22\x5c\xe8\x55\x41\x30\xfa\x34\xcd\xd7\x1b\x21\x9f\x9d\xa9\xf3\x9b\x2b\x6f\xde\x7e\xc5\xa5\x55\x05\x24\x07\x20\xe8\xdf\xb5\xc8\x68\x89\xf9\x13\x06\x59\x4a\x98\x91\xe1\x0d\xb1\x64\x9c\x89\xe4\xc1\x59\xf2\x6f\xdf\x13\x25\x2c\xcf\x31\x8a\x9e\x91\xfc\x13\xc1\x55\x99\x03\x61\xcf\x31\x91\x5e\xb2\xef\x25\xfb\x66\xeb\x25\xfb\x5e\xb2\x6f\x35\xeb\xa4\x3b\x04\xe6\xb8\x44\xc8\x46\xf6\x88\xcf\xf5\x0c\xf2\xa9\xd6\x33\x48\x6c\x3d\x83\xec\x19\xe4\x73\x1d\x3f\xfb\x96\x5b\x49\xba\xcf\xf6\xf5\x1c\xef\xe8\x3d\x07\xbd\xe7\xa0\xf7\x1c\xb8\xd6\x5f\x9f\xae\xf5\xd7\x67\x7f\x7d\xb6\xdb\x17\x77\x7d\xf6\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\x41\xb3\xf5\x9e\x83\xde\x73\xd0\x7b\x0e\x7a\xcf\xc1\x86\xd6\x4b\xf6\x1d\x3b\xed\x25\xfb\x5e\xb2\xdf\xd4\x7a\xcf\x41\xef\x39\xe8\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\xe7\x20\xc9\x80\xf2\xf5\xea\xfc\x52\x72\x23\x3e\x87\x02\x20\x9b\x30\x97\xda\xe7\x7e\x4d\xc6\x30\xa3\x73\x26\x4a\x49\x1e\x67\xc0\x7d\x5e\x2a\x99\x82\x56\x66\x17\x80\x86\x75\x1a\xe0\x33\xec\xed\x69\x96\x36\x24\xc0\xe9\x38\x5b\xdb\xf1\x73\xdc\xcb\xfd\xf2\x69\x4f\xc9\x58\x08\xf3\x76\xab\x33\x86\xda\x8b\xd7\x06\x22\x24\xb5\x6c\xd2\xb9\xd6\x27\xb6\x5c\xdc\xbe\x7f\xd1\x74\x96\xb5\x9d\x5c\x55\x63\x13\x74\xe1\x60\xda\x9f\xb9\xf2\xcc\xa7\x1f\x1f\x39\xa4\x98\x05\x3e\x20\x4c\x9b\x07\x0c\x63\x61\x09\xd3\xd9\xa2\x22\xef\xcb\xce\x93\xb9\xb8\x7d\xbf\xbd\x9b\xcb\xaf\xd2\xc6\xae\x23\x7a\xb4\x7a\x7f\x55\xef\xaf\xaa\x5a\x2f\xb4\x75\xec\xb4\x17\xda\x7a\xa1\x6d\x53\x8b\x2f\xb4\x1d\xba\x7f\xa7\xf7\xca\x90\xde\x2b\xe3\x1f\xeb\xbd\x32\xcf\x3e\xde\x7b\x65\x7a\xaf\x4c\xef\x95\x79\xba\xf5\xf2\xab\x6b\xbd\xfc\xda\xcb\xaf\xed\xf6\xc5\xc9\xaf\xbd\x57\xa6\x67\x90\x3d\x83\xac\x5b\xcf\x20\x7b\x06\xd9\x6a\x5f\x62\x3e\x47\x6f\xe1\xee\x2d\xdc\xbd\x85\xbb\xbf\x00\xfb\x0b\xb0\xbf\x00\x9f\xeb\xb8\xb7\x70\xfb\xd6\x5b\xb8\x7b\x0b\x77\xab\xf5\x16\xee\xde\xc2\xdd\x5b\xb8\x7b\x0b\xf7\x86\xd6\xcb\xaf\x1d\x3b\xed\xe5\xd7\x5e\x7e\xdd\xd4\x7a\x0b\x77\x6f\xe1\xee\x19\x64\xcf\x20\x7b\x06\xb9\xa1\x1d\xa2\x85\xfb\x99\xc3\xbb\xcd\x2e\x6d\xda\xab\x9d\xd8\xec\x23\xdd\x47\xe4\x82\x72\xc2\x78\x92\x95\x29\xe0\x37\x13\xa0\xba\x94\xa0\x06\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x98\x50\x05\xca\xf5\xb1\x76\xa8\xaa\xdf\x35\xdf\x3e\xfd\x9a\x4f\xf3\x91\x27\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x99\x0c\x96\x6c\x31\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7d\xed\x4d\x5b\xf0\x89\x2d\xf7\xec\xe5\xf2\xdc\x95\x32\x24\x63\xaa\xe0\x8f\xff\xb2\x52\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\xb5\x4f\x3c\x7f\xcd\xd4\x43\x6c\xde\xe4\x5b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\x95\xed\xe3\x4e\x4b\xaa\x61\xba\x68\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x43\x09\x33\xaf\x81\xae\x1d\xe2\x71\x06\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x97\xff\xe3\xc7\x59\xf3\xf5\x73\xeb\xbb\xae\x82\x92\x6f\xdb\x5e\x90\x7e\x3e\xdf\x5b\x0f\xd9\xfb\x0a\x08\x66\x79\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xec\x7f\x69\xd9\x36\xdd\x51\x5b\xc8\x6a\xcf\xcb\x68\xc3\x06\x8e\xcd\x26\xaf\xde\x36\xa2\x99\x2b\xc6\x78\x03\x32\x67\x4a\x6d\x4a\x8a\x6a\x93\xfe\xdc\x2d\xb6\xc5\xed\xb5\x24\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x4c\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xed\xf6\xde\xe2\xee\xdb\x42\x82\xde\x56\x7e\x1e\x5a\x3a\x9f\x7d\xca\xbd\xc3\xb9\x7d\x85\xb5\x45\xb2\x9a\x6d\x7b\x79\x1b\x87\x7f\x5e\x88\xd8\x45\x32\xd9\x5a\x2e\xe9\x22\xb3\xde\x88\x8c\x25\x8b\xdb\x32\x03\x32\x13\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x01\x19\x97\x9a\xa4\x02\xac\xd9\xd0\xa1\x4b\x35\x7f\xbe\xd5\xf8\xd6\x53\xfe\x38\xb3\xc5\x08\x4d\xc7\x84\x16\x45\x86\x99\x93\xc2\x08\x1e\x8f\x33\x96\xcc\x6c\x0d\xd6\x82\x26\xb0\xee\xb1\xed\xe5\xd2\xad\x74\x35\xb2\x93\xbe\x46\xbc\xd9\x7b\xfc\xdc\xae\x23\x3b\x2a\x6e\xc4\x96\x05\xfb\x56\x8a\xb2\xd8\xf2\xf1\x6e\x7b\x80\xd8\x92\x61\x76\x20\x73\x1d\xe9\x25\x11\xcb\x7f\xe9\x9c\xe4\x76\xa9\x95\xb3\xc0\x3a\x8f\xcc\x08\xd3\x1f\xf3\x32\xd3\xac\xc8\xf0\x27\x16\x01\x4b\x11\x2a\xa1\xbe\xe0\x06\x84\xf2\x85\xf7\xb9\xbb\x12\x86\x90\x12\x3a\x35\x3d\x6a\x2c\x8f\x2a\x26\x5b\x53\x6d\x6b\x24\x96\xb9\x91\xbf\x1a\x36\x60\x85\xea\x3e\x5f\xd4\x54\x90\x47\x96\x65\x46\xf9\xa1\x59\x26\x1e\x21\x1d\x91\xa3\xa3\xe5\x0b\x28\x11\xb2\x41\x37\xb2\xba\xa3\x7f\x6e\x3d\x65\xf8\x5a\xfd\x62\xdb\x29\x72\xbb\x6a\x21\x64\x37\x4d\x84\xec\xae\x73\x11\x54\xa5\x1e\x2a\x07\xd5\x30\x63\x4a\x0f\x1d\x95\x5a\xe4\x2c\xd9\xaa\x13\x2e\xb8\x77\x44\xfc\xf9\xf6\x87\x17\xdf\xa0\xd7\xed\xe1\x5c\x4d\x4e\xd0\x66\x8f\x16\x54\x6a\x46\x33\x52\xca\x4c\xd9\x3d\x4a\x8d\xc2\x22\x7d\x15\xd4\x19\xc5\x38\x8f\x04\x14\xb2\x0b\x42\xfe\xd9\xee\x4a\xb7\x19\x2c\x2b\x13\x3c\x5b\x10\x6a\xb7\xc2\xa4\xcc\xb2\x01\x99\x30\x4e\xcd\x45\x06\x85\xcf\xe1\xdd\xc2\x34\x53\xb7\x3b\xc6\x13\x30\xd3\x34\xac\x7c\x13\x48\xb9\x19\xd9\xb0\xcc\x8a\xa7\xa5\x03\x57\xf6\xd3\x5a\xaa\x94\x23\xc5\xf0\xb7\x84\x8e\x33\x40\x4d\xc3\xc9\x9c\xb7\x22\x43\x97\x62\xe5\xf7\xc0\x5a\xa1\xb4\xf9\xf5\xff\x64\x7c\x5b\x6d\xdd\xb6\x5b\xbc\xda\x13\xca\x09\x30\x3d\x03\x89\x43\x2f\x0c\xff\x35\x9b\xbd\x3e\x54\x27\xaa\x4c\x66\x66\x8a\x8e\x0a\x91\xaa\x23\xc3\x9d\x8f\x14\x24\x12\xb4\x3a\x3a\x35\x7f\x2d\xbf\x2b\xce\x57\xf3\x77\x67\xb4\x60\x47\xa7\x03\x82\x13\x8e\x05\x4a\x85\x9e\xfd\xc2\xcf\x91\x9f\xb0\x56\x3d\xef\xe7\x5a\xeb\x14\xdd\x36\x7b\x70\x95\x35\x45\x61\x8b\x52\x9a\xfb\x53\x03\xa6\x9d\x9b\x93\x82\x7b\xae\xe1\x83\x5e\xba\x48\x09\x39\xe7\x04\xac\xd7\x10\x34\xc9\x81\x72\xf7\x34\xcc\x41\x2e\xf4\x0c\x1d\x89\xaa\xe2\xa2\xfd\xca\x6d\x11\x8d\x50\xb7\xb5\xab\xe6\x58\x99\x5f\xa1\xfa\xb8\xd9\xe2\xcf\xcb\x2b\x74\xfc\xcf\xc7\xcb\x57\x52\x7d\x07\xff\xb2\xd7\x03\x85\xb0\x4e\x6b\xf1\xc9\xfc\xb2\xbd\x0e\xf6\x23\x7b\x99\x54\xec\xf0\x87\x1f\x6c\xb1\x67\x37\xe1\xdf\x33\x9e\xaa\x0a\x58\x35\xb5\xb7\x84\x5b\xb4\xb5\x2b\x85\x14\xfe\x62\x57\x69\x55\xe9\xda\x56\x51\x7a\x86\xc6\x86\x56\x7e\x08\x8a\x34\xd6\x8b\x6e\x49\xc9\x86\xed\x0e\xac\x77\xde\x88\x95\x19\x1d\x43\xa6\x9c\x01\x11\x1a\xe4\x93\xf3\x1f\x3e\x54\xa5\xdb\x25\xd0\x67\x8c\xe2\x2f\xa0\x3e\x6f\x11\xe6\xb3\x52\x22\x7f\xb5\x6d\xaf\xe6\xe0\x54\xec\xe6\xc4\x22\x77\xa0\xed\x59\xcd\x69\x61\x8e\xaa\xed\xc3\x3a\x57\x96\x1c\x27\x3f\xe0\x4c\x3f\x7f\xe2\x76\x52\x0f\xb7\x2f\xf9\xbc\x6e\x90\xad\xce\xdb\x76\xa1\x44\x3b\x74\xf8\x94\x29\xaf\x6e\xad\x69\x5e\xda\xd0\x4e\x2f\x74\x9a\x5c\x42\x9b\x0e\x85\x14\x94\x05\xd7\xb1\x00\x47\xd2\x7f\x5e\x77\x11\x79\x09\x76\xd1\xcf\x87\x44\x41\x06\xc9\xba\x9a\xec\xeb\x1e\xd6\x90\x17\xd9\x73\x27\x8f\xec\xac\xcb\xe7\x8c\xdf\x02\x4d\x17\x77\x90\x08\x9e\x6e\xc9\xa5\xbb\x29\x4b\x1f\x18\x67\x79\x99\x13\x5e\xe6\x63\xc0\xb5\x50\x76\x50\xe4\x38\xd6\xa0\x42\x09\x87\xc7\x6c\xe1\xb8\x4c\x4a\x0a\x91\x7a\xc6\x33\x36\x5a\x3d\x4d\xb7\xbd\x74\x1e\x99\x9e\x61\xd9\x0a\xbe\x30\x43\x31\x5d\xdf\x88\x92\x24\x92\x2a\x23\x34\x0e\x70\x68\xa6\xcd\x2d\x3a\x06\x74\xb1\xb3\x14\xcc\x96\xa1\x73\xca\x32\xa3\xe5\x6c\x7b\x2d\xbe\x87\x09\x2d\x33\x8d\xf6\xa1\x37\xe4\xc4\x10\xee\x95\xfb\x75\xdd\x1a\xbd\x43\x09\xc1\xcd\x7f\x2d\xec\x12\xbe\xdc\xe9\x0e\x7e\xbe\x6d\x80\xd0\x7d\xdb\x16\x10\xdd\xb7\x82\x96\x6a\x5b\x33\x53\x6b\x37\x5c\xf1\xd4\x1c\xc2\xa6\x34\xdf\xb8\x47\x98\x72\x3d\x6f\x37\xab\x4f\x43\x79\xad\xa1\x5a\x8a\xa9\x04\xa5\xde\x03\x4d\x33\xc6\xe1\x15\x36\xf5\xfd\x0c\x48\x4e\x3f\xe3\xc6\xd6\x2c\x07\x23\x6c\x35\xb7\x35\x6d\xbe\xbe\x16\x24\xa7\x0f\x50\xd1\x49\xc6\x30\x11\x72\x8b\x90\x0e\xdf\x98\x6a\x6e\x26\xbb\x69\x27\x94\x65\x90\x8e\x90\x92\xc6\x58\x66\xb3\x4b\x91\x65\x20\xed\x3e\x34\x7f\x33\x5e\x02\xd1\x62\xcb\xc1\x0a\x29\xd0\x34\x61\x07\x68\x4a\x33\x28\x2d\x50\xd3\xa5\xbd\x71\xf0\xb0\x11\x4a\x6e\x96\xe6\xff\xf2\x73\x82\x46\xf8\x2d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x84\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x91\x6b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x5b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xfd\xde\x6d\x9d\xf5\x3f\xbe\x79\xb3\xa5\xe8\xfc\xf2\xa7\x56\x02\xda\x66\x5e\x74\xc3\x5f\x57\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xb4\x64\x6a\x46\xc6\xa0\x1f\x01\x38\x81\xcf\x16\x5e\x6e\xcb\xf1\xfe\x01\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xf6\x70\x16\x60\xce\x14\x13\xfc\x3b\xa6\xb4\x90\x8b\x1f\x58\xce\x9e\xa9\x69\xe1\x5b\x77\xee\x53\x5f\xa7\x22\x4b\xc9\xad\xdd\x02\x77\x60\x67\x46\x02\xba\x3f\xb4\xb0\xb6\x11\x62\x38\xc2\x98\x26\x0f\xdb\xde\x6a\x3b\xaf\xea\xa6\xf5\xea\x70\x8b\xbe\x7d\x73\x28\xcb\xea\x05\xb5\x97\x5c\x4a\x54\x09\xaa\x91\xf0\xee\xb0\x07\xeb\xf2\xb3\x9d\xee\xd6\xd2\x3e\xce\x84\x02\x7c\x80\x50\xf9\xbc\x4c\xd8\x7c\x0d\xef\x13\x65\xaa\xe2\xb4\x18\xaf\xc2\x41\x11\x3a\x99\xb4\x9f\x48\x77\x90\x94\x6d\xbb\xd2\x24\x2f\x95\x26\x39\xd5\xc9\xcc\x5a\xa7\x45\x5a\x49\xaf\xc7\xca\x69\x99\xbb\x2c\xed\xd6\xee\xb1\xdd\x1d\x59\xc4\xd2\x79\xf9\xb9\x30\x97\xc7\x73\x2e\xef\x76\x6b\xad\xf3\x72\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\x3f\xbf\x7e\xbf\xfd\xa9\xe9\x62\x94\xd9\xd9\x2c\xd3\xdd\x47\x62\xda\xf9\x13\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x35\x20\x94\x3c\xc0\x62\x60\x25\x8f\x06\x28\xaa\x79\x78\x27\x42\x24\x64\x4e\x3c\x05\xd3\x23\x76\x68\xc7\xd8\x7e\xb6\x3b\x6c\x4c\x3f\xf8\x2e\xfe\x5b\xdf\x86\x86\xd0\x1d\x7f\xe1\x27\x68\x87\x9f\xed\x7e\x76\x6c\x7b\x80\xc5\x6e\x3f\x58\xda\x49\x66\x15\x9c\x16\x6f\xf7\x88\xf9\xa0\xd2\x1e\xaa\x6d\xb1\x9b\x63\xbd\xd9\x3a\x18\x14\x6d\xf3\x93\x18\xf4\x7a\x3b\x1e\x94\xe6\xb8\x2d\x3b\xad\x99\x96\x63\x65\xf7\xaf\xe1\x30\x33\x56\xd8\x9c\x3e\xe7\x6d\xdc\x7d\x13\xdb\xf6\x89\x66\x2c\xad\x86\xb4\xdc\xe7\x8a\x0f\x8c\x6c\x6d\xfe\x83\xd7\x8f\x95\xf8\xdf\x0b\x50\xd7\x42\xe3\x27\xaf\xb6\x06\xf6\xb5\x5e\x7b\x05\xec\xa8\xce\x69\x85\x6c\x15\xed\x15\x36\x65\xcd\xcd\xb4\xc7\x55\xae\x23\x3d\x15\xb9\xe2\x44\x48\x37\x75\x3b\x0f\x6a\x3a\x73\x03\xdb\x21\xf1\x22\x1d\x5b\x67\x2d\xba\xbf\xd6\x8e\xe9\x56\x48\xc8\xd6\x02\x45\x1c\xde\x0d\x8d\xb2\xa0\xfd\x06\xcd\x15\x45\x86\xda\x99\x53\x9a\xa8\x0f\xad\xda\xd2\x2b\xd2\x6c\x39\xc8\x29\x7a\xb1\x93\xad\xbd\xae\x15\xd1\x1d\x2e\x3e\xdb\x76\xbe\xfe\x9a\x03\x76\xd8\xc8\x51\x7c\x49\xd1\xba\x41\x79\xc5\x9a\xa1\x3b\x4a\x3c\x3b\x9d\xaa\xc6\x70\x2d\x1b\xf9\xff\x36\x97\x3a\x6e\xba\xff\x43\x0a\xca\xa4\x1a\x91\x73\xa2\x18\x9f\x66\xd0\xfa\xce\x99\x00\x1a\xdd\xec\x34\x78\x61\x06\x35\x77\xef\x9c\x66\xce\x10\x43\x39\x01\x6b\x8e\x37\x74\x2c\x8b\x6f\x03\x27\x61\x9b\xab\xa8\x8a\x7f\x38\x7a\x80\xc5\xd1\x60\x63\x98\xf9\xfa\xd6\x3c\xa9\x47\x57\xfc\xc8\x8a\x30\x2b\x67\xad\x92\x77\x30\xc8\xe2\x08\xbf\x3b\x8a\x29\x1b\xee\x28\xab\x74\x75\x26\xb4\x07\xdd\xe1\x98\xb4\x76\x75\x4e\x8b\x5d\x37\xb5\x0f\xec\xec\xa0\xa3\xdd\x2f\x1b\x97\x5c\x04\xb4\x16\xa4\x54\x60\xd5\x68\x64\x76\x04\xbc\x2e\x86\x9a\x17\x5a\xbd\x38\x3c\xa2\xee\x74\x30\x0a\x8d\x51\xf1\x19\x9f\xfe\xb9\x48\xa9\xde\x2a\xa7\xc8\xb6\xee\x67\xfb\xd6\x0e\x48\x4a\x1c\xd1\xec\xe4\x09\x9b\x92\x82\x4a\x9a\xab\x11\xb9\x71\xe5\x06\x70\x5f\xb3\x49\xd3\x7d\xe3\xe6\xf9\x7e\x51\x00\xf9\x7f\x76\x1f\xd0\xbe\xe1\x0b\x9f\x83\x6e\x42\x71\x4e\x3f\xdf\x95\x72\xba\xc3\xf4\x93\x60\xa1\xa5\x69\x89\xae\x6d\x42\xb8\x51\x9b\x20\x42\x2a\x99\x41\x5a\x66\x90\x12\x3a\x16\x73\x68\xf9\xc9\xaa\x9f\xed\x38\x34\x1a\x2a\x76\xfc\xcd\x27\xc3\xe1\x3c\x51\x46\xc8\x1a\x2b\x91\x95\xba\xb2\x67\x9d\xc0\xe7\x77\xe4\x0f\x18\xbf\x45\x49\x01\x32\x01\xae\xe9\x14\x96\x0d\x8f\xf6\xb9\xb7\x6f\xfe\xe9\x74\x57\x02\x50\x9c\x31\xe3\x3b\x33\xf0\x1b\xb3\x3b\x3f\xd0\xcf\x7f\xe6\xb5\x93\x86\x29\xb2\xa5\x11\xaa\x6e\xe7\x4b\x2f\x82\xa3\x64\x49\x99\xa1\x89\x19\xe3\xe2\x1a\xaf\x33\x5e\x10\x29\x4a\x8c\x8c\x23\x65\xb1\xeb\x58\x4d\x73\xd9\xef\xfe\xf0\x4f\xbb\xfe\xfc\xf2\x33\xcd\x8b\x0c\xde\xf9\xba\x2f\xd6\xd6\x67\xf4\x09\x2d\xc8\xef\xdf\xfc\xd3\xc0\x46\x09\xc0\x63\xc3\xf6\x54\xef\x23\x6a\x36\x51\x59\x10\x96\xdb\x3c\x19\xc8\x16\xd8\xd1\xae\x12\x9c\xb9\xe2\xda\x2c\x44\x69\x2a\xb5\x1a\x10\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x96\xcc\x9d\x68\x68\x84\x47\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x91\x8a\xb7\xbf\x7f\xf3\x4f\xab\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x31\x00\x27\x0f\x2c\xcb\x20\xdd\x55\xc4\x7e\x6e\x22\x27\xa5\xd4\x33\x90\x03\x02\x5c\x79\x4f\x84\x79\xf7\xa5\xf7\x46\x5a\x64\xc9\xf9\xee\x12\x28\xb5\xfe\x50\x74\x6e\x34\x9c\x1d\x6e\xda\x8d\x60\xa6\x49\x2e\x94\x5e\x3f\x1d\x3b\x0d\x46\xf9\xe2\xe3\x64\x57\xf1\x7a\xd8\xc1\x98\xbb\xfa\xeb\x0e\xc2\x79\x4b\xfa\x60\x5c\x0f\x85\x1c\xda\x6e\xde\x11\x2d\xcb\x5d\x04\xbe\xbc\xc5\x42\x0e\xf0\x06\x28\x1b\x0c\x6e\x65\x13\x7c\x71\x6c\xbc\x3b\xbb\x4d\xc5\x23\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x15\x16\xde\xf6\x0c\x2d\x71\x1e\x33\x0f\xe6\xe9\xff\x7b\xf5\xc8\xef\xaa\x52\x2f\xdd\x04\x9b\x79\xbb\x63\xad\x15\xeb\x36\x6a\x0d\x06\x40\x0c\x96\x68\xdd\x91\x82\x35\x6f\x56\x71\xd5\x89\xb0\xe1\xc1\x66\x13\x98\x07\x2c\x51\x6b\xae\xb8\x9a\x01\xef\x7c\x95\x6d\xb8\xaa\xec\x3b\xd6\xb1\x1f\x1a\xc3\x2e\x0d\x1b\x56\x9b\xf8\xf0\x8e\x43\x67\x40\x95\x5e\xb7\x84\x3d\xd7\x7e\xb6\x3d\x9d\xe1\xbb\xdc\xda\xaa\xa3\xd1\x5d\x70\xc6\x2b\x3f\x19\x26\xaf\x8f\x81\x1c\xdd\x82\x8d\x62\xb2\x19\x09\x2d\xa5\xe5\xa8\xf2\x5f\x9b\xc5\x0e\xd2\x67\xb6\x9e\x36\xef\x82\x7b\x51\x7f\xb4\x1b\xa3\x91\x9d\xe7\x3c\x80\xee\x0a\xaa\x42\xa2\x6c\x7c\xd7\xf6\x6e\x68\x70\xd9\x27\xee\x08\xfb\x97\x19\xa9\x02\x92\x91\x04\xe4\x2a\x36\x69\xd0\xda\x55\xd0\xdc\x72\x9e\x3d\xd2\x85\x3a\x3a\x18\xd5\x3c\x07\x4d\x9f\x4e\x4a\x5f\x6e\xdd\x05\x82\x3b\x4d\x79\x4a\x65\xea\xde\xe8\x58\x55\xa3\xef\xc2\x11\x3e\x60\x78\x12\x9f\x88\x77\x64\xa6\x75\xa1\xde\x9d\x9d\x4d\x99\x1e\x3d\xfc\xab\x1a\x31\x71\x96\x88\x3c\x2f\x39\xd3\x8b\x33\x8c\x36\x62\xe3\x52\x0b\xa9\xce\x52\x98\x43\x76\xa6\xd8\x74\x48\x65\x32\x63\x1a\x12\x5d\x4a\x38\xa3\x05\x1b\x26\x82\xcf\x81\xa3\xff\x62\x94\xa7\xbf\xf6\x24\xbd\xac\x0e\xdf\x62\x13\xe8\x50\x91\x73\x18\x96\xfc\x81\x8b\x47\x3e\x44\xf3\x9e\xda\x89\x61\x6c\x17\xb5\xea\x5b\xc0\x1a\xee\x12\xd4\x5a\x88\x1d\x6c\x82\x2f\xbe\xb2\x66\x8a\x86\x94\xa7\x43\x1b\xaa\xf5\xb2\x0b\xdc\xc5\xad\x3a\xac\xc3\x41\xb7\xa7\xae\x9b\x35\x88\x26\x9a\xcd\xa1\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x02\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\xce\x77\x08\x1d\xf4\xed\xce\xb0\xe5\x7b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x94\x86\xdc\x5e\x05\x76\xb4\x6c\x41\xb4\x5c\xd8\xf0\x48\xf9\x40\x98\xf6\x31\x87\x46\xbd\x7f\xc0\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5b\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xff\x65\x97\x7d\x34\x41\x60\xcd\x1d\xbd\xed\xed\xf0\xdc\x49\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8c\x25\xb1\xbe\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x9e\x77\x9a\x14\xb2\x9a\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x8e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x51\xdf\xb8\xab\xde\xeb\x6a\xca\x45\xf5\xf1\xe5\x67\x48\xca\x6d\x31\xd9\x56\x5b\xa8\xdb\xdd\x36\x23\xed\x79\x33\xb5\x8b\x5e\xb6\xd4\x1b\x0e\xe1\xbf\x70\x42\xa5\xc0\xf5\x72\xd2\xa5\xa2\x9a\xa9\xc9\xae\x8e\x60\xdf\xcc\xaa\x56\xeb\x0e\x8d\x50\xae\xea\xc4\x54\x61\x71\x28\x33\xd8\xfc\x6c\xa6\x91\x73\x26\x33\x21\xd4\x2e\x66\xa2\x66\xa3\x76\xd3\xe1\x3b\xcc\x99\xb0\x01\x4a\x88\x39\x20\x49\x6e\xd8\xa6\xbb\xe2\x1b\x44\x59\xd7\x60\xfd\x33\xb6\xab\xae\xee\x1b\x9a\xfb\xaa\xcd\xe1\x03\x71\xcc\xe0\xe8\xde\x32\x7f\x4c\x51\x58\x57\x9a\xa8\x32\x37\xa4\x3c\x02\x9b\xce\xb4\x1a\x10\x36\xda\xd9\x5e\xe4\x9b\x39\x46\x40\x93\x59\xe3\x15\x72\x00\xdd\x2a\x96\xdd\x3c\x7b\x4d\x1f\xe8\xc9\x93\x90\x46\xcf\x37\x87\xef\x30\xa8\xe4\x86\xe5\x23\xb1\x76\x1b\x0c\x08\xe8\x64\x74\xba\x7b\x5c\x85\x6d\x35\x78\x9d\x99\xc5\xf1\x82\x30\x0d\xe6\x32\x46\xd5\x5f\x8a\x72\x6a\xe7\x1a\x7c\x8a\x18\xce\x41\x95\x7d\x8f\x61\x6f\x69\xba\xbb\x49\xc2\xb7\x23\xbb\x68\x47\xe6\xc4\xe0\xdc\x96\xb9\x87\x5e\xc6\x15\x40\x07\x38\x54\x88\x13\x12\x54\x21\xac\x99\x6c\xd9\x35\xfe\x3f\x76\x74\x80\x37\x9b\x19\xea\x44\x9d\xd6\x5b\x6b\xc6\xa6\x33\xbf\xb3\xa8\x93\x0f\xda\x3b\xb2\xdb\x06\xeb\x1e\x16\x62\x5b\xc7\xe0\x10\xdb\xe2\x70\xc1\x46\xd2\x7b\x7d\x3c\x1b\x47\x42\x83\xcc\xab\x65\xc3\x53\x83\xd7\x8a\x73\x4b\xfb\x22\xee\xee\xb0\x92\x37\x9d\xa9\x38\x31\xa7\x9c\x30\xa3\x41\x1a\x3e\x35\x14\xc5\xe9\x88\x9c\x13\x5e\x56\x6c\xf9\x29\xc2\xb8\xa8\xe8\x72\x1d\x19\x62\x95\xa8\xfb\xea\xca\xad\x43\xae\x52\xdb\xba\x45\x63\x36\xdb\xd0\xcd\x00\x3c\x5f\x76\xe5\xa9\x4e\xec\x1a\x75\xec\x20\x4c\x2c\xf0\x7d\xf8\xb7\xe8\xde\xc7\x32\x2c\xba\xe5\x2b\x75\x54\x2f\xc8\x7c\xd0\x94\xe3\x2b\x1e\xd0\x66\x37\x76\x2e\xba\xee\x0a\x12\x67\x67\x90\x48\xf3\x4a\x82\x02\xcc\xd7\xb7\xa5\x59\xae\x20\x34\x5a\xb3\xdd\xba\x2f\xc7\x0b\xfc\x76\xc7\xd8\xfb\xcd\x2d\x94\xb9\xd6\x2d\x88\xcd\xd6\x2d\x16\xc3\xad\xdb\xf2\xee\x8d\x13\xad\x1e\x81\x30\x1c\x2e\x4e\x0c\xfb\x86\x01\xe2\x9c\x1e\xdb\xc2\x39\x6c\xdd\x76\x8f\x82\xdf\xd4\x4f\xb4\xe5\x88\xc5\x22\x6c\xeb\x10\x47\xbf\xbe\xad\x04\xb7\xbd\x4c\x58\xfd\xfa\x16\x10\x1f\xbb\xae\x75\x0d\xc1\x5f\xdf\xe2\x33\x0a\xd3\x6e\x5f\x21\x4a\x7f\x7d\xdb\x2a\x76\x7f\xd0\x0e\xdc\x27\xdf\x6a\xcb\x98\x7e\x08\xba\x65\xeb\x16\x79\xc5\xbb\x05\xfc\xaf\x6f\x2f\xb3\xde\xe7\xaf\x97\x12\xb0\xbe\xed\x39\x51\x60\x47\xa2\x36\x13\xf4\xad\x36\xc4\xfc\xa0\x07\x8d\x1f\x47\xa2\xa6\x41\x82\x85\xd9\xf3\x51\xe5\x4e\xc1\x1e\x38\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xe6\xb6\x75\xf6\x44\x48\x36\xc4\xfa\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xd5\x3b\x47\x3d\xe1\x1b\xeb\x8c\xdc\xa3\x8a\x60\xdd\xa1\xbd\x8a\xf0\x6c\xeb\x55\x84\x5e\x45\x78\xbe\xf5\x2a\xc2\x6a\xeb\x55\x84\x5e\x45\x08\x6a\xbd\x8a\xf0\x6c\xeb\x55\x84\x67\x5b\xaf\x22\xd4\xad\x57\x11\x0e\x5f\x45\x08\xcd\x90\x5d\xdf\xac\xbf\x25\x9a\xdb\xe7\x2f\xd6\xdd\xb8\xec\xe7\x41\xe5\xc6\x87\xb9\xb7\x1d\x3e\x46\x8a\xbe\x73\xa2\xc6\x3d\x3a\x89\x5c\xb2\xb7\xa4\x7c\x0a\xe4\xed\xf0\xed\x9b\x9d\x93\x2a\x9a\x2d\x24\x36\xbd\xd9\x76\x05\x8d\x5a\x6d\xd1\x77\xc6\xa6\xf8\x85\xc3\x0b\xe9\x71\x9c\xbd\x8a\xab\x68\x29\x9f\x1b\xe2\x6b\xaa\x8a\x04\x39\xe8\xdd\x13\x22\x7c\x6b\x3a\xa6\x59\x0e\x55\xd0\x9b\x65\xeb\x2e\x8d\xa7\x4e\x8a\x15\xdc\x05\x48\x98\x6d\xd9\x75\xdb\x75\x7a\xdb\x04\xa8\x4d\x36\x1f\x83\x79\xe3\xae\xa1\x44\x9a\x28\x91\x83\x85\x6b\xf3\x57\x87\x79\x5d\xf0\xdb\x80\x9c\xc0\x68\x3a\x22\x69\x09\x0e\x06\xc1\x66\x9d\x9c\x0e\x1a\xc1\x99\x5d\x63\x89\x8c\xc0\x23\xf1\x3f\x66\x62\x5d\x4c\x27\xcc\x81\xeb\x92\x66\xd9\x82\xc0\x9c\x25\xba\x5a\x01\x4c\xce\x62\x5a\x05\xcc\x75\xb0\x2a\x1a\xaa\x7e\x0e\x57\xf8\x57\x37\xf1\x24\x5c\x4f\x5c\xa1\xa3\x3b\x4f\x5f\x2a\x08\x60\x67\x68\xb4\xd1\x92\xa4\xcd\x68\x36\x20\x0d\xff\x89\x07\xf7\xe3\x6d\xd7\xd8\x1d\x12\x49\x1e\x09\x96\x41\x62\xaa\x06\x2e\x60\x46\x48\x17\xd2\xb3\x3a\x83\x6b\x42\x66\xd6\xe0\x7f\xec\x9c\x9b\xdf\x6e\x7a\x06\x79\x17\x0c\x91\x75\xcd\xd0\x76\x2f\x0a\x91\x89\xe9\xa2\xb9\xf1\x5c\xdd\xfe\x1a\xed\x9c\x12\x55\x8e\x9d\x72\x6b\xce\xfe\xf5\xd2\x4e\xed\x83\x3d\x36\xb6\x3e\xd8\x63\xa5\xf5\x96\xdc\xde\x92\xbb\x43\x3f\xbd\x25\xb7\xb7\xe4\xf6\x96\xdc\xde\x92\xdb\xb5\xf5\x96\xdc\x9d\x88\xea\x2d\xb9\xa4\xb7\xe4\x6e\x6c\xbd\x25\xd7\xb5\x3e\xd8\x63\x6d\xeb\x55\x84\x5d\x5b\xaf\x22\x84\xf7\xd3\xab\x08\xbd\x8a\xd0\xab\x08\xbd\x8a\xd0\xb5\xf5\x2a\xc2\x4e\x44\xf5\x2a\x02\xe9\x55\x84\x8d\xad\x57\x11\x56\x3b\x8e\x16\xec\xf1\x02\xe4\xc6\x24\xb4\x10\x69\x74\x38\x97\x42\xa4\x4f\xa0\xb9\x58\x5f\x78\x22\x86\x99\x48\x28\xd6\x12\x64\xf6\x27\x2e\x06\x45\xd1\xdc\x86\x02\x0c\xc8\x3f\x04\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x01\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x7b\x34\x98\x6d\x5a\x8f\x06\xd3\xa3\xc1\xf4\x68\x30\xaf\x8b\x06\x33\xa3\xca\x95\xb8\x40\xa1\x68\x33\x38\x4c\x83\x63\xdf\x83\xcc\x7b\x6c\x98\xe7\xda\x8a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\x6f\xda\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\xa1\x3d\x3c\x82\x4c\x98\xab\x30\xb3\x74\x9a\xdd\x0c\x77\x65\x88\x07\x02\xb8\xd2\x9e\x89\x80\x9e\xf6\x8f\xba\xd2\x7e\x95\x68\xa1\x4a\xcd\x88\xad\x96\xf8\xf3\xc5\x61\xb0\xc4\xb1\x17\x0e\x89\x76\x61\x4a\xdf\x07\x59\x0c\x63\x99\xf7\xd0\xfc\x76\xb7\x53\x4d\xd9\xcd\x2d\xb6\x49\xc3\x17\xea\xfc\xef\x12\xe4\x82\x88\x39\xc8\xda\x58\xe5\x6f\x5a\xe5\x62\xb4\x11\x0b\xdf\xd5\xa1\x0d\x57\x4d\xaf\x26\x16\x65\x8a\x97\x59\x36\xb0\xbd\x2f\xb3\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\x1c\x58\xc5\xda\xcd\x2d\xae\x79\x22\xa2\x71\xe2\x85\xac\x87\x87\x52\x19\x77\x73\x7b\x49\xff\x12\x89\xed\x63\x22\x91\xfd\x4c\x24\xa2\xaf\x89\xc4\xf5\x37\x91\xe8\x3e\x27\x12\xd3\xef\x44\x5e\xbd\xd2\xef\xe6\x16\xdd\xac\x18\xdb\x15\x45\x5e\x8c\xc1\x90\xd7\xae\x28\xbc\xb9\xbd\x4e\xad\xe1\xcd\xed\x05\x76\x41\x4c\xf7\x14\x79\xd1\x3d\xb0\x97\x9a\xc6\x9b\xdb\x41\x3a\xad\x9e\x24\xec\xc5\xeb\x20\x6f\x6e\xd1\x7d\x40\xe4\x05\xfc\x40\x24\xb6\x2f\x88\xbc\xcc\x91\x7d\x61\x9f\xd0\x2b\x0c\xd0\xa9\x7a\xf3\xe6\xf6\x12\x3c\x67\xaf\x15\x9f\x9f\x22\x6b\x8f\xb5\xa0\x37\xb7\xfd\x57\x89\xde\xdc\x22\x4b\xe7\xa1\x95\xa5\x9f\x23\x34\x0a\xab\x78\x19\xf7\x2b\x69\x9d\x8b\xef\x61\x11\x37\xf8\x33\xc2\xc9\xfd\xd0\xa2\xce\xab\x9f\xda\xd5\xb0\xab\xa5\x76\xf4\xb5\x59\x81\xdd\xf9\x08\x5c\x45\xec\x2c\x0b\xa6\x61\x0c\x44\xd3\x07\xc0\x88\x0b\x81\xe5\x48\x58\x0a\xb6\x6e\x8d\xdd\xea\x38\xbe\xd9\xe2\xa5\x82\xd4\x10\x92\x09\xf1\x50\x16\xfe\xa8\x60\x5a\x71\x8c\x83\xc9\x78\x22\x72\x9f\x3f\x6d\xb3\xe9\xcc\x89\x77\xbc\x60\x68\xeb\x8c\xd9\xcf\x91\x1c\xbc\xa4\x9d\x51\xf5\xef\x2d\x23\xdf\xdf\x09\x55\xe4\xef\xa8\xfe\x70\x72\x82\x3f\x3c\xfd\x7b\x78\x68\x66\xb5\x04\xd6\x2f\x27\x4a\xe4\xb0\x4b\x45\xca\xdb\xab\xf3\xd4\xec\x06\x13\xe4\x6b\xa3\x34\x27\xee\xd8\xfa\xd3\x4f\x28\xd7\xec\xb4\x32\x45\x8f\x08\xee\x2f\xd4\xfd\x52\xc1\x8f\xb5\xa5\xda\x73\x7d\xdf\x41\x78\x44\x66\xb5\x72\x75\x64\x8f\xf5\x70\x8f\x5c\xd9\x77\x5b\x85\xaf\xaa\x19\x67\x65\xbc\xe0\x71\xef\x7d\xec\x80\x53\x79\x27\x42\x8e\x59\x9a\x02\x16\xda\xac\x5e\x75\x2c\x3c\x34\x46\x7d\xe4\x0c\xdf\x6f\xed\x9d\x70\x62\xce\x33\x25\x06\xcb\xe3\x24\x94\x7b\xf0\x03\xd0\xb6\x5a\x67\x6b\x58\xc2\x94\x59\x16\x05\xc1\xea\xd7\xc1\x85\x87\xbf\xd4\x3d\x11\x39\x45\x80\xa9\x03\xbf\x2b\x96\x09\xec\xaf\x8b\xe8\xd7\x05\x17\xba\xbf\x31\xfa\x1b\x63\xe9\xc6\x58\x39\x78\x2f\x77\x69\xac\x0c\xd5\xdf\x1b\x07\x7e\x6f\x70\x9a\x83\x2a\x68\x02\x5f\x90\x87\xd9\x9a\xff\x6d\xde\x9a\x27\x5f\x35\xca\x69\x83\xcc\xa3\x7a\x05\x3c\x54\x0d\xde\x58\xd8\x6f\xea\x43\xa1\x4a\xde\xa8\xb5\xda\x20\xc6\xf2\xcd\xe5\xa8\xbf\x60\x4a\xbc\x9a\x2f\x38\x28\x74\xbe\x42\x15\x7b\xda\x18\x1c\xc7\x0a\x7f\x6d\x84\xa0\xa9\xdd\x2c\x3c\x5d\x06\xa5\xa9\x47\x44\x3f\x70\x0e\x94\x2b\x72\xe4\x83\x62\x8f\x55\xfd\xc4\x96\x45\x95\x9f\x6a\x55\x79\xab\x8a\xa2\x93\xff\xfd\x7f\x4e\x5b\x25\xad\x6a\x82\x7a\x2f\xff\xd6\xad\xf7\xf2\x07\xb5\xde\xcb\xdf\x7b\xf9\x63\xf4\xd5\x7b\xf9\x7b\x2f\xff\xda\xd6\x7b\xf9\x7b\x2f\x7f\xef\xe5\xef\xbd\xfc\xab\xad\xf7\xf2\xf7\x5e\xfe\x46\xeb\xbd\xfc\xdd\xc9\xea\xbd\xfc\x3b\xb6\xde\xcb\x1f\xd3\xcb\x5f\x1b\x2e\x0e\xcd\xfa\xd6\x34\x69\xb9\x4c\x56\xd4\x3e\x35\xd5\x2c\xa9\xd1\xa3\xfc\x53\xf6\x5f\x87\x65\x8a\x6b\x9a\xc9\x5e\xc6\x10\xd7\x34\xf6\xad\xd8\x53\x23\xd9\xe1\x36\x5a\xdd\x2a\xbb\xdc\xca\xc8\x2f\x6a\x90\xeb\xcd\xed\xdd\xa8\xac\x53\xcb\x0e\xed\xa8\xdf\x7b\x30\x03\x35\x13\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd6\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x61\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x25\x72\xa5\xe6\x8b\x31\x85\xfb\x83\x66\x99\x78\x0c\x97\x36\xa2\x9c\xeb\xc8\x65\x6b\x02\x4f\xdb\xe3\xce\x55\x6f\x96\x72\x7f\xc3\x34\xdb\xbe\x60\xce\x96\xad\x2f\x98\xf3\x7c\xeb\x0b\xe6\x3c\x5d\x30\xa7\x11\xd9\xd4\xac\x9c\xd3\x75\xb6\xb1\xde\xce\x1e\x2a\xe7\x10\xf2\x97\x19\x20\xdf\x90\x60\xc3\x91\xca\x4c\xb3\xa2\x46\x44\x53\x76\xe5\x33\x6b\x88\x9b\x38\x64\x9d\x36\x17\x33\x34\xd2\x64\xd6\x91\x80\x25\x1e\x88\x54\x20\xee\x9a\xc2\x9b\xcd\x22\xca\xa0\x1f\xd8\x96\x95\xf1\x16\x3a\x0b\xec\xc3\xbe\x7c\xfc\x8f\x80\x5b\xe7\x3d\x8a\x3d\xed\x78\x3b\x45\x4e\x8c\xb4\x94\x2d\x5c\xd4\x59\xeb\xfa\x69\x89\x59\x9d\x87\xb5\x5e\x84\x39\x78\x15\x6d\xca\xe6\xc0\x6b\x19\xed\x44\x9d\x9e\x7a\x5d\x71\x59\xf6\xec\x3c\x66\x88\xcc\xda\xfd\x5e\xdd\x55\xd6\x5c\x92\x15\x3b\x8f\xbb\x46\xc6\xfc\xf7\x86\x2c\xf6\x1f\xcf\x4b\x99\x9d\x87\xb6\xac\xcd\xc3\x2d\x35\xb6\x55\x2d\x5d\x76\xec\xfb\x40\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\xb5\x0f\xd8\x8f\x3d\x40\x7e\xfc\x92\x0a\x46\x1d\x64\xf0\xcf\xc1\xd9\x99\x5e\x02\x2d\xfe\xa0\x83\x7d\x7a\xb8\xf8\xa0\x7e\x7e\x51\x70\xf1\x7b\x0a\xe6\xf9\x05\xa2\xc6\x1f\x40\xf0\xce\x3e\x03\x77\x7e\x71\xa8\xf1\x07\x14\xa8\x73\x90\x41\x3a\x87\x16\xa0\xd3\xc3\xb0\x07\xb5\x2f\x13\x86\x3d\x6a\x10\x4e\x6c\x3e\x72\x80\xc1\x37\x07\x18\x78\x73\xa8\x41\x37\x11\x25\xe5\x97\x09\xb6\x89\xc4\x02\x5e\x26\xc8\x26\x5e\x6a\x74\xcc\x53\xb9\x6f\xf8\x8c\x83\xc8\x85\x3e\x64\xd8\x8c\x83\x4a\x80\x3e\xac\xe4\xe7\x7d\x24\x3e\x1f\x0c\x4c\xc6\x1e\x21\x32\xe2\x88\x81\x11\x84\xbf\x97\xe0\xf7\xf1\x64\xb1\xa8\x70\x18\x51\x79\xfe\xfe\x61\x30\xbe\x5a\xb6\x1f\x11\xfe\xa2\xe7\xfc\x1b\xdb\xa1\x73\xfe\x97\x86\xbb\xd8\x2f\xd4\x45\xcf\xff\xb7\x6a\x51\x61\x2d\x5e\xd8\x73\xfa\x9a\x70\x16\x87\x01\x65\xf1\x6a\x30\x16\x87\x03\x61\xf1\x6a\xf0\x15\xbd\xc7\xba\xf7\x58\xb7\x5b\xef\xb1\xee\x3d\xd6\xbb\xf4\xd3\x7b\xac\x7b\x8f\x75\xef\xb1\xee\x3d\xd6\x81\xad\xf7\x58\x77\x24\xaa\xf7\x58\xaf\x6f\xbd\xc7\xba\xf7\x58\xf7\x1e\xeb\x95\xd6\x7b\xac\x83\x08\x3c\x50\x8f\x75\x1c\x48\x88\x98\x27\xf2\x90\xa0\x20\x0e\x01\x06\xe2\xb5\x20\x20\x0e\x0e\xfe\xa1\x37\x41\x6f\x47\x5d\x1c\xa8\x87\x98\x47\xf8\xb0\x21\x1e\x0e\x19\xde\xe1\x40\xa1\x1d\x5e\x06\xd6\xe1\x25\x21\x1d\x82\xcf\x6c\xd4\xd3\x5a\x88\xf4\x9c\x6b\xe6\x53\xc8\x76\x3f\xa7\xad\xd3\xf9\x1e\xff\x18\x83\x3d\x63\xad\x03\xd3\xcc\x93\x97\x65\x06\xca\xa5\x89\xd3\xb9\x60\x29\x29\x4a\xad\x6d\xe6\xad\x3b\x9f\x7e\xe3\xd3\xdc\x66\xca\x0f\xc8\x3f\x04\x87\x01\x01\x9d\x8c\xcc\xe6\xc6\x1c\x74\xa1\x67\x20\xcd\xe3\x27\xea\xf4\x74\xf7\x35\x09\x92\xcf\xc2\x4c\x7b\x85\x84\x09\xc8\x2f\x02\x59\x01\x3d\xcf\x0e\xbe\x40\x5a\x87\xb7\xa5\x1e\x43\x04\xdc\x17\xf6\xf8\x69\xe1\xb2\xde\xf1\xd8\xdb\xb4\xf3\xae\x37\x24\xe2\x1b\xb4\x36\x10\x34\xdc\x1c\x1b\x30\x0e\x06\x64\x5c\x6a\xc2\x34\x02\x03\x24\x33\x21\x54\x57\xee\xe2\x92\x94\xf1\x45\xe6\x4c\x58\x73\xba\xe0\x80\xa8\x03\x42\x56\x3c\xb0\x41\x94\x55\x25\xea\x9f\xb1\xae\xca\x56\x2e\x94\xae\x77\x88\x37\xce\x9a\xc1\xab\x3b\x67\x2a\xc1\x50\xa4\x89\x2a\x73\x43\x8a\x05\x54\x51\x16\x02\xa0\xe3\xb0\x13\x23\x62\xd1\x64\xd6\x78\x85\x1c\x40\x5b\xd7\x9c\xcf\x72\x6e\x1c\xe2\xa6\xce\x74\xe2\x73\x5e\x3b\x8e\x6d\x3a\x03\xa5\x07\x1b\x11\x47\x36\xef\x05\xcb\x13\x4e\xbb\x1a\xa5\x12\x91\x17\xa5\x06\x23\xc7\x97\xb9\xd9\x4d\x4c\x63\xc4\x0a\x32\x23\x29\xca\xa9\x9d\x70\x0f\xf2\x60\x27\xa2\x46\x10\xe1\x29\xea\x66\x9d\x2f\xfe\x23\xbb\x72\x47\x5e\x78\x37\x44\xb0\x49\x05\x10\x42\x66\x54\x35\x43\x6d\xea\x7b\xf5\x19\x80\x9c\xff\x11\x70\xb3\x9a\x81\x4f\x54\x43\xc2\x99\xb1\xe9\xcc\x6f\x36\xa3\x1d\xa3\x4d\xa1\xb5\x49\xbf\x74\x64\x09\x73\x72\xdd\x19\x42\x71\xa5\xde\xf1\x76\xc6\x53\xf2\x17\xfc\x16\xd2\xe5\x7c\x6b\xdc\x07\xd6\x68\x40\xd3\xd4\x08\x22\x20\x87\xf6\x04\x09\x32\x61\x4e\x45\x5a\x3a\xd2\x6e\x86\xbb\xb2\xc6\xc3\x40\x07\x58\xda\x71\x01\x3d\xd9\x99\xef\xd8\x41\x0c\x1f\xdb\xd2\xab\x44\xd3\x56\x6e\xdd\x34\x8f\xc8\xb9\x95\x88\x3c\xff\x32\xaa\xfb\x60\x05\xff\x6a\xf5\x54\xdb\x99\x39\x80\x68\x88\x38\x8e\xda\x18\x90\x12\x24\xa2\x5f\x35\x1a\xb4\x04\x79\x9d\xba\x3f\xaf\x00\x31\x41\xf6\x03\x33\x41\xfa\x9a\x33\x87\x15\xc4\x43\xfa\x9a\x33\x07\x16\xd4\x43\xfa\x9a\x33\x7d\xcd\x99\xee\xed\x10\x82\x7e\x48\x5f\x73\xe6\x00\x82\x80\x48\x5f\x73\x66\x9b\xd6\xd7\x9c\xe9\x6b\xce\xac\xb6\xbe\xe6\x4c\x5f\x73\xa6\xd1\xfa\x9a\x33\xdd\xc9\x3a\xb8\x40\x22\x72\xc0\xc1\x44\xa4\xaf\x39\x13\xb9\xe6\x4c\xbc\xf4\x68\xf2\x02\x27\x77\xdf\xd0\x18\xe4\x50\xf2\xa4\xc9\x81\x43\x64\x90\x43\x4b\x96\x26\x07\x97\x30\x4d\xf6\x94\x34\x4d\x0e\x09\x32\x83\xec\x17\x36\x83\x1c\x62\x62\xde\x97\x51\xb2\x28\x2a\x94\x06\x79\x89\xbb\x62\xff\x90\x1a\xe4\x6b\xbf\x2e\x22\x42\x6b\x90\xfe\xc6\xd8\xa6\x7d\x09\x37\xc6\x4b\x43\x6d\x90\xbd\xc3\x6d\x90\xfe\xde\xe8\xda\xa2\x42\x70\x90\xd7\xf1\x30\xbf\x26\x14\x07\x39\x18\x38\x0e\xf2\x9a\x90\x1c\xe4\xa0\x60\x39\xc8\x6b\x42\x73\x90\xde\xcb\xdf\x7b\xf9\xb7\x6e\xbd\x97\xbf\xf7\xf2\xc7\xe8\xab\xf7\xf2\xf7\x5e\xfe\xb5\xad\xf7\xf2\xf7\x5e\xfe\xde\xcb\xdf\x7b\xf9\x57\x5b\xef\xe5\xef\xbd\xfc\x8d\xd6\x7b\xf9\xbb\x93\xd5\x7b\xf9\x77\x6c\xbd\x97\x3f\xa6\x97\x3f\x0e\x8c\x08\x79\x81\x53\x7b\x48\x70\x22\xe4\x40\x20\x45\xc8\x2b\xc2\x8a\x90\x43\x84\x16\x21\xbd\xb9\xbd\x33\x95\x71\xe0\x46\xc8\x0b\x1c\xf5\xc3\x86\x1d\x21\x07\x0e\x3d\x42\x0e\x17\x7e\x84\xbc\x18\x04\x09\x79\x61\x18\x12\x12\xeb\x5c\xdb\x14\xd5\x43\x01\xf8\xb1\xd4\xac\x64\xd6\xb6\x4a\xfb\x3f\x99\x38\x1f\xa6\xd9\xba\x43\x23\x29\x9f\x02\x79\x3b\x7c\xfb\xe6\x4d\x78\xee\x2e\xe3\x1a\xa6\x10\x62\xbd\x9c\x08\x99\x53\x8d\x3d\xfd\xfe\x77\x9d\xfa\x89\xce\xb6\x37\xe1\x3c\x1c\x1e\xfe\x89\xb3\x89\xb4\xf1\x27\x5a\xd2\xff\x06\x30\x12\xd4\x0a\xcc\x69\xcd\x41\x93\xce\xbe\x81\x06\xe2\x86\x66\x39\x0c\x3c\xef\xb7\x31\x11\x3e\x00\xc0\xc1\xb0\xa4\x44\x70\x27\xb2\x19\x76\xd7\x75\xef\x75\x7f\xe5\x04\xa8\x42\xe4\x83\x31\x98\xd7\xee\x38\x3e\xd5\x16\xdf\xa7\x10\x8c\x6b\x6f\xe8\x31\xef\x0c\x7e\x43\x38\xf0\xa0\xb4\x04\x6b\x41\xad\x63\x9c\xca\x22\xa5\x1a\x4e\x43\x54\x45\xb5\x50\x1a\x72\xc4\x90\x31\x92\x1e\xc5\xe0\x1f\xa2\xe5\x02\x03\x40\xe6\xc0\x75\x49\xb3\x6c\x41\x60\xce\x5c\xfc\x8e\x19\x1e\xa3\x97\x98\x56\x41\x33\xff\x97\x19\x20\x07\x91\x60\x03\x93\xca\x4c\xb3\x22\xab\xe1\x47\xec\xf2\x67\xd6\x24\x37\x71\x68\x3b\x6d\x7e\x66\x68\xa4\xc9\xac\x23\x01\x4b\xdc\x10\xa9\x30\x0c\x48\x2a\xbc\xe3\x2c\xc0\x0c\x7a\x84\x8d\xaa\xa0\x2a\x5b\x9d\x05\xfb\x61\x5f\x3e\x12\x48\xc0\xfd\xf3\x1e\x05\xa0\x76\xe4\x9d\x22\x27\x46\x6e\xca\x16\x2e\xfe\xac\x75\x11\xb5\x04\xae\xce\xc3\x5a\x7f\xc2\x1c\xbc\xb2\x36\x65\x73\xe0\xb5\xb4\x76\xa2\x4e\x4f\xbd\xd6\xb8\x2c\x85\x76\x1e\x33\x44\x7a\xed\x7e\xc3\xee\x2a\x75\x2e\x49\x8d\x9d\xc7\x5d\x23\x6d\xfe\x7b\x43\x2a\xfb\x8f\xe7\xe5\xcd\xce\x43\x5b\xd6\xe6\xd1\x97\x1a\xdb\xaa\x96\x33\x3b\xf6\x7d\x20\x28\x32\xe1\x80\x20\x31\x3c\xb2\xd1\x80\x40\x5e\xb8\x52\xd2\x2b\x00\x80\xec\x01\xfc\xa3\xaf\xd8\xd3\x57\xec\x69\xb7\xbe\x62\x4f\x5f\xb1\x67\x97\x7e\xfa\x8a\x3d\x7d\xc5\x9e\xbe\x62\x4f\x5f\xb1\x27\xb0\x1d\x50\xc8\xce\x41\x86\xeb\x1c\x5a\xa8\x4e\x5f\xb1\x27\xa8\xf5\x15\x7b\xfa\x8a\x3d\x7d\xc5\x9e\x46\xeb\x2b\xf6\x84\x1c\xcd\x78\x49\xd2\x31\x4f\xe5\xbe\x81\x34\x0e\x22\x2b\xfa\x90\x01\x34\x0e\x2a\x15\xfa\xb0\xd2\xa0\xf7\x91\x02\x7d\x30\x80\x19\x7b\x04\xcb\xe8\x0b\x3c\x6d\xd5\xa2\x02\x63\x44\xe5\xf9\xfb\x07\xc4\xf8\x6a\xd9\x7e\x44\x20\x8c\x9e\xf3\x6f\x6c\x87\xce\xf9\x5f\x1a\xf8\x62\xbf\xa0\x17\x3d\xff\xdf\xaa\x45\x05\xb8\x78\x61\xcf\xe9\x6b\x02\x5b\x1c\x06\xa8\xc5\xab\x01\x5a\x1c\x0e\x98\xc5\xab\x01\x59\xf4\x1e\xeb\xde\x63\xdd\x6e\xbd\xc7\xba\xf7\x58\xef\xd2\x4f\xef\xb1\xee\x3d\xd6\xbd\xc7\xba\xf7\x58\x07\xb6\xde\x63\xdd\x91\xa8\xde\x63\xbd\xbe\xf5\x1e\xeb\xde\x63\xdd\x7b\xac\x57\x5a\xef\xb1\x0e\x22\xf0\x40\x3d\xd6\x71\xc0\x21\x62\x9e\xc8\x43\x02\x85\x38\x04\x40\x88\xd7\x02\x83\x38\x38\x20\x88\xde\x04\xbd\x1d\x75\x71\x40\x1f\x62\x1e\xe1\xc3\x06\x7b\x38\x64\xa0\x87\x03\x05\x79\x78\x19\x80\x87\x97\x04\x77\x08\x3e\xb3\xd1\x4e\x2b\x2d\xb5\xc8\x45\xc9\xf5\x1d\xc8\x39\x4b\xe0\x3c\x49\xcc\x5f\xf7\xe2\x01\x76\xcc\xea\x6f\x1d\xd1\xf3\x27\xba\x25\x8c\xa7\x2c\x41\xdb\xe4\xe3\x0c\xf4\xcc\xa5\xcd\xe1\x73\x84\xda\x07\x89\xc6\x27\xeb\x13\x8a\x74\x9a\x3b\x16\x33\xbb\xb1\xeb\x5d\x97\xc0\xce\xd0\x58\x88\x0c\xe8\x2e\xae\x68\x27\x33\x82\xdc\x91\x51\x87\xf1\xac\x1f\x9c\x28\x51\x8f\x4e\xc6\x90\x09\x3e\x75\x39\xe4\x8e\xeb\xec\xba\x0b\x2f\xea\xee\x9c\xab\x36\x29\xa5\x04\xae\xb3\x05\x4e\x73\x9a\x42\x4a\xd0\x3c\x95\x8b\xf9\xee\x9b\xfc\x1e\xd9\x91\xd7\xe1\xa9\x26\x19\x50\xf3\x1e\x1c\xea\x17\x31\x0c\x8d\x92\x9b\x0e\xb4\x57\xbe\x65\x0b\x22\xd0\x69\xfd\x77\xbf\xb1\x3b\xdd\xd1\xed\xd3\xe0\xf5\x32\x94\xd2\x12\x34\xf2\x35\xe6\x03\x19\xe4\x42\x94\xe4\x91\x5a\x55\x4a\x96\x1c\x59\x2a\x4e\x54\x87\x45\x0e\x50\x3a\xba\x1b\xe3\x87\x78\x2f\xed\xf8\xb3\x10\xe3\x38\x95\xd3\x4e\xa2\x53\x0c\x59\xe2\x5c\x4e\x4b\xab\x29\xba\xa3\x08\x5c\xcb\x05\xe2\x61\x74\xbb\x17\xee\x67\xad\x13\x92\xd3\x29\x1c\x2b\x72\xf1\xe1\xbd\xb9\x75\x30\x02\x89\x4d\xac\xcc\xee\x6e\xa1\x42\x8a\x39\x4b\xbb\x5e\x43\x9f\xa8\x64\x74\x9c\x19\xad\x77\x02\x12\xb8\x91\xa4\x7f\x73\xf2\xe9\xfc\xf6\x6f\xd7\xe7\x1f\x2e\x4f\x51\xff\x85\xcf\x05\xe5\x86\x1d\x94\xaa\x46\xe6\x71\x14\x1e\x2b\x02\x7c\xce\xa4\xe0\x66\x16\xd0\x6e\x48\xc9\xdc\x75\xda\x89\xa2\x3a\x70\x44\x82\x12\xd9\x1c\x52\x8b\xa5\x51\x11\x58\x87\xef\x14\xa5\xf6\x16\x54\x1f\x7b\x53\xf2\x64\x46\xf9\x14\xd2\x11\x79\x2f\x4a\xf3\x62\xbf\xf9\x0d\xbe\x84\x84\xb4\x4c\xa0\x9b\x8e\x63\x4d\xf0\xf6\xe4\xfe\x66\xe0\x65\x16\x73\xfb\x63\xec\x0d\x01\x95\xd0\xc2\x4f\x4d\x73\xf6\xd4\x82\x6b\xfa\xf9\x9d\xc5\xe2\x38\xfa\x4d\xe3\xab\xa3\xee\x81\x6b\x85\x14\xe6\x55\xac\x2c\x68\xdf\x3e\x63\x1a\x24\xcd\xc8\x51\x73\x84\x11\xb9\x34\x74\x41\xda\x5c\x5b\x0b\x46\x03\x73\x90\x68\x5b\x75\x2b\x3b\x20\x12\xa6\x54\xa6\x19\xa8\x6e\x46\x21\x31\xa9\xae\x70\x6b\x6a\x71\xbb\x0a\x2a\x9b\x31\x17\x7a\x14\xca\xb8\x7d\xfb\x20\x10\xec\x64\x22\xde\x91\x99\xd6\x85\x7a\x77\x76\x56\x4b\x41\x23\x26\xce\x52\x91\xa8\x33\x4d\xd5\x83\x3a\x63\xdc\x30\xbf\x61\x4a\x35\x1d\x36\xb8\xee\x99\x95\x8d\x87\x89\xc8\x73\xca\xd3\x21\x75\xe7\x78\x58\xed\xec\xb3\x5f\x3b\xe9\x71\x48\xab\xa7\x18\x1f\xd2\xa1\x9a\x41\xa7\x95\x0b\x53\x14\x03\x14\xc4\x40\x21\x33\xb2\x42\xe8\xe6\x72\x5f\x0c\xfb\xb2\xe2\xcf\x76\x29\x46\xe4\x5a\x68\x87\x57\xe4\x22\x2a\xf1\xb6\xc5\x55\x8e\xc9\xc2\x2f\xaf\xef\x6f\xff\x7a\xf3\xf1\xea\xfa\xbe\xe7\xe4\x3d\x27\xc7\xd6\x73\xf2\x9e\x93\x77\x18\xf8\x50\x38\x39\xf0\xf9\xbe\xb8\xb8\x57\x8a\x1b\x1c\xab\xda\xaa\x2e\x51\xa0\x0a\xf3\xae\xf6\x41\xb7\x2d\x1a\x65\xa7\xef\x6d\xc7\xb4\x26\xfb\x92\xcf\x3f\xd1\x76\xc4\x09\x5f\x3b\x85\xc4\x3d\x60\x35\xf4\x8b\xb0\x09\x0c\xf6\x7c\x85\xc6\x85\x75\x52\x48\x6d\x0b\x8f\xd9\x32\x43\x77\x37\x78\xb7\x96\xef\x9a\xe6\x95\xb9\x75\xdd\xaa\x8d\xc8\x07\x6f\x6f\x21\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\x6d\x77\x03\x65\x04\x97\x02\x1a\x89\x23\x4d\x40\x90\xbd\x7f\x17\xf9\x28\x60\x98\x5a\xb2\x2a\x24\xcc\x99\x28\x55\xb6\xa8\x0c\xf1\xeb\xd9\xd5\x32\x9f\x22\x94\x87\x50\x40\xf9\xa2\xb2\xa2\xae\x1d\x70\x49\xb6\x5b\x27\xa7\x85\x98\xb4\xf7\x2b\xe1\x39\x22\x62\xc8\x79\x01\xe3\xaf\x91\x10\xb7\x97\xf6\x02\xc6\xed\x24\x27\x6e\x92\xf9\x02\xe8\x68\x4b\x8b\x01\x1d\xbd\xb7\xe9\x53\x78\xa7\x1f\x05\x4c\x4d\x2c\x4e\xf6\x8d\x14\x79\x24\x6e\x76\x87\xb8\x80\x55\x3a\xdb\xba\xa3\x7a\xec\x62\xc4\x5b\xf2\xb6\xd3\x1c\xab\x84\x32\xf3\x79\x60\x52\x59\x94\xe0\x94\x38\xf1\xcd\x89\xe0\x13\x36\xfd\x40\x8b\xef\x61\x71\x0b\x93\x30\x97\x78\x7b\xbe\xd1\x3b\xe8\xa2\x6c\xd1\x0f\x69\x24\x1b\x3b\x58\x98\x87\x30\x5a\x6c\x4f\xac\x08\xf8\xf0\xe8\xf7\x78\xc1\xea\x51\x02\xd5\x5b\x0b\xe9\x92\x72\xeb\xac\xd4\x58\x79\x0c\x51\xe2\x1f\xc3\x04\x3e\xdf\xe2\x07\x21\x37\xa5\x47\x77\x3d\x44\x89\xe5\xbe\xaf\x41\xc5\x99\x22\x30\x99\x40\xa2\xd9\x1c\xb2\x0a\x88\x3c\x1d\x90\x71\xa9\x3d\x04\xf8\x98\x26\x0f\x8f\x54\xa6\x8a\x24\x22\x2f\xa8\x66\x63\x96\x31\xbd\x20\x2c\x46\x19\x2b\xe7\x91\x77\xb8\xe6\x3e\x94\x99\x2b\x4d\xf1\x2a\x14\xce\xde\x66\x56\xdb\x86\x2a\x50\x9f\x87\x66\xb9\xa9\xc7\xf3\x8e\x42\x4a\x2e\x94\x26\x09\x48\x23\xd4\x65\x0b\xf2\x28\x45\x8c\x52\x13\xdb\xda\x4c\x12\xc1\x13\x28\xb4\x3a\x13\x73\x23\x0b\xc2\xe3\xd9\xa3\x90\x0f\x8c\x4f\x87\xe6\xc5\x87\x96\x59\xa9\x33\x0c\x21\x39\xfb\x35\xfe\xe7\x90\x4e\x11\xf1\x89\xd3\xef\xc8\xd1\x51\x60\x5f\xa2\xb0\xd1\x92\x91\x4f\xe5\x1d\xc6\xe1\x2c\x5a\xa2\x53\x75\xa1\x18\xd1\x87\x69\x85\x7c\xca\x7b\xc1\x9d\x16\x10\x69\x9a\x77\x8f\x5f\x58\x6d\x2f\x55\xcd\x0b\xd9\x41\xdc\xdb\x3b\x98\x07\xd6\xd7\xbf\x65\x56\x8e\x15\x16\x22\x7d\x47\x54\x59\x14\x42\x6a\x45\x72\xd0\x34\xa5\x9a\x8e\xcc\x81\x18\xb4\xff\xc4\x48\xab\x01\xf9\x7b\xf5\xa1\x4d\xfb\xff\xf1\xf8\xdf\xbf\xbf\xfc\xeb\x7f\x1c\xff\xf4\xf7\xe6\x77\x28\xae\xd9\x24\x9e\xc6\x03\x81\xaf\xa0\x0a\x48\x46\x5c\xa4\x70\x8d\xd4\xe1\x9f\xaa\x15\x57\xe3\xbe\xd0\x54\x97\x6a\x34\x13\x4a\x5f\xdd\x54\x7f\x16\x22\x5d\xfe\x2b\x30\x95\xe8\x00\xe5\x1e\x5c\xdb\x1b\xaa\xbb\x03\xb9\x93\xa8\xd2\x0f\x2d\xd8\x27\x90\xaa\x73\x69\x94\x66\x6b\x9d\x07\xd7\x6b\x85\x38\x9f\xcc\x20\xa7\xf8\xcf\x6f\xfc\x14\x98\xfb\xf8\x51\x32\xad\x31\xd4\xca\xd5\x81\x10\x93\x81\x67\xad\x56\xa9\x9a\xbf\x0d\xae\x83\x16\x95\xf3\x57\x2b\x18\x79\xc2\x70\x46\xdc\x6c\x59\x0e\x50\xa3\x9a\xac\x44\x56\x9e\xdf\x5c\x91\xb9\x9d\xe1\x03\x9a\x9c\x97\x62\xd7\x1e\xa3\xfe\x9b\x83\x66\xdb\x9e\x4a\xbf\x88\x95\xbd\xec\x9d\x4d\xe2\xa8\x90\xf6\x49\xc6\x72\xe6\x32\x17\x0d\x67\x01\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\x13\x8a\x19\xe4\x20\x69\x36\x54\x5a\x48\x3a\x85\x41\x35\xb8\xfd\x59\xf5\x97\xfd\x61\x8b\xbc\xd5\x5f\x5b\x83\x64\x1d\x93\xe7\xae\xa8\xd0\x44\x94\x03\x64\xd9\x7e\xdd\x0e\x84\x63\x57\xdb\xea\x3a\xbe\x22\x77\x5c\xb9\x52\xac\x9a\x58\xcd\x22\x5a\x81\xe6\x22\x2b\x73\x50\x83\x4a\x60\xb5\xa6\x4a\x3e\x27\x73\x2a\xd5\xf1\xe1\xf0\x21\x42\x52\x36\x67\x2a\x46\x82\xf5\x1a\x89\x9a\x39\xac\x02\x51\xea\xa2\xd4\xae\x26\x5a\xe5\xf7\xf8\x5c\x08\x85\x06\xce\xaa\xac\x46\xeb\x36\x7b\x1b\xaa\x2c\x10\x52\x50\xad\x41\xf2\x77\xe4\x7f\x9d\xfc\xe7\x6f\x7f\x1e\x9e\xfe\xe9\xe4\xe4\xc7\x37\xc3\x7f\xfb\xe9\xb7\x27\xff\x39\xc2\x7f\xfc\xf3\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xf6\xf4\xf4\xe4\xe4\xc7\xef\x3f\x7c\x7b\x7f\x73\xf9\x13\x3b\xfd\xf9\x47\x5e\xe6\x0f\xf6\xaf\x9f\x4f\x7e\x84\xcb\x9f\xb6\xec\xe4\xf4\xf4\x4f\xbf\x09\x26\x9d\xf2\xc5\xc7\x40\xee\x6d\xdb\x30\x5a\x49\xbb\xe5\x1e\x23\x69\x87\xad\xab\x90\x71\x3d\x14\x72\x68\xbb\x7e\x47\xb4\x2c\x43\x35\x78\xbf\xbd\x62\x9f\xff\x5b\xcf\x35\xeb\xdb\xac\x92\x42\x0e\xe8\x80\xbf\x94\xa0\xa1\x20\x91\xa0\x5f\xc3\xb2\x6b\x47\xf2\x82\xdd\x52\xbe\xd7\xd7\x76\x83\xfe\x12\x8c\xbd\x55\x65\x2d\x5c\xd7\x5a\x74\x9f\x48\x91\x8f\x48\xc3\xf3\x3d\x47\x54\x0b\xf7\xdc\x03\x04\x42\xed\x91\xde\x38\x1c\xd2\x7a\xe3\xf0\x06\x52\x7a\xe3\x70\x50\xfb\x22\x8d\xc3\x77\x96\x27\xfd\x22\x2d\xc3\xab\xa1\x87\xa6\xd3\x87\xce\x50\xc4\x9d\x63\xba\x36\xc5\x40\xe6\xb4\xe8\x12\x00\xd9\x35\x1e\x20\x66\x10\xa4\x37\x7b\x68\x41\x0a\x51\x94\x19\xd5\x1b\x02\x7f\x22\x45\x44\x56\xa0\xc8\x3e\xac\xa9\x0e\x9a\xb7\x22\x6d\xbe\x3e\x0c\x8d\x9c\x67\x19\x61\xdc\x5e\xd0\xa6\x83\x4e\xa3\xfb\xe8\x21\x09\xd6\x1e\x42\xa8\x0d\x63\x9c\x9b\x57\x7d\x74\x65\x79\x9b\xf1\xf7\x8a\x28\x4d\xa5\x66\x7c\x3a\xb2\x65\x7b\xad\x98\xe8\x42\x54\x18\xaf\x8a\xf7\x76\x22\xa7\x52\x43\x2b\x88\x91\x95\x9a\xe6\x36\x3d\x5a\x69\x3f\x3d\xf8\x06\x9a\x3e\x60\x88\x58\x02\x29\xf0\xa4\x63\xb0\xd1\x27\x0b\x69\xe2\xd7\x61\xbc\x30\x33\x71\xc9\xe7\xee\xfe\x22\x69\x69\xc3\xa4\xad\x08\x15\x6f\xdc\xaf\x2b\x26\xd6\x9c\x61\x17\x8c\xd3\x08\x8d\x45\x69\xb3\x32\x38\x56\x10\x6c\x95\x87\x0f\xa3\x9b\x2c\x4b\xef\xb6\x91\x83\x15\x89\x70\xb1\xbd\x0a\xb6\x09\xd2\xc7\x56\xe4\xf5\xda\x0b\xda\x96\xd3\xbf\x86\xf8\xa4\x70\x09\x3e\xae\xf4\xfe\x12\x92\xfb\xa1\x48\xed\x07\x22\xb1\xbf\x8c\xb4\x7e\x98\x92\x7a\x34\x29\x3d\x8e\x84\x1e\x47\x3a\xdf\x21\x6c\x23\xa6\x44\x1e\x47\x1a\x7f\x09\x5b\x5c\x21\x61\xc2\x3e\x47\xe2\xf8\x1f\xbd\xb7\x42\xc3\x67\xb4\xcc\x14\x12\x0a\xe0\x15\x04\x15\x77\x1c\x0a\x68\x32\xfb\x72\xf2\x16\xac\x01\x29\xee\xbd\x78\xb7\xce\x78\xd5\x5f\x8a\xa4\xbf\x14\x77\x68\xfd\xa5\xd8\x5f\x8a\xaf\x72\x29\x3a\x6e\xf5\xf5\xdf\x88\x91\xd3\x62\x31\xe1\x7f\x5f\x36\xa1\x8b\x36\xee\x00\x72\xe6\x97\x4c\xcd\xae\x8e\x62\x0d\x4f\x75\x86\x23\x77\x3b\x71\x6d\x26\x5b\xc5\x41\x68\x61\xd9\x1e\x99\xb1\xa9\xd9\x9e\x19\xcc\x21\x73\xda\x2b\xc9\x29\xa7\x53\x8b\x37\xab\x45\x55\x6f\x49\x48\x2c\x27\x23\x59\x47\xa8\xbb\x25\x00\x07\x34\x14\x19\x2e\x93\x09\x9a\xe2\x97\x52\x64\x19\x48\x45\x32\xf6\x00\xe4\x3d\x14\x99\x58\x38\xc8\x58\x9e\x92\x3b\x4d\x35\x4c\xca\xec\x0e\x74\xa7\x18\xcb\x20\x8e\x83\x04\xdf\x94\x59\x76\x23\x32\x96\x74\x72\xc8\xc5\xd8\x8a\x57\xb8\x01\x8b\x32\xcb\x48\x81\x84\x74\xdb\x87\x1f\x39\x5e\xe5\xe7\xd9\x23\x5d\xa8\x01\xb9\x86\x39\xc8\x01\xb9\x9a\x5c\x0b\x7d\x63\x6d\x35\xdd\xfa\x6d\x66\x96\xd9\xce\x09\x9b\x90\x77\x58\x2b\x43\x13\x4d\xa7\x68\x39\xf4\x11\x81\x03\xb3\xa1\x9a\x83\x12\x61\x18\xe5\x23\x53\xfb\x34\xa1\x85\x9f\xd2\x5f\xe3\xe8\xe6\xea\xec\x7c\x6a\x83\xf6\x6a\xc6\x26\x90\x2c\x92\x6c\x6f\x0c\xf3\x3c\xc1\x20\xed\x1a\x99\xb7\xc1\x4e\xd4\x42\x69\xc8\x3d\xf8\x20\x5a\x4e\x19\x27\x12\x54\x21\xb8\x42\x29\xaf\xe6\x12\xd5\x8b\x58\x4b\x74\xc7\xc8\xea\x88\x86\xd5\xce\x8a\x41\xa8\x4a\x50\x08\xa5\xef\x34\x95\xba\xab\x7c\x12\x4b\x17\xb8\xf1\x84\x98\x93\x9c\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\xe4\x76\x3a\xd1\x08\x39\xd9\xf2\x15\x24\x12\x70\xde\x7d\x05\x84\x19\xe5\x69\x06\x92\x4c\x28\xcb\x54\xf7\x00\xfe\x15\x9f\x84\x06\x99\x33\x8e\x4e\x02\x1b\x08\x8a\x4e\x0a\xf3\x57\x92\x08\x99\x3a\x70\x47\xa6\x95\xff\x2a\x88\x89\x9a\xf6\x11\x25\xbb\xc6\xf6\x5e\x8e\xa3\x25\xe3\x4c\x24\x0f\x8a\x94\x5c\xb3\xcc\xbe\xbc\x10\x0f\xa8\xbf\x64\xc8\x4e\x3a\x0f\xdd\x9d\x4b\x55\xff\x1c\x56\x07\x6c\x68\xa8\x52\x67\xbf\xae\xbf\xc2\x0f\x3a\x12\x17\x41\x8b\x8e\xa1\x43\xc3\x67\x48\xa2\xe1\x22\x5f\x7e\x86\xa4\x85\x4a\xee\x50\x6f\x6c\x79\x48\x44\xba\x8a\xe4\x0a\xb4\xed\xc0\x8a\xac\x05\x20\x8c\x35\x5b\xec\x28\x9b\x0b\xb7\x08\xae\xbe\x92\x5f\x93\x8c\x71\x68\x2f\x8c\x62\x29\xb4\x17\xc7\x7a\x17\x9d\x92\x4b\x52\x26\x11\x10\x7a\xe1\x73\xc7\x83\x49\xf3\xb4\x20\x66\xb2\x10\x9a\x9c\x1c\x9f\x1d\x9f\xae\xec\x91\x63\x23\x9b\x67\x60\xaf\xc5\x91\xc3\x39\xab\x5e\x4a\xb1\xbc\xc8\x16\xf8\x1e\xc7\xe9\x80\x30\x1d\x23\x6c\xc7\xdc\x86\xb2\xe4\x7e\x56\x1c\x2e\xdb\x80\x28\x41\xb4\xa4\xbe\x0e\x82\xfd\xd4\x3c\xa4\x65\xe9\x2e\xf4\x93\xe3\x9f\x8f\x07\x04\x74\x72\x4a\x1e\xb1\xf6\xab\x99\xbe\x11\xb9\x17\xa4\x54\xe1\x33\x56\x11\xb2\x10\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x16\x78\xdd\x10\x51\x6a\x6b\x04\xa5\x3a\x04\x4f\xae\xd9\x2e\x3f\x33\xed\x52\xb8\x0c\xff\x7e\x83\xbb\xc9\x5e\x59\x84\x1a\x65\x64\x0e\x67\x33\xa0\x99\x9e\xd9\x04\x03\x2e\xf8\xf0\x1f\x20\x05\x62\xce\x71\xf7\xcd\x57\x57\xd3\x2f\x62\x6c\xd1\x0b\xc1\xdf\x9b\x6b\xef\x5b\xe8\x2c\x12\x91\x65\x7e\xf4\xdd\xfd\xfd\xcd\xb7\xa0\x9b\x5c\x9e\xe3\x87\xe4\xdb\xcb\x7b\x9f\x56\x82\xc6\x78\x90\x13\x21\xf3\x03\x60\xef\x71\xe2\x5d\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\xfd\x2d\x56\x37\xe1\x58\xb2\x5b\xb4\x73\x24\x5c\x40\x34\xb9\xba\x19\x91\xbf\x8a\xd2\x4c\xc8\x98\x8e\xb3\x45\x85\x3a\xad\x20\xbc\x96\xe3\x91\x21\xe5\xc8\xdc\x20\x66\xe7\x7f\x07\x34\x05\xa9\x90\x41\x03\x8d\x54\x4b\x27\xc2\x71\x6f\xd0\x16\x75\x29\x2f\x4a\xa5\x45\x4e\x66\xee\xb5\xdb\x78\x74\xee\x70\x8e\xec\x71\x75\xa0\x44\x12\x0a\xcb\xc4\xdd\x6f\xbe\x3a\x16\xbd\xc2\xbd\xec\xbc\xbb\xcf\xc7\x56\x4c\x6d\x4e\x9b\x73\x70\x58\xb8\x1b\xc7\xdb\xcc\x56\x8d\x16\x8a\x7a\x90\x55\x4b\x3b\x23\xd5\x2d\x77\x84\xce\x9e\xe0\x9e\xe2\xd6\x2c\x8d\x13\xfd\x4e\x5e\xac\x46\xa3\x11\x68\xdd\xe6\xb3\x36\xe8\xee\xd6\xf3\x75\x9d\x33\x55\x05\x2f\x26\x94\x0b\xce\x12\x9a\xb1\x7f\x40\x4a\xca\x42\x70\x97\xee\x86\x92\x6d\x42\x15\x0c\xd1\x3b\xce\xb5\x2b\x1c\x55\x63\xa6\x19\xee\xa0\x85\x40\x71\x0f\x63\xd4\x0c\xbb\xb7\x54\x1f\x6e\x69\xce\x17\x58\xf5\x95\xc5\x8a\xb3\xe3\xc9\x17\x21\x4e\x12\x9b\xa7\x18\x9c\x23\xbf\x9a\x21\xaf\x05\xa1\x49\x82\xa8\x70\xf6\xba\x42\xc6\xab\x40\xce\xc3\xf7\x57\xb4\x79\x35\x22\xe0\xa1\xc9\x5e\x36\xe6\x40\x12\x5e\xe6\x63\x90\x35\xbc\x88\xd4\xab\x73\x1a\xc5\xea\xe2\x86\xb5\xc3\x79\x2f\xad\x97\x31\x28\x9f\x02\x79\x6b\x46\xfe\xe3\x1f\xfe\xf0\xfb\x3f\x44\x18\xc7\xbc\x5e\x15\xd8\xcd\xc9\xd5\xf9\xf5\xf9\xdf\xee\x3e\x5d\x20\x68\x61\x68\xf7\x91\xf2\x56\x63\x67\xad\x46\xcd\x59\x7d\xd1\x8c\x55\x84\xff\x08\xe6\xb2\xb1\x8f\xc4\x1d\x52\x65\x36\x61\xa9\x2c\xd0\xa1\xd3\x49\x1a\xa5\x8b\x8c\x1a\x15\xbe\x3b\x9b\xce\x3c\xc3\xb0\x0e\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x99\xde\xda\xd5\xc2\xd3\x52\xda\x12\x42\x95\xf3\xaa\xb6\xe5\x3b\xa7\x15\xd2\xf0\x15\x29\xff\x0a\x12\xc1\xd3\x10\x15\x20\x96\x48\xeb\x28\x89\x7a\xe6\xee\x6c\x9f\xde\x44\x5c\x5f\x25\x6e\x30\xd4\x24\x43\x57\x94\x54\xab\x1a\x87\x4f\x5a\x80\x06\xec\xed\x8f\xff\xd2\xdd\x41\x96\x14\x77\x22\x79\x88\x68\x22\x0b\x64\x60\xef\xcd\x49\x4b\xac\x2f\xf0\xfe\xe2\xc6\x12\x67\x56\xe6\xfa\xe3\x7d\x8d\xc6\x82\xd9\x47\xe4\x07\xef\x9b\xfa\xce\x79\x0b\x29\x4f\xc9\x03\x14\x61\xda\xa5\x61\x98\x3e\x8c\xb0\x1d\x45\x38\x72\xf5\xd5\x10\xfd\xd5\x66\x3c\x5b\x46\xe0\xa3\xff\xac\x44\x1c\x86\x23\xdd\x70\xce\xa3\x23\xd0\x29\x21\x13\xca\x32\x42\xd1\x2a\xaf\x59\x0e\x36\xe5\x0a\x8d\xfd\x75\xb4\xc4\x57\xc4\x70\xbe\x56\x6b\xe3\xb1\x0f\xdb\x7e\xb7\xb3\xd5\x30\x14\xa8\xe2\xeb\x56\x03\x1c\xcf\x96\x55\xdc\x7b\xaf\x06\x6c\xdb\x7a\x35\xa0\xa3\x1a\x50\x48\xb8\xd3\xa2\xb3\xac\x19\x2d\xe0\xc6\x92\xb1\x21\xdc\x66\x0c\x13\x21\x61\x39\xde\xa6\x11\x07\xe3\x22\xe7\x03\x22\x83\xcf\x6f\xae\x2a\xdf\x97\x68\xc5\xba\xd8\xf4\x60\x55\x26\x33\xef\x26\xe5\xa0\xd4\x19\x46\xd6\x94\x85\x35\x2c\xe3\xd5\x56\x4a\xe8\x1e\xe5\x53\x48\x80\x1c\xe7\x71\x50\x03\xfc\x98\xd7\x05\x6e\x3f\x04\x9d\x58\xbf\xb9\x0f\x2b\x72\xf8\xed\x7e\xba\xc2\x6a\x20\xd7\x13\x9b\x48\xaa\x66\x80\x29\xaa\xf0\x99\x69\x65\x07\xbd\x41\x18\x1c\x3f\xe3\x46\x5e\x98\x4a\x9a\x00\x29\x40\x32\x61\x44\x8c\x92\xeb\x54\x3c\x72\x32\x86\x29\xe3\xca\xaf\x58\x08\x49\x7e\x4b\x60\x24\x11\x53\x55\xa1\xb5\x11\xb9\x6d\xd5\x1f\x70\x80\x5f\x89\xa8\x79\xa6\x9b\xa2\x41\xa4\x29\x41\xe1\x05\xb7\x41\x89\xa5\x83\xab\x8d\xe7\xd3\xd7\xf5\xe6\x19\xea\xbe\x21\xec\xcc\x9e\x94\x1c\x5f\x34\x85\x8c\x2e\x6c\xa2\xf6\x84\x71\xb4\xfe\x4a\x75\x3a\x0a\x0f\xcd\xea\x4c\xa0\x90\x8d\x3e\x37\xee\x0c\xa6\x88\x04\x9a\xcc\x42\x24\xbb\x3e\x06\xec\xb9\xd6\xc7\x80\xf5\x31\x60\x7d\x0c\xd8\x6a\xeb\x63\xc0\xda\xad\x8f\x01\xdb\x4c\xd0\x21\x3b\xed\xfa\x18\xb0\xde\x2a\xb3\xda\xfa\x18\xb0\x4e\xad\x8f\x01\x7b\xb6\x1d\x1c\x8b\xee\x63\xc0\xb6\x68\x7d\x0c\xd8\x96\xad\x8f\x01\xeb\x63\xc0\xfa\x18\xb0\x3e\x06\x2c\xa0\xf5\x31\x60\xbb\xbf\x5e\xef\xfc\xe9\xde\xfa\x18\xb0\x3e\x06\x6c\xc7\xd6\xc7\x80\x2d\xb5\x3e\x06\xac\x8f\x01\x7b\xaa\xf5\x31\x60\x7d\x0c\x98\x6b\xbd\xb5\x71\xa5\xf5\x31\x60\x6b\x5a\x1f\x03\xb6\xdb\x38\xbd\x1a\x10\xd6\xd9\x8b\xa8\x01\x4a\x8b\xe2\x8e\x4d\x03\x70\x21\x63\x1d\x83\xbb\x8a\x12\x07\x1a\xa9\xc8\xe3\x8c\x25\x33\xa2\xec\x87\xde\x8e\xa5\x1c\x64\x5f\x33\x22\xac\x71\x93\x8c\xc1\xa8\x08\xe6\xb5\x8a\x90\xdb\xe4\x6a\x82\x0e\xe4\x06\x92\x9b\x39\x15\x1e\x26\x90\xb5\xaa\x27\xb4\xc5\x67\x7f\xbb\x31\x6e\x74\x97\xee\x14\x34\xe6\x23\xa1\xdc\x16\x2b\xc5\xd7\xc7\xe2\x86\xe4\x46\xa4\xca\x17\x6c\xe0\x82\x0f\x2d\x58\xeb\x08\xab\x3b\x0b\x35\x0a\xb0\x06\x07\x22\xb3\xd9\x18\xb9\x1b\x29\xc6\x7b\x43\x67\xbb\xc1\xf8\x23\x96\xb8\x00\x3d\x31\x69\x21\xae\x59\x02\x3b\x22\xad\xb5\x03\xc3\xb0\xa0\x88\x87\xe0\x62\x8e\x61\x57\x41\x81\xfb\x44\x73\xdb\x39\x72\xca\xa3\x54\xaa\xb3\x42\xd8\xff\xab\xe3\xa6\x1a\x01\x53\x9d\xfd\x28\x7b\x86\x97\x0b\x89\x92\xda\x5b\x84\xd4\x81\x44\x98\x45\x88\x8a\x8a\x29\x2b\x1d\x68\x34\xd4\x61\x46\x42\x1d\x62\x14\xd4\x3e\x22\xa0\xf6\x1e\xfd\x14\xc7\xad\x1e\xc1\xa5\x1e\x49\x22\x7d\x01\xf7\x94\x0b\xa4\xbf\x9f\x49\x50\x33\x91\x75\x66\x38\xb1\x98\xcd\x07\xc6\x59\x5e\xe6\xe6\xec\x2a\xc3\x53\xd8\xbc\x0a\xf6\x57\x9e\x65\xb8\xeb\xde\x46\x1c\x98\x07\x59\x0a\x58\x99\x9b\xb2\xcc\x6c\x2d\x04\x0b\x9d\xd1\x39\x0a\xa5\x65\x92\x00\xa4\x21\x62\x69\xd3\x5a\xfd\xfb\x51\x45\xa1\xc5\xe8\x67\x8a\xbc\x0d\xbb\x6a\xc2\xf4\x9e\x86\x39\xef\xf7\xbf\xeb\xd4\xc7\x54\x16\x71\x6e\xe9\x6f\x6f\x6f\x2e\x5a\xb7\x34\x7e\xf0\x1d\x1e\xe3\x8b\x19\x24\x0f\xb7\x2e\x94\x66\x7f\x37\x73\xb8\x99\x29\xc8\xc4\x14\x43\x30\x08\xb5\xa2\xb4\x7d\xc8\x42\xea\x25\x17\xe8\x14\x57\x11\xe4\x9c\x25\x30\x7a\x05\x43\x45\x2c\xe5\x3f\xfc\x20\x10\x74\x13\xe0\x8b\x1f\x8a\xd8\x75\x67\xc9\xa9\x3c\x0c\x0d\x1b\x95\xa3\x14\x83\x46\x33\x9a\x54\x6b\x33\x5d\x7f\xe8\x82\xc8\x38\x51\x00\x95\x42\x33\x65\x7a\x56\x8e\x47\x89\xc8\xcf\x0c\xeb\xb0\xff\x37\xce\xc4\xf8\x2c\xa7\x4a\x83\x34\x3a\x8e\xbb\xd6\x87\x89\xa1\x80\xf1\xe9\x28\x4f\x4f\x47\xbf\x0a\xa2\xe1\xca\xd9\xca\x5d\x1a\xd6\x06\x23\xc1\x18\x0c\xdf\x17\x72\xc9\x5a\x60\x26\x25\x7c\x93\x06\xdf\xdf\xa1\x45\x45\x02\xc3\x92\xf7\x12\x92\xdc\x73\x6d\x12\xc1\x21\x10\x93\xa9\x1c\x46\xd8\xf1\x8b\x85\x1c\x47\x39\xab\x91\x42\x8d\x0f\x28\xcc\xf8\x60\x74\xa1\x43\x09\x2d\x8e\x16\x56\x1c\x2b\xa4\x38\x4a\x38\x71\x8c\x50\xe2\x78\x61\xc4\x71\x42\x88\xe3\x87\x0f\xbf\x58\xe8\xf0\x17\x11\x36\x1c\xd1\x3f\x16\x29\x5c\xf8\x35\x42\x85\x0f\xd7\x06\x43\x22\x84\x07\xbf\x5e\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x3d\x84\x02\xbf\x86\xff\xff\xc5\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\x2f\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x2a\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x43\x46\x17\x77\x61\x81\xa0\xb1\x56\xe2\x7a\x25\x58\xd4\x9a\xad\xdb\x71\x0d\x33\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\x0e\xcf\x73\x4d\x0e\xc6\x3c\x6e\x71\x55\x0e\x64\xd7\x7c\x27\x1e\x89\x98\x68\xe0\xe4\x84\x71\xbf\x73\x4e\x1b\x56\x9a\xda\x3d\x12\xec\xef\x30\xbd\xbe\x7d\xe3\x07\xf9\xfa\xfc\x1e\xe8\x19\x52\xea\xa0\x3d\x5f\x8e\xc6\xe7\x5d\x5f\xee\xc1\x49\x99\xb5\xdd\x5f\xd6\x25\x16\xc7\xf7\xf5\xb6\xae\xfe\xfe\x16\xe9\xa9\x58\x11\xe5\x29\x71\xf8\x5c\x5f\xdf\x3e\x09\x0e\x75\x6f\x2b\x37\x55\x6c\x7a\x3b\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\xdd\x53\x04\xf6\xd7\xa7\x6d\xbd\x7e\xc4\x75\xaf\x6d\xfd\x52\xb4\xad\x06\x2c\xde\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x75\x22\x60\x2d\xc3\x55\xec\x82\x03\xd8\xc4\xb1\x1a\xf4\x10\xf1\xfd\x26\x65\x96\x2d\xac\x0d\xb1\x85\x80\xd9\x7d\x6b\xdd\xcf\x60\x05\x3a\x10\x5d\xa9\x6b\xa8\xab\x75\x93\x42\x0a\x27\x91\xc8\x92\x73\x23\x62\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x5b\xc0\x86\x2e\x08\x1d\x03\x3d\x67\x40\xea\xfc\xa5\x36\x21\x66\xd4\x89\x90\x09\x1b\x67\x0b\x32\xa3\x99\x51\x96\x5c\x90\xf6\x03\xcb\x32\xd7\x4d\x40\x50\x38\x68\xeb\x7a\xb6\x12\x4d\x26\xf8\x14\x27\x83\x5a\x42\xe0\x73\x01\x89\x19\x33\xc9\x80\xf2\xb2\xb0\x74\x1a\xf9\x68\x21\x4a\xe9\xe9\x0c\x8a\x8a\x6f\x8c\xce\x14\xe1\x2c\x1b\xf8\x29\x6f\x43\x60\xae\xee\xf9\xda\xa4\xac\x20\x75\xe8\x95\x8f\x4c\xc1\x00\xfb\xec\x4c\x93\xa5\xc5\x57\xed\xb7\xfb\xc6\x7e\x56\x48\x31\x67\x69\x1d\xa3\x6f\xb6\x05\xc6\xc7\x77\x1e\xeb\x13\xf6\xeb\x59\x2b\x17\x7c\xc8\x61\x4a\x51\x3c\x76\x0c\xcd\x46\x74\xda\xf1\x6d\xfc\x20\x4f\x59\x42\x35\x28\xcc\x49\x68\x41\xdb\xce\x19\xed\x4c\x89\x79\x9f\xc6\x8e\x22\x27\x5c\x10\x81\x99\x85\x25\x67\x7a\x81\x1e\xbd\x59\xa9\x49\x2a\x1e\xf9\x69\xc8\xc1\xb4\x61\x0e\x94\x8c\x41\xd3\x3a\x39\xd0\x8b\x64\x8a\x00\xa7\xe3\xcc\x9c\x3d\x8c\xf8\xbf\x5f\xbb\x01\xc8\x04\xa8\x2e\x25\x90\x29\xd5\x01\x5c\x62\x8d\x34\x6f\xd7\xf3\xe9\x6d\xc7\x94\xf3\xd7\x4d\x48\xc9\x15\x04\x0a\xb2\xd1\x54\x80\x8e\x19\xaf\xe6\x44\x8b\x52\x1f\xc8\x3d\xb2\xc9\x74\x64\x33\x77\x1a\x4a\x22\xcb\x41\x11\x51\x06\x58\xf2\x5a\xea\x9f\x1b\x2e\xa6\x86\xd7\xdb\x9d\xd6\xb6\xae\x6e\xd3\x18\x3b\xec\xba\x21\x95\x37\xf0\x09\x7c\xb8\x95\xcd\xa0\x7e\x7f\x7d\xf7\xb7\x1f\xce\xff\xe7\xe5\x0f\xdd\x16\xfe\x92\x26\xb3\x26\xb6\x38\x27\x14\x2f\x0a\x64\xf2\x33\x3a\x07\x42\x49\xc9\xd9\x7f\x97\x2e\xe4\xed\xa4\x1a\xaf\x23\x5b\x8d\x92\xde\x13\x24\xf8\x9a\x5b\xa2\x13\xe7\x88\xb1\xa6\x3f\x30\x85\x40\xd5\x48\x84\x0b\xfc\x17\x0a\xc8\x44\x8a\x7c\x49\xd1\x22\xd7\x55\x70\xdd\xc2\xdc\x30\xd4\xaa\x66\x33\x90\xdd\x24\xf2\xf7\x1f\x2f\xef\x30\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x11\x39\xe7\x0b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x19\xe1\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xce\x32\xeb\x34\xb2\xd5\x5f\xd9\x38\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x94\x25\x24\x07\x39\x05\x52\x50\x9d\xcc\x48\x4e\x17\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x46\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\xef\xd6\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xec\xed\x9b\x7f\xfd\xdd\x1f\x3a\xaa\xd7\x11\x0f\x6e\xd7\xd0\xa7\x80\x90\xa7\x76\xf8\x97\xdf\x60\x18\x74\xdd\x42\x86\x71\x3b\xc4\xee\x7c\xe4\x86\x8a\xf1\x69\x16\x6c\x00\x09\x36\x03\x86\x1a\x01\x87\xf5\x1b\xdc\x74\xb5\x05\x86\x5b\x02\x5b\x34\x74\x37\xa5\xc4\xb3\x82\xd5\x12\x9c\xb7\x7b\x39\x86\x2c\x78\x43\xb1\xbb\xba\xf1\x5c\x2a\xc4\x7e\x84\xda\x44\x65\x98\xb2\xe8\x23\x76\x58\x1b\xef\x30\x20\x6f\xc8\xbf\x93\xcf\xe4\xdf\xd1\x0a\xf6\xc7\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x09\xa5\xaf\x6e\x22\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x19\x33\x67\x8e\x80\xcf\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xa5\xec\xee\xd0\xe0\x82\xab\x49\x3b\xfa\xff\x95\xf6\x37\x0e\xfc\x9d\x50\xfa\xda\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x33\x16\xc0\x1c\x0e\xe7\xc4\x86\xc5\x89\xc6\xdb\xba\x4f\x6d\xad\x25\x9b\x3e\x5a\x64\x9c\x92\xd2\x28\x4b\x53\x88\x74\x84\xfa\x4d\x00\x15\x66\x36\xd2\x86\x30\xf0\x84\x6a\x34\xb2\xfa\x5a\xe5\x1d\xc6\x03\x67\x38\x56\x42\x79\x57\x19\xd6\x36\x09\x13\x90\xd2\xe6\x09\x8f\x17\x3e\xdd\x28\x78\xb7\x05\x71\xb9\x42\x0a\x2d\x12\xd1\x19\x36\x25\xe6\x56\xb9\x71\xb4\xe0\xdc\xa3\xaf\xb6\xf2\x8e\xff\xf9\xfd\xcd\x80\xdc\x5f\xdc\x0c\x88\x90\xe4\xee\x22\x2c\xf8\xa9\x69\x82\x39\xba\xbf\xb8\x39\xda\xeb\x0a\x34\x72\x98\xee\x2f\x6e\x3a\x74\xb2\x1a\x3e\x9b\xd3\x62\xf8\x00\x8b\x8e\xd2\x5d\x0c\x09\x73\x58\x6d\xac\x28\x2f\x64\xa7\x39\xa7\xc5\xce\xbd\x49\xa0\x29\x3b\x68\x24\x17\x9f\x75\x58\x51\x1a\x0f\xd2\x25\x17\x73\x48\xad\xd6\xec\x47\x01\x9e\x16\x82\x19\x1d\xa9\xc7\x79\x79\xaa\xf5\x38\x2f\xbb\xb7\x1e\xe7\x65\x5d\xeb\x71\x5e\x76\x68\x3d\xce\x8b\x6d\x3d\xce\x4b\x9b\x90\x43\xcc\x31\xea\x71\x5e\x9e\x6d\x3d\xce\xcb\xc6\xd6\xe3\xbc\xec\xd4\x7a\x9c\x97\xd5\xd6\xe3\xbc\x3c\xd1\x7a\x9c\x97\xaa\xf5\x38\x2f\x3d\xce\xcb\x97\xcb\xb5\x7b\x9c\x97\xe5\xd6\xe3\xbc\xf4\x38\x2f\x3d\xce\x4b\xb3\xf5\x38\x2f\x1b\x5a\x8f\xf3\xd2\xe3\xbc\xf4\x38\x2f\x4f\xb7\x1e\xe7\xa5\x73\xeb\x71\x5e\x76\x6b\x7d\xe6\xe1\x8e\xad\xc7\x79\xe9\x71\x5e\x96\x5b\x8f\xf3\xf2\x6c\x3b\x0c\xf3\x78\x8f\xf3\xd2\xe3\xbc\x3c\xd9\x7a\x9c\x97\x1e\xe7\xe5\xc9\xd6\xe3\xbc\x74\x68\x07\x67\x74\xed\x71\x5e\x7a\x9c\x97\xa7\xc6\xe8\xb5\xad\xdd\x5a\x8f\xf3\xd2\xe3\xbc\xac\xb4\x1e\xe7\x65\xb5\xf5\x38\x2f\x3d\xce\x4b\x8f\xf3\xd2\xe3\xbc\x54\xad\xc7\x79\xf9\xda\xed\x4e\x12\x14\xfb\x07\xdc\x88\x8c\x25\x8b\xe0\x6c\x9f\x5b\x50\xa2\x94\x89\xb9\xb1\xb1\x5b\x52\x60\xbf\x95\x45\x21\x48\xc8\x3e\x30\x08\x85\xdb\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\x97\x98\x82\x83\x80\x53\xf0\x2f\x78\xdd\x3d\x82\x60\xe8\xcb\x67\xdb\xe9\xeb\x66\x2c\x0d\xd6\xda\x9b\x2f\x72\x08\xe9\x9c\x4d\xd8\xa3\x6a\x17\x69\x51\x31\x5b\xb6\x71\x73\xd1\xa2\xc8\x58\x48\x62\x2c\x21\x77\x25\x4a\x17\xe0\x5c\xe0\xea\x1d\x49\x8a\x72\x40\x72\xc8\x85\x0c\x48\x8c\x88\xa0\xc1\xb5\xb6\xca\x21\xac\xd3\xad\x25\xc8\x4f\xbe\x16\x38\xff\x0b\xab\x2f\xd4\x28\x55\xd5\x5a\x31\xcf\x0e\x83\x62\xcd\xae\x26\xcb\xc1\xa8\x4c\xb7\xac\x40\xd7\x42\xdf\xba\xc3\xbd\xb7\xf5\x8a\x1c\xb1\xe0\xa7\x70\x6f\xa8\x55\x17\x22\x2f\x4a\x0d\xad\x8b\xcd\x4e\xb1\x55\x3a\x98\x0a\x65\xe8\xfb\xc9\x06\x4d\x04\x9f\xb0\xa9\xd3\xbe\xcf\x72\xca\xe9\x14\x86\xd5\x6c\x0f\x6b\xa8\x87\xb3\xce\x17\xf5\xde\x52\x41\x93\x8c\xb2\xee\x81\x83\xb1\xd8\xc4\x05\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x3c\xa8\xc2\xc6\x99\xe5\x1b\x23\xff\x95\xfd\xf1\x20\x40\x7b\xa4\x1a\x6d\x15\xa8\x18\xad\xd9\xa9\xe1\x0a\x23\x27\x34\x2b\x66\x4f\xab\x8c\x21\x29\x97\xef\x17\x9c\xe6\x2c\xf1\x07\xef\x3c\xcb\x44\x62\x4d\x35\x6d\x65\x33\xec\x4d\x2c\xf5\xe6\x95\xf2\xbc\xd4\x74\x9c\xc1\x88\x5c\x59\xe4\x0a\xc1\xb3\x85\x39\x96\x0a\xb4\x8f\x5c\x70\x67\x22\x4c\xc1\x0c\x09\x8b\x0d\x0c\x89\x5d\x2b\xab\xe3\x5e\xb3\x50\x1b\xc0\x0d\x87\x13\x1c\x08\x70\x2d\x17\x66\x5b\xde\x88\xf4\xce\xec\xcc\xd6\xd3\xc1\x08\x1c\x81\x91\xb0\x31\xa2\x60\x03\x23\x60\xe3\xc4\xad\x86\xc7\xac\xc6\x8d\x57\xad\x3d\x0b\x16\x40\xa8\x99\x08\xd4\xda\x16\x85\x48\x47\x6b\x38\x16\x11\x93\x40\x0a\xcc\x88\x37\x22\x35\xb2\x94\x04\xcb\xb6\xaa\x33\x6a\xed\x8a\x57\x86\xb8\x07\x34\x04\x52\x5d\x0b\x59\x74\x4e\x59\x66\x0e\x70\x20\x01\xab\x60\x8c\x61\xce\x9a\x48\x2e\x0c\x17\xb3\x7f\x48\x9b\xc5\x65\x7b\xb5\x12\xc6\x92\x99\x50\xc0\x91\x5f\xd2\x2a\xb1\xa7\x4a\x3b\x70\x2c\x26\xb5\x57\x74\x68\x70\xf1\xd5\x84\x40\x5e\xe8\xc5\x80\xc0\x1c\xe4\x42\xcf\x30\x08\xa1\x82\x13\x45\xb6\xc6\x14\xc9\x69\xda\xd8\x1d\x03\x22\xbc\x5d\x3a\x70\x78\xbc\x1f\x9c\xaa\x56\x66\xda\x2a\x6e\x4c\x55\xd9\x15\xfb\xde\x35\xb1\x51\x6e\x48\x28\xd3\x8c\x89\x52\x43\x10\x61\x35\x67\xdd\xf0\x6c\x49\xc4\xb3\xf0\x03\x52\xd1\xc8\x28\x31\x5b\x22\xa7\x9f\xd1\x6a\x49\x73\x51\x72\x6d\xe1\x6b\xac\x22\x51\x09\x7f\x36\xef\xe6\x15\xc3\xe8\x5e\x54\xe4\x27\x71\xae\x76\x9a\x7a\xc4\x8a\x9b\x18\xe9\xcb\x54\x6b\x90\xfc\x1d\xf9\x5f\x27\xff\xf9\xdb\x9f\x87\xa7\x7f\x3a\x39\xf9\xf1\xcd\xf0\xdf\x7e\xfa\xed\xc9\x7f\x8e\xf0\x1f\xff\x7c\xfa\xa7\xd3\x9f\xfd\x1f\xbf\x3d\x3d\x3d\x39\xf9\xf1\xfb\x0f\xdf\xde\xdf\x5c\xfe\xc4\x4e\x7f\xfe\x91\x97\xf9\x83\xfd\xeb\xe7\x93\x1f\xe1\xf2\xa7\x2d\x3b\x39\x3d\xfd\xd3\x6f\xba\x3b\x25\x43\x3d\xf0\xf1\xfc\xef\x91\xbc\xef\x2f\xe2\x7b\x77\x3c\x76\xef\x87\xdf\x5d\x81\x2b\xc7\xdf\x39\x2d\x9e\x3a\xfe\x32\xd8\x54\x73\x35\xa9\xc7\x67\x8a\x88\x9c\x69\x0d\xa9\xbb\x7b\x1b\x90\x38\x4b\x66\x22\xc7\xb0\x10\xcd\x8a\xe2\xed\xdd\x80\x66\xa9\xad\x4b\x9d\xc9\xaa\xee\x57\x34\x8c\x71\xc2\xf2\x22\x83\x1c\xb8\x46\xc6\x33\xf4\x2a\x2f\x5a\x19\x47\xf5\x1b\x24\xd6\x0e\x02\x9f\x13\x80\xd4\x11\xd9\xf3\xc6\x46\xeb\x79\x63\xcf\x1b\x9f\x6b\xc1\xa6\xf2\x18\x8c\xf1\xb6\x49\x84\x33\x71\x29\x2f\x29\xa3\xe1\xbc\x42\x4e\x10\x13\x8c\x9f\x98\xb3\xb4\xa4\x59\x13\x60\xd6\x63\x8e\x76\xe3\x00\x0d\xd3\x4e\x4e\x17\x2b\x96\x1c\xc6\x59\x13\xcd\x76\x50\x45\xfd\xe0\x83\x4e\x2e\xab\x3d\xce\x47\xe7\xd9\x23\x5d\xa8\x8e\xa0\x97\xdf\x08\x89\x81\x24\x4b\x83\x12\x21\x7d\x7c\x51\x53\xc5\x6d\x5b\xf8\xbb\x79\x08\xd7\x4d\x74\x1b\xa2\xc2\x29\xd9\xc7\xaa\x7a\xd0\xfb\x91\xdc\x44\xd4\x59\x21\x66\x9f\x77\x7b\xf1\x3b\xd0\xda\x19\x01\x97\xb6\x04\xad\xe7\xb4\x72\x8b\xb6\xa7\xc7\x86\x12\x21\xd4\xac\xf9\x72\x22\xcc\x9a\x60\x91\x86\xc9\x04\x92\x8e\x5a\xb0\x85\xf4\x58\x33\x8e\x0d\x6f\xd7\x8c\x97\x34\xcb\x16\x7e\x4e\x20\x25\x82\x77\x1a\x08\x3e\x33\x4d\x4a\xae\x59\x66\x36\x13\x91\x30\x2d\x33\xda\x34\x20\xba\x37\xf3\x51\x77\xe9\x88\x7c\xe4\x09\x34\x1f\xee\x66\xf8\x5e\x1a\xc0\x08\x1d\x19\x68\x48\x07\xd8\xf5\xf2\x0e\xc4\xb8\xb5\x16\xc7\xa8\x96\xa5\xd3\xf0\x7e\x2e\xab\xb8\xa4\x91\x3d\x88\x55\xd0\x04\x49\xd9\x64\x62\x46\x46\x25\x9d\x0b\x99\xd3\x55\xaa\x28\x4f\x3b\x8d\x6e\x24\x20\xcc\x56\x69\x82\x06\x63\xa1\x98\x23\xc5\x52\x48\xa8\x3c\x6a\x96\x18\x39\xcf\xf4\x4c\x94\xd3\x59\xbd\x2b\xc2\xa6\x9c\x28\x8d\xd1\x5a\x66\x32\x95\xb7\x78\x2c\x6d\x36\x65\x64\x1d\x9e\x80\x15\xc9\x04\xd8\xe3\xfe\x48\x3b\x8e\xbd\x12\x51\x60\x43\xc4\xed\x9a\xfb\x14\x2e\x0c\x09\x84\xb4\x91\x6f\xc7\xe1\xb3\x8e\xf0\xc2\x23\x72\x65\xf1\x33\x06\xed\x5e\x5b\x53\x62\x27\xa3\x11\x12\xe7\x83\x3b\x3b\xc6\x03\x2e\x0d\xc0\xaa\x8c\x35\x84\x39\xb6\x9d\x53\xbe\xf0\x09\x22\x18\xb2\x66\x13\xdb\xaa\x9c\x95\xac\x9b\xed\xbd\x3a\x4b\xaf\x5e\xb5\x47\x41\x52\x4a\xa6\x17\x17\x82\x6b\xf8\xdc\x89\xf7\xc5\xb8\xd5\xef\xda\x64\xb4\xee\x75\x4f\x22\x11\x85\xc5\x96\x5c\x2a\xdc\x34\x13\x65\x96\x22\xc2\x6e\xc9\x91\xed\x74\xbb\x51\xae\x26\xe6\x0a\xb7\xfb\x0d\x6f\x4c\x74\xa7\x2d\x13\xe6\x23\x45\x6d\xc0\xec\x7f\x97\x6c\x4e\x33\xe0\xba\xf1\x8b\x1b\x8c\x1d\x6c\xfe\xe8\x25\x7d\xae\x9a\xaa\x87\x5a\xc3\x80\x61\x21\xd2\x5a\xa1\x38\xf3\x53\x87\x1f\xc1\x67\xfd\x05\xfa\x5b\x51\x60\xba\x91\x6c\xce\x32\x98\xc2\xa5\x4a\x68\x86\x7a\xd4\xbe\x95\xf3\xf3\x0d\x74\xe1\xce\x94\x22\x53\x46\x00\x33\xca\xaa\x11\x35\x6d\xe4\x34\x3a\xfe\xa6\x94\x71\xac\x3a\x14\xe0\x1c\x72\x83\x2a\x1b\xba\x6d\xf4\xed\x82\x4a\xb3\x0b\x7d\x88\xb6\xbd\x1a\xc7\x42\x64\x0e\xa6\x36\x5b\xd4\x74\xb1\xee\x5e\x14\xe4\xc5\xe2\x6f\x1c\x1e\xff\x66\xa8\x50\x64\x92\xd1\x69\x7d\x35\x83\x5e\xc9\x77\x09\x8f\x1a\xdf\x38\xd1\x88\xc1\x5a\x1a\xc1\xc6\x48\x15\x75\x3c\x7d\x93\x83\x77\x57\xe8\xde\x9e\x22\x3f\xa1\x8a\x54\x63\x77\x13\x1d\x4c\xfb\xdd\x29\xde\x13\x17\xe7\x37\x7f\xbb\xfb\xeb\xdd\xdf\xce\xdf\x7f\xb8\xba\xee\x1e\x35\x2b\x34\x58\xeb\x4a\x43\xba\x4f\xaa\x40\x0f\xb3\x0a\x55\xac\xd0\x48\xa8\x11\xba\x4e\x10\xcc\x85\xa7\xe2\x31\xd0\xbf\x6c\xf6\x14\xd0\x6e\x92\x2b\x2d\x8a\x73\x99\x0b\x79\x23\xc5\x84\x65\x9d\x5d\x93\xb1\x4e\xf0\x12\x39\xde\xd3\x74\xee\x3e\xae\xaf\x1b\x8b\x2f\xb0\x1a\xe7\xd0\xb8\x32\x18\x66\xb1\x9b\x6e\xba\x5b\xb6\x5a\x39\x08\x36\x23\x62\x89\xc4\xee\x87\x68\xaf\x7b\x66\xef\xd9\x9b\x86\x8c\x8e\x3f\x8f\xe1\x89\xcf\x44\x42\x33\xac\x5f\x14\xb6\xf1\x49\x64\x27\xeb\x32\x5d\x8d\x6c\x13\xea\xb7\x33\xc9\x04\x4d\x51\x59\x75\xcc\x3f\x05\x8f\xaa\xed\xc5\x2e\x74\x9c\x07\x11\x72\x6f\x23\xfd\x71\x3c\x9f\x1e\x53\x48\xa8\xa4\x9a\xa5\xe1\x05\xe9\x5e\x6d\xd0\xb7\x0f\xed\x30\x04\xf7\x96\xad\x44\xce\xd0\x33\x57\x0d\xe3\x0e\x18\x9b\xa0\x05\x04\xcd\x40\x6c\x82\x9b\x12\x0d\x40\x3f\xf8\x65\x08\x28\x7c\x12\x29\x12\x00\x3b\x39\x90\xdd\x69\xe7\xa7\xda\x91\x36\x4c\xf9\x81\x99\x19\x9c\xd4\x4c\xda\x6f\x1b\x2f\x83\xd8\x58\xe5\xc0\xfd\xf8\x09\x4b\x6c\x79\xfe\x4f\x65\x30\x2e\x58\xb5\xc4\x64\xd8\x38\x5a\x85\x84\xe1\xea\xf1\x0a\x0d\x5c\xb8\x2d\xb9\x66\x39\x78\xec\x8b\xe1\x92\x4c\x24\xed\xd7\xc7\xaa\x42\x9a\x8d\xb2\xd1\x09\xf9\x33\xc7\xf3\xca\x21\x25\x43\xc2\x45\xbd\x44\xc0\x27\x42\x26\xe8\xa4\xd9\xeb\x06\x4f\x68\x41\xc7\x2c\x63\x21\xcc\x3c\xd6\x06\xc7\xc2\x0d\x0d\x7a\xd0\x9c\x94\xa6\x67\xa9\x14\x85\xbd\x89\x7d\x52\x6a\x78\x60\x60\x3b\xf9\xa9\x89\x31\x8c\x02\xfb\xa4\x4d\xc8\x54\x52\xae\x6b\x43\xee\xca\xc6\xf9\x25\xca\x20\x31\x84\x00\x9a\xc6\x2b\x81\x72\x9e\x1a\x9e\xd1\x5c\xb6\xe0\x73\x75\x68\x70\xaa\x17\xfe\xe5\x1a\xd9\x4f\xe4\xe6\xe3\xdd\xd5\xff\xb7\x74\x6e\xba\x8b\x76\xb6\x1d\x36\x98\xa2\xe1\x07\xd1\xb6\xcd\xad\xab\x40\xd5\x6f\x9c\xaf\x7b\xe3\x54\x06\xa2\xbd\x23\x41\xdd\x96\xbc\x5d\x05\xbf\x26\x8d\xe4\x41\xb2\xce\x4d\x05\x9a\xd0\xee\xb5\xe9\xeb\x91\x40\xcc\x23\x5c\x33\xf4\xbc\x35\xac\xb5\x5a\xd8\x22\x4b\x51\xea\xb5\x36\x6f\xd7\x09\xcd\xd4\x97\x7a\x45\x86\x98\x76\x0a\x29\x92\x0f\xa2\xe4\x71\xa0\xa5\x02\x76\x5c\x45\x08\x49\x81\x0b\xed\xac\x29\xa8\x4b\x88\x09\x7e\x4b\x6c\xd8\x54\x03\x35\xb2\x25\xe7\x04\x88\x59\xf7\x0d\xd1\xaa\xf2\xef\x7b\x39\xdc\xea\x2f\xa5\x82\x65\xff\x85\x93\xab\xea\x28\xaa\x89\xe8\x1e\x3c\x22\x81\xa6\xa8\x60\x16\x54\xcf\x2c\x9c\x59\x4e\xd5\x03\xa4\xf6\x83\x40\x28\x87\x2a\x07\x07\x5d\xfc\x7e\xa6\xef\xcd\xe4\xfa\xb4\x19\x34\x08\x5b\x50\x37\x4c\xd4\x09\x51\xc5\xf6\x7a\x1a\x02\x18\xbb\x59\x84\x8f\x3c\x5b\xdc\x0a\xa1\xbf\xa9\xaa\xb5\xed\xfb\x64\xfc\xc5\xb9\x23\xda\x46\x4c\xb4\x4b\x53\x24\x79\x88\x1b\x07\xf9\x62\xa3\xc6\x5c\x28\x5b\x34\x0b\xf2\x4b\xe5\x8a\xb2\xe4\xe7\xea\x5b\x29\xca\xce\x32\x5c\x4c\x7d\xf3\xdb\xab\xf7\x78\xf1\x95\x0e\xed\x87\x6b\xb9\xc0\xe2\xa3\xde\xe2\x15\xd1\x69\xf3\x67\x87\xab\xd4\xe4\x6c\xc1\x10\x2a\x84\x7c\xa0\x0b\x42\x33\x25\x2a\x93\x1a\x5f\xe7\x6e\xf5\xbe\x5c\xf3\xf5\x58\xe8\xd9\x8a\x13\xb7\x6b\x14\x88\x69\xab\xe3\x0d\x1a\xa0\x41\x75\x7e\x36\xe3\x2b\xc3\x6a\x4c\x2c\x2a\x24\x24\x90\x02\x4f\xbe\xd4\x13\xb1\x6f\x0c\x1b\x3c\x55\xd7\x82\x1b\xf6\xba\xef\x73\x75\x55\xd9\x27\xdd\x6a\x34\x4f\x11\x9a\xb2\x9d\x13\x91\x62\x98\x1e\x32\xd7\x52\x85\x64\x7d\x5d\x4d\xd0\xeb\x69\x37\xdd\xf7\xe5\x18\x32\xb3\xd8\x2c\xcb\xcc\x0e\x64\x29\xd5\x36\x34\x81\xe5\x74\x0a\x84\xea\xea\x10\x6a\x41\x80\xab\x52\xba\x7d\xd3\x31\x40\xc7\xb4\x2a\xb6\xc8\xbd\xda\x9f\xaf\xde\x93\x37\xe4\xc4\xbc\xdb\x29\x4a\x1c\x13\xca\x32\x84\x90\xc2\xe0\xbf\x25\x97\xec\xc4\x87\x27\x05\x4d\x01\xf2\x11\x22\xa4\xbd\x5a\x06\x84\x0b\xa2\xca\x64\xe6\xe7\x80\x09\x5e\x59\x84\x1d\x9e\x70\x50\x2e\x4c\xcf\x76\xe2\xdd\x87\x7f\x56\x20\xf7\x7d\x6c\xcd\x75\xf8\xe7\x57\xbc\x0e\x9b\x2a\xa2\x39\xfe\xed\x05\xb3\x67\x35\x07\x4d\x53\xaa\xa9\xbb\x26\xfd\x03\xfd\xae\xed\x2f\xcb\x80\xcb\x52\xc1\x0f\x8c\x97\x9f\x2d\x62\xe7\x41\xb8\x3d\xee\x2e\x91\x22\x92\xf8\x85\x16\x0d\xbf\x9d\xf7\x50\x44\x48\x8f\xbe\x6a\x1d\xa3\xc1\x06\xad\x1b\x6f\x09\x6a\xe1\x1f\xc0\x28\x42\x94\xa7\x22\x5f\x21\x72\x22\x24\x01\x9a\xcc\x3a\x53\xd3\x88\x1a\xe9\x0f\xa6\x6b\xbf\x6c\x87\x50\x06\x73\xc8\xa2\xd9\xf6\x7f\x30\xbd\x99\xc9\xf1\x3b\x17\xbb\x27\x19\x1d\x43\xe6\x00\x5b\x2c\x8a\x57\xc4\x13\x16\xc9\x06\x2e\x45\xc4\x90\x98\x5b\x61\x23\xb9\x68\x35\x11\xa6\xfb\x2f\x62\x1e\xa2\x06\x5f\xdc\xbb\xe8\x92\x7a\x1e\xd0\x06\xfa\x25\xcc\x43\x19\x20\x20\x92\xe5\x79\x30\xd2\x66\x7b\x1e\x50\xfe\x3a\xf4\x79\x50\x90\x24\x22\x2f\x0e\x24\x52\xf2\xde\x46\xe1\x1b\x8a\xb6\x8d\x8a\x6c\x3f\x4c\x83\xc2\x9d\x1d\x0e\x33\xd5\xf6\x1e\xf4\x60\xcc\xff\x57\xe3\x3a\x47\x6e\xb7\x7c\xc7\xbb\xd1\x83\x23\x32\xab\x11\x5d\x87\xbf\xc4\x1b\xaf\x0f\xc3\x6c\xb5\x57\x0f\xc3\x6c\x60\xb9\x51\x34\xcf\xb7\x42\x22\xbf\x86\x60\x4c\xa3\x04\xe0\xbc\x02\xc7\x84\xb2\x82\xea\xd9\x80\x48\xc8\x2c\x42\xba\x63\xcf\x0f\xd6\xe2\x75\x8c\x1c\xc7\x13\xe4\xd9\x4d\x1d\xb3\x6a\xc1\xdc\xa2\xc6\x6e\xae\x8b\xd7\xb4\xcf\x5c\x7f\xbc\x6f\x26\x00\x53\xbe\xb0\x30\x05\x01\xe9\xad\xb6\x1d\x9e\x58\xf1\x92\x31\x9d\xcb\xab\xf8\xd2\x21\x9d\x41\xfd\xad\x8f\xe8\x7c\xbd\x53\xba\x5d\x94\xe7\x72\x8c\x67\x54\x12\x96\x03\x3e\x57\xc7\x88\xb0\x72\xc1\x47\xc0\x5d\x9d\x07\x64\x00\xf9\x8b\xa5\xc8\x6b\xd9\x89\x61\x1c\x9a\xf1\xa9\x6a\x1a\x41\x68\x96\x45\x89\x49\x58\x67\x05\xf1\xa7\xa0\x42\x33\x5b\xb5\x06\xb4\xab\x6d\x84\x8c\xfe\x8c\x05\xe3\xcb\xb6\x44\x64\x46\xa3\xf8\xc2\xed\x10\xd3\x5c\xd1\x0b\x69\x66\x50\x33\x9a\xdd\x15\x90\x1c\xca\x6d\xf1\xed\x87\xbb\xf3\x36\x65\x28\x0b\x3b\xec\x46\xc0\xef\x09\x4d\x73\xa6\x14\x3a\x7c\x60\x3c\x13\xe2\x21\x68\xc8\x13\x9f\x6a\x3b\x65\x7a\x56\x8e\x47\x89\xc8\x1b\x59\xb7\x43\xc5\xa6\xea\xcc\x71\x94\xa1\x99\xb8\x53\xc2\x78\x56\x65\x2a\xa3\xb5\x90\x6b\xe5\x3c\x08\xc1\x2f\x4f\x92\xea\xed\x71\xeb\x61\x7e\x4a\x15\x9a\xbd\x3a\x3d\x08\xb0\x89\x9b\x77\xef\x52\xc7\xea\xae\x0a\xc3\xc1\x5f\xda\x59\x1b\xde\xbd\x09\x16\xe9\xbc\x38\x6b\xe7\xd1\x2a\xaf\x7b\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\xef\x6a\x92\x48\x0a\x16\x44\x04\x10\xcf\x8b\x6e\xcc\xb9\x47\xf7\xf6\x31\xd6\x12\x74\x3f\x3d\x8e\x85\x6f\x7a\x9e\x65\x66\x21\xa9\x03\x94\x69\x44\x77\xa2\x6a\x52\x61\xb8\x28\xb3\xe2\x16\xbe\xc5\x28\x0b\xcd\xb7\x08\xaf\xb9\x7f\xc2\xb4\x47\xcf\xf1\xf0\x3d\x5a\xd8\xb1\x29\xc9\xd9\x67\x43\x61\x73\xc4\x36\xde\x08\x3a\xfe\xd7\x7f\x1d\x50\x5a\x89\x60\xf0\x41\x05\xdb\x35\x30\x2b\xd4\x1c\xc4\x27\x47\x6b\x73\x6d\x99\x2f\xae\x41\x1b\x45\xcd\xce\x5b\xd3\xfb\x60\x14\x2b\x59\x46\x38\x0c\x21\x9e\x61\xd2\xf4\x0e\x47\xe5\x14\x81\xe7\x01\x3d\xc5\x8e\x26\x23\x83\x78\xe1\xed\xb5\x3c\xc7\x64\x4d\xfa\xce\xab\x79\x90\xc9\xf6\x5e\xe4\x17\xf4\x55\x91\x43\xf1\x57\x85\x42\xad\x34\x60\x63\xf6\x86\xb3\xd2\x84\xae\x61\xab\xc1\x4b\x37\x22\x5d\x41\xb4\xf1\x45\xe7\xbb\x97\x18\x31\x9b\xa3\x56\x41\xb8\x70\xe6\x91\x46\xdd\x77\xf8\x0c\x49\xa9\x21\x75\xc0\x56\xce\xa4\x6c\x41\x71\xda\xd4\x74\xa6\xc0\x27\xe9\xbb\x8a\x93\x6a\x50\xa3\x81\x3b\x5d\xa7\x82\xe6\x1a\x90\xff\x42\x2e\xe9\x70\x2c\xeb\x52\xf5\x37\xd5\xcf\xbb\x4e\x05\xc6\x51\x27\x94\x7b\xdd\x0a\x2b\x9e\x5b\x0b\xb7\x03\xb0\x72\x38\x1e\x63\x20\x05\x95\x34\x37\x77\xb0\x22\x6e\x79\xc6\x30\x65\x36\x2d\xb0\x71\x29\x56\x08\x58\xdd\x10\xdd\x50\xb1\x61\x9a\xe4\x6c\x3a\xb3\xa7\x85\x50\x2c\x0d\x49\x7c\xdc\x58\x26\x68\x4a\x90\xb1\x08\x49\x1e\xa9\xcc\x8d\x2c\x40\x93\x19\x06\xa1\x51\x4e\xd2\xd2\x9c\x07\x82\x78\x4d\x8b\xa1\xd2\x54\x1b\x1d\x13\x64\x80\x0d\xce\x4f\xd3\x1e\x8a\x97\xbc\x74\x61\xb6\x3d\xe3\xe9\x98\x93\x16\xc5\x0a\x72\xf9\x19\x92\xa5\xd2\xdf\x79\x8e\x10\x7f\xc2\x1f\x67\x8f\x54\x16\x2c\x0c\x1e\x88\xaa\xec\xde\xf0\x50\x64\x93\x0b\x37\xe1\xcc\x6b\x9f\xf6\x4f\xa3\x8f\xb6\x17\x41\x79\x27\x56\x03\xb7\xd7\xfc\x69\xb6\xba\x39\xb9\x16\x23\x48\xc8\xaa\x8e\x5c\x10\x59\x9e\x0e\xac\x4c\x25\x84\x26\x27\xc7\x67\xc7\xa7\x2b\x7b\xe1\x58\x35\xd3\x0c\x6c\x46\x74\xfd\x42\x8a\xe5\x45\xb6\xc0\x77\x38\xb6\xc5\xa8\x02\x8a\xbc\x9a\xe6\x03\x56\xab\x0a\x0c\x6a\x06\x59\x36\x20\xca\x88\xbf\xd4\x83\xdf\xda\x4f\xcd\x43\x5a\x96\x89\x35\x93\x9d\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xb6\x0e\x0f\x72\x8f\x3a\x64\x10\x4d\x15\x11\x0b\x51\x62\xbd\x64\xbb\x6c\x15\x5e\x72\x42\x8d\xfa\x53\x5a\x19\xdd\x82\x6e\x40\x16\x50\xff\xd7\xb4\xcb\xcf\x4c\x1b\x51\x44\x97\x68\xa6\x78\x63\x35\x05\x30\xec\xd5\x5c\x78\xe6\xa6\x3b\x9b\x01\xcd\xf4\x6c\x51\x69\x2f\xb6\x14\xad\x22\x25\x77\xdf\x84\xcb\x50\x07\x90\x36\x7a\xb8\x09\x9c\xae\x22\xf6\xfd\x4c\x82\x9a\x89\x6c\xef\x69\x9c\xbe\x4c\x6a\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\xb9\x52\xad\xc2\x01\x9e\x9a\x53\x26\x21\x75\xc2\x92\x43\x4f\x9c\xd1\x39\x4a\x0a\x46\x9e\x83\x34\x44\x35\x69\xea\x44\xbf\x8f\x59\xc8\x75\xff\x35\x53\x4d\x9b\xca\x22\xce\x2d\xfd\xed\xed\xcd\x45\xeb\x96\xc6\x0f\xbe\xc3\x63\x7c\x31\x83\xe4\xe1\x36\xac\xa0\xc8\x81\x84\x16\x14\x42\xee\x53\x30\x30\xc3\x47\x93\x0a\x6e\x84\xd4\x84\x57\xa5\x91\xcd\xd9\x9a\xe2\x2a\x82\x9c\xb3\x04\x46\xbe\x6c\xb2\x77\xce\xfb\x02\x38\x94\x4f\x81\xbc\x35\x07\xe2\x8f\x7f\xf8\xc3\xef\xff\x10\xce\xa3\xc3\x91\xcc\xc3\x0f\x02\xc1\x60\x28\x7c\xf1\x43\x11\xbb\xee\x2c\x39\xeb\x8c\xcd\x8e\x52\x54\xea\x32\x9a\x54\x6b\x33\x5d\x7f\xe8\xc2\xac\x92\x0a\x80\xac\x71\x57\x18\xd6\x61\xff\x6f\x9c\x89\xf1\x59\x4e\x95\x06\x69\x74\x1c\x77\xad\x0f\x13\x43\x01\xe3\xd3\x51\x9e\x9e\x06\x54\xb8\x23\x0d\xb5\x7a\x05\x5b\xbc\x05\x33\xb3\x01\x27\xdc\x4c\xca\xde\x4d\xf0\xc4\x53\xf9\x8e\x1c\x75\x03\xa6\x36\x4b\xf0\x2d\xc4\xc9\x44\xfb\xee\xfe\xfe\xe6\x5b\xd0\x4d\x86\xcd\xf1\x43\xf2\xed\xe5\x7d\x55\xf1\xca\xec\x2e\x9b\xd4\xd4\x73\xed\x10\xae\x3d\x13\x61\x25\xcf\x62\xfb\x5d\x2c\x2b\x41\x98\x6d\xce\x21\x31\x0b\x3d\x68\x15\x57\xf1\x71\x88\x57\x37\x23\xf2\x57\x51\xa2\xc8\x45\xc7\xd9\x82\x3c\x52\x8b\x68\xa0\x20\x8c\xa7\x1c\x19\x32\x8e\x0c\xd7\x32\xbb\xfa\x3b\xa0\xa9\x2d\x97\x80\xa6\x9d\xbd\x9f\xd5\x06\x4d\xd1\x96\xed\xa2\x54\x5a\xe4\x64\xe6\x5e\xd5\xce\x61\x5d\x53\xce\xca\x46\xf6\x08\xa2\xef\x47\x11\x09\x85\xd5\x96\xdc\x6f\xbe\x0a\x5d\x68\x85\x0b\xd9\x79\x6e\x54\x1e\xa2\x24\x69\x4e\x95\x13\xf4\xd1\x84\xc9\x1c\x8f\xea\x6c\x12\xab\x5b\x94\x02\x9e\x24\x52\x11\x4f\x12\x5e\xc8\xd3\x77\x12\xee\x84\x8c\x53\x12\x94\x44\x29\x0b\x4a\xa2\x57\x7b\x24\xce\xd5\xe6\x36\x97\x0d\xc0\x31\x84\x86\xa2\x12\x12\x6f\x4c\xae\x6a\x71\x50\x2e\x38\x4b\xac\x3b\x83\x94\x85\xe0\x44\x94\xba\x28\x35\x9a\x82\x12\xaa\x60\x38\xa7\x92\x19\x86\x6a\x6b\x2a\x57\x91\x50\xdc\x9c\x76\x2d\x04\xda\x49\x2a\xa7\xb3\xa5\x38\x9c\xcc\x48\xd2\x8c\x69\xb8\xd9\x22\xaf\xf0\xca\xe2\x84\xef\x68\x72\xd0\x36\x18\x62\xcb\x58\xcd\xe2\xa9\x75\x54\xcf\x30\xb2\x0f\x7d\x59\x3e\x30\x14\x19\xa7\x51\x1b\x0e\x20\xf1\x26\xaa\x16\x1b\xc8\x12\xd0\xdf\x2e\xe4\x92\x1e\x6c\x28\x5c\x9d\xc3\x48\xb1\x26\x2f\xaf\x56\x37\x4b\x20\x8f\xc1\xc8\xf6\x57\xe7\xd7\xe7\x7f\xbb\xfb\x74\xf1\xb7\xeb\xf3\x0f\x97\x21\x5d\x07\x97\x2f\x8b\x59\xc0\x2c\x5a\x09\xb3\x17\x2a\xf0\x68\x9a\x4a\x66\x70\x38\x61\x26\x77\x48\x4d\x13\x94\xcc\xe9\x00\x8d\xd2\x3a\x61\x28\x75\x64\xc9\x68\x6a\x18\xcf\x5e\x39\x8e\x8b\x2a\x78\x0f\x19\x5d\xdc\x41\x22\x78\xba\xf7\xe8\xec\xeb\x8a\xd9\x28\x4b\x50\x55\x51\x08\x96\x10\xb3\x7c\x0d\x2f\x57\x07\xc9\xc7\x07\x34\x43\x1a\xec\xfb\x75\xf6\x5a\x93\xc3\xf3\x5c\x93\x83\x31\x8f\x17\x20\x19\x46\x04\x1d\xc2\xae\xf9\x4e\x3c\xba\xe2\x60\x27\x8c\xfb\x9d\x73\xda\xb0\xd2\xd4\xee\x91\x70\x34\x35\x2d\xc8\xdb\x37\x7e\x90\xaf\xcf\xef\xe1\x22\x7d\x0e\xda\xf3\xe5\x68\x7c\xde\xf5\x55\x87\x2d\xb5\xdd\x5f\x21\xf1\x43\x64\x89\x8d\xbf\x1d\x55\x79\x6a\x6f\x91\x9e\x8a\x15\x51\x9e\xfa\x90\xb3\xaf\x6f\x9f\xe8\xa4\xb8\x13\xc9\x43\x24\xb3\xeb\xfd\xc5\x8d\xed\x6d\x29\x9e\xc5\xde\xc0\x46\xca\x14\x84\x9a\xa7\x50\x00\xed\x8d\xae\x07\x63\x74\x3d\xb6\x69\x5d\x34\x7b\xb7\xb3\x01\xf5\xb8\xd7\xb6\xea\xe6\x05\x1f\xd9\xae\x80\xd2\x6b\x5b\x1b\x5a\xaf\x6d\xed\xd0\x7c\x25\x5a\x26\xf8\xb7\x92\x26\x70\x73\x48\xc2\x9b\x67\x20\x24\x75\xf5\xd9\x49\x2d\xc3\x55\xec\x82\x03\xa4\x96\x7f\xf8\xa2\xba\x64\x6a\xde\xc4\x86\x47\xa3\x0d\xb1\x0e\x2c\x2e\x65\x80\x98\x77\x3f\x73\x5d\x3b\x11\xd7\x3b\x99\xd7\x51\x57\xeb\x26\x45\x05\x86\xee\xab\x86\xb8\xe3\x64\x88\x37\xba\x88\x02\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x9a\xe9\xf2\xb5\x9c\x2d\x88\x96\x2f\xbd\x57\x13\x62\x46\x9d\x08\x99\xb0\x71\xb6\x20\x33\x9a\x19\x65\x09\x4b\x02\x53\xf2\x80\xa5\x6c\xb1\x9b\xee\x13\x75\x07\x2e\x57\xd3\x4a\x34\x99\xe0\x53\x9c\x0c\xea\x72\x32\x3e\x17\x90\x98\x31\x93\x0c\x28\x2f\x0b\x4b\xa7\x91\x8f\x16\xa2\x8c\x90\x96\xe1\x1d\xdf\x95\x3c\xc5\x99\x83\x1f\xb1\x85\xdb\x9e\xdc\xf3\xed\xe4\x5a\xf2\x51\xcf\x40\x3e\x32\x05\x83\xee\xa5\x6b\x89\x37\xfb\x2e\x95\x91\xb3\x9f\x55\x10\x2a\x2e\x73\xd0\x6c\x0b\x4c\x65\xed\x3c\xd6\x27\xec\xd7\xb3\x56\x2e\xf8\x90\xc3\xd4\x02\x35\x38\x86\x66\x23\x3a\xed\xf8\x36\x7e\xb0\xca\x36\x50\x5a\x14\xad\xba\xbd\x73\x46\x3b\x53\x82\xa0\x10\xf5\x8e\x22\x27\x5c\x10\x51\x98\xab\xab\xe4\x4c\x2f\xd0\xa3\xe7\x4b\x46\x07\xe4\x5b\xdd\xbb\x30\x07\x4a\xc6\xa0\xa9\xb3\x81\x9b\x43\x50\x61\xa2\x23\xdc\xb9\x39\x7b\x98\x24\x70\xbf\x76\x03\x54\x30\xe9\x53\xaa\x03\xb8\xc4\x1a\x69\xde\xae\xe7\xd3\xdb\x8e\x29\xe7\xaf\x0b\xc4\x61\x3e\x0c\x64\x43\x73\xa2\x45\xa9\x0f\xe4\x1e\xd9\x64\x3a\xb2\x10\x17\x0d\x25\x91\xe5\xa0\x88\x28\x23\xd5\x9b\x78\xeb\x86\x8b\xa9\xe1\xf5\x76\xa7\xb5\x4d\xe9\x94\x75\xaa\x3a\x1c\x63\x8b\x6d\x00\xef\x77\x79\xb8\x0d\xfc\xca\x71\x39\x99\x80\xc4\x9b\x0e\x09\x5e\x09\xbb\xaf\xea\x78\xf9\x3b\xac\x9b\xf1\xd6\x05\x7c\x81\x1e\x60\xed\x00\x07\x26\xb1\x61\x48\x07\xb2\x89\x65\x7a\x25\x28\xc4\x82\xe7\xe4\xf2\xe3\x37\xdd\xb6\x68\x8c\xca\x02\x61\x29\xab\xf8\x9e\x1f\x79\xb7\x98\xc4\xb8\xfb\x61\x1d\xea\x8b\xdb\x16\x49\x26\x94\x4b\x8f\xc6\x75\x49\x66\x94\x73\xf0\xc6\x28\xa6\xd1\x92\x3d\x06\xe0\x44\x14\x60\x83\xf2\x3a\x11\x43\x89\x62\x7c\x9a\x01\xa1\x5a\xd3\x64\x36\x32\xd4\x71\xbf\x17\xea\x3c\x64\xf7\x89\xd2\x12\x68\x6e\xf7\x84\x84\x9c\x32\x3b\x3c\xa1\x89\x14\x4a\x91\xbc\xcc\x34\x2b\xaa\xce\xba\x59\x11\x01\x11\x21\x94\x4d\x4b\xf5\x6b\x85\x69\x25\x75\xc2\xf3\xa0\xa6\xd0\xbd\xbe\x68\x16\x2b\x42\xd3\xd9\xc0\x7c\x0b\x79\xa1\x17\x55\x62\x62\x37\x1d\x68\xc2\xa4\xd2\x24\xc9\x18\x70\xed\xde\xcc\x42\x0e\x22\x0d\x03\x2f\x4e\x73\x37\x23\xca\x4d\x09\x4f\x51\xf9\x2e\xb4\xb2\xf9\x77\x15\x11\xbe\xab\x94\x29\x67\xeb\x50\xdd\xb2\xff\xa8\xaf\x4c\x63\x37\x8e\x9f\x11\xdc\x3a\x5e\xc0\xb1\x14\xb9\x8f\x1a\x24\x34\xea\x6c\xd7\xb9\x93\x61\x7c\x05\xcb\xc7\xf8\x73\x3d\x68\x61\x0e\xd4\xba\x05\xa6\xc2\xac\x70\x1d\xdc\x50\x1c\xe6\xe6\x1c\x40\x02\x46\x14\xa5\x11\x99\xcc\xab\xf3\x98\x86\x2c\xf7\x01\x94\xa2\x53\xb8\xe9\x18\x8e\x10\x83\xe1\xd4\x86\x36\x8c\x63\xa8\xb7\xcd\x0c\x2c\xd0\x95\x16\x8d\x4f\x9a\x49\x5e\x4d\xe5\x31\xb7\x2f\xd2\x89\x02\xaf\x34\x3d\x4a\xa6\x35\xe0\x2e\xc5\x4a\x4e\x18\x80\xb6\x0c\xde\xd9\x4e\x2e\xeb\x34\x9e\x9b\xf4\xe6\x78\x46\xfc\xe0\xa9\x4d\xd3\x1a\x03\x19\x4b\x06\x13\x32\x61\x98\x37\x86\x19\x55\x03\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x90\x29\x66\x71\x39\x25\xf8\x5f\xde\xfc\xdb\x1f\xc9\x78\x61\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xd4\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfd\xdd\xc3\x38\xe8\xe8\x21\x7f\x3c\x4b\x61\x7e\xd6\xd8\x42\xc3\x4c\x4c\xbb\xf5\x7a\x11\x23\x9b\x38\xc8\xce\xb6\xe6\x44\x8b\x8c\x25\x8b\x7d\x9d\x69\x5f\xbc\x84\xcc\xc4\xa3\x35\xe6\xac\x1e\xd5\x06\xd4\x4b\x21\x8a\x32\xc3\x89\x23\xdf\x54\xf8\x7c\xa5\x82\x65\xe8\xa3\x50\x23\x61\x83\xdb\xa1\x13\xd5\x0d\xbb\x74\xe7\xb8\x14\x46\x4f\xa6\x70\xc0\x13\xce\xe7\x56\xd5\x21\xe9\x6c\x8d\xfb\x86\x66\xd9\x98\x26\x0f\xf7\xe2\x07\x31\x55\x1f\xf9\xa5\x94\x42\xb6\xdf\x39\xa3\xe6\x4e\x9f\x95\xfc\x01\xab\xe8\xd6\x60\xb4\x62\xea\x62\x0a\x3d\x7e\x40\xe3\xed\x3a\x11\xe3\xdf\xd2\xc2\x83\x7a\x91\xc4\xdb\xe0\xea\x91\xe1\x33\xab\x0d\x6d\x9c\x80\xa1\xb9\x6b\x02\x3e\xb4\xde\x43\x35\x8f\xf6\xef\xde\xfc\xcb\xbf\x5a\xe6\x42\x84\x24\xff\xfa\x06\x53\x8e\xd5\xc0\x5e\x00\x78\x03\x1b\x51\x2b\xa7\x59\xd6\xd5\x4b\xd0\x64\x01\xdf\x74\x2e\x4e\x7d\x00\x47\x5e\xef\xed\x74\x6f\xad\x32\xde\xdf\xff\x15\xf5\x45\xa6\x15\x64\x93\x81\x45\x7b\xa9\xcc\x5a\xc7\x28\x5d\x1d\xbb\x2b\xaf\x3b\x52\xd0\xfe\x95\xb6\xb9\xc8\xca\x1c\xde\xc3\x9c\x25\xdd\x1c\x98\xad\x55\x69\xf5\xe6\xcd\xf4\x19\x53\x08\x02\x34\xce\x44\xf2\x40\x52\xf7\x65\x23\x54\x7e\xb9\xaa\x76\xf7\x59\xe8\x9a\x34\x10\x90\x2c\xb0\xf1\xfd\x5b\x69\x02\x39\x2d\x8a\x0a\xa1\x44\xd2\xc7\xd6\x64\x20\x6b\x42\x74\xd4\x40\x37\x62\xb0\x33\x3d\xd4\x95\x3e\x74\x6f\x64\xae\xa9\xce\x5d\x74\xce\x2d\x08\xf7\xc4\xd7\xd4\x77\xf7\x63\xb6\x36\x44\xdd\xa1\x3f\x0d\x05\xfe\xdb\xe2\x2d\xac\x20\x63\x55\x90\x43\xd5\xc6\xb0\x12\xa4\xd9\x3e\x78\xcb\x74\x37\x5f\x46\x70\x86\x86\xe5\x48\xb4\xe6\x85\x57\x4e\xe8\x9c\x6a\xa7\x1f\x79\x2f\x3b\x25\x05\x48\xc5\x94\x11\x9d\x3e\xe1\x81\xba\xc8\x28\xcb\x1b\xee\xbb\x7d\x4d\xc2\x6a\x44\x7d\x4e\x8b\xe1\x03\x2c\x3a\x6e\xb8\xc0\xe3\xb2\x29\xc0\x3f\xa7\x45\xc7\x7b\x00\x4b\xd7\x86\x5f\x03\x1d\x2f\xe7\x1b\x91\x3a\x3a\xf0\x7a\xb0\x25\x89\x5f\x44\x8d\x8d\x28\x03\xed\xfb\xca\xf9\x54\x2f\x5c\xfb\xc6\x31\x9f\x54\x57\x8e\x7d\xea\x6b\xba\x68\xf0\xfd\xbe\xd4\x7b\xa6\x22\x3e\x12\x3b\x0d\x8a\x74\xc2\xdb\xc9\xed\x8c\xf6\x75\xd4\x32\x68\xd9\x93\xd9\x50\x7d\x9d\xa1\x69\x64\x8b\x02\x04\x10\x60\x8e\xa2\x1b\x94\x1c\xbf\x3b\xde\xeb\x1d\x67\x57\x46\x8a\x82\x4e\x51\x33\x3d\x84\x05\x5a\xa6\xa9\x89\x41\x3b\x13\x8f\xf6\x7b\x1b\x5d\x52\xb8\xa7\x20\xad\x81\xcc\x67\x22\x68\x75\x6c\xe4\xa0\xdf\x11\x4e\xbb\xb6\x58\x85\x8f\x74\x41\xa8\x14\x25\x0f\x4a\x83\x46\xc7\x48\xe5\x38\xfb\xb0\xf4\xb2\xd7\x82\x83\x77\xd2\x87\x8c\x72\x5f\x63\x98\x33\x65\xe3\x15\x18\x27\x6f\x47\x6f\xdf\x04\xd3\x7e\x0b\x49\x29\x15\x9b\xc3\xad\xab\x71\xde\x70\xaa\x5c\x4d\x6e\x84\x52\x6c\x9c\x61\xe2\x96\x16\xe4\xd2\x16\x80\x5f\x7d\xd1\x2a\x70\x04\xdf\x58\xc8\x26\x5a\x69\x00\x85\x27\xf6\x04\x37\x03\x3e\xcd\x00\x01\x51\x1f\x87\x25\x49\xe2\xba\x2e\x49\x92\xd7\x95\x24\x69\xef\xbd\xbd\xbe\xab\x2f\x7c\x7f\x08\x9c\xe4\x83\xf3\x0d\xd4\x95\xed\x99\xaf\x9c\x8c\x1f\x3d\x4a\xa6\xdd\xe1\x7e\x64\x0a\xc8\x09\x5a\x25\x96\x36\x63\x10\x40\x73\xd3\x86\x15\x58\x01\x3f\x06\xc0\xb2\x5c\x3e\xba\x87\xb0\x4a\xab\xfc\xa4\x8e\xc0\x7f\x74\x06\xac\x7a\x05\x1d\xf7\xaf\xef\xe5\x19\xe5\x69\x16\xc4\x33\xaa\x59\xc9\x16\x41\x58\x38\x57\x13\xd2\x64\x89\xce\x7f\xd9\xa8\x26\x31\xa3\x8a\x70\x41\x72\xa0\x18\xa0\x69\x6e\x17\xcf\x05\x5b\x58\xcd\xf1\x68\xb0\x9b\xdd\x5e\x63\xcd\x0b\xc1\xb1\xeb\xf7\x4c\x39\xf6\x6c\xf8\x88\xd3\x40\x6c\x58\x47\x4e\xd3\x90\xd4\xee\xc6\x9c\xd6\x8b\x37\xaa\x83\x26\x97\x29\xa9\x2f\x8e\x25\x5a\x5e\x82\x8e\x81\x2b\x41\x6e\x86\x2f\x31\x4e\x70\x8d\x59\xae\x0e\x92\x09\xf2\x66\xdb\xb6\xfc\xba\xd5\xb5\xb8\xf2\xae\xeb\x29\xae\x08\x0e\xa0\xe1\xf9\x57\x1d\x34\x78\xa1\x8f\x11\xb5\x2e\x75\x57\x03\xc5\x65\x3c\x86\x21\x79\x7b\xa7\x44\x65\xee\x99\x02\x07\x49\x9d\x5f\xc1\x87\x88\x3a\xf0\x15\xaa\x04\x0f\x3d\x10\xcf\x6c\x38\xc3\xef\x9f\x17\x53\xec\xcf\x02\x08\x41\x39\xe7\x44\xc8\xa5\xd3\xee\x3c\x26\xeb\x24\x96\x98\x6f\xbd\x04\xcd\x65\x37\x7f\x03\xf3\xd3\x2c\xca\x7f\x97\x6c\x4e\x33\xb0\x18\xf6\x9e\x35\xec\x55\x98\x50\xe5\xf8\x50\xd5\x46\xa7\x1f\xa2\xda\xb1\x3e\xe8\x61\xa3\x06\x19\x49\x9e\x38\x3a\x22\x27\x76\x8c\x63\x0b\xb2\xbb\x5f\x21\xd7\xad\xd5\xe5\xe7\x22\xa0\x72\x6b\xbc\xf5\xba\xfc\x5c\x50\x8c\xd3\x28\x0e\x62\xe1\xfe\x27\xcc\xe8\x1c\x10\xd3\x98\x65\x54\x66\x18\x94\x7e\x67\xa7\x8c\x8c\x4b\x4d\x80\xcf\x99\x14\x3c\x37\xc7\x0f\xc1\x67\x0c\x67\x92\x80\x60\xf0\x09\x28\xf2\x9b\x93\x4f\xe7\xb7\x98\xb4\x74\xea\xd0\xf2\xdd\xfb\x95\x0a\xf1\x01\x96\xde\xa1\xd1\xdd\x21\xee\x37\xe2\xdf\xdd\x6c\x17\x94\x4f\xfc\x5c\x98\x77\xcb\x4b\x5d\xd2\x0c\xa1\x9f\x93\xac\x34\x77\xe1\xde\x76\x76\x7c\x1b\x78\x88\x25\x2f\xa6\x09\xdc\x01\x7f\xbf\x67\x9d\x8e\x6b\x8c\x83\x7a\xd1\xd8\xaf\x2b\x30\xe4\x9d\x6b\x3c\xac\x01\xa1\x5c\x11\x74\x8e\x55\x05\x4c\xd9\xcc\xc3\x71\x77\x71\xb7\xf0\x0c\x2c\x9d\x60\x93\xbf\x7d\x4d\xd2\x15\x0b\x23\xd6\x68\xd9\xbb\x0d\xbf\xc3\x61\x88\x77\x0c\x3a\x18\xa2\xe3\xec\xfa\x94\xab\x0b\x5c\x9a\xdd\x28\x0e\xdb\xe8\x77\x95\x26\x6b\x36\xc2\xfb\xeb\xbb\x66\x41\x0f\xeb\xfc\x13\x3b\xaf\xe4\x4d\xdd\x45\x5d\xf5\x06\x2b\xe2\x55\x0e\x54\x90\x53\x2b\x4e\x23\xf2\x6c\x25\x5f\xbf\xbf\xbe\xdb\x71\x2c\xbf\x9b\xad\x30\x3c\xa6\xca\xc6\x48\xbf\xbf\xbe\xb3\x71\x6b\xbb\xd1\xde\xd9\x91\xd2\xdd\x07\x81\x00\x6e\x88\xad\xd5\x81\x63\x87\x73\xb9\xf3\x2a\x1e\xc4\x2c\x3e\xfa\x7c\x2d\x35\xe4\xea\x86\xd0\x34\x95\x18\xce\xdc\xe5\x2c\xb7\x10\xed\x68\x51\x54\x51\xa9\x58\x24\x86\x2a\x68\xbe\x7a\x63\x0f\xa0\xe0\xd3\x71\xfd\x6c\x7b\x5f\x16\x19\xb3\xe1\xa7\xcd\x21\xea\x12\x3a\xb9\x98\x77\xe1\x4f\x21\x1e\xc6\xce\xfe\xc5\x20\xf9\x20\x2a\xe6\x9c\xe8\x5a\x9e\x36\xf6\x2e\x95\xa0\x44\x36\xaf\x8b\xe7\x07\xef\x4e\xc7\x8e\x30\x24\xb1\xda\x9d\xbe\x02\xed\x0b\xed\x4c\xe0\x5a\x32\x58\xdd\x95\xe4\xd6\xbc\x5d\x89\xec\xac\x22\x81\xcd\x01\x53\x96\x5c\x85\xe0\x0e\x23\xe3\x30\x3e\xef\x96\xe8\x99\xcd\xba\xa1\x1a\x4f\x26\x95\x5e\x14\xc0\x37\x0f\x78\xc5\xbd\x1c\x91\x25\x64\xfa\xf4\xfd\xf5\x9d\xbd\x49\xed\x74\x39\x3c\x6f\xb5\x76\xef\x74\xbe\xe4\xc8\xfe\xcb\x24\x85\xb8\x6d\xa2\xe5\x94\x56\x25\x4d\xd9\xda\x09\x3e\x56\x81\x10\xa9\xb7\x2e\x34\x21\x2c\x11\x38\xc0\x72\x10\x84\x54\xda\x8e\x0d\xf1\x69\xaf\x4f\x4c\x16\x8e\xb6\x97\x77\x8d\x7a\x57\x28\xa0\x32\x99\x75\xd9\xd8\xb1\x2f\x0b\x4b\x09\x49\x85\xcd\x10\x9b\x08\x89\x1e\xf8\x21\x8a\x3a\x99\x10\x0f\x65\xf1\x32\xd2\x8d\x1b\xb8\xa0\x7a\xf6\x62\x97\x48\x6b\x8c\x5e\xbe\xe9\xbe\x67\x53\xae\xba\xe4\xb9\x04\x2a\x5f\xa0\xad\xca\x85\x23\xd7\x48\x6d\xbb\x5f\x46\x2d\x33\xd8\x45\x56\x2a\x0d\xf2\x1b\x26\x95\x3e\xda\xb5\xa7\x4f\x34\x63\x0e\x38\xd9\x86\xb0\x1c\x37\xbb\xfb\x0b\xd3\x33\x57\xa8\xf7\x78\xd0\xfe\xca\xfc\xed\xc8\x38\x26\x42\x92\xe3\x6b\xc1\x61\xe7\xe0\xa1\x25\x0d\xb4\x12\x7c\xaa\x2b\x7d\xa3\xcc\xe6\x26\x51\x41\x66\x41\x55\xf0\x8b\xce\xe7\xec\xde\xd5\x4e\x36\xf4\x78\x49\x41\x81\x26\x14\x8b\x4e\x62\xdf\xb3\xba\x60\xb1\x2d\x8e\x66\x0b\x3d\x0b\xa7\xf3\x2e\x1a\x4b\xbb\xe3\xe0\x8d\xea\x6a\x5a\x6c\x5e\x80\x2e\xaa\xed\xce\xe7\x0c\x11\x43\xc0\x95\x93\xf9\x81\xf1\x87\x1d\x0f\x79\xd8\x09\xb9\x5c\x19\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\xb1\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xba\x2a\x6b\x0c\xe0\x6a\x60\xc3\x5c\xbc\x85\x5b\x2d\xb8\xa6\x58\x6b\xfb\xbd\x48\x1e\x40\x92\xcc\xd0\xbc\xeb\xe6\xab\xf3\x58\x5b\x55\x95\x77\x4e\x6b\xe9\x1a\x91\x01\xc5\x0c\x72\x90\x34\xab\x0c\xa0\xaf\xba\xe8\x3f\xb8\xdb\xbb\x22\xa3\x99\xc4\x69\xcb\x23\xba\x42\xb9\x22\x1d\x91\xcb\x75\x4f\xe5\x74\xe1\x0b\xbf\x33\x8e\xbe\xc3\xcf\x4c\xe9\xdd\x6f\x98\x42\xa4\x4d\x8c\xd4\x52\x81\x1c\x56\x98\xb9\x84\xba\xe2\x8b\x3e\x9f\x36\x85\x71\x39\x9d\x32\x3e\x1d\x59\xf1\x00\xc5\x90\xba\x40\x6c\x6d\x0b\x7b\x9c\xc1\xae\x11\x32\x89\x04\x8a\xf1\xc3\xa8\xac\xd8\x90\x09\xd6\xec\x3d\x17\xa9\xed\x7c\xbc\xb0\x16\x58\xbf\x27\x2b\x20\x25\x72\xc5\x89\x90\xae\x2e\x06\x4d\x53\xb2\x73\x98\xce\x9a\x15\xc1\xbe\xea\xf9\xb5\xc4\x95\xb5\x7f\xfe\x58\xd5\xbf\x6a\x2c\x90\x2a\xc7\x46\xf6\x2d\xe5\xae\xb5\xae\xbb\xca\x28\x9d\xe4\x93\x50\x59\xf4\x9c\xd7\xdb\xf3\xa2\x89\x44\x40\x89\x86\xbc\x10\x92\xca\xc5\x72\xba\x89\xb9\x49\xcc\xf6\x35\x0b\xb4\x34\xb7\x37\x22\x35\x42\xc2\xce\x64\xac\xd9\xb6\x73\x66\xd4\xce\x75\x3b\x77\xed\x79\xc2\xab\x8d\x0b\xe2\xd7\x8c\x74\xa0\x42\x25\x33\x48\x4b\x44\x9f\x9a\x96\x54\x52\xae\xc1\xf0\x4f\x17\xc2\xba\x68\x05\x72\x54\x48\x0d\x15\x6c\xdb\x02\xf3\x46\xb1\xb8\xb3\xf9\x04\xeb\x4a\x77\x09\x37\x71\xc2\xb1\xe9\xa8\x01\x07\x71\x3f\x03\x62\x24\xc9\x0c\x34\x4e\x3e\xcc\x59\xa2\xfd\x20\x13\x5c\x84\x35\x5b\x3f\xa1\xa5\x85\x7a\xd8\x3d\x00\xe8\x46\xb8\x3a\xaa\x09\x98\x3b\x49\xab\x7a\x6a\x5d\xd6\x23\xeb\x14\x57\x72\xef\x4f\xf6\x3a\x82\xeb\x83\xf9\xcc\x91\x44\xa3\x48\x67\xa6\x89\x6f\xf7\x04\x63\xae\xd6\x78\xcd\x4a\xec\x38\x54\x80\x01\xa6\x7b\xca\x43\xa7\x54\x85\x10\x5b\x0f\x95\xd3\xbd\x25\x01\x9d\xcb\x69\x99\x63\xd2\xbc\xd3\x6d\x81\x6b\xb9\x28\x04\xeb\xea\xb7\x37\x47\x0d\xdd\x8c\xc7\x8a\x5c\x7c\x78\xdf\x04\x7c\x6b\x96\xe9\xf3\x70\x80\xdd\x06\xf9\x14\x37\x40\x81\x5c\x4d\x08\xad\x84\xbe\x4e\x14\xd5\x17\xb5\xb3\xf9\x38\xd7\x6f\x45\xa0\xb7\xc0\x32\x5e\x18\x09\x16\xe5\xf4\x46\x5d\x9f\x64\x46\xf9\xd4\xb0\xaa\xf7\xa2\x34\x2f\xf6\x9b\xdf\xe0\x4b\x48\x48\xcb\xa4\x63\x70\x29\x02\x46\x3b\x54\xa4\xdf\xf8\x30\x2f\x57\x40\xcc\xe8\xa2\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x95\x72\xdf\x11\x36\x82\x11\x39\xfa\x4d\xe3\xab\x23\xa4\xb8\x13\x35\x85\x14\xe6\x55\x1c\x08\x13\xbe\x7d\xc6\x34\xf2\x8f\xa3\xe6\x08\x23\x72\x69\xe8\xc2\xa8\xe9\x6a\x6d\x1b\xb8\x3a\xe3\x7a\x65\x07\x44\xc2\x94\xca\x34\x83\x8e\x00\x22\x62\x52\x29\x19\x16\xa8\xd2\xed\x2a\x64\x8c\x88\x2b\xc0\x85\x1e\xc5\x71\x7d\x6f\x8b\x68\xa7\xa9\x7a\x50\x67\x56\x9d\x19\xa6\x54\xd3\x21\x2d\xac\x3d\x88\x09\x7e\x66\x4d\xdd\x43\x57\xa4\x7c\x48\xdd\xe9\x1d\x56\x3b\xfb\xec\xd7\x0e\x7e\x75\x48\xab\xa7\x18\x1f\xd2\x21\x96\xed\xee\x6c\xbf\xd9\x43\xda\x5d\xf4\xc0\x99\xa0\x72\x4c\x01\x65\xf7\x63\xb0\xe9\xcb\x8a\x2b\xdb\xa5\x18\x91\x6b\xa1\x7d\x75\xfd\xb4\x4e\x34\x0c\x28\xce\xde\x64\xdc\x97\xd7\xf7\xb7\x7f\xbd\xf9\x78\x75\x7d\xdf\xf3\xef\x9e\x7f\x63\xeb\xf9\x77\xcf\xbf\x3b\x0c\x7c\x28\xfc\x1b\xf8\x7c\x5f\xbc\xbb\xb2\x77\xad\x33\x30\x2e\x55\x7b\x0d\x4c\x14\xff\x8a\x12\xed\x2f\xf9\xfc\x13\x35\xaa\x63\x21\x41\xa1\x82\x62\x34\xd6\x75\x41\xca\xee\x01\xb4\x04\xd6\x31\x9d\x5f\x6c\xa6\xfd\x1e\xf3\xe4\x23\xe6\x89\x5e\x37\x6a\x78\xac\x5b\xb5\xba\x64\x10\x25\x17\x7f\xbb\x7a\x7f\x79\x7d\x7f\xf5\xcd\xd5\xe5\xed\x5e\x53\x08\x02\x8b\x96\xc6\x4b\x1e\xd8\x45\x3e\x0a\x18\xa6\x96\xac\x0a\x09\x73\x26\x4a\x95\x2d\xaa\xea\xf8\xeb\xd9\xd5\x2a\x68\x41\x60\x2e\xd6\xc2\x7b\x73\xd6\x0f\xb8\x24\xdb\xad\x93\xd3\x02\x86\xdf\xb3\x84\xe7\x88\x88\x21\xe7\x05\x8c\xbf\x46\x42\xdc\x5e\xda\x0b\x18\xb7\x93\x9c\xb8\x49\xe6\x0b\xa0\xa3\x2d\x2d\x06\x74\xd4\x4e\x56\xd9\x3f\x27\xfb\x46\x8a\x3c\x12\x37\xbb\xb3\x76\x63\x1f\xc2\xb0\xee\xa8\x56\xc1\x4d\x4d\x29\xc4\x69\x8e\x75\x89\x12\xa3\xb5\xe6\x85\xee\x98\x5e\x41\x62\x95\x67\x8f\x53\xc9\xdc\x06\xa7\x7f\xa0\xc5\xf7\xb0\xb8\x85\xc0\x62\x4c\xed\xf9\xc6\x30\x07\x45\x28\x79\x80\x85\x8d\x61\xbc\xf0\x83\x85\xd5\xa3\x3a\xc0\xea\xf6\x0f\xd0\x0d\xf3\xdd\xb7\x78\x65\xe9\x1f\x20\x00\x91\xc0\xb7\x95\x9a\xe5\x66\x09\x51\xcc\x37\x6b\x7a\x50\x55\xda\x0f\xb5\x0c\x7f\x53\x7a\x74\xd7\x43\x84\x89\x5b\x46\xa5\x81\xc9\x04\x12\xed\x33\xdd\xed\x6e\x1e\x60\x32\x64\x5a\xda\x52\x9a\x34\x79\x78\xa4\x32\x55\x24\x11\x79\x41\x35\x1b\xb3\x8c\xe9\x45\x58\x1a\xbc\x6f\x78\xc3\x57\x38\xde\x96\x29\x92\x2b\xae\x34\xc5\xab\x50\x38\x7b\x9b\x59\xed\x1a\x4c\x17\x31\x77\x2d\x37\xc5\x84\x1b\x2a\xc3\xeb\xdf\x1b\x52\x72\xa1\x34\x49\x40\x1a\xa1\x2e\x5b\x90\x47\x29\x78\x47\x88\xeb\x76\xdb\xb1\x8a\x8b\x98\x1b\x59\x10\x1e\xcf\x5c\x3a\xde\xd0\xbc\xf8\xd0\x32\x2b\x75\x86\xc9\x1e\x67\xbf\xc6\xff\x1c\xd2\x29\x22\x3e\x99\xef\x1d\x39\x3a\x0a\xec\x4b\xf8\xd8\xa0\xb8\xa7\xf2\xce\xc5\xac\x35\x45\xa7\xea\x42\x21\x16\x78\x17\xf9\x94\x87\x1b\x70\x5a\x40\xa4\x69\x0e\x43\x8d\xb1\xad\x65\x10\xca\x69\x11\x66\x0f\xaa\x1b\xb2\x83\xb8\xb7\x77\x30\x0f\xac\xaf\x7f\xcb\xac\xaa\x62\x98\xe9\x3b\x0f\xa3\xa1\x48\x0e\x9a\xa6\x54\xd3\x91\x39\x10\x83\xf6\x9f\xaa\xa0\x09\x0c\xc8\xdf\xab\x0f\x33\x3a\x86\x4c\xfd\x78\xfc\xef\xdf\x5f\xfe\xf5\x3f\x8e\x7f\xfa\x7b\xf3\x3b\x14\xd7\xd0\x3e\xd9\x7c\x20\xf0\x15\x30\x24\x89\x8b\x14\xae\x91\x3a\xfc\xd3\x69\x7a\xe7\x49\x22\x4a\xae\xdd\x17\x88\xa1\x3e\x9a\x09\xa5\xaf\x6e\xaa\x3f\x0b\x91\x2e\xff\x15\x50\x29\x8f\x1c\xa6\xdc\x83\x6b\x1b\x80\xa9\x68\x5b\x3c\xe9\x87\x16\xec\x13\x48\x15\x04\xc3\xe7\x5b\x3b\x31\xc2\xf6\xea\xb7\xb1\x4a\x66\x90\x53\xfc\xe7\x37\x7e\x0a\xcc\x7d\x5c\x55\xb9\xe0\x08\x56\x6f\xee\xc0\x76\xe9\xdc\xa3\xf9\xdb\x20\x8d\xd3\xb6\x88\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x4a\x7e\xf4\x56\x8a\x3a\xda\xf0\xfc\xe6\x8a\xcc\xed\x0c\x1f\xd0\xe4\xbc\x14\xbb\xf6\x31\x4c\xdf\x1c\x34\xdb\x6e\x46\x5a\xb5\xec\x65\xef\x08\xc2\x29\xf9\xef\x5d\x49\x03\x55\x95\x71\x04\xa5\x43\x65\x9b\x13\xdb\xe5\x28\x29\xca\x81\xeb\x7e\x94\x43\x2e\xe4\xa2\xfa\xb3\x8a\x0f\x1b\x2a\x2d\x24\x9d\x22\x20\x9d\x1d\xdc\xfe\xac\xfa\xcb\xfe\xb0\x45\xde\xea\xaf\xad\x41\x32\x29\xa5\x91\xd3\xb3\x45\x8d\xf4\xf4\xd5\xb1\x6c\xbf\x6e\x07\xc2\xb1\xab\x6d\x75\x1d\x5f\x91\x3b\xae\x23\x5a\x51\x4d\xac\x66\x11\xad\x40\x0e\x38\x7a\x50\x09\xac\xd6\x54\xc9\xe7\x64\x4e\xa5\x0a\x29\x6c\x6e\x5b\x44\x26\x9d\xb2\x39\x53\x22\x00\x14\xa8\xea\x68\x55\xa2\xf6\xc8\x0a\xae\x44\x89\x4d\x54\xa8\xfc\x1e\x9f\x0b\x2c\x57\x56\x1d\xf6\xa5\xdb\xec\x6d\xa8\xb2\x40\x48\x41\xb5\x06\xc9\xdf\x91\xff\x75\xf2\x9f\xbf\xfd\x79\x78\xfa\xa7\x93\x93\x1f\xdf\x0c\xff\xed\xa7\xdf\x9e\xfc\xe7\x08\xff\xf1\xcf\xa7\x7f\x3a\xfd\xd9\xff\xf1\xdb\xd3\xd3\x93\x93\x1f\xbf\xff\xf0\xed\xfd\xcd\xe5\x4f\xec\xf4\xe7\x1f\x79\x99\x3f\xd8\xbf\x7e\x3e\xf9\x11\x2e\x7f\xda\xb2\x93\xd3\xd3\x3f\xfd\x26\x98\xf4\x08\xf5\xcb\x6d\x8b\x59\xc5\xbc\xdd\x63\x24\xed\xf0\x45\x2a\x9a\xd7\xcd\x6f\xaf\xd8\xe7\xdf\x67\xe6\xbe\xab\x6f\xb3\x4a\x0a\x39\xa0\x03\xfe\x52\x82\x86\x82\x44\x82\x7e\x0d\xcb\xae\x1d\xa9\x51\x70\xc1\x25\x55\xa3\x12\xf7\xb5\xdd\xa0\xbf\x04\x63\xaf\xd7\x73\xec\xba\xd6\xa2\xfb\x44\x8a\xdc\xe1\xb7\x5b\xcf\xf7\x1c\xb3\x31\xdd\x73\x0f\x10\xe0\x15\xf1\xad\x37\x0e\x77\x6e\xbd\x71\x78\x03\x29\xbd\x71\x38\xa8\x7d\x91\xc6\xe1\x3b\xcb\x93\x7e\x91\x96\xe1\xf8\x98\x8b\x1d\x63\xba\x62\xc2\x2d\x02\x9f\x77\x8d\x07\x88\x19\x04\xe9\xcd\x1e\xcd\xa2\x9a\xdb\x45\x1a\x75\x8f\x6a\x37\x2b\x57\x85\x35\xd5\xa1\xf2\x56\xa4\xcd\xd7\x87\xa1\x91\xf3\x2c\x23\x8c\xdb\x0b\xda\x74\xd0\x69\xf4\x1a\xb2\xc3\x21\x5f\x3b\xa4\xe3\xb9\x79\x55\x9f\xfa\xd8\x2e\x62\x8d\x99\x72\x98\xa9\xf9\x17\x9b\x08\xf9\x60\x73\x23\x95\xc6\x29\xf1\xa5\xc9\x3b\x91\x53\xa9\xa1\x36\x72\xc6\x5c\x14\x54\x29\x91\xd8\xbc\xd1\x0a\x6a\x01\x6b\x8a\xba\xe9\xc1\x37\xd0\xf4\x01\x43\xc4\x12\x48\x81\xef\x9a\xd1\xeb\xdb\x27\x8b\x39\xe1\xd7\x61\xbc\xc0\xd2\xd8\x7c\xee\xee\x2f\x92\x7a\xd8\x13\x7c\xe3\x78\xe3\x7e\x5d\x31\xb1\xe6\x0c\xbb\x60\x9c\x46\x68\x2c\x4a\x9b\x75\x6a\x27\x46\x14\x8b\x49\xed\xe1\xc3\xe8\x26\xcb\xd2\xbb\x6d\xe4\x60\x45\x22\x5c\x6c\xaf\x82\x6d\x82\xf4\xb1\x15\x79\xbd\xf6\x82\xb6\xe5\xf4\xaf\x21\x3e\x29\x5c\x82\x8f\x2b\xbd\xbf\x84\xe4\x7e\x28\x52\xfb\x81\x48\xec\x2f\x23\xad\x1f\xa6\xa4\x1e\x4d\x4a\x8f\x23\xa1\xc7\x91\xce\x77\x08\xdb\x88\x29\x91\xc7\x91\xc6\x5f\xc2\x16\x57\x48\x98\xb0\xcf\x91\x38\xbe\x87\xde\x21\x1a\x3e\xa3\x65\xa6\x90\x50\x00\xaf\x90\xdd\x7c\x51\x54\xa0\xc9\xec\xcb\xc9\x5b\xb0\x06\xa4\xb8\xf7\xe2\xdd\x3a\xe3\x55\x7f\x29\x92\xfe\x52\xdc\xa1\xf5\x97\x62\x7f\x29\xbe\xca\xa5\xe8\xb8\xd5\xd7\x7f\x23\x46\x4e\x8b\xc5\x84\xff\xbd\xd7\xdf\xb0\x64\x04\x00\x09\xef\x78\x14\x6b\xc0\xa2\x33\x1c\xb9\xcb\x89\x0b\x3a\x67\x38\xea\x4d\x99\x65\x5d\x40\x49\x6d\x8b\xb1\x00\x57\x38\xed\x45\x99\x65\x0e\xc8\xb2\xdb\xec\x7f\xe4\x78\x81\x9d\x67\x8f\x74\xa1\x06\xe4\x1a\xe6\x20\x07\xe4\x6a\x72\x2d\xf4\x8d\xb5\x50\x74\xeb\xb7\x99\x4f\x65\x3b\x27\x6c\x42\xde\x65\x54\x83\xd2\x44\xd3\x29\xda\xcb\xea\x52\x2b\x42\xb6\x06\xad\x8b\xc9\xed\xd1\x70\x14\xbe\x37\x7f\xed\xd1\xfe\x86\xfb\xd9\xab\x19\x9b\x40\xb2\x48\xb2\x70\x36\xf1\x83\xef\xc9\x67\x82\x79\xf1\x00\x43\x87\xd6\xc0\x89\x7d\x81\x98\xed\x85\x50\xfa\x4e\x53\xa9\xf7\x0d\xdc\x7e\xe3\x09\x31\x93\x9d\xd0\x2c\x83\x94\xb0\x3c\x87\x94\x51\x6d\x04\x41\x3a\xd1\x20\x9b\xa5\xe9\xf1\x39\x5b\x90\x6f\x64\xeb\xf7\xf9\xda\xa6\x92\x4c\x28\xcb\x54\xf7\x88\xf0\x15\x23\xb7\xad\xa7\x4d\x5d\x2d\xc7\x06\x1c\x20\x4d\x12\x21\x53\x4c\x76\x15\x1e\x36\x0f\x5f\x22\x84\x3f\x99\xf6\x11\x45\x85\x9c\x72\x3a\x85\xdc\x95\x18\x6c\x93\x35\xce\x44\xf2\xa0\x48\xc9\x35\xcb\x5c\x21\x6f\xf1\x80\x02\x71\x86\x27\xb5\xf3\xd0\xdd\x19\x40\xf5\xcf\x61\x75\x08\x87\x86\x2a\x75\xf6\xeb\xfa\x2b\xfc\xa0\x23\x71\x11\xd4\xb2\x18\x4a\x19\x7c\x86\x24\x44\x40\x6c\x1b\xc9\x3f\x43\xd2\xa8\xe0\x4b\x3d\x74\x93\xc5\x63\x44\xc0\xa4\x48\xbe\x25\xdb\x22\xc5\xd8\xc4\x8a\x6b\x09\x00\xaa\x6a\xb6\xd8\x61\x1b\x17\x6e\x11\x98\x72\x33\x6f\xff\xcc\x18\x87\xf6\xc2\x28\x5b\xbf\x04\x9a\xb0\x96\xe6\xcf\x95\x02\x6d\x3e\x19\x39\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xd9\xf1\xe9\xca\x1e\x39\x36\x1a\x75\x06\x6a\xa1\x34\xe4\x16\x52\x34\xa9\x5f\x4a\xb1\xbc\xc0\x82\x81\x90\x1c\xfb\xfa\xa6\xc1\x94\x99\x3b\xd2\x62\x1c\xe3\xac\x38\x78\xaf\x01\x51\x82\x68\x49\x53\xe6\x6c\x59\xf8\xa9\x79\x48\xcb\xd2\x41\x16\x9f\x1c\xff\x7c\x3c\x20\xa0\x93\x53\xf2\x28\xf8\xb1\xc6\xe9\x1b\x91\x7b\x41\x4a\x15\x3e\x63\x15\x21\x0b\x51\x12\x0e\xe0\xce\x56\x85\x6a\x6e\xae\x1b\x22\x4a\x6d\xad\x6a\x54\x87\xc0\x92\x35\xdb\xe5\x67\xa6\x5d\x4e\x90\xe1\xdf\x6f\x96\x6a\xc8\x66\x6c\x0e\x67\x33\xa0\x99\x9e\xd9\x88\x75\x2e\xf8\xf0\x1f\x20\x05\x82\x98\x71\xf7\x4d\x28\x19\x61\xae\xc0\x66\x0b\x70\x0b\xae\x12\x14\x25\x58\x25\xb2\x76\xe9\x9b\xb9\xf6\xbe\x85\xce\x22\x11\x59\xe6\x47\xdf\xdd\xdf\xdf\x7c\x0b\xba\xc9\xe5\x39\x7e\x48\xbe\xbd\xbc\xf7\x79\x0a\x0d\x60\xef\x03\x60\xef\x71\x02\x28\x87\xa4\x10\xf2\x10\x6e\x99\x99\x50\x41\xcb\x49\x5e\xe0\x8a\xf9\x4e\x28\x6d\x0d\xf8\x5a\x18\xb6\xcd\x21\x31\x9b\xa0\x1d\x74\xef\x11\xd3\xaf\x6e\x46\xe4\xaf\xa2\x34\x13\x32\xa6\xe3\x6c\x41\x1e\x29\x77\xd6\xee\xb0\x48\x59\xd3\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x3b\xa0\x29\x48\x85\x0c\x1a\x68\x60\x4e\x4c\xc4\xe3\xde\xa0\x2d\xea\x52\x5e\x94\x4a\x8b\x9c\xcc\xdc\x6b\xb7\x01\xce\xdc\xe1\x1c\xd9\xe3\xea\x50\x6e\x24\x14\x96\x89\xbb\xdf\x7c\x75\x2c\x7a\x85\x7b\xd9\x79\x77\x9f\x8f\xad\x98\xda\x9c\x36\x67\x31\xb7\xf8\x29\x8e\xb7\x99\xad\x1a\x2d\xb6\x31\x42\x4c\x38\x89\x18\x17\x4e\xc2\xa0\xcf\x96\x3b\x42\xef\x41\x70\x4f\xf1\x42\xcd\x49\xb4\x70\x6a\xf2\x22\x21\xd5\xc4\x45\xca\xb9\xcd\x67\x3d\x47\x61\x75\xdd\x96\x3b\x6f\x94\xd3\x4a\x28\x17\x9c\x25\x34\x63\xff\x80\x94\x94\x85\xe0\x2e\x7f\x0a\x25\xdb\x84\x2a\x18\xa2\xbb\x95\x5b\x76\xae\x1a\x20\x5c\x86\x3b\x68\x21\x50\xdc\xc3\xa0\x27\xc3\xee\x2d\xd5\x71\x48\x8d\x1a\xf9\x1b\x8c\x28\xd7\x6c\x2b\x1e\xda\xd6\x62\xc5\xd9\xf1\xe4\x8b\x10\x27\x89\x4d\x7c\x0b\x4e\xba\x5e\x4d\xb9\xd6\x82\xd0\x24\x41\x98\x31\x7b\x5d\x21\xe3\xb5\x05\x66\x0f\xe6\xde\x36\x22\xe0\xa1\xc9\x5e\xd6\x89\x2d\x09\x2f\xf3\x31\xc8\x1a\xaf\x42\xea\xd5\x39\x8d\x62\x75\x71\xc3\xda\xe1\xbc\xdb\xcf\xcb\x18\x94\x4f\x81\xbc\x35\x23\xff\xf1\x0f\x7f\xf8\xfd\x1f\x22\x8c\x63\x5e\xaf\x8a\x14\xe6\xe4\xea\xfc\xfa\xfc\x6f\x77\x9f\x2e\x10\x05\x2f\xb4\xfb\x48\x89\x90\xb1\xd3\x20\xa3\x26\x41\xbe\x68\x0a\x24\xe2\x49\x04\x73\xd9\xd8\x47\xe2\x0e\xa9\x32\x9b\xb0\x54\x16\x39\xcf\xe9\x24\xce\xba\x6d\x4d\xcc\x2a\x42\xea\x52\xd3\x4f\x66\x18\xd6\x41\x70\x2a\x95\x01\x14\xd1\x34\xfe\x3b\xd3\x5b\x0b\x0c\x98\xa4\xbe\x28\x3c\x5a\x98\xda\xb6\x7c\x57\x17\x0e\x69\xf8\x8a\x94\x7f\x05\x89\xe0\x69\x88\x0a\x10\x4b\xa4\x75\x94\x44\x3d\x73\x77\xb6\x4f\x6f\x22\xae\xaf\x12\x37\x18\x6a\x92\xa1\x2b\x4a\xaa\x55\x8d\xc3\x27\x6d\xc6\x3f\xf6\xf6\xc7\x7f\xe9\xee\x20\x4b\x8a\x3b\x91\x3c\x44\x34\x91\x05\x32\xb0\xf7\xe6\xa4\x25\xd6\x17\x78\x7f\x71\x63\x89\x33\x2b\x73\xfd\xf1\xbe\x86\xf7\xc0\x74\x96\xda\xad\xfb\x9d\xf3\x16\x52\x9e\x92\x07\x28\xc2\xb4\x4b\xc3\x30\x7d\x5c\x5a\x3b\x2c\x0d\x6d\xef\xd2\x39\x91\x6d\x0a\xad\x65\x04\x3e\x9c\xcc\x4a\xc4\x61\xc0\xc4\x0d\xbf\x37\x3a\x02\x9d\x12\x32\xa1\x2c\x23\x14\xad\xf2\x9a\xe5\x60\x73\x78\xd0\xd8\x5f\x07\x22\x7c\x45\x0c\xe7\x6b\xb5\x36\x1e\xd7\x25\x38\x77\xb5\x1a\x86\x22\x1f\x7c\xdd\x6a\x80\xe3\xd9\xb2\x0a\xa4\xee\xd5\x80\x6d\x5b\xaf\x06\x74\x54\x03\x0a\x09\x77\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\x36\x84\xdb\x8c\x61\x22\x24\x2c\xc7\xdb\x34\xe2\x60\x5c\x28\x76\x40\xa8\xe9\xf9\xcd\x55\xe5\xfb\x12\xad\x58\x17\x9b\x6f\xea\x8b\x81\x66\x6c\x0e\x1c\x94\x3a\xc3\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x0e\x6a\xc4\x18\xf3\xba\xc0\xed\x87\xa0\x13\xeb\x37\xf7\x61\x45\x2e\x0c\xcc\x4f\xd7\x24\xc8\x9d\xdf\xa8\xdb\x29\xa9\x9a\x01\xe6\x3c\xc2\x67\xa6\x95\x1d\xf4\x06\x71\x55\xfc\x8c\x1b\x79\x61\x2a\x69\x02\xa4\x00\xc9\x84\x11\x31\x4a\xae\x53\xf1\xc8\xc9\x18\xa6\x8c\x2b\xbf\x62\x21\x24\xf9\x2d\x81\x91\x44\x4c\x55\xf5\xba\x46\xe4\xb6\x05\x68\xef\x10\xa4\x12\x51\xf3\x4c\x37\x45\x83\x48\x53\x82\xc2\x0b\x6e\x83\x92\x66\xd9\xa2\xde\x78\x3e\x1f\x5a\x6f\x9e\xa1\xee\x1b\xc2\xce\xec\x49\xc9\xf1\x45\x53\xc8\xe8\xc2\x66\xfe\x4e\x18\x47\xeb\xaf\x54\xa7\xa3\xf0\xd0\xac\xce\x04\x0a\xd9\xe8\x73\xe3\xce\x60\x8a\x48\xa0\xc9\x2c\x44\xb2\xeb\x63\xc0\x9e\x6b\x7d\x0c\x58\x1f\x03\xd6\xc7\x80\xad\xb6\x3e\x06\xac\xdd\xfa\x18\xb0\xcd\x04\x1d\xb2\xd3\xae\x8f\x01\xeb\xad\x32\xab\xad\x8f\x01\xeb\xd4\xfa\x18\xb0\x67\xdb\xc1\xb1\xe8\x3e\x06\x6c\x8b\xd6\xc7\x80\x6d\xd9\xfa\x18\xb0\x3e\x06\xac\x8f\x01\xeb\x63\xc0\x02\x5a\x1f\x03\xb6\xfb\xeb\xf5\xce\x9f\xee\xad\x8f\x01\xeb\x63\xc0\x76\x6c\x7d\x0c\xd8\x52\xeb\x63\xc0\xfa\x18\xb0\xa7\x5a\x1f\x03\xd6\xc7\x80\xb9\xd6\x5b\x1b\x57\x5a\x1f\x03\xb6\xa6\xf5\x31\x60\xbb\x8d\xd3\xab\x01\x61\x9d\xbd\x88\x1a\xa0\xb4\x28\xee\xd8\x34\x00\x68\x30\xd6\x31\xb8\xab\x28\x71\x28\x84\x8a\x3c\xce\x58\x32\x23\xca\x7e\xe8\xed\x58\x88\x50\x66\x0e\x44\x33\x4a\xa7\xbe\x49\xc6\x60\x54\x04\xf3\x5a\x45\xc8\x6d\x72\x35\x41\x07\x72\x03\x24\xcd\x9c\x0a\xc7\xd6\xcc\x38\x0d\x38\xfe\xb6\xf8\xec\x6f\x37\xc6\x8d\xee\xd2\x9d\x82\xc6\x7c\x24\x94\xdb\xea\x97\xf8\xfa\x58\x2d\x8f\xdc\x88\x54\xf9\x0a\x00\xfc\xff\x67\xef\xdd\x7b\xdb\xc8\xb1\xbc\xe1\xff\x9f\x4f\x41\x64\x06\x8f\xed\x6d\xc9\x4e\xe6\x86\x99\xc6\xe2\x6d\x78\x1d\x77\xda\x98\xc4\x11\x6c\x27\xf3\x0c\x7a\x7a\x7b\xa9\x2a\x4a\xe2\xba\x8a\xac\x26\x59\xb2\x35\xe8\x0f\xff\x82\x87\x97\x62\x49\x72\x12\x91\xb4\x25\xa7\x55\x0b\xcc\x76\x24\xb9\x78\x3f\x3c\x97\xdf\xf9\x1d\xce\x86\x86\xfd\xf3\x18\xca\x05\x73\x79\x9c\xe0\x0d\x4e\x24\x3d\x33\x18\xb9\x91\xe0\xe3\x74\xe2\x33\x78\x8b\x84\x22\x99\x5f\x29\xed\x59\x0a\x7a\x67\x6b\xc8\x9d\x1d\x41\x3e\x65\x40\xeb\xe4\xbc\xc3\x77\x14\xa5\xb3\x9b\x08\x9d\x5d\x44\xe7\x6c\x03\x99\xb3\x75\x54\x4e\x9e\x70\x6f\x86\x50\x6f\x26\x4d\xe9\x11\xc2\x26\x16\xe0\x7d\x33\x13\x44\xce\x78\x15\x2d\x70\x72\x09\x9b\x77\x94\xd1\xba\xad\xf5\xd9\x95\x5a\xa6\xd0\xb9\x07\xa1\x4b\x27\x32\x2c\x36\xdd\x44\xc2\xf5\x0f\x69\x49\xa0\x04\x31\xa6\x95\xde\x5a\x40\x62\x39\xc3\x73\x50\x96\xda\xa2\x20\xa4\x4c\x51\x97\x42\x2f\xea\x1f\x8f\x7d\x0f\x0d\x19\x39\x95\xe8\x55\xda\x55\x93\xa6\x8f\x07\x6e\xa6\x3f\xfe\x21\xea\x1d\x53\xd1\xe4\xb9\xa5\xdf\x5c\x8d\xce\x7a\xb7\x34\x7c\xf0\x03\x1c\xe3\xb3\x19\x29\x6e\xaf\x2c\xc4\x63\x7b\x37\x73\xba\xfb\x23\xc9\xf5\x91\x43\x31\x48\xb5\xee\xfb\x3a\xa8\x36\xc0\xfb\xa1\xb9\x29\xac\x22\x11\x73\x5a\x90\xe3\x27\x30\xa0\x73\x19\xa5\xe9\x07\x01\x81\xfb\x1a\x06\xbe\x2b\x6a\xd7\xb5\xe9\x8e\xf7\x7c\x07\xbe\x13\xdb\x53\x00\x33\x56\xb8\xf0\x6b\x33\x5d\x7f\xe8\x92\xba\x71\x28\x09\xf1\x29\x0a\x53\xaa\x66\xed\xf8\xb8\xe0\xf5\x89\x16\x1d\xe6\x7f\xc6\x15\x1f\x9f\xd4\x58\x2a\x22\x4e\x4a\x5e\xd8\x6b\x7d\x58\xe8\x1e\x50\x36\x3d\xae\xcb\xa3\xe3\xff\x93\xd4\x87\x0b\xeb\xc3\xb5\xe9\x41\x0f\x18\xaf\x63\xa2\xe5\x3e\x17\x4b\x56\xac\x9e\x94\xf4\x4d\x9a\x7c\x7f\xa7\x56\x4f\x48\x84\xcb\x6e\x05\x2a\xbb\x97\xda\x28\x83\xa3\x3a\xa7\x50\xd9\x0d\x38\xec\xa3\x41\x61\xb3\x9c\xd5\x4c\x10\xd8\x1d\x82\xbf\xee\x8c\x2d\xb4\x2b\x90\xd7\x1d\x2c\x83\x9f\x01\xe6\x9a\x03\xe2\x9a\x0f\xde\xba\xab\xd5\xe2\x1f\x0d\xd2\xfa\x2c\xe0\xac\x19\xe3\x36\x99\x60\xac\x4f\x01\x61\xdd\x5d\x1f\x0c\xca\x00\x5b\x7d\x3a\xc8\x6a\x96\x79\xcc\x6a\xc5\x26\x8a\x84\x2d\x40\x54\x9f\x22\x2e\xfd\x68\x31\xe9\x0c\xf1\xe8\x9c\xb1\xe8\x6c\x71\xe8\x47\x83\xa2\xa6\xc3\x50\xb3\xfa\x14\x9e\x04\x7e\x9a\x13\x7a\x9a\xbc\xbe\x94\x51\x45\x71\xf5\x9a\x54\x78\x71\x9d\x06\x50\xcc\xb5\x12\x97\x2b\x20\x46\xe3\xb6\xee\xc7\xdb\x67\xd8\xd6\xfe\x27\xa5\xa3\x1e\x71\x41\x68\xab\x02\x43\xfc\xd8\x8c\x2f\xba\x18\x19\xda\x9c\x8b\xe2\x8e\x8b\xdb\x8a\xe3\x52\x9e\x34\xdc\xfc\x4f\xc7\x44\x11\x50\x50\x24\xa9\xe9\xbb\xe1\x1e\x37\x7c\x1f\x3b\xb2\x6b\x7e\xe0\x77\x88\x4f\x14\x61\xe8\x90\x32\xb7\x73\x8e\x02\x2f\x4d\x17\x1e\x49\x8e\x77\xe8\xb7\xbe\x7a\xe9\x1a\xf9\xfa\xe2\x1e\x10\x19\x92\x72\xa7\x23\x5f\xb6\x8f\x9f\x0f\x7d\xd9\x1f\x4e\xda\xaa\x1f\xfe\x32\x21\xb1\x3c\xb1\xaf\x57\x5d\x99\xeb\x57\xd0\x1f\x2f\x8a\x30\x2b\x91\xe5\x8d\xfa\xfa\xf6\x49\x32\x04\xbb\x6f\xdc\x78\xcc\x74\x1f\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xaf\x40\x01\xdd\x3b\x5d\x77\xc6\xe9\xba\x25\x64\xf0\xd7\x67\x6d\x3d\x3d\x12\x78\x6f\x6d\xfd\x56\xac\xad\x80\xae\xed\x8d\xc0\x05\x19\xed\x92\xf2\xe6\x04\x48\x97\xa0\xd6\xe9\x70\x5e\x5c\x30\x42\x4c\x42\x53\x47\xc6\x07\xbc\x73\x93\xb6\xaa\x16\xc6\x87\xd8\x63\x66\x8c\xdf\x5a\x37\x33\xb2\x42\x69\x07\xa1\xd4\x35\xbd\xeb\x6c\x93\x46\x70\xab\x91\x88\x96\x31\xad\x62\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\xf7\x08\xf7\x2c\x38\x1a\x80\x9e\x33\x82\xba\xbc\x9a\x7e\x47\x74\xab\x13\x2e\x0a\x3a\xae\x16\x68\x86\x2b\x6d\x2c\x59\xf0\xf0\x2d\xad\x2a\xfb\x9a\x04\xb0\x32\x51\x26\xf4\x6c\x34\x9a\x8a\xb3\x29\x4c\x06\x36\x1d\x21\xf7\x0d\x29\x74\x9b\x45\x45\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x2b\x5c\x3f\x93\xd0\xda\x41\xeb\x54\x22\x46\xab\x81\x9b\xf2\x3e\x35\xe3\xea\x9e\xef\x5c\xca\x92\x94\x96\x55\xf1\x8e\x4a\x32\x80\x77\x46\xf7\xc9\xf4\x85\xcf\x89\x10\xb4\x24\x66\xdf\x98\xcf\x1a\xc1\xe7\xb4\xec\xb0\xe3\x7a\x5b\x00\x6e\x3b\xba\xad\x8f\xf0\x5e\x27\x5a\x19\x67\x43\x46\xa6\x18\xd4\x63\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\xac\xa4\x05\x56\x44\x02\x56\xbe\x47\xb9\x3a\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x19\x6f\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x69\xcd\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\x21\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\xc4\xd4\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\xa3\x24\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\xf9\x9a\x3c\x94\x0e\x78\x65\x72\x7c\x5f\x5f\x5e\xff\xfc\xf6\xf4\xbf\xce\xdf\xc6\x6d\x01\x90\x75\x2c\xd4\x9d\x5b\x46\x7f\x69\x09\xc2\x35\x67\x53\x84\xab\x30\x05\x66\x00\x8e\xce\xe0\x03\x90\x8a\x79\x93\x65\x22\xf5\x5a\x7d\x09\x44\x09\x86\x15\x38\xe6\x53\x64\x04\xc5\xa2\x40\x12\xd0\x1f\x7d\x24\x8c\x1b\x03\xe0\x4f\x7b\xe4\x0d\x8c\x28\x7d\xc6\x8d\x41\x48\x19\xc2\x48\x52\x36\xad\x92\x6d\xc1\x64\x8f\x48\xaa\x3f\x64\xd8\x8d\x60\x14\xeb\x16\x49\x77\x8a\xf4\xfa\x10\x6f\x55\xe6\x73\x08\x74\x97\x99\x73\x01\x90\xfb\x86\x4b\xe2\x5c\x00\x46\xc7\xbd\x18\x21\x5c\x96\x22\x49\x8f\xb6\xc2\xc6\xdb\xe8\x86\x20\xc0\x34\x6b\x42\xbf\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x0e\x81\xbf\xc4\x37\x95\xc7\xdc\xce\x81\x68\x9e\x71\xa9\x2e\x46\x99\x16\xfa\x1f\x33\xac\xe0\x8d\x7a\x3d\x14\x47\x63\x6a\x2d\x33\x72\xaf\x88\xd0\x1a\xb1\x5d\xc3\xd4\x99\x4b\x72\x2e\xe8\x0e\x3e\x97\xdd\x9d\x1a\x67\xbd\x98\xf4\x81\xd0\x4f\xb4\xbf\xa1\xe1\x1f\xb8\x54\x97\x56\x5a\x87\x2c\x17\x61\x3f\x6a\xac\x8a\x59\x5f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xe0\xfa\x2f\x39\x5c\x94\x26\x9d\x6d\x46\x13\x84\xc3\xee\x9c\xd8\x34\xc8\x5c\xbe\xad\xfb\xa9\xad\xb5\xe4\xde\x04\x35\xcc\xea\x6d\x41\xe5\x88\x86\x97\xc7\xe8\x1c\x17\xb3\x84\x5e\xe8\xd9\x28\x03\x65\xa0\xe1\xa5\xe9\xc6\x0c\xcf\xf5\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4e\xc1\x8f\x09\x32\x21\x42\x98\x94\xc9\xf1\xc2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x91\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\xc3\xeb\xd1\x00\xdd\x9c\x8d\x06\x88\x0b\x74\x7d\x96\x86\x03\x09\xad\xd1\x17\x37\x67\xa3\x17\x5b\x5d\x81\x20\x9d\xe3\xe6\x6c\x14\xf1\x92\x55\x24\x61\x8d\x9b\xe1\x2d\x59\x44\x6a\x77\x39\x34\xcc\xa1\xdf\x58\x59\x06\x64\xa6\xb9\xc6\xcd\xc6\x6f\x13\x04\x97\x74\x4f\xb6\xf0\xe5\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\x76\x17\xe8\xbf\x27\x5b\xf8\xec\xb3\x27\x5b\x78\xf0\xd9\x93\x2d\x6c\xf4\xec\xc9\x16\x56\x9f\x3d\xd9\xc2\x27\x9e\x3d\xd9\x82\x7f\xf6\x64\x0b\x7b\xb2\x85\xe7\x2b\xb5\xf7\x64\x0b\xcb\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\x08\x9f\x3d\xd9\xc2\x03\xcf\x9e\x6c\x61\x4f\xb6\xb0\x27\x5b\xf8\xf4\xb3\x27\x5b\x88\x7e\xf6\x64\x0b\x9b\x3d\xfb\xf4\x9f\x0d\x9f\x3d\xd9\xc2\x9e\x6c\x61\xf9\xd9\x93\x2d\x7c\xf6\xd9\x0d\xf7\xf8\x9e\x6c\x61\x4f\xb6\xf0\xc9\x67\x4f\xb6\xb0\x27\x5b\xf8\xe4\xb3\x27\x5b\x88\x78\x76\xce\xe9\xba\x27\x5b\xd8\x93\x2d\x7c\xaa\x8d\xbd\xb5\xb5\xd9\xb3\x27\x5b\xd8\x93\x2d\xac\x3c\x7b\xb2\x85\xd5\x67\x4f\xb6\xb0\x27\x5b\xd8\x93\x2d\xec\xc9\x16\xfc\xb3\x27\x5b\xf8\xda\xfd\x4e\x82\x48\xfa\x6f\x32\xe2\x15\x2d\x16\xc9\x79\x26\x57\x44\xf2\x56\x14\xfa\xc6\x86\xd7\xa2\x06\xde\xeb\x3d\x0a\x49\x4a\xf6\x8e\x25\xef\x5f\x05\x13\x17\x26\xf1\x0b\x3b\x07\x8f\x31\x05\x3b\x91\xc8\xef\x06\x78\x19\x8f\x20\x80\x97\x28\x2c\x94\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\x12\x09\x43\xee\x11\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x25\x13\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x23\x88\xf1\x6b\x45\x9d\x38\x4c\xc2\x9a\xad\x96\xad\xa6\xaa\xe7\x05\xba\xe4\xea\xca\x1e\xee\xad\xad\x57\x66\xc4\x82\x9b\xc2\x74\x6e\x99\xc8\x05\xef\x2e\xb4\x2f\xce\x9d\x44\xe7\x6b\x3e\x85\xf8\xa7\x6c\xf4\x4b\xfc\x98\xa2\x3a\x84\x2b\x41\x70\xb9\x80\x6e\x14\x80\xd7\xeb\xfc\x7f\xcf\x30\x6d\xb3\xa8\x30\x8d\x07\xf9\xe5\x3a\xd2\x67\xd0\x0b\xa4\xf7\x6b\x07\x7e\x87\x3c\x32\xbf\x58\x03\x0f\xf1\xa6\xe6\x8c\x1f\xbb\xaf\xcc\x1f\x0f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x6e\xdc\x31\x84\xab\x66\xf6\x69\xf3\x2e\x25\x3d\xf2\xf5\x82\xe1\x9a\x16\xee\xb0\x9c\x9a\xbd\x49\x39\x5b\x32\x0c\xd3\x46\x62\x7a\xaf\x87\x54\xd7\xad\xc2\xe3\x8a\x1c\xa3\x0b\xb5\xb6\x82\x7e\x5a\x2a\x33\xca\x02\x61\x4d\x84\xaf\xae\xd5\xab\x61\xaf\x19\x42\x06\xc2\xb4\x54\xe2\x8c\x20\xc2\x94\x58\xe8\x6d\x39\xe2\xe5\xb5\xde\x99\xbd\x5f\x27\xf3\x34\x24\xa2\x56\x73\x20\x56\x13\xd1\xaa\x79\x30\xa6\xe9\xf8\xd2\xbc\xd8\xd2\x2e\x0a\x60\x68\x66\xc2\xa4\x9d\xde\xb6\xd0\x37\xc3\x1a\x89\x85\xf8\x24\xb1\x07\xba\xc5\x11\x2f\xb5\xde\x23\x88\x11\x5b\xfe\x8c\x1a\x1f\xe0\x85\xee\xdc\x2d\x38\xed\xb0\xea\x14\x22\x3c\xc7\xb4\xd2\x07\x38\xb1\x03\x3e\xe9\x39\x53\xf0\x26\x53\xb8\xc1\xe2\xeb\x77\x69\xb3\xd8\xcc\xac\x5e\x72\x57\x31\xe3\x92\x30\x90\x97\xd8\x27\xe1\xf8\x14\x01\x2b\x62\x4a\x73\x45\xa7\x02\x81\x2f\x26\x88\xd4\x8d\x5a\x0c\x10\x99\x13\xb1\x50\x33\x00\x0c\x08\x6e\x40\x24\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x0c\x10\x77\x3e\xe4\xc4\xe6\xe1\x7e\xb0\x66\x55\x5b\x29\x63\x64\x81\x5a\x9e\x94\x25\x6a\x9e\x0c\xbb\x26\x37\x17\x0a\x4a\x15\x9a\x39\xb9\x4c\xf4\x53\xd1\x9a\xc6\x31\x44\xa2\x8c\x67\xe1\x2d\xf4\x22\xc8\xfe\xd0\x5b\xa2\xc6\xf7\xe0\x61\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x4d\xdd\x29\xfd\x4f\xe6\x7a\x2c\x38\x9b\xd0\xa9\x0d\x8e\x9d\xd4\x98\xe1\x29\x19\xfa\xee\x0c\x3b\xf5\xe6\x64\x7b\xa0\x0d\x5c\x3a\x76\x89\x51\x8e\x54\x63\xac\x14\x11\xec\x5b\xf4\xdf\x87\xff\xfa\xe6\xd7\xe1\xd1\x77\x87\x87\x3f\xbe\x1c\xfe\xed\xa7\x6f\x0e\xff\x75\x0c\xff\xf1\x1f\x47\xdf\x1d\xfd\xea\xfe\xf1\xcd\xd1\xd1\xe1\xe1\x8f\x7f\x7f\xf7\xe6\x66\x74\xfe\x13\x3d\xfa\xf5\x47\xd6\xd6\xb7\xe6\x5f\xbf\x1e\xfe\x48\xce\x7f\xfa\xc2\x97\x1c\x1d\x7d\xf7\xfb\xf8\x00\x62\x6a\xb4\x3c\x5f\xac\x3c\x53\xa4\xfc\x51\xe2\xe4\x56\xc6\x6e\xfd\xf0\xdb\x2b\x70\xe5\xf8\xdb\x00\xc3\xa7\x8e\xbf\x48\x76\xab\x5c\x4c\xba\xf6\xa9\x44\xbc\xa6\x4a\x59\x27\x02\x0e\xe9\x6b\x96\x5c\x3a\x56\x60\xd1\x89\x51\xa0\xa8\x0c\x69\x54\x3a\x4f\x50\x74\xb7\xfc\xfd\x0a\x4e\x2c\x86\x68\xdd\x54\xa4\x26\x4c\x81\xe0\x19\x3a\x93\x17\x3c\x82\xc7\xdd\x08\x0a\xcc\x18\x57\x88\xdc\x17\x84\x94\xb6\x93\x7b\xd9\x18\x3c\x7b\xd9\xb8\x97\x8d\x9f\x7b\x92\xdd\xda\x99\xfc\x9b\xa1\x2b\x7b\x25\x48\xa5\xe5\x82\x39\x62\x4e\x7d\x86\x9f\x7b\xea\x03\x3e\x41\x24\x96\xe2\xb2\x6b\xc4\xb2\x66\xe2\x58\x27\xa6\xe3\x36\xc6\x8b\x15\x4f\xd0\x12\x65\xba\x49\x30\xb7\xf2\x4b\x3a\xb0\x8d\xb1\x5a\x39\x8b\x6a\x7a\x27\x08\xd8\x25\x29\x5a\x41\xd5\xe2\x8c\x33\x45\xee\xa3\x4c\xcf\x1c\xdb\xa9\xc3\xad\x5e\xf7\x3b\x64\xbd\xa7\x36\xc1\xd4\x7e\x87\x78\x63\xa8\xc8\x1e\x24\xdb\x9f\xf1\xb6\x2a\xf5\x72\x8a\x96\xc1\x2e\x89\xdb\x1d\x17\x13\xbd\xd6\x06\xc8\x04\x6b\x0d\xbe\xdd\xe5\x2e\x3a\x88\x91\xe9\xce\x2f\x2d\x9d\xe3\x8a\x30\x15\xfc\xc5\x08\x40\x27\xe1\x1f\x3d\x43\x97\x3b\xd8\x32\x23\x41\xe7\xb4\x22\x53\x72\x2e\x0b\x5c\xc1\x55\xba\x6d\xfd\xec\xf4\x81\x7e\xc1\x7e\x10\xbc\x92\xe8\x6e\x46\xb4\xbe\xa2\xe5\x84\x01\xba\x81\xef\x77\x8a\x29\x43\x35\x17\x29\xfe\x41\xdb\xa8\x34\x48\x3b\xad\x72\x35\x58\xe8\xb5\x77\x88\x3a\x23\x60\xc6\x9c\x57\x96\x55\xb0\x5a\x74\xfd\xa2\xf1\x8e\x34\x70\xc6\xf0\x9f\x19\xb9\xfb\x59\xf7\x42\xa2\x49\x85\xa7\x1e\x48\xa7\x05\xd4\x32\x3c\x39\x1d\xe4\xf7\xe0\x44\x03\x65\x5e\x4b\x10\xae\xee\xf0\x42\x76\xf0\xc7\xae\x6d\x9a\xa0\xc5\xbc\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xc3\x11\xe4\xab\x9d\x9d\x8e\x7e\xbe\xfe\xe7\xf5\xcf\xa7\xaf\xdf\x5d\x5c\xc6\x83\x9c\xb8\x22\x46\xc1\x0e\x6e\x03\x7b\x47\xd8\x55\xf0\xa1\xdd\x63\x2e\x8f\xc1\x7b\x06\xb9\xf7\xac\xe4\x77\x89\x21\x06\xbd\xa7\x08\x8e\xbb\x7a\x70\xd3\x9c\x8a\x9a\x8b\x91\xe0\x13\x5a\x45\x7b\xa7\x73\x9d\xe0\xa5\xee\x38\x67\xe3\xa9\xfd\xb8\x13\xf7\x26\x1d\x74\x35\xd4\x15\x08\x6a\x0a\x49\x87\xfa\x35\xf1\xc6\x4d\x0f\x32\x6a\x00\xac\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\x4f\xb6\xd1\xdd\x88\xfc\xf3\x1c\xc1\x98\x8a\x17\xb8\x82\x42\x07\x69\x1b\x1f\x65\xf6\xb3\x2f\xf7\x2b\x00\x07\x63\xb7\x9d\x51\xc5\x71\x49\x4a\x27\xd7\x19\x2f\x89\x23\x41\x75\xca\x0e\xc4\x4e\x92\x3a\x72\x63\x80\x99\xd0\x9e\x43\x33\x37\x82\x38\xd3\x79\xb9\x79\x6e\xb8\x5f\x93\x9a\x7c\xd7\x8f\x44\xd9\x51\xf6\xf2\x6e\x52\xcf\x9c\x6f\xc6\x1e\x30\x3a\x81\x58\x36\xa8\xfc\x74\x02\x9b\x52\x1f\xb1\x17\x6f\xdd\x32\x24\x30\xa4\x67\x0a\x06\xc1\x4b\x76\x64\x77\x9a\xf9\xf1\x3b\xd2\xa0\xca\x6e\xa9\x9e\xc1\x49\x27\xa4\xdd\xb6\x71\x3a\x88\x81\x96\x25\xee\xc7\x8f\x50\x8b\xc3\xc9\x7f\x2c\x92\x69\x5c\xfc\x12\xa3\x61\x70\xb4\x1a\x41\x86\xab\xc7\x2b\x35\x76\x75\xd5\x32\x45\x6b\xe2\x52\x95\x87\x4b\x3a\x91\x30\x5f\x1f\x48\x4f\x0c\x98\x65\xa3\x23\xf4\x81\xc1\x79\x65\xa4\x44\x43\xc4\x78\xb7\x44\x84\x4d\xb8\x28\xc0\x4f\xb7\xd5\x0d\x5e\xe0\x06\x8f\x69\x45\x53\x84\x79\xae\x0d\x0e\x3c\xdb\x41\x7f\xc0\xa1\x59\x96\x27\xa5\xe0\x8d\xb9\x89\x5d\x0e\x51\x3a\x36\xa4\x8f\x55\x0f\x29\x21\x41\x61\x9f\xf4\x3b\x32\x15\x98\xa9\x2e\x49\x65\x65\xe3\xfc\x16\x75\x90\x1c\x4a\x00\x2e\xf3\x31\xd6\x9f\x96\x5a\x66\x84\xcb\x96\x7c\xae\x76\x8d\xfd\xee\xcc\x0d\x2e\x00\xab\xa3\xd1\xfb\xeb\x8b\xff\xb7\x74\x6e\xe2\x55\x3b\xf3\xec\x36\xf7\x95\x96\x07\xd9\xb6\xcd\x15\xa9\xf9\x7c\xbf\x71\xbe\xfa\x8d\xe3\x1d\x44\x5b\x27\xee\xb8\x6a\x59\xe8\x8e\x61\x41\xd7\x50\x9d\xa4\xeb\x8c\x7c\x8e\x6b\xff\xad\x61\xb9\x51\x41\x90\xfe\x09\x53\x14\x57\xd5\x22\xf4\x91\x2a\x6e\x6a\x62\x64\x29\xec\x16\xde\xae\x13\x5c\xc9\xe7\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\x77\xbc\x65\x79\x98\x40\x12\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x13\xf8\x16\x99\xc8\x79\x40\xf2\xd5\xd3\x73\x12\xd4\xac\x9b\x40\xb5\xf2\x09\x80\x4e\x0f\x37\xf6\x4b\x2b\x89\x5c\xaf\x57\x75\x81\xf4\x09\x8f\x8f\x1f\x0a\x82\x4b\x30\x30\x1b\xac\x66\x86\x7d\xa6\xc6\xf2\x96\x94\xe6\x83\xc4\xcc\x5b\x0f\xc3\x06\x28\xa5\x9b\xe9\x1b\x3d\xb9\x0e\x39\x0d\x0e\x61\xc3\xc1\x03\x58\xed\x14\x53\x6c\xab\xa7\x21\x41\xb0\xeb\x45\x78\xcf\xaa\xc5\x15\xe7\xea\x7b\x5f\x5c\x67\xdb\x27\xe3\x1f\x36\x1c\xd1\x77\x62\x82\x5f\x1a\x43\x97\x87\xb0\x71\x40\x2e\x06\x25\x81\x52\xc5\xa2\x5e\x90\xdf\xaa\x54\x14\x2d\x3b\x95\x6f\x04\x6f\xa3\x75\xb8\x9c\xf6\xe6\x9b\x8b\xd7\x70\xf1\xb5\x96\x9c\x81\x29\xb1\x68\x38\x65\xca\x79\xbc\x32\x06\x6d\x3e\x58\x1a\x8c\x50\xb2\x25\x67\xbc\x23\xf4\x0e\x2f\x10\xae\x24\xf7\x2e\x35\xb6\x2e\xc8\xe9\x22\xa8\xfa\xeb\x31\x57\xb3\x95\xd0\x29\x66\xf1\xa1\x9c\xd5\xf6\x06\x01\xc7\x43\x97\x4e\x47\xd9\x4a\xb3\x0a\xb0\xe5\x8d\x20\x05\x29\x09\x2b\x9e\xeb\x89\xd8\x36\xe5\x00\x9c\xaa\x4b\xce\xb4\x78\xdd\xf6\xb9\xba\xf0\xfe\x49\xbb\x1a\xe1\x29\x02\x57\xb6\x0d\x22\x62\xa0\xe7\x00\xe1\xda\xca\x14\xe0\xff\xc5\x04\xa2\x9e\x66\xd3\xfd\xbd\x1d\x93\x4a\x2f\x36\xad\x2a\x53\x41\x18\x2b\x03\x08\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\xa1\xf1\x29\x32\x25\x27\xd2\x17\x72\xc3\x12\x7d\xb8\x78\x8d\x5e\xa2\x43\x3d\xb6\x23\xd0\x38\x26\x98\x56\xc0\xf8\x01\xe0\x9b\xa5\x90\xec\x04\x40\x83\x3c\x25\xfb\xf7\xc2\xca\x11\xc4\x85\xb9\x5a\x06\x88\x71\x24\xdb\x62\xe6\xe6\x80\x72\xe6\x3d\xc2\x96\xfe\x31\x09\x0e\xbd\x17\x3b\xf9\xee\xc3\x0f\x92\x88\x6d\x1f\x5b\x7d\x1d\x7e\x78\xc2\xeb\x30\x34\x11\xf5\xf1\xef\x2f\x98\x39\xab\x35\x51\xb8\xc4\x0a\xdb\x6b\xd2\xfd\x60\xbf\x6b\xf7\x97\x65\xc2\x65\x29\xc9\x5b\xca\xda\x7b\x83\x74\xdb\x89\xb0\xc7\xf5\x39\xf4\x08\x8e\x17\x2c\x34\x0f\xe2\x76\x2e\x42\x91\x21\x43\xee\xa2\x77\x8c\x06\x0f\x58\xdd\x70\x4b\xb8\xec\x74\x6d\x08\x61\x56\xf2\x7a\xa5\x93\x90\x3e\x9f\x52\x1c\x3d\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x42\x41\xf8\xa5\x43\xf9\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x6c\xce\xbe\x21\x5d\xc9\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf0\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x6d\x26\x56\xe6\x1e\x74\xdc\x99\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x9d\x0f\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x58\x49\xd9\x14\x02\x56\x03\x24\x48\x65\x08\x6d\xad\x78\xbe\x35\x1e\xaf\x03\x90\x38\xae\x43\x4e\xdc\x74\x98\x55\xc3\xe7\x93\x15\xbb\xb9\x0e\xaf\x69\x7e\x73\xf9\xfe\x26\xcc\xe1\xc2\x6c\x61\x32\x55\xe1\x4f\xb6\x7e\x9d\x3e\x1b\x4c\xe7\xf2\x2a\x3e\x36\xa4\x33\xe9\x7d\xeb\x11\x9d\x4f\x77\x4a\xbf\x0c\xe5\xb9\x8c\xf1\xcc\xda\x85\x65\xc0\xe7\x6a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x87\x1c\x20\xff\x30\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2a\x43\x27\x08\xae\x52\x13\x34\xcd\xb3\xce\x0b\xe2\x4e\x81\x27\xb4\x59\xf5\x06\xf4\xc9\xd1\x53\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x7d\x17\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x6b\x4a\xf9\x07\xf8\x3c\x49\xa7\xf2\xc4\x4a\x94\xa1\x9e\xb8\x23\x44\x59\xe5\x33\x85\xc1\x5b\xc8\x94\xb4\x11\x84\xe4\xc1\xa3\xc2\x8f\x1e\xb6\x1e\xe4\xa7\x78\x68\xf6\xea\xf4\x00\xc7\x1a\x6c\xde\xad\x6b\x1d\xab\xbb\x2a\x8d\xb6\x78\x69\x67\x3d\x30\xf6\x90\x2f\xcc\x46\x71\xd6\xce\xa3\x31\x5e\xb7\x3e\x49\x56\xe9\x2f\x88\xcc\x57\x4a\x3d\x43\x05\x7c\xdb\x25\x54\x12\x53\xc9\x80\x00\xa5\x0b\x7e\x30\xd3\x1d\xc2\xdb\x07\x50\xfa\xc9\xfe\xe9\x41\x2e\x8a\xbb\xd3\xaa\xd2\x0b\x89\xf5\x35\x71\x20\x43\x74\x27\x98\x26\x33\x3c\x27\x5d\x11\x68\x32\x99\x90\x02\x8c\x85\x70\x14\xe9\x25\x92\x0f\x29\xa0\x98\x42\x3a\x5d\xc5\x4d\xdb\x18\xd5\xf4\x5e\xf7\x30\x6c\x31\xc4\xa0\xb2\x12\x02\xff\xeb\xbf\x4e\xa8\x84\x81\x00\x7c\xe0\x99\x5b\x06\x7a\x85\xc2\x46\x5c\x72\xb4\xd2\xd7\x96\xfe\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2a\x72\x8c\xd6\xa4\xef\x3c\x59\x04\x19\x7d\x79\x14\xf9\x11\x63\x55\x68\x57\xe2\x55\xa9\xa4\x27\xa6\x0c\x24\x14\xa6\x49\x66\x3c\x19\x75\x25\x6e\xbf\x88\xe6\x3b\xa2\xbd\x2d\x13\x7f\x90\xfb\x78\x4d\xb4\x37\x55\xe7\xf7\xa4\x58\x2a\x29\x59\xd7\x50\x39\x8b\x43\x23\xad\xf2\x85\xef\x92\x6f\xad\x1d\xd1\xe9\xed\x08\x77\x45\x88\x9e\xd9\x09\xa7\x4e\x4d\x36\xff\xd4\x8a\x73\x7f\x11\xa4\xf3\xb6\x07\x1c\x73\xfa\x9f\xfa\xe6\xa2\x6c\x6a\xc9\x4c\xb8\xf0\xd4\x4f\x49\xdd\x72\xfd\x80\x8a\x07\x9c\x2b\x74\x78\x70\x72\x70\xb4\xb2\x17\x0e\x64\x88\x87\x36\xa9\x9b\xdd\x80\x24\xad\x9b\x6a\x01\x63\x38\x30\x45\x0e\x12\x8a\x87\xe9\xc7\x21\xeb\x3c\x5b\xb0\x9c\x91\xaa\x1a\x20\xa9\xef\x69\xec\x88\xda\xcc\xa7\xfa\x47\x4a\xb4\x85\xb1\xe7\x0f\x0f\x7e\x3d\x18\x20\xa2\x8a\x23\x74\xc7\xd9\x81\x32\x9e\x59\x74\x03\xca\x6e\x52\x9f\x7c\x27\x16\xbc\x85\x3a\x7c\x66\xd9\x3c\xb7\x5f\x81\xb5\x9e\xd6\x1a\x65\xc2\xb0\x03\x90\x2a\xa1\xae\x9c\x7e\xce\xef\xa9\xd2\x32\x53\xb5\x60\x4f\xbd\x34\x2a\x0d\x81\x22\x02\x58\x42\x85\xdd\x93\x19\xc1\x95\x9a\x2d\xbc\x9a\x65\x4a\x9c\x49\xd4\x32\xfb\x4d\xba\xb0\xdf\x81\xfc\xb6\xdd\xcd\x34\xb3\x95\x16\x77\xba\x50\xb4\xed\xe3\x67\xeb\x44\x9b\x7a\xd0\xfd\x1a\xd1\x50\x3b\x9a\x94\xb9\xca\x44\xff\xf1\xeb\x2b\x01\x3d\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\x2a\x8d\xfc\x7a\x47\x62\xa0\x5b\xae\xfb\x9c\xb5\xdc\xf1\x88\x0b\x85\x98\x2f\xb9\xa7\xcf\xd6\x14\x56\x91\x88\x39\x2d\xc8\xf1\x13\x54\x17\xce\xc5\xba\x99\x7e\x10\x10\xa0\x36\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xac\xf3\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\xae\x3f\x74\x69\xee\x13\x49\x08\x5a\xe3\x57\xd5\xa2\xc3\xfc\xcf\xb8\xe2\xe3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x0f\x0b\xdd\x03\xca\xa6\xc7\x75\x79\x94\x50\x8d\x05\x05\x95\x62\xad\x1b\x67\x29\x20\xe2\xa2\x64\x9e\x27\x94\x4a\x1f\xca\x1b\x2f\x60\x52\xb6\xee\x2b\x44\xae\x97\xdf\xa2\x17\x2f\xa2\xde\xa2\x97\xe0\x4d\xa6\x5a\xfd\x3f\xdc\xdc\x8c\xde\xf4\x2b\xf5\x33\xf8\x10\xbd\x39\xbf\xf1\xd5\x19\xf4\xee\x32\xd9\x17\x7b\xa9\xbd\x33\xd5\xfa\x33\x38\x88\x37\xa9\xf0\x0f\x0c\xb6\x5a\xe5\xc2\xe3\x6a\x81\xee\xb0\x49\xbd\x96\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x12\x21\xc1\x1a\x22\x78\xfb\xc1\x8f\xa0\x4f\xd9\x96\xed\xac\x95\x8a\xd7\x68\x66\x87\x6a\xe6\xb0\xab\x7f\x62\x74\x23\x73\x04\xc1\x19\x24\x91\x20\x8d\xb1\x96\xec\xdf\x7c\x15\xb6\xd0\x8a\x14\x32\xf3\x1c\xb0\xe4\x63\x54\x84\x53\x65\x15\x7d\x53\x72\xd9\xca\xa8\xa4\x1a\xb8\xe6\xc9\x52\x6c\x0a\x65\x2a\x38\x85\xd2\x8b\x4e\xb9\x97\xa4\x47\x4b\xf2\x94\xaf\x42\x59\x4a\x58\xa1\xec\x95\x89\x90\x8d\x09\xd8\xcd\x65\x90\x02\xba\xa3\xa9\xf4\x69\xc8\x91\x2c\x38\xe4\x45\x81\x19\x67\xb4\xc0\x15\xfd\x37\x29\x51\xdb\x70\x86\x78\xab\x9a\x56\x81\x2b\xa8\xc0\x92\x0c\xe7\x58\x50\x2d\x50\x4d\xfd\x3f\x0f\xd9\x60\xfa\xb4\x2b\xce\xc1\x4f\xe2\xa3\x63\xa6\xc7\xe9\xdd\xcc\xa4\xcd\x20\x57\x2b\x3f\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\xe4\xc2\x2c\x9f\x59\x87\xd5\x0c\x20\x48\x05\x44\x12\x2d\x82\x0d\x04\xa7\x36\x1b\x76\x20\x43\x20\xab\x15\x9b\x28\x12\x4c\x15\x64\xb1\x64\x07\xeb\x1e\xae\xce\x61\xa6\xa0\xf8\xe3\x9b\xd5\x61\xb9\xbe\x31\xd1\xba\xfd\xc5\xe9\xe5\xe9\xcf\xd7\x1f\xcf\x7e\xbe\x3c\x7d\x77\x9e\xf2\xea\xe4\x52\x1b\x39\x8b\x6d\x64\x2b\xb7\xf1\x48\xc5\x88\xf4\x23\x8b\x19\xd9\x9d\x78\xf8\x35\xf4\x26\x64\x4f\xb2\x36\x00\x14\x65\xe5\x19\xe8\xb4\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\xca\xa8\xa2\xb8\x7a\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\x61\xa4\x97\x5e\xd8\x48\xd3\x21\xeb\xb6\xee\x83\x0f\x66\x58\x9a\xa0\x33\x29\xd1\x98\x4c\xb8\x20\x10\x35\x61\x5a\x22\x35\x5d\xfc\xd8\x8c\x4f\x3d\x61\xbd\xb8\x3b\x2e\x6e\x2b\x8e\x4b\x79\xd2\x70\xf3\x3f\xc3\x8a\x4e\x48\xb1\x28\x2a\xf2\x3b\xdf\xff\x61\x92\x9a\xbe\x1b\xee\xf1\x86\x08\x0a\xd0\x85\x5d\xd8\x35\x3f\xf0\x3b\xc4\x27\x8a\x30\x74\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xd3\x3e\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x88\x0c\x49\xb9\xd3\x91\x2f\xdb\xc7\xcf\x87\xbe\xec\x0f\x27\x6d\xd5\x0f\x7f\x99\x90\x58\x9e\xd8\xd7\xab\x63\x9f\x50\xf3\x0a\xfa\xe3\x45\x11\x66\xa5\xc3\xc6\x7c\x7d\xfb\x44\x15\xcd\x35\x2f\x6e\x33\xb9\x5d\x6f\xce\x46\xe6\x6d\x4b\x78\x16\x73\x03\x6b\x2d\x93\x23\xac\x7f\x05\x0a\xe8\xde\xe9\xba\x33\x4e\xd7\x83\xae\xd4\xd4\xa6\x0e\xd4\x83\xbd\xb5\xd5\x3d\x4e\xf1\x11\xfd\x52\x0d\x7b\x6b\xeb\x81\x67\x6f\x6d\x6d\xf0\x18\xb4\x3b\x64\x8e\xbe\x11\xb8\x20\xa3\x5d\x52\xde\x9c\x00\x41\xa5\xad\x25\x8a\x3a\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x53\x3d\x92\x49\x5b\x55\x0b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\xeb\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\xd7\xb6\x88\x24\x2c\xde\x9d\x8e\xc3\x15\x44\x92\x4e\xf5\x74\x01\xd0\x73\x46\x90\x61\xfb\x71\x35\xc2\xba\x8e\xe8\x56\x27\x5c\x14\x74\x5c\x2d\xd0\x0c\x57\xda\x58\xba\xa3\x6a\x86\x30\xba\xa5\x55\x65\x5f\x13\x3f\x51\xd7\xae\x6a\xa3\xd1\x68\x2a\xce\xa6\x30\x19\xd8\x82\xc7\xef\x1b\x52\x28\xa8\x5b\x4f\x30\x6b\x1b\xd3\x4f\xad\x1f\x2d\x78\x9b\x01\x3f\xee\x02\xdf\x5e\x9f\x62\xd4\xf2\x24\x98\x0a\x53\x9f\xdc\xf3\xfd\x2c\x40\xf4\xde\x95\xdf\x35\x15\xaf\xa2\xfb\x64\xfa\xd2\xaf\x77\x65\x3e\xf3\x5c\x0f\x36\xc5\x49\x6f\x0b\xc8\xb9\x8b\x6e\xeb\x23\xbc\xd7\x89\x56\xc6\xd9\x90\x91\xa9\xc9\x28\xb7\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xf3\x93\xa5\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x0b\x34\xa7\x38\xba\x27\x90\xbd\xde\xed\x28\x74\xc8\x38\xe2\x8d\xbe\xba\x5a\x46\xd5\x02\x22\x7a\xb3\x56\xa1\x92\xdf\xb1\x84\xc4\x90\x1b\x0b\x73\xc0\x68\x4c\x14\xb6\x3e\x70\x7d\x08\x3c\x79\x33\xf0\x32\xeb\xb3\x07\x18\xf2\x9b\xb5\x1b\xc0\xf3\x39\x4f\xb1\x4a\x90\x12\x6b\xb4\x79\xb3\x9e\x9f\xde\x76\x54\xda\x78\x5d\x22\x61\xec\x6e\x50\xb0\xe9\x13\xcd\x5b\xb5\x23\xf7\xc8\x43\xae\x23\x93\x8b\x1f\x18\x89\xb4\x26\x12\xf1\x36\x13\x31\xfe\x2b\xdb\x5c\x4e\x0b\x6f\xef\x77\x5a\xfb\x48\x55\xd2\xa8\xf2\xa8\x39\xb6\xd8\x03\x2c\xe3\x36\x61\x30\x20\xda\x1b\xb7\x93\x09\x11\x70\xd3\x41\x87\x57\x60\xf7\xbe\xe0\x90\xbb\xc3\xe2\x9c\xb7\x16\xf0\x45\xd4\x00\x48\xce\x6d\xd6\xfb\x03\x4d\x5a\x36\x40\xa8\x27\x2a\x88\x04\xd2\x6a\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x50\xa0\xa7\xe5\xd6\xc1\x38\xdf\xb3\x38\x4c\x62\xde\xfd\xb0\x8e\x9e\xc2\x6e\x8b\xa2\xe2\xd2\xe6\x71\xc2\xba\x14\x33\xcc\x18\x71\xce\x28\xaa\xc0\x93\x3d\x26\x84\x21\xde\x10\x03\xca\x8b\xea\x0c\x46\x92\xb2\x69\x45\x10\x56\x0a\x17\xb3\x63\xdd\x3b\xe6\xf6\x42\x97\x30\x69\x3f\x91\x4a\x10\x5c\x9b\x3d\x21\x48\x8d\xa9\x69\x1e\xe1\x42\x70\x29\x51\xdd\x56\x8a\x36\xfe\x65\x71\x5e\x44\x02\xa9\xeb\xd2\xe4\xcf\xb9\xb5\x82\xb4\x92\x2e\x33\x73\xd0\xf5\xd0\x0e\x9f\x87\x55\x55\xc0\x75\x36\xd0\xdf\x92\xba\x51\x0b\xa4\xa7\xb6\x8a\xce\x8d\x99\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\xdc\x68\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x22\xc8\x40\xf4\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x39\x88\x5b\x3b\x57\x42\xc3\x6c\x1c\x37\x23\xb0\x75\x9c\x82\x63\x7a\x64\x3f\x0a\xba\x10\x14\x04\x76\x35\xe1\xb5\x3e\x9b\x22\x57\xa0\xce\x85\x3b\xd7\x83\x5e\x72\x74\x67\x5b\x40\x2a\xcc\x8a\xd4\x81\x0d\xc5\xc8\x5c\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xc9\x65\x8c\xc2\x62\x4a\xd4\x99\x1b\x7f\x6c\xf6\x6e\x0e\x69\x13\x56\x4e\x0f\x1d\x44\xdd\xe2\xc0\x3a\x8c\x78\x09\x6c\x12\x1d\xe3\xc7\xba\x72\xee\x66\x5c\x91\xb6\xd7\xcd\x03\x35\xe2\x9d\x45\x65\x32\xbc\x7c\x47\x65\x83\x0b\x22\xd1\xe1\xc5\xe8\x6c\x80\x46\x17\xaf\x6d\x1a\x17\x9f\x2c\xb3\xeb\xc5\x4e\x8b\xbd\x04\xcd\xd9\x7d\xa8\x80\xbd\xaf\x4e\x13\x74\x29\xa0\xd9\xb2\xfd\x1d\x79\xa3\x2c\x7a\x66\x56\x6f\x02\xb0\xd0\x68\xdd\x54\x50\x27\x12\xc9\x16\x2c\x23\x1b\xb8\xd0\x5b\xdb\xd8\x23\xf6\xd0\x92\x8e\xe0\xc8\x92\xd1\x47\x06\x71\x4c\x2b\x7e\xb8\x76\xcd\x21\x96\xed\x26\xca\xea\x01\xa0\x30\x2b\xfb\x95\xe7\x88\x81\x5c\x33\x0b\x15\x8f\xbf\xdd\x23\xdd\x61\x81\x11\xf5\x8e\x48\x89\xa7\x64\x14\x89\x03\xca\x71\xf6\x3a\x0f\x37\x00\x88\x3a\x79\x3d\x23\x86\x0a\x4b\xf1\xe0\x93\x30\xbb\x32\xf4\xda\xd4\x66\x20\x51\x3d\x70\x67\xeb\x4e\x50\xa5\x08\x5c\x0f\x50\xeb\x09\xb6\xee\x32\xbd\x67\x3f\xab\x33\xaa\x3d\x3b\xe9\x61\x7b\x5a\xef\x67\xa5\xc9\x8f\x1c\x13\x34\x16\x94\x4c\xd0\x84\x42\xc2\x26\xa4\x32\x0e\x4c\x9d\x02\x0c\x80\x79\x2c\x25\x11\x30\x6c\xeb\x8f\x73\xc3\x8f\xeb\xcf\x3f\xec\xf8\x95\x68\x59\x81\x83\x22\x9e\xc0\x3e\x46\x27\x68\x0a\xe9\x93\xd6\xfb\xf4\xa7\x97\x7f\xfb\x0b\x1a\x2f\xb4\xa1\x04\x67\x52\x71\x85\x2b\xd7\x01\x54\x11\x36\xd5\xab\x08\xba\x4e\xdc\x85\xdd\x63\xb0\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\xba\xf3\x40\x31\x39\x29\xc9\xfc\x24\xd8\x42\xc3\x8a\x4f\xe3\xde\x7a\xe6\x09\x9f\xda\xa6\x8c\x05\x44\xe4\x3e\xd1\xbc\xa2\xc5\x62\x6b\xf7\xa9\x75\x85\xa1\x19\xbf\x33\x5e\xd4\xd5\xa3\x1a\x90\xc1\x34\xbc\x69\x2b\x98\x38\xf4\xbd\x67\xf0\x6b\x25\x59\x26\x47\x4a\xf5\xce\x07\xd2\x0e\xd0\x0b\xb6\xd9\xa5\xab\xde\xe6\x0e\xbb\x6e\x72\x4b\x4d\x61\x83\xdd\xbe\x52\x49\xb4\x1b\xfc\x7b\x5c\x55\x63\x5c\xdc\xde\xf0\xb7\x7c\x2a\xdf\xb3\x73\x21\xb8\xe8\x8f\xb9\xc2\x5a\x99\x9e\xb5\xec\x16\xea\xec\x76\x74\xb5\x7c\x6a\xc1\xbc\xc0\x2c\xd9\x9f\xd8\xa8\xce\xb8\x51\x1a\x02\x51\x67\x0b\x38\xe7\x77\xd7\x32\xb9\xa7\x9d\x87\x9b\x21\xa2\xfb\x1c\xaf\xe1\x84\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\xc8\xf5\x97\x03\x73\x01\x80\xea\xab\x6d\x9c\x1a\x57\x55\xac\x4e\x13\x8a\x80\xef\xa3\xcb\x57\xef\xc0\x91\x57\x5b\x3b\xdd\x5f\xec\xab\xb9\xb9\xf9\x27\x68\x62\x54\x49\x52\x4d\x06\x86\x0f\xc6\xfb\x93\x0f\xc0\xac\x39\xb0\x57\x5e\x3c\x97\xd0\xf6\xbd\x25\x73\x5e\xb5\x35\x79\x4d\xe6\xb4\x88\x43\x0e\xf4\x56\xa5\xf7\x36\x17\x1f\xab\xa8\x04\x5d\x72\x5c\xf1\xe2\x16\x95\xf6\xcb\x20\x47\x65\xb9\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x38\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x5d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x0c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\xff\x36\x44\x27\x2b\xa6\xba\xaf\xa8\xe6\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\x3e\x6e\x90\x01\x85\x90\x96\x9c\xd4\x9b\x17\xe6\xd1\x1f\x35\x56\xd6\x3e\x72\xde\x0b\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xdb\x9a\x84\xd5\x54\x96\x1a\x37\xc3\x5b\xb2\x88\xdc\x70\x89\xc7\xe5\xa1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x11\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x67\xc6\xa2\xeb\x76\x0c\x67\x0a\x7e\xfe\xb8\xf4\x60\x59\x95\xa7\x6d\xdf\x55\x1f\xbb\x15\xef\x5f\x55\xfa\x13\x7f\x57\x99\x5f\x7d\x4d\x37\x14\x8c\xef\xb9\x5e\x50\xbe\xf3\x99\xe4\x70\x12\x36\x11\xae\x35\xbb\x33\xfa\xf7\x58\xcf\x13\x66\x8e\x74\x60\x33\x5b\x0f\xd5\xb1\xa9\x37\x90\xd0\x01\x7d\x14\x6d\xa3\xe8\xe0\xdb\x83\xad\x5e\x8e\x66\x65\x04\x6f\xf0\x14\x4c\xda\x5d\x58\xa0\xe5\x3e\x85\xf4\xb6\x33\x7e\x17\x8a\xcc\xc6\xfe\x4a\x4b\x4c\xc7\x91\x3e\xe3\x49\xab\x63\xb0\xbe\x6e\x47\x58\xb3\xdc\x54\x89\xb8\xc3\x0b\x84\x05\x6f\x59\x12\x71\x01\x84\x32\x7d\xa8\xfb\xdd\xd2\x60\x2f\x39\x23\x0e\x56\x93\xd2\xca\x4d\xcf\xf5\x0d\x08\x23\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x3a\x27\x57\xb6\x7c\x7a\x10\x06\xbd\x98\x8c\xb8\x94\x74\x5c\x41\xaa\xa5\xe2\xe8\xdc\xd4\x96\x5f\x1d\xa8\x87\x7a\xc1\x88\xb9\x08\x89\x50\x13\x7a\x78\x68\x4e\x70\x08\xd1\xd6\x0d\x24\xe0\xb4\x76\x4b\x05\x85\x75\x5d\x52\x41\x2f\xbd\x0a\x6a\xee\xbd\xad\x8e\xd5\xd5\xd4\xdf\x05\x49\xf2\xce\x06\x15\xba\xa2\xf9\xd4\x15\x65\x86\x8f\xee\x04\x55\xf6\x70\xdf\x51\x49\xd0\x21\xb8\x33\x96\x36\x63\x12\xf7\x73\xe8\xfc\x4a\x2c\xae\x9f\x83\xbb\x59\x2c\x1f\xdd\x5d\x58\xa5\x55\x79\xd2\xe5\xcc\xdc\x59\xcf\x57\xb7\x82\x56\xfa\x77\xf7\xf2\x0c\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x45\x12\x7b\xd5\xc5\x04\x85\x22\xd1\x22\x0e\x82\x20\xe4\x0c\x4b\xc4\x38\xaa\x09\x06\x48\xb5\xbe\x5d\x9c\x14\xec\xd1\x40\xe7\xeb\x83\xd9\xec\xe6\x1a\x0b\x2f\x04\x2b\xae\x5f\x53\x69\xc5\xb3\x96\x23\xd6\x74\x31\x40\xac\x1a\x97\x29\x64\x0c\xc1\x9c\x76\x8b\x77\xdc\xc1\x9c\x97\x7b\xd2\x5d\x1c\x4b\x7d\x79\x8c\x7e\x0c\x6c\x75\x73\xdd\xbc\x89\x2c\xaf\xf1\xe7\x75\xb0\xb6\x24\xfc\x89\x79\x96\x87\xeb\xaf\xc5\x95\xb1\xae\xef\xb1\xef\x70\x42\x1f\x3e\x3f\xd4\x41\x20\x0b\x1d\xaa\xdb\x80\x60\x6c\x79\x15\x9b\xa3\x9c\x46\x12\xee\xa2\x19\xde\x4f\x34\x25\x8c\x08\x6c\x03\x12\x0e\xd4\x6d\x43\xfa\x58\x72\x96\x7a\x20\x3e\xb3\xe1\xb4\xbc\xff\xbc\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x74\xda\x6d\xa8\x65\x9d\xc6\x92\x73\xd4\x4b\x64\x7a\x66\xf3\x07\x2c\xbd\x7a\x51\x7e\x69\xe9\x1c\x57\xc4\xd0\xe3\x3b\xd1\xb0\x55\x65\x42\xb6\xe3\x5d\x35\x1b\xad\x7d\x08\x66\xc7\x7a\xb4\xc4\x83\x16\x64\x26\x7d\xe2\xc5\x0b\x74\x68\xda\x38\x30\xb4\xd8\xdb\x55\x72\xed\x5a\x9d\xdf\x37\x09\x45\x61\xf3\xad\xd7\xf9\x7d\x83\x01\xe0\xd1\xec\xc4\xc2\xfd\x17\x99\xe1\x39\x01\x16\x72\x5a\x61\x51\x41\x1a\xc9\xb5\x99\x32\x34\x6e\x15\x22\x6c\x4e\x05\x67\x00\xaa\x02\xba\x28\x2d\x99\x04\x99\x10\x41\x58\x41\x24\xfa\xfd\xe1\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x14\x0e\x48\x03\x50\xf6\x69\x63\x57\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x74\xa6\x2c\x5d\xc3\x12\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xed\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\x3f\xe3\x52\x9d\x56\x14\xcb\x4d\xfd\xd8\x69\x5b\xfd\x87\xae\x59\xc8\xf6\x63\xb6\xaa\x23\xae\x3c\xc4\x40\xf7\xcc\xc0\x9c\x2e\x46\x16\x8b\xee\x76\x25\x65\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd8\x13\x83\x38\x9a\xa0\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x66\xbc\xb2\x79\xd7\x0e\xcd\x30\x26\xea\x8e\x10\x86\x2e\x46\x30\xe7\x7a\x2a\x0d\x2f\xe3\xfa\x99\xb7\xca\x31\x53\x62\x61\x0f\xf4\xc6\xbd\x09\xd6\x0c\x56\x61\xd3\xa3\x9b\x10\x7f\x8a\x8f\x3c\x0d\x11\xdd\xf4\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\x7e\xf0\x0b\xea\xd8\x74\xf0\x98\xcf\x09\xac\x77\x59\x8a\xc8\x2c\xed\xad\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xe4\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x86\xc7\x2d\xdf\xad\x78\x31\x3a\x7b\xca\x1b\xf1\x83\xf5\x2e\xe9\xa6\x0f\x24\xa2\x4d\xd1\xe5\x75\x6c\xba\xf4\x5d\x2e\x43\x40\x67\x16\xe1\x68\x8f\x75\xae\xcf\xba\x82\x8d\x4f\xad\x54\x20\x66\xda\xd5\x57\x9a\xa5\x15\xb7\xc0\x11\xf0\xfc\x34\xbc\x3c\x5e\x9e\x6a\xfb\x17\xf1\xd3\xed\xdc\x4a\x46\x85\xb1\xde\xb4\x81\xa7\xf6\x59\xba\x42\x01\x26\xe9\xfd\x67\xb1\x55\x0e\xb7\xb7\xb0\xa3\x8b\xd7\x5b\x3c\x17\x0d\x2d\x9f\xf7\xb9\xf8\x20\x37\xa6\xd5\xcf\x3a\x81\x50\x7d\x33\xef\x0c\xc6\x60\xa6\x6d\xc1\x4d\xfb\xd7\xc0\x88\xc5\x15\x6a\x04\x91\x84\xf9\xb3\x53\xae\xcb\x37\x84\x6b\xb1\x3f\x8a\x81\xfe\xf7\xa4\xad\x36\x55\xfd\xb9\x08\x28\x75\x3c\xff\x10\xf6\xec\x21\x10\x63\xc0\x73\x4c\x2b\xf0\x3b\x05\xfc\xb0\x2b\x1d\xb0\x69\x51\x1b\xf6\xa0\xe2\xb8\x84\x98\x17\xba\xd5\x77\x56\x85\x6a\x5e\xb6\x95\x81\x68\xa1\xb3\xd3\xd1\xcf\xd7\xff\xbc\xfe\xf9\xdd\xfb\xd7\x1f\xde\x6e\x4c\xa3\x65\x72\xc3\x49\xb7\xc5\x07\x08\x23\x46\xee\xa0\xe7\x0c\xac\xae\xc2\x3a\xba\x3d\xbd\xa2\x16\x8e\xd7\x36\x4b\xd0\x04\x7d\x0d\xe6\x62\xd2\x56\xfa\x47\x1b\xf6\xa0\xa6\x8a\x4e\x31\xbc\xac\xb3\xf5\xc7\x82\xe0\x5b\xde\x2a\x34\x6f\x2b\x46\x04\x1e\xd3\x8a\x6a\xd5\x18\x91\x39\x61\x06\xe8\xa7\xff\x40\x77\x32\xac\x52\x4b\x37\x6d\x3c\x2c\x62\x6c\xcb\x23\xea\x49\xd5\x2d\xe3\xc2\xfa\xd1\x2c\x4d\x24\x7c\xd9\x08\x3a\xa7\x15\x99\x12\xcf\xbf\x16\x43\x03\xdc\xc7\x97\xe0\xaa\x99\xe1\x61\x45\xe6\xc4\xf0\x38\xe9\x2b\x42\xef\xa8\x19\x67\x5c\x98\x80\x93\x61\x24\xb7\x37\x04\x30\xdb\x98\xc3\xea\x6a\xf6\x9a\x2c\xd6\x6b\x97\x4e\x6a\xb3\x48\x9f\x4c\x58\x6d\x0e\xd1\x48\x93\x55\xd7\x3e\xc4\xed\x56\x20\x4c\x83\x1e\x6d\x8c\x16\x5e\xef\xf8\xea\x0c\x4f\x78\xbb\x93\x31\xf6\xb0\x60\x64\xd0\xa8\x43\x57\x42\x09\x98\x5e\x62\xe6\x7c\x63\xbd\x1b\x1c\x61\xa3\xb6\xaa\xae\x49\x21\xc8\xa6\xe0\xdd\xb4\xa9\xbf\x58\x6a\xfb\x21\xb7\x4c\xe0\x7c\x87\x22\x2e\xf6\xc7\xac\xab\xd4\x10\xa4\x23\x77\x34\xdb\x4d\x5b\x55\x26\xba\xbf\x70\xcb\x09\xa3\x95\x41\xda\x08\x95\x2e\xb5\x3d\xe6\x36\xe9\xad\xb1\x24\xbe\x6b\x6e\x79\x1b\x2c\x65\x17\x4c\x9d\xd3\xb2\xc5\x15\x74\x0b\x3c\x90\x36\x73\x1b\x9b\x52\xa4\x56\x22\xd6\x91\x95\xf6\x37\xe4\xf5\xe9\x64\xd5\x89\x99\x93\xdf\x99\xc1\x2c\x28\x9b\x0e\xe1\x13\xdd\x4d\x3b\x9e\x21\x67\x43\x3c\xdc\x14\x38\xff\xac\xdc\x54\x6f\x79\x81\xab\xf7\xe0\xd7\xb9\x72\xbb\xcd\x09\x74\x89\x08\xe3\xed\x74\x06\xd3\x2b\x6a\xec\x68\x63\x2b\xa2\xa0\xba\xab\x4d\xfa\x8a\xf1\x47\xf9\x9d\x5d\x5a\xa7\x52\x58\xd1\xb7\xbf\xb3\x9f\xd0\x55\x95\xe2\x3d\x8a\x45\xd8\xe5\x08\x63\x5c\x06\x82\xdb\xce\x6c\x64\xcc\xad\x7f\xa9\x92\xc9\x84\x14\xca\x01\x41\x8c\x1b\x6f\x00\xb1\xc2\xb2\x35\xdc\xd0\xb8\xb8\xbd\xc3\xa2\x94\xa8\xe0\x75\x83\x15\x05\x15\x63\x11\x8b\x12\x71\xb9\x07\x26\xc7\x0d\xf2\x52\x8f\xd1\x05\x93\x0a\x83\x0c\x74\x14\x17\x7a\x85\xbb\xb4\x54\xc8\x5e\x35\x0c\x61\x33\x22\x08\xc2\x22\x0e\xad\x83\xab\x5a\x2b\x9b\x05\x11\x7a\xef\x57\x0b\x74\x27\x38\x8b\x4c\x0f\xdf\x50\x28\xf1\x39\x11\x73\x4a\xee\x4e\xac\x35\x3d\xd4\x83\x1b\x9a\x2d\x2c\x4f\xe0\x24\x9c\xfc\x0e\xfe\xdf\xf3\xf1\x4b\x2d\xb9\x87\x6a\xdc\xc4\xbb\xfd\xbe\x82\xd8\x0f\x65\xb4\xe3\xbd\x79\x52\x65\xe3\xad\x55\x26\x6c\x6d\x0a\xfa\x6f\x23\xc7\x03\xa5\x7d\x4c\x2a\xce\xa6\x41\x55\x0e\x6d\x9c\x6c\xaa\x15\x30\xaa\x7a\x86\x00\x00\x04\xa0\x58\x3b\x44\x21\xb9\x28\x81\xef\x88\x1a\x50\x76\xaf\x75\x28\x9f\x1c\x30\x2d\x61\xb6\xa9\x83\x9b\xf6\x5a\x87\x5c\x7d\xd9\x19\xb6\x26\x65\xd9\x31\xd8\x2b\xae\x8d\x11\xe2\x8b\x38\x1b\x63\xc1\x62\x38\x11\x2e\x0a\x2e\xca\xcd\x8f\x8a\x56\x75\x94\xa7\x8c\x32\x54\x0c\x86\x2c\x03\xf4\x5e\xad\xe4\x60\xb6\xdc\x4f\xb0\xc4\x45\xdd\x23\xd6\xb1\xde\xaa\x0d\x9b\x6f\x19\xfd\xa5\x25\x08\xd7\x5c\xeb\x7d\x55\x4a\xc2\xd6\xf2\x4a\xd6\x78\x01\x8a\x3d\x4c\xda\x5b\xc7\x81\xa8\x2d\x3b\xad\xbe\x0d\x00\xec\x49\x83\x42\x21\x03\xf4\xb6\x5f\x39\x64\xa0\xc7\x79\x6d\x58\xfb\xed\x47\x9b\xdb\x7a\x40\xae\xc3\x5b\x51\x90\x2b\x73\x11\xd5\x96\x20\x62\xcd\xb4\xea\xbd\xa7\xf0\x2d\x61\x26\x66\xa9\x97\x14\x92\xb5\x5a\x01\x3b\xad\x98\x91\xb2\xad\x36\x5f\xe2\xf1\x02\x4d\xb4\x3a\x6b\xb1\x2e\x33\x3a\x9d\x11\xa9\x9c\xe7\xf3\x04\x28\x0d\x4c\xda\x1c\x2e\x66\xbe\xbb\x20\x7f\x03\x32\xb4\x0e\x2c\x53\xe3\xfb\xcd\x09\x2e\xc0\x78\xb5\xac\xb8\xc6\x93\x20\xdb\xda\xdd\xfd\xcb\x9b\x49\x1e\xa3\xb7\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf1\x69\x03\x7a\x3c\x80\x11\xa1\x09\x96\x33\xca\x59\xea\x2e\x2b\x0c\xb8\xa0\x68\x85\x56\x5e\xaa\x05\xb0\x9b\x97\xa5\xd6\x0f\x05\x12\xa4\xe6\xf3\xcd\xfd\xb6\xc9\x80\x85\x34\xce\x50\x3d\xc9\xc3\xc0\xde\x78\x26\x46\xc4\xa9\x67\x3e\xd4\xfb\xa5\x58\xba\x2d\xcc\x06\xd4\xda\xbf\xab\xcf\x2a\x5a\xd6\xa5\x39\x46\xdc\x1c\x5b\x0a\x2d\x47\x24\x23\xa6\x98\x07\x58\x4c\xb7\x96\x1f\x7c\x2a\xa6\xad\x11\x97\xf6\x7e\x87\x18\x67\xc3\x69\xbc\x95\xb0\x02\x29\x3a\x90\xe8\xec\xdd\xeb\x90\x8e\x39\x2c\xa2\xed\xc8\xba\xe3\x9a\xfb\x98\x17\x8c\x08\x2a\x86\x47\x38\x46\xf5\xa8\xf0\x92\x45\x8b\xf9\x6a\xee\xbc\x5d\xbe\x83\xce\x49\x43\x59\xd3\x2a\xab\x7c\x07\x55\x37\x8b\x19\x66\x53\xad\xed\xbc\xe6\xad\x1e\xd8\xef\x7f\x0f\x83\x10\xa4\x6c\x8b\xc8\x44\x12\xe3\x4d\x33\x27\xf7\xf7\x0e\xd2\x6d\xcb\xfb\xc2\xa5\x24\x0b\xdc\xb8\xa9\x09\x67\x4f\x2e\x98\xc2\xf7\xdf\x22\x7a\x4c\x8e\xd1\x8b\xdf\x07\x5f\xbd\x80\x1e\x47\xf5\xa6\x11\x5c\x0f\xc5\x52\xa4\xc2\xe8\x2b\xaa\x20\x95\xfc\x45\xd8\xc2\x31\x3a\xd7\xfd\x82\x0c\x29\xbf\xb6\x01\xeb\xe5\xb8\x5b\xd9\x01\x12\x64\x8a\x45\x59\x91\x48\x96\x31\x3e\xf1\xc9\x3c\x86\x46\xde\xee\x2a\x72\x4f\xa5\x92\x36\x2c\x72\x9c\x07\xe6\xf6\xa5\x77\x87\xc2\xf2\x56\xdf\x14\x5a\xf8\x0d\x4b\xac\xf0\x30\x90\xba\x27\xc6\x2b\x3a\x2c\x78\x5d\x63\x56\x0e\xb1\x3d\xc7\xdd\xa5\x72\xf2\x3b\x5b\x1c\x61\x88\xfd\xaf\x28\x1b\xe2\xa1\x9c\x91\xa8\x95\xdb\x63\x4c\xe0\xb1\x73\xb9\x2d\x81\x7d\xee\xe5\xb3\x59\x8a\x63\x74\xc9\x55\x67\x4e\xf9\xdb\x16\x56\x39\xa7\x08\x3f\xbf\xbc\xb9\xfa\xe7\xe8\xfd\xc5\xe5\xcd\x5e\x92\xef\x25\x39\x3c\x7b\x49\xbe\x97\xe4\x11\x0d\xef\x8a\x24\x27\x6c\xbe\x2d\x29\xee\x1c\x6f\xeb\xf2\x6a\x6c\x40\x4f\xad\x00\xf4\xb7\x0e\xcd\xdf\x36\xbd\xce\x39\x9b\x7f\xc4\xda\xe4\xb7\xf8\x14\x8b\x7d\x5e\x93\x9a\x64\x7f\x60\xdc\x11\x67\xcf\x9e\x5f\x67\x8b\xec\x38\x19\xd9\x21\xc2\x50\xd4\xba\x55\xeb\x4a\x7b\x62\x74\xf6\xf3\xc5\xeb\xf3\xcb\x9b\x8b\xef\x2f\xce\xaf\xb6\x9a\x38\x08\xfe\xb4\x5d\x48\x19\xdc\x44\x3f\x4a\x68\xa6\xd3\xac\x1a\x41\xe6\x94\xb7\xb2\x5a\x20\x07\xc1\x58\x2f\xae\x56\xa9\x8a\x12\x33\xb0\x0d\x1e\x87\x16\xeb\xb7\x89\x5c\xd2\xed\xd6\xe9\x69\x09\xcd\x6f\x59\xc3\xb3\x9d\xc8\xa1\xe7\x25\xb4\xbf\x46\x43\xfc\x72\x6d\x2f\xa1\xdd\x28\x3d\xf1\x21\x9d\x2f\xa1\x1f\x7d\x6d\x31\xe1\x45\xfd\x14\xd5\xed\x4b\xb2\xef\x05\xaf\x33\x49\xb3\x6b\x13\xc3\x70\xa8\xc5\x75\x47\xf5\xc0\x56\x0c\xec\xe9\xdb\xd6\x72\xec\x4a\x09\x6a\xfb\x15\xe2\xf9\x89\xb3\x93\x54\x6a\x38\x4f\xb5\x5f\x64\x13\x2c\xdf\xe1\xe6\xef\x64\x71\x45\x12\x8b\xa6\xf6\xe7\x9b\x54\xa4\xd0\x3a\x0f\xba\x25\x0b\xc3\xa8\x74\xe6\x1a\x4b\xab\x1b\x9b\x65\xfa\x50\x96\x7a\xcd\xe6\x19\xea\x21\x26\xbd\x23\xcf\x62\xea\xe7\x96\x24\xf0\x10\xb9\x67\x89\x25\x8b\xc0\x12\x82\x9a\xaf\xd7\x34\x6d\xf5\x50\xae\x0a\xcd\xe6\x49\x53\xf8\xdc\x93\xb3\x5a\xb3\x79\xf2\x01\x99\xfa\xcf\x76\x61\x4d\xfd\x67\xab\x20\xa7\xe5\xae\xe4\x83\x3c\xf5\x9f\x5d\x02\x40\xf5\x9f\x8c\xa7\x28\x05\x1c\xb5\xfc\x38\xec\x6f\xe6\x53\x69\x40\xde\x8b\x9e\xea\xe4\x2f\x14\x64\x78\xfa\x41\x4e\xb9\x24\x29\x6b\x05\x64\x9a\xe6\x34\xae\x38\xf3\xe4\x83\x91\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x46\x58\xf9\xa2\xf5\xe5\xb7\x8e\x3c\x4b\xa2\x9a\x28\x5c\x62\x85\x8f\xf5\x81\x18\xf4\xff\x69\x33\x64\xfe\xc7\x7f\x58\xe1\x31\xa9\xe4\x8f\x07\xff\xf9\xf7\xf3\x7f\xfe\x7f\x07\x3f\xfd\x4f\xf8\x1d\xa8\x6b\x06\x85\x1d\xfc\x20\x71\x08\x50\xee\x8b\xf1\x92\x5c\x42\xef\xe0\x9f\xd6\xd2\x3b\x35\x40\x1c\xfb\x05\x94\x5c\x39\x36\xd9\x9f\xfe\x9f\x0d\x2f\x97\xff\x95\x50\xd1\x1a\xed\xa6\xde\x03\x6b\x9b\xc0\xa4\x6c\x9e\x7c\xda\x0f\x6e\xe8\x47\x22\x64\x12\xf9\xae\x7b\xfa\x54\xd9\xe6\xad\x6e\x1b\xcb\x62\x46\x6a\x0c\xff\xf9\xbd\x9b\x02\x7d\x1f\xfb\xa2\x58\x0c\x6a\xdb\xe8\x3b\x70\xd0\x63\x23\x7b\x31\x7f\x95\x64\x71\x9a\x27\xa3\xe4\xf7\x2b\x98\x79\xc2\x60\x46\xec\x6c\x19\x09\xe0\xf5\x47\x9f\xf6\xe1\x72\x2f\xd0\xe9\xe8\x02\xcd\xcd\x0c\xef\xd0\xe4\x3c\x96\xb8\x76\x78\xba\xef\x77\x5a\x6c\x7b\xd4\xdf\x72\x89\x8a\x6f\x4d\x3a\x9a\xfb\xde\x56\x40\x92\xbe\xdc\x3a\xd9\x9c\x4d\x65\xf9\x39\x34\xaf\x3c\x2e\x9a\x76\x60\x5f\x7f\x5c\x93\x9a\x8b\x85\xff\xa7\x27\xf4\x1f\x4a\xc5\x05\x9e\x02\x0d\xad\x69\xdc\xfc\x99\xff\x97\xf9\xc3\x5e\xf7\x56\xff\xda\x38\x24\x3b\xcc\x9e\xe7\x77\xfc\xea\x44\xb6\x5b\xb7\x1d\x91\xd8\x45\x6a\x05\xd5\xfe\xd3\x3b\x0d\x07\x3e\x94\x62\xcc\x44\x3f\x8b\xe0\x05\xb2\x75\x26\x06\x5d\xb2\x1a\xb8\x2a\xd9\x1c\xcd\xb1\x90\x07\xbb\x23\x87\x10\x2a\xe9\x9c\x4a\x9e\x40\x05\xe8\x5f\xb4\xaa\x51\xbb\xb4\x49\x5b\xd1\xcc\xa4\x47\xf9\xb8\xc7\x7d\x03\x65\x85\xfd\x61\x5f\xba\xcd\x5e\xa5\x1a\x0b\x08\x35\x58\x29\x22\xd8\xb7\xe8\xbf\x0f\xff\xf5\xcd\xaf\xc3\xa3\xef\x0e\x0f\x7f\x7c\x39\xfc\xdb\x4f\xdf\x1c\xfe\xeb\x18\xfe\xe3\x3f\x8e\xbe\x3b\xfa\xd5\xfd\xe3\x9b\xa3\xa3\xc3\xc3\x1f\xff\xfe\xee\xcd\xcd\xe8\xfc\x27\x7a\xf4\xeb\x8f\xac\xad\x6f\xcd\xbf\x7e\x3d\xfc\x91\x9c\xff\xf4\x85\x2f\x39\x3a\xfa\xee\xf7\xc9\x5d\xc7\x6c\xf1\x3e\x51\x7a\x9b\x67\x98\xa5\x80\xfe\xba\x37\x66\xb2\x0e\x7b\x57\x21\x65\x6a\xc8\xc5\xd0\xbc\xfa\x5b\xc8\xc4\x4f\x6c\xc0\x6d\xaf\xdc\xe7\xff\xca\x49\xcd\x00\xc3\xee\xb4\x90\x1d\x3a\xe0\x8f\xa5\x68\x98\xdc\xcf\xa7\xf0\xec\x9a\x96\x82\xfa\x4c\x07\xb2\x4b\x7b\xfc\xda\x6e\xd0\xdf\x82\xb3\xd7\xd9\x39\x66\x5d\x3b\xd5\x7d\x22\x78\x6d\xab\xb6\x98\xc8\xf7\x1c\x57\xb4\x74\xbf\xbb\x25\x09\x51\x11\xf7\xec\x9d\xc3\xd1\xcf\xde\x39\xfc\x40\x57\xf6\xce\xe1\xa4\xe7\x59\x3a\x87\x0d\x23\xc5\x6f\xd3\x33\x9c\x9f\x69\x39\x12\xd3\x95\x93\x64\x99\xb0\x79\x2c\x1e\x20\x27\x08\xd2\xb9\x3d\xc2\x1a\xdc\x5f\x86\x34\x8a\xc7\xb7\xeb\x95\xf3\xb0\xa6\x0e\x34\x6f\x54\xda\x7a\x3d\x0c\x0d\x9d\x56\x15\xa2\xcc\x5c\xd0\xfa\x05\x51\xad\x7b\x2a\x2d\x62\xeb\x5d\x58\x0a\xd7\xb9\x1e\xaa\xa7\xc1\x0a\xf0\xf7\xd2\x24\x40\x53\x36\x3d\x36\x6c\x52\x46\x4d\xb4\x10\x15\xca\x50\xdd\x56\x8a\x36\x91\x78\x17\x6f\x86\x1a\xe4\x8c\xbe\x28\xb0\x94\xbc\xa0\xd8\x17\xf8\xf6\x25\xc8\xed\xf4\xc0\x08\x14\xbe\x05\x88\x58\x41\x4a\xc2\x36\x67\xe2\x30\xcf\x47\xdd\x5e\xb7\x0e\xe3\x85\x9e\x89\x73\x36\xb7\xf7\x17\x2a\x5b\x03\x93\x36\x2a\x54\xbe\x76\xbf\x2e\x4c\xac\x3e\xc3\x16\x8c\x13\x40\x63\x41\xdb\xf4\x0e\x47\x0c\x88\x62\x3e\xe9\x22\x7c\x80\x6e\xb2\x24\x43\xdb\xc1\xc5\xa6\xab\xed\x1e\x6c\x93\x64\x8f\xad\xe8\xeb\x5d\x14\xb4\xaf\xa7\x7f\x0d\xf8\xa4\x74\x0d\x3e\xaf\xf6\xfe\x18\x9a\xfb\xae\x68\xed\x3b\xa2\xb1\x3f\x8e\xb6\xbe\x9b\x9a\x7a\x36\x2d\x3d\x8f\x86\x9e\x47\x3b\xdf\x00\xb6\x91\x53\x23\xcf\xa3\x8d\x3f\x86\x2f\xae\x11\x64\x42\xef\x33\x49\x7c\xc7\xa5\x8a\x14\xb9\x07\xcf\x4c\x23\x48\x43\x58\xe9\x32\xe2\x1d\xf5\x21\x50\x77\x3c\x9b\xbc\x05\xe3\x40\xca\x7b\x2f\x5e\xaf\x73\x5e\xed\x2f\x45\xb4\xbf\x14\x37\x78\xf6\x97\xe2\xfe\x52\x7c\x92\x4b\xd1\x4a\xab\xaf\xff\x46\xcc\x5d\x44\xa3\xc6\xd3\xad\xd1\x55\x9e\xf5\x79\x07\x40\x32\x3f\x09\xcf\xe2\x0a\xf9\x6b\xa4\x6b\x29\x14\xb2\x1e\x07\xa1\xb8\x11\x7b\x86\x18\x4c\x20\xc3\x45\x6d\xac\x57\x54\x63\x86\xa7\xc0\x59\xa6\x7f\xe7\x2a\x7f\x71\x81\xb4\x74\x10\x34\xb2\xc0\xec\x12\x81\x03\x38\x8a\x1c\x09\x15\x7c\x29\x78\x55\x11\x21\x51\x45\x6f\x09\x7a\x4d\x9a\x8a\x2f\x6a\x9b\x53\x5b\xa2\x6b\x85\x15\x99\xb4\xd5\x35\x51\x09\xf5\x68\x22\x25\x8e\xa7\x5f\x36\x54\x79\xdb\xda\x8a\xc0\xc4\x0c\xcc\xc4\xa8\x31\x9c\x7d\x51\xaf\x79\xcf\xe0\x2a\x3f\xad\xee\xf0\x42\x0e\xd0\x25\x99\x13\x31\x40\x17\x93\x4b\xae\x46\xc6\x57\x13\xf7\xde\x30\xb3\xcc\xbc\x1c\xd1\x09\xfa\xb6\xc2\x8a\x48\x85\x14\x9e\x82\xe7\xb0\x63\x63\xe6\xa2\xd7\x68\x57\x4c\x77\x8b\x2e\xb4\x0c\x14\xcd\xd0\xba\x27\x68\x7e\x72\x12\xd4\xca\x91\x1e\x6e\x8d\xc0\xcb\x70\x2d\x1a\xee\x35\x43\x1d\xe8\xc5\x89\x21\x50\x77\xa5\x42\xc1\x73\x4a\x19\x12\x44\x36\x9c\x49\xd2\xe3\xda\xec\x06\x62\x3c\xd1\x91\xc8\xea\x8c\x8e\xd5\x68\xc3\x20\xd5\x24\x68\xb8\x54\x40\x49\x19\xab\x9f\xe4\xb2\x05\x46\xae\x23\xc0\x52\x8a\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x13\x45\x04\xc2\xfd\x58\x81\x2d\x26\x71\x6c\xaa\xe1\xb8\x02\xf4\x8e\xf7\x34\xde\x58\x5b\x8e\x49\x28\x22\x6a\xca\xb0\x2d\xb8\xed\xc8\x4d\x43\x96\xd4\x25\xde\xd3\x24\x21\xaa\x9f\xf7\xa0\xd9\x05\xdb\x7b\x19\x47\x8b\xc6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\x5c\xc0\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x7f\x0e\xfd\x01\x1b\xea\x5e\xc9\x93\xdf\x75\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x3d\x29\x52\xf4\xf9\x7e\x4c\xe3\x9e\x14\xfe\xea\x92\xb0\xc3\x81\xf5\x46\xef\x28\xcb\x74\x95\x29\x14\x68\x9e\x4c\x90\xa8\x5c\x30\xa4\x04\x86\xb1\xf0\xc9\x8d\xb2\x39\xb3\x8b\x40\xa5\x9d\x79\xf3\xcf\x8a\x32\xd2\x5f\x18\x4f\xd6\xef\x17\xc7\x44\x17\x57\xaa\xe8\xba\xdc\xf1\xe4\xae\xb9\xbe\xe8\xbe\x41\x19\x99\xc3\x83\x93\x83\xa3\x95\x3d\x72\x60\x0a\x5c\x9a\x6b\xf1\xd8\xf2\x9c\xf9\x41\x49\x5a\x37\x50\xd5\x99\x14\x07\xae\x08\x7d\x72\xcf\xf4\x6d\x68\x8a\x26\xc1\xac\x58\x5e\xb6\x01\x92\x1c\x29\x81\x4b\x6a\x0d\x04\xf8\x54\xff\x48\x89\xd6\x5e\xe8\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\xc1\xf4\x1d\xa3\x1b\xa8\x84\x91\x8e\xb4\x75\x1d\x59\xf0\x16\xea\x2d\x99\x25\x6c\x2a\x5a\x50\x55\x2d\xe0\xba\x41\xbc\x35\x95\xa1\xb4\x6a\x91\xc0\x27\x17\x3e\xe7\xf7\x54\xd9\x14\x2e\x2d\xbf\x5f\x2e\x15\xfa\xaf\xe8\x9c\x9c\xcc\x08\xae\xd4\xcc\x24\x18\x30\xce\x86\xff\x26\x82\x03\xe7\x1c\xb3\xdf\xa4\x76\x23\x2d\x72\x1b\x3e\x09\x51\xdc\xd5\x0e\x65\xc1\x16\x65\x76\x06\xb8\x47\x5f\x7b\x6f\x48\xb4\x4a\x84\x56\xca\xa0\xde\xdc\x8c\xde\x10\x15\x4a\x79\x06\x1f\xa2\x37\xe7\x37\x2e\xad\x04\x9c\xf1\x44\x4c\xb8\xa8\x77\x40\xbc\xe7\xc1\xbb\x0e\xa1\x16\xe1\x0e\xdc\x32\x33\x2e\x93\x96\x13\x3d\xc2\x15\x63\x2a\x47\xe2\xda\xd9\x26\x8c\x14\x7a\x13\xf4\x73\x24\x1c\x75\xff\xc5\xe8\x18\xfd\x93\xb7\x40\x1b\x8f\xc7\xd5\xc2\xb3\x4e\x4b\x92\x06\x6c\xd6\xcf\x0b\xdd\x95\x17\xfa\x06\xd1\x3b\xff\x07\x82\x4b\x22\x24\x08\x68\x82\x13\x53\x98\x32\x1e\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x66\x87\xdd\xe7\xa3\xb3\x87\xf3\xd8\x1c\x57\x4b\x4a\x24\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x48\x2f\x33\xef\xf6\xf3\xb1\x51\x53\xc3\x69\xb3\x01\x0e\x43\x77\x63\x65\x9b\xa9\x70\x90\xe9\xba\xc8\x00\xe1\x47\x19\x61\xfc\x28\x8d\xa9\x6e\xf9\x45\x10\xec\x49\x7e\x53\xbe\xcc\x00\x94\x0d\xfd\x8e\x1e\x05\x01\x8f\x2c\xb0\xd1\x6e\x3e\xe3\x83\x8e\xf7\x9e\xaf\x7b\x39\xed\x8a\xb8\x15\x98\x71\x46\x0b\x5c\xd1\x7f\x93\x12\xb5\x0d\x67\x36\xdd\x0d\x34\xdb\x02\x4b\x32\x84\xe8\x38\x33\xe2\x5c\x06\x9c\x69\x5a\x3a\x28\xce\x41\xdd\xf3\x15\xbd\x4c\xaf\xf3\x74\x35\x2b\x50\x3b\x99\x00\x30\x7c\x56\x02\xea\xbd\xc5\xca\xb3\xe3\xd1\xb3\x50\x27\x91\xc9\x53\x4c\xce\x91\x5f\xcd\x90\x37\x45\x5d\x80\x15\xce\x5c\x57\x20\x78\x4d\x7d\xcf\x9d\xb9\xb7\xb5\x0a\xb8\x6b\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4c\x44\x47\x2f\x22\xd4\xea\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xa6\x04\xbd\xd2\x2d\xff\xe5\xcf\x7f\xfe\xe3\x9f\x33\xb4\xa3\x87\xe7\x81\xdd\x0c\x5d\x9c\x5e\x9e\xfe\x7c\xfd\xf1\x0c\x48\x0b\x53\x5f\x9f\x29\x6f\x35\x77\xd6\x6a\xd6\x9c\xd5\x47\xcd\x58\x05\xfa\x8f\x64\x29\x9b\xfb\x48\x5c\x43\xaf\xc2\xf2\xa9\xd6\x26\x09\xea\xa1\xc5\x94\x27\x5e\x7d\xc2\x60\x9e\x16\x58\x3b\x21\xa9\x64\x45\x48\x93\xcd\xe2\xbf\xd6\x6f\xeb\x71\x37\xa3\xb2\x15\xb6\x70\xa8\x0b\x5e\x75\xbe\x7c\x1b\xb4\x82\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x82\x06\x78\xdb\x5f\xfe\x14\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x32\x9d\xd3\x2b\x73\xf9\xfe\xa6\x63\x63\x81\xec\xa3\xae\x74\xdf\x0f\x36\x5a\x88\x59\x89\x6e\x49\x93\x66\x5d\x6a\x81\xe9\x60\x84\x7d\x14\x21\xf8\xde\x85\x65\x7f\x35\x19\xcf\x46\x10\x38\xf4\x9f\xd1\x88\xd3\x78\xa4\x83\xe0\x3c\x04\x02\xad\x11\x32\xc1\xb4\x42\x18\xbc\xf2\x8a\xd6\xc4\xa4\x5c\x81\xb3\xbf\x43\x4b\x7c\x45\x02\xe7\x6b\xf5\x36\x1e\x38\xd8\xf6\xb7\x1b\x7b\x0d\x53\x89\x2a\xbe\x6e\x33\xc0\xca\x6c\x81\xc2\x92\xff\x7b\x33\xe0\x4b\x9e\xbd\x19\x10\x69\x06\x34\x82\x5c\x2b\x1e\xad\x6b\x66\x03\xdc\x98\x6e\x3c\x00\xb7\x19\x93\x09\x17\x64\x19\x6f\x13\xe0\x60\x2c\x72\x3e\x01\x19\x7c\x3a\xba\xf0\xb1\x2f\xde\xc3\xba\x98\xf4\x60\xd9\x16\x33\x17\x26\x65\x44\xca\x13\x19\x96\xce\x85\xab\xad\x15\x24\x1e\xe5\xd3\x08\x42\x6a\x98\xc7\x41\x47\xf0\xa3\x87\x4b\x98\xf9\x90\xa8\xc2\xc4\xcd\x1d\xac\xc8\xf2\xb7\xbb\xe9\x9a\x24\x85\xf3\xbb\x89\x2d\x04\x96\x33\x02\x29\xaa\xe4\x9e\x2a\x69\x1a\x1d\x01\x0d\x8e\x9b\x71\xad\x2f\x4c\x05\x2e\x08\x6a\x88\xa0\x5c\xab\x18\x2d\x53\x25\xbf\x63\x68\x4c\xa6\x94\x49\xb7\x62\x29\x5d\x72\x5b\x02\x90\x44\x54\xfa\x42\x6b\xc7\xe8\xaa\x57\x7f\xc0\x12\x7e\x15\xbc\x93\x99\x76\x8a\x06\x99\xa6\x04\x94\x17\xd8\x06\x2d\xae\xaa\x45\xb7\xf1\x5c\xfa\xba\x7a\x78\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\x85\x49\xd4\x9e\x50\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\x83\x3b\x83\x4a\x24\x08\x2e\x66\x29\x9a\xdd\x1e\x03\xf6\xb9\x67\x8f\x01\xdb\x63\xc0\xf6\x18\xb0\xd5\x67\x8f\x01\xeb\x3f\x7b\x0c\xd8\xc3\x1d\xda\xe5\xa0\xdd\x1e\x03\xb6\xf7\xca\xac\x3e\x7b\x0c\x58\xd4\xb3\xc7\x80\x7d\xf6\xd9\x39\x11\xbd\xc7\x80\x7d\xc1\xb3\xc7\x80\x7d\xe1\xb3\xc7\x80\xed\x31\x60\x7b\x0c\xd8\x1e\x03\x96\xf0\xec\x31\x60\x9b\x0f\x6f\x1f\xfc\x89\x7f\xf6\x18\xb0\x3d\x06\x6c\xc3\x67\x8f\x01\x5b\x7a\xf6\x18\xb0\x3d\x06\xec\x53\xcf\x1e\x03\xb6\xc7\x80\xd9\x67\xef\x6d\x5c\x79\xf6\x18\xb0\x35\xcf\x1e\x03\xb6\x59\x3b\x7b\x33\x20\xed\x65\x8f\x62\x06\x48\xc5\x9b\x6b\x3a\x4d\xe0\x85\xcc\x75\x0c\xae\x7d\x4f\x2c\x69\xa4\x44\x77\x33\x5a\xcc\x90\x34\x1f\x3a\x3f\x96\xb4\x94\x7d\x21\x22\x2c\xb8\x49\xc6\x44\x9b\x08\x7a\x58\x4d\xca\x6d\x72\x31\x81\x00\x72\xc0\xe4\xa6\x4f\x85\xa3\x09\xa4\xbd\xea\x09\x7d\xf5\xd9\xdd\x6e\x94\x69\xdb\x25\xbe\x07\xc1\x7c\x14\x98\x99\x62\xa5\x30\x7c\x28\x6e\x88\x46\xbc\x94\xae\x60\x03\xe3\x6c\x68\xc8\x5a\x8f\xa1\xba\x33\x97\xc7\x09\xde\xe0\x44\x66\x36\x83\x91\x1b\x09\x3e\xde\x1a\x3b\xdb\x08\xf0\x47\xb4\xb0\x00\x3d\x3e\xe9\x31\xae\x99\x0e\x46\x32\xad\xf5\x81\x61\x50\x50\xc4\x51\x70\x51\x2b\xb0\x3d\x28\x70\x9b\x6c\x6e\x1b\x23\xa7\x1c\x4b\xa5\x3c\x69\xb8\xf9\x9f\x0e\x37\x15\x00\xa6\xa2\xe3\x28\x5b\xa6\x97\x4b\x41\x49\x6d\x0d\x21\xb5\x23\x08\xb3\x0c\xa8\xa8\x9c\xba\xd2\x8e\xa2\xa1\x76\x13\x09\xb5\x8b\x28\xa8\x6d\x20\xa0\xb6\x8e\x7e\xca\x13\x56\xcf\x10\x52\xcf\xa4\x91\x3e\x42\x78\xca\x02\xe9\x6f\x66\x82\xc8\x19\xaf\xa2\x05\x4e\x2e\x61\xf3\x8e\x32\x5a\xb7\xb5\x3e\xbb\x52\xcb\x14\x3a\xf7\x60\x7f\xe9\x44\x86\xbd\xee\x0d\xe2\x40\xff\x90\x96\x04\x2a\x73\x63\x5a\xe9\xad\x05\x64\xa1\x33\x3c\x07\xa5\xb4\x2d\x0a\x42\xca\x14\xb5\x34\xf4\x56\xff\xf1\xd8\xf7\xd0\x70\xf4\x53\x89\x5e\xa5\x5d\x35\x69\x76\x4f\xe0\xce\xfb\xe3\x1f\xa2\xde\x31\x15\x4d\x9e\x5b\xfa\xcd\xd5\xe8\xac\x77\x4b\xc3\x07\x3f\xc0\x31\x3e\x9b\x91\xe2\xf6\xca\x42\x69\xb6\x77\x33\xa7\xbb\x99\x92\x5c\x4c\x39\x14\x83\x54\x2f\x4a\x3f\x86\xcc\x85\x5a\x0a\x81\x4e\x61\x15\x89\x98\xd3\x82\x1c\x3f\x81\xa3\x22\x97\xf1\x9f\x7e\x10\x10\x84\x09\x60\xe0\xbb\xa2\x76\x5d\x9b\xee\xf8\x08\x43\xe0\xa3\xb2\x3d\x05\xd0\x68\x85\x0b\xbf\x36\xd3\xf5\x87\x2e\xa9\x1b\x87\x92\x10\x6f\xd0\x4c\xa9\x9a\xb5\xe3\xe3\x82\xd7\x27\x5a\x74\x98\xff\x19\x57\x7c\x7c\x52\x63\xa9\x88\xd0\x36\x8e\xbd\xd6\x87\x85\xee\x01\x65\xd3\xe3\xba\x3c\x3a\xfe\x3f\x49\x7d\xb8\xb0\xbe\x72\x9b\x86\xf5\x80\x93\x60\x4c\xb4\xdc\xe7\x62\xc9\x5b\xa0\x27\x25\x7d\x93\x26\xdf\xdf\xa9\x45\x45\x12\x61\xc9\x5b\x81\x24\xef\xa5\x36\xca\x10\x10\xc8\x29\x54\x76\x03\x76\xfc\x68\x90\xe3\x2c\x67\x35\x13\xd4\x78\x87\x60\xc6\x3b\x63\x0b\xed\x0a\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xd1\xa0\xc3\xcf\x02\x36\x9c\x31\x3e\x96\x09\x2e\xfc\x14\x50\xe1\xdd\xf5\xc1\xa0\x0c\xf0\xe0\xa7\x83\x06\x67\x99\xc7\xac\x56\x6c\xa2\x48\xd8\x02\x14\xf8\x29\xe2\xff\x8f\x16\xfb\xcf\x10\xf7\xcf\x19\xf3\xcf\x16\xef\x7f\x34\xc8\x6f\x3a\xdc\x37\xab\x4f\xe1\x49\x60\xbe\x39\x21\xbe\xc9\xeb\x4b\x19\x55\x14\x57\xaf\x49\x85\x17\xd7\x69\x40\xd0\x5c\x2b\x71\xb9\x02\x16\x35\x6e\xeb\x3e\xae\x61\x86\x25\x72\xa1\x6e\x4b\xf1\xe2\x62\xe9\x56\x05\x46\x18\x22\xce\x7a\x7c\xd1\x51\x6b\xb4\x7b\x91\x6b\xb4\x33\xee\x71\xc3\xab\xb2\x23\xbb\xe6\x07\x7e\x87\xf8\x44\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\x77\x3a\xf2\x65\xfb\xf8\xf9\xd0\x97\xfd\xe1\xa4\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\xd5\x55\x7f\x7f\x05\xfd\xf1\xa2\x08\xb3\x12\x59\x7e\xae\xaf\x6f\x9f\x24\x43\xdd\xfb\xc6\x8d\xc7\xa6\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\xff\x0a\x14\xd0\xbd\xd3\x75\x67\x9c\xae\x5b\x42\x60\x7f\x7d\xd6\xd6\xd3\x23\xae\xf7\xd6\xd6\x6f\xc5\xda\x0a\x68\xf1\xde\x08\x5c\x90\xd1\x2e\x29\x6f\x4e\x80\x74\x89\x80\x9d\x0e\xe7\xc5\x05\x23\xc4\x24\x8e\x75\xa4\x87\xc0\xef\x37\x69\xab\x6a\x61\x7c\x88\x3d\x06\xcc\xf8\xad\x75\x33\x23\x2b\xd4\x81\x10\x4a\x5d\xd3\xbb\xce\x36\x69\x04\xb7\x1a\x89\x68\x19\xd3\x2a\x86\x3d\x4e\xba\xf3\xda\x16\x91\x84\xc5\xbb\xd3\x71\x8f\xd8\xd0\x82\xd0\x01\xe8\x39\x23\xa8\xcb\x5f\xea\x77\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x92\x05\x69\xdf\xd2\xaa\xb2\xaf\x49\x00\x85\x13\x65\x42\xcf\x46\xa3\xa9\x38\x9b\xc2\x64\x60\xd3\x11\x72\xdf\x90\x42\xb7\x59\x54\x04\xb3\xb6\x31\xfd\xd4\xfa\xd1\x82\xb7\xc2\xf5\x33\x09\x15\x1f\xb4\x4e\x25\x62\xb4\x1a\xb8\x29\xef\x53\x60\xae\xee\xf9\xce\xa5\x2c\x49\x69\xd9\x2b\xef\xa8\x24\x03\x78\x67\x74\x9f\x4c\x5f\x5c\xd5\x7e\xb3\x6f\xcc\x67\x8d\xe0\x73\x5a\x76\x18\x7d\xbd\x2d\x00\x1f\x1f\xdd\xd6\x47\x78\xaf\x13\xad\x8c\xb3\x21\x23\x53\x0c\xea\xb1\x15\x68\x06\xd1\x69\xda\x37\xf8\x41\x56\xd2\x02\x2b\x22\x21\x27\xa1\x47\x6d\x3b\xa7\x38\xba\x27\x7a\x3c\xc1\x8e\x42\x87\x8c\x23\x0e\x99\x85\x2d\xa3\x6a\x01\x11\xbd\x59\xab\x50\xc9\xef\xd8\x51\xca\xc1\x34\x30\x07\x8c\xc6\x44\xe1\x2e\x39\xd0\xa9\x64\x12\x11\x86\xc7\x95\x3e\x7b\x80\xf8\xbf\x59\xbb\x01\xd0\x84\x60\xd5\x0a\x82\xa6\x58\x25\x48\x89\x35\xda\xbc\x59\xcf\x4f\x6f\x3b\x2a\x6d\xbc\x6e\x82\x5a\x26\x49\xa2\x22\x9b\xcd\x04\x88\xcc\x78\xd5\x27\x9a\xb7\x6a\x47\xee\x91\x87\x5c\x47\x26\x73\x27\x30\x12\x69\x4d\x24\xe2\x6d\x82\x27\xaf\x67\xfe\xd9\xe6\x72\x5a\x78\x7b\xbf\xd3\xda\x27\x36\x6c\x9a\x63\x87\x5d\x06\x5a\x79\xc0\x4f\xe0\xe0\x56\x26\x83\xfa\xf5\xe5\xf5\xcf\x6f\x4f\xff\xeb\xfc\x6d\xdc\xc2\x9f\xe3\x62\x16\x72\x8b\x33\x84\xe1\xa2\x00\x21\x3f\xc3\x73\x82\x30\x6a\x19\xfd\xa5\xb5\x90\xb7\x43\xdf\x5e\xa4\x58\xcd\x92\xde\x93\xa4\xf8\xea\x5b\x22\x4a\x72\xe4\x58\xd3\xb7\x54\x02\x51\x35\x74\xc2\x02\xff\xb9\x24\x68\x22\x78\xbd\x64\x68\xa1\x4b\x0f\xae\x5b\xe8\x1b\x06\x1b\xd3\x6c\x46\x44\x9c\x46\xfe\xfa\xfd\xf9\x35\xe4\xe0\x37\xc2\x10\xbb\x43\x72\x01\xbc\x13\x5a\x37\xa9\x83\xa6\x3f\xe5\x31\x3a\x65\x0b\xf3\xa5\x11\x66\x91\x2a\x4a\x45\xa5\x22\xa0\x9c\x5a\x43\xd2\xc1\x03\x5f\xbc\x3c\x86\xff\x7b\x81\x70\x59\x0a\x6d\x69\xfa\x1c\x8d\x62\x39\xcb\x2c\xaa\x65\x63\xbf\xd2\x71\x15\x4c\x2e\x23\x0a\xd2\x38\xa2\x5e\xf8\x8e\x97\x76\x25\x40\x09\x04\xfc\x8e\xd1\x6e\xa5\x12\x58\x91\x29\x2d\x50\x4d\xc4\x94\xa0\x06\xab\x62\x86\x6a\xbc\x40\x05\x17\xa2\x6d\x0c\xc5\x48\x89\x15\x8e\x6b\xf9\x7b\x2e\x50\xed\xa4\xb3\x96\x66\x5a\x25\xbf\x5e\x0f\x04\xed\x44\x76\xf8\x9f\x54\xca\x96\xc8\x93\x57\x2f\xff\xfa\x87\x3f\x47\x9a\xd7\x19\x0f\x6e\x2c\xf4\x29\x01\xf2\xd4\x87\x7f\xb9\x0d\x06\xa0\xeb\x1e\x33\x8c\xdd\x21\x66\xe7\x83\x34\x94\x94\x4d\xab\x64\x07\x48\xb2\x1b\x30\xd5\x09\x38\xec\x46\x30\x8a\xf5\x05\xa6\x7b\x02\x7b\x7d\x88\x77\xa5\xe4\xf3\x82\x75\x1a\x9c\xf3\x7b\x59\x81\xcc\x59\x60\xd8\x5d\x8c\x9c\x94\x4a\xf1\x1f\x81\x35\xe1\x1d\x53\x86\x7d\xc4\x34\x6b\xf0\x0e\x03\xf4\x12\xfd\x27\xba\x47\xff\x09\x5e\xb0\xbf\xc4\x37\x95\xc7\xc7\x94\x03\xc6\x3f\xe3\x52\x5d\x8c\x32\x2d\xf4\x3f\xf4\x7d\xa5\xdf\xa8\xd7\x43\x71\x34\xa6\xd6\x1d\x41\xee\x15\x11\xda\x0c\xb4\x6b\x98\x3a\x73\x49\x1e\x35\xdd\xc1\xe7\xb2\xbb\x53\xc1\x05\x17\x93\x3e\xfa\xff\x89\xf6\x37\x34\xfc\x03\x97\xea\xd2\x4a\xeb\x90\x42\x27\xec\x47\x0d\x17\x71\x4f\xdc\xa7\xb4\xfa\x4e\xef\xbd\xae\xc6\x06\x2a\x39\x24\x40\x98\x1c\xce\x19\x4d\x10\x0e\xbb\x73\x62\xd3\x70\xa2\xf9\xb6\xee\xa7\xb6\xd6\x92\x4f\x1f\x3c\x32\xd6\x48\x09\xca\xd2\x34\xbc\x3c\x06\xfb\x26\xa1\x17\x7a\x36\xca\x40\x19\xf8\x84\x69\x74\x6c\xec\x35\x1f\x1d\x86\x03\xa7\x25\x56\x81\x59\xac\x0e\x6b\x1e\x41\x26\x44\x08\x93\x27\x3c\x5e\xb8\x74\xa3\xe4\xdd\x96\x24\xe5\x1a\xc1\x15\x2f\x78\x34\x6d\x4a\xce\xad\x32\xb2\x7d\x81\xb9\x87\x58\xad\x8f\x8e\x7f\x78\x3d\x1a\xa0\x9b\xb3\xd1\x00\x71\x81\xae\xcf\xd2\xc0\x4f\xa1\x0b\xe6\xc5\xcd\xd9\xe8\xc5\x56\x57\x20\xc8\x61\xba\x39\x1b\x45\xbc\x64\x15\x3e\x5b\xe3\x66\x78\x4b\x16\x91\xda\x5d\x0e\x0d\x73\xe8\x37\x56\x96\x01\x99\x69\xae\x71\xb3\xf1\xdb\x04\xc1\x25\xdd\x69\x26\x17\x97\x75\xe8\x7b\x9a\x8f\xd2\xa5\xe6\x73\x52\x1a\xab\xd9\xb5\x42\x58\xd9\x70\xaa\x6d\xa4\x3d\xcf\xcb\xa7\x9e\x3d\xcf\xcb\xe6\xcf\x9e\xe7\x65\xdd\xb3\xe7\x79\xd9\xe0\xd9\xf3\xbc\x98\x67\xcf\xf3\xd2\xef\xc8\x2e\xe6\x18\xed\x79\x5e\x3e\xfb\xec\x79\x5e\x1e\x7c\xf6\x3c\x2f\x1b\x3d\x7b\x9e\x97\xd5\x67\xcf\xf3\xf2\x89\x67\xcf\xf3\xe2\x9f\x3d\xcf\xcb\x9e\xe7\xe5\xf9\x4a\xed\x3d\xcf\xcb\xf2\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\xc2\x67\xcf\xf3\xf2\xc0\xb3\xe7\x79\xd9\xf3\xbc\xec\x79\x5e\x3e\xfd\xec\x79\x5e\xa2\x9f\x3d\xcf\xcb\x66\xcf\x3e\xf3\x70\xc3\x67\xcf\xf3\xb2\xe7\x79\x59\x7e\xf6\x3c\x2f\x9f\x7d\x76\xc3\x3d\xbe\xe7\x79\xd9\xf3\xbc\x7c\xf2\xd9\xf3\xbc\xec\x79\x5e\x3e\xf9\xec\x79\x5e\x22\x9e\x9d\x73\xba\xee\x79\x5e\xf6\x3c\x2f\x9f\x6a\x63\x6f\x6d\x6d\xf6\xec\x79\x5e\xf6\x3c\x2f\x2b\xcf\x9e\xe7\x65\xf5\xd9\xf3\xbc\xec\x79\x5e\xf6\x3c\x2f\x7b\x9e\x17\xff\xec\x79\x5e\xbe\x76\xbf\x93\x20\x92\xfe\x9b\x8c\x78\x45\x8b\x45\x72\xb6\xcf\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x63\x14\x0a\x57\xc1\xc4\x85\x54\x0a\xc2\xce\xc1\x63\x4c\xc1\x4e\xd0\x29\xb8\x01\x5e\xc6\x23\x08\x86\xae\x7c\xb6\x99\xbe\x38\x67\x69\xb2\xd5\x1e\x0e\x64\x17\xd2\x39\x43\xda\x23\xbf\x8b\x14\xf7\xc2\x96\x3e\xb8\xb9\x70\xd3\x54\x34\x25\x31\x16\xa1\xeb\x16\xb4\x0b\x62\x43\xe0\xf2\x5b\x54\x34\xed\x00\xd5\xa4\xe6\x22\x21\x31\x22\x83\x05\xd7\xdb\x2a\xbb\xb0\x4e\x57\xa6\x43\x6e\xf2\x15\x87\xf9\x5f\x18\x7b\xa1\x63\xa9\xf2\x6b\x45\x9d\x38\x4c\xc2\x9a\x5d\x4c\x96\xc1\xa8\x54\xf5\xbc\x40\x97\x5c\x5d\xd9\xc3\xbd\xb5\xf5\xca\x8c\x58\x70\x53\xb8\x35\xd6\xaa\x33\x5e\x37\xad\x22\xbd\x8b\xcd\x4c\xb1\x31\x3a\xa8\x4c\x15\xe8\xdb\xc9\x06\x2d\x38\x9b\xd0\xa9\xb5\xbe\x4f\x6a\xcc\xf0\x94\x0c\xfd\x6c\x0f\x3b\xaa\x87\x93\xe8\x8b\x7a\x6b\xa9\xa0\x45\x85\x69\x3c\x70\x30\x97\x98\x38\x83\x5e\x00\x0d\x58\x07\xa8\x87\xdc\x34\x3f\xcd\x03\x0f\x1b\xa7\x46\x6e\x1c\xbb\xaf\xcc\x1f\x0f\x12\xac\x47\xac\xc0\x57\x01\x86\xd1\x9a\x9d\x9a\x6e\x30\x32\x84\xab\x66\xf6\x69\x93\x31\x25\xe5\xf2\xf5\x82\xe1\x9a\x16\xee\xe0\x9d\x56\x15\x2f\x8c\xab\xa6\x6f\x6c\xa6\x8d\xc4\xf4\x5e\x0f\xa9\xae\x5b\x85\xc7\x15\x39\x46\x17\x86\xb9\x82\xb3\x6a\xa1\x8f\xa5\x24\xca\x21\x17\xec\x99\x48\x33\x30\x53\x60\xb1\x89\x90\xd8\xb5\xba\x3a\xec\x35\x43\xb5\x41\x98\x96\x70\x9c\x11\x44\x98\x12\x0b\xbd\x2d\x47\xbc\xbc\xd6\x3b\xb3\xf7\xeb\x64\x06\x8e\x44\x24\x6c\x0e\x14\x6c\x22\x02\x36\x0f\x6e\x35\x1d\xb3\x9a\x17\xaf\xda\x45\x16\x0c\x81\x50\x98\x08\xd4\xdb\x16\x0d\x2f\x8f\xd7\x48\x2c\xc4\x27\x89\x3d\xd0\x2d\x8e\x78\xa9\x75\x29\x41\x8c\xd8\xf2\x67\xd4\xf8\x15\x2f\x74\xe7\x6e\xc1\x11\x88\x55\xa7\x64\xe1\x39\xa6\x95\x3e\xc0\x89\x1d\x58\x25\x63\x4c\x0b\xd6\x64\x0a\x61\x58\xcc\xfe\x2e\x6d\x16\x9b\xed\xd5\x4b\x18\x2b\x66\x5c\x12\x06\xf2\x12\xfb\xc4\x1e\x9f\x76\x60\x45\x4c\x69\xae\xe8\x54\x70\xf1\xc5\x04\x91\xba\x51\x8b\x01\x22\x73\x22\x16\x6a\x06\x20\x04\x4f\x27\x0a\x62\x8d\x4a\x54\xe3\x32\xd8\x1d\x03\xc4\x9d\x5f\x3a\xb1\x79\xb8\x1f\xac\xa9\xd6\x56\xca\x18\x6e\x54\xfa\xec\x8a\x6d\xef\x9a\xdc\x2c\x37\x28\x55\x68\xe6\x64\xa9\x41\xc0\xb0\x5a\xd3\x38\x3e\x5b\x94\xf1\x2c\xbc\x85\x5e\x04\x19\x25\x7a\x4b\xd4\xf8\x1e\xbc\x96\xb8\xe6\x2d\x53\x86\xbe\xc6\x18\x12\x5e\xf9\x33\x79\x37\x4f\x08\xa3\x7b\x54\x95\x1f\xe5\xb9\xda\x71\xe9\x18\x2b\x46\x39\xd2\x97\xb1\x52\x44\xb0\x6f\xd1\x7f\x1f\xfe\xeb\x9b\x5f\x87\x47\xdf\x1d\x1e\xfe\xf8\x72\xf8\xb7\x9f\xbe\x39\xfc\xd7\x31\xfc\xc7\x7f\x1c\x7d\x77\xf4\xab\xfb\xc7\x37\x47\x47\x87\x87\x3f\xfe\xfd\xdd\x9b\x9b\xd1\xf9\x4f\xf4\xe8\xd7\x1f\x59\x5b\xdf\x9a\x7f\xfd\x7a\xf8\x23\x39\xff\xe9\x0b\x5f\x72\x74\xf4\xdd\xef\xe3\x83\x92\xa9\x11\xf8\x7c\xf1\xf7\x4c\xd1\xf7\x47\x89\xbd\x5b\x19\xbb\xf5\xc3\x6f\xaf\xc0\x95\xe3\x6f\x83\x16\x9f\x3a\xfe\x22\xd9\x55\x73\x31\xe9\xda\xa7\x12\xf1\x9a\x2a\x45\x4a\x7b\xf7\x06\x94\x38\x4b\x6e\x22\x2b\xb0\x80\xcd\x0a\xc3\xed\x1d\x50\xb3\x74\xde\xa5\xe8\x6e\xf9\xfb\x15\x1c\x63\x0c\xd1\xba\xa9\x48\x4d\x98\x02\xc1\x33\x74\x26\x2f\x78\x19\x8f\xbb\x11\x14\xc6\x0f\x42\xee\x0b\x42\x4a\xdb\xc9\xbd\x6c\x0c\x9e\xbd\x6c\xdc\xcb\xc6\xcf\x3d\xc9\xae\xf2\x1c\x82\xf1\x2a\xec\x84\x75\x71\x49\xa7\x29\x83\xe3\xdc\x33\x27\xf0\x09\xe0\x27\xe6\xb4\x6c\x71\x15\x12\xcc\x3a\xce\xd1\x38\x09\x10\xb8\x76\x6a\xbc\x58\xf1\xe4\x50\x46\x43\x36\xdb\x81\x47\xfd\xc0\x0f\xad\x5e\xd6\x45\x9c\x5f\x9c\x56\x77\x78\x21\x23\x49\x2f\xbf\xe7\x02\x80\x24\x4b\x8d\x22\x2e\x1c\xbe\x28\x34\x71\xfb\x1e\xfe\xb8\x08\xe1\xba\x89\xee\x53\x54\x58\x23\xfb\x40\xfa\x1f\xba\x38\x92\x9d\x88\x2e\x2b\x44\xef\xf3\xb8\x81\x5f\x13\xa5\xac\x13\x70\x69\x4b\xe0\x6e\x4e\x7d\x58\xb4\x3f\x3d\x06\x4a\x04\x54\xb3\xfa\xcb\x09\xd7\x6b\x02\x45\x1a\x26\x13\x52\x44\x5a\xc1\x86\xd2\x63\x4d\x3b\x06\xde\xae\x28\x6b\x71\x55\x2d\xdc\x9c\x90\x12\x71\x16\xd5\x10\xb9\xa7\x0a\xb5\x4c\xd1\x4a\x6f\x26\x24\xc8\xb4\xad\x70\xe8\x40\xb4\x23\x73\xa8\xbb\xf2\x18\xbd\x67\x05\x09\x7f\x1c\xe7\xf8\x5e\x6a\x40\x2b\x1d\x15\x51\xa4\x1c\xc0\xab\x97\x77\x20\xe0\xd6\x7a\x12\xc3\x2f\x4b\x54\xf3\x6e\x2e\x3d\x2e\xe9\xd8\x1c\x44\x0f\x9a\x40\x25\x9d\x4c\x74\xcb\x60\xa4\x33\x2e\x6a\xbc\xda\x2b\xcc\xca\xa8\xd6\xb5\x06\x04\xd9\x2a\x21\x69\x30\x14\x8a\x79\x21\x69\x49\x0a\x2c\x5e\x84\x25\x46\x4e\x2b\x35\xe3\xed\x74\xd6\xed\x8a\xb4\x29\x47\x52\x01\x5a\x4b\x4f\xa6\x74\x1e\x8f\xa5\xcd\x26\xb5\xae\xc3\x0a\x62\x54\x32\x4e\xcc\x71\xbf\xc3\x91\x6d\xaf\x20\x0a\x0c\x44\xdc\xac\xb9\x4b\xe1\x02\x48\x20\x29\x83\x7c\x3b\x46\xee\x55\x86\x01\x1f\xa3\x0b\xc3\x9f\x31\xe8\xbf\xb5\x37\x25\x66\x32\x02\x48\x9c\x03\x77\x46\xe2\x01\x97\x1a\xa0\x3e\x63\x0d\x68\x8e\xcd\xcb\x31\x5b\xb8\x04\x11\x80\xac\x99\xc4\x36\x9f\xb3\x52\xc5\xf9\xde\xfd\x59\x7a\xf2\xaa\x3d\x92\x14\xad\xa0\x6a\x71\xc6\x99\x22\xf7\x51\xb2\x2f\xc7\xad\x7e\xdd\xef\x46\xef\x5e\x77\x5d\x44\xbc\x31\xdc\x92\x4b\x85\x9b\x66\xbc\xad\x4a\x60\xd8\x6d\x19\x88\x9d\xb8\x1b\xe5\x62\xa2\xaf\x70\xb3\xdf\xe0\xc6\x84\x70\xda\x72\xc7\x1c\x52\xd4\x00\x66\x7f\x69\xe9\x1c\x57\x84\xa9\xe0\x2f\x46\x80\x1d\x0c\xff\xe8\x31\x63\xae\x0a\xcb\xdb\xce\xc2\x20\xc3\x86\x97\x9d\x41\x71\xe2\xa6\x0e\x3e\x22\xf7\xea\x19\xc6\x5b\x41\x61\x1a\x09\x3a\xa7\x15\x99\x92\x73\x59\xe0\x0a\xec\xa8\x6d\x1b\xe7\xa7\x0f\xf4\x0b\x76\xa6\xe0\x95\xd4\x0a\x98\x36\x56\xb5\xaa\x69\x90\xd3\x10\xf8\x9b\x62\xca\xa0\xea\x50\x42\x70\xc8\x36\x2a\x0d\x74\x5b\xdb\xdb\x0d\x16\x7a\x17\x3a\x88\xb6\xb9\x1a\xc7\x9c\x57\x96\xa6\xb6\x5a\x74\xfd\xa2\xf1\x51\x14\x90\xc5\xfc\x67\x46\xee\x7e\xd6\xbd\x90\x68\x52\xe1\x69\x77\x35\x13\xb5\x92\xef\x92\x8e\x1a\x7f\x70\xa2\x81\x83\xb5\xd5\x8a\x8d\xd6\x2a\x3a\x3c\x7d\x28\xc1\xe3\x0d\xba\x57\x47\x20\x4f\xb0\x44\xbe\xed\x38\xd5\x41\x3f\x7f\x38\x82\x7b\xe2\xec\x74\xf4\xf3\xf5\x3f\xaf\x7f\x3e\x7d\xfd\xee\xe2\x32\x1e\x35\xcb\x15\x31\xde\x95\x40\xbb\x2f\x3c\xd0\x43\xaf\x82\xc7\x0a\x1d\x73\x79\x0c\xa1\x13\x20\x73\x61\x25\xbf\x4b\x8c\x2f\xeb\x3d\x45\x70\x9c\xe6\x8a\x9b\xe6\x54\xd4\x5c\x8c\x04\x9f\xd0\x2a\x3a\x34\x99\xeb\x04\x2f\x75\xc7\x45\x9a\x4e\xed\xc7\xdd\x75\x63\xf8\x05\x56\x71\x0e\xc1\x95\x41\x21\x8b\x5d\xbf\x26\xde\xb3\xd5\xcb\x41\x30\x19\x11\x4b\x5d\x8c\x3f\x44\x5b\xdd\x33\x5b\xcf\xde\xd4\xdd\x88\xfc\xf3\x1c\x91\xf8\x8a\x17\xb8\x82\xfa\x45\x69\x1b\x1f\x65\x0e\xb2\x2e\xf7\x2b\xc8\x36\xc1\x6e\x3b\xa3\x8a\xe3\x12\x8c\x55\x2b\xfc\x4b\xe2\x58\xb5\x9d\xda\x05\x81\xf3\xa4\x8e\xdc\x18\xa4\x3f\xb4\xe7\xd2\x63\x1a\x41\xbc\x56\xb3\xd4\x3c\x47\xf1\xd5\x06\xdd\xf3\xae\x0f\x43\xb0\xa3\xec\x25\x72\xa6\x9e\x39\xdf\x8c\x3d\x60\x74\x02\x1e\x10\x70\x03\xd1\x09\x6c\x4a\x70\x00\xbd\x75\xcb\x90\x50\xf8\x24\x13\x12\x00\x5e\xb2\x23\xbb\xd3\xcc\x8f\xdf\x91\x06\xa6\x7c\x4b\xf5\x0c\x4e\x3a\x21\xed\xb6\x8d\xd3\x41\x0c\x56\x39\x71\x3f\x7e\x84\x12\x5b\x4e\xfe\x63\x91\xcc\x0b\xe6\x97\x18\x0d\x83\xa3\xd5\x08\x32\x5c\x3d\x5e\xa9\xc0\x85\xab\x96\x29\x5a\x13\xc7\x7d\x31\x5c\xd2\x89\x84\xf9\xfa\x40\x7a\xa6\xd9\x2c\x1b\x1d\xa1\x0f\x0c\xce\x2b\x23\x25\x1a\x22\xc6\xbb\x25\x22\x6c\xc2\x45\x01\x41\x9a\xad\x6e\xf0\x02\x37\x78\x4c\x2b\x9a\x22\xcc\x73\x6d\x70\x28\xdc\x10\xf4\x07\xdc\x49\x65\x79\x52\x0a\xde\x98\x9b\xd8\x25\xa5\xa6\x03\x03\xfb\xc9\x4f\x21\xc7\x30\x28\xec\x93\x7e\x47\xa6\x02\x33\xd5\x39\x72\x57\x36\xce\x6f\x51\x07\xc9\xa1\x04\xe0\x32\x5f\x09\x94\xd3\x52\xcb\x8c\x70\xd9\x92\xcf\xd5\xae\xd1\xa9\x9e\xb9\xc1\x05\xd9\x4f\x68\xf4\xfe\xfa\xe2\xff\x2d\x9d\x9b\x78\xd5\xce\x3c\xbb\x4d\xa6\xa8\xe5\x41\xb6\x6d\x73\x65\x2b\x50\xed\x37\xce\xd7\xbd\x71\xbc\x83\x68\xeb\x4c\x50\x57\x2d\xeb\x57\xc1\xef\xba\x86\xea\x24\x5d\x67\xe4\x49\x13\xfa\x6f\x0d\x63\x3d\x82\x20\xfd\x13\xa6\x28\x44\xde\x02\x6f\xad\xe2\xa6\xc8\x52\x96\x7a\xad\xe1\xed\x3a\xc1\x95\x7c\xae\x57\x64\x8a\x6b\xa7\x11\xbc\x78\xc7\x5b\x96\x87\x5a\x2a\x61\xc7\xf9\x8e\xa0\x92\x30\xae\xac\x37\x05\x6c\x09\x3e\x81\x6f\x91\x81\x4d\x05\xac\x91\x3d\x3d\x27\x41\xcd\xba\x09\x54\x2b\x1f\xdf\x77\x7a\xb8\xb1\x5f\x5a\x49\x96\xe3\x17\x56\xaf\xea\x50\x54\x13\x1e\x0f\x1e\x11\x04\x97\x60\x60\x36\x58\xcd\x0c\x9d\x59\x8d\xe5\x2d\x29\xcd\x07\x89\x54\x0e\x3e\x07\x07\x42\xfc\x6e\xa6\x6f\xf4\xe4\xba\xb4\x19\x70\x08\x1b\x52\x37\x48\xd4\x49\x31\xc5\xb6\x7a\x1a\x12\x04\xbb\x5e\x84\xf7\xac\x5a\x5c\x71\xae\xbe\xf7\xd5\xda\xb6\x7d\x32\xfe\x61\xc3\x11\x7d\x27\x26\xf8\xa5\x31\x74\x79\x08\x1b\x07\xe4\x62\x50\x63\x2e\x55\x2c\xea\x05\xf9\xad\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xd9\x7e\x98\x12\x0b\x28\x3e\xea\x3c\x5e\x19\x83\x36\x1f\x2c\xaf\x52\x28\xd9\x92\x29\x54\x10\x7a\x87\x17\x08\x57\x92\x7b\x97\x1a\x5b\x17\x6e\x75\xb1\x5c\xfd\xf5\x98\xab\xd9\x4a\x10\x37\x16\x05\xa2\x9f\xd5\xf6\x06\x01\x69\x50\x97\x9f\x4d\xd9\x4a\xb3\x0a\x12\x8b\x1a\x41\x0a\x52\x12\x56\x3c\xd7\x13\xb1\x6d\x0e\x1b\x38\x55\x97\x9c\x69\xf1\xba\xed\x73\x75\xe1\xfd\x93\x76\x35\xc2\x53\x04\xae\x6c\x1b\x44\xc4\x00\xd3\x03\xe1\xda\xca\x94\xac\xaf\x8b\x09\x44\x3d\xcd\xa6\xfb\x7b\x3b\x26\x95\x5e\x6c\x5a\x55\x7a\x07\xd2\x12\x2b\x03\x4d\xa0\x35\x9e\x12\x84\x95\x3f\x84\x8a\x23\xc2\x64\x2b\xec\xbe\x89\x04\xe8\xe8\xc7\x63\x8b\xec\xd0\x3e\x5c\xbc\x46\x2f\xd1\xa1\x1e\xdb\x11\x68\x1c\x13\x4c\x2b\xa0\x90\x02\xf0\xdf\x52\x48\x76\xe2\xe0\x49\x49\x53\x00\x72\x04\x71\x61\xae\x96\x01\x62\x1c\xc9\xb6\x98\xb9\x39\xa0\x9c\x79\x8f\xb0\xe5\x13\x4e\xca\x85\xd9\x8b\x9d\x7c\xf7\xe1\x07\x49\xc4\xb6\x8f\xad\xbe\x0e\x3f\x3c\xe1\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\x7e\xb0\xdf\xb5\xfb\xcb\x32\xe1\xb2\x94\xe4\x2d\x65\xed\xbd\x61\xec\xdc\x89\xb0\xc7\xf5\x39\xf4\x08\x15\x6e\xa1\x79\x10\xb7\x73\x11\x8a\x0c\xe9\xd1\x17\xbd\x63\x34\x78\xc0\xea\x86\x5b\x02\x1b\xfa\x07\xa2\x0d\x21\xcc\x4a\x5e\xaf\x74\x72\xc2\x05\x22\xb8\x98\x45\xf7\x26\x40\x8d\xec\x0f\xa6\x7d\x7e\xdb\x01\xa1\x8a\xcc\x49\x95\xcd\xb7\xff\x56\xbf\x4d\x4f\x8e\xdb\xb9\xf0\x7a\x54\xe1\x31\xa9\x2c\x61\x8b\x61\xf1\xca\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x3f\x8b\x79\xc8\x0a\xbe\xb8\xb1\xe8\x92\x6e\x1e\xc0\x07\xfa\x1c\xe6\xa1\x4d\x50\x10\xd1\xf2\x3c\x68\x6d\xb3\x3f\x0f\xa0\x7f\xed\xfa\x3c\x48\x52\x14\xbc\x6e\x76\x04\x29\x79\x63\x50\xf8\xba\x47\x5f\x8a\x8a\xec\xff\x18\x27\xc1\x9d\x2d\x0f\x33\x56\xe6\x1e\x74\x64\xcc\xff\x37\xb8\xce\x41\xda\x2d\xdf\xf1\xb6\xf5\x64\x44\xa6\x6f\xd1\xbe\xf0\xb7\x78\xe3\xed\x61\x98\xbd\xe7\xc9\x61\x98\x01\x97\x1b\x06\xf7\x7c\x0f\x12\xf9\x35\x80\x31\xb5\x11\x00\xf3\x4a\x18\x24\x94\x35\x58\xcd\x06\x48\x90\xca\x30\xa4\x5b\xf1\x7c\x6b\x3c\x5e\x07\x20\x71\x5c\x87\x9c\xb8\xe9\x30\xab\x86\xcc\x2d\x2b\x76\x73\x1d\x5e\xd3\xfc\xe6\xf2\xfd\x4d\x98\x00\x8c\xd9\xc2\xd0\x14\x24\xa4\xb7\x9a\x67\xf7\xd4\x8a\xc7\xc4\x74\x2e\xaf\xe2\x63\x43\x3a\x93\xde\xb7\x1e\xd1\xf9\x74\xa7\xf4\xcb\x50\x9e\xcb\x18\xcf\xac\x5d\x58\x06\x7c\xae\xb6\x91\x61\xe5\x92\x8f\x80\xbd\x3a\x77\xc8\x01\xf2\x0f\xd3\x23\x67\x65\x17\x5a\x70\x28\xca\xa6\x32\x74\x82\xe0\xaa\xca\x82\x49\x58\xe7\x05\x71\xa7\xc0\xb3\x99\xad\x7a\x03\xfa\xd5\x36\x52\x5a\xff\x8c\x07\xe3\x79\x7b\x22\x2a\x6d\x51\x3c\x73\x3f\xc4\xb4\x96\xf8\x4c\xe8\x19\x54\x14\x57\xd7\x0d\x29\x76\xe5\xb6\x78\xf3\xee\xfa\xb4\xdf\x33\xd0\x85\x2d\x77\x23\x81\xef\x11\x2e\x6b\x2a\x25\x04\x7c\xc8\x78\xc6\xf9\x6d\x52\x93\x87\x2e\xd5\x76\x4a\xd5\xac\x1d\x1f\x17\xbc\x0e\xb2\x6e\x87\x92\x4e\xe5\x89\x95\x28\x43\x3d\x71\x47\x88\xb2\xca\x67\x2a\x83\xb7\x90\x29\x69\x23\x08\xc9\x83\x47\x85\x1f\x3d\x6c\x3d\xc8\x4f\xf1\xd0\xec\xd5\xe9\x01\x82\x4d\xd8\xbc\x5b\xd7\x3a\x56\x77\x55\x1a\x0f\xfe\xd2\xce\x7a\x60\xec\x21\x59\xa4\x8d\xe2\xac\x9d\x47\x63\xbc\x6e\x7d\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\x7e\xe8\xba\x84\x4a\x62\x48\x44\x08\xf0\x79\xe1\x07\x73\xee\x21\xbc\x7d\x00\xb5\x04\xed\x9f\x1e\xe4\xe2\x37\x3d\xad\x2a\xbd\x90\xd8\x12\xca\x04\xe8\x4e\x30\x4d\x3c\x87\x8b\xd4\x2b\x6e\xe8\x5b\xb4\xb1\x10\x8e\x22\xbd\xe6\xfe\x21\x55\x8e\x3d\xc7\xd1\xf7\x28\x6e\xda\xc6\xa8\xa6\xf7\xba\x87\x61\x8b\x7d\xbe\x11\x08\xfc\xaf\xff\x3a\xa1\xb4\x12\x02\xf0\x81\xa7\xed\x1a\xe8\x15\x0a\x1b\x71\xc9\xd1\x4a\x5f\x5b\xfa\x8b\x4b\xa2\xb4\xa1\x66\xe6\x2d\x8c\x3e\x68\xc3\x4a\xb4\x19\x0e\x43\x4a\x64\x18\x85\xd1\xe1\xac\x92\x22\xf1\x3c\x40\xa4\xd8\xf6\x49\xeb\x20\x4e\x79\x7b\xaa\xc8\x31\x5a\x93\xbe\xf3\x64\x11\x64\xf4\xe5\x51\xe4\x47\x8c\x55\xa1\x5d\x89\x57\xa5\x52\xad\x04\xb4\x31\x5b\xe3\x59\x09\xa9\x6b\xe8\x2a\x78\x69\xc4\xcb\x15\x46\x1b\x57\x74\x3e\xbe\xc4\x88\xde\x1c\x9d\x09\xc2\xb8\x75\x8f\x04\x75\xdf\xc9\x3d\x29\x5a\x45\x4a\x4b\x6c\x65\x5d\xca\x86\x14\xa7\xdf\x9b\xe8\x1e\xb8\x24\x7d\x5b\x71\x52\x0e\x3a\x36\x70\x6b\xeb\x78\x6a\xae\x01\xfa\x5f\x90\x92\x96\xc7\xb2\x2b\x55\x3f\xf2\x7f\x1e\x3b\x15\x80\xa3\x2e\x30\x73\xb6\x15\x54\x3c\x37\x1e\x6e\x4b\x60\x65\x79\x3c\xc6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x19\x93\x29\x35\x69\x81\xc1\xa5\xe8\x19\xb0\xe2\x18\xdd\xc0\xb0\xa1\x0a\xd5\x74\x3a\x33\xa7\x05\x61\x28\x0d\x89\x1c\x6e\xac\xe2\xb8\x44\x20\x58\xb8\x40\x77\x58\xd4\x5a\x17\xc0\xc5\x0c\x40\x68\x98\xa1\xb2\xd5\xe7\x01\x01\x5f\xd3\x62\x28\x15\x56\xda\xc6\x24\x22\xc1\x07\xe7\xa6\x69\x0b\xc5\x4b\x1e\xbb\x30\xdb\x96\xf9\x74\xf4\x49\xcb\xe2\x05\x39\xbf\x27\xc5\x52\xe9\xef\xba\x06\x8a\x3f\xee\x8e\xb3\x63\x2a\x4b\x56\x06\x77\xc4\x54\xb6\x23\xdc\x15\xdd\xe4\xcc\x4e\x38\x75\xd6\xa7\xf9\xa7\xb6\x47\xfb\x8b\x20\x5d\x10\x2b\xe0\xed\xd5\xff\xd4\x5b\x5d\x9f\x5c\xc3\x11\xc4\x85\xaf\x23\x97\xd4\x2d\xd7\x0f\xa8\x4c\xc5\xb9\x42\x87\x07\x27\x07\x47\x2b\x7b\xe1\x40\x86\x69\x06\x26\x23\xba\x1b\x90\xa4\x75\x53\x2d\x60\x0c\x07\xa6\x18\x55\x42\x91\x57\xfd\x38\xc0\xaa\xaf\xc0\x20\x67\xa4\xaa\x06\x48\x6a\xf5\x17\x3b\xf2\x5b\xf3\xa9\xfe\x91\x12\x6d\x61\xdc\x64\x87\x07\xbf\x1e\x0c\x10\x51\xc5\x11\xba\xe3\xec\x40\x99\x80\x07\xba\x01\x1b\x32\xa9\x4f\xbe\x13\x0b\xde\x42\xbd\x64\xb3\x6c\x9e\x2f\xb9\xc0\xda\xfc\x69\x8d\x8e\x6e\x48\x37\x48\x95\x50\xff\x57\x3f\xe7\xf7\x54\x69\x55\x44\xb5\xe0\xa6\x78\x69\x2c\x05\xa2\xc5\xab\xbe\xf0\xf4\x4d\x77\x32\x23\xb8\x52\xb3\x85\xb7\x5e\x4c\x29\x5a\x89\x5a\x66\xbf\x49\xd7\xa1\x76\x20\x6d\x74\x77\x13\x38\x6d\x45\xec\x9b\x99\x20\x72\xc6\xab\xad\xa7\x71\xba\x32\xa9\x05\x67\x52\xcb\x14\x6d\x62\xdb\x3e\x4a\x9f\x41\x67\x4b\xb5\x72\x4b\x78\xaa\x4f\x99\x20\xa5\x55\x96\x2c\x7b\xe2\x0c\xcf\x41\x53\xd0\xfa\x1c\x29\x53\x4c\x93\xd0\x26\xfa\x63\xce\x42\xae\xdb\xaf\x99\xaa\x9f\xa9\x68\xf2\xdc\xd2\x6f\xae\x46\x67\xbd\x5b\x1a\x3e\xf8\x01\x8e\xf1\xd9\x8c\x14\xb7\x57\x69\x05\x45\x76\x04\x5a\xd0\x70\xb1\x4d\xc5\x40\x37\x9f\x4d\x2b\x18\x71\xa1\x10\xf3\xa5\x91\xf5\xd9\x9a\xc2\x2a\x12\x31\xa7\x05\x39\x76\x65\x93\x5d\x70\xde\x15\xc0\xc1\x6c\x4a\xd0\x2b\x7d\x20\xfe\xf2\xe7\x3f\xff\xf1\xcf\xe9\x32\x3a\x9d\xc9\x3c\xfd\x20\x20\x00\x43\xc1\xc0\x77\x45\xed\xba\x36\xdd\x59\xe7\x6c\xb6\x3d\x05\xa3\xae\xc2\x85\x5f\x9b\xe9\xfa\x43\x97\xe6\x95\x94\x84\xa0\x35\xe1\x0a\x2d\x3a\xcc\xff\x8c\x2b\x3e\x3e\xa9\xb1\x54\x44\x68\x1b\xc7\x5e\xeb\xc3\x42\xf7\x80\xb2\xe9\x71\x5d\x1e\x25\x54\xb8\x43\x81\x59\xbd\xc2\x2d\xde\xa3\x99\x79\x80\x27\x5c\x4f\xca\xd6\x5d\xf0\xc8\xf5\xf2\x5b\xf4\x22\x8e\x98\x5a\x2f\xc1\x1b\x92\x27\x13\xed\x87\x9b\x9b\xd1\x1b\xa2\x42\x81\xcd\xe0\x43\xf4\xe6\xfc\xc6\x57\xbc\xd2\xbb\xcb\x24\x35\xed\xa5\x76\x8a\xd4\x9e\xf1\xb4\x92\x67\xb9\xe3\x2e\x46\x94\x00\xcd\x36\x63\xa4\xd0\x0b\x3d\xe8\x15\x57\x71\x38\xc4\x8b\xd1\x31\xfa\x27\x6f\x41\xe5\xc2\xe3\x6a\x81\xee\xb0\x61\x34\x90\x24\x4d\xa6\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x3f\x10\x5c\x9a\x72\x09\xe0\xda\xd9\xfa\x59\x0d\xfa\x94\x6d\xd9\xce\x5a\xa9\x78\x8d\x66\x76\xa8\x66\x0e\xbb\x9a\x72\x46\x37\x32\x47\x10\x62\x3f\x12\x09\xd2\x18\x6b\xc9\xfe\xcd\x57\x61\x0b\xad\x48\x21\x33\xcf\x41\xe5\x21\x8c\x8a\x70\xaa\xac\xa2\x0f\x2e\x4c\x6a\x65\x54\xb4\x4b\xac\x7b\xb2\x14\xf0\x44\x99\x8a\x78\xa2\xf4\x42\x9e\xee\x25\xe9\x41\xc8\x3c\x25\x41\x51\x96\xb2\xa0\x28\x7b\xb5\x47\x64\x43\x6d\x76\x73\x19\x00\x8e\xee\x68\x2a\x2b\x21\x72\xce\x64\x5f\x8b\x03\x33\xce\x68\x61\xc2\x19\xa8\x6d\x38\x43\xbc\x55\x4d\xab\xc0\x15\x54\x60\x49\x86\x73\x2c\xa8\x16\xa8\xa6\xa6\xb2\x47\x42\x31\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\xf4\x03\x9b\x2d\xf3\x0a\xaf\x2c\x4e\xfa\x8e\x46\x3b\xed\x83\x41\xa6\x8c\xd5\x2c\x9f\x59\x87\xd5\x0c\x90\x7d\x10\xcb\x72\xc0\x50\x10\x9c\xda\x6c\xd8\x81\xc4\x9b\xac\x56\x6c\xa2\x48\x80\x78\x3b\x17\x4b\x76\xb0\xee\xe1\xea\x1c\x66\xc2\x9a\x3c\xbe\x59\x1d\x96\x40\x1e\x13\xad\xdb\x5f\x9c\x5e\x9e\xfe\x7c\xfd\xf1\xec\xe7\xcb\xd3\x77\xe7\x29\xaf\x4e\x2e\x5f\x96\xb3\x80\x59\xb6\x12\x66\x8f\x54\xe0\x51\x3f\xb2\x98\x91\xdd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xa5\x75\xd2\x58\xea\xd0\x92\xd3\x54\x0b\x9e\xad\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xb8\x26\x05\x67\xe5\xd6\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x51\x88\x2c\x31\x66\xb9\x1a\x5e\xb6\x0e\x92\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbd\xc8\x35\xda\x19\xf7\x78\x43\x04\x05\x44\xd0\x2e\xec\x9a\x1f\xf8\x9d\x2d\x0e\x76\x48\x99\xdb\x39\x47\x81\x97\xa6\x0b\x8f\xa4\xb3\xa9\x29\x8e\x5e\xbd\x74\x8d\x7c\x7d\x71\x0f\x8b\xf4\xd9\xe9\xc8\x97\xed\xe3\xe7\x43\x5f\x1d\x6c\xa9\x1f\xfe\x4a\xc1\x0f\xa1\x25\x31\xfe\xea\xd8\xe7\xa9\xbd\x82\xfe\x78\x51\x84\x59\xe9\x20\x67\x5f\xdf\x3e\x51\x45\x73\xcd\x8b\xdb\x4c\x6e\xd7\x9b\xb3\x91\x79\xdb\x12\x9e\xc5\xdc\xc0\x5a\xcb\xe4\x08\xeb\x5f\x81\x02\xba\x77\xba\xee\x8c\xd3\xf5\xc0\xa4\x75\xe1\xea\xdb\x8d\x1d\xa8\x07\x7b\x6b\xab\x7b\x9c\xe2\x23\xfa\x15\x50\xf6\xd6\xd6\x03\xcf\xde\xda\xda\xe0\x71\x95\x68\x29\x67\x6f\x04\x2e\xc8\x68\x97\x94\x37\x27\x40\x50\x69\xeb\xb3\xa3\x4e\x87\xf3\xe2\x82\x11\x52\x1a\xf9\xe1\x8a\xea\xa2\xa9\x1e\x89\x81\x47\x83\x0f\xb1\x03\x16\xb7\x22\x41\xcd\xbb\x99\xd9\x57\x5b\x15\xd7\x05\x99\xd7\xf5\xae\xb3\x4d\x1a\x4f\x86\xee\xaa\x86\xd8\xe3\xa4\x3b\xaf\x6d\x11\x49\x58\xbc\x3b\x1d\x87\x2b\x88\x24\x9d\xea\xe9\x72\xb5\x9c\x0d\x89\x96\x2b\xbd\xd7\x75\x44\xb7\x3a\xe1\xa2\xa0\xe3\x6a\x81\x66\xb8\xd2\xc6\x12\x94\x04\xc6\xe8\x16\x4a\xd9\xc2\x6b\xe2\x27\xea\x9a\xd8\x5c\x4d\xa3\xd1\x54\x9c\x4d\x61\x32\xb0\xcd\xc9\xb8\x6f\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc1\xdb\x0c\x69\x19\x2e\xf0\xed\xf5\x29\x46\x2d\xfd\x88\x29\xdc\xf6\xc9\x3d\xdf\x4f\xae\x45\xef\xd5\x8c\x88\x3b\x2a\xc9\x20\xbe\x74\x2d\x72\x6e\xdf\xa5\x32\x72\xe6\x33\x4f\xa1\x62\x33\x07\xf5\xb6\x80\x54\xd6\xe8\xb6\x3e\xc2\x7b\x9d\x68\x65\x9c\x0d\x19\x99\x1a\xa2\x06\x2b\xd0\x0c\xa2\xd3\xb4\x6f\xf0\x83\x3e\xdb\x40\x2a\xde\xf4\xea\xf6\xce\x29\x8e\xee\x09\x90\x42\x74\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x80\x88\x9e\x2b\x19\x9d\x90\x6f\x75\x63\x61\x0e\x18\x8d\x89\xc2\xd6\x07\xae\x0f\x81\xe7\x44\x07\xba\x73\x7d\xf6\x20\x49\xe0\x66\xed\x06\xf0\x34\xe9\x53\xac\x12\xa4\xc4\x1a\x6d\xde\xac\xe7\xa7\xb7\x1d\x95\x36\x5e\x97\xc8\xc3\xbc\x1b\xcc\x86\xfa\x44\xf3\x56\xed\xc8\x3d\xf2\x90\xeb\xc8\x50\x5c\x04\x46\x22\xad\x89\x44\xbc\xcd\x54\x6f\xe2\x95\x6d\x2e\xa7\x85\xb7\xf7\x3b\xad\x7d\xa4\x2a\x69\x54\xd5\xe1\x1c\x5b\xec\x01\xf2\x7e\x9b\x87\x1b\xf0\x57\x8e\xdb\xc9\x84\x08\xb8\xe9\xa0\xc3\x2b\xb0\x7b\x5f\xc7\xcb\xdd\x61\x71\xce\x5b\x0b\xf8\x22\x6a\x00\xb5\x03\x2c\x99\xc4\x03\x4d\x5a\x92\x4d\x28\xd3\x2b\x88\x04\x2e\x78\x86\xce\xdf\x7f\x1f\xb7\x45\x73\x54\x16\x48\x4b\x59\x85\x71\xbe\x67\x71\x98\xc4\xbc\xfb\x61\x1d\xeb\x8b\xdd\x16\x45\xc5\xa5\x4d\x8f\x86\x75\x29\x66\x98\x31\xe2\x9c\x51\x54\x81\x27\x7b\x4c\x08\x43\xbc\x21\x06\x94\x17\xd5\x19\x8c\x24\x65\xd3\x8a\x20\xac\x14\x2e\x66\xc7\xba\x77\xcc\xed\x85\x2e\x0f\xd9\x7e\x22\x95\x20\xb8\x36\x7b\x42\x90\x1a\x53\xd3\x3c\xc2\x85\xe0\x52\xa2\xba\xad\x14\x6d\xfc\xcb\xe2\xbc\x88\x04\x18\x21\xa4\x49\x4b\x75\x6b\x05\x69\x25\x5d\xc2\xf3\xa0\xeb\xa1\x1d\x3e\x0f\x8b\x15\x81\xeb\x6c\xa0\xbf\x25\x75\xa3\x16\x3e\x31\x31\xce\x06\x9a\x50\x21\x15\x2a\x2a\x4a\x98\xb2\x23\x33\x94\x83\xd0\x87\x81\x53\xa7\x99\x9d\x11\x69\xa7\x84\x95\x60\x7c\x37\x4a\x9a\xfc\x3b\xdf\x09\xf7\xaa\x92\x4a\xeb\xeb\x90\x71\xd9\x7f\xd8\x55\xa6\x31\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x75\xb6\xbb\xdc\xc9\x34\xb9\x02\xe5\x63\xdc\xb9\x1e\xf4\x38\x07\x3a\xdb\x02\x52\x61\x56\xa4\x0e\x6c\x28\x46\xe6\xfa\x1c\x90\x82\x68\x55\x14\x67\x14\x32\x4f\x2e\x63\x02\x5d\xee\x1d\x91\x12\x4f\xc9\x28\x12\x8e\x90\x43\xe0\x74\x8e\x36\xc0\x31\x74\xdb\x66\x46\x0c\xd1\x95\xe2\xc1\x27\x61\x92\x57\x68\x3c\xd6\x66\x20\x51\x3d\x70\x46\xd3\x9d\xa0\x4a\x11\xd8\xa5\x50\xc9\x09\x00\x68\xcb\xe4\x9d\xfd\xe4\xb2\xa8\xf6\xec\xa4\x87\xed\x69\xf5\x83\x95\x26\x4d\x6b\x4c\xd0\x58\x50\x32\x41\x13\x0a\x79\x63\x90\x51\x35\x30\x55\x08\x30\xe0\x76\xb1\x94\x44\xc0\xb0\xad\x5b\xc0\x0d\x3f\xae\x3f\xff\xb0\xe3\x57\xa2\x65\x05\x0e\x4a\x74\x02\xb7\x18\x9d\xa0\x29\x64\x71\x59\x23\xf8\x4f\x2f\xff\xf6\x17\x34\x5e\x68\x7d\x0d\x0c\x31\xc5\x15\xae\x5c\x07\x50\x45\xd8\x54\xaf\x22\x88\xdc\x38\xb9\xd1\xe3\xa7\xf2\x8b\x53\xd1\x9a\x2a\x33\x41\xaf\xfe\x70\x3b\x4e\x3a\x7a\x20\x1f\x4f\x4a\x32\x3f\x09\xb6\xd0\xb0\xe2\xd3\xb8\xb7\x9e\xe5\xc8\x26\x4e\xf2\xb3\xad\x39\xd1\xbc\xa2\xc5\x62\x5b\x67\xda\x15\x2f\x41\x33\x7e\x67\x9c\x39\xab\x47\x35\xa0\x7a\x69\x78\xd3\x56\x30\x71\xe8\x7b\xcf\xcf\xd7\x4a\xb2\x4c\x7d\x94\xea\x24\x0c\xa4\x1d\x04\x51\x6d\xb3\x4b\x77\x8e\x4d\x61\x74\xdd\xe4\x96\x78\xc2\xc6\xdc\x7c\x1d\x92\x68\x6f\xdc\xf7\xb8\xaa\xc6\xb8\xb8\xbd\xe1\x6f\xf9\x54\xbe\x67\xe7\x42\x70\xd1\x1f\x73\x85\xf5\x9d\x3e\x6b\xd9\x2d\x54\xd1\xed\xc8\x68\xf9\xd4\x62\x0a\x1d\x7f\x40\x30\xba\xa8\xce\xb8\x51\x1a\x7a\x50\xa7\x92\x38\x1f\x5c\xd7\x32\xb9\xa7\x9d\xa3\x8d\x21\xa2\xfb\x1c\x9b\x80\x4f\x7a\xe3\x90\xe1\xd1\xfe\xc3\xcb\x3f\xfd\xd5\x08\x17\xc4\x05\xfa\xeb\x4b\x48\x39\x96\x03\x73\x01\xc0\x0d\xac\x55\xad\x1a\x57\x55\x6c\x94\x20\x14\x01\xdf\x47\x17\xa7\xde\x81\x23\xaf\xb6\x76\xba\xbf\xd8\x64\xbc\xb9\xf9\x27\xd8\x8b\x54\x49\x52\x4d\x06\x86\xed\xc5\xbb\xb5\x0e\x40\xbb\x3a\xb0\x57\x5e\x3c\x53\xd0\xf6\x8d\xb6\x39\xaf\xda\x9a\xbc\x26\x73\x5a\xc4\x05\x30\x7b\xab\xd2\x7b\x9b\x73\xd3\x57\x54\x02\x09\xd0\xb8\xe2\xc5\x2d\x2a\xed\x97\x01\x54\x7e\xb9\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x38\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xd7\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\x87\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\x7f\x1b\xbe\x85\x15\x66\x2c\x4f\x39\xe4\x37\x86\xd1\x20\xf5\xf6\x81\x5b\x26\xde\x7d\x99\x21\x18\x9a\x96\x23\xd1\x9b\x17\xe6\x83\xd0\x35\x56\xd6\x3e\x72\x51\x76\x8c\x1a\x22\x24\x95\x5a\x75\xfa\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xdb\x9a\x84\x55\x44\x7d\x8d\x9b\xe1\x2d\x59\x44\x6e\xb8\xc4\xe3\xf2\x10\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc4\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x47\x31\x63\x33\xea\x40\xdb\xbe\x72\x3e\x76\x0b\xd7\xbf\x71\xf4\x27\xfe\xca\x31\xbf\xfa\x9a\x2e\x1a\x18\xdf\x73\xbd\x67\x7c\xe7\x33\x89\xd3\x24\xa4\x13\xdc\x4e\x76\x67\xf4\xaf\xa3\x9e\x43\xcb\x9c\xcc\xc0\xf4\xb5\x8e\xa6\x63\x53\x14\x20\xa1\x03\xfa\x28\xda\x46\xd1\xc1\xb7\x07\x5b\xbd\xe3\xcc\xca\x08\xde\xe0\x29\x58\xa6\xbb\xb0\x40\xcb\x7d\x0a\x39\x68\x67\xfc\xce\x7c\x6f\xd0\x25\x8d\xfd\x15\x29\x3b\x22\xf3\x19\x4f\x5a\x1d\x83\x1c\x74\x3b\xc2\x5a\xd7\x86\xab\xf0\x0e\x2f\x10\x16\xbc\x65\x49\x69\xd0\x10\x18\xf1\x81\xb3\x77\x4b\x83\xbd\xe4\x8c\xb8\x20\x7d\x4a\x2b\x37\x1d\x87\x39\x95\x06\xaf\x40\x19\x7a\x75\xfc\xea\x65\x72\xdf\xaf\x48\xd1\x0a\x49\xe7\xe4\xca\xd6\x38\x0f\x82\x2a\x17\x93\x11\x97\x92\x8e\x2b\x48\xdc\x52\x1c\x9d\x9b\x02\xf0\xab\x03\xf5\xc0\x11\x18\x31\x17\x21\x5b\x69\x42\x0f\x0f\xcd\x09\x0e\x01\x9f\xba\x81\x04\xd4\xc7\x6e\x69\x92\xb0\xae\x4b\x9a\xe4\xa5\xd7\x24\xcd\xbd\xb7\xd5\xb1\xba\xc2\xf7\xbb\x20\x49\xde\xd9\xd8\x40\x57\xd9\x9e\xba\xca\xc9\xf0\xd1\x9d\xa0\xca\x1e\xee\x3b\x2a\x09\x3a\x04\xaf\xc4\xd2\x66\x4c\x22\x68\x0e\x7d\x58\x89\x15\xf0\x73\x10\x2c\x8b\xe5\xa3\xbb\x0b\xab\xb4\x2a\x4f\x3a\x04\xfe\x9d\x75\x60\x75\x2b\x68\xa5\x7f\x77\x2f\xcf\x30\x2b\xab\x24\x99\xe1\x67\xa5\x5a\x24\x71\xe1\x5c\x4c\x50\x28\x12\x6d\xfc\x32\xa8\x26\x31\xc3\x12\x31\x8e\x6a\x82\x01\xa0\xa9\x6f\x17\x27\x05\x7b\x5c\xcd\xf9\xfa\x60\x36\xbb\xb9\xc6\xc2\x0b\xc1\x8a\xeb\xd7\x54\x5a\xf1\xac\xe5\x88\xb5\x40\x0c\xac\xa3\xc6\x65\x4a\x6a\x77\x30\xa7\xdd\xe2\x1d\x77\xa0\xc9\xe5\x9e\x74\x17\xc7\x52\x5f\x1e\xa3\x1f\x03\x5b\x82\x5c\x37\xdf\x02\x4e\x70\x8d\x5b\xae\x03\xc9\x24\x45\xb3\xcd\xb3\x3c\x5c\x7f\x2d\xae\x8c\x75\x7d\x8f\x7d\x87\x13\xfa\xf0\xf9\xa1\x0e\x02\x59\xe8\x30\xa2\x26\xa4\x6e\x6b\xa0\xd8\x8c\xc7\x34\x26\x6f\x17\x94\xf0\xee\x9e\x29\x61\x44\x60\x1b\x57\x70\x10\x51\x4b\xbe\x82\x25\x67\xa9\x07\xe2\x33\x1b\x4e\xcb\xfb\xcf\xab\x29\xe6\xcf\x12\x3a\x02\x7a\xce\x21\x17\x4b\xa7\xdd\x46\x4c\xd6\x69\x2c\x39\x47\xbd\x44\xcd\x65\x36\x7f\xc0\xf9\xa9\x17\xe5\x97\x96\xce\x71\x45\x0c\x87\xbd\x13\x0d\x5b\x55\x26\x64\x3b\xde\x55\xb3\xd1\xda\x87\x60\x76\xac\x07\x3d\x3c\x68\x41\x66\xd2\x27\x5e\xbc\x40\x87\xa6\x8d\x03\x43\xb2\xbb\x5d\x25\xd7\xae\xd5\xf9\x7d\x93\x50\xb9\x35\xdf\x7a\x9d\xdf\x37\x18\x70\x1a\xcd\x4e\x2c\xdc\x7f\x91\x19\x9e\x13\xe0\x34\xa6\x15\x16\x15\x80\xd2\xaf\xcd\x94\xa1\x71\xab\x10\x61\x73\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xfb\xc3\x8f\xa7\x57\x90\xb4\x74\x64\xd9\xf2\xed\xf8\x5a\x09\xfc\x00\x4b\x63\x08\x5e\xb7\x8b\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xfa\xb9\xa8\x5a\x7d\x17\x6e\x6d\x67\xe7\xf7\x81\xa7\x78\xf2\x72\xba\xc0\x2d\xf1\xf7\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\xd0\x90\x47\xd7\x78\x58\x43\x42\xb9\xa2\xe8\x1c\x48\x4f\x4c\x19\xe6\xe1\xd8\xbb\x38\x0e\x9e\x01\xa5\x13\x4c\xf2\xb7\xab\x49\xba\xe2\x61\x84\x1a\x2d\x5b\xf7\xe1\x47\x1c\x86\x7c\xc7\x20\xc2\x11\x9d\x67\xd7\x33\x5e\x92\xcd\xab\x0a\xa5\xed\xf3\x4b\xdb\x66\x90\xf8\x44\x99\xbd\x75\x4c\xe9\x5c\x28\x48\x62\x72\xfc\x64\x31\x23\x65\x1b\xa1\x72\x5d\x4c\x0c\x18\x68\xd0\x7b\x1d\x46\x05\x66\x25\xd5\x7b\xc5\xa4\x02\x98\xd7\xeb\x43\x66\xf5\x7f\xd7\xa0\x08\x6b\x96\xfa\x0f\x2f\x23\x98\xd7\x00\x62\xbd\xa2\x6e\x0f\xc2\xaa\xbd\x96\x30\x01\x54\xd2\x92\xa0\x31\x29\x78\x4d\x00\x3b\xdc\x70\x66\xf4\x71\x47\xa9\xe0\x13\x48\x4c\xe4\xd8\x0c\x6d\xd3\x2e\x05\x8e\x50\x7b\xa1\xbb\x63\x24\x3d\xd7\xbe\x00\xb4\x98\x5e\x6b\x2a\xba\xe6\xf5\x3c\x1a\xd8\x86\x5f\x19\xc4\x19\xc2\x5d\xd1\x4e\x3d\x82\x4d\xfb\xf3\x25\xc9\x34\xdd\x52\x0d\xc9\x9c\x02\xfd\xc0\x09\x96\x92\x4e\xd9\xb0\xe1\xe5\x50\x37\x7b\xf2\x3b\xfd\xbf\x1b\x1f\xa5\x48\x01\xa0\xdb\xba\x26\x15\x48\xe6\xa7\x3e\x3f\xae\x5d\xb3\xa7\xa5\xfb\x97\x39\x44\xce\x3a\x83\xfc\x82\xa5\x85\x9b\x50\x65\xd6\x2b\x66\x99\xae\xd7\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4c\x2a\xf9\xb9\xed\x02\x18\x87\x98\x1e\x6c\x98\x80\xe5\xae\x1d\xbc\x76\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x51\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x61\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xfe\x7a\x05\x24\x23\x03\x20\xc8\xc6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xcd\x2f\x21\x3b\x82\x65\x4f\x0b\x14\xc8\x35\x77\xc0\x84\x57\x15\xbf\x03\xfe\x1b\xd3\x87\xc0\xfd\xb9\x39\x8f\xcb\x50\x2e\x55\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x41\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x46\x67\xf1\x7f\xfc\x41\x12\xb1\xa9\x57\xd1\xfe\xf9\xf2\xf4\xe3\xa6\x39\x15\x35\x17\x23\x53\x04\x3c\xcf\x4b\x25\x79\xab\xf7\x8f\x5b\xd3\x4c\xef\x84\x2a\xf3\x59\xfb\x39\x91\x6f\x04\x6f\x37\x35\xc3\x3e\xfd\xb2\xb3\x19\x66\x2e\x41\x20\xd3\xc8\x17\xb2\x50\x55\xec\x34\xce\xb0\x20\xb6\xb8\xa8\xd6\x0e\x65\x83\x8b\x4c\xb3\xe7\xeb\x7e\x66\x7c\x5d\xc6\xf5\x90\x6d\xd3\x54\xa4\x26\x4c\xe1\x0a\x5e\x9b\x6b\x23\xae\xbc\x37\x65\xb1\xbb\x3b\xe3\xc7\xff\xf8\xe9\x71\x4e\xe7\xa7\x9b\xc8\x71\x56\x3f\xd7\x42\xfa\xc9\xfd\x74\x0b\x05\x6e\xf0\x98\x56\x54\xeb\x2e\x8f\xf1\x7e\x17\x1f\xbf\xe2\x5c\x7d\xef\x71\x7d\x8f\xd1\x52\x23\xe8\x9c\x56\x64\xba\x71\x6c\xf4\xcb\xb6\x93\xbe\x09\x47\xae\x89\x73\x59\xe0\x2a\x26\xb7\xe5\x0b\x47\xc2\x0b\x08\xcc\x3c\xca\x82\xa4\x89\x9e\x2f\x78\xf9\xe6\x82\x28\x5a\x03\x8f\x05\x1a\x46\x78\x65\xe2\x61\x81\x71\x70\x98\x74\x8f\xe3\x43\xe5\xe1\x6d\x9d\x52\x36\x45\xbd\x42\x84\xad\x10\x84\xa9\x6a\x11\x04\x4e\x81\x58\xc3\x68\xce\xa0\xd5\x82\x62\x6d\xb5\xc3\x18\x7f\xdc\xa9\x37\x98\x2c\x67\x47\x8d\x17\x5a\x9d\x0c\xfc\x31\x93\x16\xc8\x62\x40\x83\x37\x25\x63\x01\x2f\x15\xc5\x3c\xb6\xa6\x52\x10\x6f\x08\xeb\xb6\xf0\x89\xf5\x8f\x0e\xf5\xd6\xee\xd5\x0e\x32\xe6\xe5\x71\x5d\xfe\xae\xa9\xb0\x9a\x70\x51\x0f\x9d\x1b\x64\xd8\x33\x3d\x23\xba\x75\x06\x79\xec\x1e\xd3\x61\x78\x9b\x4c\x79\x75\x56\x56\x24\x30\x2b\xfd\x02\xb0\xd2\x04\x2f\x51\xcb\x04\x29\xf8\x94\x01\x93\xbf\xfd\x16\x0c\x26\xef\xf5\xc1\x52\x9b\x74\x88\xb5\x55\xb5\x71\xdf\x22\x8d\x51\x3e\x27\x62\x46\xf0\x86\xa7\x30\x6d\x83\xbf\xb7\x6d\x22\x41\x1a\x41\x24\x4c\xa8\x09\xa1\x4b\xde\x8a\x82\xf8\x4e\x21\x2c\x25\x2f\x80\x95\xd8\x24\x09\x3a\xbe\x30\x0c\xa6\xe2\x84\x0b\x84\xd1\x94\xce\x09\x43\x57\x66\x37\x9c\x55\x78\x73\x9e\xac\xc0\xef\xe6\x5c\xec\xb8\x55\xdc\x27\x90\x22\xac\x10\x2e\x6b\x0a\x2c\x0d\x86\x79\xc0\xba\x25\xc3\x56\x83\x9f\xe8\x5d\x2a\x38\xa4\x13\xa2\x8b\x4d\x13\x4c\xbf\xe8\xbd\x90\x55\xe9\x80\x00\x7e\xba\xc0\xc4\x73\x00\x08\x5f\xfc\x1c\x15\x10\x3b\x77\xe5\x61\x22\xa6\xe7\x4b\x3a\x64\x09\x32\xf4\x35\xb0\xae\x51\xeb\x9c\x9a\xe1\xb9\x81\x4b\x74\x4b\x5c\x69\x35\x63\x53\x35\x52\x9b\xfd\x00\x20\x0a\xfb\x65\x12\x07\x5d\x44\x03\x08\x65\xc1\x35\xd6\x85\x37\x46\xbc\xbc\x6e\x48\x31\xe8\xb6\xa0\x5b\x70\xc7\xb4\xe1\x48\xc0\x36\xec\x4f\x20\x05\x8d\x4b\x44\x18\x2f\x71\xa9\x77\x6b\xd8\xc9\x10\xb7\x42\x55\x8f\x56\x04\x0c\xf3\x4e\x5e\x18\xb0\xc3\xbf\x89\xd8\x38\xb5\x68\x8d\x3b\x6e\x4a\xd5\xf1\xed\x5f\xc1\x17\x47\xd8\x0c\xb3\x02\x34\x79\x79\x72\x4b\x1a\x79\x22\xe9\xd4\xb8\xde\xfe\xf2\xd7\xbf\x82\x1f\xce\x2d\xce\xc9\xd5\xf9\xe9\xeb\x77\xe7\xc7\xf5\x66\x6a\xd9\x56\x9d\x72\x0d\x56\x8a\x08\xf6\x2d\xfa\xef\xc3\x7f\x7d\xf3\xeb\xf0\xe8\xbb\xc3\xc3\x1f\x5f\x0e\xff\xf6\xd3\x37\x87\xff\x3a\x86\xff\xf8\x8f\xa3\xef\x8e\x7e\x75\xff\xf8\xe6\xe8\xe8\xf0\xf0\xc7\xbf\xbf\x7b\x73\x33\x3a\xff\x89\x1e\xfd\xfa\x23\x6b\xeb\x5b\xf3\xaf\x5f\x0f\x7f\x24\xe7\x3f\x7d\xe1\x4b\x8e\x8e\xbe\xfb\xfd\x86\x1d\x8d\x24\xe5\x4c\x25\xe2\x4c\x22\xdf\xcc\x48\xb8\xd9\x08\x42\x6a\xb8\x41\x62\x58\x05\xd2\x2e\xa0\xd1\x52\xdb\x4e\xd3\xb2\xff\xd2\xf7\x8a\xeb\x1e\x9b\xea\xab\x46\x9a\xeb\xa7\xe2\x77\xc0\xec\x42\xb9\x56\x9c\x37\x8f\x38\x81\x1a\x77\x49\xe6\x44\x0c\x5c\x1f\xde\xea\x57\x8e\x22\xdf\x18\x42\x1e\xd6\xbd\x2f\x92\x3a\x2f\x72\x83\xb8\x79\x79\xca\x95\xbc\x01\xa6\x3a\x3b\x5a\x10\xdc\xc7\xe8\x23\x16\x94\xb7\xd2\x6a\xc8\x48\x1b\xe1\x9c\x81\x92\x61\x98\x10\xfc\x65\x0f\x81\x17\x93\x36\xb1\xa9\x90\x71\x4d\x7a\xea\xe1\xd2\xd2\x48\xf9\xa9\x3f\xf5\x97\xe4\xd9\xfa\x5b\x9b\x6e\x6a\x22\x36\x82\xcc\xdd\x30\x84\xe3\x12\x22\xca\xd4\xdc\xf0\xa3\x32\x16\xc1\xda\x2b\xda\x29\x34\x9b\x3a\x0b\x82\x29\x83\x46\xdd\x18\xe1\x42\x8b\x89\xbd\x42\x75\x26\x3a\x75\x8c\x60\xb0\x6e\xc6\xeb\x1e\x7c\x1a\x77\xcc\xe2\x85\x63\x2c\xdd\x5e\xb3\x3c\x1b\x4f\xb9\xff\x2f\x26\x3d\xa8\xa4\x0f\xdd\x77\xd4\xae\x7e\x1a\xd1\x0b\x73\x20\xe0\xaa\x1f\x16\x82\x2a\x5a\xe0\xea\x45\x04\x42\xd6\xbd\xa8\xa8\x5a\x6d\x70\x85\xef\x12\x04\xa9\x3b\x6e\xfa\x84\x2b\x74\x4b\x16\x77\x5c\x94\x4e\xfb\x0b\x01\xb3\x9b\xc6\xa2\xf5\xc6\x90\xca\x0d\x07\x00\xf7\x5a\x24\x9b\x50\x8d\xa8\x89\x40\x63\xe2\xd0\x65\x4b\x3f\x5e\x1c\xa3\x53\xb6\x30\x8a\x57\x84\xfd\xef\x23\x27\x41\x31\x58\xd0\x6e\x8d\x25\xd2\x3b\x0d\x56\xeb\x71\x7d\xc3\x2a\xaa\x2a\xdc\x7a\x68\x90\x36\x79\xbc\xe0\x71\x7a\xab\xc3\x06\x71\x61\x69\x6b\x41\x20\x09\x43\xf2\xbb\x29\x06\xd8\xbe\xec\x49\x6e\x0b\xad\xf5\x53\x46\xa4\x7c\xa3\x37\xec\xf6\xce\x0c\x06\x05\xdc\xf6\x05\x88\x6e\x3b\x7a\x28\xa2\x25\x93\x49\xd9\xd3\x2a\x01\x2f\xbb\x5f\x6e\xba\xa4\xa7\x0e\xeb\x02\xd6\x8e\xa1\xa0\xd6\x4d\x53\x25\xc3\x00\xaa\x09\x74\xea\x5f\x9c\x5e\x6e\x1a\x66\xb3\x1c\x57\x46\x85\x96\xdd\x18\xbb\xf2\xa0\xfd\x51\x82\x2d\x66\x79\x89\xc8\x2f\x2d\xae\x00\x39\x79\x23\x5a\xb2\x69\x65\xe1\x28\x83\x83\xa8\x3b\x2e\x6e\x4f\xfe\xfc\xd7\x97\x60\x73\xf8\xde\x0d\xa7\x1b\x5f\x51\xb1\xf9\xde\x51\x99\xde\x4b\xc5\xcf\xcb\xab\x70\x23\xbb\xb5\x74\x0e\x0d\x8b\x89\x35\x15\x39\xf4\x0e\xf0\x0b\x14\x85\x35\x88\xca\xeb\x8e\xcf\xe8\x1e\x76\xdd\xbd\x59\x34\x9b\x2b\x49\xf1\xc9\xd8\xbd\x76\x93\x41\x9f\x67\xe1\xdb\xcc\xaa\x48\xb3\x24\xbe\x9d\x00\xba\x70\x20\x83\x8f\x81\x22\x07\xa4\x39\x40\x6a\xe0\x86\x59\x34\x09\x74\x40\x59\x10\x8d\x91\x78\x11\xe7\x60\x03\xd6\x8e\x27\x95\xb9\x57\xbd\x96\xed\x4d\xea\xd4\x82\xa5\x2f\x7d\x05\x0c\xcb\xf9\xb4\xa9\x7a\x62\x58\x40\xa1\x48\xa5\xaf\x78\x66\x9d\x3f\x00\xcc\xaa\xb4\x19\x57\x1a\x36\x53\x2c\x94\x51\x98\xdd\xd4\x6c\xaa\x1b\x77\x3c\x30\x25\x41\x78\x8e\x69\x05\x68\x78\x70\x25\x71\xd9\x03\xc7\x98\xc1\x16\x9c\xc9\xb6\x86\x1e\x6d\x1a\x4a\x1b\x2f\xac\x36\x11\xe3\xdf\xa4\x86\xe4\xb1\x6a\x66\x9f\xa6\x83\xdf\x5c\x35\x7b\xbd\x60\xb8\xa6\x85\x5b\xc5\x53\xb3\x6c\x40\x24\xd9\xa3\x8f\x8f\xf7\xca\xea\xee\xd7\x75\xab\xf4\xd4\xc6\x28\x27\xdb\xb8\x19\x22\xc2\x3e\x70\x99\x04\x47\x21\xcc\xa9\x20\xf7\xb8\x50\xd5\x02\x22\x2a\xbd\x1f\x0d\x10\xa1\x90\x77\x6a\xe0\xe8\xd5\xe6\x8c\x27\x5c\xd8\x9d\x65\xf4\xd9\xde\xdb\x6f\x48\xdd\x00\x9b\xa1\x55\xe0\xa5\xa1\xfd\x55\xad\x60\x8e\xc8\x74\xe9\x2f\x36\x6e\x3e\x00\x25\x46\xe4\x91\x5d\x28\x84\xcb\x52\x22\xec\x8b\x29\x51\x65\x14\xef\x96\xd1\x5f\x5a\x52\x2d\x10\x2d\x09\x53\x1d\x70\xad\x3f\xc5\x96\xef\xc9\xca\x87\xcd\xc5\xfa\x59\x77\xbe\x8d\xba\x4f\x48\xe9\x2a\x10\x59\x7f\xf2\x03\x6b\x6a\xdc\xbf\x60\x26\x68\x5d\x3d\xc2\x4c\xd8\x92\x4e\x10\xc1\xce\x92\xa2\x0a\xc4\x32\x12\xe4\x48\xfb\x80\x30\xec\xfa\x8d\x64\x48\xa4\x4d\xbc\xaa\x58\xde\x4a\x11\x00\x48\xf3\x74\x9c\x09\xfa\x02\x44\xaf\x2f\xaf\x7f\x7e\x7b\xfa\x5f\xe7\x6f\x9f\x9c\x09\xb2\xa7\x2a\x6c\xee\xd5\x30\x4f\x8e\x25\xb8\x5a\xee\xc8\x72\x58\x7c\x49\xfe\x38\x0b\xdc\xea\x73\x32\x96\x4a\x88\x39\xd4\x98\x29\x9f\xee\x10\xfd\x51\xef\x3a\x0f\x84\x37\x9f\xac\x19\x92\xbe\x8a\xd7\xca\x5d\x5f\x12\x2c\xaa\x5d\x13\xd7\xda\xee\xde\x09\x47\xb2\x13\x7b\xa8\x37\xb5\x9f\xde\x4b\xee\xa7\x51\x8d\xae\xee\xc3\xac\x7b\x0a\x58\xb2\xfd\xed\x1c\x64\x86\x01\x2d\x90\x09\xbe\x62\xc4\xc8\xdd\xb2\xba\x60\x6e\x72\xfd\x17\xb1\x7b\x6a\xcc\x5b\x56\x9a\xdb\xcd\x0e\xc1\xf8\xbe\xc3\x94\x9e\x92\x54\x44\x39\xcf\x55\x9a\x82\x80\x9c\x9a\x0d\x4c\xaf\xe0\xf3\x82\x77\x1b\xc5\x1d\x0a\x9e\xb9\x33\xe4\x25\xb2\xfe\x64\x80\x70\xc5\xd9\xd4\xd2\x0b\x47\x35\xdb\xa5\xfb\xfb\x28\xc2\x60\x65\xb2\xa1\x66\x2e\xb6\xd7\x84\xe9\x8b\xd5\x69\xd2\x37\x6b\xb8\x5c\xba\x4d\x41\x0a\x2e\x4a\xe3\xd3\xd1\x13\x6f\xdc\x37\xc7\xbd\x13\x77\x0d\x9f\x11\x19\xbd\xb1\xd6\xea\xdd\x30\xbf\x8c\x43\x55\x8e\x69\xe0\x23\x03\xc3\xc7\x68\x3a\x51\xcd\x2d\x85\xca\x7b\xa2\x3c\x20\x7f\x10\xbc\x42\x4d\x85\x19\xb1\xe5\x40\xbc\x03\x36\xcb\x34\xef\xe5\xfa\xe7\x9e\xaf\x20\xab\xd2\x9b\xf8\xdb\x70\x7c\x78\xce\x65\x53\xd9\x00\x1b\x22\x15\x3e\x41\x67\xa3\x0f\xb0\x4d\xde\x91\x9a\x8b\x45\xd7\x49\xaf\xa2\xeb\x53\x80\x37\x16\xd6\xeb\x93\x72\xb4\xb9\x64\x21\x82\xce\x41\xbc\x30\xc7\xce\xa2\x74\x74\x4f\xde\xd2\x9a\x2a\x48\x16\xdb\x34\x2e\x54\x34\x2d\xc4\x93\xd0\x8b\x1a\x46\xf3\xa2\x2f\x90\x25\x32\xcc\x3a\x4b\xfe\x1e\x2c\x88\x09\x77\x38\xec\x62\x8a\xab\xc0\x84\x57\xf5\xbf\x18\x19\x4e\x05\x86\x80\x8d\x13\x20\xdc\x54\x5b\xb1\x5d\xc2\x81\xa3\x22\x4a\x5e\x6b\x6b\x40\xc0\xc4\x0e\x8c\x57\x49\x4f\xa5\x7f\xbd\x9c\x61\x01\x16\x75\xad\x2f\xa1\xfe\x7a\xe0\xa8\x8b\x7f\x53\x3f\x8e\xb6\x68\xdf\x92\x39\xa9\xba\x4d\x68\x3d\x32\x1b\x36\xbc\x79\xf9\xbf\x68\xd3\x34\xde\x52\x2c\x22\x9c\x9a\x28\x8b\x82\x69\xf7\xb1\x16\x4c\x9d\x3a\x29\xf5\xe1\xf6\xa7\x79\xd0\xcb\x5b\x6e\x48\xd1\xbf\xb2\xa3\xaa\x21\x81\xbf\x41\x1f\x9e\x8e\xaa\x3d\xa4\xce\x8f\xba\xd3\x1e\xd9\x55\x88\x1e\xcf\x5d\x88\x3e\xe1\x32\xd4\x62\xaf\xc0\x0c\xc4\x8f\x03\xfb\xe9\x23\xdf\x1d\xca\xcd\xef\xd2\x14\x8e\xe1\x68\x86\xe1\xde\x5e\x7d\xd0\x57\xa8\xd5\x11\xc2\x94\x58\x58\x00\xe8\xb5\xde\x6f\x7d\xa1\x1b\xaf\x3b\x44\x53\x0b\xa7\x11\x0b\x47\x93\x02\xa7\x52\x02\xa7\x10\x62\x66\xab\xd6\xf9\x09\x4e\xf6\xde\x62\x83\x49\xb0\x2a\x5d\x62\xab\xdc\x20\x0b\x47\x1e\xf1\x12\xdd\x01\xaa\xa0\x4f\x98\x60\x0a\x02\x5f\xe8\x6e\xdd\x76\x85\xce\xdc\xf5\xea\x82\x21\xd1\x4d\x5b\x87\x5a\x32\x27\x76\x06\xce\x28\x0b\x63\xde\xf6\x46\xb0\x7a\x5a\xcf\x6d\x51\xcc\xb8\x24\xcc\x82\xe1\x85\xfb\x01\xeb\x07\xa0\x4b\x73\x3d\x26\x55\x90\xb6\xc4\x1d\x64\x4e\xc4\x42\x41\x24\xd4\x13\x19\x5b\x07\xa8\x5c\x0a\x83\x05\x60\xe7\xe8\x86\x41\x66\xdb\xec\x00\x00\xba\x4c\x9c\xf3\x15\x46\xba\x95\x1d\x91\x97\x69\x29\x52\xb4\xe5\x23\x58\x82\x52\x49\x5b\xd1\x9c\xac\xa9\xd1\xb1\xe3\x03\xc7\x24\xbe\x87\xd2\xc0\x9d\x8d\x54\xf0\xba\x69\x55\x10\xa4\x75\x41\xdc\x98\xd5\x4f\x22\xab\xa8\x31\xc3\x53\x32\xf4\x1d\x19\x06\x09\x49\x91\x2a\x44\xe4\x85\x9a\x03\x2b\x8f\x9e\x13\x5e\x1e\xc5\x63\xe6\x51\x06\xdc\x3c\x4a\xc5\xce\xa3\xbc\xf8\x79\xd4\xdd\x4a\x5b\x39\xba\xde\x65\xb0\x74\x78\x6d\x5d\xef\x4f\x1d\x5e\xa7\x09\xc6\x9c\x5e\x20\x0d\xb6\x2d\x53\x89\x78\x4d\x95\xc3\xe7\x05\x7a\x02\xb0\x86\x86\x34\xa5\x56\xd0\x00\x3a\x12\xc3\xfd\x49\xee\x9b\x8a\x16\x54\x05\x1c\xce\x65\x8c\x15\x16\xd0\xd0\x72\x6d\x36\xd1\xda\xa5\xc9\x43\xfd\x47\x67\xf6\x59\x6c\xba\xef\x7b\x61\x38\xd2\xc8\x7d\x41\x88\x73\xb9\xec\xa5\xd9\x5e\x9a\x7d\xe1\xf3\xb5\x49\x33\x5b\x8f\xf9\xe9\x53\x81\xae\x4c\xc3\xa8\xe9\x52\x7f\x56\x6a\xc5\x7a\x3e\xd6\x88\xb0\xbe\x4d\xfa\x39\x85\x6a\xf2\x03\xf4\x9e\x7d\x6f\xaa\x7c\x0e\x4c\x1e\xd0\x31\xba\x60\x48\xf2\xda\x56\x24\xbd\x57\x72\x60\x34\x5e\x8c\x64\x3b\x96\xc4\xea\xbb\x5c\x12\x97\x31\x6c\xd3\xae\x1b\x22\x8c\xe8\x8b\xcc\x19\xd2\xd2\xca\x74\xea\x91\xc9\xbe\xee\xb8\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\xff\x0c\x3d\x59\xde\xc9\xef\xec\xba\x0f\x9b\xcd\xb9\x44\x62\x71\xe7\x41\x32\xe6\x53\x67\x6b\x5c\x2d\xb5\xdd\x83\xa2\xf6\x52\x59\xfb\xc1\x63\xe0\x64\x33\x68\x6a\x34\x15\xbc\x6d\x5c\x58\xb0\xe3\xfd\xd5\xa6\xf8\xa6\xf0\x21\xae\x27\x23\x08\xe2\x9a\xbc\x83\x7e\x47\xbc\x39\x0f\x9e\x07\xd2\xd9\x9d\x60\x51\x4a\x39\x58\xcb\xbe\x2e\x5a\x16\x91\xf3\x60\x12\x60\xb9\xe8\x28\x22\x09\x7a\x51\x91\x29\x2e\x16\x2f\xfa\xbd\x5a\xc3\x84\x6a\xbd\x96\xfa\xfa\xd5\xd7\xba\xe9\x9d\x2b\x2d\xbb\xa9\x63\x1f\xea\xd5\xc2\xd5\x6d\x50\xc0\x06\x50\x26\xed\xf0\x5d\xce\x85\xdd\x4a\x36\xf7\x7f\x63\xe7\x44\x74\x9a\xee\x9f\xff\xfa\xe7\xa1\x63\x3f\x80\x61\x3e\xc5\xb9\xe9\x91\x6d\x6e\x2f\x5d\xa3\xb7\xdb\xc6\x04\x95\x54\x36\xb0\x33\xc1\x03\xde\xe5\x3c\xf8\xee\xe6\xcb\xbd\x59\xdf\xa4\xdb\x0c\x91\x0d\xa6\xad\x06\x65\xd3\x27\x4f\x9f\xb9\xee\x37\x6d\xcf\x1d\x6f\xf0\x2f\x6d\x57\x51\xd6\x5e\x56\x46\xd9\x0e\x16\xd0\x4e\x22\x94\x58\x0d\x58\x5e\x23\x2f\x57\xbd\x35\x56\x7b\x03\x7a\x75\x27\x41\xfc\xd2\x49\x85\x17\x4e\xa2\xf6\x07\x51\x42\x1a\x0c\x71\x35\xb4\x36\xec\x45\xc7\x4d\xeb\x45\xa0\xd6\x42\xeb\x06\x2e\x59\xf7\x6d\x34\xc6\x75\x79\xbe\x97\x03\x19\x58\x99\xc4\x12\x00\x44\x58\x7e\x0a\x53\x47\x05\xf0\x22\x35\x9f\x03\xbb\xa7\xd6\x29\x26\x8a\x88\x3b\x2c\xca\x0d\xef\xfc\xad\xa6\xd7\xf4\x87\x0f\xbb\xad\x23\x05\x81\x8b\x73\x64\xd8\x4c\xa7\x2d\x16\x25\xe4\x53\x75\x7b\x62\x8f\xa8\x5d\xf7\x6c\x1d\x51\x6b\xb3\xa6\x03\x01\xb0\x79\x84\xd9\x3d\xe7\x58\xeb\x41\xfd\x37\x99\x58\x09\xe4\xb7\x2d\xe1\xb2\x20\x43\x7a\x8f\x9b\xd9\xc8\x45\xbc\x44\x14\xf6\xa4\x77\x4d\xbf\x69\x34\xe3\x55\x09\xca\xea\xb0\x22\x73\x52\xf9\xae\x69\x81\x2b\xe8\xb8\x55\x96\x70\xa9\xe0\x75\x6d\x73\xdf\x6d\x19\x79\x93\x27\xbf\xb1\xb1\x63\xf8\x01\x71\xf5\x6d\x8f\x6b\x01\x6e\x97\x63\xdd\x3d\x02\x3b\x23\x1c\x25\x98\x90\x4e\x29\xb0\xd7\x20\x9f\x20\xa2\xb7\x69\xc4\xf6\xdb\x02\x90\x62\x89\x7d\x71\x1b\xce\xc5\xa5\x2e\xb8\x78\xd7\xa9\xfd\x18\x71\x43\xdb\xa8\xd7\xa2\x95\x64\xa5\x48\x54\xc7\xab\x15\x09\xc4\xbf\xe4\x90\xa4\x0e\x25\xbf\x7d\xc0\xb3\xf0\x65\x0d\xf4\xb5\x0b\x19\xbc\x10\x6b\xe5\xf2\x98\x59\x2c\x71\x34\xbf\x5a\x92\xf3\x2c\x25\xb2\x6e\x9c\x40\x1b\xff\x61\x5a\x54\xbd\xe2\x05\xae\x80\x4b\x38\x76\x8b\xa1\x6c\x41\xd5\xe5\xbe\x04\x24\x0a\x58\x0f\x13\x3e\xab\x38\x2e\x1d\x47\x3a\x71\xe5\x10\xb0\x5a\xb2\xbf\x63\x63\x91\x86\xc4\xc4\xb4\xe4\x72\x3f\x1a\x41\x02\x2e\xab\x5e\xc3\x1c\x2a\x90\xc4\x36\xf6\xae\x0f\x23\xb0\x23\x0b\x39\x06\x6d\x57\x92\x1a\x70\x04\x64\x13\x10\xc7\xbe\x9e\xa5\x96\x95\x54\xa2\x17\x6f\xdd\xa4\xbf\x48\xa9\x72\x1d\xed\xb8\x54\x91\x49\xc5\xb9\xf6\x9c\x99\x07\xbf\xcf\x8c\xff\xe2\x96\xea\x99\x9a\x74\x42\xce\x6d\x09\xcf\x49\xd7\x34\x15\x8d\xdf\x65\x1f\x71\x45\x4b\x2f\x39\xb1\x48\x28\xf3\xea\x97\x0f\x0d\x83\x43\xd2\x08\x32\x5c\x3d\x28\xf1\x90\x03\xeb\xf1\x71\x0e\xcb\xe1\x67\xeb\xe3\x24\x6e\x5c\x84\x3e\x30\x38\x73\x8c\x94\x5a\xdb\xe2\xdd\x52\x10\x36\xe1\xc2\x38\x63\x9e\x7c\xc3\x5a\x82\xed\x6d\x5c\xc3\xa7\x9e\xc8\x25\x64\x7f\x36\x2e\x48\x0b\x3f\x84\x3d\x69\x3c\x98\x7d\xb7\x79\x87\x72\xdd\xbc\x5d\x28\x06\x60\x4b\x9b\xe9\x99\xb3\xf1\x7e\xd8\x00\x7f\xb7\xb5\x59\x94\x4b\x45\x30\x74\x82\x77\xba\xd1\x19\x6d\x8c\x10\xc3\xca\xfe\x79\x8c\x70\x80\x1c\x13\xfd\x42\x5f\x7d\xb2\xe1\xe5\xb7\x31\x78\xc4\x57\x26\x45\x85\xdf\x01\x69\xe5\x9b\x8b\xd7\xfe\x2c\xeb\xb7\x7e\x7f\x1d\x43\xfb\xad\x9f\x3f\x98\xf7\x4a\xa2\xa6\xb4\x44\x63\x5b\x1e\x94\x28\x74\xc8\xc8\x1d\xd2\x67\x40\xda\x14\x20\x4f\xfe\x61\x67\xd3\xb5\xef\x87\x67\x3b\x71\x14\xd1\x8b\x3f\xda\x04\x1c\x22\x1c\xd7\xd4\x98\xda\x62\xe7\xef\xaf\x0e\x1c\x63\xe7\xdd\x50\xdc\x0d\x87\xc3\x61\xcc\xfc\x39\x9f\xf0\xa0\xb7\xf2\xde\xcb\x52\xf3\x92\x4e\x16\x4b\xeb\xaf\xef\x9b\xae\x4b\xa0\x7b\x63\xb6\xb0\xe3\x7f\x46\xba\x60\x6c\x64\x2f\xa0\xb1\xfa\xcb\x9f\xe2\x44\x4d\xc8\xe5\xbf\x0d\xb1\xb3\xa6\x1b\x9e\x31\x62\x4c\x66\x78\x4e\xb5\x09\x30\x31\xe7\x5f\x9f\xac\x87\x56\xdf\x69\x34\xd1\xb2\xc0\xb2\x47\x18\x66\x29\x72\xdf\x70\x09\x27\x0a\x60\x89\x23\x0e\x19\x68\x7d\xea\x58\xe3\x67\x6b\x1a\x28\x9a\x18\xd1\x60\x4f\xe8\xd9\x18\x8f\x49\x8b\x70\xb3\x82\xc6\x58\x77\xc2\x0f\xf9\x70\x69\xc3\x47\x55\x3a\xbc\xb0\xa7\x0a\x5c\x26\x8c\x23\x32\x99\x90\x02\x4a\x12\x91\x66\x46\x6a\x22\x70\xd5\xef\x9a\x6c\x8b\x19\xc2\xf2\x5b\x6d\x81\x0b\x7d\x40\x8d\xb2\x5a\xe3\x8d\xcb\x0d\x20\xcb\xd8\x01\x36\x75\x49\xa3\x20\x9e\x46\xb5\x09\x18\xaf\x5f\xbc\x67\x57\x9c\xab\x77\x54\x82\xa6\x6b\x93\x52\x4c\xbc\xf3\xc5\xf1\x1a\x1f\xbf\xfb\xce\xa3\x5a\x9f\x8f\xa0\x88\x52\x2a\x3a\xb2\xf7\x6d\x1c\x70\x7d\x6d\xe8\xdb\xd0\x47\x20\x2d\x84\xb9\xe1\x94\xa9\x95\xb2\x42\x5a\xaf\x2b\x22\x28\xb7\xf4\xf3\x41\x12\xe9\xe3\x74\x4e\x4f\x8c\x63\xc5\x34\xcf\x3b\xbc\xf0\x79\xa8\x96\x62\x79\xc9\x49\x65\xe2\xa8\xf6\xbb\x31\x57\xb3\x15\x2f\x56\x5c\x4d\xea\x11\x2f\x97\x5e\x34\xe8\xd8\x13\xfb\x6c\x5f\xcb\x0d\x2a\x80\x67\x6b\x93\x92\x94\x84\x6d\x5c\x08\x05\x79\x96\x0e\xac\xd2\xb0\xd8\xbf\xa1\xbb\x14\x4e\xd8\x25\x07\x39\xb4\x8d\x33\x76\x11\x70\x41\xc2\x7c\x87\x27\x0a\xbc\x0c\xfa\xe8\x61\x60\x4e\xe1\x6c\x28\x38\x87\x08\x77\xd4\xb2\x5e\x4c\x6c\xf5\xfe\x15\x35\x6d\xae\x25\xb3\x2b\x91\x0e\x25\x45\x11\xee\x02\xe7\x8a\x23\xc2\x64\x2b\xec\x9e\xd8\x98\x11\x55\x3f\x25\x27\x26\xe4\x67\x87\xf3\xe1\xe2\x35\x7a\x89\x0e\xa1\xe8\x2f\x88\xfd\x09\xa6\x95\x27\x7b\x5a\x2e\x72\x0a\xa5\xea\xf5\x2b\x22\x87\xed\x21\x0b\x13\x5c\x49\x32\xd0\x77\x27\x5c\x8d\x76\xdc\x5a\x07\x71\x2a\x77\x43\x04\x10\x55\xc6\x81\x96\xbf\x06\xb1\x13\x7b\x7c\xc7\x9c\x57\x64\x63\x10\x87\x2f\x96\xb2\xad\x1b\xee\xc3\x93\xdc\x70\x61\x5c\x42\x9f\xdf\xfe\x92\x98\x23\x57\x13\x85\x4b\xac\xb0\xbd\xf9\xdc\x0f\x7e\xb3\x1b\x71\x7f\xff\x7d\xd9\x93\x72\xff\xd9\x02\x5b\xdb\xb6\x25\xd7\x74\xc3\xdb\x92\x33\xeb\x52\x0a\x8b\xd1\x5f\x9f\xc3\xef\x4d\xc5\x54\x40\x1b\x18\xaf\xab\xf3\x70\x19\x2b\x48\x06\x39\xb7\x91\xc4\x61\x60\x74\xcd\xb0\xec\x9b\x5b\x8c\x97\xee\xc6\x2e\x79\x98\x15\xef\x3b\xa6\xf7\x21\xf7\xdd\xf0\xb7\xdf\xd2\xcf\xf2\x58\x51\x50\xc8\xca\x84\x40\xad\x09\x75\xa5\x4f\x96\xa4\x73\xf2\x22\x2a\x41\x37\xf8\x7b\x54\x13\xcc\x24\x12\x04\x66\x1a\xac\xf8\x09\xcc\xb0\x71\x5f\x71\x43\x8f\x3b\xe2\xa5\x1f\xeb\x72\x94\xcf\xa9\x11\x31\x63\x35\x3c\x5b\x06\x4a\x2b\x2b\x7e\x07\xe7\xbb\xc2\x62\xea\x9c\x05\x72\x80\xc6\xad\x32\x7e\x47\x89\x6a\x7a\x0f\x95\x00\x7c\x99\x32\x98\x8d\x96\x05\x1f\x8c\x78\x29\x7d\xce\xbf\x67\xfc\xb1\x46\x33\x0f\x49\x80\xc0\x29\x1e\x33\x79\xbd\xe5\x80\xfc\x0a\x70\x8c\x22\x52\xd1\x29\x54\xa3\x0e\x67\x0b\xbc\x6f\xff\x33\xe4\x0e\x58\xfc\x3f\xc8\x66\x64\xc0\xdf\x47\xcf\x99\xcf\x02\xb7\xab\x23\x5d\x20\x0c\x5b\x96\xcd\x70\xd8\x36\x3c\xeb\x3f\xee\x1d\xae\xc8\x23\x63\x01\x5e\x0d\x97\xa6\x02\xb7\xd6\xec\xd6\x36\x6e\x78\x17\x3e\xb7\x64\x31\xbd\x38\x77\xf3\xed\xe6\x1a\x03\x90\x73\xa8\x04\x21\xe8\x7b\x3a\x16\x44\x8b\x1b\x46\x2a\x68\x92\x5e\x9f\x5d\x5f\x74\xbb\x4a\x7f\xa4\xe7\x2e\xf8\x30\xa2\x0b\x77\x00\x09\xd7\xef\x28\x05\x9d\x13\x81\xf4\x1d\xd2\x42\xf6\xb7\x9b\x64\x27\x11\xc6\x0b\x5f\x25\xc0\x16\x76\x84\xef\x61\x33\x19\x9c\xbe\xf5\x11\xd3\x98\x34\x82\xb3\xeb\x8b\xd7\xa6\x07\x94\x49\x85\xb5\x96\x87\xde\x03\x1f\x65\x38\x39\x18\xbc\x2b\x48\x90\x21\x2c\x7d\x45\x4a\x24\x9c\x24\xa8\x36\x2e\x7b\x81\x56\x0e\x83\xd1\x01\x02\x72\x57\xf0\xc3\xc1\x55\x6a\xa7\x03\x7e\xde\x63\x18\x08\x8a\x31\x44\x1d\xc7\x65\x27\x12\xac\xec\x97\xb4\x36\x58\xea\x7c\x82\xcb\x69\xf3\x3e\x94\x54\x7e\xaa\x13\x20\x07\xaf\x08\x2e\xff\x21\xa8\x22\xef\x59\x41\x02\x99\x12\xe9\xd9\x0b\x85\xbe\xcb\xaf\xe0\xe1\x16\x49\xe5\x7a\xc0\x70\x7d\x1a\x76\x99\x40\x26\x81\x33\xb3\x7f\x9f\x43\x2c\xc1\xf2\xa5\x5a\x6e\x84\x25\x55\x91\x8b\x75\x0a\xa4\xbd\x9a\x42\xbe\x88\x98\x70\x5a\x4f\x64\xf6\x24\xa3\x95\x59\x16\x4f\xd0\xfb\x6a\x8d\x06\x13\x16\x91\x92\xb6\x70\xb6\x01\x86\x4e\x89\x42\x52\xb5\xc5\xad\x1e\x85\xe7\x26\x3d\x73\x64\x59\x00\x73\x7d\x46\x8a\x6b\x94\x6f\xb3\x5f\xda\x75\x5b\xd6\x9f\xdb\x78\x85\xb3\x41\x78\x10\xc3\x5f\x8d\x97\xc6\xfb\x1f\xfa\x40\xf5\x15\xed\xc8\x51\xe7\x19\x2e\x6d\x84\x91\xc0\xac\xe4\xf5\x4a\xff\xf4\xc9\x24\xb8\x98\x45\xf4\xa3\x33\x89\x36\xb5\x0f\x63\x42\x32\x0f\x58\x94\x09\xf6\x61\x4c\x90\x78\xc9\xa2\x7c\xde\xf6\x61\x24\xee\x2c\x11\x04\x46\xe6\xa4\xca\x80\xc2\x01\x86\x2b\x3d\x09\x5e\xd4\xc3\x07\x46\xe0\x2f\x83\x14\x7a\x47\x64\x2b\xd8\x23\xc1\xb3\xe0\xdd\xae\xb8\x81\x45\x62\x3f\x6c\xfd\xe2\x9d\x1d\x75\x26\xc4\xd5\x8d\x05\x90\x75\xa3\x06\x28\xd5\xae\x8e\xba\x8d\xf2\x3e\xa2\xe5\x51\x7f\x90\xa6\x74\x58\x37\x6a\x70\xf4\xed\xe2\xa8\xfb\x45\xcf\xb7\x75\xf7\xda\x5e\xec\x61\xc2\xbd\x67\x0f\x13\x7e\x6c\x98\x70\xc0\xf1\x87\xc1\x8f\xd5\x03\xee\x3e\x57\xb0\x30\x30\xd1\xeb\x59\x24\x86\xa3\xb7\xc1\x6a\x36\x00\xc7\x9d\xa2\x73\xc7\xfd\x8b\x6e\x4d\xd8\xef\xa0\x57\x83\xd7\x1d\xc4\x0e\x47\x6d\xa8\xfe\x32\x61\x8b\xd7\xe1\x89\xcd\x6f\x2e\xdf\xdf\x84\x44\x7f\xd8\x95\x7f\x8b\x2e\xde\xb3\x2b\x37\xe0\xe3\x60\x8e\x97\xd7\xe9\xf1\x20\xc7\x91\x6f\x5a\x8f\x38\x7e\x8a\xf3\xf6\x65\x28\xe4\x65\x0c\x72\xa6\xc6\x97\x01\xc9\xab\x6f\x4f\x5a\xa1\x94\x8b\x3e\x00\x04\x03\x8e\x68\x2b\x86\xf6\xa9\x4f\x38\x06\x4c\x72\x2f\x5a\x03\x95\x21\xa9\x80\x32\x90\x10\x5d\x85\x48\x2c\x65\x26\x15\x2b\xa4\x0a\x8a\x31\x43\x1d\x61\xcd\x8a\xca\x65\x4a\x6e\xd6\x58\x2c\x00\xe2\x04\x08\x04\x8b\xdc\x3b\x0c\x33\xa1\x8f\xc0\x0e\x8e\x11\x24\x33\x82\xae\x57\x66\xdf\x95\x2e\xb6\xee\xbe\xd0\xdb\x18\x47\xd3\xba\xba\xc0\xae\x09\xd0\x72\x4a\xa2\x88\xa8\x6d\x11\x2f\xa2\x6c\xd1\x56\x49\xac\x2f\xdc\xcf\x4f\x1c\x00\x9b\x1b\x77\x32\xc1\xa5\xc3\xef\x1a\xcc\x79\x4d\xea\xb1\x81\x3d\xca\xd5\x92\xeb\x1e\xd4\x51\xe3\x69\x94\x8c\x5f\xf6\xa7\x30\x1e\xf0\x12\xf9\x1d\x26\x88\xfe\xd4\x4c\x2c\x6f\xa7\xb3\xd5\xae\xc5\xa0\x58\x3e\x39\x18\x88\x54\x49\xd5\x23\xbd\x28\x49\x63\xef\x63\x23\xf3\xb2\x2f\xf1\x33\x52\x88\x9f\x98\x85\x37\x95\x7a\x29\x25\xac\x9e\xb1\x1a\x20\xfa\xc4\x16\xd8\x86\x30\x7f\x1d\x84\xe5\x57\xf3\x4d\xa4\x43\xcd\x18\x99\xbe\x82\x9d\xb1\x91\xa6\x02\x57\x05\x14\xb9\x8e\xda\xbf\x6b\x42\xe0\x44\x4c\x89\x0d\x7e\x5f\x2b\x41\x0b\xb5\x1e\x3f\x6c\x7f\x97\x10\xcb\x39\x3c\xad\x9a\x19\x3e\x42\x1f\xa4\x8b\x20\x9b\xe3\xe3\x23\xae\x5f\x24\xf8\x21\xce\x63\x7c\xcd\xf6\x02\x88\x8c\xda\xac\x57\x73\xc0\xe2\xf0\x14\x77\x1d\x36\x1d\xbc\x9f\xd4\xf3\xcb\x3f\x23\xd9\x11\xa7\xfd\x2c\x64\xa1\xaa\xad\xa8\x3c\xd7\xa6\x69\x48\x85\x47\xd8\xeb\x3f\xbe\xb4\x50\xe9\x3a\xd7\xc5\xf3\x7c\xf5\x07\x08\x3e\x01\x30\xa0\x65\xbe\xda\x42\xcc\xc5\x61\x5b\x38\x7c\x08\x92\x71\x84\x6a\x3a\x9d\x29\x8f\xbd\xac\x70\xcb\x8a\xd9\x33\xda\x15\xdb\xe4\x75\x37\x2b\xec\x51\x4a\x18\xdd\x6a\x69\x5f\xa1\x06\x0b\x5c\x6b\xb5\xcb\x9e\x6f\x49\xa2\x22\x17\xcf\x92\xc5\x5d\xff\x29\x88\xe5\x88\xbf\xdd\x19\x06\xf8\x4b\x5f\x65\xcc\x76\x69\x01\xe8\x95\xa8\x65\x44\x39\x58\xcd\x61\x46\xb3\x0c\xed\x23\x04\xd9\x76\x65\x6c\x59\x55\x24\x2b\x49\xb6\x1c\x4e\xfe\x87\xe9\x85\xd3\x39\x0a\xcf\x68\xf2\xf8\x21\x65\xe7\xbf\xb1\x44\x98\xb8\x8f\x97\x5c\x8a\xc4\x86\xcc\x7c\x91\x1d\xf8\x0c\x74\x78\xbb\x88\xf4\xf8\x1b\xa9\x8a\xc3\x65\x6e\x31\x42\x3b\xad\x25\x3e\x13\x04\xaa\x9e\xe2\xea\xba\x21\xc5\x36\x1d\x98\x6f\xde\x5d\x9f\xf6\x7b\x03\xf7\xbc\x2d\x4b\x41\xe0\x7b\x84\x4b\x97\xfa\x79\x47\xc6\x33\xce\x6f\x23\x1b\x3b\x0c\x18\x19\x67\xed\xf8\xb8\xe0\x75\xc0\x72\x3a\x94\x74\x2a\x4f\xac\x60\x18\xea\x69\x3a\x42\x94\x55\x70\x5d\x3b\x7d\x88\x30\xe5\x4c\x96\x84\x01\xa3\xc2\x8f\x18\x36\x94\xa5\xde\xb4\x7a\xd7\xea\x94\x5c\x26\xb1\x5c\x25\x5f\x29\xab\x3b\x26\xb6\xec\xe7\xd2\xae\x79\x60\xa4\x4b\xe5\x3b\xfd\x36\x58\x9e\x35\x13\x00\xdc\xca\x94\xd8\x98\x91\x36\x51\xb7\x79\x7a\x7e\xe8\xba\x11\xfa\xee\xe8\x24\x94\xe7\x81\x5f\xd9\x27\x87\x1d\xe8\xbf\x44\xf6\x4f\x0f\xd2\x4b\xb1\x9c\x56\x95\xd1\x13\x46\xbc\x3c\x90\x61\x30\xb6\x23\x6d\xf3\xd8\x37\x03\x8c\xa7\x73\xd2\xeb\x7f\xac\x22\xa8\x9f\x43\xea\x21\xc4\x0e\x2b\xaa\xb8\xa3\x8a\xab\xe9\xbd\xee\x5b\xd8\x56\xd0\x3f\x53\x00\x93\x0d\xd7\x7f\x1d\x95\x77\x8d\x20\x51\xcf\x7b\x19\x07\x7a\x3d\xc2\xd7\xeb\xfd\x2d\x5a\x62\x8a\xae\xeb\x2f\x2e\x89\xba\xe3\xe2\xd6\xcc\x55\x88\xb3\x52\x1c\x7e\x99\xb2\xc5\xe3\xd2\xac\x50\x98\x6a\x95\xe9\xb4\x47\xef\x72\x48\xbb\xb2\xfd\xd0\xf7\xbf\xd3\x9a\x1e\x3f\x0d\x0b\x2d\xa5\x62\xfd\xff\xec\xbd\x7b\x73\x23\xb7\xb5\x20\xfe\xff\x7e\x0a\x94\xb2\x55\x92\x1c\x92\x33\x63\xe7\xb5\xb3\xf9\x25\x25\x4b\x9a\x44\xeb\x19\x8d\xee\x68\x6c\xd7\xfd\xc5\xd9\x1b\xb0\x1b\x24\x71\xd5\x0d\xb4\x01\xb4\x24\xfa\xe6\x7e\xf7\x2d\x9c\x03\xa0\xd1\x14\x45\x91\xdd\x90\x48\x4d\x84\x54\x65\x2c\xb2\x09\x9c\x06\x0e\xce\xfb\x61\x27\x7e\x82\x74\x2c\xb2\x3c\x25\xeb\xae\x88\x34\x7a\x9c\xa4\x2c\xb2\xed\x0c\x41\xd2\xa3\x86\x2e\x53\xd7\x3c\x63\x47\x59\x06\xa1\xf0\x1b\x2d\xdd\x0f\x5d\x4f\x98\x7d\x65\x6a\x58\x7e\xd9\x82\x01\x83\x7c\xf2\xf0\x2d\xa1\x05\xa7\xd0\x89\x93\xb4\x1f\xb4\xf8\xbd\x79\xe1\x77\x3f\x2d\x44\x14\x2d\xbc\xbe\xbb\x31\xe0\x73\x79\x9a\x0a\xc6\x77\x96\x7f\xda\xc2\x92\x77\x5f\xfe\xae\x2c\xb1\x70\x3a\x3e\x9d\x65\xa1\x6e\xfa\x86\x4b\xaf\x57\x3f\xdf\x50\x7d\xd5\xb4\xeb\x60\xc3\x4a\xe6\x4d\x77\x8e\xe8\x73\xb7\x8d\x43\x8a\x30\x6e\xd6\xb6\xa3\xf3\xd1\x19\xcb\x8b\xec\x4e\x1d\xe9\x77\xff\x76\x72\xfe\xc4\xe5\xc0\x3d\x4b\xb4\xbb\xbf\xaf\x41\xc2\x82\x53\xf3\xba\x67\x14\x80\x42\x75\xf4\xa0\x05\x75\x40\x14\x75\xde\x4a\x8a\x0c\xa1\x60\x14\xcd\xa7\xe4\x20\x2a\xee\xbe\x31\x3b\x3f\x13\xa4\x09\xa8\x46\x91\x60\x80\x38\x82\x89\x6e\x3e\x07\x07\x2a\x3f\xfd\xdb\xc9\xb9\x77\xf5\x05\xe8\x51\x91\x74\x98\xe7\x4c\x7e\x07\x3e\x98\xa1\xfd\x84\x36\xaa\xce\x0c\xa9\x8d\xb6\x9f\x77\x01\xd5\x33\xc6\x35\x80\x55\x6c\xca\xb5\x51\x73\x47\xcf\xe5\x24\x02\xd9\x19\x97\xc3\x23\x57\x6c\x4e\xfe\xfa\xdd\xe9\xbf\xff\xc7\xfb\x8f\xc7\x47\xef\xff\xe3\xc3\xd1\xf1\x5f\xcf\xce\x4f\x7f\xfa\xe9\xf2\xdf\x2f\x3f\x9f\x7e\xf8\xe9\xa7\xe3\x5a\x29\x26\xcc\x31\xf6\xe3\xbd\x64\xe6\xa7\x9f\xdc\x1d\xd3\x3f\xfd\xf4\x39\xab\x78\xf5\xd3\x4f\x17\xde\xcc\x09\x7c\xd4\x6e\x55\x87\xb2\xe0\x50\x7a\xac\xc9\x8e\x04\xf9\x0e\x8f\x1f\xde\xb2\x95\x77\xd9\xa3\x83\x06\x64\xfd\x77\x21\x97\x9b\xcb\x5a\x90\xe4\xe6\xe4\xc2\x73\x6f\xec\x7f\x52\x92\x09\x59\x76\x94\x68\x2e\xa6\x50\xed\x0f\x45\xd4\xe0\x78\x20\x63\x66\x6e\x18\xc3\xbc\xcd\x45\xd1\xaa\x7b\x3d\xb8\x1f\xad\xe8\x6b\x5c\x5b\x5a\x2b\xc0\xb4\x5a\xb3\xb8\x30\x25\x97\x08\x78\xcd\xd9\x0d\x88\xe9\x9a\x4f\x05\x2d\x22\xd7\x20\x74\x2a\xc4\x08\xb0\xe6\xf7\x1b\x42\xc2\xa3\x24\x4e\xec\xf9\xec\xdc\x64\xed\x28\x93\x3b\x11\x26\xad\xce\x18\x54\x5b\xd8\x58\x4e\x2e\xce\x4e\xc8\x9b\x4d\x37\x03\x74\x03\x17\x55\x72\xb9\x0c\x21\x82\x21\xca\x8a\x78\xdd\xda\xc4\xdf\x29\x79\xfc\xd4\x88\x5e\x8f\x73\x59\x52\x2e\xb6\xdb\x64\x62\x52\x17\xc5\x9c\xfc\x5c\xd3\x02\xa5\xd7\x0b\x99\xdf\xe5\x34\x7b\x7f\xf4\x1f\xfd\x69\xf4\xc7\x00\xf8\x9f\x46\x7f\xb4\xd4\x27\xdc\x8c\x3f\x8d\xf4\x75\x36\xfa\x63\x56\xd4\xda\x30\x45\xdc\x43\x1b\x97\x3e\x7d\xa0\x33\x45\xa0\x73\xd4\xad\x00\x90\x52\xd0\x73\x9f\x44\xa2\x43\xa3\x02\xc4\x77\xfe\x45\xd1\x8c\x5d\x30\xc5\x41\x35\x90\x22\x7f\xd2\x0e\x15\x1e\x83\x49\xee\x1a\x9d\x41\xd3\x6d\x84\x23\xec\x99\x60\x2c\x47\x4d\xcd\x81\xcd\xc8\xd4\x42\x0d\xe7\x3e\x02\xa5\x6a\x6c\xa5\x81\x4c\x31\x8a\x55\xdf\x48\xce\x0a\x06\x8d\xec\x3a\x75\x1e\x45\x17\x89\x0f\xd9\x15\x52\x0c\x05\x9b\x62\x08\xad\x0b\x25\xc1\x7a\x8a\xc8\x66\x7f\x61\x4a\x46\xe1\x9a\xda\xc8\x8a\xf0\xb2\x64\x39\xa7\x86\x15\x73\x72\xcd\xe9\x86\xeb\x83\x58\x01\x7d\x30\x90\x38\x1e\x08\x49\x24\xf8\x80\x6b\xc1\x9d\xbb\x66\x56\x1b\x92\xcb\x1b\xb1\xb9\x48\xe1\xba\xb2\x86\x44\x5c\xc1\x8b\x41\xab\x59\x0e\x6c\x2e\xa9\x00\x27\x5a\x5e\x82\x6e\x5a\x07\xea\xfa\xad\x49\x9d\x00\xbf\xec\xd0\xa1\xf3\x85\x2f\x6e\xec\x58\x82\xaa\x05\x94\xe5\x6c\x7a\x7b\x41\xc4\x87\x66\x62\x53\x3b\x3b\x8d\x51\xdf\x6f\xaf\x67\x0e\x98\x83\x87\x4c\x8c\x2d\x04\xab\x4c\xa4\xca\xf8\xb8\x98\x93\x19\x2d\x0c\x73\x15\x33\x69\x7c\x4a\x9b\x6e\xca\x25\x33\xf1\x41\x14\x52\x4c\x63\x59\x97\xdd\x56\x2c\x33\xd0\xbb\x89\x51\x51\x57\x08\x9d\x15\xe3\xe6\xb2\xee\x6c\xff\x88\xed\x1e\xdf\xbc\xf6\x9b\xde\x85\xe6\x74\x89\xa9\xea\x1a\x4d\x65\x64\xc1\x10\x53\xfa\x10\xa7\xa5\xdd\x89\xf6\x75\x3c\xfb\x73\x69\xb6\xd2\xc1\xea\xf6\xd9\x5d\x1c\x40\xb9\xcf\xe1\x95\xc1\x8e\x61\x0c\x85\x1e\x49\x96\xc4\xe2\x37\xd0\x9c\x61\x4e\xac\x54\x64\xd0\x83\xe6\x9a\x8a\x6d\xee\x14\xb3\x17\x4b\xf1\xaa\x60\xe4\x8f\x57\x6c\x3e\x00\x6c\x1f\xa0\x38\xff\x27\x52\x87\x08\x2a\x98\x1f\x62\x24\x2b\x0b\x80\x54\xe4\x8f\xfe\xbf\xfe\xf4\x84\xbd\x61\xfa\xb8\xe1\xf0\xa5\xb6\xd5\xae\xe5\x14\x2b\xd3\xf0\xa8\x98\x1c\x73\x07\xe8\x8a\xd6\x18\x89\xbb\x3c\x22\xa7\xd0\x35\x0d\x15\x48\x2c\x30\x6f\x35\x81\xf8\xe1\x8e\x96\xd5\x1f\xbd\x3b\xd5\xdd\x32\x6f\xb8\x8f\xe2\xf4\xce\xa5\xeb\x13\xc4\x06\xe4\x02\xba\xea\x35\x9f\x00\x29\x3e\x97\xa7\xb7\x2c\xab\xbb\x65\xbf\xf7\x72\x01\x5d\xb1\x0e\xd1\x94\x69\x4e\xef\x3b\x36\xf7\x5c\x11\x8f\xc1\xea\xe7\xa1\x1c\x60\x43\xa2\xa2\xfc\xc1\xd5\xc7\x78\xc5\x36\xef\x17\x89\xe3\xcc\xdb\x35\x00\x22\xd7\x9e\x2b\xdc\x4a\x2f\x15\x9d\xde\x72\x6d\xf4\xff\x46\x7a\x92\xc9\x72\xec\x99\x2a\x82\xe3\x71\x0d\x2b\x31\xb9\xd3\x77\xf5\x54\xba\x82\xd6\xeb\x6c\xfd\x0b\x6c\xeb\x80\x3f\xfa\x0d\x54\xac\x52\x4c\x83\xcf\x99\xda\xad\xd8\xd7\x2e\x41\x4b\x0a\xa8\x8b\xec\x3c\x12\xd8\x85\xb8\xd3\x52\x3e\x97\x07\x17\xc4\x5b\x87\xc7\x05\x47\x70\x6a\x35\xa5\x51\x4b\x14\xc0\x8f\xba\x91\x1d\x9c\xd8\x62\xca\xcf\x35\xbf\xa6\x05\x43\xf3\xeb\x0d\x2f\xf2\x8c\x2a\x0c\x6b\x44\xa2\x4f\xb4\x74\x39\xb0\xd8\x06\xad\x93\x03\x2b\x48\x03\xac\x41\x76\xed\xc2\x99\xa8\x32\x3c\xab\x0b\xaa\x88\xa5\x80\x53\xa9\x3a\xd5\xab\xe9\x85\x66\xcd\x4d\xed\xa4\x4d\xe1\x48\x81\x6f\x9f\x17\x01\x89\x11\xcf\xcc\x82\x28\x2e\x27\x28\x59\x2e\x90\x99\x03\xcc\x3a\x73\xb7\xbd\x13\x04\x72\xe2\x19\x4f\xa0\xe8\x71\x35\x94\x28\x24\x87\x6b\xc2\xa7\x42\x2a\x96\x1f\x46\x02\x48\xa0\x85\x23\xf2\x6d\x68\xde\xd8\xa5\xef\xb7\x95\xb8\xbc\x27\x19\xca\xca\xb8\x77\x73\x84\xca\x61\x53\x43\x7a\x27\x52\xb1\x6b\xa6\xc8\x81\xab\xeb\xc6\xae\x79\x66\x0e\x47\xe4\xff\xb7\x8a\x5e\x57\xe7\x5b\xd0\x20\x1d\x31\x0c\xed\x05\x5c\xf1\x7f\xaa\xc9\x6b\x72\x00\x4b\xc5\xda\xe3\xa1\x0f\x20\xd1\x73\x6d\x58\xd9\x1d\x9f\xb7\x95\x03\xd1\x39\x70\x31\xc5\x25\xf8\xc1\xeb\xb8\xcd\xe1\xa2\xb6\xb5\x80\xed\xa1\x63\xae\xec\xc5\x32\x03\x93\xe4\xda\xd1\xc5\x96\x7b\x35\x44\x6c\x78\x9e\x1a\xee\xc2\x7f\x42\x8c\x00\x51\x6c\x0a\xd4\x0b\x69\xcf\x96\x9b\xdf\x75\x8c\xc3\x34\xb2\x92\x85\x9c\xce\x2f\x2b\xc5\x68\x7e\x2c\x85\x36\x0a\x68\xf4\x53\x9a\x95\x3e\xdf\x07\x84\x9b\x77\xec\x72\x57\xa8\xcb\x08\x93\x13\xac\xcb\x24\xeb\xe9\x0c\x5b\x81\xc2\x0f\x09\xcd\x94\xd4\x3a\xbc\xd3\xa6\x2a\x1b\xd8\xf6\xf4\xc8\xf7\x05\xf5\xf6\xe5\xd0\x67\x14\xd6\x04\x6b\xfb\x0d\x9d\x3b\xaa\x44\xc7\x3c\x6f\x55\x50\xf4\xa0\x6f\x8a\x0e\x47\x96\x3b\xde\xbb\x0f\x56\x26\x38\x3a\x3f\xd9\x34\x94\x61\x7b\x2a\xef\x7d\x47\x1a\xb4\x0d\x57\x24\x34\x9c\x5d\x50\x28\x61\x97\xb1\xc4\xa0\xdd\xd2\x29\xbf\x66\x22\xec\xcc\x33\x69\x3b\x5a\xd2\xdb\xcb\x2b\x76\xd3\xe1\x97\xfe\x45\xbf\x63\x9b\x27\x49\x0c\xc1\x1a\xf6\xbd\xd0\xd4\x70\x3d\xe1\x74\x5c\x3c\x65\xef\x53\x28\x9a\x72\xc9\x0a\x96\x6d\x51\x6c\x7f\x1f\x03\x11\x4a\xef\x19\x49\x26\x5c\x2c\xe0\x58\x37\xd6\xd1\x54\x99\xf3\x9d\xde\xb8\x0e\x25\xf0\xdc\xb2\x90\x2d\x27\x6b\xe1\xfa\xe8\x86\xa0\x40\x8c\x82\xa8\xcb\x31\x53\x9e\x84\x75\x13\x8f\x5c\x51\x49\x92\x49\xa5\x98\xae\x24\x66\xab\x7a\xd4\x71\x84\xac\x3b\x3f\xea\x9c\xc2\xd2\x37\x1f\x04\xb6\xf4\xf4\xd6\xca\xbd\xba\x5b\x4a\x00\x8e\x16\x26\x2d\x4e\x8a\xa1\x40\x3e\xbb\x6b\xe1\xe8\xdc\xa5\x87\xde\xf0\xe8\x34\x88\x3f\xe9\x4a\x86\x9b\xd1\x27\x07\x0a\x47\xe7\x4c\x28\x1c\x69\xa2\x01\x09\x56\x08\xb8\x77\xef\x70\x8f\xc3\x37\x71\xf9\x36\x67\x40\xd7\x03\x54\xa7\x5d\xd9\x56\xd1\x08\x63\xf6\xe1\x1e\x60\x81\x72\xee\xd4\x91\x2b\x36\x87\xe9\x71\xc5\xee\xdd\xeb\x7a\x5e\x0b\x0f\x58\x9f\xfc\x2e\x1c\x43\xfb\x4a\xbd\x7e\xef\xb7\xb9\xf3\x24\x7d\xef\x38\x8e\x8e\xa6\xbb\x66\xb4\xf0\xf8\xaa\xb1\xc6\x21\x4e\xb6\xac\x71\x0d\x5d\x6e\x6c\x71\xbd\xd6\xee\x9d\x1d\x86\xa3\x8f\x89\xab\x19\xe9\x2e\x74\x0c\xd3\x3a\x66\x2f\x0a\x41\x23\x72\xd2\xfb\x7a\xe1\x58\x66\x06\x3b\x13\x03\x72\x2e\x8d\xfd\x27\xb2\x88\x9d\x48\xa6\xcf\xa5\x81\x4f\x76\xe2\x24\x71\x03\x76\xe9\x1c\x9d\xd5\xc2\x92\x61\x81\xec\xc6\x45\xb7\x59\x41\xc1\x9d\xd7\x32\x35\xf8\x4c\x10\xa9\xdc\x96\xf7\x04\x21\x68\xd2\xda\x01\x10\x3b\xe8\x5d\x9f\xef\x7b\x15\x71\x0b\x45\x7c\xcc\x8f\x06\x8c\x03\x04\x6a\x1e\xe3\x37\x50\x8a\xbd\x2a\x20\xe1\x3b\xaf\x61\xc3\xa8\xdd\x39\x6a\xd8\x74\xe3\x14\xc7\xc5\x51\x32\x35\x65\xa4\x02\xb7\x4e\x02\xcc\xed\x23\x48\xe0\xe8\x29\x4e\xc4\xc0\xf4\xbe\x46\x89\xd3\x4b\x1f\x71\x52\x90\x29\x41\xd7\x48\x23\xa3\xf6\xb8\xef\x11\x28\x28\x75\x95\x14\x0c\x24\xff\x15\xbc\xb7\xff\x4d\x2a\xca\x95\x1e\x91\x23\x1f\x61\x18\x7f\xe7\x82\x34\xa2\x69\x7a\x80\x52\xdd\x75\x2c\x50\x41\x98\xab\x69\x21\x27\x77\x84\xf1\x81\xab\xb7\x6f\x19\x76\x30\x2e\xef\x5d\xb1\xf9\x5e\xd7\xea\x4a\x38\x62\x8a\xb2\x77\x26\xf6\x9a\x90\xc2\x16\x15\x08\x32\x29\x14\x38\xdf\x83\xef\xf6\x1e\x4f\xee\xef\x25\x41\x36\x05\x93\x2e\x12\x88\x60\x3d\xaf\x6c\xeb\x4e\x95\xb4\xea\x77\xa5\x1a\xe4\xfb\x8e\xcd\xb7\xe6\x82\xf9\xd0\x82\xc2\xab\x30\xc6\xa9\xea\x8d\x64\xa9\x31\xff\xbe\x00\x1f\xfd\xcc\x99\x05\xe5\x35\x53\x68\x12\xec\xb4\x36\x1a\xc1\x2c\xaf\x09\xa1\xf6\x4d\xb9\x1d\xc0\x47\x58\xd8\xe2\xa1\xb7\x68\x14\x52\x5e\xd5\x95\xc7\x67\x08\xc3\xed\x7a\x63\xb8\xc8\x64\xe9\xec\x22\xf8\x9e\x60\x09\x77\x17\x73\xe8\x22\x9e\x90\xc6\x84\xab\x80\x31\x55\x2d\xab\x4f\x47\xff\x60\xbc\x99\xc1\xc0\xcb\x2c\xdb\x0f\xf6\xc0\x66\x7b\x57\x6e\x55\x27\x00\x7c\xac\x7d\xbc\x0b\xae\x0d\x34\x2d\x83\x63\x7d\x22\xd5\x98\xe7\x39\xd8\x22\x11\xb8\x90\xf0\xb5\x80\x38\x96\xd2\xb4\xec\x50\xdd\x88\xc6\xc2\xac\x4b\xf2\xe0\x17\x8d\x5d\x62\xdf\x74\x09\x4b\xc6\x01\x8b\xb8\xf6\x48\x76\xa2\xf0\x8a\x8b\x5b\xe3\x11\xc1\xee\x7e\xa7\x95\xc6\xcc\xbb\x0f\x2d\x4b\x12\x75\x51\x58\x69\x0f\x04\x31\x34\xcb\xa0\xa7\x0f\x48\xb2\x0b\x4a\x98\x5a\x22\x6d\xda\xc8\xd6\xa9\x51\x84\xeb\x6e\x01\x77\x7b\xcc\x0c\xf5\x7d\x2e\xc4\x42\x35\xa8\xf6\xe6\x9f\x89\x0b\x99\xb7\x2d\xda\x2b\xca\x42\x91\x03\xff\x1f\xe3\x79\xe7\xa4\x17\xd2\x5b\xc6\xeb\x21\xd9\xa5\x64\x0e\xfd\x05\x2e\x67\x4c\xdf\x1e\x5b\x80\xe5\x23\x57\x14\x06\xdf\x4e\x15\xc3\x2a\xc0\x40\x95\x80\x4a\xb9\xb6\x57\xb5\x60\xd7\xcc\x62\x6f\xce\xed\x1e\x8e\xeb\x8e\x35\xd3\x5c\x7c\xd6\x3f\xee\x58\xf5\xff\xbf\x13\x79\x2e\x8d\x77\x53\xfd\x63\xe0\x1c\xe6\x28\xc7\xdd\xf2\xb2\x2e\xb1\x6f\xb5\x31\x56\x87\xe1\x93\x09\x53\x1d\x9b\xf3\x91\x90\x7b\xd2\xb6\x5d\xb7\xbd\x35\x8e\x4a\x18\xaa\xa6\x90\x30\xed\xec\xd0\x5e\xe4\x9a\x16\x72\x4c\x0b\x52\x72\x61\x41\xeb\xb6\x13\x9f\xef\xcc\x13\xde\xd8\xfd\xb9\x02\x38\x90\x41\x5d\x67\x29\x34\x8e\x77\x8b\x90\x50\x2e\x78\x7c\xb2\xb0\x1b\x0b\x93\x03\x7d\x29\x98\xd6\x18\x1e\xfc\x81\x8b\x13\xe7\x5a\xec\xb4\xec\x3b\x4b\x1d\x6f\x69\x59\x15\x6c\x80\xee\xc7\x6f\x86\xbf\x48\xc1\x88\x4b\x7b\x18\x04\x14\x75\x79\x3c\x46\x92\x37\x28\xf0\x56\xa1\x2c\x99\xcf\xaf\xe9\x04\x41\x8b\xee\x06\x67\xab\x26\x5f\xbf\xfa\xfa\xd5\x9b\x6e\x24\xe6\xcc\xa5\x1e\x65\x54\xbb\xee\xb6\x77\x4f\x77\xe3\x24\x1e\x1c\xff\x24\x76\x77\xde\xb8\x7f\xbf\x76\xff\x7e\x43\xfe\xd9\x71\x36\x72\x41\x2e\x5a\xff\xda\x7f\x3a\xce\x36\xb4\xc8\x13\x1d\xd7\x9b\x41\x9b\xb7\x66\x54\x20\xe3\xb3\x7c\xde\xdd\x6f\x90\xf6\xf0\x15\x80\xcf\x64\xb2\x64\xb0\xf5\x5f\xff\xef\x6e\xb2\x26\xce\x0b\x11\xfa\x86\x48\xe1\x66\x7f\x73\x00\xdb\x75\x48\x6e\x20\xee\xa1\xa4\x57\xe8\xb0\x3a\xca\x4c\x4d\x0b\x0b\xf0\xc1\x37\xc3\x37\x87\x44\x8a\xd6\xe3\x9d\x40\xb8\xe6\xd2\xca\x6b\x7e\x27\x0e\xde\x74\xac\xf1\xb0\xb8\x9d\x5f\x2f\xd9\xce\xd6\x4e\xc2\xdb\x52\x31\x87\x57\x48\x4b\x93\x3d\x39\x3e\x12\xf3\x1b\x3a\x0f\x44\xd9\x8b\xeb\x53\x7e\xcd\xc8\x8c\x4f\x67\x50\x0d\xa1\x47\xbf\x54\x82\x71\xdf\x40\x63\xb9\x6f\x69\x89\x80\xcc\x09\xef\x28\xfd\x9d\x99\x7d\x0d\x11\x2d\xe8\xa3\x70\x85\x6e\x42\x9e\x5a\x48\x3e\x79\x03\x64\xe5\xf5\x42\xa1\x8f\x2d\x87\x39\x7d\xf3\xf5\xe6\x32\x45\xa0\xc9\x5b\x13\x2b\x02\x04\xad\x86\x07\x77\xb9\xd9\x22\x73\xe9\x81\xb5\x0f\x70\x2d\x60\x14\x81\x79\x06\x36\x7e\xe5\xb4\xe1\x86\xa3\x35\xbb\xd7\xcd\x2e\x7b\x21\xf3\x10\x20\x42\x9c\x3c\x0d\x81\x75\x9a\xec\xb5\xd9\xc0\x1e\x04\xda\x05\xeb\x8d\xab\xe1\xec\xf4\x3d\x2e\x85\x7d\x0f\x7f\xf9\x7b\xb5\x01\x27\xe4\x48\xe4\x4d\x36\x51\xc7\x5d\x62\x3f\xd7\xb4\x00\xe3\xf5\x14\xe2\x04\x55\x9a\xfd\x8a\xf2\x8e\xee\xf4\xb5\x6d\xa8\x79\xc7\xd7\xc6\x7b\xaf\xeb\x02\x22\x2d\x1f\x7e\xff\xa4\x98\xa0\x9b\x50\x2b\xd0\x3a\x43\xac\x55\x29\xb1\x77\xbd\xf0\xe2\xbf\x8b\xbc\x90\xce\x2e\xd1\xeb\x32\x9c\x4d\x96\xa4\xd3\x35\xb1\x5b\x64\xcc\x66\xf4\xda\x5e\x47\x28\xe3\x14\xdf\x54\x77\xc4\x20\x62\xf5\x89\xf6\x8e\x12\x2c\x1c\x09\xd4\x6d\x94\x79\xdd\xe3\x9a\x37\xef\x26\x0d\xbe\xdf\x8f\x8b\xdc\x2a\xf8\x3f\x5a\x9a\x44\x47\x95\xba\x8b\x80\xfa\xf5\x60\x61\x5f\xdd\xe7\xbf\x7d\x2a\xb9\xf5\xeb\x6e\x72\xeb\xa3\x0b\x97\xf8\x6f\x67\x1d\xa9\xb9\xb8\x4b\xef\xeb\x6f\x0f\x9a\x5d\x3f\x84\x08\xff\x3b\x04\x17\x2a\x63\x35\x41\xce\x1d\x6f\x98\x13\xef\x35\x37\x35\xc5\x02\x5c\x82\xdd\xb8\x94\xea\xe8\x58\x17\x8e\x28\x32\x72\x79\x91\xad\x1b\x5d\x19\xb3\x8c\xd6\xda\x5e\xea\xb2\xb2\xea\x37\xd1\x16\xfd\xbc\xc1\xf0\x9b\x83\x6f\xc8\x90\xbc\x3e\xb4\xb7\x5b\x20\x69\x01\x14\x8c\x05\x6e\x68\x6c\x83\x8a\x9e\x99\x59\x55\xdf\x9e\x73\x47\x2a\xc7\x5d\xf5\xce\x05\xb1\xf7\xf9\x89\x4d\x42\xe6\xec\x68\x32\xe1\x82\x9b\x79\xd7\x72\xf6\x69\xc4\xa7\xf3\x3b\x90\x44\x62\xd4\x4c\xde\x90\x1b\x57\x4b\x00\x70\xd9\x95\xc4\x8b\xc1\x7f\x65\xff\xe8\x65\xb8\x06\x66\x19\x64\x11\xa7\x71\x04\x79\xc0\x51\x1b\x8b\x77\x23\x97\x37\xef\x1a\xf5\x74\x59\x6b\x48\xfe\x2a\x85\x54\x6f\x51\x39\xc4\x5e\xf6\x41\x06\xb9\xf7\xb5\x1c\x7f\xc9\x8a\x3a\x8f\x3a\x60\x34\xd2\x53\x47\xf6\x39\x24\x67\x60\xbf\x7d\xfb\xd0\xca\xc1\xca\x0b\x45\x14\xf2\xc0\xf0\x56\x01\xd4\x3d\xa0\x7f\x69\x92\x3c\xb0\x72\x8e\x8e\xc0\xb6\x63\xd2\x7e\x0b\x9b\x4a\x2a\xc0\x9f\x27\xcf\x3d\xb2\x3b\xf2\x19\xc2\xbb\xb7\x7f\x95\x62\x38\x56\x5e\x24\xec\x7d\x86\x41\xe9\x8b\x17\xa0\xd3\xea\x4f\x71\x69\x10\xf7\x2c\xe3\x91\xb5\x71\xd0\x0f\x08\x2d\x24\x38\x91\x2c\x3b\xb2\x1f\xb1\xdc\x3d\x38\x91\xde\xd7\xb4\xe8\xfb\xe8\x04\xc6\x0c\xaa\x7d\x36\xe9\x2b\x83\xd6\x2d\x48\x71\x05\xfd\x81\xac\x71\xe9\x9e\xf8\x82\x21\x94\xdb\xba\x61\x51\x30\xfd\xf6\xf2\xfa\x02\x08\xde\x60\x7d\xc5\x40\xb2\x80\x83\x43\x5f\xda\x08\xee\x60\xdc\x5c\x9d\x3a\x77\xb3\x13\x96\xb8\xee\x1c\xf8\x69\xc5\x69\x0e\x25\x7b\x33\x5a\xc4\x7a\x87\xd5\x77\x78\xce\x14\x8a\x3b\x63\xd6\xaa\xc2\xd4\x35\xdf\x02\xc7\x8f\xcd\xec\x58\xb1\x09\x4a\x09\xe0\xe2\x7f\xc2\xe2\xb7\x7b\xe3\x3a\xbb\x62\xc6\x07\x66\x28\xa8\x92\x52\xd5\x86\x8c\x69\x41\x45\x66\xef\x22\x48\xb2\xdd\x0c\xf5\x13\x6f\xfa\x37\x12\x01\xc0\xd5\x3a\xbf\x0d\x76\x8c\x08\xf5\x7f\xf0\x15\xa2\xfc\x55\x2e\xb4\xb1\x50\x63\x62\x6b\xbf\xcd\x3b\x2a\xb4\x1c\x58\xaa\xeb\x17\xbd\xe3\xbc\xc0\xe5\xdd\x7f\x63\xfc\x8c\x93\x08\x18\x33\xae\x6c\x5c\x14\xbc\x22\xbb\xf4\x42\x5b\x26\xeb\xb9\x3a\xbd\x6d\x6e\xd1\xed\x25\xd9\x68\x0a\xd1\x7f\x0b\xd7\x63\xaf\x5d\xaf\xd1\x97\x80\xda\x1b\xe0\x29\xda\x5b\xe2\x2a\x79\xe2\xcb\x83\x80\x4e\x4d\xdf\x1d\x17\x39\xd4\x07\x5e\x04\x26\xcc\xda\x86\xca\x2a\x02\x1e\x22\x50\x73\xd3\x43\xb4\xdc\x1c\xfb\xd4\xe4\xf3\x8e\x8d\x7b\x5b\x44\xf4\xae\xf9\xa2\x2d\xa2\x40\x92\x0d\x2d\x7c\x95\x1f\x2b\x52\xf0\x89\xd5\xba\x72\xc9\x30\x2a\x02\xcd\xe3\x1d\x8d\x6f\xcc\xcb\x25\x8d\x89\xa8\x2b\xd7\x6e\x99\x5b\xc8\x81\x8f\x0e\x20\x86\x15\x05\x72\x87\xc6\x22\x66\x35\x61\x23\x1b\x93\x58\x57\xdb\xfe\x90\xb4\x5d\x13\x4b\x17\x8b\x17\xf2\x45\x9b\xc0\x73\x3a\x0f\xad\x65\xbb\xc6\xe0\x8e\x6b\x43\xa6\xfc\xda\x8a\x50\x77\xfc\x1f\xcb\x7c\x19\xe8\x7f\x9a\xb1\xa2\x22\x8a\xe5\x75\xc6\x7a\x44\x02\xea\x8e\x6a\x36\x21\x47\xb1\x41\x10\x6a\x66\x04\x76\xb9\xd7\xc2\xc5\x3d\xd7\x07\xb7\xbf\xa0\xc8\x27\x40\x61\x41\xc5\xe3\x13\xc2\xae\x99\x9a\x93\x4a\x6a\x0d\xb4\x1f\xe4\x05\x2c\x72\x08\xd1\x94\x13\x9f\x58\x03\x46\x15\xd8\x33\x67\x5f\xe8\xb4\xf8\x9e\x33\x4a\xec\x81\x51\x59\xf6\x96\x01\x76\xd7\x6b\xfd\xcd\xab\x37\x5d\xbd\xd6\xa9\xad\x7f\x17\xf0\xbf\xe0\x52\xee\xe5\x5a\x3e\x9b\x2c\xa3\x93\x61\x6f\x5b\x94\x67\x1d\xaf\x73\x57\xd7\x24\xec\x0c\x38\x87\xbf\x39\x8c\x1c\xd6\xdf\xbc\xfa\xfa\xd5\x9b\x03\xbb\xf7\x5f\x1f\xda\x53\x88\xdc\xca\x5f\x47\x6e\xe5\xf0\x4b\xf7\x16\x1d\x4a\x58\x91\x26\x68\xe7\xe0\xcd\xe1\x08\x72\x1a\xa0\x3e\xe9\x8d\x54\xb9\x4b\xf1\xf7\x15\x23\xed\x9b\x87\xf6\x9f\xbc\xf4\xc2\xe7\x00\x88\x56\xa0\x8e\xdd\xcc\x43\xe0\xd0\x00\x37\x3a\x37\xe4\xab\x52\x2a\xf6\x55\xb4\xc4\x73\x15\x0c\xee\x06\x77\x95\xb4\x1a\x5e\x75\x88\xdb\xed\x93\xec\xdc\x37\xd5\xf9\xbe\x10\xb5\x92\x56\x1b\xcc\x73\x2d\x8b\xba\xdc\x34\x0a\xbb\x9f\x40\xf4\xde\xe5\xad\xba\xa5\x5d\x6a\x25\x86\x39\x94\x2e\xe7\x78\x3c\x8f\x4b\xf9\x8e\x59\x21\xc5\x14\x7d\x95\xa1\x61\xe1\x86\xab\xae\x57\x59\x3d\x93\x22\x63\x95\xd1\xaf\xb4\x91\x8a\x4e\xd9\x2b\x07\xe4\x46\x8b\x6d\xaf\x64\xc1\x0f\x00\x6d\x3b\xf3\x0d\x9b\x02\xe1\x7b\x84\x42\xcb\x3e\xff\x1b\xe8\x25\xcd\xa0\xec\x24\xec\xba\x95\x96\xa2\x06\xc3\xa2\xeb\x76\x6f\xa9\x6a\x41\x87\x0e\x82\x7d\xb2\x41\xe9\x8d\x3e\x2d\xa8\x36\x3c\xfb\xb6\x90\xd9\xd5\xa5\x91\xdd\x0c\x7d\x29\x34\x8c\x65\xb0\xb4\x30\x41\x90\xa3\x1f\x2f\xc9\x09\xd7\x57\x44\x31\x2d\x6b\x95\xb9\x56\x65\x0b\x05\x19\x37\xad\x1d\x8b\xc3\x5e\xa6\x82\x19\x57\x72\x9f\x94\x34\x9b\xa1\xea\xef\xa2\x1e\xd8\x6d\x25\x75\xd3\x7c\xbd\x03\x4a\xe1\x88\x3b\x55\x1c\xfd\x78\x79\xf7\x95\xb9\x8e\x9a\x64\xa0\x0d\x11\x53\x69\xc0\x12\xdb\x44\xca\x0f\x8d\x62\xdd\xa4\xb2\xa5\x3b\x6d\x11\x1e\x8c\x52\x8a\xe5\x5c\x61\x21\x55\xf7\xae\x6c\xac\x47\x99\xe6\x23\x7a\xa3\x47\x99\x2c\xc9\xf1\xe5\x19\xc9\x15\xbf\xee\xda\x27\xa9\x1f\x29\xfb\x15\xbd\xd1\x0c\xc1\x1f\x5b\xf0\xed\xd7\x5d\xf6\x61\xcb\xbd\x42\xf1\x6d\xce\x4e\x3a\xfc\xbc\x6f\xfe\xf7\x44\x7f\xb6\xef\xde\x51\x9f\x4b\x95\x35\x87\x50\x78\x8b\xec\x84\x17\x0c\x0b\x76\x21\x26\x3a\xbf\xaf\x23\xfb\x70\xcd\xe7\xb2\x26\x37\x14\x0d\xdb\xc0\x67\xbb\xa7\x6f\x7e\xe6\xd5\x5b\x72\x2a\x74\xad\x58\x93\xa4\xbe\x08\x82\x15\xdc\x7d\x1f\x61\x5f\x5d\x08\x68\x83\xbb\x8e\x62\xda\xa3\xc4\x18\x8e\x53\xd4\xce\xf4\x5b\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x55\xc1\x33\x6e\xac\x3a\x2a\x26\x4c\x35\xa6\x62\xfc\x41\xa2\x2e\x4b\xbb\x72\x27\x49\x8a\x4c\x56\x30\x0a\x03\x7a\x6e\x19\xc3\x03\x20\x1e\xc9\xa3\x0f\xc4\x63\xa2\xf7\xd9\x84\x48\x4c\x3d\x68\x97\x29\xe7\x3a\x4c\x6e\x11\xda\xad\x2e\x3a\xf4\x5b\x6a\x46\x83\xc2\xef\xa4\xf2\x53\xbe\xca\xd9\xf5\x2b\x9d\xd3\x37\x03\x78\x2d\xc4\xcf\xf9\xc2\x1e\x50\x4d\xf6\xde\x6c\xdc\x28\xa0\x19\x97\xbc\xe4\x05\x55\xc5\x7c\x10\xef\x65\x33\xbf\x65\x95\x1e\x10\x30\x26\xbf\xde\x23\x07\x58\x0d\x1c\xc4\xf5\x82\xf9\x76\x7c\xa1\xab\x2f\x64\x40\x75\x6e\x76\xd7\x37\x30\x84\xf4\x0e\x0e\x21\xc0\x98\x68\xfe\x51\x14\x9d\x8b\x7b\xa4\xc2\x7e\x0f\x87\xaf\x1f\xa8\x6a\xe7\xc5\x9e\x48\x94\xdc\x58\xf3\x88\x6f\xc9\xc3\x85\x53\x01\x3e\x58\x1c\xed\x51\xcf\x62\xd7\xc8\x59\xf7\xf6\x83\x24\x48\x0a\xdb\x3e\x50\x0f\x07\x84\xd4\x0b\xfe\x73\xcd\xc8\xd9\x89\x67\xd4\x15\x53\x9a\x6b\xc3\x84\x21\x79\x4b\x42\xe7\x28\xb6\x1f\x1c\x95\xf4\x17\x29\xc8\xe9\xb7\x97\x6e\xa2\xce\xd7\x6c\xf7\x4e\xb7\x23\xb3\xa2\xbf\xd4\x8a\x59\x7d\x66\x6b\x2a\x97\x07\x60\x51\xcf\xb2\x9f\x93\x13\x6a\x28\xaa\x5b\xc8\x31\x64\xd3\xd3\x0b\xd4\xa2\x31\xd4\x73\xf3\xcd\xe3\xd2\x29\x45\x01\xa8\x8d\x34\xa1\xe8\x65\xec\xa1\x74\xdb\x8f\xa5\xea\x8f\xc5\x67\xd4\x7f\xec\x0a\x09\x34\xa0\x2d\x6b\x1e\xf6\x7d\xce\xbb\x5a\xf4\xf1\xe7\xdf\x7f\x3a\xdb\x82\xde\x92\x81\x4e\x3e\xfd\x20\xf3\x34\xca\xcb\x7e\x34\xa1\x17\xd1\xa0\x21\xf0\x31\x7e\x4e\x4a\xbb\x12\x39\x97\x82\x0d\xc8\x27\x46\x73\x62\x99\x95\xfb\xcf\x1f\x15\x37\x6c\xb4\xbf\x2d\x21\xd7\x1f\x62\x92\x8d\xf0\x93\xf9\x4d\x38\x8f\xda\x44\x42\x2f\x57\x20\xe9\x4e\x66\x1d\x17\x72\x4c\x1c\x49\xdd\xe6\xdb\x7f\xff\xe9\x2c\xd9\xcb\x7f\xff\xe9\xcc\xbf\xbb\xfd\x4f\x39\xd9\xcd\xd7\xde\x35\xc5\xfd\xdd\x82\xc6\xdc\x5f\x73\xf9\xe0\x72\x22\xe8\x1d\x6d\xfc\xf1\x55\xf1\xd1\x96\x95\xf0\x04\x25\x9c\x9c\xa2\xf7\x96\x58\xb8\xba\x99\x41\xb9\xe8\x5c\x1e\xb1\x4d\x5c\xed\x4c\x4d\x4f\xa6\x28\xea\x0d\x7a\xfb\xe5\x6f\x49\x59\x17\x06\xba\xdc\xc0\xd5\xb2\x77\x0d\x12\xc8\xfc\x25\x23\xae\xeb\xab\x95\x0e\x30\xd2\x24\x7f\xeb\xab\x27\x85\x5f\x2c\xff\xc1\x07\x2a\xe8\xd4\x3e\x0e\x1c\x9b\x94\xf8\x67\x74\xa7\x0f\xd0\xc1\x2f\xc2\x57\xf4\x9a\xf2\x82\x8e\x79\xc1\x0d\x68\x23\x87\x23\xbf\x97\x58\x6a\x06\x40\xde\x1a\xb1\xdf\x39\x95\x2e\xee\x84\x01\xdd\x13\xc9\x81\xfd\xee\xd5\x8d\x65\x8a\x87\x23\xe0\x90\xf0\xe0\x8c\xa9\x58\xeb\xeb\xbc\xb2\xbd\xf0\x9f\x1e\x49\x5b\xec\xaf\xa1\x45\x17\x0f\x76\xa3\x9b\x26\x60\xa9\xe9\x56\x35\x01\x0b\xc0\x52\x4d\x00\xbe\x70\xbd\x6c\xb7\xa0\x0c\xc0\xf2\x1d\x94\x01\xf8\x5d\x62\x65\xc0\xb2\xa5\x2f\x49\x19\xd0\x2c\x53\xcc\xf4\x50\x07\x80\x34\x76\xfc\x7d\x5f\x85\x60\xe7\xe8\x62\xfe\x42\x17\xe3\xd1\x20\x57\x92\x13\x6a\xa6\xf3\xc2\x7a\x68\x68\x8f\x5f\x2d\x54\xb9\x46\xe2\x75\xe9\xa4\x03\xdf\xe8\x1e\x7e\x6f\x49\x56\x97\xfa\xfe\x38\x7a\x33\xf4\x70\x69\xd2\xec\x8b\x9f\xcd\x6f\x0b\x8a\x3d\xf0\x31\xe9\x7c\xb5\x7b\xbe\x66\xc6\xaa\xd9\x64\x6b\xa5\x1d\xec\xea\xef\x2e\xdb\x81\x24\xc7\xac\x9a\x91\x77\x97\x4b\x18\x18\xd6\xef\xb0\xdb\xa5\x31\xbc\x64\x5f\x93\x82\x4f\x98\xe1\x5d\x3d\x23\x31\x0f\x3b\x46\x58\x5a\x0c\x2c\x14\x66\xf2\x0c\x0b\xb7\x2b\x38\x1e\x85\xf4\xed\x4d\x83\xde\xf3\x0c\x99\x4b\x29\x05\x37\x72\xe3\x5e\xe4\x24\x45\x1f\x03\xb7\xf4\xb6\x59\x83\x87\xc3\x1e\xea\x27\xbf\x9d\xe4\x43\xf4\x29\x25\x99\x2c\x0a\x96\xf9\x5a\x1a\x80\xa6\x3d\x76\x0e\xc7\x12\x13\xb9\x0b\x05\xd6\xa3\xab\x3f\x80\x91\xdc\x99\xc3\x5f\x21\xea\xbd\xfa\x74\x7a\x74\xf2\xe1\x74\x54\xe6\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\x5a\x2a\x75\xeb\x5d\x16\x12\x68\xd3\x8f\x50\xb5\xb8\xa2\x66\x96\x46\xbd\xb6\x33\x59\xf4\x69\x3a\xda\x7f\xaf\xb1\x5e\x00\x54\x64\x73\x71\x88\x4a\x4a\x33\x20\x8a\x42\xf0\x6d\xe8\x94\x3c\xa9\x8b\x02\xf1\xcc\xd2\x9e\x41\xec\x1f\x7e\xf5\xa2\xe4\x7a\x71\xaa\xb5\xb9\x5f\x94\xc6\xbb\x2b\xe4\xa1\xbf\x6c\xd9\x55\x67\x26\x09\x11\xa6\x81\xa4\x8d\x32\x97\xad\xcf\x31\xf6\xc1\xcc\x2c\x02\x5d\xb1\x39\x81\xaa\xf6\x56\x6d\xfd\x5e\x33\xd5\xbe\x82\xcc\x64\xb0\xeb\xaf\x6a\xcd\xd4\x08\xa7\x7f\xe6\x27\xdd\x47\x56\x86\xf7\xff\xc4\x26\xbb\x71\xce\x9f\xd8\x64\xd9\x31\xbb\x8f\xa1\x3b\x73\xc8\xaa\xb2\xa2\x78\x6d\x66\x98\xf9\x8b\xfd\xf3\x51\x4f\x59\x7a\xee\xd8\x07\xe1\x99\x1f\x74\xaf\xfa\xea\x29\x1a\xdb\x88\x1e\x5a\x15\x49\xdc\x04\x24\xf6\xa3\x39\xcc\xe8\xd9\x2d\xe5\x73\xab\x05\x2c\x96\x20\xe3\xd7\xac\x98\x07\x59\x1d\xf3\x66\xf2\x1a\x2b\x22\xd3\xec\xea\x86\xaa\x1c\xfa\x4d\x57\xd4\x70\x67\xe1\xe6\xdd\x05\x4b\x3b\x7c\x8f\x72\x57\x73\xd9\x35\x12\x71\x09\xd8\x1a\xdf\x98\x3b\x65\x06\x13\x42\x85\x2b\x2e\xed\x2a\xa8\x59\x1e\x49\x3b\x07\x5d\x78\x20\x4a\xab\xbb\x65\x4c\x59\x6d\xbf\x98\x93\x1b\x25\xbb\x56\x60\xf3\x63\xc3\xc0\x12\x79\xcd\xd4\x35\x67\x37\xaf\x6e\xa4\xba\xe2\x62\x3a\xb4\x2f\x3b\xc4\x2b\xa0\x5f\x59\x4c\xd4\xaf\x7e\x05\xff\xf4\x80\x2a\x51\x67\x8f\x60\xa1\xde\xdb\x4b\x21\x0e\xf7\x6e\x38\x60\x87\xe5\x6f\xdb\xa6\xea\x16\x06\x7b\x97\x64\x2c\x47\x2b\xcf\xb1\x15\xcd\xa5\xc6\x67\xec\x39\xb6\xe8\x35\xcd\xcb\x8e\x55\x8c\xc9\xce\x90\xeb\xae\xc6\x1d\x2e\xf2\x6e\x47\x97\xc4\xb8\x03\xab\xb7\x8d\x3b\xee\x33\x17\x04\x1a\xd2\x41\xa8\xf7\x4a\x40\xe1\x59\x9f\xe4\xd1\xce\xf1\x48\x60\xe1\xc1\xc5\x37\x73\x51\x38\x88\x13\xfb\x27\x70\x56\xf0\x50\xc8\x8a\x59\x92\x9c\x5d\x8d\xa4\x9a\x3e\x46\xd2\xc6\x22\xbe\x96\x73\xfd\x73\x31\x44\x08\x86\x55\xde\x20\xec\xf3\xb3\x5c\xbd\x64\x67\xac\xcc\xce\x78\xde\x81\x1e\x3b\x9c\x73\xf1\x98\x57\x8a\x7c\x91\x56\x9a\x2f\xca\xe5\xb6\x45\x9c\xe8\x6f\x8b\xd9\x35\x15\xbd\x91\xe8\x2a\x09\xb5\xd9\x5c\xc3\x4c\xd0\xc0\x91\xb3\x78\x5f\x21\x54\x61\xa0\x8a\x96\xcc\x30\xd5\x14\x8c\xcf\xa4\x10\x7d\xfa\xcd\x1a\x49\x3e\x56\x4c\x5c\x02\x13\x7e\x51\xab\x5f\xd4\xea\xd5\xe3\x45\xad\x7e\x51\xab\x53\xa8\xd5\x3b\x97\x30\xe4\xe9\x29\x16\x41\x74\x89\x80\x4d\x45\x07\xa7\xb3\x3c\x3f\x9e\xd9\x55\x7b\x96\x62\xc2\xa7\x1f\x68\xd5\x5b\x81\x0e\x33\x2d\x28\xc3\xe1\x63\x17\xd9\x00\xa5\xa9\x2a\x59\x41\x8b\x3e\x57\x46\x14\xb6\xff\xe9\x35\xb3\xbe\xcc\xc8\x5d\xb8\x64\x49\x20\x3d\xf0\x3b\x02\xa5\x2d\x6f\x94\xf6\x93\x31\x37\x8d\x24\xa1\x99\xc1\x7e\x60\xd8\x73\x95\x48\x41\x32\x57\xe1\x1d\xf4\x9f\xa8\x4f\x5d\x02\x9d\x4a\x10\x99\x19\x5f\x6a\x34\xb4\x0f\x7b\xfd\xfa\xf5\x6b\xec\x1d\xf3\xfb\xdf\xff\x9e\x48\x45\x28\xc9\x59\xc6\xcb\xbb\x0f\xc2\x53\xbf\x7d\xd3\xb1\xbd\x82\x1d\xff\x7e\xf4\xe1\x3d\xd4\x65\xa9\x8c\xc6\x0e\x8d\x08\x91\x9d\xb8\xb5\xa8\x1e\x90\xff\x73\xf9\xf1\xbc\x69\xfd\xd7\xfe\x16\xac\x26\x61\x3b\xbb\xc3\x13\xbb\x6f\x5f\xff\xee\x37\xbf\xe9\x31\x13\x18\x5c\xa4\xe2\xae\x9c\xb1\x2f\x31\x43\x2d\x3f\x56\x0c\x7b\xf2\x80\x00\xe1\x35\x58\x2c\x00\x66\x3a\xb7\x07\x21\x5e\x40\x29\xf9\x74\x66\x5c\x99\x58\x7b\xc5\x0b\x9e\x19\x14\x04\xb0\xb8\x96\x74\xd5\x9a\xe1\xd2\x23\x0c\x41\x7b\xef\x11\xc0\x92\xb3\x01\x29\xf8\x15\x23\x13\xfd\x17\x25\xeb\xaa\x69\xe4\x8b\x3d\x4b\x7c\xed\x23\x04\xa2\xc1\xfd\xce\x7d\x30\x77\x25\x93\xba\x57\x04\x4a\x2a\x22\x03\x40\x2c\x98\x1c\x5c\xe5\xd3\xa6\x31\x6c\x45\x79\x28\x76\x04\x69\x9b\x28\xcb\xb6\x65\xe4\xac\x63\x41\x39\x3b\x8e\x03\x47\xf1\x0d\x1c\x2a\x25\xff\x13\x91\x1c\x4a\xfc\x46\x1c\x1d\x4a\xe3\x5a\x9c\xf3\x85\x71\x9b\xc8\xc4\xce\xeb\x5f\x31\x2c\x7d\x6b\xf5\x35\x26\x42\xab\x45\x78\x7b\xa8\x62\x1b\xed\x8d\xfd\xa2\xe0\xda\x82\x06\x1d\x81\x1c\xc4\x9d\xd7\x5e\xf2\xa6\x61\x35\xb8\xf7\x1a\x6f\x44\x2d\xee\xac\x8a\x9d\x34\x7a\xac\x0c\x2c\x1d\x5e\x90\xfa\x2e\xb8\xcd\xda\x58\x20\xdd\x35\x99\x71\xcf\x7a\x2c\x08\x07\xd6\xbd\x6d\x7f\x74\xa4\x9a\x99\xda\x1d\x3d\x53\x4a\x2a\xfb\xae\x4c\x6b\xd7\x5f\xad\xa4\xea\x8a\xe5\x81\xff\x8d\xc8\x85\xdd\x14\xdf\xdf\xa6\x87\x89\xa7\xa0\x56\x0b\x43\x23\x3e\x9d\xc3\x6b\x3a\x85\x1d\x80\xdb\x1f\x8d\xf6\x91\xf0\x4a\x45\xb4\xa1\xca\x51\x43\xfb\x79\x3f\xca\xb3\xc5\xb8\xb5\x16\xdd\xf8\x40\x2b\x68\x81\x0d\x72\x26\x20\x00\xd8\x30\xe0\x9d\x1d\xf3\xa1\xee\x8c\xba\xf3\x96\x04\x16\x86\xbe\x06\x77\x1c\xc3\xce\x15\xd6\xfd\xef\xed\xc6\xf4\xb9\xe7\xbd\xcd\x24\x40\xa9\xfa\xfc\x7c\x01\x01\xae\xda\x35\xeb\x8d\xf4\xd4\xa8\x9f\x42\x9e\x48\xf9\x2d\x7b\x08\xe1\x38\x52\x9a\x85\x10\x9e\x76\x70\xce\x5a\x92\xb8\x41\xeb\x4f\xd1\xe3\x0e\xe1\xd8\x21\x01\x1c\xc7\xae\x89\xe1\x38\xce\x26\x40\xca\x17\x58\xb6\x63\x35\xb1\x52\xe5\x65\x0d\x7b\x76\x7d\x17\xdd\x9e\x04\x8d\x63\x2b\x72\x34\x8e\x14\xd2\x34\x8e\xfe\x32\x35\x8e\x3e\x61\xd0\x38\xd2\x12\x0e\x1f\x4c\x8d\x87\xe1\xc4\x0e\x94\x2c\x26\x01\x01\xc0\xeb\x09\x36\x15\x4f\x8c\x7b\xd3\x0b\x27\xd4\x20\xc9\xa0\x63\x2d\x8b\xda\xe0\xc2\xa9\xa6\x8e\xe5\x25\x78\x21\x56\x40\x4f\x8a\x5e\x42\xd2\xe2\x22\x91\xec\x05\xd2\x31\x8a\x2b\xfd\x57\xd8\xcd\x18\xfe\x3e\xae\x90\x54\x68\x9b\xd6\x05\xb2\x7d\xf7\xc7\xd6\x5d\x1f\xa9\xdd\x1e\xbb\xe6\xf2\x48\x59\x5c\xa2\xa3\xab\x23\xd8\x47\x53\xdc\x1d\x3f\x59\xa8\x2d\x78\x33\x63\x2e\xc9\x25\x52\x7e\xad\x90\x65\x59\x28\x68\xe4\xbe\xdf\x2a\x36\xf5\xd9\x96\xb7\x3c\xad\xbb\x27\xd3\xbc\xbf\x13\x41\x73\x72\x70\x1c\x6a\x66\xfb\x7c\xd9\x33\x61\x98\x9a\xd0\x8c\x1d\xc6\xce\x05\x56\xcd\x58\xc9\x94\xdd\x78\xf7\x9c\x2f\xc1\x3c\xa3\x22\x2f\x5c\xe9\x73\xbc\x45\x84\xdd\x1a\xa6\xec\x21\x35\xc1\x67\x9d\x84\xc7\x6d\x17\xcc\x02\xc8\xb7\xe1\xeb\x80\x85\xb7\xcd\x6b\x10\x0a\x2f\x1e\x89\x88\xf3\x34\xc7\xea\xfb\xa6\x59\x14\xd0\xb1\x83\xa9\x3b\x05\x3d\x96\x02\xa4\x62\x20\xf7\x73\x59\x2b\x0c\xb8\x0d\x71\x94\x99\x54\xca\xca\xe7\x00\x10\xd5\x44\xb1\x29\xd7\x06\xba\xc3\xf8\xae\x96\xd8\x61\x62\x6b\xf5\x78\x76\x2a\x92\x2f\x84\xec\xad\xa8\x74\xd4\x79\x0d\xa7\xd1\x55\x4a\x5e\xf3\xdc\x2b\x74\x31\x7f\xe6\x9a\x54\x54\x47\xf5\xd3\xa9\xd6\x32\xe3\xe0\x00\x6b\xb0\xa8\xf3\xfa\x68\x09\x05\x75\x31\x67\xc6\x6a\xf7\x82\xb5\x2a\xdf\xc6\x41\x86\x92\xd0\xaa\x2a\x3a\x67\xda\xf4\x46\x0b\x21\x73\x76\x51\x8f\x0b\xae\x67\x97\xbb\x12\x38\xb5\x0c\x26\x4c\x4e\xbe\x93\xd1\x74\x5f\x00\x55\x8f\xa0\x2d\xa1\x39\x68\x5c\x56\x5e\xb2\x0a\x26\x97\x02\x4c\x5d\x54\x6b\xbf\x6a\x4c\x6a\x24\xc8\x9d\x05\x33\xcc\x7f\xd5\x5d\x8e\x6e\xde\xdb\xf5\x9e\xb0\x3a\xb9\xfd\xf4\x7b\x51\xb5\x3e\xcf\x68\x51\xf4\xb0\x7c\xb4\x45\x6c\x2f\xbd\xa0\x09\xc0\xf7\xb1\xc0\x0b\xc3\xed\x5d\xf2\xbb\x0c\x29\x65\xc8\xbd\x46\xd8\x01\xb4\xbb\x88\xbb\xf4\xe0\x74\xd4\xe6\x5f\x0a\x7f\xba\x03\x2b\x90\xfb\x1f\x04\x0c\xc0\xf2\x5d\x78\x8f\x5f\xc2\xd9\x5e\xc2\xd9\x1e\x18\x5b\xd7\xe9\xc8\x4b\x38\xdb\xa6\x63\x17\xc3\xd9\x76\x2e\xe4\xdc\x1b\xae\x91\x3d\xd2\x7c\x08\xd5\x04\x31\xe8\xaa\xc6\x74\x9f\x20\xa5\xf6\x95\x82\x1f\xa8\x3b\xb0\xb5\x90\x6f\x7c\xaf\x23\x63\x14\x1f\xd7\xa6\x3b\x29\x4e\x1b\x6b\xd8\xc0\x03\xea\x29\xd3\x4e\x66\x18\xba\x23\xcb\x22\xe6\xe1\x8c\xfc\x81\xa3\x45\x92\x46\x4f\x55\x69\x14\x74\x17\x50\x5b\xf0\xc3\x7d\x4d\x72\x99\xd5\x25\x13\xa6\xc1\x90\x26\xd7\x05\xfd\x2c\x5b\xe4\xaa\x34\xcf\x39\x0a\x25\x17\x09\xf8\x6b\x2f\x72\x94\xcb\x1b\x61\xf9\xd1\xd1\x45\xa7\x0a\xbf\xed\xea\xbe\xcd\x5c\xb1\x19\xc3\x7f\x4c\xec\xe7\x74\x0c\x3d\xe9\x5d\xcb\xd5\x97\x90\xc9\xa5\x53\xa4\xb9\xa6\xcb\x3c\xb3\x46\x92\x5a\xb3\x95\x21\x91\x8d\x67\x35\xe9\xca\x2f\xd1\x99\xbb\xe1\x16\x7e\x89\xce\xec\xba\xf2\x4b\x74\x66\xb7\xe5\x5b\xf4\xec\x0c\x43\x2c\xad\x38\x57\xb8\xde\x9e\x2d\xfe\xe0\x22\x13\x7a\x1c\xd4\x6e\x45\x95\x9d\x34\x3c\x11\x8d\x1b\x8b\x85\x7f\x17\xec\x30\x48\x0b\x1b\x3f\x78\x94\x34\xe7\x99\x26\x28\x9b\x5f\x42\x04\xda\x0e\x44\x90\xc1\x5e\xf6\xb0\x09\xe2\x68\x57\x8b\x6b\x4a\x0f\x62\x37\x6e\x0c\xd1\x8d\x62\x84\x2b\x99\xbf\xc5\x06\xd4\x54\x08\x89\x22\xaa\x1e\x60\x03\x6f\x3d\x70\xc5\x2f\x40\x49\xad\x68\x86\x56\xb2\x9a\xe7\x40\x53\x9b\x0a\x95\x5d\x6b\xc7\xe1\x48\x82\x05\x24\x11\x26\x10\xc0\x06\xd8\xa2\x8b\x3e\x28\x41\x92\xa1\x85\x1d\xb4\xe2\x3f\x30\xa5\x7b\xf4\xb6\x6b\x46\xbb\xf1\x2e\xce\xea\xb1\x41\x67\x33\x56\x52\xf8\xcf\x77\x7e\x0b\x2c\x81\xb4\x5a\xa7\x61\xd8\xbe\x8e\xa9\x52\x13\x39\x19\xb4\x32\xb0\xf7\xae\xfb\x74\x74\xf3\x23\x91\x31\x83\xf8\xcb\x74\xd1\x3b\xdc\x88\x2c\x6e\xd8\x45\x2b\x38\xc8\x5e\x24\x90\x23\xed\xdd\xf2\xee\xa7\x26\x50\x1b\x98\x08\xee\xf0\x0e\x6d\x4e\x7a\x4b\x0d\x8e\x5d\x8b\x0a\xed\x1a\x0d\x3a\x08\x11\x03\x6d\x91\xbd\x27\x38\x2f\xd1\xa0\xed\xf1\x12\x0d\xfa\x12\x0d\x9a\x34\x1a\x34\x12\x76\x3c\xdf\x5a\x12\xd8\x19\xc7\x31\xf8\xe8\xce\x31\xf3\x7a\xbf\xb3\x38\xf8\xe0\x4c\x1f\x99\x29\x55\x3b\x01\x65\x7f\x34\xda\xc7\x14\x94\xc6\x44\x51\x9b\xc9\xf0\x0f\x84\x89\x4c\xe6\x76\x9e\xcf\x30\xbf\xd2\x06\x44\xf8\xc6\xcf\x13\xc3\x52\xfa\xb5\xe2\x24\x16\x98\x3b\x85\x44\xd5\x9b\x55\xf8\x5e\x8e\xef\xd2\x0b\xa6\xbd\x89\x7b\x23\xce\x86\x8e\x93\x6e\x8b\x33\x1f\xd1\xe4\xe4\x5a\xff\xbd\x26\x05\x2f\x39\xb4\x37\xc9\x81\xc2\x31\x6d\xfa\x39\xba\x08\x39\xc0\x29\x47\x59\x55\x0f\xdc\xf4\xa3\x92\x95\x52\xcd\x07\x61\x09\xfb\x65\x6b\x4d\xf7\xc4\x21\x08\xd1\x59\xad\x14\x13\xa6\x98\xf7\x2b\xf8\xde\x8c\x1d\x94\xa6\xfd\x09\xec\x88\x30\x1d\x10\xa4\x4f\x23\x86\x66\xb4\x69\x50\x13\x4f\x07\xae\xe6\xb0\x8b\xc0\x3b\x5d\x61\xbf\x41\x13\xc5\x68\x3f\x65\xe2\x9a\x5c\x53\xa5\xfb\xdd\x79\x92\x56\x7e\xce\xf9\x35\xd7\xb2\x73\x0c\x5a\x34\x51\xbc\x3d\x97\xc1\x83\x66\x6f\xaa\xac\x4d\x55\x1b\xc7\x4e\xfc\xf5\x65\xb7\x95\xb4\x42\x5a\xb8\xb6\x0b\x8a\xc6\x9b\xae\x0e\xca\x66\x54\xd4\x18\xa6\xc4\x5b\xf2\x7f\x0f\x7e\xfa\xf5\x3f\x87\x87\x7f\x3e\x38\xf8\xdb\xeb\xe1\xff\xfa\xfb\xaf\x0f\x7e\x1a\xc1\x7f\x7c\x75\xf8\xe7\xc3\x7f\xfa\x3f\x7e\x7d\x78\x78\x70\xf0\xb7\xef\x3e\xfc\xe5\xf3\xc5\xe9\xdf\xf9\xe1\x3f\xff\x26\xea\xf2\x0a\xff\xfa\xe7\xc1\xdf\xd8\xe9\xdf\xd7\x9c\xe4\xf0\xf0\xcf\xff\xb3\x37\xe8\x54\xcc\x3f\xf6\xa4\xc3\x38\x86\x09\xe5\x81\xf6\x8c\x49\xd0\x6f\x41\x4b\xe1\xc2\x0c\xa5\x1a\xe2\xd4\x6f\xa1\xa7\x74\xcf\x05\x3c\x7a\xa5\xbe\xff\x8d\x0c\x12\xf8\x52\x50\x10\x77\xe8\x82\x3f\x86\x0e\x98\x38\xe5\x02\x42\x42\x4e\xf8\xd6\xaa\x8d\xfa\xf5\xdb\x25\x56\x0c\x2b\x2b\xa9\xa8\x9a\x93\xdc\xb9\x1c\xe6\x8f\xd0\x46\xa6\x67\xa3\x6b\x00\x3d\xe7\x5d\x6e\xf5\x96\x5d\x96\x25\xcb\x79\x5d\x6e\xdb\x5b\x89\x50\xc4\x07\x7f\x63\x8f\x18\x22\x96\xe4\x24\x44\xc0\xbb\xc7\x9c\xcf\x78\x4c\xb3\x2b\x34\x22\x04\xcc\xe8\xe3\x59\x62\x71\xc9\xe1\xbd\x3d\x17\xea\x5a\x32\x2a\x82\xe7\x14\xc2\xb2\x65\xce\xf6\x75\x78\x16\x41\x4a\xe2\xac\xc4\x90\x2c\x97\xd3\x75\xe0\x16\x38\xb4\xaa\xd0\x07\x90\x5f\xb7\xd6\xc6\xbd\x07\x76\x93\x24\x8d\x09\xf8\x2f\xec\xbd\x95\xf5\xb7\x8d\xa6\x01\x10\x1f\xa3\x6f\x24\x98\x75\x5c\xa3\xab\x09\x29\x64\x16\x25\x6c\xb4\x44\x51\x40\xd4\x53\x4f\xe2\xfa\x46\x2b\x59\x74\xb5\xd0\xa0\x0e\x04\x2e\xb5\x42\x63\xbc\x35\xcf\xe8\xb8\x60\x68\x3a\x02\xbc\xe9\x8d\xa3\x76\xb1\x92\xde\xf2\xb2\x2e\x49\xad\xed\x9b\x49\xd1\x9e\xbb\x79\xb1\x1b\xbc\x9a\x78\x57\x4a\x2e\xe0\x47\x2d\x33\x5b\x77\xe7\xd5\x8c\x91\xcb\x70\x02\x8d\xd1\x17\xc3\x17\x9d\x4d\x47\xd7\xa0\xfa\x3b\xe8\x9c\x02\x2a\x27\x10\x66\x1b\xf4\x10\x4d\xa0\x9e\x43\xe7\xc6\x99\xe4\x2e\xc1\x10\xbc\x68\x53\x0c\xa0\x5f\xb3\xe8\x80\x6a\xe1\xf2\xa1\x9e\xeb\x3d\x7e\x76\x52\x7c\x4f\xd9\x3d\x95\xc4\x9e\x44\x4e\x4f\x2e\x9d\x87\xfc\xb2\xad\x89\x7b\x21\xc1\xad\x25\xef\x39\x7b\xf4\x92\x64\x37\xea\xf3\x8c\x02\x81\xed\x53\x66\xfd\x73\xb0\x7d\x3b\xe1\x31\x9b\x67\xae\x81\x10\x6f\x62\x14\x43\x9c\x1a\xde\x5d\x28\xc4\x33\xb4\xff\xe7\x6d\xe4\x3e\x7c\x69\xcc\x26\x18\xde\x8f\xbf\x01\xfb\xa2\xee\x56\x12\x08\xbd\x04\x05\x33\x50\x79\x88\x89\x30\x29\xe4\x28\x94\xf2\xda\x92\x90\x4e\x33\x7f\xaf\x5d\x80\x1d\xef\x78\x2d\xe8\x61\xab\xa2\xa4\x46\x83\x9f\x60\x2c\xc7\x2a\x49\x45\xb3\x03\xaa\x16\x1d\xdf\x7f\x7c\x48\x26\x8c\x9a\x5a\x61\xec\xba\x90\x0a\x3c\x22\x48\xc4\xd0\x94\xaf\x98\x45\x01\x68\xec\xa4\x64\x49\xb4\xa0\x95\x9e\x49\x03\x66\x63\x5a\xd1\x8c\x9b\xce\xe5\x6d\x8c\xa2\xd9\x95\x9d\x19\xa2\x98\xe0\xcd\xba\xbd\x46\x76\xe8\x72\xf4\x63\x5c\x6d\xd7\x95\x32\x33\x25\xeb\xe9\x0c\x0a\x0f\xe1\x53\x59\x41\x35\x56\xb9\xea\x16\x80\xb8\x74\x4d\x67\xe8\xd4\x24\x9f\x0b\x5a\xf2\xcc\x9f\x1f\x64\x91\x69\x2e\x5d\x80\x09\xc0\xd2\x75\xdb\x28\xb9\x60\x4a\x73\x6d\x98\x30\x18\xeb\x72\x5c\x50\x5e\x92\x03\xcd\x18\x39\xf5\x57\x1d\xbf\xb9\x44\x35\x1d\x9d\x5b\xdd\xd3\x0e\xe2\xe0\x19\xd7\x64\xd4\xd5\x91\xb6\x9f\x78\xa7\x5e\x14\x50\xda\xbd\x05\x84\xbb\x95\x4b\x5f\xf1\xb0\xc7\x65\x5c\xbe\x67\x52\x41\x86\x90\xb3\xcf\x5d\x33\x91\xcb\x26\xb0\xba\xd3\x5a\x47\x17\x67\x3a\x36\x88\x22\x4d\xab\x70\x75\xf8\xc2\x35\x41\x0d\x9d\x0b\x03\x45\xec\xb4\x9e\x15\xb8\x04\xe1\x22\xe7\xd7\x3c\xaf\x69\x81\xa2\x56\xe7\x6d\x3a\xbe\x3c\x43\x20\xf9\x74\x66\x86\x37\x0c\xdc\x89\x28\x6b\x37\x5c\xc4\xbf\x1a\xbf\x93\x32\xcb\x35\x08\x65\x86\x18\xd9\x8d\x20\x31\xe7\xc6\xb6\x9b\x76\x43\xe7\xd0\xcd\xdb\xa5\x3d\xb6\x22\xcd\xdd\x89\xb9\x65\x27\xb2\x9b\xcc\x50\x7a\x29\xcf\x21\x77\xc7\x8d\x3b\x02\x32\x9c\x51\x01\xaa\x2b\x78\xa1\x2d\xfe\x03\x4d\xbd\xbb\x6b\x5d\x29\x4e\x15\x30\xb8\x99\x0a\x05\x5f\x4d\xed\x8d\xeb\x68\x91\xd9\xb2\x55\xe4\xba\xb9\x8d\x9f\x59\x59\x15\xd4\x6c\x3d\xa0\xfb\xc7\xc8\x29\x1f\xc5\x0a\x5a\xd6\x41\x45\x3e\xa4\x85\x25\x19\x17\x3f\x1c\xbb\xd2\x65\x48\xd8\x93\x64\xc6\x7c\xf6\xe2\x87\x70\x1a\x0e\xaa\xb2\x4b\x69\x3a\x74\xd7\x1b\xb3\x1c\xe4\x01\x07\x71\x9f\x54\x4a\x79\x23\x98\xf2\xf7\xea\xe2\x87\xe3\x01\xe1\x23\x36\xf2\x7f\x85\x25\xbc\xb8\x64\xe4\x14\x8b\x53\xf8\x12\x39\xdd\x23\x0c\x65\x3e\xc2\x57\x8f\xfd\xd7\xf1\x9a\xff\xf8\xa3\xdd\x14\xfb\xed\x9f\x86\x7f\x74\x0c\x06\xfe\xfa\x87\x95\xda\x7a\x64\xd3\xfd\x63\x61\xb6\xb8\x1e\x00\x88\x3b\xf6\xaf\x7f\x5c\xc8\xfc\xb2\x62\xd9\x08\xb7\x5f\xff\xa3\x57\xd0\x2b\x21\x4c\x18\x35\x1f\x91\x0b\x09\x19\x32\x3c\x47\x82\x06\xef\xaa\xd8\x7f\xfa\x80\x0c\x40\x83\xe0\xf5\xcd\xa8\x61\x02\xa4\x5f\xd1\xbd\xf7\x39\xf1\x75\x35\x61\x59\x20\xf3\x14\xf6\xf9\x00\x5c\x75\x58\x5e\x7c\x40\x8c\xc4\x46\xdd\x5d\xb9\xad\x1d\x47\x82\xb0\x5b\xae\xa1\x8f\x08\x9e\x24\x20\x09\x75\xa5\x0d\xbc\xca\x61\x81\xb1\x78\x17\xfa\xe2\x54\xb2\x7b\xc4\x2d\xec\xe0\x57\x42\x9a\xaf\xc2\xe5\xf5\x19\x6b\xa0\x5b\x48\x42\xaf\x25\xcf\x49\xad\x41\xe6\x14\xa4\x16\x10\xb2\xd0\xa3\x84\xac\xc3\x9e\xf1\x9c\x94\x5c\x1b\x7a\xc5\x46\xe4\xd2\xaa\x23\x71\x18\x31\xe2\x94\x20\xe3\x42\x66\x57\x2c\x27\xb5\x30\xbc\xe8\x65\x99\x09\x70\xc3\xd6\x46\xaa\x0a\x14\x8d\xad\x33\x2b\xe5\x56\x8a\x0d\xbd\xc2\x84\x4f\xf5\xb0\x18\x23\x43\x0f\xbb\xda\x9c\xd5\x20\x5c\xd5\x19\x45\xd3\x6d\x95\xc3\x92\x2e\xf7\xb5\x27\x31\xba\x93\xa7\x6f\xf7\x53\xc2\xdf\xee\x0f\x40\x32\x3d\x22\xe7\xa0\xb9\x14\xdd\x2f\x25\x26\x4d\xa0\xb5\xdb\x45\xc8\x08\x96\x31\xad\xa9\x9a\x63\x62\x31\x37\x3e\xa7\xbd\xd6\x6c\x52\x17\xa0\x30\x76\xdf\x54\x2a\x6a\x0b\x30\x51\x2c\x93\x42\x1b\x55\x67\x80\x35\x94\x8c\x95\xbc\x62\xa2\x29\xf4\xd1\x83\x99\xc4\x19\xd3\x4d\x52\xa7\x15\xaf\x85\x24\xd9\x8c\x8a\x29\x0b\xa5\x84\x49\x49\x73\xc0\xe4\xef\x82\xf1\xa3\xfb\x66\xca\x80\x17\x74\x62\xac\x58\x68\x00\x41\xc6\x56\x4b\xf0\xd1\x48\xdd\x5f\xec\x53\x48\xf8\x2e\xa3\x80\x26\xc1\x8b\x2d\xa6\x1a\xf6\x8f\x28\x19\x82\xb6\xda\xd5\x60\x98\x20\x82\xa4\x64\x86\xe6\xd4\xd0\x5d\xa9\x21\xf0\x81\xce\x43\x64\x1a\xc6\xec\x03\xea\x46\xb1\xfc\x4e\x4d\xf0\xf6\x21\x59\xf1\xb8\xa0\xf5\xc5\x0f\xc7\xbd\xd6\x07\x83\x10\x60\x2b\x74\xc3\x32\x96\xca\xb8\xd0\x45\xb8\x55\x58\x3a\xc2\x57\x04\xb0\xa0\x79\x48\x90\x8d\xb3\x9c\xe4\x75\x6f\x6f\x76\x23\x22\xf4\x89\x9d\x4a\x12\x39\x65\xf1\x73\x57\x90\xe3\x73\x13\x8c\x9e\xb5\xb3\xd3\x97\x2a\xfa\x18\xb3\xc8\x84\xe1\x8a\x45\x05\xd7\x7b\x81\xe0\xf0\xad\x16\x48\x49\xdb\x98\x87\xa8\x39\x65\x46\x37\x69\x97\x28\x50\xf6\x5c\xd5\x38\x25\x09\xdf\x08\x34\x3f\x8f\x8d\xce\xd7\xb2\x74\x03\x7a\xad\x89\x78\xae\xa5\x13\x1c\xad\xc8\xbd\x75\x64\x4c\x17\x35\x47\x33\xcb\xe7\x3f\xc8\xbc\x7f\xf8\x5d\xda\x38\xd0\x16\x68\x4d\x71\x1b\xac\x01\xa5\xc1\xdd\x89\x0f\x40\x28\xb5\x6e\x15\xb7\x47\x49\x66\x46\xaf\x7b\x17\x80\xee\xec\x0b\x6b\xec\x15\x43\xef\x16\x43\x70\x87\x00\xee\xf0\x4d\x4f\xc0\xfa\x27\x20\xfa\xd1\x33\x11\xb1\x0d\x50\x92\x18\xb1\x47\x28\xf1\xea\x87\x65\xf1\x97\x49\xe2\xc3\x52\x63\x7b\x03\x99\x13\x5b\x5d\xba\x40\x48\x6c\x71\x65\x31\x19\xb7\x4c\xb8\xff\x79\x7d\xd5\x52\x53\x9d\x71\x25\xf8\x37\xb0\xa4\xd4\x81\x77\x78\x8c\x1c\x5a\xfb\xee\x5b\xed\xc7\x0f\x13\x03\x03\x5a\xf9\x72\x1b\x78\xef\x95\xce\x5c\x76\xa4\xb7\x5c\x31\x05\x99\x3a\x51\x69\x4b\x4b\x6a\x94\x2c\x0a\xa6\xe0\x08\x9c\x53\x63\x21\x01\xcc\x9e\x16\xc1\x30\xc0\xee\xfd\x38\xfc\xf0\x6e\xbe\x60\x6a\x13\xec\x26\x68\xd7\x54\x63\xa7\x6b\x1f\x01\x0f\xee\x4b\x9f\xd5\xb7\x0c\x9e\xfe\x24\xef\x47\xef\x0c\x3c\x12\x73\xdc\xfc\x93\x08\x39\xd1\x65\x46\xa6\x16\x54\xae\x09\x13\x74\x5c\x58\x75\x24\x42\xe0\x00\xe7\x82\x74\x6a\x64\xf4\xd4\x27\x36\xe9\xbf\x75\xe0\xc3\x8c\xa7\x5c\x6f\x6d\x14\x6f\x5b\x3f\x1c\x35\xb9\xb0\xce\x36\x93\xa0\x21\xb0\x1f\x0e\xeb\x5a\x4b\xb4\xf3\xa3\x16\xa0\x89\xbb\xcd\x2c\x7d\x83\xbe\x30\x25\xcb\x26\x48\x97\x4f\x00\xfd\x42\x78\x47\xff\x40\x7b\x9a\x5e\x76\x42\x1c\xe9\xd2\x12\x20\xcb\x17\x52\xc2\x52\xc4\x77\xa7\xe6\x3b\x04\xdd\x76\x00\x9f\x37\x01\x4f\xe1\x0f\xaf\x53\x84\x78\xe7\x31\xb3\xd4\xb9\x69\x3e\xd5\xff\x5e\x10\xbc\x1b\xf1\xfa\x4b\x52\x07\x1b\x32\xf7\x1d\x17\x79\x48\xe2\xf4\x45\x61\xad\x80\x76\x74\x71\x86\x50\xa7\x81\xe9\x1d\xf0\x84\xb9\x53\x78\xcd\x8c\xab\x7c\x58\x51\x65\xe6\xe8\xda\x1a\xb4\x20\x0e\xf5\x1c\x13\x2c\x9d\x34\xd2\xde\x5e\xa6\xe4\x28\x07\x47\xe0\xc3\x12\x5d\xdc\xec\xbd\x18\xb2\x6b\x3b\xd2\xb7\x4a\xa4\x1f\xad\x1d\x39\x6f\xda\xa1\x05\x27\xce\x33\xd9\x91\xc7\xca\x18\x27\x6d\x6e\xb6\xbb\xb2\xb6\x65\xb5\xba\x9d\xbb\x84\xa2\x2f\xd8\x2b\x9c\x1b\x52\xc6\x65\xc3\x82\x96\x09\x56\x7e\x3b\xd3\x80\xf0\x89\x15\xda\xa4\x18\x42\xe4\x63\x6f\xf0\x9a\xb0\x27\xa7\xe9\x8e\x5c\x7a\x33\x5a\xe0\x81\x30\x45\x50\x46\x4b\x37\x74\x90\x1c\x08\xd9\xdd\x40\xef\x07\xd0\x56\x5c\xeb\x10\x33\xda\xef\x89\x24\x19\xf7\x6f\x61\x45\x1a\xc9\x33\x36\xdd\x47\xbc\xc0\x8b\xc4\x5c\xe4\xf6\x52\x81\x88\x04\x46\x7d\x5d\x67\x19\x63\xc1\x65\xe8\xc8\x52\x7f\x95\xb6\xc5\x7b\xdc\x96\x97\xd4\x64\x33\xa6\x89\x96\xd0\xeb\x58\x1b\x5a\x14\x2c\x0f\xa1\x4e\x88\x28\x12\xb4\x0a\x17\x06\xd5\x1b\x8e\x48\x59\xe9\xbf\xc5\x91\x63\xc4\x79\x5d\xab\x82\x3a\xa7\xd2\xa4\x16\x19\xe6\x2f\x72\x33\x0f\x51\x26\x8b\x8a\x29\xd8\xa1\x35\xf8\xda\xfa\xab\x3e\x13\x8c\x18\x89\x6c\xca\x01\x99\x81\xf9\xcf\x91\xdd\xcf\xe8\x35\x6b\xa2\x3d\x5c\x97\x48\xcb\xa5\x43\xa9\xdb\x04\xb8\x1e\x95\xca\x1d\xa0\x86\x10\x0b\xec\x62\x3f\x0e\x06\xe7\x22\xb5\x2a\x13\xef\xc3\x41\xb4\xe9\x77\x54\x9c\xc3\xa0\xda\x68\x66\x42\x11\xef\xfe\x12\x2f\x71\xf1\xf3\xb4\x36\xb2\xa4\x86\x67\xe0\xa2\xe3\x93\x28\x48\xac\xc4\xc0\x0b\x4b\x69\x7c\x20\x3c\x8a\x48\x20\xb8\xb9\x73\x4b\x44\x06\x96\x2b\x4b\x8f\xb0\xf1\xd1\x5e\xbb\x53\x6e\x6f\xab\xdf\x96\x48\xf4\x4c\xf4\x9e\x9f\x7d\x45\x64\x62\x66\x8a\x31\xc2\xcb\x4a\x2a\x43\x85\x21\x39\x9f\x84\x1a\xdd\x3e\xc2\x70\x15\x4e\xa4\xb0\x07\xfd\x08\x71\xb5\xd1\x2a\xe8\x30\x2d\x0a\x79\xa3\x89\xb9\x91\xc1\xe5\xd0\xc4\x77\xb9\x9a\xc7\x83\x36\x30\x09\x64\x1c\xb7\xaa\x65\x75\x16\xaf\x22\x3e\x34\xb0\xb4\xe7\x86\x15\x85\xfd\x77\x15\x37\xea\x5d\xc7\x64\xe9\x9e\xf0\xa9\xc0\x32\xb4\x5c\x7b\xe7\x97\xab\xa1\x72\x90\x2b\x59\x55\x2e\xf8\xa1\x3c\x4c\xbf\x27\x10\xbc\xae\xae\x99\x86\x24\x13\x5f\xd7\xc5\xa2\xc2\x94\x09\xa6\xa8\x81\xf0\x3a\xd7\xcf\x15\x44\x92\x45\x20\xfb\x3a\x7d\x70\x24\xb4\x8b\x3c\x80\x74\x18\x7a\xb9\x1c\xc9\xfc\x33\xee\xdb\x04\xef\xc5\x05\xe2\x9b\xa7\x3b\x09\x10\xe8\xe0\x5b\x66\xe8\x21\xf9\x5e\x23\x5a\x04\xce\x1b\xea\xf0\xac\x65\x65\x73\xf5\xd6\xd1\xd0\x96\x00\xa8\xa3\xa2\x9a\x45\x50\xc5\x76\xa9\x50\x42\xae\xbd\xd7\x2d\x78\x8f\x95\xd4\xfa\xdc\xff\xe4\x09\x41\x7f\xb1\x59\x3d\x30\x5e\x6c\x56\x2f\x36\xab\x17\x9b\x15\x8c\x17\x9b\xd5\xe2\xf8\x52\x6c\x56\xa4\x61\x57\xbb\x4a\x9b\xce\x63\xd5\xa5\xcd\x60\x1f\x79\x9f\x09\x39\x97\xc6\x85\x18\x83\x06\x4b\xef\x75\x3a\x51\xe0\xd0\x37\x74\x3e\x12\xcc\xb8\x4e\x26\xde\xbf\xfb\xc9\xc3\xf4\x17\x65\xb5\x11\x67\xfa\x88\xe8\x86\x27\x64\xbe\xbd\x4d\xb4\x8a\x91\x28\x9a\x35\x11\xcf\xf0\xf9\xbe\x76\x71\xad\xf6\x7b\x28\x59\x18\x4f\x90\xb1\x11\xb9\x74\xb9\x2e\x0b\x8b\xdf\x6d\xb2\x90\x33\x43\x79\x9f\xde\x4d\xf1\xf0\xd2\xd0\xe7\x7b\xa4\xb3\xad\x49\x3b\x24\xe5\xb5\x09\x45\x97\x76\xcd\x14\xdb\x14\x71\x8b\xb2\x73\xe3\x9c\xfe\xe6\x81\xc7\x8a\xf0\x39\x9b\x90\x4f\x2c\x93\xd7\x4c\xe1\xe9\x9e\xde\x56\x54\x68\x2e\xc5\x3b\xca\x0b\x7b\xb6\xfe\x8c\x1b\x6f\x37\xa9\x35\x53\xed\x10\xc8\x28\x44\x23\x5c\x70\x87\x48\x16\x7b\xfb\x2b\x28\xa1\xbb\x89\x5d\xcf\x65\xd0\x55\x8a\x5d\x73\x59\x6b\x5f\xf9\xa0\x36\x28\x69\x68\xe3\x2c\x44\x33\x3e\x9d\xf9\x87\x7d\xc6\x2a\x44\x5d\xab\x3c\x5c\xe2\xde\x90\x69\x43\x4d\xad\xdb\xe5\xa7\x33\x08\x3c\xdc\xa1\xe8\xab\x80\x47\xbb\xa3\x84\xa4\x14\xd7\xb1\x02\xc5\xae\x32\xc4\xf7\x58\x1f\x03\xa7\x1e\xbb\xbb\xec\x4b\x7d\x34\x65\x4d\x32\x59\x56\xb5\x61\xd1\x9d\x77\xb7\x2b\x0d\xa9\xdf\x10\x99\x5a\xfd\x9f\x5e\x95\x54\xd0\x29\x1b\x06\xd0\x86\x4d\x95\x8f\x57\xc9\x28\x7d\x12\xb4\x22\xc9\x9b\xff\xc4\xe3\xd9\x55\xe7\x68\x8f\x64\x75\xf6\xc8\xa3\xd4\xda\x23\xe9\xeb\xed\x91\xc7\xaf\xb9\x47\x42\x09\xd4\x5d\x25\x40\x9f\x1c\x7c\x8b\x24\xc8\x09\x19\xab\x48\x50\x4a\x55\xd9\x09\x1b\x0e\x16\xae\x89\x2c\xb9\x31\xcc\xa7\x23\x06\x92\x32\x20\xdc\xb4\xaa\x63\x3a\x02\x0a\x0e\x4e\xcc\x1e\x64\xb7\x55\xc1\x33\x6e\xa2\xf6\x75\x1d\x0b\x48\x2c\x0e\x30\x20\xdc\x70\x8d\xa2\xbc\x20\xbc\xac\x0a\x16\x24\xf0\xa1\xab\x2e\xe4\x9d\x70\xe1\x6d\x32\xc8\x4d\x21\xec\x16\x5c\xb1\x08\xf0\x0b\xdd\xde\x70\xbc\xd0\xed\x7b\xc6\x0b\xdd\x4e\x4e\xb7\xb1\x76\x69\xff\x52\xc0\x2d\x7a\xed\x27\x75\xdd\x97\xe8\x98\x15\xe4\xe7\x9a\xa9\x39\xb1\x0a\x56\x53\x17\x44\x5a\x62\xa7\x79\x8e\xf5\x2b\x7c\x4c\xc7\x0e\x79\x08\x52\x0a\xe7\x10\x33\x72\x7a\x6b\xf5\x5b\xe8\x4a\x91\x9c\x4b\x2e\x2e\xd0\xee\x7d\x85\xa7\x10\x4e\x26\xd6\x4a\x31\x91\x2a\xfe\x04\x54\xcc\xa3\xf3\x93\x94\x06\x8c\x14\x69\x2a\x24\x5d\xaa\x0a\x79\x24\x21\x83\x90\xa3\x15\x7b\x8d\x67\x12\xbe\x01\x3e\x1e\xd2\x9a\x82\x37\x97\x5c\xb1\xf9\xc0\xa5\x7a\x12\x8b\x81\xd4\x3f\x9c\x08\x44\xcc\x9e\x47\xf1\xe7\x8a\x61\x1c\x47\xbf\x5e\xa5\xed\x91\x98\x21\xa6\x74\xd5\xe1\x18\xda\xd7\x4e\x36\x97\x3f\xa2\x34\x3c\x3a\x31\xcf\x27\xf6\x55\x53\x4d\xb5\x70\x67\x2c\xee\x38\xeb\x36\xe2\xbc\xfd\x20\x54\xa3\x0c\x68\x0e\x95\x42\x81\xe0\xa7\x41\x2f\x92\xda\x99\x80\xc3\x1f\xe3\x23\x6d\x56\x32\x02\x43\x22\x58\xdb\xf5\x0c\xaf\xd8\x7c\x5f\xbb\x36\x24\x52\xe8\x19\xaf\x40\x7c\x87\x60\x26\x39\x49\x7a\xc5\x71\xfc\x00\xe9\xb0\x1e\x18\xe4\x1b\x67\x62\x40\xce\xa5\xb1\xff\x9c\x42\x71\x0a\x20\x2f\x27\x92\xe9\x73\x69\xe0\x93\x9d\xc6\x02\xdc\xa4\xe7\x80\x03\x2e\xe6\x88\x43\xc4\x0f\xb0\x57\xac\x5f\x0d\xb5\x0a\xdd\x59\xfb\xac\xa3\x80\x2f\x5c\x93\x33\x41\xa4\x72\x47\x94\x10\x1c\x30\xcd\x23\x48\x08\x8c\xf7\x77\x37\x41\x81\xcb\xa0\x71\x38\x22\x55\x0b\x45\x9e\x04\x30\x07\x14\x78\x7d\xf0\x1b\xf0\x6e\x41\x2c\xac\x2f\x5d\x00\x45\xaf\x14\x35\x6c\x9a\x20\x88\xb7\x19\x25\x53\x53\xe8\x13\x94\xcd\x52\xdf\x86\x54\x82\x16\x8e\x84\xe2\x16\x8e\x47\xb8\xb2\x8f\x9a\x2d\xfc\x24\x0b\x80\xec\xfe\x1e\x4a\x7c\xec\xaa\xf5\x2c\x02\x11\xa5\xd8\x92\x56\x96\xde\xfc\x97\x15\x56\xe1\x7a\xfd\x37\xa9\x28\x57\x7a\x44\x8e\x88\xe6\x62\x5a\xb0\xd6\x77\xce\x59\x1c\x4d\x93\x08\x2c\x88\x65\xb1\xf2\xe1\x35\x2d\x18\xd6\x69\xa2\x82\x30\x34\x57\x41\x7d\xee\x05\xc5\x68\x40\x6e\x66\x52\xa3\xe4\x1b\x52\x0c\xf6\xae\xd8\x7c\x6f\x90\xc4\x15\x46\x62\xfe\x6c\xa7\x3e\x13\x7b\x4d\x23\xb8\x16\x25\x0a\xb2\x3f\x44\x3c\xee\xc1\x77\x7b\x4f\xa3\x8f\x3d\x03\x73\xd5\xb3\x48\x72\x72\xee\xc6\xe3\x82\x62\x88\xc0\xae\x39\xd7\x17\xe1\x5b\x8c\xf8\x81\x4a\xf7\xd1\x33\x4d\x78\x87\xab\x72\xb6\x73\x5e\x5c\xa8\x5b\x9c\xa8\x78\x46\x02\xe4\x42\xb0\x8e\x8c\x51\x7c\x5c\x1b\xa6\x77\x16\x13\xee\x05\x34\x2a\xeb\x16\xfa\xa7\xda\x93\xff\x61\xd9\x0f\xa2\x0a\x78\x5c\xa7\x42\x8e\xb3\xc9\x62\xec\x64\x54\x52\x37\xae\x8b\x20\x95\xab\xb0\x77\x27\x0b\xcf\xfe\x4d\x03\xa8\xae\x86\x7a\xff\x70\xaa\x26\x58\x53\x31\x5d\x49\xcc\x3a\x5b\xba\x31\x4e\x90\x9c\x51\x0d\x51\xf7\x13\x17\x14\x55\xd5\xaa\x92\x50\x0b\x9d\x8a\x3b\x97\x31\x49\xdd\x08\x57\x24\xc4\x17\x61\xc2\x82\x73\xe1\xe6\xda\xfb\x1e\xfa\x5f\x1e\x2d\x74\x7e\xc1\x90\x91\xa8\x8b\x84\x90\xcb\x5f\xae\x37\x9c\x3e\x5d\x09\x6d\x01\xa1\xe6\x3d\x82\x88\xd5\x05\xf7\x31\x88\x36\x0a\xa6\xb1\x9a\xad\x89\x63\xe6\x8d\x6c\xc3\x0f\xa5\x10\xb1\xe5\x45\xef\x16\xaa\x04\xf1\xb0\x16\x4d\xd8\xae\xe7\xd9\xcb\x53\x4c\xa0\xcf\xc6\x58\xd6\xc2\xa1\xac\xef\xd0\xf1\xb8\x1b\x68\x77\xc4\xd7\x9f\x0c\x60\xb9\x8b\x10\x95\x2d\xe1\x13\xbb\x2f\xae\x3a\x64\x8a\x7d\x69\x45\x54\x43\xc4\x9e\xc2\x43\x1a\xcf\x97\x53\x16\x92\x4b\x86\x27\x0a\x50\x0c\xf0\x1c\x97\x6f\xa5\x7b\xb9\xfe\xcc\x0e\xb3\xb6\x28\xb9\x60\x78\x53\xb5\xa1\x86\x41\xba\x90\x62\x93\x02\x6b\xd2\xb9\xdd\x2b\x65\xce\x27\x2e\xeb\xe2\x32\x8a\x5e\x1a\x60\x81\x52\x57\x47\x34\x6e\x42\xda\x1b\xbc\x54\xc7\xd1\xab\x37\xcb\xb0\xa1\x92\x43\x60\xa5\x2c\x81\x13\x74\xad\x24\x97\xe5\xfc\xe4\xfe\xe8\x49\x72\x20\x27\x13\x7b\x5c\xbe\x3f\x55\x1a\xd7\x50\x32\x9e\xff\xa1\x77\x4f\xf4\xc7\x62\xf2\xd0\x5a\xdb\xb7\x11\x69\xb5\x37\x6b\xf2\xca\x1f\x49\xce\xfb\x01\x58\x8a\x9c\x90\x77\xbc\x60\x7a\xae\x0d\x26\x8c\xf2\x12\xe9\x3e\xa6\xd4\x4a\x43\xb8\xc8\x8a\xda\x05\x20\x22\x17\xb0\x74\x77\xc7\x4e\x38\xb9\x18\xd7\x4c\xeb\xe5\x70\x9f\xc9\x7e\xa7\xd4\xef\x22\xa5\x84\x34\xe7\x70\xbd\x92\x9c\x56\xaf\xdd\x9a\x74\x2a\x85\xd9\xda\x8d\x49\xd6\xb6\x5f\xbf\xe3\x63\xc5\xc8\xf1\x8c\x0a\xc1\x8a\xa8\xc7\xa6\x0b\x77\xa1\xc6\xd0\x6c\x86\x5c\x87\x12\x4b\xf1\x0a\x66\xa5\x86\x99\xd4\x86\x94\x34\x9b\x71\x11\x9a\x73\x89\xd0\x6b\xb6\xa9\x9c\xfc\x0c\x9b\x03\x4c\xf4\x67\x0b\x40\xc7\x73\x4e\x45\x5c\x10\x0a\x8f\xb1\x93\xe6\x62\x03\x55\x31\x92\x40\xe8\x54\x82\xc6\x84\x77\xe6\x0e\x7d\xb3\x3d\x95\x82\xb3\x46\xeb\x0a\xf0\x77\x78\xb6\xfb\xca\xa7\xb7\x23\xb2\xc7\x6e\xcd\x6f\xf6\x06\x64\xef\x76\xa2\xed\x3f\xc2\x4c\xf4\xde\x88\x9c\x95\x21\xb8\x8a\x8b\x48\xdc\x61\xee\x07\x56\xc4\x8a\x84\xc5\x7e\xa5\x97\x7b\x50\xac\xa2\x16\x49\xf0\x63\xbf\xa8\x85\x3d\xe2\x8f\xae\x7d\xf5\x5b\xf2\xee\x98\x18\xaa\xa6\xcc\xd8\x35\x88\xa8\xcb\x31\x53\x5d\xdb\xdc\xa6\x08\xb6\xc1\x2e\x25\x30\xcb\x37\x5f\x77\x9a\x43\x31\x9a\x7f\x14\x45\x67\x7f\x68\xaa\x0b\xe5\xe1\x68\xef\xf7\x49\x14\xec\x37\xa1\x85\x66\xe4\xc0\x3e\xf8\xea\x46\x71\xc3\x0e\x47\xe4\x93\xff\x15\x94\x0c\x00\x99\x79\x22\xfb\xc8\xa5\x98\x69\xe3\x26\xd5\xcc\x60\x9d\x67\xe1\x04\xb5\x0f\xf6\x52\x77\x96\x56\xf1\xc0\xc7\x52\x16\xac\x63\x19\x7c\xc4\xbd\x1f\x7f\x3c\xef\x6c\x4e\x6c\xe3\x77\x33\xdf\x7d\x68\x7e\x23\x55\x91\xdf\xf0\xdc\x25\x6b\x91\x03\xfb\xf0\x61\x3f\x94\xef\xe3\x8e\xe9\xe9\x7c\x49\xdd\x0a\x30\x8d\xdf\xe3\xe6\x86\xe7\x69\x4e\xb4\xc7\x05\x04\x20\xda\x38\xe0\x8d\x49\x16\x07\x08\x20\x01\xcf\x99\x30\x96\xb8\x2b\x4d\x0e\xe0\x17\xdd\x6b\x8f\x9e\x72\xec\x15\x03\xeb\x4a\x45\x32\x59\x8e\xb9\x68\x5a\x39\x35\xb8\x69\x05\x18\x4b\x6f\xbd\x97\x52\x33\x83\xfd\x17\xa0\x12\xa4\x34\x33\xa2\x79\x59\x17\x86\x0a\x26\x6b\x5d\x74\x2e\x41\xf2\x82\x9e\x77\xc6\xa4\x60\xb7\x48\xfb\xb6\xd5\xa8\xb2\x81\xa0\x2d\x19\x43\x75\x8f\xa6\x9b\xde\xa2\x68\xdc\x69\xad\xa6\xa4\x54\xfe\x2a\x88\xd6\xa1\x37\x0c\xbb\x65\x99\xab\x3c\x5b\x15\xf5\x94\x77\xac\xbe\x7f\x62\xdf\x22\xa3\x86\xe5\x6f\xc9\xbb\xe6\xe5\xa0\xae\x99\xff\x66\x44\x8e\x7d\x1c\xa8\x5b\x9e\x1c\x5f\x9e\x9d\xb8\x86\x6a\x42\x1b\x46\xb7\x21\xbb\xf7\x0b\x3a\x1b\x3a\xf3\xf5\x16\x94\x06\x5c\x38\x09\x89\x6d\xba\xda\x2d\xfa\x8c\xdc\x37\xae\x5b\x79\xe8\x3a\xdd\xaf\x01\x58\x6f\x92\xf0\xa2\x2f\x6d\x4d\x5f\x8a\x9b\x54\x47\x60\xe5\xac\x62\xc2\xf2\x3c\x11\xdf\x7f\xdc\xe7\xad\xa1\x89\x84\x33\x4e\x24\x57\xba\xc9\xda\x42\x65\x64\x03\x9d\xc9\x22\xd7\x84\xdd\x1a\x45\x2d\xdb\x2f\x2d\x83\x0f\xbf\x99\x10\x2a\xe6\xa3\x7e\x22\x66\x2f\x57\x7e\x5a\xf7\x7d\xef\x93\xd9\x6d\x0d\x2d\x7f\xd1\xd0\xe2\xa1\x59\xa6\x98\xe9\x51\x7a\x2e\xd5\x69\x05\x40\xda\xc7\xd5\xfa\xf8\x8e\x81\x15\xbf\xf5\x85\x2d\x5c\x28\x4e\x1f\xbb\xb1\x66\x42\x73\xc3\xaf\x5b\x1d\x55\xa1\x74\x2c\xd5\x3a\xd8\x21\x41\x98\x72\x04\x50\xb7\xaa\xba\x76\x5e\x18\x7d\xa2\x7c\x42\x84\x5c\x78\xab\xb8\xdc\x47\x08\xbf\x6c\x3d\xd2\x79\xd1\x10\xbb\x54\x62\x33\x72\x2a\xa0\x48\x24\x4e\x3e\x80\xfa\x74\xf8\xdf\x18\xbe\x64\xf7\x20\xb2\xc6\xc2\x2e\x74\xdf\x69\xb7\x7b\xdb\x23\x9b\x29\xc2\xf4\xfb\x56\xf5\x49\xe9\x3b\x3a\x8f\x44\x3b\x5f\xd0\xa5\x9f\x7b\xa1\xdd\x7d\x8f\x4d\x26\x2c\xb3\x77\x03\x3a\xfe\xf9\xf6\x75\x56\xad\xcd\x6b\x74\xfb\xf9\x22\xae\xed\x22\xac\x7d\xcb\x15\x46\xd1\x04\x4d\xc4\xef\x99\xd0\x86\x42\x5d\x4d\x78\x63\x2b\xa7\x59\xe1\xc9\xf5\x6c\x74\xd7\x09\x63\x23\x7c\x75\xce\x9e\x40\x94\x56\x0c\xcb\x98\xb2\x37\xa6\x98\x93\x1b\x25\xfb\x26\xba\x6d\xe8\x03\x96\xd7\x4c\x5d\x73\x76\xf3\xca\x55\xf9\x19\xda\x97\x1d\xba\xc2\x89\xaf\xc0\xdc\xf5\xea\x57\xf0\x4f\x0f\xa8\x12\x79\xdf\x1c\x97\x7d\x4b\xf6\xf6\x52\xd8\x05\x7a\x87\xfb\x4d\xa0\x71\x69\x27\x85\x2a\x8d\x4d\x00\x96\x5f\x70\x95\xb9\x0f\x9d\x41\x60\x1d\xd7\x98\xe3\x35\x91\x40\x6e\x2f\xbb\x9f\xc8\xc5\x8e\x10\x6d\xf1\xa4\x29\x4c\x55\x0b\xd1\x39\x27\xb3\xad\xfb\xe3\x32\x2d\xc5\x3f\x04\xd8\x70\x31\x34\x8a\xb1\xf0\xaa\xc6\xa9\x4f\x42\xfa\x66\xf1\x41\xb1\x79\x86\x4e\xbc\x9c\x1a\xaa\x99\xe9\xe3\x4c\x4e\x45\xea\x23\x50\xec\xfe\xc6\x54\xdf\x7d\x05\x31\x6a\x0c\xaa\x7b\xfb\x7e\x98\x64\xf8\x27\xa7\xfa\x8b\xd6\x93\x56\xe9\x77\xe7\xda\x9d\x93\x63\x15\x27\xe8\x70\x83\x36\x20\x5c\xbb\x41\x92\x6d\xe9\x88\xee\x2d\xbf\xff\xfe\xec\x24\x8d\x29\xa5\x99\xcf\x5b\x06\xe0\xbf\xdb\xdb\xef\x2e\x29\xc4\x96\xf1\x9f\xeb\xd8\x08\x6d\x9f\x6c\x2e\xbe\x7b\x7e\x1b\xbb\x33\xcd\x58\x13\x9c\x70\xc2\xf5\xd5\xb6\x28\xe3\x1d\x40\xda\x34\xf2\x2f\xc7\xa7\xc4\x7d\xba\x2a\x92\xa0\xd3\xd2\x4f\x13\x7d\xd0\xa6\xa1\x7f\x39\x3e\x5d\x78\xdd\x05\x33\xea\x51\x51\x78\x5b\x8f\x14\x3a\x14\x42\x75\xd4\x35\xd1\x16\x03\x6d\xb6\x12\xbd\x62\x39\x57\x18\x52\xe7\xdf\x32\x1f\x65\x9a\x87\x46\x71\xd3\x2b\x36\xe2\x32\x0a\xe5\xed\xb6\x05\xbd\xa2\xdd\xf4\xaf\xa6\x19\x6b\x02\x25\x73\xae\xaf\x9e\x9f\x25\xb9\xca\xcf\xbb\x15\x06\xfe\xd2\xc2\x4f\x16\xcd\x9d\x8e\x76\x3a\x21\x08\x6e\xf7\x5c\xd6\xe4\xc6\xf5\x6b\xef\x69\x66\xfd\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\x26\xab\x79\x11\x04\xab\x61\x3f\xba\xd1\x95\x96\x55\xc1\xf4\xdb\x2d\x87\xaa\xec\xc4\x55\x24\x29\x78\x7b\x45\x95\x01\xab\xe7\xb6\x51\x3b\x00\xe2\x45\x82\xe8\x03\xf1\x98\xb8\x7d\x36\xf1\x75\xa7\xda\xc1\xeb\x5c\x87\xc9\x9b\xc8\x6e\x90\xfe\x52\xe0\xef\x3b\x19\x34\x96\x57\x39\xbb\x7e\xa5\x73\xfa\x66\x00\xaf\xe5\xeb\x66\xb6\xf7\x80\x6a\xb2\xf7\x66\xaf\xfb\xca\x97\xbc\xe4\x05\x55\x05\xf6\x91\x09\x0d\x7a\xc2\xfc\x96\x43\x7a\x40\x20\x55\xef\xf5\x1e\x39\x90\x0a\x20\xca\xa8\x20\x05\xf3\x3d\x67\x1c\x25\x9d\xa3\x71\xa0\x47\x24\xf2\x4e\x5d\xa1\x6d\xc7\x63\x21\x63\xdb\xfa\x25\xcc\xbd\x3e\xe4\x64\xee\xd8\xcf\x79\x71\xd2\x88\x8f\x5c\x58\x19\x6c\x44\xbe\x77\x92\x9d\x93\xcd\x11\x6b\x73\x10\xc8\xf0\x89\x2f\x03\x3b\xbe\x24\x37\xce\x82\x43\xe6\x51\x1d\x2b\xe4\x6e\x24\xdf\x17\x82\x11\x5d\x9d\x45\x53\x6e\x3e\xb1\x4a\x6e\x4d\x4f\xc4\xe5\x17\x42\x6a\xb8\xb1\x1f\x48\xcd\x8d\x54\x73\x42\x0d\xa1\xc8\x19\xb2\xba\xa0\x8a\x28\x86\xc1\x31\x09\xd4\x36\xb7\xfa\x82\xb2\xf6\x59\x36\x11\x38\x71\xdd\x47\x67\x86\x0e\xf0\x0d\x1c\x37\xee\xe8\xa3\x3b\xb5\xfc\xea\x84\x2b\x4b\xa5\x21\x33\xfe\x4c\x70\x73\x1c\x16\xc3\x12\x54\x85\x14\x2e\x47\xc7\xae\xe8\xa2\x70\xa6\xdc\xb8\xb6\xc4\x08\x80\xfd\xda\xcf\xd6\x09\x14\x80\x00\x68\xaa\xcc\xf7\x75\xf3\xc6\xcf\x30\xb6\xa7\x41\x9c\x6d\xd8\x13\x41\xed\x96\x6a\xeb\xd4\x35\x00\x12\x1a\x6b\x60\x1c\x6d\xf3\x79\x3f\xc1\x11\xe2\x5c\x84\x0c\xce\x59\x22\x15\xd1\x86\x2a\x83\x77\x64\x7f\x34\xda\x1f\x81\x28\xbb\x3f\xda\xf7\x8a\x58\x11\x52\x88\x9d\xb4\xd7\x00\xe3\x53\x28\xfb\x14\x79\x68\x53\x8d\x11\x21\x1f\x7d\xa5\x54\x68\x01\xba\x90\xc5\x1c\x12\x94\x8b\x22\xbc\x03\x34\xaa\x69\xd3\x9e\x1e\x9e\x50\xf0\xe7\xd6\xe3\xf8\x25\x5d\x32\xf4\x94\x5f\xbb\x0e\x7a\x5b\x0b\xb3\x69\x5e\x31\x09\xa6\xc6\x3b\xe6\x0c\xa8\x9f\xde\x6f\xef\xdd\x90\x74\x27\x7a\x33\xc7\x07\xdc\x7b\x65\xb2\x2c\xb9\x21\x33\xaa\x67\xc1\x8a\xd7\xa4\x25\xf7\x63\x4d\x7d\x8d\xbf\x45\xad\x0d\x53\x93\x4e\xb4\x2b\x09\x33\xf7\x00\x2c\x18\x7b\xc3\xc7\xae\x8e\xb3\x68\x4c\x31\xc0\xe4\xf4\x8c\x2a\x66\x9f\xac\x80\xfb\x14\x7c\xc2\x0c\xef\x7a\x39\x5a\xfc\x3d\xac\xbc\xda\xb9\xd5\x00\x9e\xd8\xbd\xb5\x54\x48\x64\x4e\xe9\xf6\xed\x5c\x9c\x40\xf8\x2a\x40\xf1\xea\xd3\xe9\xd1\xc9\x87\xd3\x51\xd9\xc5\xc3\xb2\x65\xf6\xcb\x44\x5e\x49\xde\xb5\xa3\xc6\x90\x54\xd4\x74\xe9\x5b\xdb\x97\x71\x07\xb0\xb7\xcd\xb8\x03\x20\x9e\xe0\xf8\x0f\x50\xf5\x85\xfb\xe2\x3a\xec\x44\xe8\x6d\x64\x25\x0b\x39\xed\xd1\xf4\xb4\x1f\x9e\xfe\x0a\xeb\x58\x0c\xe9\xb0\x92\x5b\x73\x0b\x5a\xd4\xd9\xf6\xf1\x59\x18\xfc\xc9\x35\xc7\x13\xac\x5b\xa6\x47\x4d\xb9\x2f\xe0\x84\x9e\x85\xed\xe1\xce\xb1\xa1\xbd\x1e\x78\x17\xcb\x51\x8a\xb3\x13\x0c\xa1\x32\x58\xc5\x54\xc9\xb1\x7a\xd9\xae\x1a\x25\xb6\x82\x25\x5d\xed\x11\x56\x2a\xb8\xe8\x78\x91\x53\xa0\x87\x5f\xbf\x2d\xc2\x54\x8a\x0d\xa1\x44\x88\xd5\xbe\x27\xbc\x80\x72\x47\x8d\x64\x1f\x49\x34\x9d\x16\xf5\x3e\x6a\xef\x04\xc7\x99\x8b\xf9\xa2\xaf\xba\xd1\xcb\x43\x2c\x02\x36\x17\x2e\x8a\x6e\x99\x62\x50\x31\xca\x8a\xb1\xce\x6f\x46\xa7\xf0\xc2\x52\xb9\x3e\x95\x95\xe2\xd7\xbc\x60\x53\x0b\xc2\x8c\x8b\xa9\x6e\xfa\x5c\xb9\xf0\xbd\x4e\xcb\x42\x25\x2b\xd6\x48\x81\x21\x0c\xea\x03\x04\xe3\x85\x16\x10\x78\x35\xcf\x3f\x7e\x26\x82\x21\x08\x1d\x2f\x59\x4f\x53\x9d\x05\xb2\xa3\x60\xb2\x6d\xff\xf4\x76\xc4\xa9\x9d\x61\xc5\x3e\x84\x67\xd9\x55\xed\xe5\xa2\x43\x6f\x18\x32\x7b\x4a\xf4\xbc\x2c\xb8\xb8\x82\xc6\x30\x8e\x9d\xb8\x26\x8b\x8c\xd8\x2f\xfc\x05\x56\x8c\x16\xe9\xc5\x80\x27\x42\x65\x92\x42\x04\x30\x3b\x10\xb5\x00\x4a\x9e\xa5\x7a\x7f\xf5\xc4\x1e\x7d\x0b\x49\xf8\x77\xe7\xc8\xd8\x67\x7d\xb4\xbc\xa4\xd3\xad\xa5\xe6\xc2\xe2\x2d\x86\x2d\xc8\xc7\xe3\x33\x9f\x69\x71\x10\x9b\xf0\xf1\x59\xa9\x08\x55\x86\x4f\x68\x66\x0e\x49\x55\x17\x85\x33\x0a\x78\x21\xcf\x51\x89\x7b\xa2\x75\x3b\x01\xf9\xb9\x31\x3a\x42\xca\x8b\x96\xc5\xb5\x5d\xd5\x90\x4a\xe6\x68\x3b\xad\x2b\x17\x02\x8c\x05\xf4\xc8\xcd\x8c\x67\x33\x72\x51\x17\xc5\x85\x2c\x78\xe6\x03\xdf\xb9\x46\xf7\x44\x6e\xd9\x42\x47\xbe\x70\x54\xdc\xd0\xb9\x7e\x1b\xbf\x25\xa1\xf0\x19\xa1\xc6\xb0\xb2\x42\x64\xb6\x5b\xb3\xd8\x08\xb6\xf1\x50\x80\xb0\xc8\x2d\xa0\x40\xf2\x28\x2f\x02\x65\xac\xdd\x07\x1d\xf9\xf5\x90\x9c\xb3\x6b\xa6\xda\xf0\x09\xfb\x11\x4c\xad\xdb\x30\xc1\xd1\x81\x34\x5e\x6b\xb0\x23\x15\x32\xa3\xc5\xdd\xa3\x7e\x00\x76\x3e\x59\x98\x96\x6b\xb1\x6f\x88\xc3\xaa\xae\x2f\x72\x36\x39\x97\xe6\x02\xe7\x68\xbf\x0f\xbe\xc9\x3d\xab\xd2\xc2\xea\x18\x73\xbf\xba\x45\x87\x9c\xeb\xab\x5e\xaf\x10\xec\x5e\xf1\xf1\xf4\x45\xe6\x29\x33\x16\x9d\x87\x01\xa3\x1d\x0c\x16\xab\xe1\xbb\xdc\xbe\xac\xbb\x5f\x8a\xb9\x82\x97\x03\x87\xdc\x71\x81\x4b\x76\x43\x14\x2b\xa5\x41\x39\xd7\xc2\xeb\xdc\x02\x99\x2c\x19\xa1\xd7\x94\x17\x74\x5c\x40\xac\xb3\x9d\xdc\xcd\xd5\xd9\xda\x7a\x04\x3b\x00\x11\x64\xd2\xdf\x47\x8b\x2d\x01\xe7\x11\x7f\x5c\xb1\xf9\xf8\x92\x22\x58\x85\xcc\xae\x62\x59\x75\xa2\x64\x89\x8f\x60\x9e\x7e\x0e\xb9\x63\x34\xcf\x89\xe6\x53\xc1\x27\x3c\xa3\xc2\x90\x82\x1a\x26\xb2\xf9\x88\xb8\xf6\xb5\x3a\xf8\x3e\x14\x33\x8a\x87\x3c\x7f\x21\x55\x49\x0b\xbf\xc9\x63\x9a\x5d\xc9\xc9\x04\x66\x6d\x9e\x77\xa1\x6d\x8e\x58\xe1\x9e\x50\x2d\x05\x2e\xce\xb4\xa6\xd3\x1e\xc4\x0a\xfa\xd2\x5b\x01\xca\xa5\xa2\xe0\x29\xb9\x82\xb4\x9e\x50\xfa\x6a\xb3\x3e\xd9\x41\xf9\xe2\x76\x4d\xf1\xba\x80\xaf\xaa\x16\x86\x5b\xf2\xd7\xea\x58\x47\xc0\xc7\x7a\x27\x54\xd7\x2e\xe5\xda\xff\x41\xb9\x0d\x57\x94\x0e\x92\xd7\xae\xa1\xb7\x05\xc2\x77\x27\xc2\x6f\x91\xd4\x43\x9e\x53\xf7\x5d\x88\xf8\x08\x60\xb3\x7f\x71\x6e\xa1\x76\xc5\xd4\x1b\xe9\xf2\x00\x2a\xe5\x35\x48\xf1\xb7\xaf\xfe\x3e\xba\x8e\xe3\x16\xe0\xe7\x56\xe4\x38\xb4\xf0\x96\x4c\x4d\xb1\x6e\x1c\x23\x25\x15\x7c\xc2\xb4\xc5\x90\xb9\x45\x27\xe7\x8f\xd2\xb4\x64\xe4\xc6\x22\x12\x46\x0d\x2f\xbc\x5e\x47\xfa\xfa\x79\xc1\x03\x16\x9d\x68\x63\xda\x38\x50\xf2\x10\xce\x02\xda\x44\xdc\xb2\xac\x36\x70\xff\x20\xce\x92\x1c\x08\x69\x3f\xeb\x18\x6f\x75\x59\x8f\x51\x7c\x86\x65\x17\x5e\x0d\xd3\x12\x85\x34\xd1\xe9\x3e\xb8\xb3\xba\x1e\x57\xb8\xaf\x6c\x62\xe5\xa8\x37\xa3\x6f\xbe\xe9\xbe\x39\x98\x1d\x07\x6b\x6a\x96\xd5\x8a\x9b\xb9\x25\xbc\xec\xd6\x8c\x26\xfa\x2f\x4a\xd6\xd5\x31\x14\xf5\x75\x8c\x79\x46\xc1\x65\x80\xa9\x74\x78\x21\x9b\x4b\x61\x11\xf5\x19\xe6\xc6\x54\x41\xee\xd8\xb6\xbc\xee\x36\x79\xe2\x88\xb3\xbd\x31\xcd\xb5\xd4\x23\x72\x21\xb5\xe6\x16\x33\x43\x05\xff\x1e\xc9\x9b\x3b\x2e\x19\xd9\xf1\x85\xc8\x46\x04\x34\xe9\xdd\x96\x8e\xba\xbe\x57\xac\x11\x22\x46\xd9\xd5\xdf\x42\x73\x37\x43\x0c\x9d\xb6\xf2\xbf\x07\xf6\x24\xe2\xad\x68\xba\xbc\x6e\x31\x42\xc0\xed\xd2\xb6\x6f\xff\x27\x6f\x02\x23\x67\x8b\x48\xdb\xae\x1c\xe0\xea\xe4\x77\x3f\xb4\x6f\xd9\x8c\x5e\xb3\xa5\xac\xb7\x92\xf9\x68\x09\x07\x82\x6b\xd4\x7d\x41\xab\xda\x85\x54\xfc\x50\x87\x5d\x6b\x56\x42\x91\xe5\x7b\x44\x80\x65\x52\xce\x78\x4e\x0a\x29\xa1\x08\x6d\x5d\x11\x21\x73\x66\x2f\x00\x04\xc1\xd2\x42\x0f\xc8\xe5\x91\x7b\xb0\x8a\x96\xc4\xd6\x27\x20\xd9\x56\x2c\x5b\xf2\xc0\x93\x59\xa9\xa2\xae\xbf\x28\xd6\x74\xcf\x0c\x69\xe5\xb6\x4b\x57\x70\x02\xb2\xc9\xc0\x22\x37\xe3\xd3\x19\x53\xa4\x60\xd7\x0c\x02\x7f\x26\x7c\x4a\xb0\x09\x71\xe9\x5a\xd4\xf8\x78\x7b\xa9\xa0\x29\xaa\xe2\x79\x77\xc3\xd0\xa2\xb4\x66\x8f\xf4\x46\xaa\xab\x42\xd2\x3c\xaa\x09\xaf\x49\xc1\xaf\x18\x39\x61\x55\x21\xe7\xae\xaf\x8c\xc8\xc9\xa5\xa1\x86\x4d\xea\xe2\xb2\xc7\x51\xf4\xb3\xea\xe8\x4c\xf3\xad\x59\x75\xec\xe2\x0b\x56\x9d\xb3\xcb\xe3\xcb\xb3\x67\x9f\x39\xb8\x81\x8f\x0e\x36\xe1\x39\xc7\x83\xf0\x9f\xbb\x45\xd0\x0d\x49\x51\x77\xfd\x25\xc6\x3a\x5e\x48\x65\x68\xb1\x05\xc1\x39\x9b\xd1\xea\xa8\x36\xb3\x13\xae\x33\x4b\x41\xd2\xc8\xcf\x77\x66\x8d\xaa\xc8\x33\x70\xd6\x39\x65\x89\x70\x7f\x49\xdc\x73\xc7\x7f\x3d\xba\x20\xb4\xb6\x28\x6c\x78\x06\x42\xd1\x56\x5c\xbb\x24\xda\x9b\x4b\xec\xf8\x95\x74\x67\xdc\x9c\x0f\xec\x8b\x7f\x6a\x97\x76\x65\xd7\x92\x39\x97\x65\x53\xbe\x24\x74\x3e\xab\x84\x4e\x60\x1c\xdb\xd2\x1d\xb8\xe0\x86\x53\x23\xd5\x2e\xe4\x90\xb5\x80\x09\x61\xbc\xb5\x36\xb2\x74\x24\xe1\xcc\x3f\x01\x55\x37\x7a\xb9\x85\xef\x2c\xd6\xc4\x06\x43\xe0\x10\x1c\xcb\x99\x30\x4c\x4d\x68\xc6\x16\xea\x05\x0f\xc0\x06\x8e\x30\x71\xff\x4c\x67\x68\xfe\xe8\x42\xfe\x2b\xe0\x83\x7f\x7a\xfb\xc7\x28\x63\xf4\x4f\x41\xdb\x70\xf6\xf8\x58\xb1\x10\x2c\xeb\x6e\x55\x4f\x81\x3d\x3f\xa7\xe1\x0b\xfc\x67\xb1\x90\xfd\x80\x5b\xfb\x6f\x35\x2d\xf0\x48\xfa\x1c\x77\xff\xd7\x6c\xa1\xc2\xd6\x6f\x49\x1b\x31\xdd\xbe\x05\x2c\xc4\x7a\x34\x40\x99\xd1\x8e\x24\xdc\x66\x1a\x45\x85\xb6\x28\x96\xc6\x56\xb2\xef\xb4\xaf\x7d\x72\x60\xb2\xaa\x73\x32\x6f\x82\x72\x57\xa1\xd4\x95\xfb\x8f\x4e\xd3\xa4\xea\x00\x51\xd4\x22\xd6\x84\x70\xeb\x3f\x23\x52\xbf\x0f\x1d\x20\xfa\xed\xd6\xd6\x33\x8e\x81\x4e\x6d\x3d\x00\xdb\x81\x11\x6e\x40\xbc\xd5\xa8\x52\x90\xf7\x5c\x1b\xac\xaa\x8b\x0f\x43\x15\x3d\xac\x22\x6f\x75\xd4\x0b\x22\x15\xe1\xd5\x7f\xd0\x3c\x57\x6f\x51\xf2\xf4\x2e\x51\xd5\xbd\xa8\x23\xd7\x2e\x26\x0f\xea\x39\x7a\x23\xc5\x81\x99\x57\x3c\xa3\x45\x31\x27\x9f\x8f\x2f\x60\x05\x4d\xfe\xf0\xbb\xd7\xa0\xb4\x7e\xf3\xf5\xef\x5e\xf7\xbc\x42\x2f\x45\xe8\x17\xc6\xb3\x08\x61\x7e\x06\xe9\xd3\xbb\x56\xe2\xb6\x55\x90\x16\xda\x9c\x5a\xfd\xf0\x12\xeb\xb1\x5a\xe1\xc8\xb1\x3b\x24\x04\xf6\x76\x05\x51\x2f\xa5\x16\xf9\x52\xf9\x34\x1a\x2f\x95\x4f\x5f\x2a\x9f\xbe\x54\x3e\xbd\x7f\xc4\x76\xce\x6d\xf3\xa3\x18\x16\xe8\x2a\x79\x57\x6e\x42\x91\xe9\xe2\x4b\x17\x99\x3a\xa2\x5a\x57\xc2\x9b\xe2\x00\xe3\xaa\x3a\x7d\xda\x84\x34\xdd\x2f\x4e\xce\x2f\xff\xe3\xfd\xd1\xb7\xa7\xef\x61\x57\x5d\xf1\x1e\x7b\xbd\xb9\x48\xee\x3b\xd9\x1a\x89\xe9\x77\xde\xdb\xcb\xd3\x16\x0b\x19\xda\x82\x9c\xbf\xbb\xdc\x30\x39\xfb\x29\x0e\x6f\xd1\xa6\x29\x26\xdd\x4f\xe9\xb9\x65\xe0\xd8\x9f\x6a\xa6\xb6\xd3\xa6\x68\x67\xd2\x77\xbc\x6f\x97\xdd\xb6\xad\xfe\x16\x5f\x71\x77\xb6\x66\x60\xef\x86\x8c\xe4\x5f\x26\x8d\xd6\x1e\x11\x1e\xdb\xb3\x4f\xa0\x7d\x4a\xb4\xe8\xa7\x11\xab\x54\xdd\xc5\x7a\x75\x7c\x51\x51\x63\x32\xcb\x48\x50\xbc\x50\x56\xcc\xb3\x02\x1e\xd3\xda\x0b\x1b\xff\xba\xf7\xb8\x5a\xe8\x21\x7e\x5c\x50\x5e\x6e\x4b\x20\x58\x0a\x0c\xfe\xe7\x25\x06\xd9\xb4\xb2\xa1\x5b\x51\x77\xdd\x42\x6d\x16\x5b\xa8\xc3\x8a\xad\x80\x37\x10\xca\x2a\x9a\x75\x15\x45\xbb\x61\x45\xb3\x13\x43\x8f\x20\xcd\x47\xf8\x09\xf4\x77\x7f\x86\x82\x08\xc0\xbd\xa5\x6a\xd5\x61\xed\x6d\x13\xa7\x00\xc8\x62\xe3\x44\xba\x09\x4a\x12\xaa\x43\xca\x0d\xa6\xeb\x24\xe8\xb0\xb8\x93\x38\x4b\xbe\x48\x79\xe5\xc7\x27\x36\x97\x6f\xd3\x54\x5e\xcd\xa4\x91\x62\x37\xba\x42\x2c\x83\xa5\xcd\x5a\x2e\xe0\x89\xe3\x10\x19\x1b\xb1\x26\x2c\xe3\x1b\xa2\x3c\x17\xd2\x75\x5d\xec\x66\x8a\x4c\xdd\xb8\x82\xd8\xc5\x32\x88\x57\x17\x13\x5b\xfa\x92\xbb\xd5\x36\xa7\x7f\xd7\x83\xb3\x93\x2d\x70\x91\xe7\x10\x26\xf7\x85\xb6\x90\x7d\xa2\xb0\xb7\xfe\x35\xc0\xf2\x44\x3d\x81\xec\x44\xfe\x8c\xcf\x4e\x9c\x21\xc2\x37\xfc\xd1\x8e\x2e\x90\xfb\x09\xd5\x56\x74\x0a\xa9\xcc\x8d\x54\x5b\x6e\x94\xde\x86\x62\xa1\x8e\x92\xfb\xee\x4e\x73\xb4\x27\xa2\xe6\x6d\xd0\x36\xea\xd1\xb3\xf8\x5e\xf6\xa4\x3a\x01\x74\x4f\x83\x9e\xdb\x7c\xe4\x57\x18\x65\xb2\x8c\x7a\xf3\x90\x9b\x19\x43\x29\xf4\xf8\xf2\xec\x03\x9f\x22\x80\xfe\x5d\xc8\x84\x51\x53\x2b\x36\x9c\x52\xd3\x0d\x20\xae\x49\xb7\x68\xbf\x2d\x73\x21\xc4\xa1\x7f\x65\x4e\x74\x09\x9c\x28\xba\x61\xab\x38\xd2\x97\xc0\x90\x9e\x0f\x23\xda\x39\x9d\xe7\xa5\x41\x76\x6b\x78\xe2\x91\xe4\x7c\xfc\x64\xce\xd1\x69\x71\xb3\x11\x15\x68\x60\x3b\xee\xb9\xad\x88\x06\x4a\xfe\x27\xf0\x9b\xde\x52\x41\x98\x09\xe3\xfb\x80\x4d\xd2\xa2\xb0\x27\x2b\x05\x0b\x69\x79\xba\x49\x32\xc5\x2c\xcb\x92\x56\x2e\xe1\x34\x97\x37\xe2\x86\xaa\x9c\x1c\x5d\x9c\x3d\x3d\xd7\xe9\x5d\xe2\x1f\xef\xd1\x07\x99\x6f\x9d\xfe\x47\xa0\x80\x54\x01\x65\x44\xec\x1f\x63\x6e\x34\xd6\x76\x84\x4a\x8b\x26\x76\xb2\x58\xf1\x2a\x04\xfd\x43\x25\x8f\x71\x20\x0e\x09\x94\x16\x41\x64\x66\x68\xe1\x22\x95\xc6\xcc\xdc\x30\x26\xc8\xeb\xd7\xaf\x31\xbe\xe2\xf5\xef\x7f\xff\x7b\xc8\xe0\x26\x39\xcb\x78\x79\xf7\x41\x78\xea\xb7\x6f\xde\x74\x07\xe5\xdf\x8f\x3e\xbc\x27\x34\x03\x1b\x19\x19\x4b\x33\x73\x10\x01\xea\xc5\x8b\xea\x01\xf9\x3f\x97\x1f\xcf\xbd\x1c\xa2\x17\xbe\x05\xcc\x0e\xdb\xd9\xc3\x06\xe4\xaa\xc3\x70\xa8\xf5\xd3\x44\x40\x50\x33\x0b\x75\x4e\x28\x44\xa2\x45\xf5\x74\x1c\xbd\xec\x91\x50\x05\xcd\xeb\xf9\x74\x06\xc7\xc2\x05\xdc\xc2\x82\x67\xae\x41\x03\xc6\xc5\x60\x7a\xb4\x2f\xea\x89\xc5\x4b\xbc\x08\xd1\x79\x65\xbb\x65\x03\x4c\x68\x76\xa5\x52\x06\xc1\x46\xa2\x98\xae\x0b\x03\x0d\xbc\xc6\xcc\x01\xd1\x60\xac\x66\x9d\x31\x70\x37\x42\xd8\x1d\xe9\xdb\x36\x5d\xf0\x14\xd8\xa9\xaf\x05\xb7\x42\xd9\x24\x54\xa1\x46\x02\x0e\x0e\x57\x72\x4a\xb3\x19\x61\xc2\x40\xab\x0b\x44\x3d\xfb\x78\xe7\xa5\x67\x54\xe4\x96\xa6\x58\x56\x80\x60\x3c\xdb\xf8\xf3\x74\x91\xac\x17\x61\xc7\x5b\x35\xb4\x1a\x4e\x4a\x0b\x29\xa6\xf1\xc5\x6c\x04\xeb\xa8\x86\x50\x0f\x1a\x04\x89\x8d\x50\x51\xd8\x1e\x0c\x3a\x5f\xb5\xab\x72\xa4\xb1\xc0\xd6\x98\xf5\xb9\x7f\x49\xe2\x97\xd3\x44\x30\x13\x92\x61\x61\xeb\xcf\xaa\xd6\xe6\xdb\xda\x22\x64\x9f\xd9\xd2\xc6\x34\x13\x72\x7c\x07\x3a\x0c\x08\x76\x31\x56\xe0\x53\xcd\x32\xa6\xf1\xf2\xfe\x03\xcb\x8e\x98\xe6\xe9\x7f\xe0\xb1\xf5\x84\x42\x4e\x96\x01\xe2\x4b\xbd\x71\x61\x39\x39\xad\x8d\x1c\xd6\x55\x4e\x43\xd9\xeb\x8e\xe5\x02\x9b\x71\x54\x54\x33\x3a\x20\x53\x1a\x29\x8d\x77\xe1\x88\x2e\x8c\xb3\x6e\xc0\x2f\x7a\xaf\xbe\xe2\x8d\x2d\x4b\x72\x01\xa9\x70\x13\x8a\xc0\x8f\x05\x2d\x19\x14\xe8\x41\x70\x7b\x82\x90\xc9\x72\xcc\x85\xab\x7c\x37\x81\xd2\x80\x4c\xa1\x17\x12\xca\xde\x91\x82\x8e\x59\xe1\x00\x90\xaa\xf7\x2b\x7f\xe7\xcb\x29\x31\x65\xf9\x9b\x26\x74\x3a\x55\x4c\x6b\x7e\xcd\x5c\x8d\x41\xfe\x4b\x80\x06\x3a\x80\x9d\x7e\xf0\xf5\x17\x35\xb1\xca\xa1\x61\xdd\x7b\x20\xe1\x08\xdd\xc5\x2c\x7a\x37\x36\x84\x11\x21\xa7\x5a\x1a\xa6\x78\x06\xab\xba\xa3\xd6\x44\xd7\xd9\x8c\x50\x8d\xd9\x87\x43\x28\xb4\xd8\x7f\xd7\x9b\xb2\x2a\x58\xb9\x71\xc6\x68\xee\x4b\xcd\x59\xa5\xaa\xaa\x58\x3e\x22\xe4\xd8\x92\x9f\x09\xcf\xa8\xc1\x42\x62\x24\x67\x79\x5d\x15\x1c\x6d\x84\x3d\xc1\xf8\x3c\x63\x44\xaa\x9c\x41\x45\x49\x39\x81\xe0\xfb\xb0\x58\x24\x1b\x42\x85\x79\x6e\xd7\x1f\x73\xa3\xa8\x9a\xa3\x04\xe5\xce\xb2\x27\x10\x96\xfb\x64\x50\xbc\x0e\xd6\x02\x78\xa0\xd2\x0d\xe9\xde\x74\xc7\x8f\x24\x4c\x80\xf4\xb6\x0d\x36\xa3\x47\xfc\xa5\x1f\x69\x78\x92\x1d\x70\xb5\x2f\xdd\xcd\xee\x3b\x59\x6a\xb6\x64\x07\xc2\x06\xea\xfc\x5d\x52\x19\x0a\x80\x9a\x6c\xe6\x24\xc5\x36\xa9\x22\x04\xed\x47\xb4\x5f\x76\x0c\x0e\x57\x4a\x91\x7b\x12\x19\xf2\xe9\x99\x19\x59\x75\xd3\xd4\xb4\x28\xe6\x43\x76\x6b\x99\xbd\x25\x66\x20\x3d\x41\x4f\x35\x48\xc4\xaf\x85\x66\x66\x90\x00\x10\x20\x42\x95\xc2\x12\xb6\x9a\xec\xe1\xfb\x0b\x09\xfd\x10\xf6\x70\x31\xab\x62\x8f\x6b\x83\x49\x3a\x83\xe5\x3f\x49\xb1\x27\xd7\x4c\xcd\xdd\xba\xbd\xa7\x4b\x76\x55\x49\xd2\x3b\x42\x80\x42\x99\x6c\x76\x7a\x5b\x29\x2c\xd5\x92\x64\xce\x85\xeb\xb2\xb8\x04\x96\xf1\xf7\x9a\x52\x1b\xb1\x3d\x31\x02\x0e\x82\x49\x2c\xf1\x27\xc0\x25\x8e\xce\x4f\xfa\xb3\x07\x1c\xfd\x15\x9f\xf6\xe8\xa9\x06\xb5\x47\x7a\x9a\x83\xe3\x68\xc5\x9e\xbb\x16\x0b\xfe\x1b\xec\x8b\x8a\x85\xd5\x74\xb0\xe4\x50\x72\xc5\x1c\x9b\xa4\xc2\xb9\x20\xdc\xc3\xc9\x80\x54\x0c\xea\x37\x62\x99\x4a\x36\x87\xc5\x70\xfd\x34\x27\x9f\xf8\x52\xe2\x48\xc5\x49\x9b\x31\xb4\x2f\x9f\x70\x36\x7f\x58\x89\xa6\x4c\x4b\x8b\x70\x5c\xb1\xce\x8e\x9c\x65\xa3\x75\x8b\x2c\x26\x79\x4b\x0d\xdc\x01\xfb\x41\xa8\x81\x14\xd0\x9e\x42\x03\x55\x4d\x8c\x4c\x85\x6c\x24\x5d\x76\x64\x7b\xf8\x03\x7d\xb4\x2d\x4b\x48\x78\x48\x04\x6f\x3b\x56\xe1\x8a\xcd\xf7\x35\xde\x79\xcb\x21\x66\xbc\x02\xd5\x1c\x98\xbd\x9c\x24\xbe\xf8\x38\x7e\x80\xc2\xe6\x1e\x1c\xe4\x2c\x67\x62\x40\xce\xa5\xb1\xff\x9c\xde\x72\xed\x74\x98\x13\xc9\xf4\xb9\x34\xf0\xc9\xce\xe3\x03\x6e\xd5\x73\xc1\x06\x67\xfd\xe7\x90\x18\x07\x6c\x18\x14\x75\xd8\x12\x7f\xea\xbe\x9a\x73\xc0\x1c\xae\xc9\x19\x34\x41\xc6\xa3\x4a\x0a\x10\x64\x65\xfa\xca\xd6\x16\x1c\x6f\xaf\x83\xba\xec\x2e\x7b\xfc\x2e\x3c\x0e\x5b\xa4\x6a\x21\xcb\x13\x81\xe6\xc0\x02\x2f\x04\x7e\x03\x4d\x4f\xaa\x82\x66\x2c\xf7\x3d\x15\xa8\xdd\x55\x6a\xd8\xb4\x63\xfe\xf3\x7d\xa3\x64\x6a\x0a\x0e\x96\xac\x47\x9f\xa5\xbb\x23\xb5\x60\x86\x23\xa9\x78\x86\xe3\x51\x2e\xf1\xa3\x54\x53\x79\xf2\x25\x40\xee\x7f\x6f\xd9\xec\x63\x68\x15\xc9\x28\x51\x04\x26\x4a\xbf\x25\xad\x2c\x15\xfa\x2f\x2b\xe4\xc2\x85\xfb\x6f\x52\x51\xae\xf4\x88\x1c\xf9\x2e\x14\xf1\x77\xce\x8e\x14\x4d\x93\x0c\xb0\x0a\xf2\x31\x7f\xae\xf9\x35\x2d\x5c\xc5\x64\x2a\x08\xc3\x8e\x1e\x16\xc6\x45\xd5\x6a\x40\x6e\x66\x52\xa3\xc4\x1c\x4a\x6f\xec\x5d\xb1\xf9\xde\x20\x81\x3d\xd5\x8f\x98\xf2\xed\x9d\x89\xbd\xc6\xe7\xd8\xa2\x4f\x41\x6f\x80\xdc\xc3\x3d\xf8\x6e\xef\xa9\x74\xba\x84\x72\x3d\xcd\x73\x8e\xa5\xad\x2f\x92\x8b\xbb\x49\xc9\x47\xfa\xaa\x17\xcd\xe8\x5b\xab\x06\xc7\xe3\x99\xd1\xfc\xcd\x5c\xe2\x76\x18\xcf\x7d\x57\x19\x67\xb2\xba\x6b\xd1\x4a\x00\x08\xd8\xc4\x22\xfb\x99\xbd\x12\x2d\x23\x64\x2a\x33\x52\x12\x64\xf1\xc5\xda\x77\xf1\x48\xad\x7c\xa5\x6a\x36\x20\xb9\x14\xfb\xc6\xb9\x10\xe2\x9e\x50\x8b\xbd\x25\xf2\x25\xa7\x7e\xa0\x0f\x13\x80\x42\x15\x83\x16\x18\xbe\x1f\x96\xb3\x77\x62\xd7\x28\xf0\x55\x19\x1f\x2f\x6c\xff\x5c\x06\x48\xdf\x02\x46\x0e\x10\x57\xc6\x48\x48\xe0\x02\xd0\x1f\x37\x06\xa6\x41\xbc\x08\xa4\xb6\xff\x2b\x01\x14\xab\xd0\x1b\x78\x67\x53\x6c\x09\x4d\xb7\xbf\x30\x25\x13\xac\xbb\xc4\x40\x9e\xea\x36\xf5\x89\x6b\x6c\x46\x9f\x22\x0e\xcd\x68\x5d\xa5\x4f\xa0\x0c\x5f\xbb\xe0\x25\x68\x78\x16\xd5\x84\x56\x12\x11\x01\x22\x4a\xe1\x8b\x31\xec\xcb\x4e\x11\x99\x06\x5d\x76\x91\xcc\x6c\xe8\x80\x89\xbc\xc7\x29\xe4\x94\x07\xbc\x2a\x9f\x67\xac\xf1\x0c\xcb\x09\x40\xe9\x1d\xe5\x8f\x73\xa1\x42\x95\xe2\x5a\x60\xc1\x5e\x8c\xe1\x4b\xe7\x90\x4d\x86\x5a\x18\xe3\xfa\x81\x56\x09\x23\x4d\xc2\x9c\x90\x13\xac\x4a\x24\x9a\x74\x2c\x6b\xe3\x4b\x35\xbb\xef\x73\x6a\x28\x34\xa5\xc2\xb8\x89\xdd\x70\xe1\xa6\xb3\xc3\x26\x52\x91\xd3\x5f\x57\x8c\x80\x6e\x67\x1c\x0c\x08\xa3\xd9\xcc\x6a\x3b\x43\x0c\x6d\xb5\x7a\x9a\x57\xc8\x4e\xec\x41\xa1\x12\x24\x17\x05\x86\x14\x57\x28\x60\x84\xbf\x38\x51\xb4\xb6\x0f\xc2\xf0\xa9\x57\xda\x25\x74\x38\xf5\x4c\x34\x49\xf1\x09\x20\xf1\xee\x11\xdf\xc9\xd3\x19\xb8\x61\x47\xc0\x5a\x15\xed\x97\x8f\x51\x64\xb9\xfd\x59\xb8\xf4\x09\xa0\x58\xf2\xf6\x4d\x3d\x76\xcb\xc3\x5c\x44\x7a\x2d\xee\xac\x6f\x85\x9a\x44\x30\x60\x8b\x34\xfb\xd2\xd4\x1b\xfb\xa3\xaa\xf0\xd0\x06\x15\x32\x83\x9b\x4e\x64\x0e\x5b\xc2\x71\xa6\x30\xda\x45\x47\xaf\x59\xe8\x62\xca\x94\x92\xca\xbe\x3f\xd3\x9a\x70\x38\xa7\x92\xaa\x2b\x96\x07\x69\x7c\x44\x2e\xec\x46\x79\xcb\x5e\x02\x48\x94\x97\x22\x7c\x8f\x54\xfb\xea\x4e\x31\x07\x30\xf7\x47\xa3\x7d\xd7\xbe\x5d\xa1\x80\x8d\x7c\xc8\x7e\x9e\x8a\xe2\xa7\x31\xe3\x25\x33\xde\xb5\x68\xd3\x07\x5a\x69\x34\x8e\x5a\x31\x1a\xdc\x41\x92\x50\xdc\x11\x17\x25\x44\x7b\x17\x9b\x68\x46\x62\xe3\x44\x5a\x87\x63\x3a\x67\x63\x82\x50\x20\x1c\xa9\x1d\x8c\x09\x9d\x8b\xf7\x39\x16\x1d\x0e\x39\x7a\x98\xd6\x5b\x9d\xd0\xce\x5c\xf6\x48\xaa\x59\x1c\x8f\xe5\x22\x82\x74\x05\xae\xc9\x47\x6f\xad\x58\x2f\xe5\xc6\x60\xe5\xe1\x14\xda\x90\x1f\x3b\x94\x73\xb3\x38\x76\x2d\x07\x67\x71\x9c\x4d\xb0\xbd\x70\x5b\x08\x71\xec\x31\x4e\xab\x0a\x0a\x48\xaf\xc6\x92\x8b\x63\x7b\xc9\x39\x8b\x63\x2b\xc9\x3a\x8b\x23\x45\xf2\xce\xe2\xe8\x9f\xcc\xb3\x38\xd2\xd8\x53\x70\x3c\x16\x71\x02\x11\x81\xfb\x16\xc0\xb1\xb1\xc6\xa9\x1b\x20\xf0\x83\x29\xac\x8a\x18\x43\x42\x9a\xe4\xc4\x39\x24\x4b\x74\xac\x65\x51\x1b\x04\x21\xfd\x22\xb1\xcc\x08\x2f\xe9\xbd\x50\x69\x04\xc5\xc5\xe5\x22\x49\x14\x34\x09\x14\xcf\x52\xae\xf5\x78\x9e\x97\xd4\xbe\xd4\x5d\x75\xbd\xa4\x6f\x19\x80\x63\x37\x1a\x07\xe0\xd8\x89\xf6\x01\x1e\x94\xf4\x4d\x04\x70\xec\x52\x9d\xef\xf6\x48\x7a\x49\xfb\xb7\x15\xf0\xe3\x91\xbc\x67\xa1\x83\x32\xca\x4a\xf3\xd0\x55\xb3\x65\xa0\x80\xf2\xfd\x46\xa3\xfd\xc4\xc7\x00\x61\x1f\xce\xfe\x76\xad\x74\x4e\x91\xc7\x72\x46\xfb\x8a\x06\x47\x17\x67\x09\xed\xbf\xd1\xac\xf7\x58\x80\xe3\x27\x5e\x6c\xc0\xeb\x8c\xd6\x06\x9f\xa1\xf9\x36\x8e\xfc\x3f\x69\x76\xd4\xd5\x79\x4a\x22\x6e\xef\xbe\xcd\xe9\xce\x8b\xbf\xb3\x92\x62\xdc\x73\x2e\xc2\x40\x23\x5d\x09\x89\x46\xa6\x74\xb2\x18\xd6\x42\xf5\x99\x7e\xfd\xd3\x54\xc9\xee\xdb\xa7\x76\xd4\xaa\x04\xbb\xdf\xa3\x3b\xd6\xe2\x68\x61\xcb\xfe\x27\xbf\x89\xce\x65\x89\xce\x84\xc8\xaf\x51\xc9\xfc\x2d\x06\x59\x51\x21\xa4\xc1\x18\xea\x01\xba\xe7\xf5\xc0\x05\x2a\x44\x05\x75\x45\x4e\x6a\x9e\x63\x36\x66\xa8\x8c\xb9\xff\xaf\x95\x56\x01\x1b\x78\x91\x06\x9d\xc8\x23\x65\x42\xd0\x8a\xff\xc0\x54\x9f\xde\xdd\xcb\x46\x0b\xb9\xdc\xfc\x1e\x93\x74\x36\x63\x25\x85\xff\x7c\xe7\x37\xc8\x12\x6d\x97\x9b\x0c\xce\x12\xa6\x4a\x2b\xf8\x0e\x5a\x55\xae\xf6\xae\xdf\x24\xc8\x93\x6b\xc6\xa3\x84\xd5\x86\x33\x7f\xb4\xed\xbc\x68\xa9\xff\xf6\x8a\x82\x85\x12\x02\x0d\x7c\x75\xeb\xe0\x8e\xb2\x92\xc4\x35\xee\xff\x8e\x6f\xdd\x63\x06\x16\xe2\x78\x0e\xd6\xe8\xae\x56\xe8\x41\x90\xd2\xdb\xd6\xe3\x64\x80\xbd\x58\xa1\x1f\x1e\x2f\x56\x68\x37\x5e\xac\xd0\x6b\x8f\x47\xb3\x42\x47\x22\x9d\xe7\xb0\x4b\xcc\xc8\x71\xa7\x38\x6f\x4b\x6e\xba\xc8\x8f\xd0\x27\xe5\x0d\xc0\xde\xfa\x2b\x55\xdb\xbd\xbf\x3f\x1a\xed\xa3\x83\x7f\x14\x9c\x58\xb5\x99\x0c\xff\x40\x98\xc8\x64\x6e\xe7\xf9\x0c\xf3\x2b\x6d\x40\xdd\x69\x2c\x7a\x31\x2c\xa5\x5f\x2b\x0e\x11\x80\xb9\xd3\xca\x8d\x09\xd9\x96\xaf\x8e\xf8\xee\x31\x85\xf3\x84\xec\xa5\x11\xee\x3d\xe4\xfe\x28\xdc\x81\x32\xe5\xa4\xfc\xa6\xee\x63\xc1\x4b\xee\xb2\x14\x2d\x3d\x65\xda\xa4\x4a\x3e\x21\xe4\x00\x27\x1f\x65\x55\x3d\x70\x0b\x8d\x4a\x56\x4a\x35\x1f\x84\xc5\xec\x97\xad\xd5\xdd\x13\x87\xa0\x5c\x64\xb5\x52\x4c\x98\x62\xde\xaf\x00\xff\xb2\xf1\x4c\xb4\x0c\x7f\x52\x3b\xac\x64\x04\xe4\x4a\x13\xa7\xdb\x8c\x36\xc5\x3b\xf6\xcb\xa0\x3b\x23\xec\x36\xf0\x7b\xd7\x4a\x65\xd0\x58\x40\xed\xa7\x4c\x5c\x93\x6b\xaa\x74\x2a\x0a\x43\x1e\x4b\xaf\xc8\xf9\x35\xd7\x8f\x98\x82\x7d\xe9\x84\x16\xf4\x35\xca\xda\x54\xb5\x71\xec\xce\x93\x08\x76\x5b\x49\x2b\x8a\x06\xd2\xb0\xa0\x9e\xbd\xe9\x6b\xf2\x8e\x47\x45\x8d\x61\x4a\xbc\x25\xff\xf7\xe0\xa7\x5f\xff\x73\x78\xf8\xe7\x83\x83\xbf\xbd\x1e\xfe\xaf\xbf\xff\xfa\xe0\xa7\x11\xfc\xc7\x57\x87\x7f\x3e\xfc\xa7\xff\xe3\xd7\x87\x87\x07\x07\x7f\xfb\xee\xc3\x5f\x3e\x5f\x9c\xfe\x9d\x1f\xfe\xf3\x6f\xa2\x2e\xaf\xf0\xaf\x7f\x1e\xfc\x8d\x9d\xfe\x7d\xcd\x49\x0e\x0f\xff\xfc\x3f\x13\xbe\x04\x15\xf3\x8f\xc9\x78\x02\x8e\xe1\xa3\xc8\x35\xed\xb9\x1f\x37\xd3\x94\x0b\x33\x94\x6a\x88\x8b\xbc\x85\x34\x9c\x64\x4b\x79\xd4\x7c\x3c\x1a\xd3\x48\x55\x81\x83\x06\xf5\x7b\xc7\x89\xc8\xe3\x6a\xd8\x8f\xe6\x9e\xc6\xba\xd3\x09\xfd\x30\x38\xe1\x3d\x2e\x18\xf7\xe5\x8b\xf7\x65\x9d\xf1\xe5\x47\xe0\x5f\x22\x3a\xbc\x84\xdf\x93\xe7\x1f\x7e\x8f\x67\xf9\x12\x7b\xff\x12\x7b\xff\x12\x7b\xdf\x7b\xa6\x1d\xf5\x92\xbe\xc4\xde\xfb\xf1\x1c\xbc\x1d\x2f\xb1\xf7\x6b\x8c\x17\xaf\xc7\xca\xf1\xe2\xf5\x68\x8d\x7f\x71\xaf\xc7\x4b\xec\x7d\xc7\x45\x5e\x62\xef\x57\x8d\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x97\xd8\xfb\x0e\x30\x2d\x8b\xbd\x47\xe4\x5f\x16\x81\xef\xec\x4d\x4d\xf8\xfd\xbf\x60\xf4\xbd\xb6\xe8\x97\xb1\xa3\x2c\x93\xb5\x30\x9f\xe5\x15\xeb\x19\x9b\xb8\x60\xfd\xbd\x33\xbb\x25\x43\xf7\x59\x83\xef\x3e\xbc\x93\xa6\xe1\x2f\xb2\xbf\x06\xad\x73\xce\x44\x0a\x6f\x4e\x7a\xe6\xe8\x61\xf3\x12\xa2\x95\xb8\x45\xce\xf2\xe6\x0b\xc7\x39\x8d\x45\x9a\x11\x39\x22\x8a\x65\xbc\xe2\xae\xa8\x26\xc5\xcf\x13\x00\x02\xf4\xc1\xb5\x27\x9d\x5b\xaa\xc1\x8a\x49\x60\x55\xa1\x6d\xa9\x8a\x6c\xa4\x4e\xca\x5b\x00\x34\x85\xf1\xcb\xbe\x12\xea\x3c\xa0\xe1\xdc\x70\xcd\x88\x9e\xc9\xba\xc8\x89\x62\xff\xe9\x95\x2e\xb7\x23\x9f\x63\x18\x62\x47\x72\x1a\x60\xa2\x57\x77\x27\x41\x2b\x6e\xef\x33\xdb\xad\x2a\x89\xec\xb6\xe2\xd8\x01\xfc\x92\x65\x52\xe4\x3b\xe9\x96\xb9\x03\x64\xa3\x18\x41\x4c\x0e\xd6\x80\x0e\x7d\xa7\xae\x69\xc1\x73\x2b\xa3\xf9\x90\x6f\x24\xa3\x29\xae\x1d\x52\xe2\x70\xab\x74\x83\x51\x84\x56\x95\x92\x34\x9b\x31\x1d\xc1\x8b\xd6\x08\xd7\x7f\xbe\x5f\xc3\xde\x78\x54\x45\x3d\xe5\x02\x4d\x1a\xb0\xaa\x97\x60\xa5\xf1\x69\x34\xee\xa5\x17\x41\xfe\x1c\x81\x63\x7f\x9e\x00\x18\x54\xa6\x8c\x9a\x43\xb6\x8e\x8c\x81\xc0\x9d\xe1\x93\xf8\x0f\x4d\x64\x91\x83\xbc\x41\x05\xf9\xc3\x6b\x52\x31\x95\x21\x59\x4a\xe2\xc0\xd3\xd0\x77\xca\xc2\x51\x58\x8d\xd9\x8a\x32\xf7\x2f\xff\xf5\x6f\xc8\x4c\xd6\x4a\x8f\x4e\x22\x02\xf0\x06\x3e\x4b\x81\x2d\x22\x6f\xe2\xa2\x0d\x29\x18\xd5\x86\xbc\x79\x4d\x4a\x2e\x6a\x93\xae\xbe\x63\x2a\x6b\x4b\x64\x67\xf9\xdd\x6f\x7a\xce\xf6\x08\xd5\x22\x93\x50\x92\xd8\xaa\x02\xff\x1d\x4c\x2b\xce\xa3\x08\xbd\xed\x49\x25\xb9\x30\x8b\x86\x16\x27\x71\xa5\xe4\x56\xe0\xc9\xdc\x09\x7e\x90\xd8\xc4\xf0\x73\x2d\xc7\x73\xd3\x49\x74\x4a\x71\xe8\x6e\xf9\x76\x07\x8e\x7f\x73\x1f\xe2\x11\x4b\x14\x43\x66\x56\xe9\x05\xbb\xac\x9e\x51\xc5\x5c\xd7\xcc\x7d\x4d\x0a\x3e\x61\xdd\x3b\xd8\x9d\xd8\x85\xa1\xa6\xe4\xdb\xb0\x2e\xd7\x24\x0f\x1f\x07\xd3\x2c\x17\x43\xa3\x18\x0b\x20\x83\xae\x0f\x1e\x64\x52\x48\x31\x8d\xbb\xb7\x76\x01\xa5\xa7\x88\xdf\x4f\xb0\x1f\x12\xc5\xa6\x5c\x1b\xd5\xcd\xed\x37\xec\xce\x30\xfb\x6a\x01\x53\x25\xeb\xce\xc5\x37\x53\x91\x2d\x00\xc2\x9b\x78\x7d\xa0\x87\xeb\xe5\xda\xbd\xe6\xb0\x63\x75\x0e\xc7\x60\x8d\x8e\x73\xf5\x26\x3b\x8a\xd1\xfc\xa3\x28\x3a\xfb\x4c\x53\x6d\xb4\x87\x03\xed\x69\x20\x55\x4d\x24\xc4\xd6\xcd\x58\xb8\xbe\xbe\x75\x32\x98\xea\x80\x86\xb0\x1c\x35\x1d\xfb\xf3\x21\x84\xad\x47\x9e\xc2\x1e\x1d\xde\x23\x59\x64\x42\x0b\xdd\xb3\xe7\x75\x1f\x5b\x8b\xbf\xbe\xdb\x3f\x20\x84\xa3\x4d\xd0\x5d\x3d\x7c\xa9\x48\x59\x17\x86\x57\x45\x73\x58\x9f\xfc\x0f\x9c\x18\xdc\xdd\x56\xd8\x28\xae\x34\x8a\xe4\xa0\x1a\x38\xc7\x5b\x4b\x98\x31\x20\xec\x20\xc0\xc0\x84\x81\xee\xfc\x90\x7c\xcc\x2a\xaa\x68\xc0\x94\x4c\x96\x25\xed\x51\xb6\x1d\xe3\x8b\x28\xe4\x50\xa0\x10\x63\x45\x67\x45\x8b\x66\x87\xa2\x60\xf3\x6d\x5d\x6b\xc3\x04\x15\x9d\x43\x26\x53\xe1\x0c\x42\x41\xe4\x4d\xa8\x22\x30\xe5\xd7\x4c\x2c\xde\x67\x67\x8e\xf8\x96\x66\x57\x4c\x74\xb7\x6f\x7e\xaf\xfd\x19\xe7\x73\x41\x4b\x9e\xd1\xc2\xd2\x03\x25\xaf\xb9\x25\x07\x2c\x5f\x58\x57\x0f\x9c\x09\x1f\x9b\x90\xfa\xe6\xd5\xa8\xd8\x6d\xeb\xe0\x6a\xcd\x3a\x87\xf8\xa7\x3a\x36\x0b\xc3\x63\xf1\x3c\x8d\x11\x1d\x8a\x5f\x67\xcc\xeb\xc5\x76\xbd\x6d\xed\x37\xbe\x5f\x92\x1d\xf7\xd8\x1c\xd1\x28\x90\x6a\x43\x38\x2a\xf6\x1f\x2b\x2c\xaf\x9a\xfb\x04\xbb\xc5\xbb\xe0\xda\x93\xf7\xe3\x37\x1d\xf7\x43\x8d\x3b\x09\x99\x29\xd0\x4e\x8d\xf3\x36\x63\xf9\x44\x73\xa9\xc9\xb7\xd0\x95\xe3\x84\x81\x19\xe5\xa9\x95\x86\x4f\xdf\x9e\x3c\xa0\x30\x58\xa8\x13\x2b\x0b\x4b\x7d\x75\xec\x96\x96\x55\xc1\xf4\xe8\xea\x0f\xe0\xad\x73\xf4\xeb\x95\x1a\xe7\xaf\x3e\x9d\x1e\x9d\x7c\x38\x1d\x95\x5d\xe8\xe6\x96\x35\x13\x5e\xd2\x69\x37\x3d\x7e\x48\x4a\x29\xb8\x91\xaa\x0b\x83\xed\xab\x98\x4c\xf4\x67\xbb\x6f\x5b\x26\xd2\x08\x85\x37\xa4\x34\x3d\xf8\x11\x21\x9d\xdd\xc4\x0b\xcc\xf6\x9e\xcc\x65\x4d\x6e\x28\xf6\xf7\x82\xab\xd4\x5d\x3c\xfe\xcc\xab\xb7\xe4\x54\xe8\x5a\xb1\xa6\xaf\xe9\x22\x08\x96\xab\xfa\x9b\xe0\x79\x2b\xdc\x5a\x6c\xec\x05\xfd\x64\xe0\xf1\xee\x70\x9c\xba\x7b\xf1\x96\xec\xb1\x5b\xf3\x9b\xbd\x01\xd9\xbb\x9d\x68\xfb\x8f\x30\x13\xbd\x37\x22\x67\x65\x55\xf0\x8c\x9b\x62\x6e\x6f\x14\x53\x2a\x38\xfa\xf1\x07\x0b\x79\x06\xdd\x21\xd9\xd0\xc1\xae\x8d\x54\x74\xca\xfc\x45\xfe\x95\x1a\x77\x15\x7b\x7a\x33\x40\xb8\x84\xdb\x46\x66\x00\x22\x78\x14\x80\xf4\xe3\x47\xfd\x1a\xa1\x74\x25\xa5\xbf\x9a\xc9\x9b\xa1\x91\xc3\x5a\xb3\x21\xef\xea\x96\xed\x7d\x32\x57\x6c\x0e\x09\x72\x5b\x3e\x1b\x07\x46\xcb\x64\x6b\x24\x44\x26\xc0\xe7\x56\xdb\xf9\xf4\xed\xc9\xf7\xba\x8f\x5b\x2d\xb2\x88\xbc\x62\x26\x7b\x95\xb1\x6a\xf6\xca\xad\xfc\xaf\x7a\xfe\x51\x3c\xcb\x9d\x3d\xe9\x34\xa1\xe7\x99\xdb\xc6\x28\x0f\x07\x8a\xca\x99\x2c\x0a\x96\x79\xc7\xe1\x31\xab\x66\xe1\x81\x67\x7d\xf2\x7d\x72\x62\x7a\x66\xc2\xec\x9e\x33\xc2\x8e\x4a\xca\xce\xf1\x54\xa9\x50\xcf\xc2\xd0\xe6\x33\xf0\x49\x3f\x36\x13\x11\x2f\x35\x4e\x2b\x44\x3c\x4f\x72\xd5\x55\x9c\x79\x16\xc6\xe8\x4f\xfe\x4b\xcd\x0c\x48\xb1\x5c\x10\x2c\xb0\xf9\xc1\x4a\xd5\xbb\x60\x75\xde\x09\x54\xea\x63\xf4\xc6\x1c\xec\x1e\xe5\x74\x52\x61\x42\x00\x04\x54\xfc\x28\x1c\x9a\xd6\x66\xc6\x84\xe1\x19\x86\xbc\xb8\xa4\xf1\x58\x16\x22\x67\x13\x34\x3e\xe6\x3d\x62\x36\xe5\x35\x53\x8a\xe7\x4c\x93\xde\xc2\x50\xec\x74\xe2\xc5\xb3\x46\xad\x5e\xe1\x92\x29\xa2\x13\xfb\x06\xec\xa7\x8c\xaa\x48\x1f\xa4\xbf\x1b\xe1\xf9\x3b\x11\x98\xff\x18\x21\xf9\xbb\x18\x8c\x9f\x28\x9c\xb1\x7f\x00\x7e\xfa\x90\xf2\x9d\xf1\xa8\xb4\xc4\x4e\xf8\x24\x99\xd8\x49\xf3\x92\xf7\x28\xef\xba\x03\x24\x3d\x8d\xe0\x09\xfb\xb0\xf1\x24\x3a\xa3\x05\x3b\xfb\xb8\x2d\xdf\x87\x5b\xbe\xed\xff\xb8\x74\x1f\x56\x4c\x69\xae\xa1\xe4\x87\x77\xc5\x19\x43\xb3\x99\xf3\x46\xf8\x20\x08\x29\xc8\x77\xe1\xde\x10\x21\xf3\xae\xb1\x8d\xb1\x03\xc4\xc3\xb0\xda\x09\xe2\xc1\xff\xb2\xa2\xa6\xa6\xd4\xb0\x9b\x8e\xfa\xfb\xb0\x11\x1b\xbb\xfe\x1e\x0c\xe3\x2f\xbe\x8d\xa5\x8e\x85\xfe\xfe\x8b\x90\xeb\x7f\x67\xee\xc7\xf7\x58\x8c\xee\xf1\x55\xa4\x60\x03\x30\xe3\x56\x5c\xc7\x38\x02\x1d\xbe\x9d\x74\x13\x46\xdc\xad\x4b\x82\x7f\x6e\x2e\x8f\x45\x70\x90\x34\xcf\x15\xd3\xda\x8b\xcb\x9e\xc0\x1d\x5d\x9c\x91\xbf\xe0\xe3\x5b\xdb\xbd\x4a\x49\x83\x66\xd0\x13\x59\x52\xde\x39\xe1\xad\xb5\x07\x8b\x93\xfa\xcd\x88\x35\x59\xbf\x09\x17\xe1\x59\xe2\x1e\xb6\xda\x6c\xd3\x96\xbc\x56\x2c\x27\xce\x71\xb5\xb5\x5d\xda\x39\x0b\xd1\x1d\x9b\x0d\x39\xb0\xdf\xbd\xba\x51\xdc\xb0\xc3\x51\x63\x2d\x5a\x30\x25\x75\xb7\xed\x3e\xa2\x09\xea\x8b\x34\xdc\x44\xe1\x37\xbe\x64\x59\x63\xac\xf1\xc8\x0f\xe2\x78\x48\x5b\xeb\xb1\xaa\xd0\x1c\x72\x19\xa2\x6c\x52\xb0\x04\x81\xae\x1a\xaa\x92\xa1\x55\x68\x40\xde\xcb\x29\x17\x9e\xbd\x48\x97\x4d\x34\xa1\xdd\xcd\x33\x2f\xf6\x91\x3b\xe3\xc5\x3e\xf2\x62\x1f\x79\xb1\x8f\xdc\x3f\xb4\x2e\x4e\x05\x1d\x17\xdd\x53\xc7\xdb\xd9\xf5\x61\x3a\xf2\xae\xa0\x53\xc2\xe0\x8f\x57\x39\xd7\xf6\x5f\x72\x79\xf9\x1e\x42\xb0\x6b\xe1\x4d\xe7\x80\x9b\x4e\xfa\x0a\xf5\xa4\x91\x97\x6e\x8f\x8d\xa1\x98\xf3\xa1\x47\x05\xb5\x64\x8c\xac\x01\x85\x70\x91\xdb\x5d\x63\xba\x55\x31\xc2\x3d\x01\xfc\x8c\x86\xaa\x94\x98\x74\x3d\x66\x96\x5a\x65\x57\x17\x51\x14\xb4\x54\xf6\x33\x11\x7d\x94\x44\xf9\x48\x34\x67\x4a\x35\x64\x01\xa4\x3e\xa8\x70\x91\xca\x79\x1d\xcd\xe7\xa5\x71\x2f\x84\x5c\xba\x83\x84\xef\xa8\xd6\x32\xe3\x4d\xde\x02\xc4\xde\x34\x22\x7a\x0e\x22\xfa\xd6\x36\x19\xf5\xe0\x34\x1b\x82\xea\xf7\x12\xcd\xc4\x23\xb6\x7b\x82\xea\x58\x13\xe1\xc2\xef\xdb\xd6\x36\x01\xaf\x5a\x9f\x8e\x06\xa9\x88\x44\x03\xc9\xe2\x3e\x06\x82\xb0\x18\x77\xee\x4b\xe2\x3a\xdc\xeb\x6c\x71\xc2\x01\x51\xa0\x5c\x2f\xc1\x5a\xae\x03\x49\x82\x62\xe9\x5b\x39\xad\xee\x15\xc4\x93\x18\x78\x51\xdf\x68\x27\x4e\xe1\x67\x2e\x82\x1d\x68\x75\x25\xab\xba\xc0\xb4\xfd\xb0\x69\xc9\x42\xc8\x37\x89\x46\x45\xd8\x9e\xde\x66\xdb\x57\xf3\x88\x4a\x4d\x6e\xfb\x42\xc6\x55\x2f\x37\x2f\x6f\xea\xef\x28\x58\x27\xc9\x78\xee\xa7\x4b\x60\xf1\xdc\x7e\x75\xd3\x54\xd5\x4c\xbb\x5b\x97\x5b\x55\x50\x5b\x16\x9c\xd7\xbf\xfb\xcd\x6f\x7a\x08\x43\x5c\xb1\xcc\x48\xc8\x3c\x74\x95\xa5\x43\xc4\x2c\x55\x0c\x74\x7f\x2c\x3d\xea\xed\xcb\x98\x79\x66\x7a\xc5\x75\x6c\xaf\xfc\xe9\x56\xca\x9d\xa6\x28\xb8\xd1\xbf\x9c\x69\xaf\x00\xcd\x64\x51\xf3\xd0\x2a\xe1\x6c\xcb\xad\x12\xb6\xda\x20\x61\x9b\x6d\x11\xb6\xd7\x0c\x61\x8b\x2d\x10\xb6\xdd\xf8\x60\x2b\xed\x0e\xb6\x1e\xd0\xfd\xf4\x0d\x0d\x92\xd4\x25\x4c\x51\x93\xb0\x6f\xcb\x82\x9e\xf5\x0c\xd3\xd4\x32\xec\xdd\x94\xe0\x29\x5a\x11\x24\xb2\x71\xf6\x6f\x3b\x90\xb6\xe6\xd4\xb6\x5b\x0c\xec\x90\xe8\x8d\x63\x37\xdb\x09\x6c\xa5\x89\xc0\xb6\x5b\x07\x6c\xb1\x61\x40\xba\xc2\x75\xa9\x9a\x03\xf4\x2f\x58\x97\x96\x70\x6c\xa9\xfc\xff\x23\x16\xfd\x7f\x92\x52\xff\x8f\x5d\xe0\x7f\x37\x93\xdb\xfa\x16\x0c\xef\x5d\x26\x5c\x27\xaa\x13\x9e\x2a\x06\x64\x17\xcc\xe2\x0d\x24\x4b\xdd\x0b\xbe\x0b\x24\xde\x03\xa8\x1e\x02\x7e\xe2\x8a\x62\x4f\xcf\x3a\x71\x06\xd6\x93\xd8\x60\x49\x6f\x5b\x39\x42\x22\x3b\x09\xbc\x49\xcc\xe5\x08\xc0\xc7\xcb\x85\x88\xe8\xf0\xf1\xd3\x07\x42\x87\xa5\x1f\x08\x85\xf6\x5b\xb7\x63\xc1\xd0\x2f\x51\xc1\xeb\x8c\x5d\x8c\x0a\x7e\xaa\x0a\x26\x5f\x5e\x60\x66\xfe\x12\x98\x19\x8f\x1d\x0c\xcc\xd4\xad\x86\xf3\xde\x21\x0a\x6c\x17\x54\x4b\x39\xb6\x42\xaa\xaf\x1c\xd8\xd0\xe0\xa3\x8b\xb3\xce\xab\x67\x8a\x41\x57\x00\x5a\xe8\xd1\x32\x9d\xd3\x87\x1f\x39\x0d\xd7\xeb\x9a\xd4\x18\x56\x56\x9d\x4b\x7a\xbd\xc4\x65\x2e\x19\x2f\x71\x99\x2f\x71\x99\x2f\x71\x99\xf7\x8f\x5d\x8e\x2e\x9a\xd5\x25\x15\x43\xcb\x4f\x21\xa8\xb3\x95\x4e\xb2\x20\xa6\x8f\x88\xe3\x80\xbd\x88\x16\x96\xf2\x85\x02\xcf\xb5\xe0\x3f\xd7\xac\xf1\x74\x04\x95\x6d\x07\xe2\xc0\x00\x8e\xdd\x39\x2e\xd4\x64\x17\xf8\x6c\x26\xef\xd4\x07\x74\x7b\x19\x8e\xce\xb3\xc6\x7e\x47\x06\x8b\xb7\x1c\x93\x66\xc6\x50\xd9\xbe\x58\x50\xb6\x5b\x36\x5d\x47\xc8\x81\x8e\xf6\xf3\x0e\xc7\x9a\xa0\x45\x51\xfb\xee\xae\x43\xca\x98\x91\x92\x2b\x25\x95\x8b\x54\x8b\x5f\x1f\x13\x9f\xf8\x74\x66\x98\x42\x0b\x29\xa6\x67\x74\x27\x9f\x97\xcc\xb8\x5b\x00\xb7\xc8\x48\x42\x05\x16\x7a\xb5\xff\xed\x8b\x7c\xc0\xd6\x78\x09\x64\xcc\x66\xf4\x9a\xcb\xba\x47\x51\xb5\x4b\x94\xa7\xf6\xdc\x94\xa0\x2b\xcc\x65\x1d\x62\x51\x6a\x6d\x37\x23\x9c\x82\xbe\x8b\x07\x9d\x97\x3e\x6f\x26\x05\xb3\x79\x2e\xbd\x33\x7a\xc8\x6e\xb9\x36\x77\xf7\xdc\xa3\x80\x8b\x7d\xda\xca\x65\xbe\xd6\x95\xe5\xbe\x3f\x74\xae\x09\x9c\xe2\x0a\xb7\x80\x68\x9b\x40\xae\x2f\xe1\xab\x87\x0c\x20\xae\xb9\x10\xd6\x47\x27\x25\xcd\x66\x5c\x24\xa8\x87\xfb\x43\x0b\xb0\x96\x25\x64\x44\x8e\x8a\xa2\xc9\x63\xd2\x21\x75\xd0\x5b\x46\xda\x2f\x65\x0f\xa9\x13\x38\x16\x73\x15\xcb\x21\xce\x0a\x45\x2c\xc8\x4f\xd4\x7c\xe4\x16\x18\x5d\x97\x37\x54\xb1\x51\x26\x4b\x72\x7c\x79\x46\x72\xc5\x3b\xb6\xfb\xda\x72\xfe\x39\x1e\xf1\x45\x37\xd7\xf5\x97\x66\xef\x79\xb1\xf5\xec\x94\xad\x27\xa4\x30\x14\x3c\x9b\x9f\x9d\xa4\x4d\x8b\xc0\x39\xbd\xa0\xa9\x43\x4a\x84\xfd\x9c\x7c\x4b\x35\xcb\xc9\x07\x2a\xe8\x14\x1d\x56\x07\x97\x17\xdf\x7e\x38\xb4\x08\x0f\xce\xb8\xb3\x93\xa5\x79\x13\x97\xf1\xe4\xe7\xdb\x2a\xaf\x4e\x16\xb7\x2e\x99\x6c\x7f\x67\xd6\x8e\xdb\xb7\xb5\xca\xf3\x24\x88\xad\x17\x3d\x9c\xc0\x4b\xaa\xf1\x5f\x2c\x36\x1b\xc3\x44\x05\xdf\x19\x52\x2f\xb2\xd4\xeb\x32\xbf\x7a\xea\x0d\xb8\xeb\x8d\xb4\xfa\xe3\x15\x9b\x6f\x4c\xbd\x87\x70\x82\x3d\x17\xc7\xf7\x28\xe9\xfd\x2d\x89\xa2\x48\x99\x55\x10\xae\x17\x35\xb7\x46\x64\x5c\xeb\x5c\x2f\x8d\xa2\x86\x4d\xe7\x27\xac\x2a\xe4\xdc\x62\xf1\x45\x14\xb8\x83\x8f\x8e\x51\x94\x56\x63\x9a\x11\x55\x17\xd0\x78\x21\xbf\xd3\x8e\x51\x30\x96\x37\x64\x9e\x0b\x6d\x68\x51\xd8\x03\x84\xf9\x57\x42\xb4\xb6\x70\xb0\xae\x18\x30\x44\x38\x1f\x7c\xaa\xdd\x8e\xf8\xfc\xa1\xd3\x5e\x5f\x10\x80\xe5\x1f\xc6\xb7\x4d\x22\x21\xd7\x8e\x79\xec\x22\x30\x20\x45\xfb\x54\x17\x96\x41\x17\x79\xbb\x7d\x33\xaa\x1c\x0e\x15\xb0\x35\x04\xd0\x3f\xfb\x92\xce\x04\x28\x99\x6e\x85\x42\x44\x3f\x5f\x6b\x7d\xec\x10\x7d\x33\x43\x09\xd4\x4e\x4c\x68\x55\x15\x1c\xab\x0c\x48\xe5\x82\x70\x23\x7f\xf2\xdd\xc7\xd6\x21\xb5\x1b\x8a\xa1\x9b\x89\x9d\x43\x72\xcd\xd4\x78\x1d\xfb\xdb\xa6\x12\x25\xad\x38\x84\x33\xad\x4d\xc2\xba\x0a\x8d\x47\x17\x67\xb8\xd0\x32\x0f\xbf\xff\x12\x11\xc2\x1d\xb5\x0f\xe8\xc1\x74\x34\xe7\x06\x08\x9d\xa3\x8e\x2e\xce\xb0\x21\x9b\x6b\x1e\xd5\xb8\x06\xac\xc6\x4e\x31\xf9\xb2\xe9\x79\x4b\xa7\x76\x46\x43\xa4\x60\x9b\x74\x4f\xb5\x10\x30\x51\x97\x0c\x1b\x53\x05\x60\x08\x17\xb0\x4e\x80\xa2\xf1\x40\xa0\x55\x79\x44\xf6\xf6\x62\x9d\x10\xcb\xb3\xa8\x08\x6e\x20\x75\x7b\x5f\xb5\x9e\xb2\x74\xad\x79\xb1\x75\x39\xfc\xe6\x51\xcf\x1b\x46\x39\x77\xe0\x98\x09\x22\x77\x84\x14\x9f\xdc\x7e\x7f\xff\xe9\xfd\xa3\x23\xe8\x79\x7b\x39\xd7\x1e\x88\x41\x6b\xd3\x8a\x2a\xc3\x69\x41\x6a\x55\xf8\xf0\x42\xac\x44\xe2\x32\x02\x67\xf4\x3a\x6a\xbd\x34\x22\xe4\x2b\xc4\x4a\x87\x0c\x48\xca\xc0\x28\xea\x5a\x91\x4d\xea\xa2\x18\x90\x09\x17\xd4\x32\x32\x56\x91\x28\xc8\x6b\x6d\x88\x2f\xb9\xc8\x98\xdd\xa6\xa1\xc7\x4b\x02\x90\x7b\xb3\x51\xa0\x69\x10\xa3\x19\xbb\x5c\x10\x14\x4b\xdf\x32\xb0\x0b\x4f\xa4\x22\xc7\x45\xad\x0d\x53\x9f\xa4\x65\xc3\x4d\xba\x09\x99\x28\x59\x12\x1a\x7f\xfd\x2d\x17\xf9\x46\x99\x50\x9f\x80\xb5\x67\x54\x10\xc6\x21\x30\xca\x2e\x0d\xf1\xd0\x16\xd9\x9b\x4b\x75\xa0\xeb\x6c\x66\xb7\x68\xaf\x92\xb9\xde\xb3\xd4\x79\x0f\xdd\x8d\x7a\xef\xd0\xfe\xb5\xf8\xae\x98\xbd\x11\xfd\xee\x15\xad\xf8\xde\xe1\x80\xc0\x86\x43\x70\x9e\x5c\x3f\x1a\xef\x0b\xbd\x47\x7e\xc3\xc0\xd4\xd7\xe9\x16\x7d\x8a\x67\x80\x8b\x21\x9a\xd0\xb7\x9b\x19\x37\x98\xaf\x63\x6f\x0a\xfa\x00\x42\xaf\x99\x45\x46\x4a\xc8\x91\x77\xa2\xd9\xab\x55\x32\xea\xe3\x75\xd9\x35\x53\x73\x33\x73\x0d\x2c\x3c\x15\x7d\x39\x39\xb8\x19\xbd\x4e\xcd\x91\x32\x7f\x42\xcd\x75\x03\x9a\x70\xe7\x84\xf6\xbf\xda\x5f\x64\x49\x0d\x0f\xfe\xd7\x3e\x0f\x10\xc2\x3a\x9d\xc5\x0f\xf6\x97\xed\x73\xc0\x8f\x90\x99\x04\x72\xf8\xfe\xbd\x0b\x4f\xc1\x0d\xff\x8e\x0b\xf0\x7a\x83\x3c\xe4\x6b\x01\xb8\x43\x5b\x7a\x52\x00\xe1\xbf\xec\x29\xdd\x55\xba\xd6\x55\x94\x56\xc0\xe8\xf5\xcc\xfb\xa6\x5a\x39\x81\x53\x56\x3f\xc8\x7c\xf9\x25\x6e\x21\xc9\x59\xf4\x70\x88\x25\x6e\xcc\x9c\x6e\x2e\xa7\x39\xcd\xab\xa5\x5a\xe8\xea\x33\x5d\x71\x7e\xf7\x41\xd2\xd8\xe9\x80\xec\x47\xdf\x7c\x6e\x02\x23\xc8\xa4\xa0\xd3\x06\x17\x81\x88\xa3\x64\x7f\x7c\xf9\x83\x7f\x05\x4d\xee\x29\x3d\xfc\xa0\xea\xf4\x90\xb2\x34\x6c\x76\xe9\xde\x27\xee\x75\x65\x3c\xac\x31\x85\xc9\xef\xc7\xa6\x75\xe2\xbe\xcc\x4a\x53\xfd\x7d\xfb\xef\x4d\xeb\x34\xc2\x04\xdf\x39\xce\x9b\x42\x20\xdb\x04\x64\xb8\xcb\x1f\x5a\x68\xf2\x00\xbc\xf7\x20\xed\x15\x9b\xdf\x48\x95\x3f\x8c\xb0\x47\x81\x98\xf9\x9f\x78\x65\xde\x07\x83\xa1\x39\x5e\x2e\x75\xec\x74\x46\xd5\x95\xc0\x17\x74\xcc\x8a\x87\x41\xbf\x47\x31\xf8\x40\x2b\xfb\x3a\x4d\xca\x26\x5a\xa4\x5c\x94\x19\x6a\xa7\x98\xe7\xe3\x33\xd2\xa4\x9a\x52\xc1\x7f\xc1\x3c\xd7\xcc\x52\x0a\xa9\xf8\x2f\xcb\x51\xed\x00\x7d\xfa\x68\xe3\x2a\x58\x66\x0e\x1d\xd6\x2f\x25\xd9\x0f\x5c\x0b\x9a\xe7\x1c\x45\xb0\x8b\x07\x30\x78\xf5\x7e\x71\x71\xb5\xc9\x49\xc3\xf3\x98\x66\xd3\x38\xf6\x1e\xf1\x98\x57\x90\x85\x87\x6f\xee\xea\x30\xba\x35\xd8\x53\xad\x56\x24\x8a\xac\xfc\x7d\x49\x39\x72\xed\xe5\x6d\xbc\xee\xd9\x5d\x87\x4d\xd4\xc9\xd6\x96\x96\xda\xf7\x0b\xb3\x3d\xc1\xbd\xea\xb5\xe1\xac\xa4\xbc\xeb\x8e\xe1\xe8\x71\x64\x25\x35\xb5\xe2\x66\x29\xa7\x5e\xfd\x43\x2e\xbe\xab\xc7\xec\x07\xa6\xb4\x3d\x8f\x4d\x7f\x2e\x20\xe3\xec\xe8\xe2\x6c\xe9\xb6\xa4\xe1\xc8\xf7\x1a\x32\xc0\x6e\xe6\x20\xb7\xe2\x22\xa9\x05\x2d\xc7\x7c\x5a\xcb\x5a\x17\xf3\xd8\x83\x42\xc9\x15\x17\xf9\x88\x90\x33\x34\xab\x8a\x7d\x43\xa8\x90\x62\x5e\xba\x47\x45\x56\xd4\x39\x6b\xcd\x78\x1f\x2b\x93\x84\x5e\x4b\x9e\x13\x5a\x1b\x59\x52\xc3\x33\x92\x49\xa6\x32\x28\xa2\x1a\xcf\x5f\x6b\x46\x68\x6b\xc6\xe6\xb7\x59\xad\x8d\x2c\x49\x49\x95\x9e\xd1\xa2\xb8\x0f\x25\x12\x48\x07\x60\x4e\xbb\xf7\x5b\xbb\x2b\xf7\x7e\x79\xbd\x62\x1f\x1e\xbe\x0e\xb0\x70\xaf\xeb\x60\x81\xeb\x35\xc1\xf5\xfd\x48\xbd\xc6\x1c\xae\x02\xee\xd2\xbe\x1c\x2d\xfc\xfc\x3c\x63\xa4\xaa\xc7\x05\xd7\xa0\xc2\x03\xe1\x9a\x93\x31\x9b\x71\x97\x7a\xf3\x30\xc5\xba\xf7\x88\x1f\xda\xe7\x55\x24\xe3\xc1\x1d\x5a\x41\xe1\x57\xfe\xd6\x71\xc0\xb3\x92\x4e\xd7\x10\xed\xef\xb9\xbe\xef\x2d\xd9\xa7\x62\x1e\xf8\x29\x34\x53\xd5\x03\x22\x95\x4b\x24\xf6\xba\x9f\x72\x5f\x85\x16\xc1\x8a\x7c\x74\x3b\xea\xf2\xa2\xdd\x35\x80\x2a\x03\x4c\x4d\xa4\x2a\xed\xbe\x73\x45\x26\xb5\x00\x6b\xf8\x3d\x7a\x21\xc4\xf0\x01\xff\x71\xc6\x4c\x5a\x68\x19\x88\x01\x1c\x9b\xf0\x80\x11\xaa\xc9\x0d\x2b\x0a\x0c\x23\xc2\xce\xaf\x51\xd9\xe6\xa6\x96\x65\x13\x4a\x38\x5e\xae\x5b\xe6\x7c\xca\xb4\x21\x07\x97\x7f\x3d\x3a\x04\x81\x08\x8c\x75\x73\x62\xe8\x74\xb4\x10\x1f\x8e\xc1\xa4\x56\xdc\xca\x6b\x10\xcb\x32\x6a\x68\x21\xa7\x18\x81\x66\x49\x8a\xfd\x7d\x55\xd0\x39\xa4\x71\x55\x54\x41\xae\x60\x86\x06\x4b\xa2\x6a\x71\x5f\x9b\xf1\xc7\xe3\x94\x0f\xd3\xa4\x55\x3d\xb5\x57\xb8\x87\x1f\xa6\x39\x0f\xf4\x09\x7e\x5c\x16\xac\x58\x55\xd0\x7b\x0c\x56\x77\xe8\x45\x53\xfa\xd0\xea\x2d\x60\xd8\x90\x82\x85\x39\x46\xe4\x12\xf1\xa9\xa4\x26\xc3\xf8\x90\x7f\x94\xcc\xd0\x9c\x1a\x3a\xb2\xca\xfd\x3f\xda\x25\x92\x64\x91\xdb\x89\xee\x3f\xe8\x7b\x60\x46\x51\x5c\x3e\x4c\xe3\xde\x5b\xd5\x22\x3c\x0e\x0a\x97\xbf\xb7\x2b\x2d\x64\x3d\xc9\x1b\xbc\xfe\xe9\xad\xd5\xad\x57\xba\xf2\x5b\xb0\x2e\xfe\xa8\x6d\x7b\x2a\xda\x6f\xe2\xb0\xb5\x64\xc2\xe8\x11\x1c\x4d\xfc\x09\xf8\x13\x8e\xce\x4f\xee\x37\xc7\x3e\x6c\x48\x7a\xc0\x70\xb4\xbe\xcf\xe6\x68\x05\xec\xde\x65\xe3\xbe\x69\xfb\x12\x7d\xa1\x0c\x28\xc3\x84\xc5\x1b\xa8\x08\x5c\x09\x1e\x5e\xb1\x2c\x9e\x73\x53\xca\xa5\x51\x0a\xef\x37\xb6\xad\xe5\x11\x5e\xc7\x0f\xfc\x50\x65\x9d\x61\x78\x8d\x7b\x1f\x5a\xcf\x2d\xfc\x60\xf5\x9b\xfb\xaa\xdb\xe0\x99\x40\x59\x05\x6f\xf9\x0f\xc7\xb0\xae\x1b\x7d\x4d\x63\xa1\x7f\xd5\x0d\x00\x7d\xd0\x09\x18\xb0\xa0\x15\xc4\x7b\xc5\xe6\xfb\x4e\xd3\xb5\x37\x68\xc6\x2b\xac\xdf\xe4\x7c\x82\x0f\x1d\x3f\x8e\x1f\x68\xc1\xf3\xb0\x00\xde\xa5\x33\x31\x20\xe7\xd2\xd8\x7f\x4e\x6f\xb9\x36\x68\x63\x38\x91\x4c\x9f\x4b\x03\x9f\x24\xd9\x29\x04\x30\xe5\x3e\x39\x33\x08\x3a\x80\xe0\xba\x47\xc6\x12\xb7\x1f\xd8\x43\xa1\x91\xf7\xec\xd3\x67\xc2\x0a\x34\xf8\xca\x0f\x2c\x11\x8a\xc2\x69\xb7\x80\x2f\x96\x20\xa4\x18\xfa\x1c\xad\xbb\x2b\xb8\x7d\x94\xaa\xb5\x8d\x9d\x17\x73\x0b\x61\x7a\x03\x7c\xc3\xb5\xe7\x4b\x41\x0c\xa1\xde\x34\xfc\xa0\x5d\xba\x64\x6a\x0a\xbe\xdd\xec\x01\x5f\xe4\xba\x16\xf9\xb5\xec\xf0\x6b\x5b\xdf\x3b\xd9\xdc\x3b\xfc\x08\x78\xd2\xfb\x7b\xed\x73\x64\x03\x7c\x8c\xa6\x42\xaa\x5f\xa2\xe1\xee\xbf\x2c\x71\x87\x23\xfd\x6f\x28\xa8\xa8\x47\xe4\x88\x68\x2e\xa6\x05\x6b\x7d\xe7\xdc\xed\xd1\x34\x2b\x96\xaa\x20\x4b\xf1\xe7\x9a\x5f\xd3\xc2\xb2\x19\xc8\x0a\x09\xa5\x58\xe4\xe4\x0e\xb3\x1d\xb8\xc2\x89\x96\x20\x06\x31\x76\xef\x8a\xcd\xf7\x06\x2b\xd3\x64\x62\x8c\xde\x3b\x13\x7b\x4d\x8d\xa1\x16\x96\x06\x9e\x06\x92\xf1\x1e\x7c\xb7\xd7\x9d\x6f\xaf\xe4\x50\xeb\x5b\x19\xc9\xc3\x28\xb7\x59\xee\x9d\xbe\xe2\xcb\xc3\x92\xd6\x41\x12\x2f\x5f\x1e\xe8\x43\xb0\xab\x09\x46\xa0\x08\x96\x02\x97\x84\xfd\x34\xae\xe8\x6c\x35\x96\x2b\x5e\x55\x4d\xb9\xed\xba\x9a\x2a\x9a\x33\x32\x55\xb4\xba\xe7\xd2\x6e\x26\x9d\xa2\x88\xbb\x6c\xc9\x15\x6a\xd9\xee\xeb\x40\xf7\x9c\xf5\x0a\xab\xc3\xca\xdf\xdd\xb0\xf1\x4c\xca\x2b\xa8\x8c\x03\x78\xf7\x88\x26\xb5\x1f\x71\xad\x93\xe6\x33\x6f\xee\xd0\x24\x67\x86\xf2\x02\x42\x04\x3f\xbe\xff\xe0\x82\x08\xbd\xac\xe6\xa1\x5c\x4e\x33\x12\xe8\x86\x34\x77\x71\xb2\x9f\xd8\x35\x67\x37\xce\x72\x76\x1f\x89\x1a\x92\x29\x13\x10\xa0\xb6\x22\xcc\x74\x48\x34\xcf\xd9\x29\xa4\x5a\xdf\x3f\x51\x0f\x27\xd9\x3d\x30\x3f\x44\x2b\x56\xf3\xba\x07\xf9\xdc\x1a\x3c\x2e\x58\x50\x2e\xa4\x5a\x51\x59\x7e\xbd\x32\x6b\xeb\x95\x50\x0b\x59\xca\xbf\xf9\xcd\x37\x2b\xf8\xca\x2d\x2f\xeb\xf2\x2d\xf9\xdd\x6f\x7f\xfb\xcd\x6f\xef\x7f\x8c\x0b\x7c\xec\xcd\xfd\xef\xe7\x6e\xdb\xf1\xa7\x93\x1d\xd8\xef\x3c\xc4\x7b\xaf\x76\xc0\xaf\x31\xd5\x84\xf2\xa2\x56\x2e\x5d\x62\x4d\xed\xf1\x5d\xfc\x1b\x70\x9e\x36\x69\xb5\xd4\xcf\xe8\xe3\x8c\x5d\xfc\xf1\x84\x0b\xa6\xc9\x4c\xde\x90\x5a\x28\x96\xc9\xa9\xe0\xbf\xb0\x1c\x8b\xe5\x6a\x0c\x80\x83\x56\xf2\x1e\xc5\x09\x13\x79\x25\xb9\x30\xc0\x62\x67\x54\xe4\xc5\xaa\x58\xa5\x35\xde\x34\xbe\xc1\xbd\xb6\x0c\xb8\xd1\x46\x1b\xf6\xa1\xf9\xc5\xc2\x76\xd9\x77\xf6\xae\x66\xe4\x72\xb8\x6d\xbd\xde\x14\x09\xe3\xe5\x0a\x9b\xcb\x12\x18\x37\x33\x09\xa0\xa9\x03\x3e\xfb\xb9\x66\x6a\x0e\x79\xbb\x8d\xe2\x16\x45\x14\x7f\x6e\xca\x37\xfa\x77\x74\x42\x25\xbd\xd7\x27\x40\x96\x98\x64\x22\x51\xab\x09\x70\x5b\x80\x0a\x7e\xc3\x30\x4c\xc7\x7b\x7d\xc9\x11\x11\x75\x51\xac\x58\xe9\x9e\x49\x84\x5c\xe5\x39\xc6\xb1\x96\xfd\x61\x3d\xc3\xc0\xba\x26\x28\x1c\xdb\x33\x44\xc5\x2f\x9e\x48\x8b\xda\x34\x9c\x78\x4b\x06\x2a\x1c\x5d\xcc\x54\x38\x36\x48\x5f\x58\x3f\x75\x61\xbd\x92\xd0\x6b\x98\xaf\x70\x6c\x92\xdb\xb0\x66\x21\xe7\xc7\x34\x68\xe1\xd8\x28\x06\x6e\x3d\xe3\xd6\x12\xd0\xd7\x8c\x73\x7f\x44\x43\x17\x8e\xc7\x30\x77\xe1\xd8\x68\x1f\xd7\x31\x7d\xe1\xe8\xb2\x8b\x4f\x60\x06\x73\xef\xfc\x94\xc6\xb0\x07\x96\x4c\x6c\x12\xc3\xb1\xb6\x61\xcc\x01\xb7\x51\xc0\xea\x06\xc1\xaa\x1b\x06\xaa\xf6\x08\x52\xed\xfc\xd3\x35\x8c\x67\x38\x36\xc3\xe8\x27\x34\xa4\xf9\x05\x9f\xcc\x9c\x86\xe3\xa9\x8d\x6a\x38\xd6\xe6\xa7\x9b\x19\xd8\xe2\xc9\x1f\x40\xd7\x2e\x85\xae\x14\xe3\xe2\x5a\x62\xbf\xcf\x8d\x94\x88\x4f\x77\x7e\xb8\xa0\x4b\xdc\x00\x1b\x75\xca\x44\xd0\xbe\x62\x9d\x6a\x26\xe5\x15\xa9\xf5\xc3\x1e\xb5\x95\xef\xfd\x40\x7a\x6c\x12\x25\x78\x93\x1b\xf6\xa9\x2e\xd8\x8f\xdc\xcc\x3e\x36\x25\x57\xe0\x9a\x99\xba\x2a\x60\x2f\xa2\x2f\x2c\x5e\x7e\x6a\x94\x93\x33\x83\x24\x36\x93\x65\xc9\x44\x8e\xd1\x96\x25\xbd\x5a\x8d\xf0\xda\xaa\xb7\x98\x55\x50\x14\xa8\xc2\xc1\x52\xec\xb6\xa2\xa2\x51\x56\xae\x2d\xa3\x5e\x85\xc2\x6b\x22\xf0\xba\x32\xd9\xda\x79\xa6\x1b\xcb\xdb\x8b\x79\xa5\x51\x62\x68\x2b\x7f\x94\x8c\x59\x21\xa1\xa6\x14\x66\x4e\x60\x96\xd1\xda\xa9\x96\x67\x13\xff\x2b\x27\x39\xb9\x3e\x45\x4c\x4c\x9b\x42\xf3\xba\xe0\x19\x0b\x2c\x53\xae\x53\xcc\xe7\x93\x93\xa6\xd7\x13\xd0\xd7\xe1\x7d\x6b\xf2\xbd\x0d\x78\x5e\x0f\x7e\x47\x2b\xfe\xb0\x29\x10\x47\x87\x93\xf7\x53\xc7\x67\x7f\xed\x3f\x5b\xe7\xf4\xfd\xc3\x2f\xe7\xbf\x6a\xf4\x38\xff\xa6\xd4\x54\xea\xe3\x6f\x53\xd4\x46\x06\x0e\x67\xbf\xc0\x5a\x32\xaa\x2c\xb3\x07\x4b\xfe\x90\x1c\x7f\x3a\x3d\xfa\x7c\x3a\x20\xdf\x5f\x9c\xc0\xbf\x27\xa7\xef\x4f\xed\xbf\xc7\x1f\xcf\xcf\x4f\x8f\x3f\x5b\xe1\xf9\xab\x07\x41\x80\x46\xce\x45\x81\xa7\x6f\x25\x14\xd9\x26\xe6\x54\xcc\xc9\xa4\x36\x96\x22\x37\xc0\xb4\xa0\xa4\x68\x42\xa4\x79\xbe\x4e\xb2\xe3\x17\x87\x83\xad\x33\x0f\x07\xba\x68\xb5\x8d\xf6\xcc\xf5\xce\x76\x79\xfd\x0f\xbf\xd9\xd3\x20\xf9\xda\x79\x9a\x9b\xe2\x78\xb7\x14\xce\xff\xf1\xe0\xbc\xef\xa4\x22\xec\x96\x96\x55\xb1\x46\x86\xdc\x7e\x25\x73\xbd\xef\x72\x75\xed\x7f\x3f\xbc\xed\xf0\x93\x57\x85\x9c\xee\x87\x14\x5f\x46\x0a\x39\x25\xba\x1e\x87\xfc\x6d\x10\x04\xd7\x9a\xed\x2b\x3f\x4d\x2b\x19\x75\x10\x92\xbc\xa3\x59\xd7\x06\xae\x35\x67\x3c\xc1\x26\x70\xbd\xd2\x19\x2d\x58\x6b\x26\xfb\xc1\xa6\x00\x7d\xf5\x6a\xf9\x1b\x7a\x4d\x85\xab\x85\x19\xd7\xa1\x14\x37\xbc\xc8\x33\xaa\xf2\x3b\xe4\x02\x44\x3f\xbc\x4d\x80\x39\xd8\x18\x50\x80\xe0\xd8\x2c\x8d\x85\x20\x1f\xb6\x58\x5d\x33\x55\xd0\x0a\xf3\x00\xa1\xa3\x25\xc4\x2d\xaf\x01\xe2\x09\xab\x18\xd4\x11\xc0\x26\x5e\x8c\x30\x91\x15\x12\x2a\x5d\xa2\xd4\x39\x68\x1f\x0b\x46\x39\xfb\x86\x3b\xeb\xe6\x87\x7f\xe1\xec\x15\x12\xca\x52\x53\x1d\xcc\x52\xbb\xb7\x1a\xad\xcf\x3f\x7e\x70\x1e\x34\x06\x06\x2d\x9b\x91\x3d\x57\x44\x62\x6f\x40\xf6\x42\xe1\xd1\xdc\x69\xe4\x7b\x5f\x3d\x5c\xd2\x39\x4c\x10\x57\x0e\x00\x85\xdd\x45\x3a\x0c\x01\xce\xb8\x50\x0b\x60\xb7\x8f\xd1\x58\x1b\xf4\xa6\x28\xaf\x15\x29\x9d\xab\x05\xde\xa1\xbd\xd0\xc3\x33\xc5\x2f\x7a\x07\xea\xa6\x42\x47\x6f\x88\xf7\xbe\x6a\x4d\x6f\x7c\x75\x72\x22\xa4\x3b\x3c\xc5\x2c\x36\xae\x4a\x05\x88\xc7\x65\xeb\xee\x85\x18\x97\xb8\x2a\x31\x57\xa4\xa2\x8a\x09\x13\x80\x7f\x78\x5a\xd7\xc4\x19\x8c\x31\x5f\xed\xad\x77\x2b\x57\x5e\xa2\x28\xac\x61\x4d\x5b\xc5\x65\xf8\xc5\x71\x41\xb5\x5e\xe2\xf0\x04\x1e\x60\x27\x76\xb5\xe9\x2d\xef\x75\x31\x1f\xd0\xca\x74\x46\xaf\x57\xbc\xea\x1a\x40\x1b\xaa\xa6\xcc\xac\x0e\x48\xa0\x62\xfe\x71\x65\x13\x88\xe1\xda\xad\xe1\x86\x1d\x2c\x46\x5c\x98\xa1\x54\x43\xfc\xc9\x5b\x62\x54\x7d\x9f\xdd\xc1\xf0\x92\xc9\xda\x5c\xb2\x4c\x8a\xe5\x49\xc3\xee\xb9\x64\x11\x16\x1b\x64\x52\xbb\x20\x9f\x23\x2f\x7e\xc7\x9d\x69\xbc\x39\xaa\x91\xcd\x7d\x60\x4f\xbb\xb8\xe8\xc7\xf7\x1f\xfa\x1c\x36\x81\x0a\x52\xab\x4f\xf2\x07\xc7\x93\xc5\x34\x40\xea\x20\x5f\xf9\xb3\x0f\xb5\xd9\xfc\x47\xc7\x21\x60\x64\xf5\xd3\x6e\x33\x56\x17\x7a\xbc\xf7\xfd\xb5\xa1\xa6\xbe\x83\x0d\x0f\xb1\x22\x47\xdf\x2f\xb1\x90\x83\x53\xef\x2f\x61\xaa\xd8\x67\x15\xd7\x90\x43\x8d\x0e\x8b\x68\xc2\x73\x3e\xa3\x64\x44\xdc\x0f\xed\x95\x35\x8a\x72\x34\x87\xd1\xcc\xd4\xf4\xae\xcb\xdd\xfe\xd8\x65\xa3\x2c\xaf\x1c\xbb\xc2\x20\xb6\xca\x08\x96\x31\x65\xf4\x7b\xaa\xcd\xf7\x55\x4e\xef\xa9\x21\xb0\x90\x65\xa2\x0d\xdc\x29\xd4\x69\x6f\x04\xcb\x2d\x13\x72\x5b\x82\xf3\x91\x1b\x4b\xdd\x6b\x9c\x71\xc9\x84\x0f\x60\xa5\xbf\x63\xf6\xe7\x43\xbb\xd4\x72\xa8\x3f\x49\xbb\x27\x47\x4b\x69\x54\x3b\x99\xe7\x21\x68\x2d\x47\x53\x30\x1b\x11\xec\x76\x99\x54\xd9\x1f\xe2\x82\x51\xb1\x3c\xd9\xb2\x05\xeb\x31\x3e\xb7\x39\x4e\xb9\x05\xc8\xcd\x8c\x5b\x75\x0b\x6b\x2d\x68\xe2\x85\xd8\x9c\x15\xec\x9e\x92\x0b\x3d\xf3\x7f\xdc\x0a\x27\x6e\x81\xbe\xa1\xd3\x17\xed\xe9\x82\xc7\xdb\xe9\x96\x2e\x2b\xb7\xd1\xd2\x9c\xec\x13\x6c\x15\x8b\x2f\x0c\xc2\xdb\xb8\x90\xd9\x15\x16\x35\x87\xa2\x66\xfc\x17\xa6\x56\x08\x19\xe0\x45\xe4\x22\xe7\x59\x08\x57\xa8\x94\x9c\x2a\xa6\x5b\x5b\x8d\x35\x60\x35\xce\x6e\xd7\xb4\x7b\x1e\xd6\x95\xaa\xf1\xed\xd4\xc2\x95\xbd\x78\x9a\x14\x25\xaf\x97\x43\xfe\x66\xcb\x97\x7e\x57\x45\xc7\xfa\x92\xd0\x15\xc3\x19\x68\x68\xe9\x92\xac\x5f\x7d\x77\x7f\xea\x71\xd2\xfc\xa1\x55\x09\xd0\xf8\x04\xf7\x7d\x6f\x56\x3e\xb5\x22\x55\x7a\x5d\x57\xc0\x03\x29\xd1\x64\x7d\xd5\x29\x80\xbc\xce\x6c\x49\x73\x2a\x92\x87\xc9\xac\x51\x0d\x78\x93\xe0\x97\x75\xbb\x47\x6d\xe4\xf6\x16\x9b\xb4\x4d\x69\xdd\x96\x46\x99\x72\xb5\x53\x30\x3e\x6e\x22\xd5\xbd\x6a\x5b\x3a\xe0\x57\x27\xd0\x3f\x38\x91\x95\x69\xef\x0f\x44\x6f\x33\x6e\x4f\x41\xc3\x4f\x06\x84\x92\x19\xd7\x46\x2a\x17\x21\x62\x19\xa0\x51\x54\x68\xfc\xfe\x5e\x5e\xd1\x37\xb4\xfd\x38\x80\x40\x68\x55\x31\xaa\xbc\x9f\xde\xb1\x33\xaa\xc1\x88\x9a\x49\x95\x2f\x05\xcc\x9b\x64\x96\x8a\x63\x4b\x97\x4f\x50\x3b\xa4\xa0\xda\x7c\x0e\x30\x58\x99\x62\x4d\x6a\xdc\x96\x98\xdc\x2b\x36\x6f\xe3\x6b\x58\x4a\xd1\x7c\x29\x09\x15\xce\x50\x75\xdf\x12\x6b\xe1\xd7\xc3\x72\x49\xf3\x6e\x28\x00\x76\x7a\xaf\x9b\x20\xec\x45\xaf\xf8\x34\x90\x97\x4c\xeb\x95\x09\xe5\x0b\x95\x6c\xa0\xe3\x14\x09\x1d\xa7\xdc\xcf\x3d\xb3\x47\xc1\x01\x73\x2b\x7c\x65\xe6\xf9\xfd\xa8\x46\x40\x4c\x40\x33\x48\xb8\x56\xbd\x8e\xac\x9a\x51\xbd\xee\xcb\x84\x5b\x14\x72\x78\xd6\xbe\x0e\x6b\x42\xa3\x18\xd5\xab\x6a\x73\x6c\x12\x04\x3d\x56\x9c\x4d\xc8\x31\x2d\x59\x71\x4c\x75\xca\x9d\x07\xf2\xb0\xca\x54\xc3\x46\xd3\x11\xd9\xff\x14\x85\xc9\x9c\x4b\xf3\x81\x99\xfd\x6e\x7b\xb3\x1e\x21\x78\x54\x12\xd0\x5b\x1d\x79\xf8\xc2\xf7\xbc\xea\xbd\x21\x5c\x71\xb1\x77\xe2\x4a\xaf\xae\x4b\x73\xdf\x35\x6e\x5f\xe0\x5a\x81\x79\x32\xeb\x7a\x91\x1f\xa8\x75\x71\xdf\xe5\x5d\xe7\xda\x6e\xe9\xc2\x6e\x72\x55\x1f\x78\xfb\x30\xc5\xe5\x52\x53\xcf\x9d\x8d\xf8\xdc\x52\xa7\xc1\x57\x14\xc7\xc6\x63\x27\x2a\xae\xad\x92\x97\x52\x30\xda\x6e\xfd\x28\x77\xa8\xf7\x7e\xbf\x42\xf2\x1f\xae\xe6\xf3\x7d\x6b\x53\xe5\xe0\x7f\xb3\x18\xf0\x94\xe1\x72\x27\x7e\x55\x67\x80\x09\xfd\x6f\xe0\x2f\xf4\xee\x07\xc8\x5a\xf8\x71\x60\x24\xa9\x14\xbb\x86\x3c\x0a\x01\xf9\xa1\x8c\x08\xa6\xed\x45\x39\x5c\xb1\xfc\x9a\x2a\xdb\x7a\xea\xda\xc3\xaa\xf4\x83\x6a\x32\x79\xf8\x68\xfd\x43\xab\x0e\x18\xc7\xba\x5a\xe1\x1a\x5a\xf7\x06\xea\xe0\xc3\x3a\xd5\x06\x93\x3d\x28\x60\x6e\x38\xdf\x72\xc3\xf3\xe2\x58\x68\x55\x63\x7f\xf2\x09\xe8\x39\x46\x5a\x64\x96\x2a\x67\xd0\x85\x09\xc9\x7c\x68\x94\x17\x1b\x99\x3f\x2d\xd2\x40\x88\xb9\x6f\x63\x78\xaa\xd7\xaa\x6b\x9e\x6e\xcf\x1f\x2c\x0a\xb7\xf6\x7c\x3b\x50\xe1\xee\x41\x04\x7a\xdc\x92\x57\x38\x1e\xc2\xba\xed\xe3\xdb\x3a\xd5\x4e\x57\xe2\xd8\x23\x15\x1b\xd4\x4c\x5d\xb3\xbc\xe5\x61\x74\xdd\xd0\xda\x9f\x45\xfe\xe8\x66\x7e\xb7\xed\xe4\xbf\xfe\xfb\x7f\xfc\xbf\x00\x00\x00\xff\xff\xe0\x67\x7b\x8a\xc4\xcb\x0b\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x23\xb9\x95\x27\x0c\xff\xef\x4f\x81\x90\x7b\x5e\x49\x63\x91\xaa\xb2\xc7\x7e\x3d\xb5\xb3\xe3\xd0\x56\x55\x77\xeb\xe9\x2e\x95\x42\x92\xdb\x8f\xa3\xdd\x6b\x83\x99\x87\x24\x46\x99\x40\x0e\x80\xa4\x8a\xde\xde\xef\xfe\x04\x0e\x80\xbc\xf0\x22\x91\x09\x48\xcc\xaa\x4e\x38\xc2\x5d\x22\x93\xc0\x49\x5c\x0e\xce\xf5\x77\x68\xc1\x7e\x00\xa9\x98\xe0\x6f\x08\x2d\x18\x7c\xd2\xc0\xcd\x5f\x6a\x7c\xff\x47\x35\x66\xe2\x7c\xf1\xfa\x57\xf7\x8c\xa7\x6f\xc8\xdb\x52\x69\x91\xdf\x80\x12\xa5\x4c\xe0\x1d\x4c\x19\x67\x9a\x09\xfe\xab\x1c\x34\x4d\xa9\xa6\x6f\x7e\x45\x08\xe5\x5c\x68\x6a\x3e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x34\x03\x3e\xbe\x2f\x27\x30\x29\x59\x96\x82\xc4\xce\xfd\xd0\x8b\x57\xe3\xd7\x7f\x1c\xbf\xfa\x15\x21\x9c\xe6\xf0\x86\x24\x59\xa9\x34\x48\x05\x72\xc1\x12\x70\x8f\xa9\xb1\x28\x40\x52\x2d\xa4\x1a\x27\x42\x82\x30\xff\xc9\x7f\xa5\x0a\x48\xcc\x60\x33\x29\xca\xe2\x0d\xd9\xf8\x8c\xed\xd7\xd3\x44\x35\xcc\x84\x64\xfe\x6f\x42\x46\x44\x64\x39\xfe\xdb\xbd\xab\x1d\xfe\xd6\x0e\xef\x26\x08\xbf\xcf\x98\xd2\xdf\x6d\x7f\xe6\x7b\xa6\x34\x3e\x57\x64\xa5\xa4\xd9\xb6\x17\xc1\x47\xd4\x5c\x48\x7d\x55\x93\x65\xc8\x48\xd4\xa2\xf9\x6f\xf7\x20\xe3\xb3\x32\xa3\x72\x4b\x6f\xbf\x22\x44\x25\xa2\x80\x37\x04\x3b\x2b\x68\x02\xe9\xaf\x08\xf1\x63\xd9\xce\x47\x84\xa6\x29\xae\x17\xcd\xae\x25\xe3\x1a\xe4\x5b\x91\x95\x39\xaf\x06\x37\xcf\xa4\xa0\x12\xc9\x0a\x8d\x6b\x72\x37\x07\x9c\x35\x22\xa6\x44\xcf\x81\xbc\xbd\xfd\xa1\x7a\x94\x90\xff\x52\x82\x5f\x53\x3d\x7f\x43\xc6\x66\x01\xc6\x29\x53\x45\x46\x97\x86\x84\xc6\x53\x76\x35\xdf\xd9\xef\x1a\x9f\xeb\xa5\xa1\x57\x69\xc9\xf8\xec\xb1\xf1\xdd\x4b\xec\x46\xc2\xa2\xb1\x4e\xcd\xe1\x7f\x58\xfb\x7c\xd7\xe1\xfd\xeb\x53\x33\x32\xd1\x73\xaa\x89\x9e\x33\x45\x04\x07\x22\xa1\xc8\x68\x02\xea\x11\x82\x36\x3c\x62\x29\xba\x59\xff\x62\x0b\x49\xcd\x2e\x35\xd5\xa5\x1a\x17\x73\xaa\xd6\xa7\xf8\x7a\xe5\xd3\x0d\xdd\xd9\x07\x17\xaf\x69\x56\xcc\xe9\x6b\xf7\xa1\x4a\xe6\x90\xd3\x7a\x0f\x88\x02\xf8\xc5\xf5\xe5\x0f\xbf\xbb\x5d\xf9\x82\xb4\x67\x67\xe3\xee\x27\x4c\x99\xa9\x42\x46\x41\x3c\xa7\xc0\xb5\x5b\x16\x40\xfe\xb1\xf1\x37\xb7\x05\x24\xff\x18\xaf\x51\x2e\x26\xff\x05\x89\x6e\x7c\x2c\xe1\xbf\x4b\x26\x21\x6d\x52\x64\x26\xc8\x73\x9f\x95\x8f\xcd\xfc\x37\x3e\x2a\xa4\x61\x0b\xba\x71\xe4\x6d\x6b\xb0\xbf\xd6\xe7\x2b\x6f\xfb\xf3\x68\xe5\x5b\x42\xcc\x24\xb9\xb7\x4e\x0d\x2f\x04\x85\x3b\xd4\xed\x41\x48\xdd\xcc\xda\x9d\xcb\x94\xd9\x2e\x12\x14\x70\xcb\x1d\x71\x53\x71\xf7\x96\xe3\xb5\xce\xcd\x14\x81\x54\x86\x45\x94\x59\x6a\x98\xe8\x02\xa4\x26\x12\x12\x31\xe3\xec\x9f\x55\xef\x8a\x68\x81\xc3\x66\x54\x83\xd2\x04\xcf\x35\xa7\x19\x59\xd0\xac\x84\x33\x42\x79\xba\xd6\x77\x4e\x97\x44\x82\x19\x97\x94\xbc\xd1\x23\xfe\x44\xad\xd3\xf2\x41\x48\x20\x8c\x4f\xc5\x1b\x32\xd7\xba\x50\x6f\xce\xcf\x67\x4c\xfb\xeb\x21\x11\x79\x5e\x72\xa6\x97\xe7\xc8\xe9\xd9\xa4\x34\xac\xf7\x3c\x85\x05\x64\xe7\x8a\xcd\x46\x54\x26\x73\xa6\x21\xd1\xa5\x84\x73\x5a\xb0\x11\xbe\x0c\xc7\x2b\x62\x9c\xa7\xbf\x96\x6e\x9b\xa8\x95\x81\x37\x9e\x07\xe2\x39\xf4\x9e\x8b\x65\x38\xb6\xdd\x9c\xb6\x43\xfb\xb2\xf5\x9a\x98\x8f\xcc\x34\xde\xbc\xbf\xbd\x23\x9e\x22\x77\xd4\x71\x89\xea\x47\x37\xcc\x90\x5f\x2d\x33\xb3\x8c\x4f\x41\xda\x5f\x4e\xa5\xc8\xb1\x57\xe0\x69\x21\x18\xd7\xf8\x47\x92\x31\xe0\x9a\xa8\x72\x92\x33\xad\x70\x5b\x83\xd2\x66\x21\xd7\x3b\x7e\x8b\xd7\x29\x99\x00\x29\x8b\x94\x6a\x48\xd7\x1f\xb9\xe4\xe4\x2d\xcd\x21\x7b\x4b\x15\xbc\xf8\xda\x99\x35\x52\x23\xb3\x20\x3b\xaf\x5e\x53\x58\x58\xff\xc1\xda\xa9\x27\xc4\xdf\xee\xfb\x2c\xf7\x56\x46\x43\x52\x48\x32\x2a\xad\x80\x42\x34\x64\x19\xf9\xf8\xfd\x07\x32\x17\x0f\xe6\x20\x31\xae\x34\xcd\x32\x3c\x98\x4e\x88\x58\xeb\x1a\xef\x80\x84\x72\x92\x53\x4e\x67\x40\x68\x51\x28\x32\x15\x92\x50\x32\x63\x0b\xe0\x9e\x01\xac\xae\xc5\xd6\xf7\xdb\xc6\xd9\x88\xbd\x91\x36\xde\xaa\xfe\x5b\x47\xf0\xca\x37\xdb\x78\x9d\x69\x6b\xf2\xd9\x7e\x13\x6b\xda\x45\xdd\x05\x1e\x29\x4e\x4a\xae\xb4\x2c\x71\x97\xa4\xe4\x1e\x96\xee\x74\xe5\xb4\x20\x4a\x0b\xf3\xe1\x03\xd3\x73\x42\x9b\x27\x8b\x6a\x3c\x2e\x93\xf5\xd7\x32\x4d\x81\x26\x93\x25\x31\xd2\x28\xb2\x33\x2d\x44\x86\xbc\x0e\xfb\x33\x6c\x8d\x48\xd0\x92\xc1\x02\x08\x95\x13\xa6\x25\x95\xcb\x6a\x6f\xad\x9f\x83\x47\xe7\x1f\xe7\xa5\x21\x1c\x6d\x9f\x3d\xf2\xd8\xce\x26\xf6\x3a\x71\xb2\x59\x5a\xc9\xc7\xdd\x27\xfa\xfa\xd2\xed\xe0\x5a\xd8\x56\x6e\x07\x83\x22\x66\xa7\x3a\xb1\xa8\x92\xda\x91\x00\xb7\x35\x53\x22\x64\xb5\xb7\xc8\x64\xb9\x71\x8c\xc6\x56\x27\x13\x30\x6c\x50\x52\x6e\xa6\x7e\xe3\x11\xea\x30\xb1\x8f\x6d\x46\xd3\xc4\x03\xdf\xb4\xf3\x9b\x7d\x53\x29\xe9\x66\xea\x09\x61\x1a\xf2\x2d\x3d\x93\xd5\x69\x6e\xce\x67\xf5\xb1\x21\x70\xc1\x52\x30\x13\xab\x29\xb3\xbb\xcc\xf0\x04\x3a\x11\xa5\xb6\xf3\xe9\x1e\x49\xc9\x82\x51\x42\x67\x33\x09\x33\xdc\xff\x5b\x87\x7d\x62\x4e\x6c\xdb\x7e\xec\xeb\x36\xb2\x4a\xcd\xa3\x4f\x18\xf6\xfb\xe8\x03\x7c\x13\xf3\x68\x3e\xb0\x2e\x37\xb7\xdb\x53\x6b\x68\x1b\x4d\xcc\x9c\xf8\xa9\x15\xf2\xd1\x87\x77\x59\x5b\xdb\x9e\x58\x61\xdb\xda\xeb\xbc\x42\x88\xfb\x76\x62\xce\x4c\x7d\x01\x18\xce\x81\x0f\xd6\x2c\x7d\x02\xa4\x00\x39\x15\x32\x37\x87\x87\x13\x4a\x12\x2b\xca\x56\x7c\x0b\x19\x2e\x4f\x1e\x9b\x4e\xb2\xeb\xfa\xdb\xb6\xcb\x2e\xb0\x6d\x44\x0a\xaa\xe7\x4f\x3c\xb6\xdb\x52\xd9\xd6\x9c\xb4\x27\x1f\x7e\x82\xf1\xad\xf5\x5d\xdf\x5b\xd1\xfb\x36\xd3\x10\xbd\x53\xbc\xb2\x76\xe9\x75\x17\xce\xbd\xda\x6e\xe8\xc3\x07\x50\xca\xc8\x0b\x28\x84\x4a\xfa\x40\x80\x27\xc2\xf0\x94\xff\xe7\xf6\xe3\x95\x1d\x7d\x13\x77\x5d\x6f\x97\x9a\xb0\xbc\xc8\x20\x37\xb2\x28\xf9\xf1\x03\x95\x6a\x4e\x33\x90\x3f\xe1\xad\xf8\xe3\x9f\x79\xde\xfe\x24\xa1\xdb\x0f\x76\xb3\x19\x21\x53\x41\x6a\xd8\x5f\x0a\x19\x5d\x5a\xc2\x52\x48\x44\x6a\xae\x05\x21\x49\x61\x94\x85\xbc\x28\x35\x10\x6a\xbf\xc5\x77\x60\x7c\xb6\x0b\xe5\x7b\xad\x06\x31\x22\x55\x4e\xf5\x1b\x32\x59\xea\xa7\x4e\x1b\x21\x9f\x46\xe9\xae\x6c\xa7\x49\xcc\xd3\xcc\xc7\xb6\x9d\x58\x50\xb3\xe3\x27\xdf\xd2\xc8\xdb\x94\x71\x90\xd7\x42\xea\x5d\xf8\xa4\x51\xec\x66\xb0\x2e\x8e\x36\x9b\x9f\x32\xc6\xf5\xef\x7e\xfb\xc8\x93\x29\x14\x99\x58\x9a\xfd\xf3\xf4\xf1\xdc\xf1\x7d\x76\x66\x25\xbb\xf6\xb7\x2b\xfb\xd8\xb1\x3f\x6b\x1a\x8c\xd1\xd3\x26\xed\xb3\x53\x47\x3c\xd6\xbb\x55\x0a\xf4\xc1\xee\xdb\xeb\x4b\x6f\xeb\xb9\x81\x29\x48\xe0\x89\xe7\x73\xd5\x9f\x5a\x10\x4a\xbe\x2b\x27\x20\x39\x68\x50\x0d\x4d\x60\x59\x80\x37\xac\x81\xfd\x81\x04\x49\x4a\xcd\x32\xf6\xcf\x4d\xe6\x88\x4d\x6f\x15\xfd\xa6\x7d\x42\xa6\xf2\x8f\x3d\x21\x59\xf9\xc7\x9e\x92\xaf\x6c\xdb\xe7\xea\x7e\x7a\x17\xda\xd6\x5a\x27\x34\x82\x38\x8d\xa1\x5a\x99\xb4\xbd\x14\xd1\x39\xf9\xd3\xdb\x7c\x03\xa5\xd7\x68\x3c\x6f\x19\x9f\xb7\x11\x4c\x4e\xb6\xf9\x25\xc6\x46\xe1\x1f\xa3\x49\xfc\xc7\x9f\xc6\xb6\xcb\xd3\x31\x79\x9f\x17\x7a\xe9\xcd\x40\xec\x89\xce\x99\x22\x5c\xe8\x75\x41\x30\xfa\x34\x2d\x36\x1b\x21\x9f\x9c\xa9\x8b\xeb\x4b\x6f\xde\x7e\xc1\xa5\x55\x05\x24\x3d\x10\xf4\x6f\x5b\x64\xb4\xc4\xfc\x29\x83\x2c\x25\xcc\xc8\xf0\x86\x58\x32\xc9\x44\x72\xef\x2c\xf9\x37\xef\x88\x12\x96\xe7\x18\x45\xcf\x48\xfe\x89\xe0\xaa\xcc\x81\xb0\xa7\x98\xc8\x20\xd9\x0f\x92\x7d\xb3\x0d\x92\xfd\x20\xd9\xb7\x9a\x75\xd2\xf5\x81\x39\xae\x10\xb2\x95\x3d\xe2\x73\x03\x83\x7c\xac\x0d\x0c\x12\xdb\xc0\x20\x07\x06\xf9\x54\xc7\x4f\xbe\xe5\x4e\x92\xee\x93\x7d\x3d\xc5\x3b\x06\xcf\xc1\xe0\x39\x18\x3c\x07\xae\x0d\xd7\xa7\x6b\xc3\xf5\x39\x5c\x9f\xed\xf6\xd9\x5d\x9f\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xd0\x6c\x83\xe7\x60\xf0\x1c\x0c\x9e\x83\xc1\x73\xb0\xa5\x0d\x92\x7d\xc7\x4e\x07\xc9\x7e\x90\xec\xb7\xb5\xc1\x73\x30\x78\x0e\x06\x06\x39\x30\xc8\x81\x41\x6e\x69\x7d\xf4\x1c\x24\x19\x50\xbe\x59\x9d\x5f\x49\x6e\xc4\xe7\x50\x00\x64\x53\xe6\x52\xfb\xdc\xaf\xc9\x04\xe6\x74\xc1\x44\x29\xc9\xc3\x1c\xb8\xcf\x4b\x25\x33\xd0\xca\xec\x02\xd0\xb0\x49\x03\x7c\x82\xbd\x3d\xce\xd2\x46\x04\x38\x9d\x64\x1b\x3b\x7e\x8a\x7b\xb9\x5f\x3e\xee\x29\x99\x08\x61\xde\x6e\x7d\xc6\x50\x7b\xf1\xda\x40\x84\xa4\x96\x6d\x3a\xd7\xe6\xc4\x96\xb7\x37\xef\x9e\x35\x9d\x65\x63\x27\x97\xd5\xd8\x04\x5d\x38\x98\xf6\x67\xae\x3c\xf3\xe9\xc7\x07\x0e\x29\x66\x81\x9f\x11\xa6\xcd\x03\x86\xb1\xb0\x84\xe9\x6c\x59\x91\xf7\x79\xe7\xc9\xbc\xbd\x79\xb7\xbb\x9b\xcb\xaf\xd2\xd6\xae\x23\x7a\xb4\x06\x7f\xd5\xe0\xaf\xaa\xda\x20\xb4\x75\xec\x74\x10\xda\x06\xa1\x6d\x5b\x8b\x2f\xb4\xf5\xdd\xbf\x33\x78\x65\xc8\xe0\x95\xf1\x8f\x0d\x5e\x99\x27\x1f\x1f\xbc\x32\x83\x57\x66\xf0\xca\x3c\xde\x06\xf9\xd5\xb5\x41\x7e\x1d\xe4\xd7\x76\xfb\xec\xe4\xd7\xc1\x2b\x33\x30\xc8\x81\x41\xd6\x6d\x60\x90\x03\x83\x6c\xb5\xcf\x31\x9f\x63\xb0\x70\x0f\x16\xee\xc1\xc2\x3d\x5c\x80\xc3\x05\x38\x5c\x80\x4f\x75\x3c\x58\xb8\x7d\x1b\x2c\xdc\x83\x85\xbb\xd5\x06\x0b\xf7\x60\xe1\x1e\x2c\xdc\x83\x85\x7b\x4b\x1b\xe4\xd7\x8e\x9d\x0e\xf2\xeb\x20\xbf\x6e\x6b\x83\x85\x7b\xb0\x70\x0f\x0c\x72\x60\x90\x03\x83\xdc\xd2\xfa\x68\xe1\x7e\xe2\xf0\xee\xb2\x4b\x9b\xf6\x6a\x27\x36\xfb\x48\xf7\x31\x79\x4b\x39\x61\x3c\xc9\xca\x14\xf0\x9b\x29\x50\x5d\x4a\x50\x67\x24\x63\x39\xf3\xc5\x3a\x84\x34\x9b\x66\x94\x50\x05\xca\xf5\xb1\x71\xa8\xaa\xdf\x0d\xdf\x3e\xfe\x9a\x8f\xf3\x91\x47\x8b\x8b\x55\x61\xfb\x8c\xfb\x7e\xdc\xb6\xda\x9b\x0c\x96\xec\x30\xcd\x66\x7c\xf3\x20\xd6\x6e\xb1\x85\x7e\x9e\x7c\xed\x6d\x5b\xf0\x91\x2d\xf7\xe4\xe5\xf2\xd4\x95\x32\x22\x13\xaa\xe0\x0f\xff\xb6\x56\xe2\xaa\xf9\x48\x0e\x29\xa3\x66\xa8\x8d\x4f\x3c\x7d\xcd\xd4\x43\x6c\xdf\xe4\x3b\x1c\x96\x8a\x8c\x8e\xbd\xb8\x72\x36\x5d\x8f\x88\xd9\x77\xe9\xa5\xed\xe3\x56\x4b\xaa\x61\xb6\x6c\xd4\x6d\xc2\x6d\x56\x0b\x0d\x7c\x4b\x09\x33\xaf\x81\x6e\x1c\xe2\x61\x0e\xd2\x1e\x31\x5f\x2b\x48\xf9\x81\x98\xaa\xd2\x85\xba\xe4\x7f\x3c\x95\xff\xe3\xc7\xd9\xf0\xf5\x53\xeb\xbb\xa9\x82\x92\x6f\xbb\x5e\x90\x7e\x3e\xdf\x59\x0f\xd9\xbb\x0a\x08\x66\x75\x82\x0b\x2a\xcd\xc5\xe4\x3d\x69\x28\x9e\xd5\x4f\x6f\xed\x7f\x65\xd9\xb6\xdd\x51\x3b\xc8\x6a\x4f\xcb\x68\xa3\x06\x8e\xcd\x36\xaf\xde\x2e\xa2\x99\x2b\xc6\x78\x0d\x32\x67\x4a\x6d\x4b\x8a\x6a\x93\xfe\xd4\x2d\xb6\xc3\xed\xb5\x22\x33\xfb\x75\xf1\x6f\xd4\x20\xa7\x12\xa0\xad\x95\x65\x42\x13\x22\xcb\xcc\x88\xd3\x3c\x25\xae\x4e\x11\xa1\x49\x22\x4a\xae\x09\x07\x48\x31\xb1\x6a\xe3\xf6\xde\xe1\xee\xdb\x41\x82\xde\x55\x7e\x1e\x59\x3a\x9f\x7c\xca\xbd\xc3\x85\x7d\x85\x8d\x45\xb2\x9a\x6d\x77\x79\x1b\x87\x7f\x5a\x88\xd8\x47\x32\xd9\x59\x2e\xe9\x22\xb3\x5e\x8b\x8c\x25\xcb\x9b\x32\x03\x32\x17\x59\xaa\xb0\xe6\x9b\xb9\x3c\x2b\x9f\x68\x53\x97\x2a\xf0\x69\x7c\xc9\x33\x32\x29\x35\x49\x05\x58\xb3\xa1\x43\x97\x6a\xfe\x7c\xa7\xf1\xad\xa7\xfc\x61\x6e\x8b\x11\x9a\x8e\x09\x2d\x8a\x0c\x33\x27\x85\x11\x3c\x1e\xe6\x2c\x99\xdb\x1a\xac\x05\x4d\x60\xd3\x63\xbb\xcb\xa5\x3b\xe9\x6a\x64\x2f\x7d\x8d\x78\xb3\xf7\xe4\xa9\x5d\x47\xf6\x54\xdc\x88\x2d\x0b\xf6\x8d\x14\x65\xb1\xe3\xe3\xdd\xf6\x00\xb1\x25\xc3\xec\x40\xe6\x3a\xd2\x2b\x22\x96\xff\xd2\x39\xc9\xed\x52\x2b\x67\x81\x75\x1e\x99\x31\xa6\x3f\xe6\x65\xa6\x59\x91\xe1\x4f\x2c\x02\x96\x22\x54\x42\x7d\xc1\x9d\x11\xca\x97\xde\xe7\xee\x4a\x18\x42\x4a\xe8\xcc\xf4\xa8\xb1\x3c\xaa\x98\xee\x4c\xb5\xad\x91\x58\xe6\x46\xfe\x6a\xd8\x80\x15\xaa\xfb\x7c\x59\x53\x41\x1e\x58\x96\x19\xe5\x87\x66\x99\x78\x80\x74\x4c\x8e\x8e\x56\x2f\xa0\x44\xc8\x06\xdd\xc8\xea\x8e\xfe\xb5\xf5\x94\xe1\x6b\xf5\x8b\xed\xa6\xc8\xed\xab\x85\x90\xfd\x34\x11\xb2\xbf\xce\x45\x50\x95\xba\xaf\x1c\x54\xa3\x8c\x29\x3d\x72\x54\x6a\x91\xb3\x64\xa7\x4e\xb8\xe0\xde\x11\xf1\xe7\x9b\xef\x9f\x7d\x83\x5e\xb5\x87\x73\x35\x39\x41\x9b\x3d\x5a\x50\xa9\x19\xcd\x48\x29\x33\x65\xf7\x28\x35\x0a\x8b\xf4\x55\x50\xe7\x14\xe3\x3c\x12\x50\xc8\x2e\x08\xf9\x57\xbb\x2b\xdd\x66\xb0\xac\x4c\xf0\x6c\x49\xa8\xdd\x0a\xd3\x32\xcb\xce\xc8\x94\x71\x6a\x2e\x32\x28\x7c\x0e\xef\x0e\xa6\x99\xba\xdd\x32\x9e\x80\x99\xa6\x51\xe5\x9b\x40\xca\xcd\xc8\x86\x65\x56\x3c\x2d\x3d\x73\x65\x3f\xad\xa5\x4a\x39\x52\x0c\x7f\x4b\xe8\x24\x03\xd4\x34\x9c\xcc\x79\x23\x32\x74\x29\x56\x7e\x0f\xac\x15\x4a\x9b\x5f\xff\x2f\xc6\x77\xd5\xd6\x6d\xbb\xc1\xab\x3d\xa1\x9c\x00\xd3\x73\x90\x38\xf4\xd2\xf0\x5f\xb3\xd9\xeb\x43\x75\xa2\xca\x64\x6e\xa6\xe8\xa8\x10\xa9\x3a\x32\xdc\xf9\x48\x41\x22\x41\xab\xa3\x53\xf3\xd7\xea\xbb\xe2\x7c\x35\x7f\x77\x4e\x0b\x76\x74\x7a\x46\x70\xc2\xb1\x40\xa9\xd0\xf3\x5f\xf8\x39\xf2\x13\xd6\xaa\xe7\xfd\x54\x6b\x9d\xa2\x9b\x66\x0f\xae\xb2\xa6\x28\x6c\x51\x4a\x73\x7f\x6a\xc0\xb4\x73\x73\x52\x70\xcf\x35\x7c\xd0\x2b\x17\x29\x21\x17\x9c\x80\xf5\x1a\x82\x26\x39\x50\xee\x9e\x86\x05\xc8\xa5\x9e\xa3\x23\x51\x55\x5c\x74\x58\xb9\x1d\xa2\x11\xea\xb6\x71\xd5\x1c\x2b\xf3\x2b\x54\x1f\x37\x5b\xfc\x79\x75\x85\x8e\xff\xf5\x78\xf5\x4a\xaa\xef\xe0\x5f\xf6\x7a\xa0\x10\xd6\x69\x2d\x7e\x30\xbf\x6c\xaf\x83\xfd\xc8\x5e\x26\x15\x3b\xfc\xfe\x7b\x5b\xec\xd9\x4d\xf8\x77\x8c\xa7\xaa\x02\x56\x4d\xed\x2d\xe1\x16\x6d\xe3\x4a\x21\x85\xbf\xd8\x55\x5a\x57\xba\x76\x55\x94\x9e\xa0\xb1\xa1\x95\xf7\x41\x91\xc6\x7a\xd1\x2d\x29\xd9\xb0\xdd\x33\xeb\x9d\x37\x62\x65\x46\x27\x90\x29\x67\x40\x84\x06\xf9\xe4\xe2\xfb\x0f\x55\xe9\x76\x09\xf4\x09\xa3\xf8\x33\xa8\xcf\x3b\x84\xf9\xac\x95\xc8\x5f\x6f\xbb\xab\x39\x38\x15\xfb\x39\xb1\xc8\x2d\x68\x7b\x56\x73\x5a\x98\xa3\x6a\xfb\xb0\xce\x95\x15\xc7\xc9\xf7\x38\xd3\x4f\x9f\xb8\xbd\xd4\xc3\xdd\x4b\x3e\x6f\x1a\x64\xa7\xf3\xb6\x5b\x28\xd1\x1e\x1d\x3e\x66\xca\xab\x5b\x6b\x9a\x57\x36\xb4\xd3\x0b\x9d\x26\x97\xd0\xa6\x43\x21\x05\x65\xc1\x75\x2c\xc0\x91\xf4\x9f\xd7\x5d\x44\x5e\x82\x7d\xf4\xf3\x11\x51\x90\x41\xb2\xa9\x26\xfb\xa6\x87\x35\xe4\x45\xf6\xd4\xc9\x23\x7b\xeb\xf2\x39\xe3\x37\x40\xd3\xe5\x2d\x24\x82\xa7\x3b\x72\xe9\x6e\xca\xd2\x07\xc6\x59\x5e\xe6\x84\x97\xf9\x04\x70\x2d\x94\x1d\x14\x39\x8e\x35\xa8\x50\xc2\xe1\x21\x5b\x3a\x2e\x93\x92\x42\xa4\x9e\xf1\x4c\x8c\x56\x4f\xd3\x5d\x2f\x9d\x07\xa6\xe7\x58\xb6\x82\x2f\xcd\x50\x4c\xd7\x37\xa2\x24\x89\xa4\xca\x08\x8d\x67\x38\x34\xd3\xe6\x16\x9d\x00\xba\xd8\x59\x0a\x66\xcb\xd0\x05\x65\x99\xd1\x72\x76\xbd\x16\xdf\xc1\x94\x96\x99\x46\xfb\xd0\x2b\x72\x62\x08\xf7\xca\xfd\xa6\x6e\x8d\xde\xa1\x84\xe0\xe6\xbf\x16\x76\x09\x5f\xee\x74\x0f\x3f\xdf\x2e\x40\xe8\xbe\xed\x0a\x88\xee\x5b\x41\x4b\xb5\xab\x99\xa9\xb5\x1b\x2e\x79\x6a\x0e\x61\x53\x9a\x6f\xdc\x23\x4c\xb9\x9e\x77\x9b\xd5\xc7\xa1\xbc\x36\x50\x2d\xc5\x4c\x82\x52\xef\x80\xa6\x19\xe3\xf0\x02\x9b\xfa\x6e\x0e\x24\xa7\x9f\x70\x63\x6b\x96\x83\x11\xb6\x9a\xdb\x9a\x36\x5f\x5f\x0b\x92\xd3\x7b\xa8\xe8\x24\x13\x98\x0a\xb9\x43\x48\x87\x6f\x4c\x35\x37\x93\xdd\xb4\x53\xca\x32\x48\xc7\x48\x49\x63\x2c\xb3\xd9\xa5\xc8\x32\x90\x76\x1f\x9a\xbf\x19\x2f\x81\x68\xb1\xe3\x60\x85\x14\x68\x9a\xb0\x03\x34\xa5\x19\x94\x16\xa8\xe9\xd2\xde\x38\x78\xd8\x08\x25\xd7\x2b\xf3\xff\xfe\x53\x82\x46\xf8\x1d\x07\x94\x40\x15\x76\x66\x8f\x8d\x2a\xe5\x94\x26\x5e\x7e\x6d\xbd\x9c\x8d\x98\x19\x93\x2b\xa1\x5d\xe8\x72\x35\xa5\xe6\xd7\x3b\x8e\x87\x9a\x3e\x10\x50\x9a\xe5\xc8\x6d\xd2\x12\x43\x52\xcd\x60\xb8\x96\x74\xf3\xde\x6d\x9d\xf5\x3f\xbc\x7a\xb5\xa3\xe8\xfc\xfc\xa7\x56\x02\xda\x66\x9e\x75\xc3\x5f\x55\xdc\xdb\xdf\xae\x85\x48\x95\xd9\x7e\xcc\xa9\x2a\x85\x30\xef\x28\x31\x96\x83\x29\xcd\xf8\xac\x64\x6a\x4e\x26\xa0\x1f\x00\x38\x81\x4f\x16\x5e\x6e\xc7\xf1\xfe\x09\x52\xe0\x7e\x33\xab\x55\x3b\x24\x5b\x6b\xf0\xba\x3f\x0b\xb0\x60\x8a\x09\xfe\x2d\x53\x5a\xc8\xe5\xf7\x2c\x67\x4f\xd4\xb4\xf0\xad\x3b\xf7\xa9\xaf\x53\x91\xa5\xe4\xc6\x6e\x81\x5b\xb0\x33\x23\x01\xdd\x1f\x5a\x58\xdb\x08\x31\x1c\x61\x42\x93\xfb\x5d\x6f\xb5\xbd\x57\x75\xdb\x7a\x75\xb8\x45\x5f\xbf\xea\xcb\xb2\x7a\x41\xed\x39\x97\x12\x55\x82\x6a\x24\xbc\x3b\xec\xc1\x7a\xff\xc9\x4e\x77\x6b\x69\x1f\xe6\x42\x01\x3e\x40\xa8\x7c\x5a\x26\x6c\xbe\x86\xf7\x89\x32\x55\x71\x5a\x8c\x57\xe1\xa0\x08\x9d\x4e\xdb\x4f\xa4\x7b\x48\xca\xb6\x5d\x6a\x92\x97\x4a\x93\x9c\xea\x64\x6e\xad\xd3\x22\xad\xa4\xd7\x63\xe5\xb4\xcc\x7d\x96\x76\x67\xf7\xd8\xfe\x8e\x2c\x62\xe9\x7c\xff\xa9\x30\x97\xc7\x53\x2e\xef\x76\x6b\xad\xf3\x6a\x37\x6d\xab\x4d\xd6\x5e\x5c\xa7\x26\xe0\x5d\x6a\x2f\xee\xe6\x27\x68\x89\xbf\xb8\x7a\xb7\xfb\xa9\xe9\x62\x94\xd9\xdb\x2c\xd3\xdd\x47\x62\xda\xc5\x23\x73\xe0\x9d\x26\xee\x9b\xb6\x37\x0f\xf5\x67\x75\x46\x28\xb9\x87\xe5\x99\x95\x3c\x1a\xa0\xa8\xe6\xe1\xbd\x08\x91\x90\x39\xf1\x14\x4c\x8f\xd8\xa1\x1d\x63\xf7\xd9\xee\xb0\x31\xfd\xe0\xfb\xf8\x6f\x7d\x1b\x19\x42\xf7\xfc\x85\x9f\xa0\x3d\x7e\xb6\xff\xd9\xb1\xed\x1e\x96\xfb\xfd\x60\x65\x27\x99\x55\x70\x5a\xbc\xdd\x23\xe6\x83\x4a\x7b\xa8\xb6\xc5\x7e\x8e\xf5\x66\xeb\x60\x50\xb4\xcd\x4f\x62\xd0\xeb\xed\x79\x50\x9a\xe3\xb6\xec\xb4\x66\x5a\x8e\x95\xdd\xbf\x86\xc3\xcc\x59\x61\x73\xfa\x9c\xb7\x71\xff\x4d\x6c\xdb\x0f\x34\x63\x69\x35\xa4\xe5\x3e\x97\xfc\xcc\xc8\xd6\xe6\x3f\x78\xfd\x58\x89\xff\x9d\x00\x75\x25\x34\x7e\xf2\x62\x6b\x60\x5f\xeb\xa5\x57\xc0\x8e\xea\x9c\x56\xc8\x56\xd1\x5e\x61\x53\xd6\xdc\x4c\x7b\x5c\xe5\x3a\xd2\x53\x91\x4b\x4e\x84\x74\x53\xb7\xf7\xa0\xa6\x33\x37\xb0\x1d\x12\x2f\xd2\x89\x75\xd6\xa2\xfb\x6b\xe3\x98\x6e\x85\x84\x6c\x2d\x50\xc4\xe1\xdd\xd0\x28\x0b\xda\x6f\xd0\x5c\x51\x64\xa8\x9d\x39\xa5\x89\xfa\xd0\xaa\x1d\xbd\x22\xcd\x96\x83\x9c\xa1\x17\x3b\xd9\xd9\xeb\x5a\x11\xdd\xe1\xe2\xb3\x6d\xef\xeb\xaf\x39\x60\x87\x8d\x1c\xc5\x97\x14\xad\x1b\x94\x57\xac\x19\xba\xa3\xc4\xb3\xd7\xa9\x6a\x0c\xd7\xb2\x91\xff\x1f\x73\xa9\xe3\xa6\xfb\xbf\xa4\xa0\x4c\xaa\x31\xb9\x20\x8a\xf1\x59\x06\xad\xef\x9c\x09\xa0\xd1\xcd\x5e\x83\x17\x66\x50\x73\xf7\x2e\x68\xe6\x0c\x31\x94\x13\xb0\xe6\x78\x43\xc7\xaa\xf8\x76\xe6\x24\x6c\x73\x15\x55\xf1\x0f\x47\xf7\xb0\x3c\x3a\xdb\x1a\x66\xbe\xb9\x35\x4f\xea\xd1\x25\x3f\xb2\x22\xcc\xda\x59\xab\xe4\x1d\x0c\xb2\x38\xc2\xef\x8e\x62\xca\x86\x7b\xca\x2a\x5d\x9d\x09\xed\x41\xf7\x38\x26\xad\x5d\x9d\xd3\x62\xdf\x4d\xed\x03\x3b\x3b\xe8\x68\x77\xab\xc6\x25\x17\x01\xad\x05\x29\x15\x58\x35\x1a\x99\x1d\x01\xaf\x8b\xa1\xe6\x85\x56\x2f\x0e\x0f\xa8\x3b\xf5\x46\xa1\x31\x2a\x3e\xe3\xb3\x3f\x17\x29\xd5\x3b\xe5\x14\xd9\xd6\xfd\x6c\xdf\xd8\x01\x49\x89\x23\x9a\x9d\x3c\x65\x33\x52\x50\x49\x73\x35\x26\xd7\xae\xdc\x00\xee\x6b\x36\x6d\xba\x6f\xdc\x3c\xdf\x2d\x0b\x20\xff\x73\xff\x01\xed\x1b\x3e\xf3\x39\xe8\x26\x14\xe7\xf4\xd3\x6d\x29\x67\x7b\x4c\x3f\x09\x16\x5a\x9a\x96\xe8\xda\x26\x84\x1b\xb5\x09\x22\xa4\x92\x39\xa4\x65\x06\x29\xa1\x13\xb1\x80\x96\x9f\xac\xfa\xd9\x9e\x43\xa3\xa1\x62\xcf\xdf\xfc\x60\x38\x9c\x27\xca\x08\x59\x13\x25\xb2\x52\x57\xf6\xac\x13\xf8\xf4\x86\xfc\x1e\xe3\xb7\x28\x29\x40\x26\xc0\x35\x9d\xc1\xaa\xe1\xd1\x3e\xf7\xfa\xd5\xbf\x9c\xee\x4b\x00\x8a\x33\x66\x7c\x67\x06\x7e\x65\x76\xe7\x07\xfa\xe9\xcf\xbc\x76\xd2\x30\x45\x76\x34\x42\xd5\xed\x62\xe5\x45\x70\x94\x2c\x29\x33\x34\x31\x63\x5c\x5c\xe3\x75\x26\x4b\x22\x45\x89\x91\x71\xa4\x2c\xf6\x1d\xab\x69\x2e\xfb\xed\xef\xff\x65\xdf\x9f\xbf\xff\x44\xf3\x22\x83\x37\xbe\xee\x8b\xb5\xf5\x19\x7d\x42\x0b\xf2\xbb\x57\xff\x72\x66\xa3\x04\xe0\xa1\x61\x7b\xaa\xf7\x11\x35\x9b\xa8\x2c\x08\xcb\x6d\x9e\x0c\x64\x4b\xec\x68\x5f\x09\xce\x5c\x71\x6d\x16\xa2\x34\x95\x5a\x9d\x11\x0c\xd0\xab\x34\x41\x2d\x34\xcd\x56\xcc\x9d\x68\x68\x84\x07\xbb\x15\x52\x81\x6b\x09\xe8\x75\xd8\x93\x8a\xd7\xbf\x7b\xf5\x2f\xeb\x46\xed\x8f\x3c\x01\x1c\x07\xfb\xc7\x78\xcd\x09\x00\x27\xf7\x2c\xcb\x20\xdd\x57\xc4\x7e\x6a\x22\xa7\xa5\xd4\x73\x90\x67\x04\xb8\xf2\x9e\x08\xf3\xee\x2b\xef\x8d\xb4\xc8\x92\xf3\xfd\x25\x50\x6a\xfd\xa1\xe8\xdc\x68\x38\x3b\xdc\xb4\x1b\xc1\x4c\x93\x5c\x28\xbd\x79\x3a\xf6\x1a\x8c\xf2\xe5\xc7\xe9\xbe\xe2\xf5\xa8\x83\x31\x77\xfd\xd7\x1d\x84\xf3\x96\xf4\xc1\xb8\x1e\x09\x39\xb2\xdd\xbc\x21\x5a\x96\xfb\x08\x7c\x79\x8b\x85\xf4\xf0\x06\x28\x1b\x0c\x6e\x6d\x13\x7c\x76\x6c\xbc\x3b\xbb\x4d\xc5\x03\x8f\x75\x69\xe0\x6d\xdf\xe9\xba\x78\x11\x16\xde\xf6\x0c\xad\x70\x1e\x33\x0f\xe6\xe9\xff\xff\xfa\x91\xdf\x57\xa5\x5e\xb9\x09\xb6\xf3\x76\xc7\x5a\x2b\xd6\x6d\xd4\x1a\x0c\x80\x38\x5b\xa1\x75\x4f\x0a\x36\xbc\x59\xc5\x55\xa7\xc2\x86\x07\x9b\x4d\x60\x1e\xb0\x44\x6d\xb8\xe2\x6a\x06\xbc\xf7\x55\xb6\xe5\xaa\xb2\xef\x58\xc7\x7e\x68\x0c\xbb\x34\x6c\x58\x6d\xe3\xc3\x7b\x0e\x9d\x01\x55\x7a\xd3\x12\x0e\x5c\xfb\xc9\xf6\x78\x86\xef\x6a\x6b\xab\x8e\x46\x77\xc1\x19\xaf\xfc\x64\x98\xbc\x3e\x01\x72\x74\x03\x36\x8a\xc9\x66\x24\xb4\x94\x96\xa3\xca\x7f\x6d\x16\x3b\x48\x9f\xd9\x79\xda\xbc\x0b\xee\x59\xfd\xd1\x6e\x8c\x46\x76\x9e\xf3\x00\xba\x2b\xa8\x0a\x89\xb2\xf1\x5d\xbb\xbb\xa1\xc1\x65\x9f\xb8\x23\xec\x5f\x66\xac\x0a\x48\xc6\x12\x90\xab\xd8\xa4\x41\x6b\x57\x41\x73\xcb\x45\xf6\x40\x97\xea\xa8\x37\xaa\x79\x0e\x9a\x3e\x9e\x94\xbe\xda\xba\x0b\x04\xb7\x9a\xf2\x94\xca\xd4\xbd\xd1\xb1\xaa\x46\xdf\x87\x23\x7c\xc0\xf0\x24\x3e\x15\x6f\xc8\x5c\xeb\x42\xbd\x39\x3f\x9f\x31\x3d\xbe\xff\xa3\x1a\x33\x71\x9e\x88\x3c\x2f\x39\xd3\xcb\x73\x8c\x36\x62\x93\x52\x0b\xa9\xce\x53\x58\x40\x76\xae\xd8\x6c\x44\x65\x32\x67\x1a\x12\x5d\x4a\x38\xa7\x05\x1b\x25\x82\x2f\x80\xa3\xff\x62\x9c\xa7\xbf\xf6\x24\x3d\xaf\x0e\xdf\x62\x13\xe8\x50\x91\x0b\x18\x95\xfc\x9e\x8b\x07\x3e\x42\xf3\x9e\xda\x8b\x61\xec\x16\xb5\xea\x5b\xc0\x1a\xee\x13\xd4\x5a\x88\x3d\x6c\x82\xcf\xbe\xb2\x66\x8a\x46\x94\xa7\x23\x1b\xaa\xf5\xbc\x0b\xdc\xc5\xad\x3a\xaa\xc3\x41\x77\xa7\xae\x9b\x35\x88\x26\x9a\x2d\xa0\x53\x50\xa2\x6f\x61\x8a\xc1\x47\x9f\x75\x95\x96\xd2\xee\xa5\x46\x94\xa2\x0f\xd1\xc8\xe9\x12\x65\x78\x24\x96\x08\x2b\xbc\x71\x91\x82\x73\x39\x2e\xf6\x08\x1d\xf4\xed\xd6\xb0\xe5\x3b\xa3\x6d\xba\x48\x47\xf4\xe8\x2e\x95\x86\xdc\x5e\x05\x76\xb4\x6c\x49\xb4\x5c\xda\xf0\x48\x79\x4f\x98\xf6\x31\x87\x46\xbd\xbf\xc7\xe7\x94\x12\x09\x43\x91\xbe\x5e\xb6\x6e\xba\x8a\xf7\x6a\x51\x52\x08\xc5\xf0\xbd\x9c\xe0\xb2\x5f\x7f\xdd\x65\x9e\x46\xf8\xd1\x1f\xfe\x6d\x9f\x7d\x34\x45\x60\xcd\x3d\xbd\xed\xed\xf0\xdc\x69\x33\xe7\xd9\x2d\xfd\xb1\xf2\x56\x41\x23\x88\x26\x82\x2b\x2d\x29\xdb\x8e\x25\xb1\xb9\x75\x0c\x89\xe8\x1e\x77\x40\x70\x77\x5e\x74\x9a\x14\xb2\x9e\x55\xe0\x05\x16\xdc\xf2\x7e\xaa\x9b\x13\x63\xa1\x26\x7c\x76\xcc\x9e\xec\xd6\xb6\xce\x73\x44\x82\xe6\xc9\xfe\xda\x02\xfb\xa6\xef\x50\xdf\xb8\xad\xde\xeb\x72\xc6\x45\xf5\xf1\xfb\x4f\x90\x94\xbb\x62\xb2\xad\xb7\x50\xb7\xbb\x6d\x46\xda\xf3\x66\x6a\x17\xbd\x6c\xa9\x37\x1c\xc2\x7f\xe1\x84\x4a\x81\xeb\xe5\xa4\x4b\x45\x35\x53\xd3\x7d\x1d\xc1\xbe\x99\x55\xad\xd6\x1d\x1a\xa1\x5c\xd5\x89\xa9\xc2\xe2\x50\x66\xb0\xf9\xd9\x4c\x23\xe7\x4c\xe6\x42\xa8\x7d\xcc\x44\xcd\x46\xed\xa6\xc3\x77\x58\x30\x61\x03\x94\x10\x73\x40\x92\xdc\xb0\x4d\x77\xc5\x37\x88\xb2\xae\xc1\xfa\x67\x6c\x5f\x5d\xdd\x37\x34\xf7\x55\x9b\xc3\x07\xe2\x98\xc1\xd1\xbd\x65\xfe\x98\xa1\xb0\xae\x34\x51\x65\x6e\x48\x79\x00\x36\x9b\x6b\x75\x46\xd8\x78\x6f\x7b\x91\x6f\xe6\x18\x01\x4d\xe6\x8d\x57\xc8\x01\x74\xab\x58\x76\xf3\xec\x35\x7d\xa0\x27\x8f\x42\x1a\x3d\xdd\x1c\xbe\xc3\x59\x25\x37\xac\x1e\x89\x8d\xdb\xe0\x8c\x80\x4e\xc6\xa7\xfb\xc7\x55\xd8\x56\x83\xd7\x99\x59\x9c\x2c\x09\xd3\x60\x2e\x63\x54\xfd\xa5\x28\x67\x76\xae\xc1\xa7\x88\xe1\x1c\x54\xd9\xf7\x18\xf6\x96\xa6\xfb\x9b\x24\x7c\x3b\xb2\x8b\x76\x64\x4e\x0c\xce\x6d\x99\x7b\xe8\x65\x5c\x01\x74\x80\x43\x85\x38\x21\x41\x15\xc2\x9a\xc9\x56\x5d\xe3\xff\x63\x4f\x07\x78\xb3\x99\xa1\x4e\xd4\x69\xbd\xb5\xe6\x6c\x36\xf7\x3b\x8b\x3a\xf9\xa0\xbd\x23\xbb\x6d\xb0\xee\x61\x21\xb6\x75\x0c\x0e\xb1\x2d\x0e\x17\x6c\x24\xbd\xd7\xc7\xb3\x71\x24\x34\xc8\xbc\x5a\x36\x3c\x35\x78\xad\x38\xb7\xb4\x2f\xe2\xee\x0e\x2b\x79\xd5\x99\x8a\x13\x73\xca\x09\x33\x1a\xa4\xe1\x53\x23\x51\x9c\x8e\xc9\x05\xe1\x65\xc5\x96\x1f\x23\x8c\x8b\x8a\x2e\xd7\x91\x21\x56\x89\xba\xaf\xae\xdc\x3a\xe4\x2a\xb5\xad\x5b\x34\x66\xb3\x8d\xdc\x0c\xc0\xd3\x65\x57\x1e\xeb\xc4\xae\x51\xc7\x0e\xc2\xc4\x02\xdf\x87\x7f\x8b\xee\x7d\xac\xc2\xa2\x5b\xbe\x52\x47\xf5\x82\xcc\xcf\x9a\x72\x7c\xc5\x03\xda\xec\xc6\xce\x45\xd7\x5d\x41\xe2\xec\x0c\x12\x69\x5e\x49\x50\x80\xf9\xe6\xb6\x32\xcb\x15\x84\x46\x6b\xb6\x5b\xf7\xe5\x64\x89\xdf\xee\x19\x7b\xbf\xbd\x85\x32\xd7\xba\x05\xb1\xd9\xba\xc5\x62\xb8\x75\x5b\xdd\xbd\x71\xa2\xd5\x23\x10\x86\xc3\xc5\x89\x61\xdf\x32\x40\x9c\xd3\x63\x5b\x38\x87\xad\xdb\xfe\x51\xf0\xdb\xfa\x89\xb6\x1c\xb1\x58\x84\x6d\x1d\xe2\xe8\x37\xb7\xb5\xe0\xb6\xe7\x09\xab\xdf\xdc\x02\xe2\x63\x37\xb5\xae\x21\xf8\x9b\x5b\x7c\x46\x61\xda\xcd\x0b\x44\xe9\x6f\x6e\x3b\xc5\xee\x9f\xb5\x03\xf7\xc9\x37\xda\x32\xa6\xef\x83\x6e\xd9\xba\x45\x5e\xf1\x6e\x01\xff\x9b\xdb\xf3\xac\xf7\xc5\xcb\xa5\x04\x6c\x6e\x07\x4e\x14\xd8\x93\xa8\xed\x04\x7d\xa3\x0d\x31\xdf\xeb\xb3\xc6\x8f\x23\x51\xd3\x20\xc1\xc2\xec\xf9\xa8\x72\xa7\x60\x9f\x39\xc0\x09\xef\x90\xc4\xe4\xd6\x42\x02\xa2\x3e\x62\xd6\x47\x27\xa3\xf0\xf6\xb6\x73\xf6\x44\x48\x36\xc4\xe6\x16\x4f\x5e\xb3\x2d\x92\xd4\x66\x5b\x64\xee\x11\x2d\xcb\xe2\xc5\x3b\x47\x3d\xe1\x6b\xeb\x8c\x3c\xa0\x8a\x60\xdd\xa1\x83\x8a\xf0\x64\x1b\x54\x84\x41\x45\x78\xba\x0d\x2a\xc2\x7a\x1b\x54\x84\x41\x45\x08\x6a\x83\x8a\xf0\x64\x1b\x54\x84\x27\xdb\xa0\x22\xd4\x6d\x50\x11\xfa\xaf\x22\x84\x66\xc8\x6e\x6e\xd6\xdf\x12\xcd\xed\xf3\x17\xeb\x6e\x5c\xf5\xf3\xa0\x72\xe3\xc3\xdc\xdb\x0e\x1f\x23\x45\xdf\x3a\x51\xe3\x0e\x9d\x44\x2e\xd9\x5b\x52\x3e\x03\xf2\x7a\xf4\xfa\xd5\xde\x49\x15\xcd\x16\x12\x9b\xde\x6c\xfb\x82\x46\xad\xb7\xe8\x3b\x63\x5b\xfc\x42\xff\x42\x7a\x1c\x67\xaf\xe2\x2a\x5a\xca\xe7\x96\xf8\x9a\xaa\x22\x41\x0e\x7a\xff\x84\x08\xdf\x9a\x8e\x69\x96\x43\x15\xf4\x66\xd9\xba\x4b\xe3\xa9\x93\x62\x05\x77\x01\x12\x66\x5b\x76\xdd\x76\x9d\xde\x36\x01\x6a\x93\xcd\x27\x60\xde\xb8\x6b\x28\x91\x26\x4a\xe4\x60\xe1\xda\xfc\xd5\x61\x5e\x17\xfc\x36\x20\x27\x30\x9e\x8d\x49\x5a\x82\x83\x41\xb0\x59\x27\xa7\x67\x8d\xe0\xcc\xae\xb1\x44\x46\xe0\x91\xf8\x1f\x33\xb1\x2e\xa6\x13\x16\xc0\x75\x49\xb3\x6c\x49\x60\xc1\x12\x5d\xad\x00\x26\x67\x31\xad\x02\xe6\x3a\x58\x15\x0d\x55\x3f\x47\x6b\xfc\xab\x9b\x78\x12\xae\x27\xae\xd1\xd1\x9d\xa7\xaf\x14\x04\xb0\x33\x34\xde\x6a\x49\xd2\x66\x34\x1b\x90\x86\xff\xc4\x83\xfb\xf1\xa6\x6b\xec\x0e\x89\x24\x8f\x04\xcb\x20\x31\x55\x03\x17\x30\x23\xa4\x0b\xe9\x59\x9f\xc1\x0d\x21\x33\x1b\xf0\x3f\xf6\xce\xcd\x6f\x37\x3d\x87\xbc\x0b\x86\xc8\xa6\x66\x68\xbb\x13\x85\xc8\xc4\x6c\xd9\xdc\x78\xae\x6e\x7f\x8d\x76\x4e\x89\x2a\x27\x4e\xb9\x35\x67\xff\x6a\x65\xa7\x0e\xc1\x1e\x5b\xdb\x10\xec\xb1\xd6\x06\x4b\xee\x60\xc9\xdd\xa3\x9f\xc1\x92\x3b\x58\x72\x07\x4b\xee\x60\xc9\xed\xda\x06\x4b\xee\x5e\x44\x0d\x96\x5c\x32\x58\x72\xb7\xb6\xc1\x92\xeb\xda\x10\xec\xb1\xb1\x0d\x2a\xc2\xbe\x6d\x50\x11\xc2\xfb\x19\x54\x84\x41\x45\x18\x54\x84\x41\x45\xe8\xda\x06\x15\x61\x2f\xa2\x06\x15\x81\x0c\x2a\xc2\xd6\x36\xa8\x08\xeb\x1d\x47\x0b\xf6\x78\x06\x72\x63\x12\x5a\x88\x34\x3a\x9c\x4b\x21\xd2\x47\xd0\x5c\xac\x2f\x3c\x11\xa3\x4c\x24\x14\x6b\x09\x32\xfb\x13\x17\x83\xa2\x68\x6e\x43\x01\xce\xc8\x3f\x05\x07\x8b\x01\x61\x6b\x77\xe6\x40\x84\x9e\x03\x96\xe9\x3a\x51\xa7\x1d\x12\xd9\x07\x34\x98\x5d\xda\x80\x06\x33\xa0\xc1\x0c\x68\x30\x2f\x8b\x06\x33\xa7\xca\x95\xb8\x40\xa1\x68\x3b\x38\x4c\x83\x63\xdf\x81\xcc\x07\x6c\x98\xa7\xda\x9a\x2e\xee\x8e\x8f\x59\xe1\xc6\x66\xb7\x33\x9e\xba\x70\x4a\x48\xaf\xdb\xf3\xec\x0c\x77\x38\x2d\x34\x4d\x21\x25\x05\xc8\x91\x3d\x3c\x82\x4c\x99\xab\x30\xb3\x72\x9a\xdd\x0c\x77\x65\x88\x3d\x01\x5c\x69\xcf\x44\x40\x4f\x87\x47\x5d\x69\xbf\x4a\xb4\x50\xa5\x66\xc4\x56\x4b\xfc\xf9\xec\x30\x58\xe2\xd8\x0b\x47\x44\xbb\x30\xa5\xef\x82\x2c\x86\xb1\xcc\x7b\x68\x7e\xbb\xdd\xab\xa6\xec\xf6\x16\xdb\xa4\xe1\x0b\x75\xfe\x77\x09\x72\x49\xc4\x02\x64\x6d\xac\xf2\x37\xad\x72\x31\xda\x88\x85\xef\xea\xd0\x86\xab\xa6\x97\x53\x8b\x32\xc5\xcb\x2c\x3b\xb3\xbd\xaf\xb2\x3d\x7f\x11\xd9\xca\x4b\xc2\x7c\x1f\xc9\x7b\x11\xc5\xc0\x1d\xd3\xfe\x1b\x3b\x92\x8c\xf4\xac\x62\xed\xf6\x16\xd7\x3c\x11\xd1\x38\xf1\x4c\xd6\xc3\xbe\x54\xc6\xdd\xde\x9e\xd3\xbf\x44\x62\xfb\x98\x48\x64\x3f\x13\x89\xe8\x6b\x22\x71\xfd\x4d\x24\xba\xcf\x89\xc4\xf4\x3b\x91\x17\xaf\xf4\xbb\xbd\x45\x37\x2b\xc6\x76\x45\x91\x67\x63\x30\xe4\xa5\x2b\x0a\x6f\x6f\x2f\x53\x6b\x78\x7b\x7b\x86\x5d\x10\xd3\x3d\x45\x9e\x75\x0f\x1c\xa4\xa6\xf1\xf6\xd6\x4b\xa7\xd5\xa3\x84\x3d\x7b\x1d\xe4\xed\x2d\xba\x0f\x88\x3c\x83\x1f\x88\xc4\xf6\x05\x91\xe7\x39\xb2\xcf\xec\x13\x7a\x81\x01\x3a\x55\x6f\xde\xde\x9e\x83\xe7\x1c\xb4\xe2\xf3\x63\x64\x1d\xb0\x16\xf4\xf6\x76\xf8\x2a\xd1\xdb\x5b\x64\xe9\x3c\xb4\xb2\xf4\x53\x84\x46\x61\x15\xcf\xe3\x7e\x25\xad\x73\xf1\x1d\x2c\xe3\x06\x7f\x46\x38\xb9\x1f\x5a\xd4\x79\xf5\x53\xbb\x1a\x76\xb5\xd4\x8e\xbe\x36\x2b\xb0\x3b\x1f\x81\xab\x88\x9d\x65\xc1\x34\x4c\x80\x68\x7a\x0f\x18\x71\x21\xb0\x1c\x09\x4b\xc1\xd6\xad\xb1\x5b\x1d\xc7\x37\x5b\xbc\x54\x90\x1a\x42\x32\x21\xee\xcb\xc2\x1f\x15\x4c\x2b\x8e\x71\x30\x19\x4f\x44\xee\xf3\xa7\x6d\x36\x9d\x39\xf1\x8e\x17\x8c\x6c\x9d\x31\xfb\x39\x92\x83\x97\xb4\x33\xaa\xfe\xa3\x65\xe4\xfb\x07\xa1\x8a\xfc\x03\xd5\x1f\x4e\x4e\xf0\x87\xa7\xff\x08\x0f\xcd\xac\x96\xc0\xfa\xe5\x44\x89\x1c\x76\xa5\x48\x79\x7b\x75\x1e\x9b\xdd\x60\x82\x7c\x6d\x94\xe6\xc4\x1d\x5b\x7f\xfa\x09\xe5\x9a\x9d\x56\xa6\xe8\x31\xc1\xfd\x85\xba\x5f\x2a\xf8\xb1\xb6\x54\x7b\xae\xef\x3b\x08\x8f\xc8\xac\x56\xae\x8e\xec\xb1\x1e\xee\xb1\x2b\xfb\x6e\xab\xf0\x55\x35\xe3\xac\x8c\x17\x3c\xee\x9d\x8f\x1d\x70\x2a\xef\x54\xc8\x09\x4b\x53\xc0\x42\x9b\xd5\xab\x4e\x84\x87\xc6\xa8\x8f\x9c\xe1\xfb\xad\xbd\x13\x4e\xcc\x45\xa6\xc4\xd9\xea\x38\x09\xe5\x1e\xfc\x00\xb4\xad\xd6\xd9\x1a\x96\x30\x65\x96\x45\x41\xb0\xfa\xd5\xbb\xf0\xf0\xe7\xba\x27\x22\xa7\x08\x30\xd5\xf3\xbb\x62\x95\xc0\xe1\xba\x88\x7e\x5d\x70\xa1\x87\x1b\x63\xb8\x31\x56\x6e\x8c\xb5\x83\xf7\x7c\x97\xc6\xda\x50\xc3\xbd\xd1\xf3\x7b\x83\xd3\x1c\x54\x41\x13\xf8\x8c\x3c\xcc\xd6\xfc\x6f\xf3\xd6\x3c\xf9\xaa\x51\x4e\x1b\x64\x1e\xd5\x2b\xe0\xa1\x6a\xf0\xc6\xc2\x7e\x53\x1f\x0a\x55\xf2\x46\xad\xd5\x06\x31\x96\x6f\xae\x46\xfd\x05\x53\xe2\xd5\x7c\xc1\x41\xa1\xf3\x15\xaa\xd8\xd3\xc6\xe0\x38\x56\xf8\x6b\x23\x04\x4d\xed\x66\xe1\xe9\x2a\x28\x4d\x3d\x22\xfa\x81\x73\xa0\x5c\x91\x23\x1f\x14\x7b\xac\xea\x27\x76\x2c\xaa\xfc\x58\xab\xca\x5b\x55\x14\x9d\xfc\x9f\xff\x7b\xda\x2a\x69\x55\x13\x34\x78\xf9\x77\x6e\x83\x97\x3f\xa8\x0d\x5e\xfe\xc1\xcb\x1f\xa3\xaf\xc1\xcb\x3f\x78\xf9\x37\xb6\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\xe0\xe5\x5f\x6f\x83\x97\x7f\xf0\xf2\x37\xda\xe0\xe5\xef\x4e\xd6\xe0\xe5\xdf\xb3\x0d\x5e\xfe\x98\x5e\xfe\xda\x70\xd1\x37\xeb\x5b\xd3\xa4\xe5\x32\x59\x51\xfb\xd4\x54\xb3\xa4\x46\x8f\xf2\x4f\xd9\x7f\xf5\xcb\x14\xd7\x34\x93\x3d\x8f\x21\xae\x69\xec\x5b\xb3\xa7\x46\xb2\xc3\x6d\xb5\xba\x55\x76\xb9\xb5\x91\x9f\xd5\x20\x37\x98\xdb\xbb\x51\x59\xa7\x96\xf5\xed\xa8\xdf\x79\x30\x03\x35\x17\x65\x96\x1a\xe1\xb6\x42\x3a\x48\xc9\x89\xf7\xac\x9d\x9a\xad\xc8\x85\x6e\x7f\xc9\x35\x1b\xd5\x4f\x54\x89\x82\xe8\x16\xf4\xd5\x3c\xc2\x97\xd8\xdb\x08\x6a\xef\x91\xc3\x5d\xa8\x92\xec\xeb\xd3\x61\x6e\x68\x90\xad\x77\x60\x8a\xa4\x30\x65\xdc\x82\xb4\xc8\x92\x73\x23\x9c\x0b\xee\x72\xe8\x83\xe9\xb3\x22\x81\x75\xf5\x39\x3e\x64\x4d\x1a\x38\x1f\x68\xd7\xa8\x97\xbf\x91\x26\x4d\x91\x89\x52\xee\x70\xde\x05\x77\x4e\x55\xf3\x89\xed\x27\x98\xb4\x8a\x45\xe1\x8a\xb0\xea\xed\xc3\xb9\xd3\x7b\xe4\x4a\xcd\x17\x63\x0a\xf7\x07\xcd\x32\xf1\x10\x2e\x6d\x44\x39\xd7\x91\xcb\xd6\x04\x9e\xb6\x87\xbd\xab\xde\xac\xe4\xfe\x86\x69\xb6\x43\xc1\x9c\x1d\xdb\x50\x30\xe7\xe9\x36\x14\xcc\x79\xbc\x60\x4e\x23\xb2\xa9\x59\x39\xa7\xeb\x6c\x63\xbd\x9d\x03\x54\xce\x21\xe4\x2f\x73\x40\xbe\x21\xc1\x86\x23\x95\x99\x66\x45\x8d\x88\xa6\xec\xca\x67\xd6\x10\x37\x75\xc8\x3a\x6d\x2e\x66\x68\xa4\xc9\xbc\x23\x01\x2b\x3c\x10\xa9\x40\xdc\x35\x85\x37\x9b\x45\x94\x41\x3f\xb0\x2d\x2b\xe3\x2d\x74\x16\xd8\x87\x7d\xfe\xf8\x1f\x01\xb7\xce\x3b\x14\x7b\xda\xf1\x76\x8a\x9c\x18\x69\x29\x5b\xba\xa8\xb3\xd6\xf5\xd3\x12\xb3\x3a\x0f\x6b\xbd\x08\x0b\xf0\x2a\xda\x8c\x2d\x80\xd7\x32\xda\x89\x3a\x3d\xf5\xba\xe2\xaa\xec\xd9\x79\xcc\x10\x99\xb5\xfb\xbd\xba\xaf\xac\xb9\x22\x2b\x76\x1e\x77\x83\x8c\xf9\x1f\x0d\x59\xec\x3f\x9f\x96\x32\x3b\x0f\x6d\x59\x9b\x87\x5b\x6a\x6c\xab\x5a\xba\xec\xd8\x77\x4f\xb0\x63\xc2\x61\x40\x62\xf8\x61\xa3\xc1\x7f\xc4\xad\x4f\x75\x08\xd8\x8f\x03\x40\x7e\xfc\x92\x0a\x46\xf5\x32\xf8\xa7\x77\x76\xa6\xe7\x40\x8b\xef\x75\xb0\xcf\x00\x17\x1f\xd4\xcf\x2f\x0a\x2e\xfe\x40\xc1\x3c\xbf\x40\xd4\xf8\x1e\x04\xef\x1c\x32\x70\xe7\x17\x87\x1a\xdf\xa3\x40\x9d\x5e\x06\xe9\xf4\x2d\x40\x67\x80\x61\x0f\x6a\x9f\x27\x0c\x7b\xd4\x20\x9c\xd8\x7c\xa4\x87\xc1\x37\x3d\x0c\xbc\xe9\x6b\xd0\x4d\x44\x49\xf9\x79\x82\x6d\x22\xb1\x80\xe7\x09\xb2\x89\x97\x1a\x1d\xf3\x54\x1e\x1a\x3e\xa3\x17\xb9\xd0\x7d\x86\xcd\xe8\x55\x02\x74\xbf\x92\x9f\x0f\x91\xf8\xdc\x1b\x98\x8c\x03\x42\x64\xc4\x11\x03\x23\x08\x7f\xcf\xc1\xef\xe3\xc9\x62\x51\xe1\x30\xa2\xf2\xfc\xc3\xc3\x60\x7c\xb1\x6c\x3f\x22\xfc\xc5\xc0\xf9\xb7\xb6\xbe\x73\xfe\xe7\x86\xbb\x38\x2c\xd4\xc5\xc0\xff\x77\x6a\x51\x61\x2d\x9e\xd9\x73\xfa\x92\x70\x16\xfd\x80\xb2\x78\x31\x18\x8b\xfe\x40\x58\xbc\x18\x7c\xc5\xe0\xb1\x1e\x3c\xd6\xed\x36\x78\xac\x07\x8f\xf5\x3e\xfd\x0c\x1e\xeb\xc1\x63\x3d\x78\xac\x07\x8f\x75\x60\x1b\x3c\xd6\x1d\x89\x1a\x3c\xd6\x9b\xdb\xe0\xb1\x1e\x3c\xd6\x83\xc7\x7a\xad\x0d\x1e\xeb\x20\x02\x7b\xea\xb1\x8e\x03\x09\x11\xf3\x44\xf6\x09\x0a\xa2\x0f\x30\x10\x2f\x05\x01\xd1\x3b\xf8\x87\xc1\x04\xbd\x1b\x75\x71\xa0\x1e\x62\x1e\xe1\x7e\x43\x3c\xf4\x19\xde\xa1\xa7\xd0\x0e\xcf\x03\xeb\xf0\x9c\x90\x0e\xc1\x67\x36\xea\x69\x2d\x44\x7a\xc1\x35\xf3\x29\x64\xfb\x9f\xd3\xd6\xe9\x7c\x87\x7f\x4c\xc0\x9e\xb1\xd6\x81\x69\xe6\xc9\xcb\x32\x03\xe5\xd2\xc4\xe9\x42\xb0\x94\x14\xa5\xd6\x36\xf3\xd6\x9d\x4f\xbf\xf1\x69\x6e\x33\xe5\xcf\xc8\x3f\x05\x87\x33\x02\x3a\x19\x9b\xcd\x8d\x39\xe8\x42\xcf\x41\x9a\xc7\x4f\xd4\xe9\xe9\xfe\x6b\x12\x24\x9f\x85\x99\xf6\x0a\x09\x53\x90\x9f\x05\xb2\x02\x7a\x9e\x1d\x7c\x81\xb4\x0e\x6f\x4b\x3d\x86\x08\xb8\x2f\xec\xf1\xd3\xc2\x65\xbd\xe3\xb1\xb7\x69\xe7\x5d\x6f\x48\xc4\x37\x68\x6d\x20\x68\xb8\x39\xb6\x60\x1c\x9c\x91\x49\xa9\x09\xd3\x08\x0c\x90\xcc\x85\x50\x5d\xb9\x8b\x4b\x52\xc6\x17\x59\x30\x61\xcd\xe9\x82\x03\xa2\x0e\x08\x59\xf1\xc0\x06\x51\x56\x95\xa8\x7f\xc6\xba\x2a\x5b\xb9\x50\xba\xde\x21\xde\x38\x6b\x06\xaf\xee\x9c\x99\x04\x43\x91\x26\xaa\xcc\x0d\x29\x16\x50\x45\x59\x08\x80\x8e\xc3\x4e\x8d\x88\x45\x93\x79\xe3\x15\x72\x00\x6d\x5d\x73\x3e\xcb\xb9\x71\x88\x9b\x3a\xd3\x89\xcf\x79\xed\x38\xb6\xe9\x0c\x94\x3e\xdb\x8a\x38\xb2\x7d\x2f\x58\x9e\x70\xda\xd5\x28\x95\x88\xbc\x28\x35\x18\x39\xbe\xcc\xcd\x6e\x62\x1a\x23\x56\x90\x19\x49\x51\xce\xec\x84\x7b\x90\x07\x3b\x11\x35\x82\x08\x4f\x89\x2a\x27\x5a\xd2\x44\x77\xbf\xfd\x8f\xec\xf2\x1d\x55\x81\x45\x48\x0b\x9b\x56\x38\x21\x64\x4e\x55\x33\xe2\xa6\xbe\x5e\x9f\xc0\xc9\xf9\x1f\x01\x17\xac\x19\xf8\x44\x35\x04\x9d\x39\x9b\xcd\xfd\x9e\x33\x4a\x32\x9a\x16\x5a\x7b\xf5\x73\x07\x98\x30\x07\xd8\x1d\x25\x94\x5a\xea\x8d\x6f\x67\x3c\x25\x7f\xc1\x6f\x21\x5d\x4d\xbb\xc6\xed\x60\x6d\x07\x34\x4d\x8d\x3c\x02\x72\x64\x0f\x92\x20\x53\xe6\x34\xa5\x95\x93\xed\x66\xb8\x2b\x87\xec\x07\x48\xc0\xca\x8e\x0b\xe8\xc9\xce\x7c\xc7\x0e\x62\xb8\xda\x56\x5e\x25\x9a\xd2\x72\xe3\xa6\x79\x4c\x2e\xac\x60\xe4\xd9\x98\xd1\xe0\xcf\xd6\x60\xb0\xd6\x4f\xb5\x9d\x99\x1e\x04\x45\xc4\xf1\xd7\xc6\x40\x96\x20\x11\xdd\xab\xd1\x10\x26\xc8\xcb\x94\xff\x79\x01\xa4\x09\x72\x18\xb4\x09\x32\x94\x9e\xe9\x57\x2c\x0f\x19\x4a\xcf\xf4\x2c\xb6\x87\x0c\xa5\x67\x86\xd2\x33\xdd\x5b\x1f\x62\x7f\xc8\x50\x7a\xa6\x07\xb1\x40\x64\x28\x3d\xb3\x4b\x1b\x4a\xcf\x0c\xa5\x67\xd6\xdb\x50\x7a\x66\x28\x3d\xd3\x68\x43\xe9\x99\xee\x64\xf5\x2e\x9e\x88\xf4\x38\xa6\x88\x0c\xa5\x67\x22\x97\x9e\x89\x97\x25\x4d\x9e\xe1\xe4\x1e\x1a\x21\x83\xf4\x25\x5d\x9a\xf4\x1c\x29\x83\xf4\x2d\x67\x9a\xf4\x2e\x6f\x9a\x1c\x28\x77\x9a\xf4\x09\x39\x83\x1c\x16\x3d\x83\xf4\x31\x3f\xef\xf3\xa8\x5c\x14\x15\x51\x83\x3c\xc7\x5d\x71\x78\x64\x0d\xf2\xa5\x5f\x17\x11\x11\x36\xc8\x70\x63\xec\xd2\x3e\x87\x1b\xe3\xb9\x11\x37\xc8\xc1\x51\x37\xc8\x70\x6f\x74\x6d\x51\x91\x38\xc8\xcb\x78\x98\x5f\x12\x91\x83\xf4\x06\x95\x83\xbc\x24\x32\x07\xe9\x15\x3a\x07\x79\x49\x84\x0e\x32\x78\xf9\x07\x2f\xff\xce\x6d\xf0\xf2\x0f\x5e\xfe\x18\x7d\x0d\x5e\xfe\xc1\xcb\xbf\xb1\x0d\x5e\xfe\xc1\xcb\x3f\x78\xf9\x07\x2f\xff\x7a\x1b\xbc\xfc\x83\x97\xbf\xd1\x06\x2f\x7f\x77\xb2\x06\x2f\xff\x9e\x6d\xf0\xf2\xc7\xf4\xf2\xc7\x41\x13\x21\xcf\x70\x6a\xfb\x84\x2a\x42\x7a\x82\x2c\x42\x5e\x10\x5d\x84\xf4\x11\x61\x84\x0c\xe6\xf6\xce\x54\xc6\x41\x1d\x21\xcf\x70\xd4\xfb\x8d\x3e\x42\x7a\x8e\x40\x42\xfa\x8b\x42\x42\x9e\x0d\x89\x84\x3c\x33\x1a\x09\x89\x75\xae\x6d\x8a\x6a\x5f\x70\x7e\x2c\x35\x6b\x99\xb5\xad\x0a\xff\x8f\x26\xce\x87\x69\xb6\xee\xd0\x48\xca\x67\x40\x5e\x8f\x5e\xbf\x7a\x15\x9e\xbb\xcb\xb8\x86\x19\x84\x58\x2f\xa7\x42\xe6\x54\x63\x4f\xbf\xfb\x6d\xa7\x7e\xa2\xb3\xed\x6d\x70\x0f\xfd\x83\x41\x71\x36\x91\x36\x0c\x45\x4b\xfa\xdf\x82\x49\x82\x5a\x81\x39\xad\x39\x68\xd2\xd9\x37\xd0\x00\xde\xd0\x2c\x87\x33\xcf\xfb\x6d\x4c\x84\x0f\x00\x70\x68\x2c\x29\x11\xdc\x89\x6c\x86\xdd\x75\xdd\x7b\xdd\x5f\x39\x01\xaa\x10\xf9\x60\x02\xe6\xb5\x3b\x8e\x4f\xb5\x85\xf9\x29\x04\xe3\xda\x1b\x7a\xcc\x3b\x83\xdf\x10\x0e\x43\x28\x2d\xc1\x5a\x50\xeb\x18\xa7\xb2\x48\xa9\x86\xd3\x10\x55\x51\x2d\x95\x86\x1c\xa1\x64\x8c\xa4\x47\x31\xf8\x87\x68\xb9\xc4\x00\x90\x05\x70\x5d\xd2\x2c\x5b\x12\x58\x30\x17\xbf\x63\x86\xc7\xe8\x25\xa6\x55\xd0\xcc\xff\x65\x0e\xc8\x41\x24\xd8\xc0\xa4\x32\xd3\xac\xc8\x6a\x14\x12\xbb\xfc\x99\x35\xc9\x4d\x1d\xe8\x4e\x9b\x9f\x19\x1a\x69\x32\xef\x48\xc0\x0a\x37\x44\x2a\x0c\x03\x92\x0a\xef\x38\x8b\x33\x83\x1e\x61\xa3\x2a\xa8\xca\x56\x67\x31\x7f\xd8\xe7\x8f\x04\x12\x70\xff\xbc\x43\x01\xa8\x1d\x79\xa7\xc8\x89\x91\x9b\xb2\xa5\x8b\x3f\x6b\x5d\x44\x2d\x81\xab\xf3\xb0\xd6\x9f\xb0\x00\xaf\xac\xcd\xd8\x02\x78\x2d\xad\x9d\xa8\xd3\x53\xaf\x35\xae\x4a\xa1\x9d\xc7\x0c\x91\x5e\xbb\xdf\xb0\xfb\x4a\x9d\x2b\x52\x63\xe7\x71\x37\x48\x9b\xff\xd1\x90\xca\xfe\xf3\x69\x79\xb3\xf3\xd0\x96\xb5\x79\x10\xa6\xc6\xb6\xaa\xe5\xcc\x8e\x7d\xf7\x04\x45\x26\x1c\x10\x24\x86\x47\x36\x1a\x10\xc8\x33\x17\x4c\x7a\x01\x00\x90\x03\x80\x7f\x0c\x85\x7b\x86\xc2\x3d\xed\x36\x14\xee\x19\x0a\xf7\xec\xd3\xcf\x50\xb8\x67\x28\xdc\x33\x14\xee\x19\x0a\xf7\x04\xb6\x1e\x85\xec\xf4\x32\x5c\xa7\x6f\xa1\x3a\x43\xe1\x9e\xa0\x36\x14\xee\x19\x0a\xf7\x0c\x85\x7b\x1a\x6d\x28\xdc\x13\x72\x34\xe3\x25\x49\xc7\x3c\x95\x87\x06\xd2\xe8\x45\x56\x74\x9f\x01\x34\x7a\x95\x0a\xdd\xaf\x34\xe8\x43\xa4\x40\xf7\x06\x30\xe3\x80\x60\x19\x43\x9d\xa7\x9d\x5a\x54\x60\x8c\xa8\x3c\xff\xf0\x80\x18\x5f\x2c\xdb\x8f\x08\x84\x31\x70\xfe\xad\xad\xef\x9c\xff\xb9\x81\x2f\x0e\x0b\x7a\x31\xf0\xff\x9d\x5a\x54\x80\x8b\x67\xf6\x9c\xbe\x24\xb0\x45\x3f\x40\x2d\x5e\x0c\xd0\xa2\x3f\x60\x16\x2f\x06\x64\x31\x78\xac\x07\x8f\x75\xbb\x0d\x1e\xeb\xc1\x63\xbd\x4f\x3f\x83\xc7\x7a\xf0\x58\x0f\x1e\xeb\xc1\x63\x1d\xd8\x06\x8f\x75\x47\xa2\x06\x8f\xf5\xe6\x36\x78\xac\x07\x8f\xf5\xe0\xb1\x5e\x6b\x83\xc7\x3a\x88\xc0\x9e\x7a\xac\xe3\x80\x43\xc4\x3c\x91\x7d\x02\x85\xe8\x03\x20\xc4\x4b\x81\x41\xf4\x0e\x08\x62\x30\x41\xef\x46\x5d\x1c\xd0\x87\x98\x47\xb8\xdf\x60\x0f\x7d\x06\x7a\xe8\x29\xc8\xc3\xf3\x00\x3c\x3c\x27\xb8\x43\xf0\x99\x8d\x76\x5a\x69\xa9\x45\x2e\x4a\xae\x6f\x41\x2e\x58\x02\x17\x49\x62\xfe\xba\x13\xf7\xb0\x67\x56\x7f\xeb\x88\x5e\x3c\xd2\x2d\x61\x3c\x65\x09\xda\x26\x1f\xe6\xa0\xe7\x2e\x6d\x0e\x9f\x23\xd4\x3e\x48\x34\x3e\x59\x9f\x50\xa4\xd3\xdc\xb1\x98\xd9\x8d\x5d\xef\xbb\x04\x76\x86\x26\x42\x64\x40\xf7\x71\x45\x3b\x99\x11\xe4\x9e\x8c\x3a\x8c\x67\x7d\xef\x44\x89\x7a\x74\x32\x81\x4c\xf0\x99\xcb\x21\x77\x5c\x67\xdf\x5d\xf8\xb6\xee\xce\xb9\x6a\x93\x52\x4a\xe0\x3a\x5b\xe2\x34\xa7\x29\xa4\x04\xcd\x53\xb9\x58\xec\xbf\xc9\xef\x90\x1d\x79\x1d\x9e\x6a\x92\x01\x35\xef\xc1\xa1\x7e\x11\xc3\xd0\x28\xb9\xee\x40\x7b\xe5\x5b\xb6\x20\x02\x9d\xd6\x7f\xff\x1b\xbb\xd3\x1d\xdd\x3e\x0d\x5e\x2f\x43\x29\x2d\x41\x23\x5f\x63\x3e\x90\x41\x2e\x45\x49\x1e\xa8\x55\xa5\x64\xc9\x91\xa5\xe2\x44\x75\x58\xe4\x00\xa5\xa3\xbb\x31\x7e\x84\xf7\xd2\x9e\x3f\x0b\x31\x8e\x53\x39\xeb\x24\x3a\xc5\x90\x25\x2e\xe4\xac\xb4\x9a\xa2\x3b\x8a\xc0\xb5\x5c\x22\x1e\x46\xb7\x7b\xe1\x6e\xde\x3a\x21\x39\x9d\xc1\xb1\x22\x6f\x3f\xbc\x33\xb7\x0e\x46\x20\xb1\xa9\x95\xd9\xdd\x2d\x54\x48\xb1\x60\x69\xd7\x6b\xe8\x07\x2a\x19\x9d\x64\x46\xeb\x9d\x82\x04\x6e\x24\xe9\xaf\x4e\x7e\xb8\xb8\xf9\xfb\xd5\xc5\x87\xf7\xa7\xa8\xff\xc2\xa7\x82\x72\xc3\x0e\x4a\x55\x23\xf3\x38\x0a\x8f\x15\x01\xbe\x60\x52\x70\x33\x0b\x68\x37\xa4\x64\xe1\x3a\xed\x44\x51\x1d\x38\x22\x41\x89\x6c\x01\xa9\xc5\xd2\xa8\x08\xac\xc3\x77\x8a\x52\x7b\x0b\xaa\x8f\xbd\x29\x79\x32\xa7\x7c\x06\xe9\x98\xbc\x13\xa5\x79\xb1\xaf\xbe\xc2\x97\x90\x90\x96\x09\x74\xd3\x71\xac\x09\xde\x9e\xdc\xaf\xce\xbc\xcc\x62\x6e\x7f\x8c\xbd\x21\xa0\x12\x5a\xf8\xa9\x69\xce\x9e\x5a\x72\x4d\x3f\xbd\xb1\x58\x1c\x47\x5f\x35\xbe\x3a\xea\x1e\xb8\x56\x48\x61\x5e\xc5\xca\x82\xf6\xed\x33\xa6\x41\xd2\x8c\x1c\x35\x47\x18\x93\xf7\x86\x2e\x48\x9b\x6b\x6b\xc1\x68\x60\x01\x12\x6d\xab\x6e\x65\xcf\x88\x84\x19\x95\x69\x06\xaa\x9b\x51\x48\x4c\xab\x2b\xdc\x9a\x5a\xdc\xae\x82\xca\x66\xcc\x85\x1e\x87\x32\x6e\xdf\x3e\x08\x04\x3b\x99\x8a\x37\x64\xae\x75\xa1\xde\x9c\x9f\xd7\x52\xd0\x98\x89\xf3\x54\x24\xea\x5c\x53\x75\xaf\xce\x19\x37\xcc\x6f\x94\x52\x4d\x47\x0d\xae\x7b\x6e\x65\xe3\x51\x22\xf2\x9c\xf2\x74\x44\xdd\x39\x1e\x55\x3b\xfb\xfc\xd7\x4e\x7a\x1c\xd1\xea\x29\xc6\x47\x74\xa4\xe6\xd0\x69\xe5\xc2\x14\xc5\x00\x05\x31\x50\xc8\x8c\xac\x10\xba\xb9\x3c\x14\xc3\x7e\x5f\xf1\x67\xbb\x14\x63\x72\x25\xb4\xc3\x2b\x72\x11\x95\x78\xdb\xe2\x2a\xc7\x64\xe1\xef\xaf\xee\x6e\xfe\x7a\xfd\xf1\xf2\xea\x6e\xe0\xe4\x03\x27\xc7\x36\x70\xf2\x81\x93\x77\x18\xb8\x2f\x9c\x1c\xf8\xe2\x50\x5c\xdc\x2b\xc5\x0d\x8e\x55\x6d\x55\x97\x28\x50\x85\x79\x57\xfb\xa0\xdb\x16\x8d\xb2\xd3\x0f\xb6\x63\x5a\x93\xfd\x9e\x2f\x7e\xa0\xed\x88\x13\xbe\x71\x0a\x89\x7b\xc0\x6a\xe8\x6f\xc3\x26\x30\xd8\xf3\x15\x1a\x17\xd6\x49\x21\xb5\x2d\x3c\x66\xcb\x0c\xdd\xdd\xe0\x1d\xcf\xdc\x7d\x45\xf3\xca\x56\xbb\x69\xc9\x43\xac\x98\x1f\xac\x43\x55\xb9\x43\x49\xf9\x92\x14\x92\x71\x8d\x5b\xe9\xe2\xf6\xed\xe5\x25\x49\xe6\x54\xd2\x44\x83\x54\x04\x3e\x25\x50\x68\x72\xfc\x3f\x8f\xbb\x8f\x19\xc1\xd7\x81\xd6\xeb\x3e\xac\xcc\x3e\x82\x5b\xc0\x30\xb5\xc8\x57\x48\x58\x30\x51\xaa\x6c\x59\x79\x08\x36\xf3\xd1\x55\x06\x4a\x28\x0f\xa1\xc0\xec\x0b\x6f\xde\xdd\x38\xe0\x8a\xd0\xb9\x49\x80\x0c\xb1\xb5\x1f\x56\xf4\x74\x44\xc4\x10\x40\x03\xc6\xdf\x20\xba\xee\x2e\x86\x06\x8c\xdb\x49\x80\xdd\x26\x8c\x06\xd0\xd1\x16\x63\x03\x3a\x7a\x67\xf3\xba\x50\xd8\x38\x0a\x98\x9a\x58\x9c\xec\x6b\x29\xf2\x48\xdc\xec\x16\x01\x0b\xab\x3c\xbb\x4d\x47\xf5\xd8\x05\xaf\xb7\x14\x01\xa7\xd2\x56\x99\x6e\xe6\xf3\xc0\x6c\xb7\x28\x51\x33\x71\x02\xaf\x13\xc1\xa7\x6c\xf6\x81\x16\xdf\xc1\xf2\x06\xa6\x61\xbe\xfa\xf6\x7c\xa3\xdb\xd2\x85\xff\xe2\x05\x6a\x44\x2e\x3b\x58\x98\xeb\x32\x5a\xd0\x51\xac\xd0\xfc\xf0\xb0\xfc\x78\x51\xf4\x51\x22\xe8\x5b\x0b\xe9\xb2\x85\xeb\x74\xd9\x58\x09\x16\x51\x02\x33\xc3\x24\x51\xdf\xe2\x47\x47\x37\x25\x53\x77\x3d\x44\x09\x32\xbf\xab\xd1\xce\x99\x22\x30\x9d\x42\xa2\xd9\x02\xb2\x0a\x21\x3d\x3d\x23\x93\x52\x7b\x6c\xf2\x09\x4d\xee\x1f\xa8\x4c\x15\x49\x44\x5e\x50\xcd\x26\x2c\x63\x7a\x49\x58\x8c\xfa\x5a\x2e\x54\xc0\x01\xae\xfb\x18\x6b\xae\x34\xc5\xab\x50\x38\x43\xa0\x59\x6d\x1b\x43\x41\x7d\x82\x9c\xe5\xa6\x1e\x68\x3c\x0a\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\x31\x6a\x60\xec\x6a\xcc\x49\x04\x37\xf2\xbf\x3a\x17\x0b\x23\x0b\xc2\xc3\xf9\x83\x90\xf7\x8c\xcf\x46\xe6\xc5\x47\x96\x59\xa9\x73\x8c\x6d\x39\xff\x35\xfe\xa7\x4f\xa7\x88\xf8\x8c\xee\x37\xe4\xe8\x28\xb0\x2f\x51\xd8\x30\xce\xc8\xa7\xf2\x16\x03\x84\x96\x2d\xd1\xa9\xba\x50\x8c\xe8\xc3\xb4\x42\x3e\xe5\xdd\xf3\x4e\x0b\x88\x34\xcd\xfb\x07\x56\xac\xb7\xe7\x2a\x33\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\x2b\xc7\x0a\x0b\x91\xbe\x21\xaa\x2c\x0a\x21\xb5\x22\x39\x68\x9a\x52\x4d\xc7\xe6\x40\x9c\xb5\xff\xc4\x10\xb0\x33\xf2\x8f\xea\x43\x8b\x47\xf0\xe3\xf1\x7f\x7c\xf7\xfe\xaf\xff\x79\xfc\xd3\x3f\x9a\xdf\xa1\xb8\x66\xb3\x8b\x1a\x0f\x04\xbe\x82\x2a\x20\x19\x73\x91\xc2\x15\x52\x87\x7f\xaa\x56\xc0\x8f\xfb\x42\x53\x5d\xaa\xf1\x5c\x28\x7d\x79\x5d\xfd\x59\x88\x74\xf5\xaf\xc0\x1c\xa7\x1e\xca\x3d\xb8\xb6\xd7\x54\x77\x47\x98\x27\x51\xa5\x1f\x5a\xb0\x1f\x40\xaa\xce\x35\x5b\x9a\xad\x75\x1e\x5c\xaf\x15\x14\x7e\x32\x87\x9c\xe2\x3f\xbf\xf6\x53\x60\xee\xe3\x07\xc9\xb4\xc6\x18\x30\x57\xa0\x42\x4c\xcf\x3c\x6b\xb5\x4a\xd5\xe2\x75\x70\x81\xb6\xa8\x9c\xbf\x5a\xc1\xc8\x13\x86\x33\xe2\x66\xcb\x72\x80\x1a\x6e\x65\x2d\xe4\xf3\xe2\xfa\x92\x2c\xec\x0c\xf7\x68\x72\x9e\x8f\x5d\x67\x10\x5d\xdd\x0a\x66\xd8\x5f\x57\x54\xb9\x65\x6a\xa8\x6e\x4e\x61\x46\xca\x43\x17\xe8\xc6\x32\x1f\x9b\x8e\xfb\x9e\x2f\xcc\xb8\x8a\x4c\x81\xea\x52\x02\x99\x51\xed\x0b\xf8\x00\x37\x3a\x79\x60\x8a\x4a\x0f\x79\x66\x78\x0a\xf7\x88\x14\xa1\x2c\xd7\x74\xb2\x10\x59\x99\xe3\xe5\xd6\x13\xee\x1d\x5f\x77\x8d\xa2\xca\x79\x05\xd8\x45\x51\xb4\x0e\x03\xb9\x30\xcc\x7e\x81\x39\xc7\xf6\x19\x34\x3d\x62\x99\xa6\x76\x6d\x26\xa5\xa9\xd4\x51\xea\xf2\x91\x1a\xc0\xcb\x5b\xba\xeb\x00\x0f\x6b\xe5\xca\x5f\xdc\x77\x51\x37\x5b\x3c\x8d\x5c\x64\xc5\x1c\x33\x87\x66\x95\x1e\xbc\xf1\xb4\x9f\x55\x10\x0e\x8a\xfd\x13\x2d\x6c\x19\xcb\x99\xb6\x6a\xe5\xeb\xdf\xfe\xb1\x41\x68\x8f\xee\x86\x67\x53\x73\xa2\xec\xd8\x4d\xba\x92\xd9\xae\x8f\xa8\x49\x55\x72\xb4\x7f\x2e\x0e\xd2\x44\x2a\xc0\x99\x4c\x31\xad\xda\x8c\x50\x9f\xa0\x05\x95\x55\x94\x50\x39\xc9\x98\x9a\xc7\x29\x61\x7d\x39\xad\x56\xc7\xf4\xaf\x00\xc3\x8e\xb5\x2c\xa1\x4a\xe8\xaa\x65\x0f\x33\x17\x2b\x54\x46\x20\x61\x9b\x89\xb9\x5d\x37\xaf\x76\xe7\x5f\x63\xee\x56\x1d\x0d\x3f\xfe\xd5\xb3\xcd\xc3\x94\x66\xea\xe5\x26\x82\x72\x02\x52\x0a\x59\xb9\xa1\x24\xe8\x52\xf2\x3a\xc9\xfd\x5a\xa4\x24\x91\x60\xa1\x09\x7b\xa4\xac\x93\xa6\x51\x04\xe7\x2c\xb0\xbb\x22\xbe\x90\x1d\xed\x7a\x33\xb4\x35\xef\x37\x2b\x1a\xd8\x8b\xcb\x7a\xf3\xda\x60\x89\x31\x04\x41\xd3\x3e\x38\x26\x54\x15\x91\x33\xdb\xd2\x97\x3c\x74\xa7\x01\x07\x3c\x1e\x8f\x8f\x2d\x95\x42\xda\xab\xd4\x5a\x14\xcd\xe7\xbd\xba\x16\x6a\xa1\xea\x19\xcc\xf0\xbc\x61\x54\x76\x4b\x84\xb9\x42\x7e\xaa\xbc\x8b\x35\x96\xac\xfe\x19\x28\x53\xbe\x12\xd9\xd7\xbd\xb6\x81\x79\x2a\xfd\xe2\x55\x8c\xfe\x8d\x4d\xd5\xaf\xea\xa9\x59\xe1\xc7\xe2\xd3\x18\x95\x03\x94\x0e\x35\x14\x9f\xd8\x2e\xc7\x49\x51\x9e\xb9\xee\xc7\x39\xe4\x42\x2e\xab\x3f\xa1\x98\x43\x0e\x92\x66\x23\xa5\x85\xa4\x33\x38\xab\x06\xb7\x3f\xab\xfe\xb2\x3f\x6c\x91\xb7\xfe\x6b\x1b\xdd\x51\x67\x5e\x39\x7b\xdf\x17\xa8\xcb\xf9\x75\xeb\x89\x02\x55\x6d\xab\x67\xe0\x3f\xc7\x55\xc0\x9c\xf5\xb9\x55\xb3\x88\x2e\x75\xcb\x8d\xd4\x59\x2d\x70\x60\xdc\x87\x15\xf2\xd4\x71\x7f\xf8\x10\x21\x29\x5b\x30\x15\x03\x46\x6b\x83\x7b\x82\x39\xbb\x86\x28\x75\x51\x6a\x57\xf9\xba\xb2\xa0\x7c\x2a\x84\xc2\x68\x91\xaa\x78\x62\xcb\x34\xf8\x3a\xd4\xf3\x82\x32\x86\x06\xc9\xdf\x90\xff\x7d\xf2\xb7\xdf\xfc\x3c\x3a\xfd\xd3\xc9\xc9\x8f\xaf\x46\xff\xfe\xd3\x6f\x4e\xfe\x36\xc6\x7f\xfc\xeb\xe9\x9f\x4e\x7f\xf6\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xc7\xef\x3e\x7c\x73\x77\xfd\xfe\x27\x76\xfa\xf3\x8f\xbc\xcc\xef\xed\x5f\x3f\x9f\xfc\x08\xef\x7f\xda\xb1\x93\xd3\xd3\x3f\x7d\x15\x4c\x3a\xe5\xcb\x8f\x81\xdc\xdb\xb6\x51\xb4\xc2\xe5\xab\x3d\x46\x72\xb5\xb5\xae\x42\xc6\xf5\x48\xc8\x91\xed\xfa\x0d\x2a\x29\x81\x03\xf8\xed\x15\xfb\xfc\xdf\x78\xae\x59\xdf\x66\x95\x50\xd8\xa3\x03\xfe\x5c\x82\x86\x82\x44\x82\x7e\x89\x30\x19\x3b\x92\xd7\x0c\x57\x50\x3d\xbe\xb4\x1b\xf4\x97\x10\x39\x53\xd5\x4f\xc6\x75\xad\x35\x29\xa3\x5e\x8d\x6b\x25\x88\x12\x6b\x47\x74\xcf\xdd\x43\x20\xa0\x3a\x19\x22\x6d\x42\xda\x10\x69\xb3\x85\x94\x21\xd2\x26\xa8\x7d\x96\x91\x36\xb7\x96\x27\xfd\x22\xc3\x6c\xd6\x13\xcc\x4c\xa7\xf7\x9d\x0b\xce\x74\xce\xdc\xd9\x96\xe9\x96\xd3\x62\xef\xde\x80\x2f\xba\x06\x57\xc7\x4c\x75\xf3\x66\x0f\x2d\x48\x21\x8a\x32\xa3\x7a\x4b\x16\x45\xa4\xbc\xb7\x9e\x79\xce\xfe\x32\x07\xee\x44\x3f\x17\xc3\xcf\x38\xc9\xcb\x4c\xb3\xa2\x63\x42\x40\xa5\x5a\x56\xe0\x90\x84\x2a\x25\x12\x46\x7d\x22\xb8\x03\xb6\x52\xda\xbf\x32\x5a\xe6\x35\xbd\xc7\x1c\x9a\x04\x52\xe0\x49\x47\xcb\xe1\x0f\x16\x8c\xd2\xcf\xed\x64\x69\xee\xa1\xf7\x7c\xe1\xee\x24\x92\x96\x36\xc1\x15\x6a\x5f\x69\x94\x71\xbf\xac\x6c\x46\x73\x2e\x5d\xb6\x42\x23\xa9\x11\x25\xc8\xca\x88\x58\x81\x67\x57\x21\x90\x98\xfe\x61\xd9\x74\xb7\x0b\x2f\x58\x39\x08\x17\xc5\xab\x6c\x84\x20\x1d\x6b\x4d\x06\xaf\xc3\x44\xdb\xb2\x77\xe7\x11\x7a\x94\xc0\x11\x2e\x95\xc7\x95\xc8\x9f\x43\x1a\xef\x8b\x24\xde\x13\x29\xfc\x79\x24\xf0\x7e\x4a\xdf\xd1\x24\xef\x38\x52\x77\x1c\x89\x7b\x8f\xb8\xf6\x98\x52\x76\x1c\x09\xfb\x39\xec\x6b\x85\x84\x29\xfb\xd4\x87\xb4\xe5\x8f\xde\x7d\xa1\xe1\x13\x9a\x6a\x0a\x09\x05\xf0\x0a\x79\xd8\x7b\x60\x81\x26\xf3\x21\xe3\x9c\x54\x76\xd1\xb8\x17\xf6\xed\x26\x4b\xd9\x70\x5b\x93\xe1\xb6\xde\xa3\x0d\xb7\xf5\x70\x5b\xbf\xc8\x6d\xed\xb8\xd5\x97\x7f\x55\x47\x46\x5a\x42\x0c\xb9\x43\x19\xa0\xde\xb6\xa1\xec\x90\x33\x3f\x27\xda\x57\x75\x14\xeb\x18\xcf\x73\x1c\xb9\xdb\x89\x6b\x33\xd9\x2a\xe8\x42\x0b\xcb\xf6\xc8\x9c\xcd\xcc\xf6\xcc\x60\x01\x99\x53\xab\x49\x4e\x39\x9d\xd9\x12\x26\x5a\x54\x25\x7c\x85\xc4\x0a\xa5\x92\x75\x44\x4f\x5f\xc1\x04\x44\x0b\x96\xe1\x32\x99\xa0\x29\x7e\x29\x45\x96\x19\x79\x25\x63\xf7\x40\xde\x41\x91\x89\xa5\xab\x42\xc2\x53\x72\xab\xa9\x86\x69\x99\xdd\x82\xee\x14\xde\x1d\xc4\x71\x90\xe0\xeb\x32\xcb\xae\x45\xc6\x92\x4e\xde\xbf\x18\x5b\xf1\x12\x37\x60\x51\x66\x19\x29\x90\x90\x6e\xfb\xf0\x23\xc7\xab\xfc\x22\x7b\xa0\x4b\x75\x46\xae\x60\x01\xf2\x8c\x5c\x4e\xaf\x84\xbe\xb6\x46\xa4\x6e\xfd\x36\x31\x41\x6c\xe7\x84\x4d\xc9\x1b\x2c\xbf\xa8\x89\xa6\x33\x8c\x2d\xf6\x61\xc4\x67\x66\x43\x35\x07\x25\xc2\x30\xca\x07\xa6\x0e\x69\xdb\x0b\x3f\xa5\xbf\xc6\xd1\xcd\xd5\xd9\xf9\xd4\x06\xed\xd5\x8c\x4d\x21\x59\x26\xd9\xc1\x18\xe6\x45\x82\xe9\xb5\x75\xb1\x97\x06\x3b\x51\x4b\xa5\x21\xf7\x78\xf6\x68\xd2\x65\x9c\x48\x50\x85\xe0\x0a\xa5\xbc\x9a\x4b\x54\x2f\x42\x30\x49\xa6\x63\x52\x47\x44\x8b\x6f\x67\xc5\x20\x54\x25\x28\x84\xd2\xb7\x9a\x4a\xdd\x55\x3e\x89\xa5\x0b\x5c\x7b\x42\xcc\x49\x4e\x68\x96\x41\x4a\x58\x9e\x43\xca\xa8\x36\x72\x3b\x9d\x6a\xac\x62\xd0\x60\xf5\xca\xc6\xec\x37\xf2\x46\xe6\x94\xa7\x19\x48\x32\xa5\x2c\x53\xdd\x33\x07\xda\xd0\x5c\x46\x3e\x07\x99\x33\x8e\xde\x0b\x1b\x75\x8a\xd1\xdf\xe6\xaf\x24\x11\x32\x75\xf5\x02\x98\x56\xfe\xab\x20\x26\x6a\xda\x47\x94\xec\x1a\xdb\x7b\x35\x68\x97\x4c\x32\x91\xdc\x2b\x52\x72\xcd\x32\xfb\xf2\x42\xdc\xa3\xfe\x92\x21\x3b\xe9\x3c\x74\x77\x2e\x55\xfd\x73\x54\x1d\xb0\x91\xa1\x4a\x9d\xff\xba\xfe\x0a\x3f\xe8\x48\x5c\x04\x2d\x3a\x86\x0e\x0d\x9f\x20\x89\x56\x6a\xe7\xfd\x27\x48\x5a\x85\xae\x1c\x90\xaa\xd9\x51\x0e\x3c\x39\x92\xdf\xd1\xb6\x9e\xd5\xed\x0e\x00\xad\x6e\xb6\xd8\x21\x3d\x6f\xdd\x22\xb8\x92\xbd\x7e\x4d\x32\xc6\xa1\xbd\x30\x8a\xa5\xd0\x5e\x1c\xeb\xf6\x74\x4a\x2e\x49\x99\xc4\x1a\x43\x4b\x8f\xfa\x15\x4c\x9a\xa7\x05\xcb\xf0\x08\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\x56\x98\x7e\x61\xaf\xc5\xb1\x83\xce\xae\x5e\x4a\xb1\xbc\xc8\x96\xf8\x1e\xc7\xe9\x19\x61\x3a\x46\x8c\x90\xb9\x0d\x65\xc9\xfd\xac\x38\xa8\xef\x33\xa2\x04\xd1\x92\xfa\xd2\x7a\xf6\x53\xf3\x90\x96\xa5\xbb\xd0\x4f\x8e\x7f\x3e\x3e\x23\xa0\x93\x53\xf2\x20\xf8\xb1\xc6\xe9\x1b\x93\x3b\x41\xca\xe0\x9c\x27\x52\x13\xb2\x14\x25\xe1\x00\xee\x6c\x15\x19\x4b\x98\xce\x96\x78\xdd\x10\x51\xda\x0c\x3d\x23\x5a\x04\x40\x94\x37\xdb\xfb\x4f\x4c\x3b\xf0\x0d\xc3\xbf\x5f\xe1\x6e\xb2\x57\x16\xa1\x46\x19\x59\xc0\xf9\x1c\x68\xa6\xe7\x36\x9b\x81\x0b\x3e\xfa\x27\x48\x81\x30\xe6\xdc\x7d\xf3\xc5\x95\x89\x8f\x18\xc8\xf4\x4c\x15\xd5\xcc\xb5\xf7\x0d\x74\x16\x89\xc8\x2a\x3f\xfa\xf6\xee\xee\xfa\x1b\xd0\x4d\x2e\xcf\xf1\x43\xf2\xcd\xfb\x3b\x9f\xc3\x82\x86\x7e\x90\x53\x21\xf3\x1e\xb0\xf7\x38\xc1\xb5\x23\x52\x08\xd9\x87\x5b\x66\x2e\x54\xd0\x72\x92\x67\xb8\x62\xbe\x15\x4a\x5b\x5f\x8e\xd5\x4d\x38\x26\x36\x8a\x76\x42\x86\x4f\xdf\xbf\xbc\x1e\x93\xbf\x8a\xd2\x4c\xc8\x84\x4e\xb2\x65\x55\xc8\x48\x41\x68\xd1\x53\x42\x8e\x0c\x29\x47\xe6\x06\x31\x3b\xff\x5b\xa0\x29\x48\x85\x0c\x1a\x68\xa4\xf2\xac\x11\x8e\x7b\x83\xb6\xa8\x4b\xf9\xb6\x54\x5a\xe4\x64\xee\x5e\xbb\x0d\x71\xee\x0e\xe7\xd8\x1e\x57\x07\x27\x2b\xa1\xb0\x4c\xdc\xfd\xe6\x8b\x63\xd1\x6b\xdc\xcb\xce\xbb\xfb\x7c\x62\xc5\xd4\xe6\xb4\x39\x07\x87\x05\x2a\x75\xbc\xcd\x6c\xd5\x68\x71\xaf\x51\xca\xfb\xc6\xcb\x19\x20\x61\xe0\xe7\xab\x1d\xa1\xb3\x27\xb8\xa7\x78\x69\x08\x24\x5a\xa8\x3d\x79\xb6\xb2\xff\x46\xa0\x75\x9b\xcf\xda\xa0\xbb\x5b\xcf\x37\x75\xce\x54\x85\x16\x90\x50\x2e\x38\x4b\x68\xc6\xfe\x09\x29\x29\x0b\xc1\x5d\x6e\x1d\x4a\xb6\x09\x55\x30\x42\xcf\x3b\xd7\xae\x16\x71\x8d\x76\x6d\xb8\x83\x16\x02\xc5\x3d\x0c\x9e\x33\xec\xde\x52\x1d\xb3\xf6\x7d\xb4\xf2\xf2\x81\xd0\xed\xcd\xb6\xe6\x50\x6f\x2d\x56\x9c\x1d\x4f\x3e\x0b\x71\x92\x44\x02\x5e\x58\xc7\x36\xd3\x82\xd0\x24\x41\x3c\x6f\x7b\x5d\x21\xe3\x55\x20\x17\xe1\xfb\x2b\xda\xbc\x1a\x11\xb0\x6f\xb2\x97\x8d\x39\x90\x84\x97\xf9\x04\x64\x0d\x0c\x29\xf5\xfa\x9c\x46\xb1\xba\xb8\x61\xed\x70\xde\x4b\xeb\x65\x0c\xca\x67\x40\x5e\x9b\x91\xff\xf0\xfb\xdf\xff\xee\xf7\x11\xc6\x31\xaf\x57\x95\x08\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\x45\xb8\xf9\xd0\xee\x23\x25\xc9\xc6\x4e\x91\x8d\x9a\x20\xfb\xac\xe9\xb1\x08\xdc\x18\xcc\x65\x63\x1f\x89\x5b\xa4\xca\x6c\xc2\x52\x59\x88\x7a\xa7\x93\x34\xaa\xe1\x1a\x35\x2a\x7c\x77\x36\x9d\x79\x86\x61\xf5\x82\x53\xa9\x0c\xa0\x88\xa6\xf1\xdf\x9a\xde\x5a\xe5\x80\x48\x5a\x4a\x5b\x95\xb6\x72\x5e\xd5\xb6\x7c\xe7\xb4\x42\x1a\xbe\x20\xe5\x5f\x41\x22\x78\x1a\xa2\x02\xc4\x12\x69\x1d\x25\x51\xcf\xdc\xad\xed\xd3\x9b\x88\xeb\xab\xc4\x0d\x86\x9a\x64\xe8\x8a\x92\x6a\x55\xe3\xf0\x49\x8b\x06\x81\xbd\xfd\xe1\xdf\xba\x3b\xc8\x92\xe2\x56\x24\xf7\x11\x4d\x64\x81\x0c\xec\x9d\x39\x69\x89\xf5\x05\xde\xbd\xbd\xb6\xc4\x99\x95\xb9\xfa\x78\x57\x43\xbf\x18\x29\x9c\x92\xef\xbd\x6f\xea\x5b\xe7\x2d\xa4\x3c\x25\xf7\x50\x84\x69\x97\x86\x61\xfa\x30\xc2\x76\x14\xe1\xd8\x95\xec\x46\x94\x39\x9b\x5e\x6d\x19\x81\x8f\xfe\xb3\x12\x71\x58\x05\xa0\x86\x73\x1e\x1d\x81\x4e\x09\x99\x52\x96\x11\x8a\x56\x79\xcd\x72\x20\x0f\x73\xe0\xd6\xd8\x5f\x47\x4b\x7c\x41\x0c\xe7\x4b\xb5\x36\x1e\xfb\x90\xf0\x37\x7b\x5b\x0d\x43\x51\x31\xbe\x6c\x35\xc0\xf1\x6c\xd9\x42\x35\x1b\xd4\x80\x5d\xda\xa0\x06\x74\x54\x03\x0a\x09\xb7\x5a\x74\x96\x35\xa3\x05\xdc\x58\x32\xb6\x84\xdb\x4c\x60\x2a\x24\xac\xc6\xdb\x34\xe2\x60\x5c\xe4\x7c\x40\x64\xf0\xc5\xf5\x65\xe5\xfb\x12\xad\x58\x17\x8b\x5c\xac\xca\x64\xee\xdd\xa4\x1c\x94\x3a\xc7\xc8\x9a\xb2\xb0\x86\x65\xbc\xda\x4a\x09\xdd\xa3\x7c\x0a\x09\x90\xe3\x3c\x9e\xd5\x68\x42\xe6\x75\x81\xdb\x0f\x41\x27\xd6\x6f\xee\xc3\x8a\x1c\x4e\xac\x9f\xae\x69\x90\x3b\xbf\x9e\xd8\x44\x52\x35\x07\xcc\x9d\x85\x4f\x4c\x2b\x3b\xa8\x45\x63\xf5\x33\x6e\xe4\x85\x99\xa4\x09\x90\x02\x24\x13\x46\xc4\x28\xb9\x4e\xc5\x03\x27\x13\x98\x31\xae\xfc\x8a\x85\x90\xe4\xb7\x04\x46\x12\x31\x55\xd5\xee\x1e\x93\x9b\x56\xe5\x38\x87\x2e\x96\x88\x9a\x67\xba\x29\x3a\x8b\x34\x25\x28\xbc\xe0\x36\x28\x69\x96\x2d\xeb\x8d\xd7\x04\x08\xdd\x32\x43\xdd\x37\x84\x9d\xd9\x93\x92\xe3\x8b\xa6\x90\xd1\xa5\xcd\x20\x9f\x32\x8e\xd6\x5f\xa9\x4e\xc7\xe1\xa1\x59\x9d\x09\x14\xb2\xd1\xe7\xd6\x9d\xc1\x14\x91\x40\x93\x20\x1c\xe3\x21\x06\xec\xa9\x36\xc4\x80\x0d\x31\x60\x43\x0c\xd8\x7a\x1b\x62\xc0\xda\x6d\x88\x01\xdb\x4e\x50\x9f\x9d\x76\x43\x0c\xd8\x60\x95\x59\x6f\x43\x0c\x58\xa7\x36\xc4\x80\x3d\xd9\x7a\xc7\xa2\x87\x18\xb0\x1d\xda\x10\x03\xb6\x63\x1b\x62\xc0\x86\x18\xb0\x21\x06\x6c\x88\x01\x0b\x68\x43\x0c\xd8\xfe\xaf\x37\x38\x7f\xba\xb7\x21\x06\x6c\x88\x01\xdb\xb3\x0d\x31\x60\x2b\x6d\x88\x01\x1b\x62\xc0\x1e\x6b\x43\x0c\xd8\x10\x03\xe6\xda\x60\x6d\x5c\x6b\x43\x0c\xd8\x86\x36\xc4\x80\xed\x37\xce\xa0\x06\x84\x75\xf6\x2c\x6a\x80\xd2\xa2\xb8\x65\xb3\x00\x5c\xc8\x58\xc7\xe0\xb6\xa2\xc4\x81\x46\x2a\x57\x6c\x57\xd9\x0f\xbd\x1d\x4b\x39\xc8\xbe\x66\x44\x58\xe3\x26\x99\x80\x51\x11\xcc\x6b\x15\x21\xb7\xc9\xe5\x14\x1d\xc8\x0d\x24\x37\x73\x2a\x3c\x4c\x20\x6b\x95\x75\x68\x8b\xcf\xfe\x76\x63\xdc\xe8\x2e\xdd\x29\x68\xcc\x47\x42\xb9\xad\x8c\xea\xca\x64\x9b\xeb\xfd\x5a\xa4\xca\x57\x92\xe0\x82\x8f\x2c\x58\xeb\xd8\x10\x3c\x16\x6a\x1c\x60\x0d\x0e\x44\x66\xb3\x31\x72\xd7\x52\x4c\x0e\x86\xce\x76\x8d\xf1\x47\x2c\x71\x01\x7a\x62\xda\x42\x5c\xb3\x04\x76\x44\x5a\x6b\x07\x86\x61\xb1\x66\x0f\xc1\xc5\x1c\xc3\xae\x82\x02\x0f\x89\xe6\xb6\x77\xe4\x94\x47\xa9\x54\xe7\x85\xb0\xff\x57\xc7\x4d\x35\x02\xa6\x3a\xfb\x51\x0e\x0c\x2f\x17\x12\x25\x75\xb0\x08\xa9\x9e\x44\x98\x45\x88\x8a\x8a\x29\x2b\xf5\x34\x1a\xaa\x9f\x91\x50\x7d\x8c\x82\x3a\x44\x04\xd4\xc1\xa3\x9f\xe2\xb8\xd5\x23\xb8\xd4\x23\x49\xa4\xcf\xe0\x9e\x72\x81\xf4\x77\x73\x09\x6a\x2e\xb2\xce\x0c\x27\x16\xb3\xf9\xc0\x38\xcb\xcb\x1c\xab\x50\x18\x9e\xc2\x16\x55\xb0\xbf\xf2\x2c\xc3\x5d\xf7\x36\xe2\x00\xcb\x55\xa4\x80\x65\xc0\x29\xcb\xcc\xd6\x42\xb0\xd0\x39\x5d\xa0\x50\x5a\x26\x09\x40\x1a\x22\x96\x36\xad\xd5\xbf\x1b\x57\x14\x5a\x8c\x7e\xa6\xc8\xeb\xb0\xab\x26\x4c\xef\x69\x98\xf3\x7e\xf7\xdb\x4e\x7d\xcc\x64\x11\xe7\x96\xfe\xe6\xe6\xfa\x6d\xeb\x96\xc6\x0f\xbe\xc5\x63\xfc\x76\x0e\xc9\xfd\x8d\x0b\xa5\x39\xdc\xcd\x1c\x6e\x66\x0a\x32\x31\xc5\x10\x0c\x42\xad\x28\x6d\x1f\xb2\x90\x7a\xc5\x05\x3a\xc3\x55\x04\xb9\x60\x09\x8c\x5f\xc0\x50\x11\x4b\xf9\x0f\x3f\x08\x04\xdd\x04\xf8\xe2\x7d\x11\xbb\x6e\x2d\x39\x95\x87\xa1\x61\xa3\x72\x94\x62\xd0\x68\x46\x93\x6a\x6d\x66\x9b\x0f\x5d\x10\x19\x27\x0a\xa0\x52\x68\x66\x4c\xcf\xcb\xc9\x38\x11\xf9\xb9\x61\x1d\xf6\xff\x26\x99\x98\x9c\xe7\x54\x69\x90\x46\xc7\x71\xd7\xfa\x28\x31\x14\x30\x3e\x1b\xe7\xe9\xe9\xf8\x57\x41\x34\x5c\x3a\x5b\xb9\x4b\xc3\xda\x62\x24\x98\x80\xe1\xfb\x42\xae\x58\x0b\xcc\xa4\x84\x6f\xd2\xe0\xfb\x3b\xb4\xa8\x48\x60\x58\xf2\x41\x42\x92\x07\xae\x4d\x22\x38\x04\x62\x32\x95\x7e\x84\x1d\x3f\x5b\xc8\x71\x94\xb3\x1a\x29\xd4\xb8\x47\x61\xc6\xbd\xd1\x85\xfa\x12\x5a\x1c\x2d\xac\x38\x56\x48\x71\x94\x70\xe2\x18\xa1\xc4\xf1\xc2\x88\xe3\x84\x10\xc7\x0f\x1f\x7e\xb6\xd0\xe1\xcf\x22\x6c\x38\xa2\x7f\x2c\x52\xb8\xf0\x4b\x84\x0a\xf7\xd7\x06\x43\x22\x84\x07\xbf\x5c\x68\x70\x94\x79\x8c\xaa\xc5\x06\xb2\x84\x03\x84\x02\xbf\x84\xff\xff\xd9\x7c\xff\x11\xfc\xfe\x31\x7d\xfe\xd1\xfc\xfd\xcf\x16\xf2\x1b\x1e\xee\x1b\xd5\xa6\xf0\x22\x61\xbe\x31\x43\x7c\x83\xd7\x97\x71\xa6\x19\xcd\xde\x41\x46\x97\xb7\x61\x81\xa0\xb1\x56\xe2\x6a\x2d\x58\xd4\x9a\xad\xdb\x71\x0d\x73\xaa\x88\x77\x75\x3b\x88\x17\xef\x4b\x77\x22\x30\xa1\xe8\x71\x36\xef\xd7\xd9\x6b\x4d\xfa\xe7\xb9\x26\xbd\x31\x8f\x5b\x5c\x95\x9e\xec\x9a\x6f\xc5\x03\x11\x53\x0d\x9c\x9c\x30\xee\x77\xce\x69\xc3\x4a\x53\xbb\x47\x82\xfd\x1d\xa6\xd7\xd7\xaf\xfc\x20\x5f\x9e\xdf\x03\x3d\x43\x4a\xf5\xda\xf3\xe5\x68\x7c\xda\xf5\xe5\x1e\x9c\x96\x59\xdb\xfd\x65\x5d\x62\x71\x7c\x5f\xaf\xc7\xe4\x83\x13\x27\x5e\x23\x3d\x15\x2b\xa2\x3c\x25\x0e\x9f\xeb\xcb\xdb\x27\xc1\xa1\xee\x6d\xe5\xa6\x8a\x4d\x6f\xc7\xb3\xd8\x1b\xd8\x48\x99\x82\x50\xf3\x14\x0a\xa0\x83\xd1\xb5\x37\x46\xd7\x03\x45\x60\x7f\x79\xda\xd6\xcb\x47\x5c\x0f\xda\xd6\x2f\x45\xdb\x6a\xc0\xe2\x7d\x23\x69\x02\xd7\x7d\x12\xde\x3c\x03\xa9\x13\x01\x6b\x19\xae\x62\x17\x1c\xc0\x26\x8e\xd5\xa0\x87\x88\xef\x37\x2d\xb3\x6c\x69\x6d\x88\x2d\x04\xcc\xee\x5b\xeb\x6e\x0e\x6b\xd0\x81\xe8\x4a\xdd\x40\x5d\xad\x9b\x14\x52\x38\x89\x44\x96\x9c\x1b\x11\xc3\x1d\x27\x43\xbc\xd1\x45\x14\xf0\xee\xe6\x74\xda\x02\x36\x74\x41\xe8\x18\xe8\x39\x07\x52\xe7\x2f\xb5\x09\x31\xa3\x4e\x85\x4c\xd8\x24\x5b\x92\x39\xcd\x8c\xb2\xe4\x82\xb4\xef\x59\x96\xb9\x6e\x02\x82\xc2\x41\x5b\xd7\xb3\x95\x68\x32\xc1\x67\x38\x19\xd4\x12\x02\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x4a\x4f\x67\x50\x54\x7c\x63\x74\xa6\x08\x67\xd9\x99\x9f\xf2\x36\x04\xe6\xfa\x9e\xaf\x4d\xca\x0a\x52\x87\x5e\xf9\xc0\x14\x9c\x61\x9f\x9d\x69\xb2\xb4\xf8\xaa\xfd\x76\xdf\xd8\xcf\x0a\x29\x16\x2c\xad\x63\xf4\xcd\xb6\xc0\xf8\xf8\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x51\x14\x8f\x1d\x43\xb3\x11\x9d\x76\x7c\x1b\x3f\xc8\x53\x96\x50\x0d\x0a\x73\x12\x5a\xd0\xb6\x0b\x46\x3b\x53\x62\xde\xa7\xb1\xa3\xc8\x09\x17\x44\x60\x66\x61\xc9\x99\x5e\xa2\x47\x6f\x5e\x6a\x92\x8a\x07\x7e\x1a\x72\x30\x6d\x98\x03\x25\x13\xd0\xb4\x4e\x0e\xf4\x22\x99\x22\xc0\xe9\x24\x33\x67\x0f\x23\xfe\xef\x36\x6e\x00\x32\x05\xaa\x4b\x09\x64\x46\x75\x00\x97\xd8\x20\xcd\xdb\xf5\x7c\x7c\xdb\x31\xe5\xfc\x75\x53\x52\x72\x05\x81\x82\x6c\x34\x15\xa0\x63\xc6\xab\x39\xd1\xa2\xd4\x3d\xb9\x47\xb6\x99\x8e\x6c\xe6\x4e\x43\x49\x64\x39\x28\x22\xca\x00\x4b\x5e\x4b\xfd\x73\xc3\xc5\xd4\xf0\x06\xbb\xd3\xc6\xd6\xd5\x6d\x1a\x63\x87\x5d\x35\xa4\xf2\x06\x3e\x81\x0f\xb7\xb2\x19\xd4\xef\xae\x6e\xff\xfe\xfd\xc5\xff\x7a\xff\x7d\xb7\x85\x7f\x4f\x93\x79\x13\x5b\x9c\x13\x8a\x17\x05\x32\xf9\x39\x5d\x00\xa1\xa4\xe4\xec\xbf\x4b\x17\xf2\x76\x52\x8d\xd7\x91\xad\x46\x49\xef\x09\x12\x7c\xcd\x2d\xd1\x89\x73\xc4\x58\xd3\xef\x99\x42\xa0\x6a\x24\xc2\x05\xfe\x0b\x05\x64\x2a\x45\xbe\xa2\x68\x91\xab\x2a\xb8\x6e\x69\x6e\x18\x6a\x55\xb3\x39\xc8\x6e\x12\xf9\xbb\x8f\xef\x6f\x31\x07\xbf\x90\x16\xd8\x1d\x93\x0b\xb0\x4f\x1c\xdd\xa6\x0e\x5a\x7a\xd2\x31\xb9\xe0\x4b\xfb\xa5\x65\x66\x1d\x45\x94\x8c\x29\x0d\x28\x9c\x3a\x45\xd2\x87\x07\x1e\xbd\x1a\xe3\xff\x8e\x08\x4d\x53\x69\x34\xcd\x2a\x47\x23\x59\xcd\x32\xeb\x34\xb2\xd5\x5f\xd9\x24\x6b\x4c\x2e\x07\x8d\x69\x1c\x9d\x3a\xfc\x20\x52\xb7\x12\x28\x04\x62\xfc\x8e\x95\x6e\x95\x96\x54\xc3\x8c\x25\x24\x07\x39\x03\x52\x50\x9d\xcc\x49\x4e\x97\x24\x11\x52\x96\x85\x85\x18\x49\xa9\xa6\xdd\x46\xfe\x5a\x48\x92\x7b\xee\x6c\xb8\x99\x11\xc9\x6f\x37\x07\x82\xd6\x2c\xbb\xf9\x4f\xa6\x54\x09\xea\xfc\xf5\xab\x3f\xfe\xf6\xf7\x1d\xd5\xeb\x88\x07\xb7\x6b\xe8\x53\x40\xc8\x53\x3b\xfc\xcb\x6f\x30\x0c\xba\x6e\x21\xc3\xb8\x1d\x62\x77\x3e\x72\x43\xc5\xf8\x2c\x0b\x36\x80\x04\x9b\x01\x43\x8d\x80\xa3\xfa\x0d\xae\xbb\xda\x02\xc3\x2d\x81\x2d\x1a\xba\x9b\x52\xe2\x59\xc1\x6a\x09\xce\xdb\xbd\x1c\x43\x16\xbc\xa1\xd8\x5d\x5e\x7b\x2e\x15\x62\x3f\x42\x6d\xa2\x32\x4c\x59\xf4\x11\x3b\xac\x8d\x77\x38\x23\xaf\xc8\x7f\x90\x4f\xe4\x3f\xd0\x0a\xf6\x87\xee\x43\xc5\xb1\x31\xc5\x08\xe3\x9f\x0b\xa5\x2f\xaf\x23\x2d\xf4\x5f\xcc\x7d\x65\x7a\x34\xeb\xa1\x05\x99\x30\x67\x8e\x80\x4f\x1a\xa4\x51\x03\xdd\x1a\x86\xce\x5c\x90\x45\xcd\x10\xf8\xb9\xec\xee\xd0\xe0\x82\xcb\x69\x3b\xfa\xff\x85\xf6\x37\x0e\xfc\xad\x50\xfa\xca\x71\xeb\x26\x84\x4e\x93\x8e\x1c\x2f\xe2\x16\xbb\x0f\x19\xf5\x83\xd9\x7b\x75\x8d\x0d\x92\x0a\x4c\x80\xb0\x39\x9c\x73\x16\xc0\x1c\xfa\x73\x62\xc3\xe2\x44\xe3\x6d\xdd\xc7\xb6\xd6\x8a\x4d\x1f\x2d\x32\x4e\x49\x69\x94\xa5\x29\x44\x3a\x46\xfd\x26\x80\x0a\x33\x1b\x69\x43\x18\x78\x44\x35\x1a\x5b\x7d\xad\xf2\x0e\xe3\x81\x33\x1c\x2b\xa1\xbc\xab\x0c\x6b\x9b\x84\x29\x48\x69\xf3\x84\x27\x4b\x9f\x6e\x14\xbc\xdb\x82\xb8\x5c\x21\x85\x16\x89\xe8\x0c\x9b\x12\x73\xab\x5c\x3b\x5a\x70\xee\xd1\x57\x5b\x79\xc7\xff\xfc\xee\xfa\x8c\xdc\xbd\xbd\x3e\x23\x42\x92\xdb\xb7\x61\xc1\x4f\x4d\x13\xcc\xd1\xdd\xdb\xeb\xa3\x83\xae\x40\x23\x87\xe9\xee\xed\x75\x87\x4e\xd6\xc3\x67\x73\x5a\x8c\xee\x61\xd9\x51\xba\x8b\x21\x61\x8e\xaa\x8d\x15\xe5\x85\xec\x34\xe7\xb4\xd8\xbb\x37\x09\x34\x65\xbd\x46\x72\xf1\x59\x87\x15\xa5\xf1\x20\x5d\x72\xb1\x80\xd4\x6a\xcd\x7e\x14\xe0\x69\x21\x98\xd1\x91\x06\x9c\x97\xc7\xda\x80\xf3\xb2\x7f\x1b\x70\x5e\x36\xb5\x01\xe7\x65\x8f\x36\xe0\xbc\xd8\x36\xe0\xbc\xb4\x09\xe9\x63\x8e\xd1\x80\xf3\xf2\x64\x1b\x70\x5e\xb6\xb6\x01\xe7\x65\xaf\x36\xe0\xbc\xac\xb7\x01\xe7\xe5\x91\x36\xe0\xbc\x54\x6d\xc0\x79\x19\x70\x5e\x3e\x5f\xae\x3d\xe0\xbc\xac\xb6\x01\xe7\x65\xc0\x79\x19\x70\x5e\x9a\x6d\xc0\x79\xd9\xd2\x06\x9c\x97\x01\xe7\x65\xc0\x79\x79\xbc\x0d\x38\x2f\x9d\xdb\x80\xf3\xb2\x5f\x1b\x32\x0f\xf7\x6c\x03\xce\xcb\x80\xf3\xb2\xda\x06\x9c\x97\x27\x5b\x3f\xcc\xe3\x03\xce\xcb\x80\xf3\xf2\x68\x1b\x70\x5e\x06\x9c\x97\x47\xdb\x80\xf3\xd2\xa1\xf5\xce\xe8\x3a\xe0\xbc\x0c\x38\x2f\x8f\x8d\x31\x68\x5b\xfb\xb5\x01\xe7\x65\xc0\x79\x59\x6b\x03\xce\xcb\x7a\x1b\x70\x5e\x06\x9c\x97\x01\xe7\x65\xc0\x79\xa9\xda\x80\xf3\xf2\xa5\xdb\x9d\x24\x28\xf6\x4f\xb8\x16\x19\x4b\x96\xc1\xd9\x3e\x37\xa0\x44\x29\x13\x73\x63\x63\xb7\xa4\xc0\x7e\x2b\x8b\x42\x90\x90\xdd\x33\x08\x85\x9b\xc6\xc4\x35\xa1\x14\xa4\x9b\x83\xe7\x98\x82\x5e\xc0\x29\xf8\x17\xbc\xea\x1e\x41\x30\xf2\xe5\xb3\xed\xf4\x75\x33\x96\x06\x6b\xed\xcd\x17\xe9\x43\x3a\x67\x13\xf6\xa8\xda\x45\x5a\x54\xcc\x96\x6d\xdd\x5c\xb4\x28\x32\x16\x92\x18\x4b\xc8\x6d\x89\xd2\x05\x38\x17\xb8\x7a\x43\x92\xa2\x3c\x23\x39\xe4\x42\x06\x24\x46\x44\xd0\xe0\x5a\x5b\xa5\x0f\xeb\x74\x63\x09\xf2\x93\xaf\x05\xce\xff\xd2\xea\x0b\x35\x4a\x55\xb5\x56\xcc\xb3\xc3\xa0\x58\xb3\xcb\xe9\x6a\x30\x2a\xd3\x2d\x2b\xd0\x95\xd0\x37\xee\x70\x1f\x6c\xbd\x22\x47\x2c\xf8\x29\x3c\x18\x6a\xd5\x5b\x91\x17\xa5\x86\xd6\xc5\x66\xa7\xd8\x2a\x1d\x4c\x85\x32\xf4\xc3\x64\x83\x26\x82\x4f\xd9\xcc\x69\xdf\xe7\x39\xe5\x74\x06\xa3\x6a\xb6\x47\x35\xd4\xc3\x79\xe7\x8b\xfa\x60\xa9\xa0\x49\x46\x59\xf7\xc0\xc1\x58\x6c\xe2\x2d\x52\x81\x30\x60\x75\x40\x3d\xe6\xa6\x55\xd3\x7c\x56\x85\x8d\x33\xcb\x37\xc6\xfe\x2b\xfb\xe3\xb3\x00\xed\x91\x6a\xb4\x55\xa0\x62\xb4\x61\xa7\x86\x29\x8c\x56\x4d\x4c\xa1\x00\xa3\x11\x58\x03\x6a\x77\xb9\x7f\xc9\x69\xce\x12\x7f\xc2\x2e\xb2\x4c\x24\xd6\x26\xd3\xd6\x2a\x63\x90\x6c\x94\xdd\x3c\x2f\x35\x9d\x64\x30\x26\x97\x16\xa2\x42\xf0\x6c\x69\xce\x9f\x02\xed\x43\x14\xdc\xe6\x0f\xd3\x24\x43\xe2\x5f\x03\x63\x5f\x37\x0a\xe5\xb8\xa9\x2c\xa6\x06\x70\xc3\xca\x04\x07\x02\x5c\xcb\xa5\xd9\x7f\xd7\x22\xbd\x35\x5b\xb0\xf5\x74\x30\xd4\x46\x60\xc8\x6b\x8c\x70\xd7\xc0\x50\xd7\x38\x01\xaa\xe1\xc1\xa9\x71\x03\x53\x6b\x17\x82\x45\x0a\x6a\x66\xfc\xb4\xb6\x45\x21\xd2\xf1\x06\xd6\x44\xc4\x34\x90\x02\x33\xe2\xb5\x48\x8d\xd0\x24\xc1\xf2\xa7\xea\x8c\x5a\x03\xe2\xa5\x21\xee\x1e\x2d\x7e\x54\xd7\xd2\x14\x5d\x50\x96\x99\x03\x1c\x48\xc0\x3a\xea\x62\x98\x57\x26\x92\xaf\xc2\x05\xe7\xf7\x69\xb3\xb8\xb4\xae\x56\x66\x58\x32\x17\x0a\x38\xf2\x4b\x5a\x65\xf0\x54\xf9\x05\x8e\xc5\xa4\xf6\x2e\x0e\x8d\x22\xbe\x9c\x12\xc8\x0b\xbd\x3c\x23\xb0\x00\xb9\xd4\x73\x8c\x36\xa8\x70\x43\x91\xad\x31\x45\x72\x9a\x36\x76\xc7\x19\x11\xde\x00\x1d\x38\x3c\xde\x0f\x4e\x27\x2b\x33\x6d\x35\x34\xa6\xaa\x34\x8a\x43\xef\x9a\xd8\x70\x36\x24\x94\x69\xc6\x84\xa3\x21\x08\xa5\x9a\xb3\x6e\xc0\xb5\x24\xe2\x59\xf8\x1e\xa9\x68\xa4\x8e\x98\x2d\x91\xd3\x4f\x68\x9e\xa4\xb9\x28\xb9\xb6\x38\x35\x56\x63\xa8\xa4\x3c\x9b\x60\xf3\x82\xf1\x72\xcf\x2a\xdb\x93\x38\x57\x3b\x4d\x3d\x34\xc5\x75\x8c\x3c\x65\xaa\x35\x48\xfe\x86\xfc\xef\x93\xbf\xfd\xe6\xe7\xd1\xe9\x9f\x4e\x4e\x7e\x7c\x35\xfa\xf7\x9f\x7e\x73\xf2\xb7\x31\xfe\xe3\x5f\x4f\xff\x74\xfa\xb3\xff\xe3\x37\xa7\xa7\x27\x27\x3f\x7e\xf7\xe1\x9b\xbb\xeb\xf7\x3f\xb1\xd3\x9f\x7f\xe4\x65\x7e\x6f\xff\xfa\xf9\xe4\x47\x78\xff\xd3\x8e\x9d\x9c\x9e\xfe\xe9\xab\xee\xde\xc7\x50\x57\x7b\x3c\x47\x7b\x24\x37\xfb\xb3\x38\xd9\x1d\x8f\x3d\xf8\xe1\x77\x57\xe0\xda\xf1\x77\xde\x89\xc7\x8e\xbf\x0c\xb6\xc9\x5c\x4e\xeb\xf1\x99\x22\x22\x67\x5a\x43\xea\xee\xde\x06\xf6\xcd\x8a\x3d\xc8\x31\x2c\x84\xad\xa2\x78\x7b\x37\x30\x58\x6a\x33\x52\x67\xb2\xaa\xfb\x15\x2d\x60\x9c\xb0\xbc\xc8\x20\x07\xae\x91\xf1\x8c\xbc\x6e\x8b\xe6\xc4\x71\xfd\x06\x89\x35\x78\xc0\xa7\x04\x20\x75\x44\x0e\xbc\xb1\xd1\x06\xde\x38\xf0\xc6\xa7\x5a\xb0\x4d\x3c\x06\x63\xbc\x69\x12\xe1\x6c\x59\xca\x4b\xca\x68\x21\xaf\x20\x12\xc4\x14\x03\x25\x16\x2c\x2d\x69\xd6\x44\x92\xf5\xe0\xa2\xdd\x38\x00\x9a\x76\xda\xa1\x21\xe8\xa6\x85\x05\x64\x15\x11\xd6\x4c\x3f\x26\x7f\xb1\xe1\x3c\x4d\x45\xb3\x6d\x50\xef\xe6\x90\xdb\xf4\xba\x6d\x44\x08\xa7\xea\x1e\xab\x15\x92\xaa\x68\xa3\x3a\x09\xc3\xec\xb6\x6e\x53\x71\x51\x71\x8d\x6c\x79\x46\x14\x68\x9b\x63\x33\x87\x95\x65\xa2\x8a\x1c\x5d\x64\x0f\x74\xa9\x8e\x2a\x9f\x24\xe3\x4c\xaf\x14\x1f\xe8\x44\x03\x62\xc3\x9a\x0e\xa7\xc2\xc8\xbc\x58\x55\x61\x3a\x85\xa4\xa3\x36\x6b\x31\x38\xd6\x69\x73\xf1\xe8\x9a\xf1\xd2\xbc\xad\x9f\x55\x48\x89\xe0\x9d\x06\x82\x4f\x4c\x93\x92\x6b\x96\x19\x61\x9d\x48\x98\x95\x19\x6d\x1a\x02\xdd\x9b\xf9\x30\xb9\x74\x4c\x3e\xf2\x04\x9a\x0f\x77\xb3\x54\xaf\x0c\x60\x84\x87\x0c\x34\xa4\x67\xd8\x75\xfb\xd5\x95\x0d\x34\x6b\x9d\xfc\x6a\x29\x3b\x0d\xef\xe7\xb2\x0a\x24\x1a\xdb\x03\x55\x45\x39\x90\x94\x4d\xa7\x66\x64\x54\xb6\xb9\x90\x39\x5d\xa7\x8a\xf2\xb4\xd3\xe8\xe6\xe4\x62\x7a\x49\x13\xe5\x17\x2b\xbb\x1c\x29\x96\x42\x42\xe5\x51\xb3\x26\xc8\x45\xa6\xe7\xa2\x9c\xcd\xeb\x5d\x11\x36\xe5\x44\x69\x0c\xaf\x32\x93\xa9\xbc\xe5\x62\x65\xb3\x29\x23\xb3\xf0\x04\xac\x68\x25\xc0\x32\x8c\x07\xda\x71\xec\xb5\x10\x00\x1b\xd3\x6d\xd7\xdc\xe7\x5c\x61\x0c\x1f\xa4\x8d\x04\x39\x0e\x9f\x74\x84\x17\x1e\x93\x4b\x0b\x78\x71\xd6\xee\xb5\x35\x25\x76\x32\x1a\x31\x6c\x3e\x1a\xb3\x63\x00\xdf\xca\x00\xac\x4a\x31\x43\x5c\x62\xdb\x39\xe5\x4b\x9f\xd1\x81\x31\x66\x36\x13\xad\x4a\x32\xc9\xba\xd9\xd0\xab\xb3\xf4\xe2\x65\x76\x5a\x27\xf4\xa6\xcc\x0e\xe7\xbd\xbc\x69\x16\xf8\xc8\x5c\x01\x1e\x69\x28\xf2\x59\x3d\x73\x48\xee\xed\xc9\x4b\xc1\xb2\x37\x70\x38\xb7\xa1\xa7\x6b\x2e\xca\x2c\xb5\xa8\xba\x35\x77\x46\x4e\x6b\x43\x28\x2d\x19\x54\x02\x01\xa3\x21\x20\xf4\x08\xeb\xc6\xbe\x85\x4c\xcd\xf6\xb6\x2c\x19\x3b\xb6\x56\x6d\x9f\xee\xe2\x48\x42\x2e\x9f\x08\x6e\xef\xc9\x33\x77\x73\xe7\x94\xf1\xae\xa2\x5d\xfd\x0e\x6c\xc6\x85\x44\xa3\xf5\x94\x70\xd1\xa6\xa1\x7d\xe4\x57\xa8\xe8\x2c\x73\x54\x71\x48\x1b\xa5\x9d\x7a\x39\xed\xf8\x0f\x73\x30\xda\x5a\x9b\x96\xae\x6c\xbb\xb1\xa2\xd2\x70\xc4\xb1\x21\x46\x69\x49\x11\x26\xd9\xe5\x53\xc8\xae\x1b\xdf\x08\xdd\x17\x9a\xe4\x42\x69\xf2\xdb\x57\x8d\x39\x0e\xb2\xa3\x8d\x08\x9e\x44\x74\xf8\x55\x62\x0a\x22\x5d\x50\xcc\x85\xea\xda\xeb\x65\x0a\x5c\xb3\x84\x66\x0d\x42\xcd\x25\x31\x15\x72\xc2\xd2\x14\x30\xb4\x1d\x0b\x42\xa0\xca\xd9\x51\xd3\x45\xd1\xb5\x1e\xa0\x11\x03\x52\x6f\xac\x0f\x7f\xbe\xbd\x43\x1f\x66\x5b\xde\xab\x75\xfe\x6e\xa2\xd1\xc2\xbc\x82\x36\x4c\xa1\xb9\x9f\xad\x38\xdb\x1a\xe9\xcb\x08\xe9\x33\xef\x63\x76\x4a\xc3\xd0\x33\x17\x0f\xeb\x7c\x84\x19\x91\x8d\xa7\x9d\x13\x1e\x7b\x10\xc7\x67\x37\xfe\x81\x62\xef\xec\xe0\x7d\x88\xe6\xba\xad\x72\x23\xcd\xc6\xa6\x2e\x33\x92\xde\x03\x37\xac\x6c\x7d\xe1\xa7\x15\x86\x16\x93\x68\xee\x0a\x81\x86\xc2\xd3\x4c\x35\x53\xe6\x34\xdb\x8b\x11\xdd\x4d\x85\x70\x15\xdc\xaa\xb8\xe7\x23\xb7\x39\x8f\xcc\x65\xed\x99\x7d\x18\xa6\x75\x04\xc7\x67\x04\xeb\x88\x99\xd5\xb7\x22\x0d\xb1\x71\xad\x84\x3b\x54\x42\x8f\x4d\x99\xc1\xfb\x36\xb5\x32\x0f\x0a\x3c\x66\x5d\xdb\xab\xfa\x65\xc4\x39\x98\x33\x49\xb5\xe8\x6e\xef\x8a\x13\xeb\xe0\xc9\xe8\x97\x0b\xbb\xb5\x29\x24\x64\xf6\x3a\x9e\xb3\x82\x4c\x40\x3f\x00\xf0\xcd\x72\x5a\x0a\x27\xea\xd4\x1b\x6a\x02\x89\xa8\x43\x43\x6d\x88\xed\x98\x5c\xb7\x8e\x39\x5e\xee\xe1\xc8\x6e\x97\xfc\xcd\x2a\x8b\x42\xc5\xcb\xb3\x19\xcf\xc2\x36\xbc\x2b\x06\x48\x85\x85\x73\x55\x2f\x0b\xa8\x6d\xac\xbd\x73\xf0\xeb\x5d\x09\x1d\xf6\x86\xc1\xaf\x66\xe4\x3b\x67\x30\x78\x96\xb7\x8c\x14\x49\xe2\xe2\xb8\x7b\x74\x0a\xdb\x57\xad\x9b\x3b\xb7\xf5\x2b\xe6\xdc\x0a\xc1\x6b\xb0\xef\xd0\x9d\x53\xe9\x14\xbf\xff\x3d\x01\xeb\xa8\x8a\xa0\x57\xf8\x16\x07\xf2\x32\x0a\xe8\x65\x3c\x9c\x6b\x12\x0d\xeb\x9a\x3c\x12\x16\xd2\x0d\xdd\x35\x72\xa4\xb9\x82\xa4\x94\x4c\x2f\x8d\x2e\x00\x9f\x3a\x19\xac\x63\x9c\x95\xdb\x36\x19\x2d\xa7\x8a\x27\x91\x88\xc2\x56\xf0\x58\x29\x8f\x5d\x5b\x5c\x4a\x8e\xb6\xe2\x6e\x3b\xfa\x72\x6a\x56\xc4\x9a\x47\xd0\x51\x82\x41\xcb\xab\x84\x79\xa7\x8b\x95\xb1\xfe\xbb\x64\x0b\x9a\x19\x36\x5c\xff\xe2\x1a\x33\x34\x9b\x3f\x7a\xce\xc8\x76\x4d\xd5\x7d\xed\xde\x85\x51\x21\xd2\xda\x9b\x7b\xee\xa7\x0e\x3f\x82\x4f\xfa\x33\x8c\x6a\x47\x2e\x75\x2d\xd9\x82\x65\x30\x83\xf7\x2a\xa1\x56\x84\x39\x74\x64\xc4\xc5\x16\xba\x70\x67\x4a\x91\xa9\xca\xf6\x44\x7d\x7e\x3a\x1a\x61\x66\x94\x71\xac\xed\x1c\x20\xad\xba\x41\x95\x4d\x90\x67\x5a\x91\x82\x4a\xb3\x0b\x7d\x22\xbc\xf5\x67\x4c\x84\xc8\x5c\x31\xa0\x6c\x59\xd3\xc5\xba\x87\xb0\xa2\x01\x5d\xfc\x9d\xc3\xc3\xdf\x0d\x15\x8a\x4c\x33\x3a\xab\xfd\x29\xe6\x62\x5b\x95\x27\x83\x73\xf3\xb7\x4e\x34\x56\xba\x29\xcd\x3d\xf6\x40\x97\xaa\x46\x2d\x68\x9a\xdd\xbb\xdf\x28\xaf\x4f\x91\x9f\x50\x45\xaa\xb1\xbb\xf9\x7b\x4c\xfb\xed\x29\x1a\xf7\xdf\x5e\x5c\xff\xfd\xf6\xaf\xb7\x7f\xbf\x78\xf7\xe1\xf2\xaa\x73\x67\x57\x42\x83\x0d\x6d\x69\x38\x75\x93\x2a\x9d\xc6\xac\x42\x95\x91\x35\x16\x6a\x8c\x71\xab\x08\x99\xcb\x53\xf1\x10\x18\xdc\x6f\xf6\x14\xd0\x6e\xd6\x13\x5a\x14\x17\x32\x17\xf2\x5a\x8a\x29\xcb\x3a\x4b\xfc\xb1\x4e\xf0\x0a\x39\x3e\xcc\xf7\xc2\x7d\x5c\x5f\x37\x16\xc5\x71\x3d\x9b\xa4\x71\x65\x30\xc4\x0a\x34\xdd\x74\x0f\x2b\x5a\x75\xe7\x1f\xab\x55\x12\xbb\x1f\xa2\x83\xee\x99\x83\x63\x64\x19\x32\x3a\xfe\x3c\x86\x69\x20\x13\x09\xcd\xb0\x4a\x74\xd8\xc6\x27\x91\x15\x93\x55\xba\x1a\x98\x1e\xd4\x6f\x67\x92\x09\x9a\x5a\x1f\x96\x65\xfe\x29\xf8\xda\x65\x5e\xec\xc2\xac\x85\x20\x42\xee\x2c\x9e\x02\x8e\xe7\x41\x48\x0a\x09\x95\x54\xb3\x32\xbc\xb0\x25\xdb\x82\x86\xfc\xd0\xce\x01\x71\x6f\xd9\x82\xcb\x0a\x3d\x73\xd5\x30\xee\x80\xb1\x29\xda\x53\xd0\xce\x69\x14\xf5\x65\x61\x0d\x9c\xdf\xfb\x65\x08\x28\x2f\x1b\x49\x79\xc6\x4e\x7a\xb2\x3b\xed\xfc\x54\x3b\xd2\x26\x83\xdf\x33\x33\x83\xd3\x9a\x49\xfb\x6d\xe3\x65\x10\x9b\x11\x1e\xb8\x1f\x7f\xc0\x42\xe6\x9e\xff\x47\x30\x4e\x55\x4b\x4c\x46\x8d\xa3\x55\x48\x18\xad\x1f\xaf\x50\x7d\xff\xa6\xe4\x9a\xe5\xe0\x11\x46\x47\x2b\x32\x91\xb4\x5f\x1f\xab\xaa\x9e\x4f\x94\x8d\x4e\xc8\x9f\x39\x9e\x57\x0e\x29\x19\x11\x2e\xea\x25\x02\x3e\x15\x32\x41\xc3\xc3\x41\x37\x78\x42\x0b\x3a\x61\x19\x0b\x61\xe6\xb1\x36\x38\x96\xc7\x6c\xd0\x83\x31\x40\x69\x7a\x9e\x4a\x51\xd8\x9b\xd8\x43\x7f\x85\x67\x65\xb6\x21\x66\x9a\x95\x9c\x9c\x25\xaa\x45\xc8\x4c\x52\xae\xeb\xf8\xbd\xb5\x8d\xf3\x4b\x94\x41\x62\x08\x01\x34\x8d\x57\x68\xf6\x22\x35\x3c\xa3\xb9\x6c\xc1\xe7\xaa\x6f\x45\x6b\xde\xfa\x97\x6b\x60\xcc\x90\xeb\x8f\xb7\x97\xff\xef\xca\xb9\xe9\x2e\xda\xd9\xd6\xef\x92\x15\x86\x1f\x44\xdb\x36\x37\xae\xce\xf7\xb0\x71\xbe\xec\x8d\x53\x19\x88\x0e\x8e\xb7\x7d\x53\x36\x3d\xce\x8c\x37\x48\x23\x79\x90\xac\x73\x5d\x41\x53\xb6\x7b\x6d\x06\xe8\x4a\x20\xe6\x11\xae\x19\x86\x4b\x37\xac\xb5\x5a\xd8\x52\xd6\x4e\xec\x0a\x2b\xc5\xd0\xbc\x5d\xa7\x34\x53\x9f\xeb\x15\x19\x62\xda\x29\xa4\x48\x3e\x88\x92\xc7\x01\xf0\x0e\xd8\x71\x15\x21\x24\x05\x2e\xb4\xb3\xa6\xa0\x2e\x21\xa6\xf8\x2d\xb1\x39\x6b\x8d\xda\x1c\x2d\x39\x27\x40\xcc\xba\x6b\x88\x56\x55\xfc\x8a\x97\xc3\xad\xfe\x52\xaa\xb5\xc0\x48\x27\x57\xd5\x29\x6c\xd3\x80\x48\x06\x09\x34\xb5\x81\x34\x54\xcf\x2d\x68\x7c\x4e\xd5\x3d\xa4\xf6\x83\x40\xc0\xcc\x0a\x1c\x13\x43\xe1\xfc\x4c\xdf\x99\xc9\xf5\x98\x25\x68\x10\xb6\x41\xb6\x88\xa0\x19\xa2\x8a\x1d\xf4\x34\x04\x30\x76\xb3\x08\x1f\x79\xb6\xbc\x11\x42\x7f\x5d\xd5\xc4\x3f\xf4\xc9\xf8\x4b\x15\x0a\xdb\x34\x62\xa2\x5d\x9a\x22\xc9\x23\xdc\x38\xc8\x17\xa7\x15\xd5\xe1\x25\x2e\xcc\xca\xfd\x42\xb9\xa2\x2c\xf9\x85\xfa\x46\x8a\xb2\xb3\x0c\x17\x53\xdf\xfc\xe6\xf2\x1d\x5e\x7c\xa5\xc3\x54\xe6\x5a\x2e\x0b\xc1\xb8\xf6\x16\xaf\x88\x4e\x9b\x3f\x3b\xf4\xea\x26\x67\x0b\x06\xaa\x25\xe4\x03\x5d\x12\x9a\x29\x51\x99\xd4\xf8\x26\x77\xab\xf7\xe5\x9a\xaf\x27\x42\xcf\xd7\x9c\xb8\x5d\x53\x77\x4c\x5b\x1f\xef\xac\x01\xcd\x5c\x07\xc4\x30\xbe\x36\xac\x46\x54\x97\x42\x42\x02\x29\xf0\xe4\x73\x3d\x11\x87\x46\x0a\xc6\x53\x75\x25\xb8\x61\xaf\x87\x3e\x57\x97\x95\x7d\xd2\xad\x46\xf3\x14\xa1\x29\xdb\x39\x11\x29\xa2\x6a\x23\x73\x2d\x55\x48\xe4\xe9\xe5\x14\xbd\x9e\x76\xd3\x7d\x57\x4e\x20\x33\x8b\xcd\xb2\xcc\x47\xdb\xdb\xd0\x04\x96\xd3\x19\x10\xaa\xab\x43\xa8\x05\x01\xae\x4a\xe9\xf6\x4d\xc7\xac\x2a\xd3\xaa\x84\x30\xf7\x6a\x7f\xbe\x7c\x47\x5e\x91\x13\xf3\x6e\x36\x62\x70\x4a\x59\x86\x40\xdd\x3e\x56\xb7\xa9\x03\x4c\x7d\x4e\x59\xd0\x14\x20\x1f\x21\x42\xda\xab\xe5\x8c\x70\x41\x54\x99\xcc\x1b\x19\x07\x95\x45\xd8\x55\x6d\x0a\x02\x22\x19\xd8\x4e\xbc\xfb\xf0\xcf\x0a\x3a\x87\xc8\xc6\xbc\x0e\xff\xfc\x82\xd7\x61\x53\x45\x34\xc7\xbf\xbd\x60\xf6\xac\xe6\xa0\x69\x4a\x35\x75\xd7\xa4\x7f\x60\xd8\xb5\xc3\x65\x19\x70\x59\x2a\xf8\x9e\xf1\xf2\x93\xad\x8b\xd2\x0b\xb7\xc7\xed\x7b\xa4\x88\x24\x7e\xa1\x45\xc3\x6f\xe7\x3d\x14\x11\x52\x34\x2e\x5b\xc7\xe8\x6c\x8b\xd6\x8d\xb7\x04\xb5\xd8\x9b\x98\x45\x49\x79\x2a\xf2\x35\x22\xa7\x42\x12\xa0\xc9\xbc\x33\x35\x8d\xa8\x91\xe1\x60\xba\xf6\xcb\x76\x08\x61\xfa\x6a\x34\xdb\xfe\xf7\x98\x0c\xcb\x54\xb5\x73\x6d\x76\x6c\x46\x27\x90\x39\x58\x5c\x8b\x95\x1e\xf1\x84\x45\xb2\x81\x4b\x11\x31\x24\xe6\x46\xd8\x48\x2e\x5a\x4d\x84\xe9\xfe\xb3\x98\x87\xa8\xc1\x17\x77\x2e\xba\xa4\x9e\x07\xb4\x81\x7e\x0e\xf3\x50\x06\x08\x88\x64\x75\x1e\x8c\xb4\xd9\x9e\x07\x94\xbf\xfa\x3e\x0f\x0a\x92\x44\xe4\x45\x4f\x22\x25\xef\x6c\x14\xbe\xa1\x68\xd7\xa8\xc8\xf6\xc3\x34\x28\xdc\xd9\x55\xbb\xa2\xda\xde\x83\xbe\xe4\xd5\xff\xaf\x71\x9d\x23\xb7\x5b\xbd\xe3\xdd\xe8\xc1\x11\x99\xd5\x88\xae\xc3\x5f\xe2\x8d\x37\x84\x61\xb6\xda\x8b\x87\x61\x36\x10\xf3\x29\x9a\xe7\x5b\x21\x91\x5f\x42\x30\xa6\x51\x02\x70\x5e\x81\x23\x0a\x50\x41\xf5\xfc\xcc\x65\xac\x2e\xc0\xb3\xe7\x7b\x6b\xf1\x3a\x46\x8e\xe3\x09\xf2\xec\xa6\x8e\x59\xb5\x48\xfa\x51\x63\x37\x37\xc5\x6b\xda\x67\xae\x3e\xde\x35\x71\xf4\x29\x5f\x5a\x8c\xc8\x00\x54\x33\xdb\xfa\x27\x56\x3c\x67\x4c\xe7\xea\x2a\x3e\x77\x48\x67\x50\x7f\x9b\x23\x3a\x5f\xee\x94\xee\x16\xe5\xb9\x1a\xe3\x19\x95\x84\xd5\x80\xcf\xf5\x31\x22\xac\x5c\xf0\x11\x70\x57\x67\x8f\x0c\x20\x7f\xb1\x14\x79\x2d\x3b\xf1\xa0\x85\xaa\x69\x04\xa1\x59\x16\x25\x26\x61\x93\x15\xc4\x9f\x82\x0a\x4a\x7e\xdd\x1a\xd0\xae\x69\x1a\x32\xfa\x13\x16\x8c\xcf\xdb\x12\x91\x19\x8d\xe2\x33\xb7\x43\xcc\x72\x45\xdf\x4a\x48\x6d\x9c\xd4\x6d\x01\x49\x5f\x6e\x8b\x6f\x3e\xdc\x5e\xb4\x29\x43\x59\xd8\x15\xce\x00\xfc\x9e\xd0\x34\x67\x4a\xa1\xc3\x07\x26\x73\x21\xee\x83\x86\x3c\xf1\xa9\xb6\x33\xa6\xe7\xe5\x64\x9c\x88\xbc\x91\x75\x3b\x52\x6c\xa6\xce\x1d\x47\x19\x99\x89\x3b\x25\x8c\x67\x55\xa6\x32\x5a\x0b\x11\x0b\xac\x3b\x94\x5c\xf3\xe5\x49\x52\xbd\x3d\x6e\x3d\xcc\x4f\xa9\x42\xb3\xd7\xa7\x07\xab\x9b\xe0\xe6\x3d\xb8\xd4\xb1\xbe\xab\xc2\xaa\x0d\xae\xec\xac\x2d\xef\xde\xac\xd4\xe1\xbc\x38\x1b\xe7\xd1\x2a\xaf\x07\x9f\x24\x27\xf4\x27\xa0\x82\x22\x60\x63\x9e\xb9\x6f\x6b\x92\x9a\x58\x7a\x6c\xda\x42\x84\x6a\xe7\xdc\xa3\x7b\xfb\xd8\xfc\xd2\x87\x65\x1e\xc7\x2a\x2e\x73\x91\x65\x66\x21\xa9\x03\x5e\x6b\x44\x77\xa2\x6a\xd2\x46\xb4\xb3\x98\xbb\x46\x59\x68\xbe\x05\x5e\x24\x61\x4c\xc1\xe2\x9e\x99\xcb\xc0\x61\x66\x98\x0d\x84\x63\x53\x92\xb3\x4f\x86\xc2\xe6\x88\x6d\x90\x58\x74\xfc\x6f\xfe\x3a\xa0\x80\x35\xc1\xe0\x83\x0a\x33\xfd\xcc\xac\x50\x73\x10\x9f\x1c\xad\xcd\xb5\x65\xbe\xb8\x02\x6d\x14\x35\x3b\x6f\x4d\xef\x83\x51\xac\x64\x19\xe1\x30\x84\x78\x86\x49\xd3\x3b\x1c\x95\x53\x04\x9e\x07\xf4\x14\x3b\x9a\x8c\x0c\xe2\x85\xb7\x97\xf2\x1c\x93\x0d\xe9\x3b\x2f\xe6\x41\x26\xbb\x7b\x91\x9f\xd1\x57\x45\xfa\xe2\xaf\x0a\xe4\xfa\x4d\xac\xdf\x83\xe1\xac\x34\xf1\x86\xd9\x7a\xf0\xd2\xb5\x48\xd7\x60\x88\x11\xcc\x98\xd1\xac\x7b\x21\xd7\xcb\x69\x13\xba\x93\x0b\x67\x1e\xb1\x15\xc4\x6d\x9c\xfe\x27\x48\x4a\x0d\xa9\x43\x23\x77\x26\x65\x8b\x64\xdc\xa6\xa6\x33\x05\x3e\x49\x7f\x02\x18\xa0\xa4\xce\xea\x52\x6c\x4e\xd7\xa9\xf0\x5d\xcf\xc8\x7f\x21\x97\x54\x1e\x50\x2b\x63\x0b\xe0\xa0\xd4\x75\xf5\xf3\xae\x53\x81\x71\xd4\x09\xe5\x5e\xb7\x32\x67\xda\x59\xb8\x1d\xea\xb8\xc3\xf1\x98\x00\x29\xa8\xa4\xb9\xb9\x83\x15\x71\xcb\x33\x81\x19\xb3\x69\x81\x8d\x4b\xb1\x82\x2d\xef\x06\xaa\x8b\x8a\x0d\xd3\x24\x67\xb3\xb9\x3d\x2d\x84\x92\x4c\xf0\x19\xf1\x71\x63\x99\xa0\x29\x41\xc6\x22\x24\x79\xa0\x32\x37\xb2\x00\x4d\xe6\x18\x84\x46\x39\x49\x4b\x73\x1e\x08\x82\x6c\x2f\x47\x4a\x53\x0d\x0e\x0c\xaf\xb3\x0d\xce\x4f\xd3\x01\x4a\xc4\x3e\x77\xf9\xfb\x03\xe3\xe9\x98\x93\x16\xc5\x0a\xf2\xfe\x13\x24\xd5\xb1\xb6\x88\xd3\x79\x8e\x80\x81\xc2\x1f\x67\x8f\x16\x17\x2c\x0c\xf6\x44\x55\x76\x6f\xd8\x17\xd9\xe4\xad\x9b\x70\xe6\xb5\x4f\xfb\xa7\xd1\x47\xdb\x8b\xa0\xbc\x13\xab\x51\x34\x09\xd1\xb1\x85\xbc\x37\x27\xd7\x62\x04\x09\x59\x55\xeb\x0f\x22\xcb\xd3\x81\x90\xd9\x42\x68\x72\x72\x7c\x7e\x7c\xba\xb6\x17\x8e\x55\x33\xcd\xc0\x66\x44\xd7\x2f\xa4\x58\x5e\x64\x4b\x7c\x87\x63\x5b\xf2\x3b\x10\xc0\xd0\x07\xac\x56\xe5\x2f\xd5\x1c\xb2\xec\x8c\x28\x23\xfe\x52\x5f\x43\xc4\x7e\x6a\x1e\xd2\xb2\x4c\xac\x99\xec\xe4\xf8\xe7\xe3\x33\x02\x3a\x39\x25\x0f\x82\x1f\x6b\xeb\xf0\x20\x77\xa8\x43\x06\xd1\x54\x11\xb1\x14\x25\xe1\x00\xee\xec\x54\xc5\xaa\x12\x6a\xd4\x9f\xd2\xca\xe8\x16\x74\x03\xb2\x2c\x4c\x9e\x7b\xff\x89\x69\x23\x8a\xe8\x12\xcd\x14\xaf\xac\xa6\x00\x88\x43\x4f\x15\xde\x74\xe7\x73\xa0\x99\x9e\x2f\x2b\xed\xe5\x9f\x20\x05\xd6\x27\xe5\xee\x9b\x70\x19\xaa\x07\x69\xa3\xfd\x4d\xe0\x34\x02\x46\x29\xe1\x6e\x2e\x41\xcd\x45\x76\xf0\x34\xce\x0f\xae\xdc\x5b\x22\xb8\x32\x3c\xc5\xa8\xd8\x8e\x46\x55\x65\xd0\x59\x99\xc5\xd5\x57\x10\x78\xca\x24\xa4\x4e\x58\x72\x25\x2f\xe6\x74\x81\x92\x82\x91\xe7\x20\x0d\x51\x4d\x9a\x3a\xd1\xef\xc6\x15\x85\x55\xda\xdd\xeb\x9e\x84\x6d\x76\xc4\x8e\x9c\xc9\x22\xce\x2d\xfd\xcd\xcd\xf5\xdb\xd6\x2d\x8d\x1f\x7c\x8b\xc7\xf8\xed\x1c\x92\xfb\x9b\xb0\x6a\xae\x3d\x09\x2d\x28\x84\x3c\xa4\x60\x60\x86\x8f\x26\x15\x5c\x0b\xa9\x09\x2f\xf3\x09\x48\x6f\x50\x98\xe1\x2a\x82\x5c\xb0\x04\xc6\xe4\xca\x7e\xe7\x9d\xf3\xbe\xfa\x30\xe5\x33\x20\xaf\xcd\x81\xf8\xc3\xef\x7f\xff\xbb\xdf\x87\xf3\xe8\x70\x20\xd5\x38\x20\xaa\xee\xc5\xfb\x22\x76\xdd\x5a\x72\x36\x19\x9b\x1d\xa5\xa8\xd4\x65\x34\xa9\xd6\x66\xb6\xf9\xd0\x85\x59\x25\x15\x00\xd9\xe0\xae\x30\xac\xc3\xfe\xdf\x24\x13\x93\xf3\x9c\x2a\x0d\xd2\xe8\x38\xee\x5a\x1f\x21\xdc\x30\xe3\xb3\x71\x9e\x9e\x8e\xc3\xbc\xe0\x5e\xad\x5e\x2b\x29\xd7\x82\x99\xd9\x52\x1e\xce\x4c\xca\xc1\x4d\xf0\xc4\x53\xf9\x86\x1c\x75\xab\x26\x66\x96\xe0\x1b\x88\x93\x89\xf6\xed\xdd\xdd\xf5\x37\xa0\x9b\x0c\x9b\xe3\x87\xe4\x9b\xf7\x77\x55\xb9\x71\xb3\xbb\x6c\x52\xd3\xc0\xb5\x43\xb8\xf6\x5c\x84\xd5\x9b\x8f\xed\x77\xb1\xac\x04\x6b\xa3\x71\x0e\x89\x59\xe8\xb3\x56\x65\x5b\x1f\x87\x78\x79\x3d\x26\x7f\x15\x25\x8a\x5c\x74\x92\x2d\xc9\x03\xb5\x88\x06\xdd\x20\xa5\xeb\x76\x64\xc8\x38\x32\x5c\xcb\xec\xea\x6f\x81\xa6\xb6\x56\x25\x9a\x76\x0e\x7e\x56\x1b\x34\x45\x5b\xb6\xb7\xa5\xd2\x22\x27\x73\xf7\xaa\x76\x0e\xeb\x82\xfe\x56\x36\xb2\x47\x10\x7d\x3f\x8a\x48\x28\xac\xb6\xe4\x7e\xf3\x45\xe8\x42\x6b\x5c\xc8\xce\x73\xa3\x1a\x10\x25\x49\x73\xaa\x9c\xa0\x8f\x26\x4c\xe6\x78\x54\x67\x93\x58\xdd\xa2\x54\x15\x21\x91\x2a\x8b\x10\x64\x52\xe6\x50\x06\x77\x12\xee\x84\x8c\x53\xa3\xc4\x34\x1e\xe8\x5e\xb3\x2d\x6e\x85\x04\xe2\x5c\x6d\x6e\x73\xd9\x00\x1c\x43\x68\x28\x2a\x21\xf1\xc6\xe4\xaa\x80\x2a\xe5\x82\xb3\xc4\xba\x33\x48\x59\x08\x4e\x44\xa9\x8b\x52\xa3\x29\x28\xa1\x0a\x46\x0b\x2a\x99\x61\xa8\x66\xfc\xfa\x87\x25\x37\xa7\x5d\x0b\x81\x76\x92\xca\xe9\x6c\x29\x0e\x27\x33\x92\x34\x43\x7c\x01\x8c\xc8\x2b\xbc\xb6\x38\xe1\x3b\x9a\xf4\xda\x06\x43\x6c\x0d\xf1\x79\x3c\xb5\x8e\xea\x39\x46\xf6\xa1\x2f\xcb\x07\x86\x22\xe3\x34\x6a\x43\x0f\x12\x6f\xa2\x6a\xb1\x81\x2c\x01\xfd\xed\x42\xae\xe8\xc1\x86\xc2\xf5\x39\x8c\x14\x6b\xf2\xfc\x6a\xb5\x7b\x2d\x3f\x02\xe5\xe4\xf2\xe2\xea\xe2\xef\xb7\x3f\xbc\xfd\xfb\xd5\xc5\x87\xf7\x21\x5d\x07\xd7\x8e\x8f\x59\x3d\x3e\x5a\xfd\xf8\x67\xa8\x20\xef\x9b\x4a\xe6\xd0\x9f\x30\x93\x5b\xa4\xa6\x09\x4a\xe6\x74\x80\x46\x3d\xe4\x30\x94\x3a\xb2\x62\x34\x35\x8c\xe7\xa0\x1c\xc7\x45\x15\xbc\x83\x8c\x2e\x6f\x21\x11\x3c\x3d\x78\x74\xf6\x55\xc5\x6c\x94\x25\xa8\x2a\x03\x0d\x2b\x88\x59\xbe\x10\xac\x2b\x5e\xed\xe3\x03\x9a\x21\x0d\xf6\xfd\x3a\x7b\xad\x49\xff\x3c\xd7\xa4\x37\xe6\xf1\x02\x24\xc3\x88\xa0\x3e\xec\x9a\x6f\xc5\x83\xab\xe8\x7e\xc2\xb8\xdf\x39\xa7\x0d\x2b\x4d\xed\x1e\x09\x47\x53\xd3\x82\xbc\x7e\xe5\x07\xf9\xf2\xfc\x1e\x2e\xd2\xa7\xd7\x9e\x2f\x47\xe3\xd3\xae\xaf\x3a\x6c\xa9\xed\xfe\x0a\x89\x1f\x22\x2b\x6c\xfc\xf5\xb8\xca\x53\x7b\x8d\xf4\x54\xac\x88\xf2\xd4\x87\x9c\x7d\x79\xfb\x44\x27\xc5\xad\x48\xee\x23\x99\x5d\xef\xde\x5e\xdb\xde\x56\xe2\x59\xec\x0d\x6c\xa4\x4c\x41\xa8\x79\x0a\x05\xd0\xc1\xe8\xda\x1b\xa3\xeb\xb1\x4d\xeb\xa2\xd9\x9b\xbd\x0d\xa8\xc7\x83\xb6\x55\x37\x2f\xf8\xc8\x76\x05\x94\x41\xdb\xda\xd2\x06\x6d\x6b\x8f\x66\x93\x48\x30\x18\xf4\x1b\x49\x13\xb8\xee\x93\xf0\xe6\x19\x08\x49\x4b\xe9\xca\xca\x55\x32\x5c\xc5\x2e\x38\x40\x6a\xf9\x87\x7b\x15\x20\x33\xf3\x26\x36\x3c\x1a\x6d\x88\x75\x60\x71\x29\x03\xc4\xbc\xbb\xb9\xeb\xda\x89\xb8\xde\xc9\xbc\x89\xba\x5a\x37\x29\x2a\x30\x74\x5f\x35\xc4\x1d\x27\x43\x3c\x96\x5a\x07\xde\xdd\x9c\x4e\x9b\x2b\x48\x14\x9b\x99\xe9\x72\x95\xa1\x6d\x8c\x70\x55\x7a\xaf\x26\xc4\x8c\x3a\x15\x32\x61\x93\x6c\x49\xe6\x34\x33\xca\xd2\x03\xd3\x73\x42\xc9\x3d\xcb\x32\xd7\x4d\xf7\x89\xba\x05\x97\xab\x69\x25\x9a\x4c\xf0\x19\x4e\x06\x75\x39\x19\x9f\x0a\x48\xcc\x98\x49\x06\x94\x97\x85\xa5\xd3\xc8\x47\x4b\x51\x46\x48\xcb\xf0\x8e\xef\x4a\x9e\xe2\xcc\xc1\x8f\xd8\xc2\x6d\x8f\xee\xf9\x76\x72\x2d\xf9\xa8\xe7\x20\x1f\x98\x02\x5b\x48\xae\x33\x4d\x96\x96\x76\x19\x39\xfb\x59\x05\xa1\xe2\x32\x07\xcd\xb6\xc0\x54\xd6\xce\x63\xfd\x80\xfd\x7a\xd6\xca\x05\x1f\x71\x98\x59\xa0\x06\xc7\xd0\x6c\x44\xa7\x1d\xdf\xc6\x0f\x56\xd9\x06\x4a\x8b\x82\xb0\x3c\x87\xd4\xe8\xc7\xd9\x92\x2c\x18\xed\x4c\x09\x82\x42\xd4\x3b\x8a\x9c\x70\x41\x44\x61\xae\xae\x92\x33\xbd\x44\x8f\xde\xbc\xd4\x24\x15\x0f\x3c\x20\xdf\xea\xce\x85\x39\x50\x32\x01\x4d\x9d\x0d\xdc\x1c\x82\x0a\x13\x1d\xe1\xce\xcd\xd9\xc3\x24\x81\xbb\x8d\x1b\xa0\x82\x49\x9f\x51\x1d\xc0\x25\x36\x48\xf3\x76\x3d\x1f\xdf\x76\x4c\x39\x7f\x5d\x20\x0e\x73\x3f\x90\x0d\xcd\x89\x16\xa5\xee\xc9\x3d\xb2\xcd\x74\x64\x21\x2e\x1a\x4a\x22\xcb\x41\x11\x51\x46\xaa\x37\xf1\xda\x0d\x17\x53\xc3\x1b\xec\x4e\x1b\x9b\xd2\x29\xeb\x54\x75\x38\xc6\x16\xdb\x02\xde\xef\xf2\x70\x1b\xf8\x95\x93\x72\x3a\x05\x89\x37\x1d\x12\xbc\x16\x76\x5f\xd5\xf1\xf2\x77\x58\x37\xe3\xad\x0b\xf8\x02\x7d\x86\xb5\x03\x1c\x98\xc4\x96\x21\x1d\xc8\x26\x96\xe9\x95\xa0\x10\x0b\x9e\x93\xf7\x1f\xbf\xee\xb6\x45\x63\x54\x16\x08\x4b\x59\xc5\xf7\xfc\xc8\xbb\xc5\x24\xc6\xdd\x0f\x9b\x50\x5f\xdc\xb6\x48\x32\xa1\x5c\x7a\x34\xae\x4b\x32\xa7\x9c\x83\x37\x46\x31\x8d\x96\xec\x09\x00\x27\xa2\x00\x1b\x94\xd7\x89\x18\x4a\x14\xe3\xb3\x0c\x08\xd5\x9a\x26\xf3\xb1\xa1\x8e\xfb\xbd\x50\xe7\x21\xbb\x4f\x94\x96\x40\x73\xbb\x27\x24\xe4\x94\xd9\xe1\x09\x4d\xa4\x50\x8a\xe4\x65\xa6\x59\x51\x75\xd6\xcd\x8a\x08\x88\x08\xa1\x6c\x5a\xaa\x5f\x2b\x4c\x2b\xa9\x13\x9e\xcf\x6a\x0a\xdd\xeb\x8b\x66\xb1\x22\x34\x9d\x9d\x99\x6f\x21\x2f\xf4\xb2\x4a\x4c\xec\xa6\x03\x4d\x99\x54\x9a\x24\x19\x03\xae\xdd\x9b\x59\xc8\x41\xa4\xe1\xcc\x8b\xd3\xdc\xcd\x88\x72\x53\xc2\x53\x54\xbe\x0b\xad\x6c\xfe\x5d\x45\x84\xef\x2a\x65\xca\xd9\x3a\x54\xb7\xec\x3f\xea\x2b\xd3\xd8\x8d\xe3\x67\x04\xb7\x8e\x17\x70\x2c\x45\xee\xa3\x06\x09\x8d\x3a\xdb\x75\xee\x64\x18\x5f\xc1\xf2\x31\xfe\x5c\x9f\xb5\x30\x07\x6a\xdd\x02\x53\x61\xd6\xb8\x0e\x6e\x28\x0e\x0b\x73\x0e\x20\x01\x23\x8a\xd2\x88\x4c\xe6\xc5\x79\x4c\x43\x96\xfb\x00\x4a\xd1\x19\x5c\x77\x0c\x47\x88\xc1\x70\x6a\x43\x1b\xc6\x31\xd4\xdb\x66\x0e\x16\xe8\x4a\x8b\xc6\x27\xcd\x24\xaf\xa6\xf2\x98\xdb\x17\xe9\x44\x81\x57\x9a\x1e\x24\xd3\x1a\x70\x97\x62\x25\x27\x0c\x40\x5b\x05\xef\x6c\x27\x97\x75\x1a\xcf\x4d\x7a\x73\x3c\x23\x7e\xf0\xd4\xa6\x69\x4d\x80\x4c\x24\x83\x29\x99\x32\xcc\x1b\xc3\x8c\xaa\x33\x5b\x85\x80\x62\xdc\x2e\x55\x0a\x24\xbe\xb6\x33\x0b\xf8\xd7\xef\x46\xcf\x5f\xdc\xfb\x6b\x59\xf2\x84\x36\x4a\x74\x22\xb6\x18\x9b\x92\x19\x66\x71\x39\x25\xf8\xdf\x5e\xfd\xfb\x1f\xc8\x64\x69\xe4\x35\x54\xc4\xb4\xd0\x34\xf3\x04\x90\x0c\xf8\xcc\xac\x22\xb2\xdc\x6e\x7c\xa3\x85\x4f\x55\x2d\x4e\xc6\x72\xa6\xed\x04\xbd\xfe\xed\xfd\x24\xe8\xe8\x21\x7f\x3c\x4f\x61\x71\xde\xd8\x42\xa3\x4c\xcc\xba\xf5\xfa\x36\x46\x36\x71\x90\x9d\x6d\xc3\x89\x16\x19\x4b\x96\x87\x3a\xd3\xbe\x78\x09\x99\x8b\x07\x6b\xcc\x59\x3f\xaa\x0d\xa8\x97\x42\x14\x65\x86\x13\x47\xbe\xae\xf0\xf9\x4a\x05\xab\xd0\x47\xa1\x46\xc2\x06\xb7\x43\x27\xaa\x1b\x76\xe5\xce\x71\x29\x8c\x9e\x4c\xe1\x80\x27\x9c\xcf\xad\xaa\x43\xd2\xd9\x1a\xf7\x35\xcd\xb2\x09\x4d\xee\xef\xc4\xf7\x62\xa6\x3e\xf2\xf7\x52\x0a\xd9\x7e\xe7\x8c\x9a\x3b\x7d\x5e\xf2\x7b\xac\xa2\x5b\x83\xd1\x8a\x99\x8b\x29\xf4\xf8\x01\x8d\xb7\xeb\x44\x8c\x7f\x4b\x0b\x0f\xea\x45\x12\x6f\x83\xab\x47\x86\x4f\xac\x36\xb4\x71\x02\x86\xe6\xae\x09\xf8\xd0\x7a\x0f\xd5\x3c\xda\xbf\x7d\xf5\x6f\x7f\xb4\xcc\x85\x08\x49\xfe\xf8\x0a\x53\x8e\xd5\x99\xbd\x00\xf0\x06\x36\xa2\x56\x4e\xb3\xac\xab\x97\xa0\xc9\x02\xbe\xee\x5c\x9c\xba\x07\x47\x5e\x1f\xec\x74\xef\xac\x32\xde\xdd\xfd\x15\xf5\x45\xa6\x15\x64\xd3\x33\x8b\xf6\x52\x99\xb5\x8e\x51\xba\x3a\x76\x57\x5e\x77\xa4\xa0\xc3\x2b\x6d\x0b\x91\x95\x39\xbc\x83\x05\x4b\xba\x39\x30\x5b\xab\xd2\xea\xcd\x9b\xe9\x33\xa6\x10\x04\x68\x92\x89\xe4\x9e\xa4\xee\xcb\x46\xa8\xfc\x6a\x55\xed\xee\xb3\xd0\x35\x69\x20\x20\x59\x60\xeb\xfb\xb7\xd2\x04\x72\x5a\x14\x15\x42\x89\xa4\x0f\xad\xc9\x40\xd6\x84\xe8\xa8\x81\x6e\xc4\x60\x67\x7a\xa8\x2b\x7d\xe4\xde\xc8\x5c\x53\x9d\xbb\xe8\x9c\x5b\x10\xee\x89\xaf\xa9\xef\xee\xc7\x6c\x6d\x88\xba\x43\x7f\x1a\x0a\xfc\xb7\xc5\x5b\x58\x43\xc6\xaa\x20\x87\xaa\x8d\x61\x25\x48\xb3\x7d\xf0\x96\xe9\x6e\xbe\x8c\xe0\x0c\x0d\xcb\x91\x68\xcd\x0b\xaf\x9c\xd0\x39\xd5\x4e\x3f\xf2\x5e\x76\x4a\x0a\x90\x8a\x29\x23\x3a\xfd\x80\x07\xea\x6d\x46\x59\xde\x70\xdf\x1d\x6a\x12\xd6\x23\xea\x73\x5a\x8c\xee\x61\xd9\x71\xc3\x05\x1e\x97\x6d\x01\xfe\x39\x2d\x3a\xde\x03\x58\xba\x36\xfc\x1a\xe8\x78\x39\x5f\x8b\xd4\xd1\x81\xd7\x83\x2d\x49\xfc\x2c\x6a\x6c\x44\x19\xe8\xd0\x57\xce\x0f\xf5\xc2\xb5\x6f\x1c\xf3\x49\x75\xe5\xd8\xa7\xbe\xa4\x8b\x06\xdf\xef\x73\xbd\x67\x2a\xe2\x23\xb1\xd3\xa0\x48\x27\xbc\x9d\xdc\xce\x68\x5f\x47\x2d\x83\x96\x3d\x99\x0d\xd5\xd7\x19\x9a\xc6\xb6\x28\x40\x00\x01\xe6\x28\xba\x41\xc9\xf1\x9b\xe3\x83\xde\x71\x76\x65\xa4\x28\xe8\x0c\x35\xd3\x3e\x2c\xd0\x2a\x4d\x4d\x0c\xda\xb9\x78\xb0\xdf\xdb\xe8\x92\xc2\x3d\x05\x69\x0d\x64\x3e\x17\x41\xab\x63\x23\x07\xfd\x8e\x70\xda\xb5\xc5\x2a\x7c\xa0\x4b\x42\xa5\x28\x79\x50\x1a\x34\x3a\x46\x2a\xc7\xd9\x87\x95\x97\xbd\x12\x1c\xbc\x93\x3e\x64\x94\xbb\x1a\xc3\x9c\x29\x1b\xaf\xc0\x38\x79\x3d\x7e\xfd\x2a\x98\xf6\x1b\x48\x4a\xa9\xd8\x02\x6e\x5c\x8d\xf3\x86\x53\xe5\x72\x7a\x2d\x94\x62\x93\x0c\x13\xb7\xb4\x20\xef\x6d\x01\xf8\xf5\x17\xad\x02\x47\xf0\x8d\x85\x6c\xa2\x95\x06\x50\x78\x62\x4f\x70\x33\xe0\xd3\x0c\x10\x10\xf5\xd1\x2f\x49\x12\xd7\x75\x45\x92\xbc\xaa\x24\x49\x7b\xef\x1d\xf4\x5d\x7d\xe1\xfb\x3e\x70\x92\x0f\xce\x37\x50\x57\xb6\x67\xbe\x72\x32\x7e\xf4\x20\x99\x76\x87\xfb\x81\x29\x20\x27\x68\x95\x58\xd9\x8c\x41\x00\xcd\x4d\x1b\x56\x60\x05\xfc\x18\x00\xcb\x72\xf5\xe8\xf6\x61\x95\xd6\xf9\x49\x1d\x81\xff\xe0\x0c\x58\xf5\x0a\x3a\xee\x5f\xdf\xcb\x73\xca\xd3\x2c\x88\x67\x54\xb3\x92\x2d\x83\xb0\x70\x2e\xa7\xa4\xc9\x12\x9d\xff\xb2\x51\x4d\x62\x4e\x15\xe1\x82\xe4\x40\x31\x40\xd3\xdc\x2e\x9e\x0b\xb6\xb0\x9a\xe3\xd1\x60\x37\xbb\xbd\xc6\x9a\x17\x82\x63\xd7\xef\x98\x72\xec\xd9\xf0\x11\xa7\x81\xd8\xb0\x8e\x9c\xa6\x21\xa9\xdd\x8d\x39\xad\x17\x6f\x5c\x07\x4d\xae\x52\x52\x5f\x1c\x2b\xb4\x3c\x07\x1d\x67\xae\x04\xb9\x19\xbe\xc4\x38\xc1\x0d\x66\xb9\x3a\x48\x26\xc8\x9b\x6d\xdb\xea\xeb\x56\xd7\xe2\xda\xbb\x6e\xa6\xb8\x22\x38\x80\x86\xa7\x5f\xf5\xac\xc1\x0b\x7d\x8c\xa8\x75\xa9\xbb\x1a\x28\x2e\xe3\x31\x0c\xc9\xdb\x3b\x25\x2a\x73\xcf\x0c\x38\x48\xea\xfc\x0a\x3e\x44\xd4\x81\xaf\x50\x25\x78\xe8\x81\x78\x62\xc3\x19\x7e\xff\xb4\x98\x62\x7f\x16\x40\x08\xca\x39\x27\x42\xae\x9c\x76\xe7\x31\xd9\x24\xb1\xc4\x7c\xeb\x15\x68\x2e\xbb\xf9\x1b\x98\x9f\x66\x51\xfe\xbb\x64\x0b\x9a\x81\xc5\xb0\xf7\xac\xe1\xa0\xc2\x84\x2a\x27\x7d\x55\x1b\x9d\x7e\x88\x6a\xc7\xe6\xa0\x87\xad\x1a\x64\x24\x79\xe2\xe8\x88\x9c\xd8\x31\x8e\x2d\xc8\xee\x61\x85\x5c\xb7\x56\xef\x3f\x15\x01\x95\x5b\xe3\xad\xd7\xfb\x4f\x05\xc5\x38\x8d\xa2\x17\x0b\xf7\xbf\x60\x4e\x17\x80\x98\xc6\x2c\xa3\x32\xc3\xa0\xf4\x5b\x3b\x65\x64\x52\x6a\x02\x7c\xc1\xa4\xe0\xb9\x39\x7e\x08\x3e\x63\x38\x93\x04\x04\x83\x4f\x40\x91\xaf\x4e\x7e\xb8\xb8\xc1\xa4\xa5\x53\x87\x96\xef\xde\xaf\x54\x88\x0f\xb0\xf2\x0e\x8d\xee\xfa\xb8\xdf\x88\x7f\x77\xb3\x5d\x50\x3e\xf1\x73\x61\xde\x2d\x2f\x75\x49\x33\x84\x7e\x4e\xb2\xd2\xdc\x85\x07\xdb\xd9\xf1\x6d\xe0\x21\x96\xbc\x98\x26\x70\x07\xfc\xfd\x8e\x75\x3a\xae\x31\x0e\xea\xdb\xc6\x7e\x5d\x83\x21\xef\x5c\xe3\x61\x03\x08\xe5\x9a\xa0\x73\xac\x2a\x60\xca\x66\x1e\x8e\xbb\x8b\xbb\x85\x67\x60\xe9\x04\x9b\xfc\xed\x6b\x92\xae\x59\x18\xb1\x46\xcb\xc1\x6d\xf8\x1d\x0e\x43\xbc\x63\xd0\xc1\x10\x1d\x67\xd7\xa7\x5c\xbd\xc5\xa5\xd9\x8f\xe2\xb0\x8d\x7e\x5b\x69\xb2\x66\x23\xbc\xbb\xba\x6d\x16\xf4\xb0\xce\x3f\xb1\xf7\x4a\x5e\xd7\x5d\xd4\x55\x6f\xb0\x22\x5e\xe5\x40\x05\x39\xb3\xe2\x34\x22\xcf\x56\xf2\xf5\xbb\xab\xdb\x3d\xc7\xf2\xbb\xd9\x0a\xc3\x13\xaa\x6c\x8c\xf4\xbb\xab\x5b\x1b\xb7\xb6\x1f\xed\x9d\x1d\x29\xdd\x7d\x10\x08\xe0\x86\xd8\x5a\x1d\x38\x76\x38\x97\xbb\xa8\xe2\x41\xcc\xe2\xa3\xcf\xd7\x52\x43\x2e\xaf\x09\x4d\x53\x89\xe1\xcc\x5d\xce\x72\x0b\xd1\x8e\x16\x45\x15\x95\x8a\x45\x62\xa8\x82\xe6\xab\x37\xf6\x00\x0a\x3e\x1d\xd7\xcf\xb6\x77\x65\x91\x31\x1b\x7e\xda\x1c\xa2\x2e\xa1\x93\x8b\x45\x17\xfe\x14\xe2\x61\xec\xec\x5f\x0c\x92\x0f\xa2\x62\xce\x89\xae\xe5\x69\x63\xef\x52\x09\x4a\x64\x8b\xba\x78\x7e\xf0\xee\x74\xec\x08\x43\x12\xab\xdd\xe9\x2b\xd0\x3e\xd3\xce\x04\xae\x25\x83\xf5\x5d\x49\x6e\xcc\xdb\x95\xc8\xce\x2a\x12\xd8\x02\x30\x65\xc9\x55\x08\xee\x30\x32\x0e\xe3\xf3\x6e\x89\x9e\xdb\xac\x1b\xaa\xf1\x64\x52\xe9\x45\x01\x7c\xf3\x80\x57\x3c\xc8\x11\x59\x41\xa6\x4f\xdf\x5d\xdd\xda\x9b\xd4\x4e\x97\xc3\xf3\x56\x1b\xf7\x4e\xe7\x4b\x8e\x1c\xbe\x4c\x52\x88\xdb\x26\x5a\x4e\x69\x55\xd2\x94\x6d\x9c\xe0\x63\x15\x08\x91\x7a\xe3\x42\x13\xc2\x12\x81\x03\x2c\x07\x41\x48\xa5\xed\xd8\x10\x9f\xf6\xfa\xc8\x64\xe1\x68\x07\x79\xd7\xa8\x77\x85\x02\x2a\x93\x79\x97\x8d\x1d\xfb\xb2\xb0\x94\x90\x54\xd8\x0c\xb1\xa9\x90\xe8\x81\x1f\xa1\xa8\x93\x09\x71\x5f\x16\xcf\x23\xdd\xb8\x81\x0b\xaa\xe7\xcf\x76\x89\xb4\xc6\x18\xe4\x9b\xee\x7b\x36\xe5\xaa\x4b\x9e\x4b\xa0\xf2\x05\xda\xaa\x5c\x38\x72\x8d\xd4\xb6\xff\x65\xd4\x32\x83\xbd\xcd\x4a\xa5\x41\x7e\xcd\xa4\xd2\x47\xfb\xf6\xf4\x03\xcd\x98\x03\x4e\xb6\x21\x2c\xc7\xcd\xee\xfe\xc2\xf4\xdc\x15\xea\x3d\x3e\x6b\x7f\x65\xfe\x76\x64\x1c\x13\x21\xc9\xf1\x95\xe0\xb0\x77\xf0\xd0\x8a\x06\x5a\x09\x3e\xd5\x95\xbe\x55\x66\x73\x93\xa8\x20\xb3\xa0\x2a\xf8\x45\xe7\x73\x76\xe7\x6a\x27\x1b\x7a\xbc\xa4\xa0\x40\x13\x8a\x45\x27\xb1\xef\x79\x5d\xb0\xd8\x16\x47\xb3\x85\x9e\x85\xd3\x79\x97\x8d\xa5\xdd\x73\xf0\x46\x75\x35\x2d\xb6\x2f\x40\x17\xd5\x76\xef\x73\x86\x88\x21\xe0\xca\xc9\x7c\xcf\xf8\xfd\x9e\x87\x3c\xec\x84\xbc\x5f\x1b\xbd\x01\xd1\xe2\x7d\xef\x8c\x5b\xd0\x04\x23\xea\xd1\x89\x28\xb5\x2f\x71\xd3\xf4\xc2\x33\xfe\x5f\x76\x5f\x60\x00\x2b\x02\xe0\xec\xbb\x2a\x1b\x0c\xe0\xea\xcc\x86\xb9\x78\x0b\xb7\x5a\x72\x4d\xb1\xd6\xf6\x3b\x91\xdc\x83\x24\x99\xa1\x79\xdf\xcd\x57\xe7\xb1\xb6\xaa\x2a\xef\x9d\xd6\xd2\x35\x22\x03\x8a\x39\xe4\x20\x69\x56\x19\x40\x5f\x74\xd1\xbf\x77\xb7\x77\x45\x46\x33\x89\xd3\x96\x47\x74\x85\x72\x45\x3a\x26\xef\x37\x3d\x95\xd3\xa5\x2f\xfc\xce\x38\xfa\x0e\x3f\x31\xa5\xf7\xbf\x61\x0a\x91\x36\x31\x52\x4b\x05\x72\x54\x61\xe6\x12\xea\x8a\x2f\xfa\x7c\xda\x14\x26\xe5\x6c\xc6\xf8\x6c\x6c\xc5\x03\x14\x43\xea\x02\xb1\xb5\x2d\xec\x61\x0e\xfb\x46\xc8\x24\x12\x28\xc6\x0f\xa3\xb2\x62\x43\x26\x58\xb3\xf7\x5c\xa4\xb6\xf3\xc9\xd2\x5a\x60\xfd\x9e\xac\x80\x94\xc8\x25\x27\x42\xba\xba\x18\x34\x4d\xc9\xde\x61\x3a\x1b\x56\x04\xfb\xaa\xe7\xd7\x12\x57\xd6\xfe\xf9\x63\x55\xff\xaa\xb1\x40\xaa\x9c\x18\xd9\xb7\x94\xfb\xd6\xba\xee\x2a\xa3\x74\x92\x4f\x42\x65\xd1\x0b\x5e\x6f\xcf\xb7\x4d\x24\x02\x4a\x34\xe4\x85\x90\x54\x2e\x57\xd3\x4d\xcc\x4d\x62\xb6\xaf\x59\xa0\x95\xb9\xbd\x16\xa9\x11\x12\xf6\x26\x63\xc3\xb6\x5d\x30\xa3\x76\x6e\xda\xb9\x1b\xcf\x13\x5e\x6d\x5c\x10\xbf\x66\xa4\x03\x15\x2a\x99\x43\x5a\x22\xfa\xd4\xac\xa4\x92\x72\x0d\x86\x7f\xba\x10\xd6\x65\x2b\x90\xa3\x42\x6a\xa8\x60\xdb\x96\x98\x37\x8a\xc5\x9d\xcd\x27\x58\x57\xba\x4b\xb8\x89\x13\x8e\x4d\x47\x0d\x38\x88\xbb\x39\x10\x23\x49\x66\xa0\x71\xf2\x61\xc1\x12\xed\x07\x99\xe2\x22\x6c\xd8\xfa\x09\x2d\x2d\xd4\xc3\xfe\x01\x40\xd7\xc2\xd5\x51\x4d\xc0\xdc\x49\x5a\xd5\x53\xeb\xb2\x1e\x59\xa7\xb8\x92\x3b\x7f\xb2\x37\x11\x5c\x1f\xcc\x27\x8e\x24\x1a\x45\x3a\x33\x4d\x7c\xbb\x47\x18\x73\xb5\xc6\x1b\x56\x62\xcf\xa1\x02\x0c\x30\xdd\x53\x1e\x3a\xa5\x2a\x84\xd8\x7a\xa8\x9c\x1d\x2c\x09\xe8\x42\xce\xca\x1c\x93\xe6\x9d\x6e\x0b\x5c\xcb\x65\x21\x58\x57\xbf\xbd\x39\x6a\xe8\x66\x3c\x56\xe4\xed\x87\x77\x4d\xc0\xb7\x66\x99\x3e\x0f\x07\xd8\x6d\x90\x1f\xe2\x06\x28\x90\xcb\x29\xa1\x95\xd0\xd7\x89\xa2\xfa\xa2\x76\x36\x1f\xe7\xfa\xad\x08\xf4\x16\x58\xc6\x0b\x23\xc1\xa2\x9c\xde\xa8\xeb\x93\xcc\x29\x9f\x19\x56\xf5\x4e\x94\xe6\xc5\xbe\xfa\x0a\x5f\x42\x42\x5a\x26\x1d\x83\x4b\x11\x30\xda\xa1\x22\x7d\xe5\xc3\xbc\x5c\x01\x31\xa3\x8b\x82\x4a\x68\xe1\xa7\xa6\x39\x7b\x56\xca\x7d\x43\xd8\x18\xc6\xe4\xe8\xab\xc6\x57\x47\x48\x71\x27\x6a\x0a\x29\xcc\xab\x38\x10\x26\x7c\xfb\x8c\x69\xe4\x1f\x47\xcd\x11\xc6\xe4\xbd\xa1\x0b\xa3\xa6\xab\xb5\x6d\xe0\xea\x4c\xea\x95\x3d\x23\x12\x66\x54\xa6\x19\x74\x04\x10\x11\xd3\x4a\xc9\xb0\x40\x95\x6e\x57\x21\x63\x44\x5c\x01\x2e\xf4\x38\x8e\xeb\x7b\x57\x44\x3b\x4d\xd5\xbd\x3a\xb7\xea\xcc\x28\xa5\x9a\x8e\x68\x61\xed\x41\x4c\xf0\x73\x6b\xea\x1e\xb9\x22\xe5\x23\xea\x4e\xef\xa8\xda\xd9\xe7\xbf\x76\xf0\xab\x23\x5a\x3d\xc5\xf8\x88\x8e\xb0\x6c\x77\x67\xfb\xcd\x01\xd2\xee\xa2\x07\xce\x04\x95\x63\x0a\x28\xbb\x1f\x83\x4d\xbf\xaf\xb8\xb2\x5d\x8a\x31\xb9\x12\xda\x57\xd7\x4f\xeb\x44\xc3\x80\xe2\xec\x4d\xc6\xfd\xfe\xea\xee\xe6\xaf\xd7\x1f\x2f\xaf\xee\x06\xfe\x3d\xf0\x6f\x6c\x03\xff\x1e\xf8\x77\x87\x81\xfb\xc2\xbf\x81\x2f\x0e\xc5\xbb\x2b\x7b\xd7\x26\x03\xe3\x4a\xb5\xd7\xc0\x44\xf1\x2f\x28\xd1\xfe\x3d\x5f\xfc\x40\x8d\xea\x58\x48\x50\xa8\xa0\x18\x8d\x75\x53\x90\xb2\x7b\x00\x2d\x81\x75\x4c\xe7\x67\x9b\x69\x7f\xc0\x3c\xf9\x88\x79\xa2\x41\xb1\xf3\x57\x8d\x02\x20\x9b\x96\x3c\x24\xee\xfb\x03\x5d\xda\xfa\x48\xf6\x50\x52\xbe\x24\x85\x64\x5c\xe3\x56\xba\xb8\x7d\x7b\x79\x49\x92\x39\x95\x34\x41\x07\x15\x7c\x4a\xa0\xd0\xe4\xf8\x7f\x1e\x36\x4d\x3e\xb0\x9a\x6a\xbc\x95\xd9\x47\x70\x0b\x18\xa6\x16\xf9\x0a\x09\x0b\x26\x4a\x95\x2d\xab\xb2\xfd\x9b\xf9\xe8\x3a\x9a\x42\x60\x92\xd8\xd2\xbb\x99\x36\x0f\xb8\x22\x74\x6e\x12\x20\x03\x86\x3f\xb0\xe8\xe9\x88\x88\x21\x80\x06\x8c\xbf\x41\x74\xdd\x5d\x0c\x0d\x18\xb7\x93\x00\xbb\x4d\x18\x0d\xa0\xa3\x2d\xc6\x06\x74\xd4\xce\xa2\x39\x3c\x27\xfb\x5a\x8a\x3c\x12\x37\xbb\xb5\x06\x6d\x1f\x5b\xb1\xe9\xa8\x56\x51\x57\x4d\xf1\xc8\xa9\xb4\x75\xed\x14\xa3\x4e\xe7\x85\xee\x98\xf7\x41\x62\xd5\x8d\x8f\x53\x62\xdd\x46\xcd\x7f\xa0\xc5\x77\xb0\xbc\x81\xc0\x2a\x51\xed\xf9\xc6\xf8\x0b\x45\x28\xb9\x87\xa5\x0d\xae\x7c\xeb\x07\x0b\x2b\x94\xd5\xc3\xb2\xfb\xf7\xd0\x0d\x8c\xde\xb7\x78\xf5\xf2\xef\x21\x00\x2a\xc1\xb7\xb5\x62\xea\x66\x09\x51\xff\x30\x6b\xda\xab\xf2\xf1\x61\x92\xa8\x6f\x31\xcb\xd3\xd9\xd6\x94\x4c\xdd\xf5\x10\x61\xe2\x56\xe1\x72\x60\x3a\x85\x44\xfb\x14\x7c\xbb\x9b\xcf\x30\x4b\x33\x2d\x6d\x8d\x4f\x9a\xdc\x3f\x50\x99\x2a\x92\x88\xbc\xa0\x9a\x4d\x58\xc6\xf4\x32\x2c\x3f\xdf\x37\xbc\xe1\x2b\x80\x71\xcb\x14\xc9\x25\x57\x9a\xe2\x55\x28\x9c\x21\xd0\xac\x76\x8d\xf2\x8b\x60\xc0\x96\x9b\x62\x26\x10\x95\xe1\x85\xf9\x0d\x29\xb9\x50\x9a\x24\x20\x8d\x50\x97\x2d\xc9\x83\x14\xbc\x23\xf6\x76\xbb\xed\x59\x5e\x46\x2c\x8c\x2c\x08\x0f\xe7\x2e\x4f\x70\x64\x5e\x7c\x64\x99\x95\x3a\xc7\x2c\x94\xf3\x5f\xe3\x7f\xfa\x74\x8a\x88\xcf\x32\x7c\x43\x8e\x8e\x02\xfb\x12\x3e\x68\x29\xee\xa9\xbc\x75\xc1\x74\x4d\xd1\xa9\xba\x50\x88\x45\x04\x46\x3e\xe5\x71\x10\x9c\x16\x10\x69\x9a\xc3\xe0\x6c\x6c\x6b\x59\xaa\x72\x5a\x84\x19\xaa\xea\x86\xec\x20\xee\xed\x1d\xcc\x03\xeb\xeb\xdf\x32\xab\xaa\x4a\x67\xfa\xc6\xe3\x7b\x28\x92\x83\xa6\x29\xd5\x74\x6c\x0e\xc4\x59\xfb\x4f\x55\xd0\x04\xce\xc8\x3f\xaa\x0f\x33\x3a\x81\x4c\xfd\x78\xfc\x1f\xdf\xbd\xff\xeb\x7f\x1e\xff\xf4\x8f\xe6\x77\x28\xae\xa1\xe1\xb4\xf9\x40\xe0\x2b\x60\xac\x14\x17\x29\x5c\x21\x75\xf8\xa7\xd3\xf4\x2e\x92\x44\x94\x5c\xbb\x2f\x10\xdc\x7d\x3c\x17\x4a\x5f\x5e\x57\x7f\x16\x22\x5d\xfd\x2b\xa0\x84\x1f\xe9\xa7\xdc\x83\x6b\x1b\x00\xf6\x68\x5b\x3c\xe9\x87\x16\xec\x07\x90\x2a\x08\x1f\xd0\xb7\x76\xc6\x86\xed\xd5\x6f\x63\x95\xcc\x21\xa7\xf8\xcf\xaf\xfd\x14\x98\xfb\xb8\x2a\xbf\xc1\x11\x45\xdf\xdc\x81\xed\x9a\xbe\x47\x8b\xd7\x41\x1a\xa7\x6d\x11\x39\x7f\xb5\x82\x91\x27\x0c\x67\xc4\xcd\x96\xe5\x00\x95\xfc\xe8\xad\x14\x75\x18\xe4\xc5\xf5\x25\x59\xd8\x19\xee\xd1\xe4\x3c\x1f\xbb\xce\x20\xba\xba\x15\xcc\xb0\xbf\xae\xa8\x72\xcb\xd4\x50\xdd\x9c\xc2\x8c\x94\x87\x2e\xd0\x8d\xc7\xea\x37\x9d\xbe\xe7\x0b\x33\xae\x6a\x95\x9a\xf4\xf2\x24\x0f\x84\xf5\x21\xfd\xe4\x99\xa1\xba\x22\x96\x45\x0f\x65\xb9\xa6\x13\x0b\x91\x72\xd5\xd5\x8b\xe0\x5b\x9f\x75\xd7\x28\xaa\x9c\x57\x80\x1b\xd0\x3c\xd5\x61\x20\x17\x86\xd9\x2f\x30\x57\xe6\xde\xc7\xae\x16\x12\x16\xc0\x75\x15\x74\xed\xea\x7e\x51\xa9\x59\x1c\x9d\xc4\x51\xa4\x2a\x4b\x77\x1d\xd6\x61\xad\x5c\xf9\x8b\xfb\x2e\xea\xf6\xae\x44\x63\xeb\x45\x56\xcc\xa9\x79\xeb\x59\xa5\x07\x6f\x3c\xed\x36\x7a\xc2\xcc\x9d\x62\xff\x84\x95\xda\x2d\xaf\x7f\xfb\xc7\x06\xa1\x3d\xba\x1b\x9e\x4d\xcd\x89\xb2\x63\x37\xe9\x4a\x58\x8d\x67\xbb\x9a\xe4\x2a\xe1\xd5\xcf\x85\xb3\x29\x7c\x37\x01\xce\x64\xfa\x89\x29\x7d\x66\xcb\x06\xfa\x13\xb4\xa0\xb2\x8a\x12\x2a\x27\x19\x53\xf3\x50\x76\x6f\xdb\xe5\xb4\x5a\x9d\x95\x32\x8a\x15\x4e\x72\x2d\x7b\x98\xb9\x58\xa1\x32\x02\x09\xdb\x4c\xcc\x6d\x94\xc2\xda\x9d\x7f\x8d\x09\x12\x75\x7c\x74\x10\xa6\xde\xe3\xf3\x60\xa1\x63\x5f\x6a\x22\xd6\x30\x14\x25\xe8\x52\x1a\x9e\x95\x5a\x3e\x71\x2d\x52\x97\xd3\x12\x4f\xf8\x8b\xa1\xac\x93\xa6\x51\xa4\x6b\x51\xc5\x66\x2b\xe2\x0b\xd9\xd1\xae\xb7\x1d\xa0\xe7\x2a\xe9\xdd\x33\x89\x28\xc6\x35\xc7\x84\x24\x64\xb6\x1e\x3b\x22\xcd\xba\xd4\x00\x0f\x3d\x6f\x06\x3c\x1e\x8f\x8f\x2d\x95\xc2\x55\x3b\xb5\x16\x45\xf3\x79\xaf\xae\x85\x5a\xa8\x7a\x06\x33\x3c\x6f\x18\x95\xdd\x12\x59\x48\x56\x37\x55\xde\xc5\x1a\x4b\x56\xff\x0c\x94\x29\x9f\xa9\xf2\x75\xaf\x6d\x60\xcd\x7c\x9a\x56\xf0\xc1\x1b\x82\xa0\xb9\xfe\x7b\x27\xfc\xa8\xaa\x58\x3f\x28\x1d\x6a\x28\x3e\xb1\x5d\x8e\x93\xa2\x3c\x73\xdd\x8f\x73\xc8\x85\x5c\x56\x7f\x56\x59\x40\x23\xa5\x85\xa4\x33\x84\x1d\xb7\x83\xdb\x9f\x55\x7f\xd9\x1f\xb6\xc8\x5b\xff\xb5\x8d\xee\x48\x4a\x29\x81\xeb\x6c\x59\xe3\xf9\x7e\x71\xba\x9c\x5f\xb7\x9e\x28\x50\xd5\xb6\x7a\x06\xfe\x73\x5c\xe7\x2d\xa2\xcf\xad\x9a\x45\x74\xa9\xbb\xf2\x40\x67\xb5\xc0\x81\x71\x1f\x56\xc8\x53\xc7\xfd\xe1\x43\x84\xa4\x6c\xc1\x94\x08\x80\x7e\xad\x3a\x5a\x77\x4f\x78\xfc\x3c\x57\x88\xd2\xa6\xa3\x57\x16\x94\x4f\x05\x16\xa5\xae\x0e\xfb\x8a\x69\xf0\x75\xa8\xe7\x05\x65\x0c\x0d\x92\xbf\x21\xff\xfb\xe4\x6f\xbf\xf9\x79\x74\xfa\xa7\x93\x93\x1f\x5f\x8d\xfe\xfd\xa7\xdf\x9c\xfc\x6d\x8c\xff\xf8\xd7\xd3\x3f\x9d\xfe\xec\xff\xf8\xcd\xe9\xe9\xc9\xc9\x8f\xdf\x7d\xf8\xe6\xee\xfa\xfd\x4f\xec\xf4\xe7\x1f\x79\x99\xdf\xdb\xbf\x7e\x3e\xf9\x11\xde\xff\xb4\x63\x27\xa7\xa7\x7f\xfa\x2a\x98\x74\xca\x97\x1f\x03\xb9\xb7\x6d\x23\xb7\x59\x18\xd7\x30\x83\xfd\xd3\x53\xb7\xf7\x18\xc9\xd5\xd6\xba\x0a\x19\xd7\x23\x21\x47\xb6\xeb\x37\xa8\xa4\x04\x0e\xe0\xb7\x57\xec\xf3\xef\xf1\x97\xde\xd4\xb7\x59\x25\x14\xf6\xe8\x80\x3f\x97\xa0\xa1\x20\x91\xa0\x5f\x22\x4c\xc6\x8e\xd4\x28\xab\xe7\xa0\xb3\xd0\x23\xf6\xa5\xdd\xa0\xbf\x84\xc8\x19\xef\x34\xb2\xeb\x5a\x6b\x52\x46\xbd\x1a\xd7\x4a\x10\x25\xd6\x8e\xe8\x9e\xbb\x87\x80\x10\x33\xdf\x86\x48\x9b\xce\x6d\x88\xb4\xd9\x42\xca\x10\x69\x13\xd4\x3e\xcb\x48\x9b\x5b\xcb\x93\x7e\x91\x61\x36\xf1\x91\xf5\x3b\x66\xee\xc4\x04\xd5\x07\xbe\xe8\x1a\x5c\x1d\x33\xd5\xcd\x9b\x3d\x10\x8a\xab\x28\x33\xaa\xb7\x64\x51\x44\xca\x7b\xeb\x99\xe7\xec\x2f\x16\xc2\xe6\xde\xa2\xda\x28\x8d\xaf\x99\x97\x99\x66\x45\xc7\x84\x80\x4a\xb5\xb4\xa9\x05\x86\xf9\x53\xa5\x44\x62\x11\x7f\x2a\x90\xbc\x8c\x2a\xed\x5f\x19\x2d\xf3\x9a\xde\x63\x0e\x4d\x02\x29\xf0\x7d\xb1\x98\x7c\xfb\xc1\xa2\x05\xfa\xb9\x9d\x2c\xcd\x3d\xf4\x9e\x2f\xdc\x9d\x44\x52\x0f\x58\x59\xfb\x4a\xa3\x8c\xfb\x65\x65\x33\x9a\x73\xe9\xb2\x15\x1a\x49\x8d\x28\x41\xd6\xa0\x3c\xe8\xcd\x11\xd3\x3a\x04\x12\xd3\x3f\x2c\x9b\xee\x76\xe1\x05\x2b\x07\xe1\xa2\x78\x95\x8d\x10\xa4\x63\xad\xc9\xe0\x75\x98\x68\x5b\xf6\xee\x3c\x42\x8f\x12\x38\xc2\xa5\xf2\xb8\x12\xf9\x73\x48\xe3\x7d\x91\xc4\x7b\x22\x85\x3f\x8f\x04\xde\x4f\xe9\x3b\x9a\xe4\x1d\x47\xea\x8e\x23\x71\xef\x11\xd7\x1e\x53\xca\x8e\x23\x61\x3f\x87\x7d\xad\x90\x30\x65\x9f\xfa\x90\xb6\xec\x11\x57\x89\x86\x4f\x68\xaa\x29\x24\x14\xc0\x2b\x40\x6f\xef\x81\x05\x9a\xcc\x87\x8c\x73\x52\xd9\x45\xe3\x5e\xd8\xb7\x9b\x2c\x65\xc3\x6d\x4d\x86\xdb\x7a\x8f\x36\xdc\xd6\xc3\x6d\xfd\x22\xb7\xb5\xe3\x56\x5f\xfe\x55\x1d\x19\x69\x09\x31\xe4\x0e\x5e\xd2\xd1\x92\x11\x50\x9b\x66\xcf\xa3\x58\xc7\x78\x9e\xe3\xc8\x5d\x4e\x5c\xd0\x39\xc3\x51\xaf\xcb\x2c\xeb\x52\xe7\xc2\xb6\x18\x0b\x70\x89\xd3\x5e\x94\x59\xe6\x6a\x23\x74\x9b\xfd\x8f\x1c\x2f\xb0\x8b\xec\x81\x2e\xd5\x19\xb9\x82\x05\xc8\x33\x72\x39\xbd\x12\xfa\xda\x9a\x4e\xba\xf5\xdb\x44\xc2\xb0\x9d\x13\x36\x25\x6f\x32\xaa\x41\x69\xa2\xe9\x0c\x23\x6a\xeb\xea\x9d\x42\xb6\x06\xad\xeb\x93\x1f\xd0\xa2\x15\xbe\x37\x7f\xed\x01\xe4\x47\x87\xd9\xab\x19\x9b\x42\xb2\x4c\xb2\x70\x36\xf1\xbd\xef\xc9\x47\x9c\x7b\xf1\x00\xe3\x94\x36\x20\x54\x7f\x86\x65\xc0\x0a\xa1\xf4\xad\xa6\x52\x1f\xba\x16\xd8\xb5\x27\xc4\x4c\x76\x42\xb3\x0c\x52\xc2\xf2\x1c\x52\x46\xb5\x11\x04\xe9\x54\x83\x24\xb4\x59\x6f\x56\xd9\x20\xf0\x46\x22\xc2\x9c\xf2\x34\x03\x49\xa6\x94\x65\xaa\x7b\x28\xfa\x4a\x5d\x5b\x85\x89\x99\x8c\x5b\x00\x7c\x0c\x63\xf4\x08\xf3\x34\x49\x84\x4c\x31\x86\x56\x78\x24\x76\x7c\x89\x10\xfe\x64\xda\x47\x14\x15\x72\xca\xe9\x0c\x72\x57\xb5\xbe\x4d\xd6\x24\x13\xc9\xbd\x22\x25\xd7\x2c\xb3\x2f\x2f\xc4\x3d\x0a\xc4\x19\x9e\xd4\xce\x43\x77\x67\x00\xd5\x3f\x47\xd5\x21\x1c\x19\xaa\xd4\xf9\xaf\xeb\xaf\xf0\x83\x8e\xc4\x45\x50\xcb\x62\x28\x65\xf0\x09\x92\x10\x01\xb1\x6d\xbd\xff\x04\x49\x75\x2b\x28\xdc\xe1\x88\xcc\x69\x21\xfe\x11\x83\x37\x92\x23\xcb\xb6\x48\x01\x3d\xb1\x82\x68\x02\xb0\x8f\x9b\x2d\x76\x8c\xc8\x5b\xb7\x08\x4c\xb9\x99\xb7\x7f\x66\x8c\x43\x7b\x61\x94\x2d\x89\x09\xcd\x4a\x09\xe6\xcf\xb5\x9a\xdf\x1e\x46\x2a\x98\x34\x4f\x8b\xa1\x4d\x0a\xa1\xc9\xc9\xf1\xf9\xf1\xe9\xda\x1e\x39\xfe\xff\xd8\x7b\xf7\xe6\x36\x72\x6b\x5f\xf4\xff\xf3\x29\x50\x4e\xea\x48\xda\x21\x25\x7b\x92\x49\x65\x4f\xed\x7b\x53\xda\xb2\xc6\x56\xc5\x96\x79\x25\xcd\xe4\xa4\x26\xb3\x27\x60\x37\x48\xe2\xa8\x1b\xe8\x00\x68\x49\x4c\xcd\x87\xbf\x85\x85\x47\xa3\x49\xca\x36\x01\x48\xa4\x9d\xee\x54\x4d\x2c\x8a\x6a\xbc\x17\xd6\xe3\xb7\x7e\x4b\x02\x9e\x5f\x2e\xa5\x22\xb5\xa9\x52\x51\x74\x83\x92\xb4\x6e\xa0\x06\x3d\x29\x0e\xca\x11\xa2\x2a\x07\xe8\x44\xdf\x91\xa6\x6c\x0e\xcc\x8a\x65\x8c\x1e\x21\xc9\x91\x12\xb8\xa4\xd6\x4f\x06\x9f\xea\x2f\x29\xd1\xda\x2a\x38\x87\x07\xbf\x1e\x8c\x10\x51\xc5\x11\xba\xe7\xec\x40\xc1\xf4\x1d\xa3\x1b\x8e\xda\xe4\x24\x1a\xd4\x75\x64\xc9\x5b\xc4\x08\xb1\x67\xcb\x17\xca\xd2\xd7\x0d\xe2\xad\x49\xf9\x5a\x60\x95\xc2\x74\x1d\x3e\xe7\x0f\x54\x59\x36\x07\x2d\xbf\x5f\xc2\x6e\x32\x57\x16\xc2\x12\x55\xf4\x8e\x9c\x2c\x08\xae\xd4\xc2\xc0\xe3\x19\x67\xe3\x7f\x11\xc1\x81\x17\x9b\xd9\xdf\xa4\x76\x23\x2d\x46\x19\x3e\x09\xf1\xca\xf5\x0e\x65\x41\xc6\x64\xb6\x2e\xdd\xa3\xaf\xbd\x37\x24\x5a\x25\x42\xab\xf2\xe8\xed\xcd\xcd\xe4\x0d\x51\xa1\x94\x67\xf0\x21\x7a\x73\x7e\xe3\x92\x22\x82\x5a\x51\x7b\x20\xde\xf3\xa0\x35\xc7\xa8\xe1\x62\x1f\x6e\x99\x05\x97\x49\xcb\x89\x9e\xe0\x8a\x79\xcb\xa5\x32\xc1\x01\xc5\xb5\xd8\x66\x90\x29\xc7\xfb\x08\x7f\x97\x0f\x7e\x31\x39\x46\x7f\xe3\xad\x9e\x90\x29\x9e\x56\x4b\x74\x8f\x99\xf5\x76\xa7\xc1\x72\xf5\xf3\x42\x77\xe5\x85\xbe\x41\xf4\xce\x7f\x4b\x70\x49\x84\x04\x01\x4d\x70\x72\x76\x6d\xb6\xe3\x1e\xf4\x2d\xeb\x52\x9e\xb5\x52\xf1\x1a\x2d\xec\xb0\xfb\x9c\xd9\xf6\x70\x1e\x9b\xe3\x6a\xf9\x49\x05\x69\x8c\x10\xb7\x7f\xf3\xd5\x89\xe8\x35\xe9\x65\xe6\xdd\x7e\x3e\x35\x6a\x6a\x38\x6d\xd6\x63\x6e\x98\x2f\xad\x6c\xd3\x5b\x35\x1b\x90\x32\x03\x00\x1d\x65\x04\xa1\xa3\x34\x36\xed\xd5\x17\x41\xf4\x20\xf9\x4d\xf9\x70\xed\x28\x1b\x76\x1b\x3d\x09\x7e\x1b\x59\x58\x9e\xdd\x7c\x26\x72\x94\x56\x2a\x7c\xf5\xe5\x41\x85\xe6\x02\x33\xce\x68\x81\x2b\xfa\x2f\x52\xa2\xb6\xe1\xcc\x26\x6b\x81\x66\x5b\x60\x49\xc6\x10\xca\x65\x46\x9c\xcb\x80\x3e\x59\x4b\x07\xc5\x39\xa8\x7b\x80\xc6\xd2\xe2\xde\xf4\x3a\x4f\x57\xb3\xc2\x8c\x93\xb9\xc0\xc3\x67\x2d\x42\xdb\x5b\xac\x3c\x3b\x1e\x7d\x11\xea\x24\xca\x94\xc9\xbf\x4e\x96\xa5\x38\xc2\x45\x01\x04\xd1\xe6\xba\x02\xc1\x2b\x89\xb8\x4b\xdf\x5f\xd9\xe6\x55\xab\x80\xfb\xa6\x7b\x99\x20\xb6\x40\xac\xad\xa7\x44\x74\x4c\x83\x42\xad\xcf\x69\x16\xaf\x8b\x6d\xd6\x34\xe7\xc2\x7e\x4e\xc7\xc0\x6c\x4e\xd0\x2b\xdd\xf2\x1f\xbf\xfd\xf6\xf7\xdf\x66\x68\x47\x0f\xcf\xb5\x82\x19\xba\x38\xbd\x3c\xfd\xe5\xfa\xc7\x33\xe0\x2f\x4f\x7d\x7d\xa6\xac\xcb\xdc\x39\x97\x59\x33\x2e\x9f\x34\xdf\x12\x98\x00\x93\xa5\x6c\xee\x23\x71\x0d\xbd\xd2\x9b\xb0\x95\x86\xf3\xdc\xda\x24\xd6\xbb\x6d\x5c\xcc\x32\x43\x9e\x54\x18\x27\xd3\x02\x6b\x2f\x24\x95\xac\x08\x69\xb2\x59\xfc\xd7\xfa\x6d\xbd\xfa\x32\xa8\x6c\x85\x29\x33\x0e\x1e\xa6\xbe\x2f\xdf\x96\x1a\x87\x3e\x7c\x45\xc6\xbf\x24\x05\x67\x65\x8a\x09\x90\x4b\xa5\xb5\x3d\xc9\x7a\xe6\xae\xcd\x3b\x9d\x8b\xb8\xbb\x4a\x6c\x63\x60\x49\xa6\xae\x28\xf2\xab\x9a\x47\x4e\x1a\x7a\x01\x78\xdb\x1f\xff\x10\x1f\x20\x2b\x9a\x6b\x5e\xdc\x66\x74\x91\x25\x0a\xb0\xd7\xfa\xa4\x15\x26\x16\x78\x73\x36\x31\x9d\xd3\x2b\x73\xf9\xe1\xa6\xe3\x12\xd1\x5a\x38\xee\xc2\xba\x6f\x6d\xb4\x10\xb3\x12\xdd\x92\x26\xcd\xba\xd4\x02\xd3\xe1\xd2\xfa\xb0\x34\xf0\xbd\x0b\x1b\x44\x36\xf9\xba\x46\x10\x38\x38\x99\xd1\x88\xd3\x4a\xca\x04\x71\x6f\x08\x04\x5a\x23\x64\x86\x69\x85\x30\x78\xe5\x15\xad\x89\xa9\x7f\x0d\xce\xfe\x0e\x88\xf0\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x30\xc6\xdf\x6d\xed\x35\x4c\xa5\x59\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\x26\x6b\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\xa1\xd8\x09\x50\xd3\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x50\xe1\xca\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x3d\x8d\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\x0b\x03\x73\xd3\x35\x4b\x0a\xe7\x77\x13\x5b\x08\x2c\x17\x04\x92\x31\xc9\x03\x55\xd2\x34\x6a\xe8\x3d\xdd\x8c\x6b\x7d\x61\x2e\x70\x41\x50\x43\x04\xe5\x5a\xc5\x68\x99\x2a\xf9\x3d\x43\x53\x32\xa7\x4c\xba\x15\x4b\xe9\x92\xdb\x12\x80\x24\xa2\xd2\x97\x80\x3e\x46\x57\xbd\x52\x64\x96\xae\xaa\xe0\x9d\xcc\xb4\x53\x34\xca\x34\x25\xa0\xbc\xc0\x36\x68\x71\x55\x2d\xbb\x8d\x17\x32\x4e\x3e\x32\x43\xf1\x1b\xc2\xcc\xec\x61\xcb\x60\xa0\x25\xa9\xf0\xd2\xa4\x24\xcf\x28\x03\xef\xaf\x90\x47\xc7\xe9\xd0\xac\xe8\x0e\x72\x11\xbc\xf3\xd1\x9d\x41\x25\x12\x04\x17\x49\xc4\xb8\x03\x06\xec\x53\xcf\x80\x01\x1b\x30\x60\x03\x06\x6c\xfd\x19\x30\x60\xfd\x67\xc0\x80\x3d\xde\xa1\x7d\x0e\xda\x0d\x18\xb0\xc1\x2b\xb3\xfe\x0c\x18\xb0\xa8\x67\xc0\x80\x7d\xf2\xd9\x3b\x11\x3d\x60\xc0\x3e\xe3\x19\x30\x60\x9f\xf9\x0c\x18\xb0\x01\x03\x36\x60\xc0\x06\x0c\x58\xc2\x33\x60\xc0\xb6\x1f\xde\x10\xfc\x89\x7f\x06\x0c\xd8\x80\x01\xdb\xf2\x19\x30\x60\x2b\xcf\x80\x01\x1b\x30\x60\x1f\x7b\x06\x0c\xd8\x80\x01\xb3\xcf\xe0\x6d\x5c\x7b\x06\x0c\xd8\x86\x67\xc0\x80\x6d\xd7\xce\x60\x06\xa4\xbd\xec\x49\xcc\x00\xa9\x78\x73\x4d\xe7\x09\x44\x83\xb9\x8e\xc1\xb5\xef\x89\x65\x21\x94\xb6\x7a\xab\x34\x1f\x3a\x3f\x16\x30\x94\xe9\x03\x11\xa2\x74\xba\x9b\x64\x4a\xb4\x89\xa0\x87\xd5\xa4\xdc\x26\x17\x33\x08\x20\x07\x24\x69\xfa\x54\x58\xb1\xa6\xdb\x09\xea\x04\xf4\xd5\x67\x77\xbb\x51\xa6\x6d\x97\xf8\x1e\x04\xf3\x51\x60\x66\x4a\x6d\xda\xba\xcb\xfa\x7a\x9f\xf0\x52\xba\xd2\x04\x8c\xb3\xb1\x61\xff\x3c\xd6\x1d\x3e\xe6\xf2\x38\xc1\x1b\x9c\x48\x7a\x66\x30\x72\x13\xc1\xa7\xe9\xc4\x67\xf0\x16\x09\x15\x39\xbf\x52\xda\xb3\x14\xf4\xce\xce\x90\x3b\x7b\x82\x7c\xca\x80\xd6\xc9\x79\x87\xef\x29\x4a\x67\x3f\x11\x3a\xfb\x88\xce\xd9\x05\x32\x67\xe7\xa8\x9c\x3c\xe1\xde\x0c\xa1\xde\x4c\x9a\xd2\x13\x84\x4d\x2c\xc0\xfb\x66\x21\x88\x5c\xf0\x2a\x5a\xe0\xe4\x12\x36\xef\x29\xa3\x75\x5b\x03\xdd\xbe\x96\x29\xf4\xce\x83\xd0\xa5\x13\x19\x16\x9b\x6e\x22\xe1\xc0\xcb\x5f\x12\xa8\x77\x8c\x69\xa5\xb7\x16\x90\x58\x2e\xf0\x1d\x28\x4b\x6d\x51\x10\x52\xa6\xa8\x4b\xa1\x17\xf5\xf7\xc7\xbe\x87\x86\x8c\x9c\x4a\xf4\x2a\xed\xaa\x49\xd3\xc7\x03\x37\xd3\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\x78\xec\xee\x66\x4e\x77\x7f\x24\xb9\x3e\x72\x28\x06\xa9\xd6\x7d\x5f\x07\xd5\x06\x78\x3f\x34\x37\x87\x55\x24\xe2\x8e\x16\xe4\xf8\x19\x0c\xe8\x5c\x46\x69\xfa\x41\x40\xe0\xbe\x86\x81\xef\x8b\xda\x75\x6d\xba\xe3\x3d\xdf\x81\xef\xc4\xf6\x14\xc0\x8c\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\x7c\x8a\xc2\x9c\xaa\x45\x3b\x3d\x2e\x78\x7d\xa2\x45\x87\xf9\xcf\xb4\xe2\xd3\x93\x1a\x4b\x45\xc4\x49\xc9\x0b\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xb8\x36\x3d\xe8\x11\xe3\x75\x4a\xb4\xdc\xe7\x62\xc5\x8a\xd5\x93\x92\xbe\x49\x93\xef\xef\xd4\xea\x09\x89\x70\xd9\x9d\x40\x65\x07\xa9\x8d\x32\x38\xaa\x73\x0a\x95\xfd\x80\xc3\x3e\x19\x14\x36\xcb\x59\xcd\x04\x81\xdd\x23\xf8\xeb\xde\xd8\x42\xfb\x02\x79\xdd\xc3\x9a\xfb\x19\x60\xae\x39\x20\xae\xf9\xe0\xad\xfb\x5a\x9a\xfe\xc9\x20\xad\x5f\x04\x9c\x35\x63\xdc\x26\x13\x8c\xf5\x39\x20\xac\xfb\xeb\x83\x41\x19\x60\xab\xcf\x07\x59\xcd\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x88\xea\x73\xc4\xa5\x9f\x2c\x26\x9d\x21\x1e\x9d\x33\x16\x9d\x2d\x0e\xfd\x64\x50\xd4\x74\x18\x6a\x56\x9f\xc2\xb3\xc0\x4f\x73\x42\x4f\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x00\x8a\xb9\x56\xe2\x72\x0d\xc4\x68\xdc\xd6\xfd\x78\xfb\x02\x4b\xe4\xaa\x20\x59\xea\x11\x17\x84\xb6\x2a\x30\xc4\x8f\xcd\xf8\xa2\x8b\x91\xa1\xed\xb9\x28\xee\xb9\xb8\xad\x38\x2e\xe5\x49\xc3\xcd\x7f\x3a\x26\x8a\x80\x82\x22\x49\x4d\xdf\x0f\xf7\xb8\xe1\xfb\xd8\x93\x5d\xf3\x96\xdf\x23\x3e\x53\x84\xa1\x43\xca\xdc\xce\x39\x0a\xbc\x34\x5d\x78\x24\x39\xde\xa1\xdf\xfa\xea\xa5\x6b\xe4\xeb\x8b\x7b\x40\x64\x48\xca\xbd\x8e\x7c\xd9\x3e\x7e\x3a\xf4\x65\xbf\x38\x6b\xab\x7e\xf8\xcb\x84\xc4\xf2\xc4\xbe\x5e\x1d\xa3\xf7\x56\x9d\x78\x05\xfd\xf1\xa2\x08\xb3\x12\x59\xde\xa8\xaf\x6f\x9f\x24\x43\xb0\xfb\xc6\x8d\xc7\x4c\xf7\xf1\x2c\xe6\x06\xd6\x5a\x26\x47\x58\x7f\x0b\x14\xd0\xc1\xe9\xba\x37\x4e\xd7\x1d\x21\x83\xbf\x3e\x6b\xeb\xf9\x91\xc0\x83\xb5\xf5\xef\x62\x6d\x05\x74\x6d\x6f\x04\x2e\xc8\x64\x9f\x94\x37\x27\x40\xba\x04\xb5\x4e\x87\xf3\xe2\x82\x11\x62\x12\x9a\x3a\x32\x3e\xe0\x9d\x9b\xb5\x55\xb5\x34\x3e\xc4\x1e\x33\x63\xfc\xd6\xba\x59\x90\x35\x4a\x3b\x08\xa5\x6e\xe8\x5d\x67\x9b\x34\x82\x5b\x8d\x44\xb4\x8c\x69\x15\xc3\x1e\x27\xdd\x79\x6d\x8b\x48\xc2\xe2\xdd\xe9\xb8\x47\xb8\x67\xc1\xd1\x00\xf4\x5c\x10\xd4\xe5\xd5\xf4\x3b\xa2\x5b\x9d\x71\x51\xd0\x69\xb5\x44\x0b\x5c\x69\x63\xc9\x82\x87\x6f\x69\x55\xd9\xd7\x24\x80\x95\x89\x32\xa1\x67\xa3\xd1\x54\x9c\xcd\x61\x32\xb0\xe9\x08\x79\x68\x48\xa1\xdb\x2c\x2a\x82\x59\xdb\x98\x7e\x6a\xfd\x68\xc9\x5b\xe1\xfa\x99\x84\xd6\x0e\x5a\xa7\x12\x31\x5a\x8d\xdc\x94\xf7\xa9\x19\xd7\xf7\x7c\xe7\x52\x96\xa4\xb4\xac\x8a\xf7\x54\x92\x11\xbc\x33\xba\x4f\xa6\x2f\xfc\x8e\x08\x41\x4b\x62\xf6\x8d\xf9\xac\x11\xfc\x8e\x96\x1d\x76\x5c\x6f\x0b\xc0\x6d\x47\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\x39\x06\xf5\xd8\x0a\x34\x83\xe8\x34\xed\x1b\xfc\x20\x2b\x69\x81\x15\x91\x80\x95\xef\x51\xae\xde\x51\x1c\xdd\x13\x3d\x9e\x60\x47\xa1\x43\xc6\x11\x87\x8c\xb7\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\xec\x28\xe5\x60\x1a\x98\x03\x46\x53\xa2\x70\x97\xb4\xe6\x54\x32\x89\x08\xc3\xd3\x4a\x9f\x3d\xc0\x90\xdf\x6c\xdc\x00\x68\x46\xb0\x6a\x05\x41\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x37\x43\x2d\x93\x24\x51\x91\xcd\x66\x02\x44\x66\x62\xea\x13\xcd\x5b\xb5\x27\xf7\xc8\x63\xae\x23\x93\x51\x12\x18\x89\xb4\x26\x12\xf1\x36\xc1\x93\xd7\x33\xff\x6c\x73\x39\x2d\xbc\xc1\xef\xb4\xf1\x89\x0d\x9b\xe6\xd8\x61\x97\x81\x56\xbe\x21\x0f\xa5\x03\x5e\x99\x1c\xdf\xd7\x97\xd7\xbf\xbc\x3b\xfd\xef\xf3\x77\x71\x5b\x00\x64\x1d\x0b\x75\xe7\x96\xd1\x7f\xb6\x04\xe1\x9a\xb3\x39\xc2\x55\x98\x02\x33\x02\x47\x67\xf0\x01\x48\xc5\xbc\xc9\x32\x91\x7a\xad\xbe\x04\xa2\x04\xc3\x1a\x1c\xf3\x39\x32\x82\x62\x51\x20\x09\xe8\x8f\x3e\x12\xc6\x8d\x01\xf0\xa7\x3d\xf2\x06\x46\x94\x3e\xe3\xc6\x20\xa4\x0c\x61\x24\x29\x9b\x57\xc9\xb6\x60\xb2\x47\x24\xd5\x1f\x32\xee\x46\x30\x89\x75\x8b\xa4\x3b\x45\x7a\x7d\x88\xb7\x2a\xf3\x39\x04\xba\xcb\xcc\xb9\x00\xc8\x43\xc3\x25\x71\x2e\x00\xa3\xe3\x5e\x4c\x10\x2e\x4b\x91\xa4\x47\x5b\x61\xe3\x6d\x74\x43\x10\x60\x9a\x35\xa1\xdf\x11\x7a\x89\xfe\x0b\x3d\xa0\xff\x02\x87\xc0\x1f\xe3\x9b\xca\x63\x6e\xe7\x40\x34\x2f\xb8\x54\x17\x93\x4c\x0b\xfd\xd7\x05\x56\xf0\x46\xbd\x1e\x8a\xa3\x29\xb5\x96\x19\x79\x50\x44\x68\x8d\xd8\xae\x61\xea\xcc\x25\x39\x17\x74\x07\xbf\x94\xdd\x9d\x1a\x67\xbd\x98\xf5\x81\xd0\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x96\x8b\xb0\x1f\x35\x56\xc5\xa2\x2f\xee\x53\x5a\x7d\xaf\xf7\x5e\x70\xfd\x97\x1c\x2e\x4a\x93\xce\xb6\xa0\x09\xc2\x61\x7f\x4e\x6c\x1a\x64\x2e\xdf\xd6\xfd\xd8\xd6\x5a\x71\x6f\x82\x1a\x66\xf5\xb6\xa0\x72\x44\xc3\xcb\x63\x74\x8e\x8b\x45\x42\x2f\xf4\x6c\x94\x81\x32\xd0\xf0\xd2\x74\x63\x81\xef\xf4\x1e\xb7\xad\x02\x7c\xcf\xa8\xae\x3e\x50\x06\x07\x4e\x4b\xac\x02\x33\x34\x4d\xc1\x8f\x09\x32\x23\x42\x98\x94\xc9\xe9\xd2\x65\x5e\x24\xef\xb6\x24\x29\xd7\x08\xae\x78\xc1\xa3\x99\x0d\x72\x6e\x95\x89\xed\x0b\xcc\x3d\x84\xad\x7c\xa0\xf0\x87\xd7\x93\x11\xba\x39\x9b\x8c\x10\x17\xe8\xfa\x2c\x0d\x07\x12\x5a\xa3\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x3a\xc7\xcd\xd9\x24\xe2\x25\xeb\x48\xc2\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x40\xb6\xf0\xf9\xcf\x40\xb6\x30\x90\x2d\x0c\x64\x0b\x03\xd9\xc2\x40\xb6\xb0\xbf\x40\xff\x81\x6c\xe1\x93\xcf\x40\xb6\xf0\xe8\x33\x90\x2d\x6c\xf5\x0c\x64\x0b\xeb\xcf\x40\xb6\xf0\x91\x67\x20\x5b\xf0\xcf\x40\xb6\x30\x90\x2d\x7c\xb9\x52\x7b\x20\x5b\x58\x7d\x06\xb2\x85\x81\x6c\x61\x20\x5b\x08\x9f\x81\x6c\xe1\x91\x67\x20\x5b\x18\xc8\x16\x06\xb2\x85\x8f\x3f\x03\xd9\x42\xf4\x33\x90\x2d\x6c\xf7\x0c\xe9\x3f\x5b\x3e\x03\xd9\xc2\x40\xb6\xb0\xfa\x0c\x64\x0b\x9f\x7c\xf6\xc3\x3d\x3e\x90\x2d\x0c\x64\x0b\x1f\x7d\x06\xb2\x85\x81\x6c\xe1\xa3\xcf\x40\xb6\x10\xf1\xec\x9d\xd3\x75\x20\x5b\x18\xc8\x16\x3e\xd6\xc6\x60\x6d\x6d\xf7\x0c\x64\x0b\x03\xd9\xc2\xda\x33\x90\x2d\xac\x3f\x03\xd9\xc2\x40\xb6\x30\x90\x2d\x0c\x64\x0b\xfe\x19\xc8\x16\xbe\x76\xbf\x93\x20\x92\xfe\x8b\x4c\x78\x45\x8b\x65\x72\x9e\xc9\x15\x91\xbc\x15\x85\xbe\xb1\xe1\xb5\xa8\x81\xf7\x7a\x8f\x42\x92\x92\xbd\x67\xc9\xfb\x57\xc1\xc4\x85\x49\xfc\xc2\xce\xc1\x53\x4c\xc1\x5e\x24\xf2\xbb\x01\x5e\xc6\x23\x08\xe0\x25\x0a\x0b\x65\xa6\x2f\xce\x59\x9a\x6c\xb5\x87\x03\xd9\x87\x44\xc2\x90\x7b\xc4\xef\x22\xc5\xbd\xb0\xa5\x8f\x6e\x2e\xdc\x34\x15\x4d\x49\xc9\x44\xe8\xba\x05\xed\x82\xd8\x10\xb8\xfc\x0e\x15\x4d\x3b\x42\x35\xa9\xb9\x48\x48\x8c\xc8\x60\xc1\xf5\xb6\xca\x3e\xac\xd3\x95\xe9\x90\x9b\x7c\xc5\x61\xfe\x97\xc6\x5e\xe8\x08\x62\xfc\x5a\x51\x27\x0e\x93\xb0\x66\xeb\x65\xab\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x30\x9d\x5b\x26\x72\xc1\xbb\x0b\xed\xb3\x73\x27\xd1\xf9\x86\x4f\x21\xfe\x29\x1b\xfd\x12\x3f\xa6\xa8\x0e\xe1\x4a\x10\x5c\x2e\xa1\x1b\x05\xe0\xf5\x3a\xff\xdf\x17\x98\xb6\x59\x54\x98\xc6\x83\xfc\x72\x1d\xe9\x33\xe8\x05\xd2\xfb\xb5\x03\xbf\x43\x1e\x99\x5f\xac\x91\x87\x78\x53\x73\xc6\x8f\xdd\xaf\xcc\x1f\x8f\x12\x2c\x3d\xac\x60\x77\x81\x11\x03\xa6\x2c\x95\xa1\x9a\x90\x66\xdc\x19\x93\xae\x24\x0d\xd1\xda\xbb\x71\x76\xc6\xeb\xe8\x4b\x86\x6b\x5a\xb8\x53\x71\x6a\x36\x21\xe5\x6c\xc5\x02\xcc\xd1\x65\x6d\x98\xd6\x75\xab\xf0\xb4\x22\xc7\xe8\x42\x6d\x2c\x95\x9f\x96\xb3\x8c\xb2\x60\x55\x13\x71\xaa\x1b\x15\x68\xd8\x54\x86\x79\x81\x30\x2d\x7e\x38\x23\x88\x30\x25\x96\x7a\xff\x4d\x78\x79\xad\xb7\x60\xef\xdb\xc9\x84\x0c\x89\xf0\xd4\x1c\xd0\xd4\x44\x58\x6a\x1e\x30\x69\x3a\x90\x34\x2f\x88\xb4\x73\xf7\x1b\x3e\x99\x30\x3b\xa7\xb7\x2d\xf4\x15\xb0\x41\x34\x21\x3e\x4b\xec\x81\x6e\x71\xc2\x4b\xad\xe0\x08\x62\xe4\x93\x3f\xa3\xc6\xd9\x77\xa1\x3b\x77\x0b\xde\x39\xac\x3a\xcd\x07\xdf\x61\x5a\xe9\x03\x9c\xd8\x01\x9f\xdd\x9c\x29\x4a\x93\x29\xae\x60\x81\xf4\xfb\xb4\x59\x6c\x0a\x56\x2f\x8b\xab\x58\x70\x49\x18\xc8\x4b\xec\xb3\x6d\x7c\x2e\x80\x15\x31\xa5\xb9\x8b\x53\x11\xbf\x17\x33\x44\xea\x46\x2d\x47\x88\xdc\x11\xb1\x54\x0b\x40\x06\x08\x6e\xd0\x22\xd0\x84\xee\x5b\x8d\xcb\x60\x77\x8c\x10\x77\xce\xe2\xc4\xe6\xe1\x7e\xb0\xf6\x53\x5b\x29\x63\x4d\x81\xfe\x9d\x94\x0e\x6a\x9e\x0c\xbb\x26\x37\xe9\x09\x4a\x15\x9a\x39\x49\x4b\xf4\x53\xd1\x9a\xc6\x51\x41\xa2\x8c\x67\xe1\x1d\xf4\x22\x48\xf3\xd0\x5b\xa2\xc6\x0f\xe0\x4a\xc4\x35\x6f\x19\x6c\x8d\x82\xd7\x4d\xab\x02\x95\xdc\x69\xf7\xcf\xe6\x63\x2c\x38\x9b\xd1\xb9\x8d\x82\x9d\xd4\x98\xe1\x39\x19\xfb\xee\x8c\x3b\xf5\xe6\x64\x77\xe8\x0c\x5c\x3a\x1a\x89\x49\x8e\x9c\x62\xac\x14\x11\xec\x3b\xf4\x3f\x87\x7f\xff\xdd\xaf\xe3\xa3\x3f\x1f\x1e\xfe\xf4\x72\xfc\x9f\x3f\xff\xee\xf0\xef\xc7\xf0\x8f\xff\x38\xfa\xf3\xd1\xaf\xee\x87\xdf\x1d\x1d\x1d\x1e\xfe\xf4\x97\xf7\x6f\x6e\x26\xe7\x3f\xd3\xa3\x5f\x7f\x62\x6d\x7d\x6b\x7e\xfa\xf5\xf0\x27\x72\xfe\xf3\x67\xbe\xe4\xe8\xe8\xcf\xbf\x8d\x8f\x14\xa6\x86\xc5\xf3\x05\xc5\x33\x85\xc4\x9f\x24\x20\x6e\x65\xec\xce\x0f\xbf\xbd\x02\xd7\x8e\xbf\x8d\x24\x7c\xec\xf8\x8b\x64\xff\xc9\xc5\xac\x6b\x9f\x4a\xc4\x6b\xaa\x94\xf5\x16\xe0\x90\xa7\x66\xc5\x77\x63\x05\x16\x9d\x19\x05\x8a\xca\x90\x2f\xa5\x73\xf9\x44\x77\xcb\xdf\xaf\xe0\xad\x62\x88\xd6\x4d\x45\x6a\xc2\x14\x08\x9e\xb1\xb3\x6d\xc1\xf5\x77\xdc\x8d\xa0\xc0\x8c\x71\x85\xc8\x43\x41\x48\x69\x3b\x39\xc8\xc6\xe0\x19\x64\xe3\x20\x1b\x3f\xf5\x24\xfb\xaf\x33\x39\x32\x43\x9f\xf5\x5a\x34\x4a\xcb\x05\x73\xc4\x9c\xfa\x0c\x5f\xf7\x1c\x07\x7c\x86\x48\x2c\x97\x65\xd7\x88\xa5\xc7\xc4\xb1\xde\x4a\x04\xf9\xe1\x56\x2a\x49\x87\x95\x31\xb6\x28\x67\xfb\xc1\x85\xde\x5b\xee\xab\xb6\xda\xa5\xf3\x3a\x60\x16\xd7\xba\x3d\x78\x34\x75\x8f\x1c\xa8\x7b\x41\x8a\x5b\xe3\x42\x2e\x89\x01\x59\x10\x73\x07\xc5\x69\x00\x01\x4d\xfe\x82\xb7\x55\xa9\xdb\xb0\xd3\x41\xcc\x02\x3d\x50\x75\xfc\xd1\x35\x8c\x6a\xf7\x2b\xa5\x87\xb7\x67\x56\xef\xa1\x40\x97\x59\xf0\xfb\x50\x95\x80\x39\xd5\x0a\xc3\x02\xb3\x32\x1a\x7f\xbf\x07\x61\x65\x0c\x98\xf4\x1d\x85\x82\x4d\xe3\xfb\x10\x5c\xbc\xf6\x50\x7d\x2d\x87\xb1\x05\xea\xe3\x5b\xc2\xf4\x01\x5a\x5f\xf8\x99\xa7\x74\xa0\x02\x34\xba\x14\xa6\x02\x00\x55\x62\x45\xa5\xd6\x36\x0d\xd4\x0d\x3c\x2a\x0d\x97\x92\x4e\x2b\xd2\xc1\x70\x5e\xd8\xcd\xf9\x42\x0b\x0f\x77\x5b\xa4\x51\x2c\x66\xf0\xed\x65\x50\x00\xf4\xac\x9e\xf1\x32\x45\x8d\x5b\xf1\xe8\x7b\x21\x6c\x10\x9c\x50\xc2\xa3\x34\x32\x18\x04\xb0\x5e\xd7\xfe\xaa\x7e\x1d\xae\x7c\x7d\x26\xb1\xe2\xf1\x2a\x5d\x1e\x77\xbe\xeb\xc6\x7e\x79\x69\x7b\x9b\x42\x90\x0a\x8c\x1c\xb9\xa0\x0d\x9a\x12\x75\x4f\xc8\x4a\x52\x42\xb7\x6f\x0e\xe5\x91\x43\x29\x27\x76\xa2\x43\x2a\x18\xc4\xc7\x31\x9a\xf4\x8e\x39\xc4\xbc\xd3\x89\x46\x2e\xd8\x77\xab\x22\x0a\x98\x50\x9d\x98\x71\x22\x6c\xc3\x58\x21\x06\x98\x16\xb1\xf4\x83\x25\xa0\xfd\xac\x8d\x39\x79\x78\x97\x5c\xa5\x8d\x30\x79\x68\x5a\x8f\xb2\xde\xfc\x27\x19\x65\xa6\x60\x89\x85\x15\xed\xd1\x29\xec\x5f\xb5\x76\xee\xec\xd6\xf7\xc2\xb9\x17\x65\x0e\xc4\x77\xea\xce\x39\x55\xa8\xe6\x52\xa1\x6f\xbe\xfd\x16\x11\xe3\x8b\x31\x20\x93\x64\x17\x34\xca\xc6\xc0\x94\x85\x83\x29\x1f\xed\x22\xca\x46\xbd\x88\x3e\x12\xf9\x88\x23\x1b\xcb\x0c\x7c\x92\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\xa8\x08\x63\x8e\xb3\xd2\xe5\x21\x5e\xf7\x3b\x64\xd1\x30\xee\xe4\x98\xdf\x21\xde\x18\x6a\xe9\x47\x8b\xa7\x75\x56\x61\xcb\xc0\x19\x10\xb7\xcb\x2f\x66\x7a\x95\x4c\x62\x0a\x18\x8e\x80\xd5\x59\xed\xa2\x4b\x19\x31\xdd\xf9\x67\x4b\xef\x70\xa5\x45\x73\xf7\x17\x13\x48\x22\x08\xff\xe8\x0b\x84\x50\x81\xbc\x98\x08\x7a\x47\x2b\x32\x27\xe7\xb2\xc0\x46\x99\xd8\xb5\x1b\xfe\xf4\x91\x7e\xc1\x7e\x10\xbc\x92\xe8\x7e\x41\xd4\x82\x08\x84\x5d\xe2\x12\x40\x7c\xe6\x98\x32\x54\x73\x91\x02\x03\xb1\x8d\x4a\x93\x39\x45\x95\x44\x0d\x16\x7a\xed\x5d\x86\x94\x01\x1a\x4d\x39\xaf\x2c\x4b\x7c\xb5\xec\xfa\x45\xe3\xf1\x12\x10\x73\xe7\xbf\x30\x72\xff\x8b\xee\x85\x44\xb3\x0a\xcf\x7d\x62\x14\x5c\x31\xab\x9a\x5d\x72\xd2\xd6\xa3\x13\x0d\x14\xe8\xad\xbe\x51\xee\xf1\x52\x76\xe9\x6c\x5d\xdb\x34\x41\xb6\xbf\x3a\x82\x53\x8c\x25\xf2\x6d\x97\xd1\x2f\xfb\xe6\x08\xf8\x47\xce\x4e\x27\xbf\x5c\xff\xed\xfa\x97\xd3\xd7\xef\x2f\x2e\xa3\x5f\x76\xc9\x15\x31\x71\x94\xc0\xb5\x64\x1d\x4e\x76\x15\x3c\x54\xf7\x98\xcb\x63\x00\x49\x00\x97\x1a\x2b\xf9\x7d\x22\x92\x4c\xef\x29\x82\xe3\xfc\x18\xb8\x69\x4e\x45\xcd\xc5\x44\xf0\x19\xad\xa2\x75\xef\x5c\x27\x78\xa5\x3b\x0e\x53\x72\x6a\x3f\xee\xc4\xbd\xa1\xf7\x59\x87\x2e\x06\x82\x9a\x02\x89\x8c\x7e\x4d\x7c\x0c\xab\x97\x02\x68\x12\x12\x57\xba\x18\x7f\x88\x76\xba\x67\x76\x4e\x9e\xa0\xbb\x11\xf9\xe7\x39\x8c\xf4\x8a\x17\xb8\x82\xc2\x75\x69\x1b\x1f\x65\x36\x11\x56\xfb\x15\x24\x7b\x62\xb7\x9d\x51\xc5\x71\x69\xbc\xdb\x46\xf8\x97\xc4\x15\xb5\x70\xca\x0e\x40\xe4\x92\x3a\x72\x63\x12\xed\xa0\x3d\x97\x9d\xda\x08\xe2\x22\xa4\xab\xcd\x73\x53\xcb\x23\xa9\xc9\xf7\x7d\xc0\xa1\x1d\x65\x8f\x47\x21\xf5\xcc\xf9\x66\xec\x01\xa3\x33\xf0\x6c\x80\xc7\x51\x9b\xcc\xcb\xc6\xb8\x1a\xdf\xb9\x65\x48\xa8\x78\x95\xc9\x8c\x85\x97\xec\xc9\xee\x34\xf3\xe3\x77\xa4\xc9\x12\xba\xa5\x7a\x06\x67\x9d\x90\x76\xdb\xc6\xe9\x20\x26\x55\x28\x71\x3f\xfe\x08\xb5\x15\x9d\xfc\xcf\xe0\x26\xf2\x4b\x8c\xc6\xc1\xd1\x6a\x04\x19\xaf\x1f\xaf\x54\xcb\xfb\xaa\x65\x8a\xd6\xc4\x51\x4f\x8d\x57\x74\x22\x61\x7e\x7d\x20\x3d\xd1\x7b\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x2e\x80\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\xa8\x9b\x14\xf4\x07\x70\x2b\x65\x79\x52\x0a\xde\x98\x9b\xd8\x71\x42\xa4\xa7\x00\xf4\x73\x8f\x43\x8a\x7f\xeb\x13\xea\x75\x64\x2e\x30\x53\x1d\xe9\xc0\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x81\xec\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x6c\xe6\x67\x6e\x70\x41\xf2\x31\x9a\x7c\xb8\xbe\xf8\x3f\x2b\xe7\x26\x5e\xb5\x33\xcf\x7e\x73\x19\x6b\x79\x90\x6d\xdb\x5c\x91\x9a\xdf\x0d\x1b\xe7\xab\xdf\x38\xde\x41\xb4\x73\x22\xc6\xab\x36\x8c\xfd\x52\x16\x74\x0d\xd5\x49\xba\xce\xc4\x73\x16\xf5\xdf\x1a\xe4\xa4\x62\x41\x90\xfe\x0a\x53\x14\x57\xd5\x32\xf4\x91\x2a\x6e\x6a\x1c\x66\x29\xd4\x1d\xde\xae\x33\x5c\xc9\x2f\xf5\x8a\x4c\x71\xed\x34\x82\x17\xef\x79\xcb\xf2\x30\x3b\x26\xec\x38\xdf\x11\x54\x12\xc6\x95\xf5\xa6\x80\x2d\xc1\x67\xf0\x5b\x64\x00\xd2\x01\x69\x73\x4f\xcf\x49\x50\xb3\x6e\x02\xd5\xca\x23\x49\x9c\x1e\x6e\xec\x97\x56\x12\xb9\x59\xaf\xea\xf0\xd2\xb3\x04\x4c\x81\x20\xb8\x34\x90\x16\xac\x16\x86\x4d\xb4\xc6\xf2\x96\x94\xe6\x83\x44\x26\x25\xcf\x9a\x04\x19\x73\x6e\xa6\x6f\xf4\xe4\xba\x04\x59\x70\x08\x1b\xf8\x1d\x50\x2b\xa5\x98\x62\x3b\x3d\x0d\x09\x82\x5d\x2f\xc2\x07\x56\x2d\xaf\x38\x57\xdf\xfb\x62\xa9\xbb\x3e\x19\x7f\xb5\xe1\x88\xbe\x13\x13\xfc\xd2\x18\xba\x3c\x86\x8d\x03\x72\x31\x28\xf1\x9a\x2a\x16\xf5\x82\xfc\xbb\x4a\x45\xd1\xb2\x53\xf9\x46\xf0\x36\x5a\x87\xcb\x69\x6f\xbe\xb9\x78\x0d\x17\x5f\x6b\xc9\xf6\x98\x12\xcb\x86\x53\xa6\x9c\xc7\x2b\x63\xd0\xe6\x07\x4b\x6b\x18\x4a\xb6\x64\x06\x33\x84\xde\xe3\x25\xc2\x95\xe4\xde\xa5\xc6\x36\x05\x39\x5d\x04\x55\xff\x7a\xca\xd5\x62\x2d\x74\x8a\x59\x7c\x28\x67\xbd\xbd\x51\xc0\xd9\xd7\x41\x53\x28\x5b\x6b\x56\x41\x0a\x71\x23\x48\x41\x4a\xc2\x8a\x2f\xf5\x44\xec\x9a\x42\x0e\x4e\xd5\x25\x67\x5a\xbc\xee\xfa\x5c\x5d\x78\xff\xa4\x5d\x8d\xf0\x14\x81\x2b\xdb\x06\x11\x31\xd0\x2d\x82\x70\x6d\x65\x0a\x06\xf4\x62\x06\x51\x4f\xb3\xe9\xfe\xd2\x4e\x49\xa5\x17\x9b\x56\x95\xde\x81\xb4\xc4\xca\x00\x02\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x68\x3c\x7c\xb2\xe4\x44\xfa\xc2\xdc\x58\xa2\x1f\x2e\x5e\xa3\x97\xe8\x50\x8f\xcd\x60\xf7\x66\x98\x56\xc0\xe0\xe8\x50\xb3\xa1\x0d\x30\x83\xdc\x30\x9e\x82\x30\xba\xb0\x72\x04\x71\x61\xae\x96\x11\x62\x1c\xc9\xb6\x58\xb8\x39\xa0\x9c\x79\x8f\xb0\xa5\xf3\x4f\xca\x7a\x1d\xc4\x4e\xbe\xfb\xf0\x07\x49\xa2\xc1\xaa\x39\xaf\xc3\x1f\x9e\xf1\x3a\x0c\x4d\x44\x7d\xfc\xfb\x0b\x66\xce\x6a\x4d\x14\x2e\xb1\xc2\xf6\x9a\x74\x5f\x18\x76\xed\x70\x59\x26\x5c\x96\x92\xbc\xa3\xac\x7d\x30\x48\xb7\xbd\x08\x7b\x5c\x9f\x43\x8f\xe0\x78\xc1\x42\xf3\x20\x6e\xe7\x22\x14\x19\x92\x25\x2e\x7a\xc7\x68\xf4\x88\xd5\x0d\xb7\x84\x63\x1b\xd3\x86\x10\x66\x25\xaf\xd7\x3a\x09\x74\x68\xb1\x09\x82\xa8\x97\xfd\x31\x1c\x4c\xf7\xfc\x7b\x07\x84\x2a\x72\x47\xaa\x6c\xbe\xfd\x77\xfa\x6d\x7a\x72\xdc\xce\x85\xd7\xa3\x0a\x4f\x49\x65\x39\xd8\x0c\x89\x66\xc6\x13\x96\xc9\x07\x2e\x78\x46\x48\xcc\x15\x37\x48\x2e\xec\x27\x42\xbf\xfe\x8b\x98\x87\xac\xe0\x8b\x1b\x8b\x2e\xe9\xe6\x01\x7c\xa0\x5f\xc2\x3c\xb4\x09\x0a\x22\x5a\x9d\x07\xad\x6d\xf6\xe7\x01\xf4\xaf\x7d\x9f\x07\x49\x8a\x82\xd7\xcd\x9e\x20\x25\x6f\x0c\x0a\x5e\xf7\xe8\x73\x51\x91\xfd\x2f\xe3\x24\xb8\xb3\x2d\x83\x80\x95\xb9\x07\x5d\x2d\x84\xff\x1d\x5c\xe7\x20\xed\x56\xef\x78\xdb\x7a\x32\x22\xd3\xb7\x68\x5f\xf8\xef\x78\xe3\x0d\x30\xcc\xde\xf3\xec\x30\xcc\x80\x9e\x15\x83\x7b\xbe\x07\x89\xfc\x1a\xc0\x98\xda\x08\x80\x79\x25\xac\xa4\x6c\x0e\x01\xab\x91\xcd\x1d\xbd\x23\x4e\x3c\xdf\x1a\x8f\xd7\x01\x48\x1c\xd7\x21\x27\x6e\x3a\xcc\xaa\xa1\x6d\xcd\x8a\xdd\xdc\x84\xd7\x34\xdf\xb9\xfc\x70\x13\x92\xb6\x62\xb6\x34\x84\x44\xf0\x27\x3b\xbf\x4e\xbf\x18\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xa1\x05\x87\xa2\x6c\x2e\x43\x27\x08\xae\x52\xd9\x5e\xcc\xb3\xc9\x0b\xe2\x4e\x81\xe7\x2d\x5d\xf7\x06\xf4\x8b\x5d\xa5\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x42\xcf\xa0\xa2\xb8\xba\x6e\x48\xb1\x2f\xb7\xc5\x9b\xf7\xd7\xa7\xfd\x9e\x81\x2e\x6c\x59\x9a\x09\xfc\x1e\xe1\xb2\xa6\x52\x42\xc0\x87\x4c\x17\x9c\xdf\x26\x35\x79\xe8\x98\xfb\xe6\x54\x2d\xda\xe9\x71\xc1\xeb\x80\xc4\x6f\x2c\xe9\x5c\x9e\x58\x89\x32\xd6\x13\x77\x84\x28\xab\x7c\xa6\x30\x78\x0b\x99\x92\x36\x82\x90\x3c\x78\x54\xf8\xd1\xc3\xd6\x83\xfc\x14\x0f\xcd\x5e\x9f\x1e\xa0\xd2\x86\xcd\xbb\x73\xad\x63\x7d\x57\xa5\x95\xa1\x59\xd9\x59\x8f\x8c\x3d\xa4\x85\xb6\x51\x9c\x8d\xf3\x68\x8c\xd7\x9d\x4f\x92\x55\xfa\x0b\x22\x93\x10\xb0\x39\xcf\xdc\xdb\xae\x4b\x1d\x69\x1a\x30\x77\xe2\x47\x33\xdd\x21\xbc\x7d\x00\xa5\x7c\xed\x9f\x1e\xe4\x62\x32\x3f\xad\x2a\xbd\x90\x58\x5f\x13\x07\x32\x44\x77\x82\x69\xb2\xc0\x77\x46\x14\x48\xbd\xe2\x64\x36\x23\x05\x18\x0b\xe1\x28\xe0\x22\x49\x13\x0a\x86\x81\x2c\x2c\x8f\xa2\xb8\x69\x1b\xa3\x9a\x3e\xe8\x1e\x86\x2d\x86\x18\x54\x56\x42\xe0\x7f\xf3\xaf\x13\x2a\x1b\x22\x00\x1f\x78\x82\xce\x91\x5e\xa1\xb0\x11\x97\x1c\xad\xf4\xb5\xa5\x7f\x71\x49\x94\x36\xd4\xcc\xbc\x85\xd1\x07\x6d\x58\x89\x36\xc3\x61\x48\x89\x0c\xa3\x30\x3a\x9c\x55\x52\x24\x9e\x07\x88\x14\xdb\x3e\x69\x1d\xc4\x29\x6f\xcf\x15\x39\x46\x1b\xd2\x77\x9e\x2d\x82\x8c\x3e\x3f\x8a\xfc\x84\xb1\x2a\xb4\x2f\xf1\xaa\x44\xa9\x6f\xcb\xfa\x43\xa1\xd1\x64\xc6\x13\x78\xcb\x16\x65\x9b\x22\xda\xdb\x31\xf1\x07\x79\x88\xd7\x44\x7b\x53\x75\xfe\x40\x0a\xbf\x45\x24\xdc\x63\x75\x0d\x1c\x63\x1c\x1a\x69\x95\x2f\x64\x9e\x7c\x6b\xed\x89\x4e\x6f\x47\xb8\x2f\x42\xf4\xcc\x4e\x38\x75\x6a\xb2\xf9\x51\x2b\xce\xfd\x45\x90\xce\xdb\x1e\x50\x89\xeb\x1f\xf5\xcd\x45\xd9\xdc\x92\x99\x70\xe1\x19\x7e\x93\xba\xe5\xfa\x01\x15\xec\x38\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x10\x0f\x6d\x52\x37\xbb\x01\x49\x5a\x37\xd5\x12\xc6\x70\x60\x8a\xd6\x25\x72\x9e\x39\x64\x9d\x2f\x0a\x23\x17\xa4\xaa\x46\x48\xea\x7b\x1a\x3b\x3e\x6e\xf3\xa9\xfe\x92\x12\x6d\x61\xec\xf9\xc3\x83\x5f\x0f\x46\x88\xa8\xe2\x08\xdd\x73\x76\xa0\x8c\x67\x16\xdd\x80\xb2\x9b\xd4\x27\xdf\x89\x25\x6f\xa1\xae\xba\x59\x36\x4f\xe1\x5e\x60\xad\xa7\xb5\x46\x99\x30\xec\x00\xa4\x4a\xa8\x13\xae\x9f\xf3\x07\xaa\xb4\xcc\x54\x2d\xd8\x53\x2f\x8d\x4a\x43\xa0\x28\x1c\xd6\xa6\xf7\x1d\x39\x59\x10\x5c\xa9\xc5\xd2\xab\x59\xa6\x64\xb5\x44\x2d\xb3\xbf\x49\x17\xf6\x7b\x90\xdf\xb6\xbf\x99\x66\xb6\x72\xfe\xcd\x42\x10\xb9\xe0\xd5\xce\xf3\xcd\x5c\x39\xe5\x82\x33\xa9\x65\x8a\xb6\x05\x6c\x1f\xa5\x4f\xf5\xb1\x25\x9d\x0d\x45\x34\x87\x53\x26\x88\x41\xad\xea\xad\x05\x05\xa0\x17\xf8\x4e\xcb\x1b\xd9\x16\x05\x21\x65\x8a\x0e\x15\x2a\x6f\xbf\xcf\x59\xf0\x79\xf7\xb5\x95\xf5\x33\x17\x4d\x9e\x5b\xfa\xcd\xd5\xe4\xac\x77\x4b\xc3\x07\x6f\xe1\x18\x9f\x2d\x48\x71\x7b\x95\x56\xe3\x68\x4f\x62\xa0\x0d\x17\xbb\x54\x0c\x74\xf3\xd9\xb4\x82\x09\x17\x0a\x31\x5f\x42\x5d\x9f\xad\x39\xac\x22\x11\x77\xb4\x20\xc7\xae\xbc\xba\x8b\x22\xba\x9a\x5c\x98\xcd\x09\x7a\xa5\x0f\xc4\x1f\xbf\xfd\xf6\xf7\xdf\xa6\xcb\xe8\x74\xee\xc5\x3c\xbc\x8b\x76\xe0\xfb\xa2\x76\x5d\x9b\xee\x6c\xf2\x8a\xd9\x9e\xea\x35\x68\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\xee\x13\x49\x08\xda\xe0\x57\xd5\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\xe2\xa4\xe4\x85\xbd\xd6\xc7\xc0\x50\x4a\xd9\xfc\xb8\x2e\x8f\x12\x8a\x6e\x22\x9b\x35\xb1\xa0\xd2\xb9\x71\x56\x02\x22\x2e\x4a\xe6\xcb\x41\x50\xe9\x43\x79\xd3\x25\x4c\xca\xce\x7d\x85\xc8\xf5\xf2\x3b\xf4\xe2\x45\xd4\x5b\xf4\x12\xbc\x21\x79\x52\x66\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\x08\x9f\xde\x5d\x26\xfb\x62\x90\xda\x29\x52\x7b\xc1\xd3\xaa\x30\xe6\x76\x10\x1b\x51\xa2\xb8\x56\x9f\x18\x29\xf4\x42\x8f\x7a\xf5\x9e\x1c\x60\xea\x62\x62\xca\x61\x68\x95\x0b\x4f\xab\x25\xba\xc7\x26\xf5\x3a\x8e\x85\xb6\x7b\x5e\xe8\x6e\xbc\xd0\x52\x4b\xef\xea\xb7\x04\x97\x44\x48\xb0\x86\x08\xde\x7d\xf0\x23\xe8\x53\xb6\x65\x3b\x6b\xa5\xe2\x35\x5a\xd8\xa1\x9a\x39\xec\xca\x5c\x1a\xdd\xc8\x1c\x41\x70\x06\x49\x24\x48\x63\xac\x25\xfb\x37\x5f\x85\x2d\xb4\x26\x85\xcc\x3c\x07\x05\x44\x30\x2a\xc2\xa9\xb2\x8a\x3e\x54\x9f\xa6\x56\x46\x81\x05\x90\x66\xa5\x67\x29\x44\x80\x32\x15\x23\x40\xe9\xb5\x85\xdd\x4b\xd2\xa3\x25\x79\xca\x1a\xa0\x2c\x95\x8a\x51\x76\x52\x75\x64\x63\x02\x76\x73\x19\xa4\x80\xee\x68\x2a\x7d\x1a\x72\x24\x0b\x0e\x79\x51\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\x21\xde\xaa\xa6\x55\xe0\x0a\x2a\xb0\x24\xe3\x3b\x2c\xa8\x16\xa8\xa6\x9e\xbb\x87\x6c\x30\x7d\xda\x15\xe7\xe0\x27\xf1\xd1\x31\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\xe3\xcc\xcf\xbc\xc2\x6b\x8b\x93\xbe\xa3\xd1\x5e\xfb\x60\x90\xa9\xac\xb7\xc8\x67\xd6\x61\xb5\x00\x08\x52\x01\x91\x44\x8b\x60\x03\xc1\xa9\xcd\x86\x3d\xc8\x10\xc8\x6a\xc5\x26\x8a\x04\x08\x0c\x72\xb1\x62\x07\xeb\x1e\xae\xcf\x61\xa6\xa0\xf8\xd3\x9b\xd5\x61\x55\xf6\x29\xd1\xba\xfd\xc5\xe9\xe5\xe9\x2f\xd7\x3f\x9e\xfd\x72\x79\xfa\xfe\x3c\xe5\xd5\xc9\x15\x15\x73\xd6\x54\xcc\x56\x55\xf1\x89\x6a\xce\xea\x47\x16\x0b\xb2\x3f\xf1\xf0\x6b\xe8\x4d\xc8\x9e\x64\x6d\x00\xca\xe6\x4e\xf3\x4f\xa3\xd3\x42\x2b\x4e\x53\x2d\x78\x76\x2a\x71\x28\xa3\x8a\xe2\xea\x35\xa9\xf0\xf2\x9a\x14\x9c\x95\x3b\x87\x91\x5e\x7a\x61\x23\x4d\x87\xac\xdb\xba\x0f\x3e\x58\x60\x89\x5c\x75\xc2\x29\x99\x71\x41\x20\x6a\xc2\xb4\x44\x6a\xba\xf8\xb1\x19\x9f\x7a\xc6\xb2\xe0\xf7\x5c\xdc\x56\x1c\x97\xf2\xa4\xe1\xe6\x3f\xe3\x8a\xce\x48\xb1\x2c\x2a\xf2\x1b\xdf\xff\x71\x92\x9a\xbe\x1f\xee\xf1\x86\x08\x0a\xd0\x85\x7d\xd8\x35\x6f\xf9\x3d\xe2\x33\x45\x18\x3a\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\x69\x9f\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x07\x44\x86\xa4\xdc\xeb\xc8\x97\xed\xe3\xa7\x43\x5f\xf6\x8b\xb3\xb6\xea\x87\xbf\x4c\x48\x2c\x4f\xec\xeb\xd5\xb1\x4f\xa8\x79\x05\xfd\xf1\xa2\x08\xb3\xd2\x61\x63\xbe\xbe\x7d\xa2\x8a\xe6\x9a\x17\xb7\x99\xdc\xae\x37\x67\x13\xf3\xb6\x15\x3c\x8b\xb9\x81\xb5\x96\xc9\x11\xd6\xdf\x02\x05\x74\x70\xba\xee\x8d\xd3\xf5\xa0\x2b\x35\xb5\xad\x03\xf5\x60\xb0\xb6\xba\xc7\x29\x3e\xa2\x5f\xaa\x61\xb0\xb6\x1e\x79\x06\x6b\x6b\x8b\xc7\xa0\xdd\x21\x73\xf4\x8d\xc0\x05\x99\xec\x93\xf2\xe6\x04\x08\x2a\x5b\x61\xeb\x5f\x79\x1d\xce\x8b\x0b\x46\x48\x69\xe4\x87\x1d\x0a\x41\x73\x3d\x92\x59\x5b\x55\x4b\xe3\x43\x34\x2a\x80\x05\xc5\xa4\x71\xdd\xc2\xab\xad\x8a\xeb\x82\xcc\x9b\x7a\xd7\xd9\x26\x8d\x67\x6d\x76\xe5\x0d\xec\x71\xd2\x9d\x87\xea\xcc\x84\xc5\xbb\xd3\x71\xb8\x82\x48\xd2\xb9\x9e\x2e\x5b\x4c\x16\x19\xb6\x1f\x57\x23\xac\xeb\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\xa5\x7b\xaa\x16\x08\xa3\x5b\x5a\x55\xf6\x35\xf1\x13\x75\xed\x4a\xc0\x1b\x8d\xa6\xe2\x6c\x0e\x93\x81\x2d\x78\xfc\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x33\xe0\xc7\x5d\xe0\xdb\xeb\x53\x8c\x5a\x9e\x04\x53\x61\xea\xa3\x7b\xbe\x9f\x05\x88\x3e\xa8\x05\x11\xf7\x54\x12\x53\xf1\x2a\xba\x4f\xa6\x2f\xfd\x7a\x57\xe6\x33\xcf\xf5\x60\x53\x9c\xf4\xb6\x80\x9c\xbb\xe8\xb6\x7e\x84\xf7\x3a\xd1\xca\x38\x1b\x33\x32\x37\x19\xe5\x56\xa0\x19\x44\xa7\x69\xdf\xe0\x07\x7d\x7e\xb2\x54\xbc\x41\xb4\xae\x49\xa9\xed\xe3\x6a\x89\xee\x28\x8e\xee\x09\x64\xaf\x77\x3b\x0a\x1d\x32\x8e\x78\xa3\xaf\xae\x96\x51\xb5\x84\x88\xde\xa2\x55\xa8\xe4\xf7\x2c\x21\x31\xe4\xc6\xc2\x1c\x30\x9a\x12\x85\xad\x0f\x5c\x1f\x02\x4f\xde\x0c\xbc\xcc\xfa\xec\x01\x86\xfc\x66\xe3\x06\xf0\x7c\xce\x73\xac\x12\xa4\xc4\x06\x6d\xde\xac\xe7\xc7\xb7\x1d\x95\x36\x5e\x97\x48\x18\xbb\x1f\x14\x6c\xfa\x44\xf3\x56\xed\xc9\x3d\xf2\x98\xeb\xc8\xe4\xe2\x07\x46\x22\xad\x89\x44\xbc\xcd\x44\x8c\xff\xca\x36\x97\xd3\xc2\x1b\xfc\x4e\x1b\x1f\xa9\x4a\x1a\x55\x1e\x35\xc7\x16\x7b\x84\x65\xdc\x26\x0c\x06\x44\x7b\xd3\x76\x36\x23\x02\x6e\x3a\xe8\xf0\x1a\xec\xde\x17\x1c\x72\x77\x58\x9c\xf3\xd6\x02\xbe\x88\x1a\x01\xc9\xb9\xcd\x7a\x7f\xa4\x49\xcb\x06\x08\xf5\x44\x05\x91\x40\x5a\xcd\xd0\xf9\x87\xef\xe3\xb6\x68\x0e\x0a\xf4\xb4\xdc\x3a\x18\xe7\x07\x16\x87\x49\xcc\xbb\x1f\x36\xd1\x53\xd8\x6d\x51\x54\x5c\xda\x3c\x4e\x58\x97\x62\x81\x19\x23\xce\x19\x45\x15\x78\xb2\xa7\x84\x30\xc4\x1b\x62\x40\x79\x51\x9d\xc1\x48\x52\x36\xaf\x08\xc2\x4a\xe1\x62\x71\xac\x7b\xc7\xdc\x5e\xe8\x12\x26\xed\x27\x52\x09\x82\x6b\xb3\x27\x04\xa9\x31\x35\xcd\x23\x5c\x08\x2e\x25\xaa\xdb\x4a\xd1\xc6\xbf\x2c\xce\x8b\x48\x20\x75\x5d\x9a\xfc\x39\xb7\x56\x90\x56\xd2\x65\x66\x8e\xba\x1e\xda\xe1\xf3\xb0\xaa\x0a\xb8\xce\x46\xfa\xb7\xa4\x6e\xd4\x12\xe9\xa9\xad\xa2\x73\x63\x66\x54\x48\x85\x8a\x8a\x12\xa6\xec\xc8\x0c\x37\x1a\xf4\x61\xe4\xd4\x69\x66\x67\x44\xda\x29\x61\x25\x18\xdf\x8d\x92\x08\x32\x10\x7d\x27\xdc\xab\x4a\x2a\xad\xaf\x43\x8e\xe2\xd6\xce\x95\xd0\x30\x1b\xc7\xcd\x08\x6c\x1d\xa7\xe0\x98\x1e\xd9\x8f\x82\x2e\x04\x05\x81\xf5\xb1\x36\x21\x91\x34\xb9\x02\x75\x2e\xdc\xb9\x1e\xf5\x92\xa3\x3b\xdb\x02\x52\x61\xd6\xa4\x0e\x6c\x28\x46\xee\xf4\x39\x20\x05\xd1\xaa\x28\xce\x28\x64\x9e\x5d\xc6\x28\x2c\xe6\x44\x9d\xb9\xf1\xc7\x66\xef\xe6\x90\x36\x61\xe5\xf4\xd0\x41\xd4\x2d\x0e\xac\xc3\x84\x97\xc0\x26\xd1\x31\x7e\x6c\x2a\xe7\x6e\xc6\x15\x69\x7b\xdd\x3c\x52\x23\xde\x59\x54\x26\xc3\xcb\x77\x54\x36\xb8\x20\x12\x1d\x5e\x4c\xce\x46\x68\x72\xf1\xda\xa6\x71\xf1\xd9\x2a\xbb\x5e\xec\xb4\xd8\x4b\xd0\x9c\xdd\xc7\x0a\xd8\xfb\xea\x34\x41\x97\x02\x9a\x2d\xdb\xdf\x89\x37\xca\xa2\x67\x66\xfd\x26\x00\x0b\x8d\xd6\x4d\x05\x75\x22\x91\x6c\xc1\x32\xb2\x81\x0b\xbd\xb5\x8d\x3d\x62\x0f\x2d\xe9\x08\x8e\x2c\x19\x7d\x64\x10\xc7\xb4\xe2\x87\x6b\xd7\x1c\x62\xd9\x6e\xa2\xac\x1e\x00\x0a\xb3\xb2\xbf\xf2\x1c\x31\x90\x6b\x66\xa1\xe2\xf1\xb7\x7b\xa4\x3b\x2c\x30\xa2\xde\x13\x29\xf1\x9c\x4c\x22\x71\x40\x39\xce\x5e\xe7\xe1\x06\x00\x51\x27\xaf\x17\xc4\x50\x61\x29\x1e\x7c\x12\x66\x57\x86\x5e\x9b\xda\x0c\x24\xaa\x07\xee\x6c\xdd\x0b\xaa\x14\x81\xeb\x01\x6a\x3d\xc1\xd6\x5d\xa5\xf7\xec\x67\x75\x46\xb5\x67\x27\x3d\x6c\x4f\xeb\xfd\xac\x34\xf9\x91\x53\x82\xa6\x82\x92\x19\x9a\x51\x48\xd8\x84\x54\xc6\x91\xa9\x53\x80\x01\x30\x8f\xa5\x24\x02\x86\x6d\xfd\x71\x6e\xf8\x71\xfd\xf9\xab\x1d\xbf\x12\x2d\x2b\x70\x50\xc4\x13\xd8\xc7\xe8\x0c\xcd\x21\x7d\xd2\x7a\x9f\xfe\xf0\xf2\x3f\xff\x88\xa6\x4b\x6d\x28\xc1\x99\x54\x5c\xe1\xca\x75\x00\x55\x84\xcd\xf5\x2a\x82\xae\x13\x77\x61\xf7\x18\xac\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x77\x1e\x28\x26\x27\x25\xb9\x3b\x09\xb6\xd0\xb8\xe2\xf3\xb8\xb7\x9e\x79\xc2\xa7\xb6\x29\x63\x01\x11\xb9\x4f\x34\xaf\x68\xb1\xdc\xd9\x7d\x6a\x5d\x61\x68\xc1\xef\x8d\x17\x75\xfd\xa8\x06\x64\x30\x0d\x6f\xda\x0a\x26\x0e\x7d\xef\x19\xfc\x5a\x49\x56\xc9\x91\x52\xbd\xf3\x81\xb4\x03\xf4\x82\x6d\x76\xe5\xaa\xb7\xb9\xc3\xae\x9b\xdc\x52\x53\xd8\x60\xb7\xaf\x54\x12\xed\x06\xff\x1e\x57\xd5\x14\x17\xb7\x37\xfc\x1d\x9f\xcb\x0f\xec\x5c\x08\x2e\xfa\x63\xae\xb0\x56\xa6\x17\x2d\xbb\x85\x3a\xbb\x1d\x5d\x2d\x9f\x5b\x30\x2f\x30\x4b\xf6\x27\x36\xaa\x33\x6e\x94\x86\x40\xd4\xd9\x02\xce\xf9\xdd\xb5\x4c\x1e\x68\xe7\xe1\x66\x88\xe8\x3e\xc7\x6b\x38\xe1\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\xb9\xfe\x72\x64\x2e\x00\x50\x7d\xb5\x8d\x53\xe3\xaa\x8a\xd5\x69\x42\x11\xf0\x7d\x74\xf9\xea\x3d\x38\xf2\x6a\x67\xa7\xfb\xb3\x7d\x35\x37\x37\x7f\x03\x4d\x8c\x2a\x49\xaa\xd9\xc8\xf0\xc1\x78\x7f\xf2\x01\x98\x35\x07\xf6\xca\x8b\xe7\x12\xda\xbd\xb7\xe4\x8e\x57\x6d\x4d\x5e\x93\x3b\x5a\xc4\x21\x07\x7a\xab\xd2\x7b\x9b\x8b\x8f\x55\x54\x82\x2e\x39\xad\x78\x71\x8b\x4a\xfb\xcb\x20\x47\x65\xb5\xee\x76\xfc\x2c\xc4\x66\xeb\x24\x64\xe9\x3c\x3a\xfe\x5e\x7e\x4e\x8d\x9b\x46\xeb\xd1\x40\xec\x25\xf0\x7d\x6f\x32\x40\x34\x01\x7f\x6a\xa2\xd1\x93\x8c\x62\x49\xc5\xb0\x8c\xed\x88\xf4\x35\x15\xfd\x8a\xe8\xa4\x9e\x74\x08\x4c\xd7\xfb\x78\x00\x41\x6f\x43\x74\x2f\x74\xa7\xa1\x81\x7f\x1b\xa2\x93\x35\x53\xdd\x57\x54\xf3\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\x1f\x37\xc8\x80\x42\x48\x4b\x4e\xea\xcd\x0b\xf3\xe8\x8f\x1a\x2b\x6b\x1f\x39\xef\x05\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xe2\xe6\xbb\x9a\x84\xf5\x54\x96\x1a\x37\xe3\x5b\xb2\x8c\xdc\x70\x89\xc7\xe5\xb1\xcc\x9a\x1a\x37\x91\xf7\x00\x14\xb7\x4d\xbf\x06\x22\x2f\xe7\x09\x2f\x6d\x3f\xe0\x7a\x30\x45\x8b\x3f\x65\xc6\xa2\xeb\x76\x0a\x67\x0a\xbe\xfe\xb4\xf4\x60\x59\x95\xa7\x5d\xdf\x55\x3f\x76\x2b\xde\xbf\xaa\xf4\x27\xfe\xae\x32\xdf\xfa\x9a\x6e\x28\x18\xdf\x97\x7a\x41\xf9\xce\x67\x92\xc3\x49\xd8\x44\xb8\xd6\xec\xce\xe8\xdf\x63\x3d\x4f\x98\x39\xd2\x81\xcd\x6c\x3d\x54\xc7\xa6\xde\x40\x42\x07\xf4\x51\xb4\x8d\xa2\x83\xef\x0e\x76\x7a\x39\x9a\x95\x11\xbc\xc1\x73\x30\x69\xf7\x61\x81\x56\xfb\x14\xd2\xdb\x2e\xf8\x7d\x28\x32\x1b\xfb\x2d\x2d\x31\x1d\x47\xfa\x82\x27\xad\x8e\xc1\xfa\xba\x1d\x61\xcd\x72\x53\x25\xe2\x1e\x2f\x11\x16\xbc\x65\x49\xc4\x05\x10\xca\xf4\xa1\xee\xf7\x2b\x83\xbd\xe4\x8c\x38\x58\x4d\x4a\x2b\x37\x3d\xd7\x37\x20\x8c\x28\x43\xaf\x8e\x5f\xbd\x4c\xee\xfb\x15\x29\x5a\x21\xe9\x1d\xb9\xb2\xe5\xd3\x83\x30\xe8\xc5\x6c\xc2\xa5\xa4\xd3\x0a\x52\x2d\x15\x47\xe7\xa6\xb6\xfc\xfa\x40\x3d\xd4\x0b\x46\xcc\x45\x48\x84\x9a\xd0\xc3\x43\x73\x82\x43\x88\xb6\x6e\x20\x01\xa7\xb5\x5f\x2a\x28\xac\xeb\x8a\x0a\x7a\xe9\x55\x50\x73\xef\xed\x74\xac\xae\xa6\xfe\x3e\x48\x92\xf7\x36\xa8\xd0\x15\xcd\xa7\xae\x28\x33\x7c\x74\x2f\xa8\xb2\x87\xfb\x9e\x4a\x82\x0e\xc1\x9d\xb1\xb2\x19\x93\xb8\x9f\x43\xe7\x57\x62\x71\xfd\x1c\xdc\xcd\x62\xf5\xe8\xee\xc3\x2a\xad\xcb\x93\x2e\x67\xe6\xde\x7a\xbe\xba\x15\xb4\xd2\xbf\xbb\x97\x17\x98\x95\x55\x92\xcc\xf0\xb3\x52\x2d\x93\xd8\xab\x2e\x66\x28\x14\x89\x16\x71\x10\x04\x21\x17\x58\x22\xc6\x51\x4d\x30\x40\xaa\xf5\xed\xe2\xa4\x60\x8f\x06\x3a\x5f\x1f\xcc\x66\x37\xd7\x58\x78\x21\x58\x71\xfd\x9a\x4a\x2b\x9e\xb5\x1c\xb1\xa6\x8b\x01\x62\xd5\xb8\x4c\x21\x63\x08\xe6\xb4\x5b\xbc\xe3\x0e\xe6\xbc\xda\x93\xee\xe2\x58\xe9\xcb\x53\xf4\x63\x64\xab\x9b\xeb\xe6\x4d\x64\x79\x83\x3f\xaf\x83\xb5\x25\xe1\x4f\xcc\xb3\x3a\x5c\x7f\x2d\xae\x8d\x75\x73\x8f\x7d\x87\x13\xfa\xf0\xe9\xa1\x8e\x02\x59\xe8\x50\xdd\x06\x04\x63\xcb\xab\xd8\x1c\xe5\x34\x92\x70\x17\xcd\xf0\x7e\xa2\x39\x61\x44\x60\x1b\x90\x70\xa0\x6e\x1b\xd2\xc7\x92\xb3\xd4\x03\xf1\x89\x0d\xa7\xe5\xfd\xa7\xd5\x14\xf3\x67\x09\x1d\x01\x3d\xe7\x90\x8b\x95\xd3\x6e\x43\x2d\x9b\x34\x96\x9c\xa3\x5e\x21\xd3\x33\x9b\x3f\x60\xe9\xd5\x8b\xf2\xcf\x96\xde\xe1\x8a\x18\x7a\x7c\x27\x1a\x76\xaa\x4c\xc8\x76\xba\xaf\x66\xa3\xb5\x0f\xc1\xec\xd8\x8c\x96\x78\xd4\x82\xcc\xa4\x4f\xbc\x78\x81\x0e\x4d\x1b\x07\x86\x16\x7b\xb7\x4a\xae\x5d\xab\xf3\x87\x26\xa1\x28\x6c\xbe\xf5\x3a\x7f\x68\x30\x00\x3c\x9a\xbd\x58\xb8\xff\x26\x0b\x7c\x47\x80\x85\x9c\x56\x58\x54\x90\x46\x72\x6d\xa6\x0c\x4d\x5b\x85\x08\xbb\xa3\x82\x33\x00\x55\x01\x5d\x94\x96\x4c\x82\xcc\x88\x20\xac\x20\x12\xfd\xf6\xf0\xc7\xd3\x2b\x48\x33\x3c\x02\xd3\x97\xb8\xf1\xb5\xd2\xa2\xa0\x7a\x63\x08\x5e\xb7\x8f\xfb\x0d\xb9\xb1\xeb\xed\x02\xfa\x89\x9b\x0b\x3d\xb6\xba\x55\x2d\xae\x80\xac\xbd\xa8\x5a\x7d\x17\xee\x6c\x67\xe7\x77\x9e\xa7\x78\xf2\x72\xfa\xce\x2d\x55\xff\x6b\x1a\x75\x5c\x73\x1c\xd4\xb3\x60\xbf\xae\x15\x0e\x48\x03\x50\xf6\x69\x63\xd7\x14\x9d\x03\xe9\xa9\x64\xc3\xcc\x39\x7b\x17\xc7\xe1\x3a\xe8\x7c\xa1\x2c\x5d\xc3\x0a\x0e\x33\x80\x35\xd7\xd1\x98\xb1\xdd\x02\x20\xf2\x1d\x83\x08\x47\x74\x9e\x5d\xbf\xe0\x52\x9d\x56\x14\xcb\x6d\xfd\xd8\x69\x5b\xfd\x6d\xd7\x2c\x64\xfb\x31\x5b\xd5\x11\x57\x1e\x62\xa0\x7b\x66\x60\x4e\x17\x13\x8b\x45\x77\xbb\x92\xb2\xff\x6b\xb2\x4e\x7d\x40\xc9\x64\x83\xc2\x9f\x6c\xd9\x13\x83\x38\x9a\xa1\xc8\x7a\x43\xb1\xf1\x9f\xa8\xc8\x4f\xaa\x78\xf1\xb3\x8e\x16\xbc\xb2\x79\xd7\x0e\xcd\x30\x25\xea\x9e\x10\x86\x2e\x26\x30\xe7\x7a\x2a\x0d\x2f\xe3\xe6\x99\xb7\xca\x31\x53\x62\x69\x0f\xf4\xd6\xbd\x09\xd6\x0c\x56\x61\xdb\xa3\x9b\x10\x7f\x8a\x8f\x3c\x8d\x11\xdd\xf6\x52\x49\x89\x14\xf9\x65\x48\xbe\x8d\xde\xfa\x05\x75\x6c\x3a\x78\xca\xef\x08\xac\x77\x59\x8a\xc8\x2c\xed\x9d\x85\x3f\xb3\x2b\x30\x49\x44\x96\xb4\x49\x5e\x9f\x6e\x1d\x1c\x94\x04\xca\x33\x83\x78\x82\x63\xf6\xec\xd0\xbe\x78\xca\xf6\x9c\xf7\xe2\x96\xc7\x2d\xdf\xad\x78\x31\x39\x7b\xce\x1b\xf1\x07\xeb\x5d\xd2\x4d\x1f\x48\x44\x9b\xa2\xcb\xeb\xd8\x76\xe9\xbb\x5c\x86\x80\xce\x2c\xc2\xd1\x1e\xeb\x5c\x5f\x74\x05\x1b\x9f\x5b\xa9\x40\xcc\xb4\xab\xaf\x34\x4b\x2b\x6e\x81\x23\xe0\xf9\x69\x78\x79\xbc\x3a\xd5\xf6\x2f\xe2\xa7\x1b\xe2\x7f\xc6\xe0\x0c\x4b\x55\x2e\x79\xeb\xac\x65\xa3\x5c\x2c\x81\xe9\x47\x42\x29\xac\x05\x01\x66\xcc\xb2\xad\x0c\x98\x18\xdf\xe3\xed\x81\xdc\xd0\xf0\x3f\x82\xd9\xfe\x47\xe7\xdd\xee\x8a\x0a\xc2\x17\x26\x5c\xa8\x7f\x18\xc7\x97\xd4\x17\x36\x24\x0e\x41\xe6\x0f\x35\xd5\xb7\x82\xe8\xd9\x3f\xbc\x6a\x0e\x7f\xb5\x6d\xc2\xa3\x56\x1f\x02\x57\xde\x67\xb6\xaf\x2d\x5c\x2b\x6f\x8c\xcb\x73\x63\x5f\xb6\x9d\xa1\xdd\xed\xff\xc9\xc5\xeb\x1d\x8a\x8f\x86\x96\x5f\xb6\xf8\xf8\x41\x6e\x5d\x7d\x20\xeb\x04\x42\x91\xd2\xbc\x33\x18\x03\x2d\xb7\x75\x49\xed\x5f\x03\x71\x18\x57\xa8\x11\x44\x12\xa6\x46\xfd\x70\x44\x3f\x2d\x13\xb4\x87\xfe\x28\x46\xfa\xe7\x59\x5b\x6d\x6b\x21\x71\x11\x30\x0f\x79\x9a\x26\xec\x49\x56\x20\x14\x83\xef\x30\xad\xc0\x3d\x17\xd0\xe8\xae\x75\xc0\x66\x8f\x6d\xd9\x83\x8a\xe3\x12\x42\x83\xe8\x56\x5f\xed\x15\xaa\xb9\x16\x9c\x26\x0d\xe4\xec\x74\xf2\xcb\xf5\xdf\xae\x7f\x79\xff\xe1\xf5\x0f\xef\xb6\x66\x1b\x33\x29\xf4\xa4\xdb\xe2\x23\x84\x11\x23\xf7\xd0\x73\x06\xc6\x69\x61\xe3\x01\x9e\x85\x52\xdf\x21\xd7\x36\x99\xd2\xc4\xc6\x0d\x34\x65\xd6\x56\xfa\x4b\x5b\xf6\xa0\xa6\x8a\xce\x31\xbc\xac\x73\x89\x4c\x05\xc1\xb7\xbc\x55\xe8\xae\xad\x18\x11\x78\x4a\x2b\xaa\x2d\x08\x44\xee\x08\x33\x78\x48\xfd\x07\xba\x93\x61\x31\x5f\xba\x6d\xe3\x61\xad\x67\x5b\x45\x52\x4f\xaa\x6e\x19\x17\xd6\xdd\x68\xd9\x34\xe1\x97\x8d\xa0\x77\xb4\x22\x73\xe2\x69\xea\x62\xd8\x92\xfb\x30\x1c\x5c\x35\x0b\x3c\xae\xc8\x1d\x31\x74\x57\x54\x9a\x1d\xb5\xe0\x8c\x0b\x13\x97\x33\xc4\xed\xd6\x16\x05\x02\x20\x73\x58\x5d\x69\x63\x93\xec\x7b\xed\xb2\x6e\x6d\xb2\xed\xb3\x09\xab\xed\x91\x2c\x69\xb2\xea\xda\x23\x01\xdc\x0a\x84\xd9\xe2\x93\xad\x41\xd5\x9b\xfd\x83\x9d\x7d\x0e\x6f\x77\x32\xc6\x1e\x16\x8c\x0c\x68\x77\xec\x2a\x4d\x01\x21\x4e\xcc\x9c\x6f\x6d\x9e\xb8\x2e\x7d\xb0\x14\x5c\xcf\xad\x63\x86\x6d\xf7\x4b\x48\xb9\x9a\xa2\x9e\x1d\x2c\x14\x1a\xe1\x64\x62\x89\x1a\x22\x80\x3d\x21\x64\x0b\x4b\x38\x48\xbc\x0f\x11\xd9\xd4\x26\x2b\x7d\xbe\x39\xc2\x50\x6c\x1e\x51\x25\xd1\xeb\xcb\x6b\x24\x48\xc1\x45\xb9\xb5\x0b\xe0\xaf\xe6\x5a\xd8\x10\x48\xc6\x40\x56\x66\xd2\xf8\x2c\xb3\xe1\xd6\xa6\xdf\xc5\x7a\xf5\x6b\x98\xd8\x8e\x71\x4d\xba\x2a\x42\xff\x70\xa3\xfc\x07\x0c\xf3\x1f\xb2\x9d\x96\xbc\xc6\x94\x6d\xad\x31\x8e\x21\x33\x70\xf2\xd1\xbd\xdf\x51\xd2\x6d\xff\xf6\x7f\x48\xa2\xdc\x26\x3a\x95\xdf\xff\x7f\xaf\x2f\xff\xd1\xf1\xbb\xd1\x4a\x5f\xf1\xe1\x75\x14\xd1\x40\xcf\x1e\xe8\x07\xea\xdd\x3b\xe3\xb7\x99\x67\xf9\xd4\xe3\xa7\x25\x6c\x1e\x3f\xd9\x7a\x5b\x3b\x71\x40\x19\xba\xfa\xfe\x0c\xbd\x7a\xf5\xcd\xef\x61\x49\x1c\xb6\x17\x2b\x54\x6b\xcd\xe0\x8f\x7f\x40\xc5\x02\x0b\x5c\xa8\x08\x00\xff\x95\x4b\xde\x83\xd2\x1e\xab\x47\x32\x24\x7f\xb3\xb9\x69\xe6\xce\x88\xf2\xed\x6e\x2d\x9e\x20\x9c\x31\x69\xab\xea\x9a\x14\x82\x6c\x9b\x82\x91\x26\x9e\x2e\x56\xda\x7e\xcc\xb9\x1e\x84\x50\xa1\x14\x97\xfd\x32\xeb\xea\xed\x04\xa4\x12\x5d\xb1\x84\xa6\xad\x2a\x83\xd1\x5a\xba\xdb\x06\x46\x2b\x83\xe4\x3f\x2a\x1d\x41\x49\x8c\xb2\xdb\xbb\x82\x24\xf1\x5d\x73\x27\xb0\xc1\x52\x76\x90\x98\x3b\x5a\xb6\xb8\x82\x6e\x41\x1c\xc9\xf2\x6f\x60\x63\x52\x5a\xd9\x5b\xdb\x11\x6c\xdb\x9d\x2d\xd9\xd9\x3a\x55\xea\xc4\xcc\xc9\x6f\xac\xd5\x4f\xd9\x7c\x0c\x9f\xe8\x6e\xda\xf1\x8c\x39\x1b\xe3\xf1\xb6\xe9\x4f\x5f\x54\xb0\xe1\x1d\x2f\x70\xf5\x01\xbc\xf3\x57\x6e\xb7\x39\x29\x20\x11\x61\xbc\x9d\x2f\x60\x7a\x45\x8d\x1d\xf9\x77\x45\x14\xb8\x4d\x6c\xea\x6e\x4c\x54\xc1\xef\xec\xd2\x86\x06\xc2\xba\xec\xfd\x9d\xfd\x8c\x01\x87\x94\x18\x40\x2c\x4e\x3a\x47\x30\xfa\x32\xd0\x2b\xed\xcc\x46\x22\x27\xfa\x3a\x3f\x01\xf5\xc3\xc1\xf9\x4c\x30\x66\x04\x88\x8f\xb2\x35\x32\x1b\x17\xb7\xf7\x58\x94\x12\x15\xbc\x6e\xb0\xa2\x60\x01\x2d\x63\xb1\x7e\x2e\x83\xcc\xde\x06\x5a\x2d\x39\x46\x17\x4c\x2a\x0c\x32\xd0\x11\x15\xe9\x15\xee\xc8\x05\x40\x79\x31\x3c\x8f\x0b\x22\x08\xc2\x22\x0e\x73\x89\x2b\xb8\xf1\x0a\x22\xf4\xde\xaf\x96\xe8\x5e\x70\x16\x49\xf2\xb1\xa5\x50\xd2\xea\xd2\x1d\x25\xf7\x27\xd6\x27\x3a\xd6\x83\x1b\x9b\x2d\x2c\x4f\xe0\x24\x9c\xfc\x06\xfe\xef\xcb\x89\x2e\xac\x38\xf9\x6b\xdc\xc4\x07\x6f\xbe\x82\x08\x3e\x65\xb4\x63\x2f\x7b\x56\x65\xe3\x9d\x55\x26\x6c\x85\x21\xfa\x2f\x23\xc7\x03\x9f\xc2\x94\x54\x9c\xcd\x83\xda\x4a\x11\x36\xce\x05\xa3\xaa\xe7\xa7\x00\x98\x17\x29\x5a\x03\x00\x40\x5c\x94\xc0\x5a\x47\x4d\x6a\x4d\xaf\x75\x28\x82\x1f\xf0\xe5\x61\xb6\x6d\x98\x92\xf6\x5a\x07\xc6\x15\xd9\xf9\xdd\x0c\xf1\x84\xab\x43\xa2\x38\x5a\x60\x5b\xb2\xdf\x92\xfa\x51\xe9\x90\xf8\x08\x17\xda\xc4\xda\xfe\xa8\x68\x55\x47\x79\xe2\x3f\x43\xa8\x63\x28\x8f\xc0\x34\xd1\x4a\x0e\x66\xab\xfd\x04\x47\xa1\xa8\x7b\xf4\x68\x56\x75\xdf\xb2\xf9\x96\xd1\x7f\xb6\x04\xe1\x9a\x6b\xbd\xaf\x4a\x49\xbb\x5d\x5d\xc9\x1a\x2f\xc1\x16\x85\x49\x7b\xe7\x98\x6c\x11\x86\x5a\x20\x72\x04\x90\x7d\x1a\x94\x7b\x1a\xa1\x77\xfd\xfa\x4f\x23\x3d\xce\x6b\x53\x7b\xc5\x7e\xb4\xbd\x05\x0d\x14\x69\xbc\x15\x05\xb1\x56\x45\x6d\x69\x7e\x36\x4c\xab\xde\x7b\xda\x24\x65\x06\x79\xa2\x97\x14\x52\x6e\x5b\x01\x3b\xcd\x04\x74\xb6\x5f\xe2\xe9\x12\xcd\xb4\x3a\x6b\x11\x8b\x0b\x3a\x5f\x10\xa9\x5c\xfc\xea\x04\x88\x69\x4c\xf2\x33\x2e\x16\xbe\xbb\x20\x7f\x03\x4a\xcb\x0e\xf2\x58\xe3\x87\xed\x69\x8a\xc0\xb7\x66\xb9\xcd\x8d\x89\x2d\xdb\xda\xdd\xfd\xab\x9b\x49\x1e\xa3\x77\xba\x57\xe6\x38\xe2\xa6\xa9\xa8\xd3\xca\x7b\x6b\xbc\xf5\x69\x03\x92\x53\x00\x83\xa2\x19\x96\x0b\xca\x59\xea\x2e\x2b\x0c\x44\xac\x68\x85\x56\x5e\xaa\x25\x58\xaf\x65\xa9\xf5\x43\x81\x04\xa9\xf9\xdd\xf6\xa8\xb1\x64\xd8\x59\x1a\xf3\xb3\x9e\xe4\x71\x60\x6f\x7c\x21\x46\xc4\xa9\xe7\xaf\xd5\xfb\xa5\x58\xb9\x2d\xcc\x06\xd4\xda\xbf\xab\xb2\x2d\x5a\xd6\x25\xab\x47\xdc\x1c\x3b\x02\x08\x45\xa4\x94\xa7\x98\x07\x58\xcc\x77\xc6\xf2\x70\x2a\xe6\xad\x11\x97\xf6\x7e\x07\xa4\x4a\xc3\x69\xbc\x95\xb0\x06\x0c\x3d\x90\xe8\xec\xfd\xeb\x90\x54\x5f\xd9\x1a\x01\x26\x14\x66\x4a\x2e\xc4\x35\xf7\x63\x5e\x48\x39\xa8\x18\x1e\xa7\x1e\xd5\xa3\xc2\x4b\x16\x2d\xe6\xab\x3b\xe7\x8c\xf7\x1d\x74\x4e\x1a\xca\x9a\x56\x59\xe5\x3b\xa8\x9d\x5c\x2c\x30\x9b\x6b\x6d\xe7\x35\x6f\xf5\xc0\x7e\xfb\x5b\x18\x84\x20\x65\x5b\x44\xa6\x03\x1a\x67\xbf\x39\xb9\xbf\x75\x89\x39\xb6\x48\x3b\x5c\x4a\xb2\xc0\x8d\x9b\x9a\x70\xf6\xe4\x92\x29\xfc\xf0\x1d\xa2\xc7\xe4\x18\xbd\xf8\x6d\xf0\xab\x17\xd0\xe3\xa8\xde\x34\x82\xeb\xa1\x58\xa2\x6b\x18\x7d\x45\x15\x10\x82\xbc\x08\x5b\x38\x46\xe7\xba\x5f\x90\xe7\xea\xd7\x36\xe0\x2e\x9e\x76\x2b\x3b\x42\x82\xcc\xb1\x28\x2b\x12\xc9\x15\xc9\x67\x3e\x25\xd3\xb8\xa6\xed\xae\x22\x0f\x54\x2a\x69\xa3\xb6\xc7\x79\xc0\xca\x9f\x7b\x77\x28\x2c\x6f\xf5\x4d\xa1\x85\xdf\xb8\xc4\x0a\x8f\x03\xa9\x7b\x62\xbc\xb4\xe3\x82\xd7\x35\x66\xe5\x18\xdb\x73\xdc\x5d\x2a\x27\xbf\xb1\x25\x6e\xc6\xd8\x7f\x8b\xb2\x31\x1e\xcb\x05\x89\x5a\xb9\x01\x29\x08\x8f\x9d\xcb\x5d\x09\xec\x73\x2f\x9f\xcd\x52\x1c\xa3\x4b\xae\x3a\x73\xca\xdf\xb6\xb0\xca\x39\x45\xf8\xf9\xe5\xcd\xd5\xdf\x26\x1f\x2e\x2e\x6f\x06\x49\x3e\x48\x72\x78\x06\x49\x3e\x48\xf2\x88\x86\xf7\x45\x92\x13\x76\xb7\x2b\x29\xee\x1c\x6f\x9b\xb2\x23\x6d\x40\x4f\xad\xa5\x59\xed\x3c\xc1\x6a\xd7\x24\x69\xe7\xec\xee\x47\xac\x4d\x7e\x0b\x9f\xb3\x19\x2c\x1b\x12\x4c\xed\x17\x8c\x3b\xe2\xec\x8b\x67\x49\xdb\x21\xc7\x59\x46\x8e\x9f\xa4\xbc\xe7\x30\x8e\xb5\x69\xc9\x53\x72\x76\xdf\xe3\xa5\xf1\x02\x9b\x43\x89\xd9\x12\x35\x82\x32\x05\x5b\xe9\xf4\xfa\xec\xe2\x22\x40\x3a\x20\xf2\x50\x90\x46\xa1\x83\xff\x67\xb7\x14\x67\xe0\xe8\xdb\x87\x95\xd9\x46\x71\x4b\x68\xa6\x53\xf9\x1a\x41\xee\x28\x6f\x65\xb5\xf4\x58\x95\xcd\x72\x74\x9d\x09\x2f\x91\xe0\xc3\xe0\x18\x69\xb1\x79\x0b\xca\x15\xa5\x73\x93\x02\x99\xd0\xfc\x8e\x55\x4f\xdb\x89\x1c\x0a\x68\x42\xfb\x1b\x54\xd7\xcf\x57\x43\x13\xda\x8d\x52\x60\x1f\x53\x46\x13\xfa\xd1\x57\x63\x13\x5e\xd4\x67\x40\xd8\xbd\x24\xfb\x5e\xf0\x3a\x93\x34\xbb\x36\xc1\x15\x07\xdc\xdc\x74\x54\x0f\x1c\xfa\x2f\x54\x8f\xac\x49\xdb\x55\xaa\xd5\x86\x35\x00\x0d\x12\x67\x27\xa9\x92\x7d\x9e\x62\xf2\xc8\xe6\xef\xbf\xc7\xcd\x5f\xc8\xf2\x8a\x24\xd6\xe4\xee\xcf\x37\xa9\x48\xa1\x95\x31\x74\x4b\x96\x86\xb0\xef\xcc\x35\x96\x56\x96\x3c\xcb\xf4\xa1\x0c\x2a\x98\x7b\xc6\x7a\x88\x49\xef\xc8\xb3\x98\xfa\xb9\x25\x09\x34\x77\xee\x59\x21\x61\x24\xb0\x84\x60\x7f\xe8\x35\x4d\x5b\x3d\x94\x47\x3c\xb8\x27\x4d\x13\x75\x4f\x3e\xbd\xc7\x3d\xf9\x10\x56\xfd\x67\xb7\x78\xab\xfe\xb3\x53\xf4\xd5\x6a\x57\xf2\x61\xb1\xfa\xcf\x3e\x21\xb3\xfa\x4f\xc6\x53\x94\x82\xda\x5a\x7d\x1c\x28\x39\xf3\xa9\xbc\xb6\xb9\xb6\xa1\xea\xe4\x2f\x14\x64\xca\xc0\x80\x9c\x72\x50\x76\x6b\x05\x64\x9a\xe6\x34\x2a\x52\xf3\xe4\xc3\xb7\xf5\x1f\x10\x07\x79\x6f\xef\x64\x19\xd8\x5d\xff\x36\x8f\x65\xe6\xd0\x55\xdf\x39\x6e\x46\x89\x6a\xa2\x70\x89\x15\x3e\xd6\x07\x62\xd4\xff\xd1\x66\x16\xfe\xc3\x7f\x58\xe1\x29\xa9\xe4\x4f\x07\xff\xf5\x97\xf3\xbf\xfd\xbf\x07\x3f\xff\x23\xfc\x1d\xa8\x6b\x06\x1e\x1e\x7c\x21\x71\x08\x50\x4d\x92\xf1\x92\x5c\x42\xef\xe0\x47\x6b\xe9\x9d\x1a\x84\x90\xfd\x05\x54\xf4\x3a\x36\xe4\x02\xfe\xc7\x86\x97\xab\x3f\x45\x16\x34\x70\xcf\x1e\xea\x3d\xb0\xb6\x09\x44\xfd\xe6\xc9\xa7\xfd\xe0\x86\xfe\x48\x84\x4c\xe2\x76\x77\x4f\xbf\x12\x83\x79\xab\xdb\xc6\xb2\x58\x90\x1a\xc3\x3f\xbf\x77\x53\xa0\xef\x63\x5f\x73\x91\x41\xe9\x34\x7d\x07\x8e\x7a\x64\x97\x2f\xee\x5e\x25\x59\x9c\xe6\xc9\x28\xf9\xfd\x0a\x66\x9e\x30\x98\x11\x3b\x5b\x46\x02\x78\xfd\xd1\xe7\xa3\x78\x2a\x81\xd3\xc9\x05\xba\x33\x33\xbc\x47\x93\xf3\x74\xe2\xba\x22\xd9\xcd\xad\x64\x81\xfd\xbd\xef\x95\x5d\xa6\xc0\x74\xb3\x06\x73\x14\x9d\xd3\xea\xd3\xcb\xf1\x3a\x67\x77\xba\x5d\x99\x2d\xb7\x6b\xf5\xd9\x43\x99\x99\x6a\x2b\xea\x77\x34\xa9\x22\x57\xbf\xc4\xd0\x5b\x5e\xc6\x46\x11\xdc\xb3\xcf\xb6\x6b\x16\x53\xce\x19\xc0\x01\xad\xaa\x3f\x0c\xe8\x54\x0b\x7b\x93\x33\x69\xbe\x03\xae\x47\x72\x47\x98\xf2\x70\x72\x5b\x65\x1d\x0b\x45\xf3\xd8\x24\xb6\x47\x5d\x56\x66\x07\xf0\x30\x5e\xae\xfa\xd9\x63\x17\xdd\xf3\xda\xa0\xa6\x4f\xab\x66\x81\xf5\xa8\xe7\xde\x0e\xde\x78\xda\x0d\x7a\x42\xcf\x9d\xa4\xff\x22\x2b\x05\x3b\x5f\x7d\xf3\xa7\x84\x74\xd2\xf5\x27\xe3\xc5\xf9\x44\x66\x4e\x96\x1d\xbb\xc9\x56\x02\xc6\xb1\xc7\xcd\x24\x5f\xc2\xdc\x7d\x2f\x5d\x4c\xc1\xd8\x5c\x62\x3a\xb8\xa8\x47\x41\xa1\x77\x76\x87\xee\xb0\xf0\x28\xa1\x76\x5a\x51\xb9\x48\x15\xf7\xe6\xb9\x98\x75\x99\xb1\x5d\xea\x3a\x30\xad\xb8\x1a\x37\x9d\xee\xa1\xe7\x62\xa5\x97\x19\xba\xf0\x98\x8b\xb9\xcf\x30\xdf\x85\xf3\x4d\x62\x7a\x98\x83\xf1\x64\xf3\x60\xa8\x4d\x9e\x6b\x22\xd6\xf8\xef\x05\x51\xad\xd0\x32\xcb\x66\x57\x4c\x78\x69\xa8\x58\x32\x2a\x7f\x39\x8c\x75\x14\x3a\x45\x60\xce\x12\x5f\xd7\xe4\x57\xb2\xb3\x5d\x6f\x9f\x41\x1b\xee\xb5\x77\x27\x24\xb2\x38\xd7\xac\x10\x12\xa4\xc2\x8a\xde\x99\x6d\xe9\xf2\x87\x1c\xb5\x80\x6e\xf0\xe0\xf8\xf8\xc0\xf4\x92\x0b\x73\x95\x1a\x8f\xa2\xfe\x7c\xaf\xae\x85\x4e\xa9\x7a\x02\x37\x7c\x48\x07\x63\x97\xc8\x94\xd3\xb0\x53\xe5\x42\xac\xb9\x74\xf5\x2f\xc0\x98\x72\x59\x53\xdf\xef\xb5\x0f\xcc\xe7\x76\xad\x96\x93\xfd\xce\x10\xbc\xb8\xdf\x5b\xe5\xc7\xf0\x23\xdb\x3c\xb1\x54\x47\xf1\xa1\x79\xe5\x71\xd1\xb4\x23\xfb\xfa\xe3\x9a\xd4\x5c\x2c\xfd\x8f\xbe\xf8\xe6\x58\x2a\x2e\xf0\x1c\x4a\x46\x99\xc6\xcd\x9f\xf9\x9f\xcc\x1f\xf6\xba\xb7\xfe\xd7\x06\xdd\xd1\x65\x66\xf9\x5a\x2c\x5f\x9d\x2d\xe7\xd6\x6d\x4f\x0c\x28\xbf\xad\x9e\x40\xfe\x1c\x78\xc0\x9c\x89\xb9\xf9\x59\x84\x90\xba\xad\x09\x3b\xea\x14\x0e\xc0\x7d\x18\x25\x4f\x1e\xec\x8f\x1c\x42\xa8\xa4\x77\x54\xf2\x84\xb2\x1d\xfe\x45\xeb\xe1\x09\x47\xd1\xc4\x5b\xd5\xb4\x90\xdb\x59\x63\xe5\x3d\x28\x0f\x0d\x97\x80\x16\xb1\x87\x7d\xc5\x35\xf8\x2a\x35\xf2\x02\x3a\x86\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\xc9\x5d\xc7\x6c\xf9\x21\x51\x7a\x9b\x67\x6c\x37\x0b\x65\x8a\xcc\xc9\xb6\xcc\x79\x1f\x7b\x63\xa6\x50\x5b\xef\x2a\xa4\x4c\x8d\xb9\x18\x5b\x2e\x2d\x30\x52\x12\x1b\x70\xdb\x2b\xf7\xf9\xbf\x72\x52\x33\xc8\x54\x76\x4a\xe1\x1e\x1d\xf0\xa7\x52\x34\x0c\xc3\xcf\x73\xc0\x64\x4c\x4b\x41\x2d\xf5\x03\xd9\x91\xdb\x7c\x6d\x37\xe8\xbf\x03\x72\xc6\x05\x8d\xcc\xba\x76\x96\x94\x36\xaf\x8e\x3b\x23\xc8\x71\xaf\xd9\xef\xdd\x92\x04\x88\x99\x7b\x06\xa4\x4d\xf4\x33\x20\x6d\x1e\xe9\xca\x80\xb4\x49\x7a\xbe\x48\xa4\x8d\xe1\x1d\xfc\xf7\x84\xd9\xe4\xaf\x8a\x16\x99\xb9\x93\xb3\x20\x1a\x61\x77\xb1\xe0\xea\x9c\xa9\x6e\xce\xed\xa1\x38\x6a\x78\xd3\x56\x58\x3d\x92\x45\x91\x29\xef\x6d\xcf\x22\x67\x40\xb4\x6b\x54\x3f\x8b\xe1\xa7\x0c\xd5\x6d\xa5\x68\x13\x99\x10\xe0\x4d\x4b\x4f\xa6\x8b\xb0\x94\xbc\xa0\xd8\x25\x82\xc3\x6f\x2a\x2c\x95\x1b\x32\x78\xe6\x15\xbe\x25\x01\x21\x6f\x6c\xb6\x36\x90\xf7\xba\xb9\x9d\x2e\xf5\x3d\x74\xce\xee\xec\x9d\x84\xca\xd6\x24\xb8\x92\x2e\x56\x9a\xa5\xdd\xaf\x2b\x9b\x51\x9f\x4b\x9b\xad\x10\x24\x35\x82\x06\xe9\x9d\x88\x18\xa2\x39\x7c\xd6\x41\x20\x21\xfd\xc3\xd2\xc3\x46\x75\x23\xd9\x38\x48\x57\xc5\x7d\x36\x42\x92\x8d\xb5\xa6\x83\x77\x30\xd1\xbe\xee\x1d\xdd\xc2\x1e\x25\x70\xa4\x6b\xe5\x79\x35\xf2\xa7\xd0\xc6\xf7\x45\x13\xdf\x13\x2d\xfc\x69\x34\xf0\xfd\xd4\xbe\xb3\x69\xde\x79\xb4\xee\x3c\x1a\xf7\x16\xb8\xf6\x9c\x5a\x76\x1e\x0d\xfb\x29\xfc\x6b\x8d\x20\x33\xfa\xb0\x0f\x69\xcb\xae\xc2\x0f\x52\xe4\x01\x5c\x35\x8d\x20\x0d\x61\xa5\x23\x42\x73\x11\x58\x60\x6c\x1c\x32\xce\xbd\x5f\x34\xef\x85\x7d\xbd\xc9\x53\x36\xdc\xd6\x68\xb8\xad\xb7\x78\x86\xdb\x7a\xb8\xad\x9f\xe5\xb6\xb6\xd2\xea\xeb\xbf\xaa\x73\x57\xd7\xad\xf1\x7c\x67\x15\x10\xce\xfa\x54\x76\x20\x99\x9f\x85\xba\x7f\xad\x9e\x48\xa4\x1f\x2b\x14\xb2\x1e\x74\xa1\xb8\x11\x7b\x86\x6b\x5a\x20\x53\x7d\xcd\x98\xd5\xa8\xc6\x0c\xcf\x81\x06\x5b\x7f\xcf\x1e\x31\xc4\x85\xaf\x6a\x15\xd5\x93\x15\x4e\x40\xf0\x60\x39\x5e\x63\xf8\xa5\xe0\x55\xa5\xf5\x95\x8a\xde\x12\xf4\x9a\x34\x15\x5f\xd6\x96\xa6\xa9\x44\xd7\x0a\x2b\x32\x6b\xab\x6b\xa2\x12\x0a\x55\x47\x4a\x1c\x5f\xd1\xc7\xb0\xaf\xef\x6a\x2b\x42\x71\x1f\x28\x76\x83\x1a\x43\x03\x1f\xf5\x9a\x0f\x0c\xae\xf2\xd3\xea\x1e\x2f\xe5\x08\x5d\x92\x3b\x22\x46\xe8\x62\x76\xc9\xd5\xc4\x38\x91\xe2\xde\x1b\x72\x82\x98\x97\x23\x3a\x43\xdf\x55\x58\x11\xa9\x90\xc2\x73\xc0\x16\x77\x05\x7e\xb8\xe8\x35\x8a\xb8\x16\x94\xf7\x74\xfb\x42\x3d\xe6\x79\x56\x4e\xbe\x8f\x54\xfd\x81\xd6\x7d\xcd\x9f\x67\xaf\xab\x51\x39\x1e\xfd\x9d\x71\x42\x1b\xfa\x7e\x43\xe7\x6d\xd8\xe8\xbd\x38\x31\x25\x03\x5d\x55\x64\x70\xe9\x52\x86\x04\x91\x0d\x67\x92\xf4\xca\x37\x74\x03\x81\x9a\x97\x71\xa7\x3e\xab\xc7\x37\xda\x30\x48\x35\x09\x1a\x2e\x15\x54\x39\x88\xd5\x4f\x72\xd9\x02\x13\xd7\x11\x28\x7c\x81\xab\x8a\x94\x88\xd6\x35\x29\x29\x56\x5a\x6f\xc7\x33\x45\x04\xc2\xa1\xa8\xf7\xe5\x53\x7d\xde\x88\xa9\x87\xe1\x4a\x69\xc4\x1b\x6b\x7d\x9a\x59\x09\x79\xb4\x94\x41\xf4\xc2\xa0\x4e\x6d\xe1\x8f\xae\xf0\xc6\x4a\x29\x8d\x24\x21\xaa\x9f\x0f\xa0\xd9\x05\xdb\x7b\x15\xb4\x8b\xa6\x15\x2f\x6e\x25\x6a\x99\xa2\x95\xad\xd5\xc9\x6f\xc1\x7e\xa9\x40\x9c\x44\x37\x1d\x2f\xa5\xfc\x3f\xc7\xfe\x80\x8d\x75\xaf\xe4\xc9\x6f\xba\x5f\xc1\x07\x91\x9d\xcb\x60\x45\xe7\xb0\xa1\xc9\x03\x29\x52\xf4\xf9\x7e\xb0\xe5\x81\x14\x61\xa5\x4f\x47\xe3\xac\x77\x94\x25\x4f\xce\x14\x77\x34\x4f\x26\xfc\x55\x2e\xcc\x53\x02\x69\x75\xf8\xe4\x86\xf4\x9c\xd9\x45\xa0\xd2\xce\xbc\xf9\xb1\xa2\x8c\xf4\x17\xc6\xd7\x7f\xf3\x8b\x63\xc2\x9e\xd6\xc8\x45\x25\x15\xa4\x50\x5c\x2c\x1d\xeb\x57\x72\xd7\x5c\x5f\x74\xdf\xa0\x70\xf2\xe1\xc1\xc9\xc1\xd1\xda\x1e\x39\x90\x90\x7e\x61\xae\xc5\x63\x4b\x9d\xed\x07\x25\x69\xdd\x54\x4b\x18\xc7\x41\x39\x42\x54\xe5\xc0\x08\xe9\xdb\xd0\x94\x09\x87\x59\xb1\x54\xdf\x23\x24\x39\x52\x02\x97\xd4\x1a\x08\xf0\xa9\xfe\x92\x12\xad\xbd\xd0\x0f\x0f\x7e\x3d\x18\x21\xa2\x8a\x23\x74\xcf\xd9\x81\x82\xe9\x3b\x46\x37\x50\x5c\x31\x1d\xd6\xeb\x3a\xb2\xe4\x2d\x54\x18\x37\x4b\x68\xea\xe9\x56\x4b\xb8\x6e\x10\x6f\x6d\xfd\x55\xac\x52\x28\xca\xc3\xe7\xfc\x81\x2a\x4b\xbe\xa1\xe5\xf7\x4b\xd8\x4d\xb6\xe2\x37\xd6\xc6\xc8\x1d\x39\x59\x10\x5c\xa9\x85\xc9\x66\x60\x9c\x8d\xff\x45\x04\x07\x1a\x73\x66\x7f\x93\xda\x8d\xb4\x90\x72\xf8\x24\x84\x97\xd7\x3b\x94\x05\xc8\x94\xd9\x19\xe0\x1e\x7d\xed\xbd\x21\xd1\x2a\x11\x5a\x95\x47\x6f\x6f\x6e\x26\x6f\x88\xea\xd7\x73\xd6\x1f\xa2\x37\xe7\x37\x2e\x87\x05\x1c\xfd\x44\xcc\xb8\xa8\xf7\x40\xbc\xe7\x01\xd7\x8e\x51\xc3\xc5\x3e\xdc\x32\x0b\x2e\x93\x96\x13\x3d\xc1\x15\xf3\x96\x4b\x65\x62\x39\xc6\x36\x61\x90\xd8\xc8\xfb\x09\x19\x2e\x7d\xff\x62\x72\x8c\xfe\xc6\x5b\xa8\x44\x86\xa7\xd5\xd2\x17\x32\x92\x24\x0d\x45\xad\x9f\x17\xba\x2b\x2f\xf4\x0d\xa2\x77\xfe\x5b\x82\x4b\x22\x24\x08\x68\x82\x93\x93\xa1\xb3\x1d\xf7\xa0\x6f\x59\x97\xf2\xac\x95\x8a\xd7\x68\x61\x87\xdd\xa7\x38\xb7\x87\xf3\xd8\x1c\x57\x4b\x27\x2b\x48\x63\x84\xb8\xfd\x9b\xaf\x4e\x44\xaf\x49\x2f\x33\xef\xf6\xf3\xa9\x51\x53\xc3\x69\xb3\x01\x0e\x43\x54\x6a\x65\x9b\x29\x9a\x97\xe9\xba\xc8\x90\x2f\x80\x32\xe6\x0c\xa0\x34\xf2\xf3\xd5\x17\x41\xb0\x27\xf9\x4d\xf9\xd2\x10\x50\x36\xa8\x3d\x7a\x12\xb8\x3d\xb2\x28\x4a\xbb\xf9\x8c\x0f\x3a\xde\x7b\xbe\xe9\xe5\xb4\xab\x0b\x5e\x60\xc6\x19\x2d\x70\x45\xff\x45\x4a\xd4\x36\x9c\xd9\xdc\x3a\xd0\x6c\x0b\x2c\xc9\x18\x22\xef\xcc\x88\x73\x19\xb0\x5d\x6b\xe9\xa0\x38\x07\x75\xcf\x17\x89\x36\xbd\xce\xd3\xd5\xac\xa8\xf0\x64\xea\xf6\xf0\x59\x0b\xa8\xf7\x16\x2b\xcf\x8e\x47\x5f\x84\x3a\x89\x32\x11\x2f\xac\x73\x9b\x99\x3a\xa1\xc0\xe7\x6d\xae\x2b\x10\xbc\x92\x88\xbb\xf4\xfd\x95\x6d\x5e\xb5\x0a\xb8\x6f\xba\x97\xc1\x1c\x08\xc4\xda\x7a\x4a\x44\x47\x0c\x29\xd4\xfa\x9c\x66\xf1\xba\xd8\x66\x4d\x73\x2e\x4a\xeb\x74\x0c\xcc\xe6\x04\xbd\xd2\x2d\xff\xf1\xdb\x6f\x7f\xff\x6d\x86\x76\xf4\xf0\x5c\x2b\x98\xa1\x8b\xd3\xcb\xd3\x5f\xae\x7f\x3c\x03\xba\xf9\xd4\xd7\x67\x4a\x92\xcd\x9d\x22\x9b\x35\x41\xf6\x49\xd3\x63\x81\xb8\x31\x59\xca\xe6\x3e\x12\xd7\xd0\x2b\xbd\x09\x5b\x69\x28\xea\xad\x4d\x12\x94\xd8\xd6\x66\x54\xfa\xee\x0c\x83\x79\x5a\x60\xed\x85\xa4\x92\x15\x21\x4d\x36\x8b\xff\x5a\xbf\xad\x57\x0e\x08\x95\xad\x30\x55\x69\x7d\xf0\xaa\xf3\xe5\xdb\xa0\x15\xf4\xe1\x2b\x32\xfe\x25\x29\x38\x2b\x53\x4c\x80\x5c\x2a\xad\xed\x49\xd6\x33\x77\x6d\xde\xe9\x5c\xc4\xdd\x55\x62\x1b\x03\x4b\x32\x75\x45\x91\x5f\xd5\x3c\x72\xd2\xb0\x41\xc0\xdb\xfe\xf8\x87\xf8\x00\x59\xd1\x5c\xf3\xe2\x36\xa3\x8b\x2c\x51\x80\xbd\xd6\x27\xad\x30\xb1\xc0\x9b\xb3\x89\xe9\x9c\x5e\x99\xcb\x0f\x37\x1d\xf5\x8b\xd6\xc2\x71\x57\x0d\xfe\xad\x8d\x16\x62\x56\xa2\x5b\xd2\xa4\x59\x97\x5a\x60\x3a\x18\x61\x1f\x45\x08\xbe\x77\x61\xeb\x76\x98\xf4\x6a\x23\x08\x1c\xfa\xcf\x68\xc4\x69\x15\x80\x82\xe0\x3c\x04\x02\xad\x11\x32\xc3\xb4\x42\x18\xbc\xf2\x8a\xd6\x04\xdd\x2f\x08\x33\xce\xfe\x0e\x2d\xf1\x15\x09\x9c\xaf\xd5\xdb\x78\xe0\x20\xe1\xdf\x6d\xed\x35\x4c\x65\xc5\xf8\xba\xcd\x00\x2b\xb3\x45\x8f\xd5\x6c\x30\x03\x3e\xe7\x19\xcc\x80\x48\x33\xa0\x11\xe4\x5a\xf1\x68\x5d\x33\x1b\xe0\xc6\x74\xe3\x11\xb8\xcd\x94\xcc\xb8\x20\xab\x78\x9b\x00\x07\x63\x91\xf3\x09\xc8\xe0\xd3\xc9\x85\x8f\x7d\xf1\x1e\xd6\xc5\x30\x17\xcb\xb6\x58\xb8\x30\x29\x23\x52\x9e\x00\xb2\xa6\x6d\x8c\x63\x19\xae\xb6\x56\x90\x78\x94\x4f\x23\x08\xa9\x61\x1e\x47\x1d\x9b\x90\x1e\x2e\x61\xe6\x43\xa2\x0a\x13\x37\x77\xb0\x22\xcb\x13\xeb\xa6\x6b\x96\x14\xce\xef\x26\xb6\x10\x58\x2e\x08\xe4\xce\x92\x07\xaa\xa4\x69\xd4\xb0\xb1\xba\x19\xd7\xfa\xc2\x5c\xe0\x82\xa0\x86\x08\xca\xb5\x8a\xd1\x32\x55\xf2\x7b\x86\xa6\x64\x4e\x99\x74\x2b\x96\xd2\x25\xb7\x25\x00\x49\x44\xa5\xaf\xdd\x7d\x8c\xae\x7a\x95\xe3\x2c\xbb\x58\xc1\x3b\x99\x69\xa7\x68\x94\x69\x4a\x40\x79\x81\x6d\xd0\xe2\xaa\x5a\x76\x1b\x2f\x24\x08\x7d\x64\x86\xe2\x37\x84\x99\xd9\xc3\x96\xc1\x40\x4b\x52\xe1\xa5\xc9\x20\x9f\x51\x06\xde\x5f\x21\x8f\x8e\xd3\xa1\x59\xd1\x1d\xe4\x22\x78\xe7\xa3\x3b\x83\x4a\x24\x08\x2e\x92\x78\x8c\x07\x0c\xd8\xa7\x9e\x01\x03\x36\x60\xc0\x06\x0c\xd8\xfa\x33\x60\xc0\xfa\xcf\x80\x01\x7b\xbc\x43\xfb\x1c\xb4\x1b\x30\x60\x83\x57\x66\xfd\x19\x30\x60\x51\xcf\x80\x01\xfb\xe4\xb3\x77\x22\x7a\xc0\x80\x7d\xc6\x33\x60\xc0\x3e\xf3\x19\x30\x60\x03\x06\x6c\xc0\x80\x0d\x18\xb0\x84\x67\xc0\x80\x6d\x3f\xbc\x21\xf8\x13\xff\x0c\x18\xb0\x01\x03\xb6\xe5\x33\x60\xc0\x56\x9e\x01\x03\x36\x60\xc0\x3e\xf6\x0c\x18\xb0\x01\x03\x66\x9f\xc1\xdb\xb8\xf6\x0c\x18\xb0\x0d\xcf\x80\x01\xdb\xae\x9d\xc1\x0c\x48\x7b\xd9\x93\x98\x01\x52\xf1\xe6\x9a\xce\x13\x78\x21\x73\x1d\x83\x6b\xdf\x13\x4b\x1a\x29\x6d\xb1\x5d\x69\x3e\x74\x7e\x2c\x69\x29\xfb\x42\x44\x58\x70\x93\x4c\x89\x36\x11\xf4\xb0\x9a\x94\xdb\xe4\x62\x06\x01\xe4\x80\xc9\x4d\x9f\x0a\x47\x13\x48\x7b\x65\x1d\xfa\xea\xb3\xbb\xdd\x28\xd3\xb6\x4b\x7c\x0f\x82\xf9\x28\x30\x33\x95\x51\x6d\x99\x6c\x7d\xbd\x4f\x78\x29\x5d\x25\x09\xc6\xd9\xd8\x90\xb5\x1e\xeb\x0e\x1f\x73\x79\x9c\xe0\x0d\x4e\x64\x66\x33\x18\xb9\x89\xe0\xd3\x9d\xb1\xb3\x4d\x00\x7f\x44\x0b\x0b\xd0\xe3\xb3\x1e\xe3\x9a\xe9\x60\x24\xd3\x5a\x1f\x18\x06\xc5\x9a\x1d\x05\x17\xb5\x02\xdb\x83\x02\x77\xc9\xe6\xb6\x35\x72\xca\xb1\x54\xca\x93\x86\x9b\xff\x74\xb8\xa9\x00\x30\x15\x1d\x47\xd9\x31\xbd\x5c\x0a\x4a\x6a\x67\x08\xa9\x3d\x41\x98\x65\x40\x45\xe5\xd4\x95\xf6\x14\x0d\xb5\x9f\x48\xa8\x7d\x44\x41\xed\x02\x01\xb5\x73\xf4\x53\x9e\xb0\x7a\x86\x90\x7a\x26\x8d\xf4\x09\xc2\x53\x16\x48\x7f\xb3\x10\x44\x2e\x78\x15\x2d\x70\x72\x09\x9b\xf7\x94\xd1\xba\xad\xa1\x0a\x85\x96\x29\xf4\xce\x83\xfd\xa5\x13\x19\xf6\xba\x37\x88\x03\x28\x57\x51\x12\x28\x03\x8e\x69\xa5\xb7\x16\x90\x85\x2e\xf0\x1d\x28\xa5\x6d\x51\x10\x52\xa6\xa8\xa5\xa1\xb7\xfa\xf7\xc7\xbe\x87\x86\xa3\x9f\x4a\xf4\x2a\xed\xaa\x49\xb3\x7b\x02\x77\xde\xef\xbf\x89\x7a\xc7\x5c\x34\x79\x6e\xe9\x37\x57\x93\xb3\xde\x2d\x0d\x1f\xbc\x85\x63\x7c\xb6\x20\xc5\xed\x95\x85\xd2\xec\xee\x66\x4e\x77\x33\x25\xb9\x98\x72\x28\x06\xa9\x5e\x94\x7e\x0c\x99\x0b\xb5\x12\x02\x9d\xc3\x2a\x12\x71\x47\x0b\x72\xfc\x0c\x8e\x8a\x5c\xc6\x7f\xfa\x41\x40\x10\x26\x80\x81\xef\x8b\xda\x75\x6d\xba\xe3\x23\x0c\x81\x8f\xca\xf6\x14\x40\xa3\x15\x2e\xfc\xda\xcc\x37\x1f\xba\xa4\x6e\x1c\x4a\x42\xbc\x41\x33\xa7\x6a\xd1\x4e\x8f\x0b\x5e\x9f\x68\xd1\x61\xfe\x33\xad\xf8\xf4\xa4\xc6\x52\x11\xa1\x6d\x1c\x7b\xad\x8f\x0b\xdd\x03\xca\xe6\xc7\x75\x79\x74\xfc\xbf\x92\xfa\x70\x61\x7d\xe5\x36\x0d\xeb\x11\x27\xc1\x94\x68\xb9\xcf\xc5\x8a\xb7\x40\x4f\x4a\xfa\x26\x4d\xbe\xbf\x53\x8b\x8a\x24\xc2\x92\x77\x02\x49\x1e\xa4\x36\xca\x10\x10\xc8\x29\x54\xf6\x03\x76\xfc\x64\x90\xe3\x2c\x67\x35\x13\xd4\x78\x8f\x60\xc6\x7b\x63\x0b\xed\x0b\xb4\x38\x1b\xac\x38\x17\xa4\x38\x0b\x9c\x38\x07\x94\x38\x1f\x8c\x38\x0f\x84\x38\x3f\x7c\xf8\xc9\xa0\xc3\x5f\x04\x6c\x38\x63\x7c\x2c\x13\x5c\xf8\x39\xa0\xc2\xfb\xeb\x83\x41\x19\xe0\xc1\xcf\x07\x0d\xce\x32\x8f\x59\xad\xd8\x44\x91\xb0\x03\x28\xf0\x73\xc4\xff\x9f\x2c\xf6\x9f\x21\xee\x9f\x33\xe6\x9f\x2d\xde\xff\x64\x90\xdf\x74\xb8\x6f\x56\x9f\xc2\xb3\xc0\x7c\x73\x42\x7c\x93\xd7\x97\x32\xaa\x28\xae\x5e\x93\x0a\x2f\xaf\xd3\x80\xa0\xb9\x56\xe2\x72\x0d\x2c\x6a\xdc\xd6\x7d\x5c\xc3\x02\x4b\xe4\x42\xdd\x96\xe2\xc5\xc5\xd2\xad\x0a\x8c\x30\x44\x9c\xf5\xf8\xa2\xa3\xd6\x68\xff\x22\xd7\x68\x6f\xdc\xe3\x86\x57\x65\x4f\x76\xcd\x5b\x7e\x8f\xf8\x4c\x11\x86\x0e\x29\x73\x3b\xe7\x28\xf0\xd2\x74\xe1\x91\xe4\x78\x87\x7e\xeb\xab\x97\xae\x91\xaf\x2f\xee\x01\x91\x21\x29\xf7\x3a\xf2\x65\xfb\xf8\xe9\xd0\x97\xfd\xe2\xac\xad\xfa\xe1\x2f\x13\x12\xcb\x13\xfb\x7a\x75\x8c\xde\x5b\x75\xe2\x15\xf4\xc7\x8b\x22\xcc\x4a\x64\xf9\xb9\xbe\xbe\x7d\x92\x0c\x75\xef\x1b\x37\x1e\x9b\xde\xc7\xb3\x98\x1b\x58\x6b\x99\x1c\x61\xfd\x2d\x50\x40\x07\xa7\xeb\xde\x38\x5d\x77\x84\xc0\xfe\xfa\xac\xad\xe7\x47\x5c\x0f\xd6\xd6\xbf\x8b\xb5\x15\xd0\xe2\xbd\x11\xb8\x20\x93\x7d\x52\xde\x9c\x00\xe9\x12\x01\x3b\x1d\xce\x8b\x0b\x46\x88\x49\x1c\xeb\x48\x0f\x81\xdf\x6f\xd6\x56\xd5\xd2\xf8\x10\x7b\x0c\x98\xf1\x5b\xeb\x66\x41\xd6\xa8\x03\x21\x94\xba\xa1\x77\x9d\x6d\xd2\x08\x6e\x35\x12\xd1\x32\xa6\x55\x0c\x7b\x9c\x74\xe7\xb5\x2d\x22\x09\x8b\x77\xa7\xe3\x1e\xb1\xa1\x05\xa1\x03\xd0\x73\x41\x50\x97\xbf\xd4\xef\x88\x6e\x75\xc6\x45\x41\xa7\xd5\x12\x2d\x70\xa5\x8d\x25\x0b\xd2\xbe\xa5\x55\x65\x5f\x93\x00\x0a\x27\xca\x84\x9e\x8d\x46\x53\x71\x36\x87\xc9\xc0\xa6\x23\xe4\xa1\x21\x85\x6e\xb3\xa8\x08\x66\x6d\x63\xfa\xa9\xf5\xa3\x25\x6f\x85\xeb\x67\x12\x2a\x3e\x68\x9d\x4a\xc4\x68\x35\x72\x53\xde\xa7\xc0\x5c\xdf\xf3\x9d\x4b\x59\x92\xd2\xb2\x57\xde\x53\x49\x46\xf0\xce\xe8\x3e\x99\xbe\xb8\xaa\xfd\x66\xdf\x98\xcf\x1a\xc1\xef\x68\xd9\x61\xf4\xf5\xb6\x00\x7c\x7c\x74\x5b\x3f\xc2\x7b\x9d\x68\x65\x9c\x8d\x19\x99\x63\x50\x8f\xad\x40\x33\x88\x4e\xd3\xbe\xc1\x0f\xb2\x92\x16\x58\x11\x09\x39\x09\x3d\x6a\xdb\x3b\x8a\xa3\x7b\xa2\xc7\x13\xec\x28\x74\xc8\x38\xe2\x90\x59\xd8\x32\xaa\x96\x10\xd1\x5b\xb4\x0a\x95\xfc\x9e\x1d\xa5\x1c\x4c\x03\x73\xc0\x68\x4a\x14\xee\x92\x03\x9d\x4a\x26\x11\x61\x78\x5a\xe9\xb3\x07\x88\xff\x9b\x8d\x1b\x00\xcd\x08\x56\xad\x20\x68\x8e\x55\x82\x94\xd8\xa0\xcd\x9b\xf5\xfc\xf8\xb6\xa3\xd2\xc6\xeb\x66\xa8\x65\x92\x24\x2a\xb2\xd9\x4c\x80\xc8\x8c\x57\x7d\xa2\x79\xab\xf6\xe4\x1e\x79\xcc\x75\x64\x32\x77\x02\x23\x91\xd6\x44\x22\xde\x26\x78\xf2\x7a\xe6\x9f\x6d\x2e\xa7\x85\x37\xf8\x9d\x36\x3e\xb1\x61\xd3\x1c\x3b\xec\x32\xd0\xca\x03\x7e\x02\x07\xb7\x32\x19\xd4\xaf\x2f\xaf\x7f\x79\x77\xfa\xdf\xe7\xef\xe2\x16\xfe\x1c\x17\x8b\x90\x5b\x9c\x21\x0c\x17\x05\x08\xf9\x05\xbe\x23\x08\xa3\x96\xd1\x7f\xb6\x16\xf2\x76\xe8\xdb\x8b\x14\xab\x59\xd2\x7b\x92\x14\x5f\x7d\x4b\x44\x49\x8e\x1c\x6b\xfa\x8e\x4a\x20\xaa\x86\x4e\x58\xe0\x3f\x97\x04\xcd\x04\xaf\x57\x0c\x2d\x74\xe9\xc1\x75\x4b\x7d\xc3\x60\x63\x9a\x2d\x88\x88\xd3\xc8\x5f\x7f\x38\xbf\x86\x1c\xfc\x46\x18\x62\x77\x48\x2e\x80\x77\x42\xeb\x26\x75\xd0\xf4\xa7\x3c\x46\xa7\x6c\x69\x7e\x69\x84\x59\xa4\x8a\x52\x51\xa9\x08\x28\xa7\xd6\x90\x74\xf0\xc0\x17\x2f\x8f\xe1\x7f\x2f\x10\x2e\x4b\xa1\x2d\x4d\x9f\xa3\x51\xac\x66\x99\x45\xb5\x6c\xec\x57\x3a\xad\x82\xc9\x65\x44\x41\x1a\x47\xd4\x0b\xdf\xf3\xd2\xae\x04\x28\x81\x80\xdf\x31\xda\xad\x54\x02\x2b\x32\xa7\x05\xaa\x89\x98\x13\xd4\x60\x55\x2c\x50\x8d\x97\xa8\xe0\x42\xb4\x8d\xa1\x18\x29\xb1\xc2\x71\x2d\x7f\xcf\x05\xaa\x9d\x74\xd6\xd2\x4c\xab\xe4\xd7\x9b\x81\xa0\x9d\xc8\x0e\xff\x49\xa5\x6c\x89\x3c\x79\xf5\xf2\x4f\xdf\x7c\x1b\x69\x5e\x67\x3c\xb8\xb1\xd0\xa7\x04\xc8\x53\x1f\xfe\xe5\x36\x18\x80\xae\x7b\xcc\x30\x76\x87\x98\x9d\x0f\xd2\x50\x52\x36\xaf\x92\x1d\x20\xc9\x6e\xc0\x54\x27\xe0\xb8\x1b\xc1\x24\xd6\x17\x98\xee\x09\xec\xf5\x21\xde\x95\x92\xcf\x0b\xd6\x69\x70\xce\xef\x65\x05\x32\x67\x81\x61\x77\x31\x71\x52\x2a\xc5\x7f\x04\xd6\x84\x77\x4c\x19\xf6\x11\xd3\xac\xc1\x3b\x8c\xd0\x4b\xf4\x5f\xe8\x01\xfd\x17\x78\xc1\xfe\x18\xdf\x54\x1e\x1f\x53\x0e\x18\xff\x82\x4b\x75\x31\xc9\xb4\xd0\x7f\xd5\xf7\x95\x7e\xa3\x5e\x0f\xc5\xd1\x94\x5a\x77\x04\x79\x50\x44\x68\x33\xd0\xae\x61\xea\xcc\x25\x79\xd4\x74\x07\xbf\x94\xdd\x9d\x0a\x2e\xb8\x98\xf5\xd1\xff\xcf\xb4\xbf\xa1\xe1\xb7\x5c\xaa\x4b\x2b\xad\x43\x0a\x9d\xb0\x1f\x35\x5c\xc4\x3d\x71\x9f\xd2\xea\x7b\xbd\xf7\xba\x1a\x1b\xa8\xe4\x90\x00\x61\x72\x38\x17\x34\x41\x38\xec\xcf\x89\x4d\xc3\x89\xe6\xdb\xba\x1f\xdb\x5a\x2b\x3e\x7d\xf0\xc8\x58\x23\x25\x28\x4b\xd3\xf0\xf2\x18\xec\x9b\x84\x5e\xe8\xd9\x28\x03\x65\xe0\x23\xa6\xd1\xb1\xb1\xd7\x7c\x74\x18\x0e\x9c\x96\x58\x05\x66\xb1\x3a\xac\x79\x04\x99\x11\x21\x4c\x9e\xf0\x74\xe9\xd2\x8d\x92\x77\x5b\x92\x94\x6b\x04\x57\xbc\xe0\xd1\xb4\x29\x39\xb7\xca\xc4\xf6\x05\xe6\x1e\x62\xb5\x3e\x3a\xfe\xc3\xeb\xc9\x08\xdd\x9c\x4d\x46\x88\x0b\x74\x7d\x96\x06\x7e\x0a\x5d\x30\x2f\x6e\xce\x26\x2f\x76\xba\x02\x41\x0e\xd3\xcd\xd9\x24\xe2\x25\xeb\xf0\xd9\x1a\x37\xe3\x5b\xb2\x8c\xd4\xee\x72\x68\x98\x63\xbf\xb1\xb2\x0c\xc8\x4c\x73\x8d\x9b\xad\xdf\x26\x08\x2e\xe9\x5e\x33\xb9\xb8\xac\x43\xdf\xd3\x7c\x94\x2e\x35\xbf\x23\xa5\xb1\x9a\x5d\x2b\x84\x95\x0d\xa7\xda\x46\x1a\x78\x5e\x3e\xf6\x0c\x3c\x2f\xdb\x3f\x03\xcf\xcb\xa6\x67\xe0\x79\xd9\xe2\x19\x78\x5e\xcc\x33\xf0\xbc\xf4\x3b\xb2\x8f\x39\x46\x03\xcf\xcb\x27\x9f\x81\xe7\xe5\xd1\x67\xe0\x79\xd9\xea\x19\x78\x5e\xd6\x9f\x81\xe7\xe5\x23\xcf\xc0\xf3\xe2\x9f\x81\xe7\x65\xe0\x79\xf9\x72\xa5\xf6\xc0\xf3\xb2\xfa\x0c\x3c\x2f\x03\xcf\xcb\xc0\xf3\x12\x3e\x03\xcf\xcb\x23\xcf\xc0\xf3\x32\xf0\xbc\x0c\x3c\x2f\x1f\x7f\x06\x9e\x97\xe8\x67\xe0\x79\xd9\xee\x19\x32\x0f\xb7\x7c\x06\x9e\x97\x81\xe7\x65\xf5\x19\x78\x5e\x3e\xf9\xec\x87\x7b\x7c\xe0\x79\x19\x78\x5e\x3e\xfa\x0c\x3c\x2f\x03\xcf\xcb\x47\x9f\x81\xe7\x25\xe2\xd9\x3b\xa7\xeb\xc0\xf3\x32\xf0\xbc\x7c\xac\x8d\xc1\xda\xda\xee\x19\x78\x5e\x06\x9e\x97\xb5\x67\xe0\x79\x59\x7f\x06\x9e\x97\x81\xe7\x65\xe0\x79\x19\x78\x5e\xfc\x33\xf0\xbc\x7c\xed\x7e\x27\x41\x24\xfd\x17\x99\xf0\x8a\x16\xcb\xe4\x6c\x9f\x2b\x22\x79\x2b\x0a\x7d\x63\xc3\x6b\x51\x03\xef\xf5\x1e\x85\x24\x25\x7b\xcf\x28\x14\xae\x82\x89\x0b\xa9\x14\x84\x9d\x83\xa7\x98\x82\xbd\xa0\x53\x70\x03\xbc\x8c\x47\x10\x8c\x5d\xf9\x6c\x33\x7d\x71\xce\xd2\x64\xab\x3d\x1c\xc8\x3e\xa4\x73\x86\xb4\x47\x7e\x17\x29\xee\x85\x2d\x7d\x74\x73\xe1\xa6\xa9\x68\x4a\x62\x2c\x42\xd7\x2d\x68\x17\xc4\x86\xc0\xe5\x77\xa8\x68\xda\x11\xaa\x49\xcd\x45\x42\x62\x44\x06\x0b\xae\xb7\x55\xf6\x61\x9d\xae\x4c\x87\xdc\xe4\x2b\x0e\xf3\xbf\x34\xf6\x42\xc7\x52\xe5\xd7\x8a\x3a\x71\x98\x84\x35\xbb\x98\xad\x82\x51\xa9\xea\x79\x81\x2e\xb9\xba\xb2\x87\x7b\x67\xeb\x95\x19\xb1\xe0\xa6\x70\x67\xac\x55\x67\xbc\x6e\x5a\x45\x7a\x17\x9b\x99\x62\x63\x74\x50\x99\x2a\xd0\x77\x93\x0d\x5a\x70\x36\xa3\x73\x6b\x7d\x9f\xd4\x98\xe1\x39\x19\xfb\xd9\x1e\x77\x54\x0f\x27\xd1\x17\xf5\xce\x52\x41\x8b\x0a\xd3\x78\xe0\x60\x2e\x31\x71\x06\xbd\x00\x1a\xb0\x0e\x50\x0f\xb9\x69\x7e\x9a\x47\x1e\x36\x4e\x8d\xdc\x38\x76\xbf\x32\x7f\x3c\x4a\xb0\x1e\xb1\x02\x5f\x05\x18\x46\x1b\x76\x6a\x9a\xc1\x68\xcc\xc4\x92\x34\x44\x5b\x04\xc6\x81\x1a\xaf\xf7\x2f\x19\xae\x69\xe1\x4e\xd8\x69\x55\xf1\xc2\xf8\x64\xfa\x56\x65\x8e\x2e\x6b\x63\xb7\xae\x5b\x85\xa7\x15\x39\x46\x17\x86\xa2\x82\xb3\x6a\xa9\xcf\x9f\x24\xca\x41\x14\xec\xe6\x4f\xb3\x24\x53\xf0\xaf\x89\xd8\xd7\x8d\x4a\x39\x6c\x2a\xc3\xa9\x41\x98\x16\x65\x9c\x11\x44\x98\x12\x4b\xbd\xff\x26\xbc\xbc\xd6\x5b\xb0\xf7\xed\x64\xaa\x8d\x44\xc8\x6b\x0e\xb8\x6b\x22\xd4\x35\x0f\x40\x35\x1d\x9c\x9a\x17\x98\xda\x85\x10\x0c\x53\x50\x98\xf1\xd3\xdb\x16\x0d\x2f\x8f\x37\x88\x26\xc4\x67\x89\x3d\xd0\x2d\x4e\x78\xa9\x95\x26\x41\x8c\x7c\xf2\x67\xd4\x38\x10\x2f\x74\xe7\x6e\xc1\xe3\x87\x55\xa7\x4d\xe1\x3b\x4c\x2b\x7d\x80\x13\x3b\xb0\xce\xba\x98\x16\x95\xc9\x14\xab\xb0\xe0\xfc\x7d\xda\x2c\x36\xad\xab\x97\x19\x56\x2c\xb8\x24\x0c\xe4\x25\xf6\x19\x3c\x3e\xbf\xc0\x8a\x98\xd2\xdc\xc5\xa9\x28\xe2\x8b\x19\x22\x75\xa3\x96\x23\x44\xee\x88\x58\xaa\x05\xa0\x0d\x3c\x6f\x28\x88\x35\x2a\x51\x8d\xcb\x60\x77\x8c\x10\x77\x0e\xe8\xc4\xe6\xe1\x7e\xb0\x36\x59\x5b\x29\x63\xa1\x51\xe9\xd3\x28\x76\xbd\x6b\x72\xd3\xd9\xa0\x54\xa1\x99\x93\x8e\x06\x01\x95\x6a\x4d\xe3\x88\x6b\x51\xc6\xb3\xf0\x0e\x7a\x11\xa4\x8e\xe8\x2d\x51\xe3\x07\x70\x4f\xe2\x9a\xb7\x4c\x19\x9e\x1a\x63\x31\x78\x2d\xcf\x24\xd8\x3c\x23\x5e\xee\x49\x75\x7b\x94\xe7\x6a\xc7\xa5\xa3\xa6\x98\xe4\xc8\x53\xc6\x4a\x11\xc1\xbe\x43\xff\x73\xf8\xf7\xdf\xfd\x3a\x3e\xfa\xf3\xe1\xe1\x4f\x2f\xc7\xff\xf9\xf3\xef\x0e\xff\x7e\x0c\xff\xf8\x8f\xa3\x3f\x1f\xfd\xea\x7e\xf8\xdd\xd1\xd1\xe1\xe1\x4f\x7f\x79\xff\xe6\x66\x72\xfe\x33\x3d\xfa\xf5\x27\xd6\xd6\xb7\xe6\xa7\x5f\x0f\x7f\x22\xe7\x3f\x7f\xe6\x4b\x8e\x8e\xfe\xfc\xdb\xf8\xe8\x63\x6a\xa8\x3d\x5f\xa0\x3d\x53\x98\xfd\x49\x82\xec\x56\xc6\xee\xfc\xf0\xdb\x2b\x70\xed\xf8\xdb\xe8\xc4\xc7\x8e\xbf\x48\xf6\xc9\x5c\xcc\xba\xf6\xa9\x44\xbc\xa6\x4a\x91\xd2\xde\xbd\x01\xf7\xcd\x8a\x3f\xc8\x0a\x2c\xa0\xad\xc2\x70\x7b\x07\x1c\x2c\x9d\x1b\x29\xba\x5b\xfe\x7e\x05\x0f\x18\x43\xb4\x6e\x2a\x52\x13\xa6\x40\xf0\x8c\x9d\x6d\x0b\xee\xc4\xe3\x6e\x04\x85\x71\x78\x90\x87\x82\x90\xd2\x76\x72\x90\x8d\xc1\x33\xc8\xc6\x41\x36\x7e\xea\x49\xf6\x89\xe7\x10\x8c\x57\x61\x27\xac\x2f\x4b\x3a\x4d\x19\x3c\xe4\x9e\x22\x81\xcf\x00\x28\x71\x47\xcb\x16\x57\x21\x93\xac\x23\x17\x8d\x93\x00\xe0\xda\xe9\x43\x43\x20\x4c\x4b\xee\x48\xe5\x3b\x61\xdc\xf4\xc7\xe8\xaf\x06\xce\x13\x1a\x9a\x7d\x87\x7a\x5c\x40\x6e\xd3\x70\xfb\x8c\x10\xd6\xd4\x3d\x90\x2b\x5d\xf2\x68\xa3\x2e\x09\x43\xef\xb6\xb8\xa9\x38\xf5\x52\xa3\x5a\x8e\x90\x24\xca\xe4\xd8\x2c\xc8\xca\x32\x61\x89\x5e\x9c\x56\xf7\x78\x29\x5f\xf8\x98\x24\x65\x54\xad\x14\x1f\x88\xea\x03\x70\xc3\xea\x17\xce\xb8\xd6\x79\xa1\xaa\xc2\x6c\x46\x8a\x48\x6b\xd6\x70\x70\xac\xf7\xcd\xe2\xd1\x15\x65\xad\x1e\xad\x9b\x55\x52\x22\xce\xa2\x1a\x22\x0f\x54\xa1\x96\x29\x5a\x69\x65\x1d\x09\x32\x6f\x2b\x1c\x3a\x02\xed\xc8\x1c\x4c\xae\x3c\x46\x1f\x58\x41\xc2\x2f\xc7\x79\xaa\x57\x1a\xd0\xca\x43\x45\x14\x29\x47\xf0\xea\xfe\xd0\xa5\x01\x9a\xf5\x4e\xbe\x5f\xca\xa8\xe6\xdd\x5c\x7a\x20\xd1\xb1\x39\x50\x1e\xe5\x80\x4a\x3a\x9b\xe9\x96\xc1\xd8\x66\x5c\xd4\x78\xbd\x57\x98\x95\x51\xad\xeb\x93\x0b\xe9\x25\x21\xcb\x2f\x54\x76\x79\x21\x69\x49\x0a\x2c\x5e\x84\x35\x41\x4e\x2b\xb5\xe0\xed\x7c\xd1\xed\x8a\xb4\x29\x47\x52\x01\xbc\x4a\x4f\xa6\x74\x9e\x8b\x95\xcd\x26\xb5\xce\xc2\x0a\x62\x54\x2b\x4e\x8c\xc0\xb8\xc7\x91\x6d\xaf\x41\x00\x0c\xa6\xdb\xac\xb9\xcb\xb9\x02\x0c\x1f\x29\x83\x04\x39\x46\x1e\x54\x86\x01\x1f\xa3\x0b\x43\x78\x31\xea\xbf\xb5\x37\x25\x66\x32\x02\x0c\x9b\x43\x63\x46\x02\xf8\x56\x1a\xa0\x3e\xc5\x0c\x78\x89\xcd\xcb\x31\x5b\xba\x8c\x0e\xc0\x98\x99\x4c\x34\x9f\x64\x52\xc5\xf9\xd0\xfd\x59\x7a\xf6\x32\x3b\xbd\x13\x7a\xd5\x56\xbb\x8b\x5e\x5e\x85\x05\x3e\x2a\x5b\x80\x47\xe8\x1e\xb9\xac\x9e\x05\x29\x6e\xcd\xc9\x2b\x89\x11\x6f\xc4\xf2\xdc\xa6\x9e\xae\x05\x6f\xab\xd2\xb0\xea\x76\xd2\x19\x24\xad\x81\x50\x9a\x6e\x60\x41\x10\xd1\x16\x02\x50\x8f\xd0\x38\xf1\xcd\x45\xa9\xb7\xb7\x11\xc9\xf0\x62\xe3\xd5\x76\xe9\x2e\xb6\x4b\x20\xe5\x0b\xce\xcc\x3d\x39\xb2\x37\x77\x8d\x29\x8b\x55\xed\xba\x31\xd0\x39\xe3\x02\x9c\xd6\x33\xc4\x78\xbf\x0f\xfd\x23\xbf\xd2\x8b\x68\x9d\xc3\xe3\x90\x36\x6a\x3b\xdd\x72\x9a\xf6\xef\x17\x44\x5b\x6b\xfd\xbe\xc4\x8a\xed\x60\x45\x85\x96\x88\xc7\xba\x33\x52\x09\x0c\x34\xc9\x36\x9f\x42\xc4\x6e\x7c\xad\x74\x9f\x2a\x54\x73\xa9\xd0\x37\x2f\x83\x39\x4e\xf2\xa3\x8d\x11\x9c\x44\x08\xf8\x79\x35\x05\x98\x2e\x30\xe4\x42\xc5\xbe\xf5\xa2\x24\x4c\xd1\x02\x57\x41\x47\xf5\x25\x31\xe3\x62\x4a\xcb\x92\x00\xb4\x1d\x0a\x42\x80\xc9\x19\x69\xe9\x82\xea\xda\x35\x10\x60\x40\xba\x8d\xf5\xfe\x87\xeb\x1b\x88\x61\xf6\xf5\xbd\xce\xe6\x8f\x53\x8d\xee\xf4\x10\x94\x16\x0a\xe1\x7e\x36\xea\x6c\xaf\xa5\xaf\x03\xd2\xa7\xc7\xa3\x77\x4a\xe0\xe8\x59\xf0\xfb\x75\x39\x42\xb5\xca\xc6\xca\xe8\x84\xc7\x3d\xc0\xf1\x99\x8d\xbf\x23\xec\x9d\x69\x7c\x1f\xd0\x5c\xd7\x3e\x37\x52\x6f\x6c\x6c\x33\x23\xf1\x2d\x61\x5a\x94\xad\x2f\xfc\xcc\x73\x68\x51\x01\xee\xae\x14\x6a\x28\x38\xcd\x58\x51\xa9\x4f\xb3\xb9\x18\x21\xdc\xd4\x70\x5b\xc1\xcd\xe3\x9e\x5f\xd8\xcd\xf9\x42\x5f\xd6\x4e\xd8\xa7\x71\x5a\x67\x08\x7c\x66\xf0\x8e\xe8\x59\x3d\xe3\x65\x8a\x8f\x6b\x05\xee\xe0\x95\x1e\x93\x32\x03\xf7\x6d\x69\x74\x1e\x50\x78\xf4\xba\xf6\x57\xf5\xeb\xc0\x39\xe8\x33\x89\x15\x8f\xf7\x77\xe5\xc1\x3a\xb8\x6e\xec\x57\x08\xbb\xb7\x29\x04\xa9\xcc\x75\xbc\xa0\x0d\x9a\x12\x75\x4f\x08\xdb\xac\xa7\x95\xe4\x50\x1e\x39\x47\x4d\x62\x27\x3a\x68\xa8\x81\xd8\x1e\xa3\x49\xef\x98\xc3\xe5\x9e\xce\xec\x76\xc1\xbe\x5b\x15\x51\x60\x78\x39\x31\xe3\x44\xd8\x86\xb1\x02\x40\x2a\x0d\xce\xe5\x07\x4b\xc0\xda\x58\x1b\x73\xf2\xf0\x2e\xb9\x4a\x1b\x61\xf2\xd0\xb4\x7e\x67\x1d\x06\x4f\x32\xca\x4c\x48\x12\x8b\xe3\xde\xa3\x53\xd8\xbf\x6a\xed\xdc\xd9\xad\xef\x85\x73\x0f\x82\x17\x88\xef\xd4\x9d\xe3\x6d\x8a\x6f\xbf\x45\xc4\x04\xaa\x32\xd8\x15\xee\xc9\x43\x79\x99\x85\xf4\x32\x1f\xcf\x35\xca\xc6\x75\x8d\x3e\x02\x0b\x89\x63\x77\xcd\x8c\x34\x97\xa4\x68\x05\x55\x4b\x6d\x0b\x90\x87\x28\x87\x75\x8e\xb3\x72\xdd\xef\x46\x2f\xa8\xe2\xba\x88\x78\x63\x2a\x78\xac\x94\xc7\xee\x3c\x2e\x2d\x03\x5f\x71\xdc\x8e\xbe\x98\xe9\x15\x31\xee\x11\x08\x94\x00\x68\x79\xb5\x63\x2e\xe8\x62\x74\xac\x7f\xb6\xf4\x0e\x57\x5a\x0c\x77\x7f\x31\x81\x0c\xcd\xf0\x8f\x9e\x12\xd9\xae\xb0\xbc\xed\xc2\xbb\x64\xdc\xf0\xb2\x8b\xe6\x9e\xb8\xa9\x83\x8f\xc8\x83\xfa\x02\x51\xed\x20\xa5\x26\x82\xde\xd1\x8a\xcc\xc9\xb9\x2c\xb0\x51\x61\x76\x8d\x8c\x38\x7d\xa4\x5f\xb0\x33\x05\xaf\xa4\xf7\x3d\x61\x97\x9f\x0e\x4e\x98\x39\xa6\x0c\x6a\x3b\x27\x68\xab\xb6\x51\x69\x12\xe4\xa9\x92\xa8\xc1\x42\xef\x42\x97\x08\x6f\xe2\x19\x53\xce\x2b\x5b\x0c\xa8\x5a\x76\xfd\xa2\xf1\x10\x56\x70\xa0\xf3\x5f\x18\xb9\xff\x45\xf7\x42\xa2\x59\x85\xe7\x5d\x3c\x45\x5f\x6c\xab\xfa\x64\x72\x6e\xfe\xa3\x13\x0d\x95\x6e\x5a\x7d\x8f\xdd\xe3\xa5\xec\x58\x0b\x42\xb7\x7b\xfc\x8d\xf2\xea\x08\xe4\x09\x96\xc8\xb7\x1d\x17\xef\xd1\xcf\x37\x47\xe0\xdc\x3f\x3b\x9d\xfc\x72\xfd\xb7\xeb\x5f\x4e\x5f\xbf\xbf\xb8\x8c\x7e\xd9\x25\x57\xc4\x40\x5b\x82\xa0\x6e\xe1\xd3\x69\xf4\x2a\xf8\x8c\xac\x63\x2e\x8f\x01\xb7\x0a\x94\xb9\xac\xe4\xf7\x89\xe0\x7e\xbd\xa7\x08\x8e\xf3\x9e\xe0\xa6\x39\x15\x35\x17\x13\xc1\x67\xb4\x8a\xd6\xf8\x73\x9d\xe0\x95\xee\x38\x98\xef\xa9\xfd\xb8\xbb\x6e\x0c\x8b\xe3\x7a\x36\x49\x70\x65\x50\xe0\x0a\xd4\xaf\x89\x87\x15\xad\x86\xf3\x0f\xe4\x6a\x17\xe3\x0f\xd1\x4e\xf7\xcc\xce\x39\xb2\x74\x37\x22\xff\x3c\x87\x6b\xa0\xe2\x05\xae\xa0\x4a\x74\xda\xc6\x47\x99\x0d\x93\xd5\x7e\x05\x9c\x1e\xd8\x6d\x67\x54\x71\x5c\x9a\x18\x96\x11\xfe\x25\x71\xb5\xcb\x9c\xda\x05\x59\x0b\x49\x1d\xb9\x31\x7c\x0a\xd0\x9e\x23\x21\x69\x04\xf1\x5a\xcd\x4a\xf3\xdc\x94\x6c\x4b\x6a\xf2\x7d\x3f\x07\xc4\x8e\xb2\x47\x97\x95\x7a\xe6\x7c\x33\xf6\x80\xd1\x19\xf8\x53\xc0\xcf\xa9\x0d\xf5\x65\x63\x1c\x9c\xef\xdc\x32\x24\x94\x97\xcd\x64\x3c\xc3\x4b\xf6\x64\x77\x9a\xf9\xf1\x3b\xd2\x24\x83\xdf\x52\x3d\x83\xb3\x4e\x48\xbb\x6d\xe3\x74\x10\x93\x11\x9e\xb8\x1f\x7f\x84\x42\xe6\x4e\xfe\x67\x70\x4e\xf9\x25\x46\xe3\xe0\x68\x35\x82\x8c\xd7\x8f\x57\xaa\xbd\x7f\xd5\x32\x45\x6b\xe2\x18\x46\xc7\x2b\x3a\x91\x30\xbf\x3e\x90\xbe\x9e\x4f\x96\x8d\x8e\xd0\x0f\x0c\xce\x2b\x23\x25\x1a\x23\xc6\xbb\x25\x22\x6c\xc6\x45\x01\x8e\x87\x9d\x6e\xf0\x02\x37\x78\x4a\x2b\x9a\x22\xcc\x73\x6d\x70\x28\x8f\x19\xf4\x07\x30\x40\x65\x79\x52\x0a\xde\x98\x9b\xd8\x51\x7f\xa5\x67\x65\xf6\x29\x66\xc2\x4a\x4e\xd6\x13\xd5\xeb\xc8\x5c\x60\xa6\x3a\xfc\xde\xda\xc6\xf9\x77\xd4\x41\x72\x28\x01\xb8\xcc\x57\x68\xf6\xb4\xd4\x32\x23\x5c\xb6\xe4\x73\xb5\x6f\x45\x6b\xce\xdc\xe0\x02\x8e\x19\x34\xf9\x70\x7d\xf1\x7f\x56\xce\x4d\xbc\x6a\x67\x9e\xfd\x2e\x59\xa1\xe5\x41\xb6\x6d\x73\x65\xeb\x7c\x0f\x1b\xe7\xeb\xde\x38\xde\x41\xb4\x73\xbe\xed\xab\x36\x8c\x38\x53\x16\x74\x0d\xd5\x49\xba\xce\xc4\x53\x53\xf6\xdf\x1a\x02\x74\x05\x41\xfa\x2b\x4c\x51\x80\x4b\x07\xde\x5a\xc5\x4d\x29\x6b\xab\x76\xa5\x95\x62\x08\x6f\xd7\x19\xae\xe4\x97\x7a\x45\xa6\xb8\x76\x1a\xc1\x8b\xf7\xbc\x65\x79\x08\xbc\x13\x76\x9c\xef\x08\x2a\x09\xe3\xca\x7a\x53\xc0\x96\xe0\x33\xf8\x2d\x32\x39\x6b\x41\x6d\x8e\x9e\x9e\x93\xa0\x66\xdd\x04\xaa\x95\xc7\xaf\x38\x3d\xdc\xd8\x2f\xad\x5c\x03\x46\x5a\xbd\xaa\x4b\x61\x9b\x25\x20\x19\x04\xc1\xa5\x01\xd2\x60\xb5\x30\xa4\xf1\x35\x96\xb7\xa4\x34\x1f\x24\x12\x66\x7a\x72\x4c\x80\xc2\xb9\x99\xbe\xd1\x93\xeb\x38\x4b\xc0\x21\x6c\x40\xb6\xc0\xa0\x99\x62\x8a\xed\xf4\x34\x24\x08\x76\xbd\x08\x1f\x58\xb5\xbc\xe2\x5c\x7d\xef\x6b\xe2\xef\xfa\x64\xfc\xd5\x43\x61\x43\x27\x26\xf8\xa5\x31\x74\x79\x0c\x1b\x07\xe4\x62\x50\xc9\x3f\x55\x2c\xea\x05\xf9\x77\x95\x8a\xa2\x65\xa7\xf2\x8d\xe0\x6d\xb4\x0e\x97\xd3\xde\x7c\x73\xf1\x1a\x2e\xbe\xd6\x72\x2a\x33\x25\x96\x0d\xa7\x4c\x39\x8f\x57\xc6\xa0\xcd\x0f\x96\xbd\x3a\x94\x6c\xc9\x44\xb5\x08\xbd\xc7\x4b\x84\x2b\xc9\xbd\x4b\x8d\x6d\x0a\xb7\xba\x58\xae\xfe\xf5\x94\xab\xc5\x5a\x10\x37\x36\x75\x47\x3f\xeb\xed\x8d\x02\x6a\xe6\x0e\x10\x43\xd9\x5a\xb3\x0a\x58\x5d\x1a\x41\x0a\x52\x12\x56\x7c\xa9\x27\x62\xd7\x4c\xc1\x70\xaa\x2e\x39\xd3\xe2\x75\xd7\xe7\xea\xc2\xfb\x27\xed\x6a\x84\xa7\x08\x5c\xd9\x36\x88\x88\x81\x55\x1b\x84\x6b\x2b\x53\x90\xa7\x17\x33\x88\x7a\x9a\x4d\xf7\x97\x76\x4a\x2a\xbd\xd8\xb4\xaa\x1c\xda\xde\x40\x13\x68\x8d\xe7\x04\x61\xe5\x0f\xa1\xe2\x88\x30\xd9\x0a\xbb\x6f\x22\xb3\xaa\xf4\xe3\x13\xc2\xec\xd0\x7e\xb8\x78\x8d\x5e\xa2\x43\x3d\x36\x83\x18\x9c\x61\x5a\x01\x51\xb7\xc3\xea\x86\x36\xc0\xcc\xe5\x94\x25\x4d\x01\xc8\x11\xc4\x85\xb9\x5a\x46\x88\x71\x24\xdb\x62\x11\x64\x1c\x78\x8f\xb0\xad\xda\x94\x44\x44\x32\x88\x9d\x7c\xf7\xe1\x0f\x92\x44\x43\x64\x73\x5e\x87\x3f\x3c\xe3\x75\x18\x9a\x88\xfa\xf8\xf7\x17\xcc\x9c\xd5\x9a\x28\x5c\x62\x85\xed\x35\xe9\xbe\x30\xec\xda\xe1\xb2\x4c\xb8\x2c\x25\x79\x47\x59\xfb\x60\xea\xa2\xec\x45\xd8\xe3\xfa\x1c\x7a\x84\x0a\xb7\xd0\x3c\x88\xdb\xb9\x08\x45\x86\x14\x8d\x8b\xde\x31\x1a\x3d\x62\x75\xc3\x2d\x81\x0d\xf7\x26\x64\x51\x62\x56\xf2\x7a\xad\x93\x33\x2e\x10\xc1\xc5\x22\xba\x37\x01\x6a\x64\x38\x98\xf6\xf9\xf7\x0e\x08\x41\xfa\x6a\x36\xdf\xfe\x3b\x48\x86\xa5\xd2\xef\x5c\x93\x1d\x5b\xe1\x29\xa9\x2c\x2d\xae\xe1\x4a\xcf\x78\xc2\x32\xf9\xc0\x05\xcf\x08\x89\xb9\xe2\x06\xc9\x85\xfd\x44\xe8\xd7\x7f\x11\xf3\x90\x15\x7c\x71\x63\xd1\x25\xdd\x3c\x80\x0f\xf4\x4b\x98\x87\x36\x41\x41\x44\xab\xf3\xa0\xb5\xcd\xfe\x3c\x80\xfe\xb5\xef\xf3\x20\x49\x51\xf0\xba\xd9\x13\xa4\xe4\x8d\x41\xe1\xeb\x1e\x7d\x2e\x2a\xb2\xff\x65\x9c\x04\x77\xb6\xd5\xae\xb0\x32\xf7\xa0\x2b\x79\xf5\xbf\x83\xeb\x1c\xa4\xdd\xea\x1d\x6f\x5b\x4f\x46\x64\xfa\x16\xed\x0b\xff\x1d\x6f\xbc\x01\x86\xd9\x7b\x9e\x1d\x86\x19\x30\xe6\x63\x70\xcf\xf7\x20\x91\x5f\x03\x18\x53\x1b\x01\x30\xaf\x84\x01\x0b\x50\x83\xd5\x62\x64\x33\x56\xef\x88\x13\xcf\xb7\xc6\xe3\x75\x00\x12\xc7\x75\xc8\x89\x9b\x0e\xb3\x6a\x98\xf4\xb3\x62\x37\x37\xe1\x35\xcd\x77\x2e\x3f\xdc\x84\x3c\xfa\x98\x2d\x0d\x47\x64\x02\xab\x99\x79\xf6\x4f\xad\x78\x4a\x4c\xe7\xea\x2a\x3e\x35\xa4\x33\xe9\x7d\x9b\x11\x9d\xcf\x77\x4a\x3f\x0f\xe5\xb9\x8a\xf1\xcc\xda\x85\x55\xc0\xe7\x7a\x1b\x19\x56\x2e\xf9\x08\xd8\xab\x73\x8f\x1c\x20\x7f\x35\x3d\x72\x56\x76\xe1\x48\x0b\x65\xe8\x04\xc1\x55\x95\x05\x93\xb0\xc9\x0b\xe2\x4e\x81\xa7\x92\x5f\xf7\x06\xf4\x6b\x9a\xa6\xb4\xfe\x09\x0f\xc6\x97\xed\x89\xa8\xb4\x45\xf1\x85\xfb\x21\xe6\xb5\xc4\x67\x82\x94\x06\x27\x75\xdd\x90\x62\x5f\x6e\x8b\x37\xef\xaf\x4f\xfb\x3d\x03\x5d\xd8\x16\xce\x20\xf0\x7b\x84\xcb\x9a\x4a\x09\x01\x1f\x32\x5d\x70\x7e\x9b\xd4\xe4\xa1\x4b\xb5\x9d\x53\xb5\x68\xa7\xc7\x05\xaf\x83\xac\xdb\xb1\xa4\x73\x79\x62\x25\xca\x58\x4f\xdc\x11\xa2\xac\xf2\x99\xca\xe0\x2d\x04\x2e\xb0\x78\x2a\xb9\x70\xf0\xa8\xf0\xa3\x87\xad\x07\xf9\x29\x1e\x9a\xbd\x3e\x3d\x50\xdd\x04\x36\xef\xce\xb5\x8e\xf5\x5d\x95\x56\x6d\x70\x65\x67\x3d\x32\xf6\xb0\x52\x87\x8d\xe2\x6c\x9c\x47\x63\xbc\xee\x7c\x92\xac\xd2\x5f\x10\x99\x84\x80\xcd\x79\xe6\xde\x76\x5d\x0a\xb9\xf4\xe8\xac\xc7\x08\xd5\xcf\xb9\x87\xf0\xf6\x81\xfe\x4b\x07\xcb\x3c\xc8\x55\x5c\xe6\xb4\xaa\xf4\x42\x62\x4b\xbc\x16\xa0\x3b\xc1\x34\xe9\x33\xda\x19\xce\x5d\x6d\x2c\x84\xa3\x80\x8b\x24\x4d\x28\x18\xde\x33\x7d\x19\x58\xce\x0c\xbd\x81\xa0\x6d\x8c\x6a\xfa\xa0\x7b\x18\xb6\xd8\x27\x89\x85\xc0\xff\xe6\x5f\x27\x14\xb0\x46\x00\x3e\xf0\x9c\xe9\x23\xbd\x42\x61\x23\x2e\x39\x5a\xe9\x6b\x4b\xff\xe2\x92\x28\x6d\xa8\x99\x79\x0b\xa3\x0f\xda\xb0\x12\x6d\x86\xc3\x90\x12\x19\x46\x61\x74\x38\xab\xa4\x48\x3c\x0f\x10\x29\xb6\x7d\xd2\x3a\x88\x53\xde\x9e\x2b\x72\x8c\x36\xa4\xef\x3c\x5b\x04\x19\x7d\x7e\x14\xf9\x09\x63\x55\x68\x5f\xe2\x55\x89\x52\x3f\xe4\xfa\xdd\x19\xcf\x4a\xc8\x37\x4c\xd7\xc1\x4b\x13\x5e\xae\xd1\x10\x03\x99\x31\xc5\x55\x7c\x21\xd7\x8b\x59\x48\xdd\xc9\xb8\x75\x8f\x98\x0a\xe2\x06\xa7\xff\x40\x8a\x56\x91\xd2\xb2\x91\x5b\x97\xb2\x61\x32\xee\xf7\x26\xba\x07\x2e\x49\x7f\x4a\x00\xa0\x24\x47\x5d\x29\x36\x6b\xeb\x78\x7e\xd7\x11\xfa\xbf\x20\x25\xa5\x23\xd4\xaa\xe8\x1d\x61\x44\xca\x89\xff\xf3\xd8\xa9\x00\x1c\x75\x81\x99\xb3\xad\xf4\x99\xb6\x1e\x6e\xcb\x3a\x6e\x79\x3c\xa6\x04\x35\x58\xe0\x5a\xdf\xc1\x12\xd9\xe5\x99\x92\x39\x35\x69\x81\xc1\xa5\xe8\x69\xcb\xe3\x48\x75\xc1\xb0\xa1\x0a\xd5\x74\xbe\x30\xa7\x05\x61\x54\x71\x36\x47\x0e\x37\x56\x71\x5c\x22\x10\x2c\x5c\xa0\x7b\x2c\x6a\xad\x0b\xe0\x62\x01\x20\x34\xcc\x50\xd9\xea\xf3\x80\x80\x64\x7b\x39\x96\x0a\x2b\x62\xc9\xf0\xa2\x7d\x70\x6e\x9a\x76\x50\x22\xf6\xa9\xcb\xdf\xef\x98\x4f\x47\x9f\xb4\x2c\x5e\x90\xf3\x07\x52\xf8\x63\x6d\x18\xa7\xeb\x1a\x08\x03\xb9\x3b\xce\x8e\x2d\x2e\x59\x19\xdc\x13\x53\xd9\x8e\x70\x5f\x74\x93\x33\x3b\xe1\xd4\x59\x9f\xe6\x47\x6d\x8f\xf6\x17\x41\xba\x20\x56\x50\x34\x09\xd8\xb1\xb9\xb8\xd5\x27\xd7\x70\x04\x71\xe1\xab\xf5\x27\x75\xcb\xf5\x03\x28\xb3\x39\x57\xe8\xf0\xe0\xe4\xe0\x68\x6d\x2f\x1c\xc8\x30\xcd\xc0\x64\x44\x77\x03\x92\xb4\x6e\xaa\x25\x8c\xe1\xc0\x94\xfc\x4e\x24\x30\x74\x80\x55\x5f\xfe\x52\x2e\x48\x55\x8d\x90\xd4\xea\x2f\x76\x35\x44\xcc\xa7\xfa\x4b\x4a\xb4\x85\x71\x93\x1d\x1e\xfc\x7a\x30\x42\x44\x15\x47\xe8\x9e\xb3\x03\x65\x02\x1e\xe8\x06\x6c\xc8\xa4\x3e\xf9\x4e\x2c\x79\x8b\x18\x21\xf6\xec\xf8\x62\x55\x05\xd6\xe6\x4f\x6b\x74\x74\x43\xba\x41\xaa\x2a\x4d\x9f\x3b\x7f\xa0\x4a\xab\x22\xaa\x05\x37\xc5\x4b\x63\x29\x10\xe0\xa1\xc7\x12\x6e\xba\x93\x05\xc1\x95\x5a\x2c\xbd\xf5\xf2\x2f\x22\x38\xd4\x27\x65\xf6\x37\xe9\x3a\xd4\x1e\xa4\x8d\xee\x6f\x02\xa7\x56\x30\x5a\x41\x6e\x16\x82\xc8\x05\xaf\x76\x9e\xc6\xf9\xde\x96\x7b\x2b\x38\x93\x5a\xa6\x68\x13\xdb\xf6\x51\xfa\x0c\x3a\xa3\xb3\xd8\xfa\x0a\x1c\x4e\x99\x20\xa5\x55\x96\x6c\xc9\x8b\x05\xbe\x03\x4d\x41\xeb\x73\xa4\x4c\x31\x4d\x42\x9b\xe8\xf7\xc7\xbe\x87\x3e\xed\xee\xd5\x9e\xc0\x36\x23\xb9\x23\xe7\xa2\xc9\x73\x4b\xbf\xb9\x9a\x9c\xf5\x6e\x69\xf8\xe0\x2d\x1c\xe3\xb3\x05\x29\x6e\xaf\xd2\xaa\xb9\xee\x09\xb4\xa0\xe1\x62\x97\x8a\x81\x6e\x3e\x9b\x56\x30\xe1\x42\x21\xd6\xd6\x53\x22\x9c\x43\x61\x0e\xab\x48\xc4\x1d\x2d\xc8\x31\xba\x34\xbf\x73\xc1\x79\x57\x7d\x18\xb3\x39\x41\xaf\xf4\x81\xf8\xe3\xb7\xdf\xfe\xfe\xdb\x74\x19\x9d\x4e\xa4\x9a\x87\x44\xd5\x0e\x7c\x5f\xd4\xae\x6b\xd3\x9d\x4d\xce\x66\xdb\x53\x30\xea\x2a\x5c\xf8\xb5\x99\x6f\x3e\x74\x69\x5e\x49\x49\x08\xda\x10\xae\xd0\xa2\xc3\xfc\x67\x5a\xf1\xe9\x49\x8d\xa5\x22\x42\xdb\x38\xf6\x5a\x1f\x03\xdd\x30\x65\xf3\xe3\xba\x3c\x3a\x4e\x8b\x82\x3b\xb3\x7a\xad\xa4\x5c\x8f\x66\xe6\x91\xf2\x70\x7a\x52\x76\xee\x82\x47\xae\x97\xdf\xa1\x17\x71\xd5\xc4\xf4\x12\xbc\x21\x79\x32\xd1\xde\xde\xdc\x4c\xde\x10\x15\x0a\x6c\x06\x1f\xa2\x37\xe7\x37\xbe\xdc\xb8\xde\x5d\x26\xa9\x69\x90\xda\x29\x52\x7b\xc1\xd3\xea\xcd\xe7\x8e\xbb\x18\x51\x02\xb5\xd1\x18\x23\x85\x5e\xe8\x51\xaf\xb2\xad\xc3\x21\x5e\x4c\x8e\xd1\xdf\x78\x0b\x2a\x17\x9e\x56\x4b\x74\x8f\x0d\xa3\x41\x1c\xa5\x74\xf7\xbc\xd0\xdd\x78\xa1\xa5\x96\xde\xd5\x6f\x09\x2e\x4d\xad\x4a\x70\xed\xec\xfc\xac\x06\x7d\xca\xb6\x6c\x67\xad\x54\xbc\x46\x0b\x3b\x54\x33\x87\x5d\x41\x7f\xa3\x1b\x99\x23\x08\xb1\x1f\x89\x04\x69\x8c\xb5\x64\xff\xe6\xab\xb0\x85\xd6\xa4\x90\x99\xe7\xa0\x1a\x10\x46\x45\x38\x55\x56\xd1\x07\x17\x26\xb5\x32\x2a\xda\x25\xd6\x3d\x59\xaa\x8a\xa0\x4c\x95\x45\x10\x08\x29\x7d\x28\x93\x5f\x92\x1e\x84\xcc\x53\xa3\x44\x3f\x2c\x31\xbc\x66\x9e\xbc\x15\x12\x90\x0d\xb5\xd9\xcd\x65\x00\x38\xba\xa3\xa9\xac\x84\xc8\x39\x93\x7d\x01\x55\xcc\x38\xa3\x85\x09\x67\xa0\xb6\xe1\x0c\xf1\x56\x35\xad\x02\x57\x50\x81\x25\x19\xdf\x61\x41\xb5\x40\xd5\xed\x77\x7f\xd8\x32\x7d\xda\x15\xe7\xe0\x27\xf1\x41\x67\xd3\xe3\xf4\x6e\x66\xd2\x66\x90\x2b\x80\x91\x79\x85\xd7\x16\x27\x7d\x47\xa3\xbd\xf6\xc1\x20\x53\x43\x7c\x91\xcf\xac\xc3\x6a\x01\xc8\x3e\x88\x65\x39\x60\x28\x08\x4e\x6d\x36\xec\x41\xe2\x4d\x56\x2b\x36\x51\x24\x40\xbc\x9d\x8b\x15\x3b\x58\xf7\x70\x7d\x0e\x33\x61\x4d\x9e\xde\xac\xb6\xc3\x72\x2d\x60\x86\x2e\x4e\x2f\x4f\x7f\xb9\xfe\xf1\xec\x97\xcb\xd3\xf7\xe7\x29\xaf\x4e\xae\x1d\x9f\xb3\x7a\x7c\xb6\xfa\xf1\x4f\x50\x41\xde\x3d\xb2\x58\x90\xfd\x81\x99\x5c\x43\x6f\x42\x52\x32\x6b\x03\x04\xf5\x90\xd3\x58\xea\xd0\x8a\xd3\x54\x0b\x9e\x9d\x4a\x1c\x8b\x2a\x78\x4d\x2a\xbc\xbc\x26\x05\x67\xe5\xce\xd1\xd9\x97\x5e\xd8\x48\xd3\x21\x5f\x06\x9a\xac\x30\x66\xb9\x42\xb0\xb6\x78\xb5\xc3\x07\x84\x90\x06\x33\xbe\xe8\xa8\x35\xda\xbf\xc8\x35\xda\x1b\xf7\x78\x43\x04\x05\x44\xd0\x3e\xec\x9a\xb7\xfc\xde\x56\x74\x3f\xa4\xcc\xed\x9c\xa3\xc0\x4b\xd3\x85\x47\xd2\xd9\xd4\x14\x47\xaf\x5e\xba\x46\xbe\xbe\xb8\x87\x45\xfa\xec\x75\xe4\xcb\xf6\xf1\xd3\xa1\xaf\x0e\xb6\xd4\x0f\x7f\xa5\xe0\x87\xd0\x8a\x18\x7f\x75\xec\xf3\xd4\x5e\x41\x7f\xbc\x28\xc2\xac\x74\x90\xb3\xaf\x6f\x9f\xa8\xa2\xb9\xe6\xc5\x6d\x26\xb7\xeb\xcd\xd9\xc4\xbc\x6d\x05\xcf\x62\x6e\x60\xad\x65\x72\x84\xf5\xb7\x40\x01\x1d\x9c\xae\x7b\xe3\x74\x3d\x30\x69\x5d\xb8\xfa\x6e\x6b\x07\xea\xc1\x60\x6d\x75\x8f\x53\x7c\x44\xbf\x02\xca\x60\x6d\x3d\xf2\x0c\xd6\xd6\x16\x8f\x49\x22\x01\x30\xe8\x1b\x81\x0b\x32\xd9\x27\xe5\xcd\x09\x10\x54\xb6\xc2\x96\x95\xf3\x3a\x9c\x17\x17\x8c\x90\xd2\xc8\x0f\x3b\x14\x82\xe6\x7a\x24\x06\x1e\x0d\x3e\xc4\x0e\x58\xdc\x8a\x04\x35\xef\x66\x61\x5f\x6d\x55\x5c\x17\x64\xde\xd4\xbb\xce\x36\x69\x3c\x19\xba\xab\x1a\x62\x8f\x93\xee\x3c\x94\x5a\x27\x2c\xde\x9d\x8e\xc3\x15\x44\x92\xce\xf5\x74\xd9\xca\xd0\x06\x23\xec\x4b\xef\x75\x1d\xd1\xad\xce\xb8\x28\xe8\xb4\x5a\xa2\x05\xae\xb4\xb1\x74\x4f\xd5\x02\x61\x74\x4b\xab\xca\xbe\x26\x7e\xa2\xae\x89\xcd\xd5\x34\x1a\x4d\xc5\xd9\x1c\x26\x03\xdb\x9c\x8c\x87\x86\x14\xba\xcd\xa2\x22\x98\xb5\x8d\xe9\xa7\xd6\x8f\x96\xbc\xcd\x90\x96\xe1\x02\xdf\x5e\x9f\x62\xd4\xd2\x8f\x98\xc2\x6d\x1f\xdd\xf3\xfd\xe4\x5a\xf4\x41\x2d\x88\xb8\xa7\x92\x98\x42\x72\xd1\x7d\x32\x7d\xe9\x97\x91\x33\x9f\x79\x0a\x15\x9b\x39\xa8\xb7\x05\xa4\xb2\x46\xb7\xf5\x23\xbc\xd7\x89\x56\xc6\xd9\x98\x91\xb9\x21\x6a\xb0\x02\xcd\x20\x3a\x4d\xfb\x06\x3f\xe8\xb3\x0d\xa4\xe2\x0d\xa2\x75\x4d\x4a\x6d\x1f\x57\x4b\x74\x47\x71\x74\x4f\x80\x14\xa2\xdb\x51\xe8\x90\x71\xc4\x1b\x7d\x75\xb5\x8c\xaa\x25\x44\xf4\x16\xad\x42\x25\xbf\x67\x09\xf9\x56\x37\x16\xe6\x80\xd1\x94\x28\x6c\x7d\xe0\xfa\x10\x78\x4e\x74\xa0\x3b\xd7\x67\x0f\x92\x04\x6e\x36\x6e\x00\x4f\x93\x3e\xc7\x2a\x41\x4a\x6c\xd0\xe6\xcd\x7a\x7e\x7c\xdb\x51\x69\xe3\x75\x89\x3c\xcc\xfb\xc1\x6c\xa8\x4f\x34\x6f\xd5\x9e\xdc\x23\x8f\xb9\x8e\x0c\xc5\x45\x60\x24\xd2\x9a\x48\xc4\xdb\x4c\xf5\x26\x5e\xd9\xe6\x72\x5a\x78\x83\xdf\x69\xe3\x23\x55\x49\xa3\xaa\x0e\xe7\xd8\x62\x8f\x90\xf7\xdb\x3c\xdc\x80\xbf\x72\xda\xce\x66\x44\xc0\x4d\x07\x1d\x5e\x83\xdd\xfb\x3a\x5e\xee\x0e\x8b\x73\xde\x5a\xc0\x17\x51\x23\xa8\x1d\x60\xc9\x24\x1e\x69\xd2\x92\x6c\x42\x99\x5e\x41\x24\x70\xc1\x33\x74\xfe\xe1\xfb\xb8\x2d\x9a\xa3\xb2\x40\x5a\xca\x2a\x8c\xf3\x03\x8b\xc3\x24\xe6\xdd\x0f\x9b\x58\x5f\xec\xb6\x28\x2a\x2e\x6d\x7a\x34\xac\x4b\xb1\xc0\x8c\x11\xe7\x8c\xa2\x0a\x3c\xd9\x53\x42\x18\xe2\x0d\x31\xa0\xbc\xa8\xce\x60\x24\x29\x9b\x57\x04\x61\xa5\x70\xb1\x38\xd6\xbd\x63\x6e\x2f\x74\x79\xc8\xf6\x13\xa9\x04\xc1\xb5\xd9\x13\x82\xd4\x98\x9a\xe6\x11\x2e\x04\x97\x12\xd5\x6d\xa5\x68\xe3\x5f\x16\xe7\x45\x24\xc0\x08\x21\x4d\x5a\xaa\x5b\x2b\x48\x2b\xe9\x12\x9e\x47\x5d\x0f\xed\xf0\x79\x58\xac\x08\x5c\x67\x23\xfd\x5b\x52\x37\x6a\xe9\x13\x13\xe3\x6c\xa0\x19\x15\x52\xa1\xa2\xa2\x84\x29\x3b\x32\x43\x39\x08\x7d\x18\x39\x75\x9a\xd9\x19\x91\x76\x4a\x58\x09\xc6\x77\xa3\xa4\xc9\xbf\xf3\x9d\x70\xaf\x2a\xa9\xb4\xbe\x0e\x19\x97\xfd\x87\x5d\x65\x1a\xb3\x71\xdc\x8c\xc0\xd6\x71\x0a\x8e\xe9\x91\xfd\x28\xe8\x42\x50\x67\xbb\xcb\x9d\x4c\x93\x2b\x50\x3e\xc6\x9d\xeb\x51\x8f\x73\xa0\xb3\x2d\x20\x15\x66\x4d\xea\xc0\x86\x62\xe4\x4e\x9f\x03\x52\x10\xad\x8a\xe2\x8c\x42\xe6\xd9\x65\x4c\xa0\xcb\xbd\x27\x52\xe2\x39\x99\x44\xc2\x11\x72\x08\x9c\xce\xd1\x06\x38\x86\x6e\xdb\x2c\x88\x21\xba\x52\x3c\xf8\x24\x4c\xf2\x0a\x8d\xc7\xda\x0c\x24\xaa\x07\xce\x68\xba\x17\x54\x29\x02\xbb\x14\x2a\x39\x01\x00\x6d\x95\xbc\xb3\x9f\x5c\x16\xd5\x9e\x9d\xf4\xb0\x3d\xad\x7e\xb0\xd2\xa4\x69\x4d\x09\x9a\x0a\x4a\x66\x68\x46\x21\x6f\x0c\x32\xaa\x46\xa6\x0a\x01\x06\xdc\x2e\x96\x92\x08\x18\xb6\x75\x0b\xb8\xe1\xc7\xf5\xe7\xaf\x76\xfc\x4a\xb4\xac\xc0\x41\x89\x4e\xe0\x16\xa3\x33\x34\x87\x2c\x2e\x6b\x04\xff\xe1\xe5\x7f\xfe\x11\x4d\x97\x5a\x5f\x03\x43\x4c\x71\x85\x2b\xd7\x01\x54\x11\x36\xd7\xab\x08\x22\x37\x4e\x6e\xf4\xf8\xa9\xfc\xe2\x54\xb4\xa6\xca\x4c\xd0\xab\x6f\x6e\xa7\x49\x47\x0f\xe4\xe3\x49\x49\xee\x4e\x82\x2d\x34\xae\xf8\x3c\xee\xad\x67\x39\xb2\x89\x93\xfc\x6c\x1b\x4e\x34\xaf\x68\xb1\xdc\xd5\x99\x76\xc5\x4b\xd0\x82\xdf\x1b\x67\xce\xfa\x51\x0d\xa8\x5e\x1a\xde\xb4\x15\x4c\x1c\xfa\xde\xf3\xf3\xb5\x92\xac\x52\x1f\xa5\x3a\x09\x03\x69\x07\x41\x54\xdb\xec\xca\x9d\x63\x53\x18\x5d\x37\xb9\x25\x9e\xb0\x31\x37\x5f\x87\x24\xda\x1b\xf7\x3d\xae\xaa\x29\x2e\x6e\x6f\xf8\x3b\x3e\x97\x1f\xd8\xb9\x10\x5c\xf4\xc7\x5c\x61\x7d\xa7\x2f\x5a\x76\x0b\x55\x74\x3b\x32\x5a\x3e\xb7\x98\x42\xc7\x1f\x10\x8c\x2e\xaa\x33\x6e\x94\x86\x1e\xd4\xa9\x24\xce\x07\xd7\xb5\x4c\x1e\x68\xe7\x68\x63\x88\xe8\x3e\xc7\x26\xe0\x93\xde\x38\x64\x78\xb4\xbf\x79\xf9\x87\x3f\x19\xe1\x82\xb8\x40\x7f\x7a\x09\x29\xc7\x72\x64\x2e\x00\xb8\x81\xb5\xaa\x55\xe3\xaa\x8a\x8d\x12\x84\x22\xe0\xfb\xe8\xe2\xd4\x7b\x70\xe4\xd5\xce\x4e\xf7\x67\x9b\x8c\x37\x37\x7f\x03\x7b\x91\x2a\x49\xaa\xd9\xc8\xb0\xbd\x78\xb7\xd6\x01\x68\x57\x07\xf6\xca\x8b\x67\x0a\xda\xbd\xd1\x76\xc7\xab\xb6\x26\xaf\xc9\x1d\x2d\xe2\x02\x98\xbd\x55\xe9\xbd\xcd\xb9\xe9\x2b\x2a\x81\x04\x68\x5a\xf1\xe2\x16\x95\xf6\x97\x01\x54\x7e\xb5\xaa\x76\xfc\x2c\xc4\x26\x0d\x24\x24\x0b\x3c\x3a\xfe\x5e\x9a\x40\x8d\x9b\xc6\x33\x94\x08\x7c\xdf\x9b\x0c\x10\x4d\xc0\x8e\x9a\x18\x46\x4c\x0e\xa6\xa7\x86\xd2\xc7\x76\x44\xfa\x9a\x8a\x7e\x45\x74\x6e\x41\x7a\x24\xbe\xeb\x7d\x7c\x1c\xb3\xb7\x21\xba\x17\xba\xd3\xd0\xc0\xbf\x0d\xdf\xc2\x1a\x33\x96\xa7\x1c\xf2\x1b\xc3\x68\x90\x7a\xfb\xc0\x2d\x13\xef\xbe\xcc\x10\x0c\x4d\xcb\x91\xe8\xcd\x0b\xf3\x41\xe8\x1a\x2b\x6b\x1f\xb9\x28\x3b\x46\x0d\x11\x92\x4a\xad\x3a\xfd\x08\x07\xea\xac\xc2\xb4\x0e\xc2\x77\xbb\x9a\x84\x75\x44\x7d\x8d\x9b\xf1\x2d\x59\x46\x6e\xb8\xc4\xe3\xf2\x18\xc0\xbf\xc6\x4d\xe4\x3d\x00\xa5\x6b\xd3\xaf\x81\xc8\xcb\x79\xc2\x4b\xdb\x0f\xb8\x1e\x4c\x49\xe2\x27\x31\x63\x33\xea\x40\xbb\xbe\x72\x7e\xec\x16\xae\x7f\xe3\xe8\x4f\xfc\x95\x63\xbe\xf5\x35\x5d\x34\x30\xbe\x2f\xf5\x9e\xf1\x9d\xcf\x24\x4e\x93\x90\x4e\x70\x3b\xd9\x9d\xd1\xbf\x8e\x7a\x0e\x2d\x73\x32\x03\xd3\xd7\x3a\x9a\x8e\x4d\x51\x80\x84\x0e\xe8\xa3\x68\x1b\x45\x07\xdf\x1d\xec\xf4\x8e\x33\x2b\x23\x78\x83\xe7\x60\x99\xee\xc3\x02\xad\xf6\x29\xe4\xa0\x5d\xf0\x7b\xf3\x7b\x83\x2e\x69\xec\xb7\x48\xd9\x11\x99\x2f\x78\xd2\xea\x18\xe4\xa0\xdb\x11\xd6\xba\x36\x5c\x85\xf7\x78\x89\xb0\xe0\x2d\x4b\x4a\x83\x86\xc0\x88\x0f\x9c\xbd\x5f\x19\xec\x25\x67\xc4\x05\xe9\x53\x5a\xb9\xe9\x38\xcc\xa9\x34\x78\x05\xca\xd0\xab\xe3\x57\x2f\x93\xfb\x7e\x45\x8a\x56\x48\x7a\x47\xae\x6c\x8d\xf3\x20\xa8\x72\x31\x9b\x70\x29\xe9\xb4\x82\xc4\x2d\xc5\xd1\xb9\x29\x00\xbf\x3e\x50\x0f\x1c\x81\x11\x73\x11\xb2\x95\x26\xf4\xf0\xd0\x9c\xe0\x10\xf0\xa9\x1b\x48\x40\x7d\xec\x97\x26\x09\xeb\xba\xa2\x49\x5e\x7a\x4d\xd2\xdc\x7b\x3b\x1d\xab\x2b\x7c\xbf\x0f\x92\xe4\xbd\x8d\x0d\x74\x95\xed\xa9\xab\x9c\x0c\x1f\xdd\x0b\xaa\xec\xe1\xbe\xa7\x92\xa0\x43\xf0\x4a\xac\x6c\xc6\x24\x82\xe6\xd0\x87\x95\x58\x01\x3f\x07\xc1\xb2\x58\x3d\xba\xfb\xb0\x4a\xeb\xf2\xa4\x43\xe0\xdf\x5b\x07\x56\xb7\x82\x56\xfa\x77\xf7\xf2\x02\xb3\xb2\x4a\x92\x19\x7e\x56\xaa\x65\x12\x17\xce\xc5\x0c\x85\x22\xd1\xc6\x2f\x83\x6a\x12\x0b\x2c\x11\xe3\xa8\x26\x18\x00\x9a\xfa\x76\x71\x52\xb0\xc7\xd5\x9c\xaf\x0f\x66\xb3\x9b\x6b\x2c\xbc\x10\xac\xb8\x7e\x4d\xa5\x15\xcf\x5a\x8e\x58\x0b\xc4\xc0\x3a\x6a\x5c\xa6\xa4\x76\x07\x73\xda\x2d\xde\x71\x07\x9a\x5c\xed\x49\x77\x71\xac\xf4\xe5\x29\xfa\x31\xb2\x25\xc8\x75\xf3\x2d\xe0\x04\x37\xb8\xe5\x3a\x90\x4c\x52\x34\xdb\x3c\xab\xc3\xf5\xd7\xe2\xda\x58\x37\xf7\xd8\x77\x38\xa1\x0f\x9f\x1e\xea\x28\x90\x85\x0e\x23\x6a\x42\xea\xb6\x06\x8a\xcd\x78\x4c\x63\xf2\x76\x41\x09\xef\xee\x99\x13\x46\x04\xb6\x71\x05\x07\x11\xb5\xe4\x2b\x58\x72\x96\x7a\x20\x3e\xb1\xe1\xb4\xbc\xff\xb4\x9a\x62\xfe\x2c\xa1\x23\xa0\xe7\x1c\x72\xb1\x72\xda\x6d\xc4\x64\x93\xc6\x92\x73\xd4\x2b\xd4\x5c\x66\xf3\x07\x9c\x9f\x7a\x51\xfe\xd9\xd2\x3b\x5c\x11\xc3\x61\xef\x44\xc3\x4e\x95\x09\xd9\x4e\xf7\xd5\x6c\xb4\xf6\x21\x98\x1d\x9b\x41\x0f\x8f\x5a\x90\x99\xf4\x89\x17\x2f\xd0\xa1\x69\xe3\xc0\x90\xec\xee\x56\xc9\xb5\x6b\x75\xfe\xd0\x24\x54\x6e\xcd\xb7\x5e\xe7\x0f\x0d\x06\x9c\x46\xb3\x17\x0b\xf7\xdf\x64\x81\xef\x08\x70\x1a\xd3\x0a\x8b\x0a\x40\xe9\xd7\x66\xca\xd0\xb4\x55\x88\xb0\x3b\x2a\x38\xab\xf5\xf1\x03\xf2\x19\x2d\x99\x04\x01\x32\xf8\x82\x48\xf4\xdb\xc3\x1f\x4f\xaf\x20\x69\xe9\xc8\xb2\xe5\xdb\xf1\xb5\x12\xf8\x01\x56\xc6\x10\xbc\x6e\x1f\xf7\x1b\x72\x63\xd7\xdb\x05\xf4\x13\x37\x17\x7a\x6c\x75\xab\x5a\x5c\x01\xf5\x73\x51\xb5\xfa\x2e\xdc\xd9\xce\xce\xef\x03\x4f\xf1\xe4\xe5\x74\x81\x5b\xe2\xef\xd7\x34\xea\xb8\xe6\x38\xa8\x67\xc1\x7e\x5d\xa3\x21\x8f\xae\xf1\xb0\x81\x84\x72\x4d\xd1\x39\x90\x9e\x98\x32\xcc\xc3\xb1\x77\x71\x1c\x3c\x03\x4a\x27\x98\xe4\x6f\x57\x93\x74\xcd\xc3\x08\x35\x5a\x76\xee\xc3\x8f\x38\x0c\xf9\x8e\x41\x84\x23\x3a\xcf\xae\x67\xbc\x24\xdb\x57\x15\x4a\xdb\xe7\x97\xb6\xcd\x20\xf1\x89\x32\x7b\xeb\x98\xd2\xb9\x50\x90\xc4\xe4\xf8\xc9\x62\x41\xca\x36\x42\xe5\xba\x98\x19\x30\xd0\xa8\xf7\x3a\x8c\x0a\xcc\x4a\xaa\xf7\x8a\x49\x05\x30\xaf\xd7\x87\xcc\xea\xff\xae\x41\x11\xd6\x2c\xf5\x1f\x5e\x46\x30\xaf\x01\xc4\x7a\x4d\xdd\x1e\x85\x55\x7b\x2d\x61\x02\xa8\xa4\x25\x41\x53\x52\xf0\x9a\x00\x76\xb8\xe1\xcc\xe8\xe3\x8e\x52\xc1\x27\x90\x98\xc8\xb1\x19\xda\xb6\x5d\x0a\x1c\xa1\xf6\x42\x77\xc7\x48\x7a\xae\x7d\x01\x68\x31\xbd\xd6\x54\x74\xcd\xeb\x79\x34\xb0\x0d\xbf\x32\x88\x33\x84\xbb\xa2\x9d\x7a\x04\xdb\xf6\xe7\x73\x92\x69\xba\xa5\x1a\x93\x3b\x0a\xf4\x03\x27\x58\x4a\x3a\x67\xe3\x86\x97\x63\xdd\xec\xc9\x6f\xf4\x7f\xb7\x3e\x4a\x91\x02\x40\xb7\x75\x4d\x2a\x90\xcc\xcf\x7d\x7e\x5c\xbb\x66\x4f\x4b\xf7\x93\x39\x44\xce\x3a\x83\xfc\x82\x95\x85\x9b\x51\x65\xd6\x2b\x66\x99\xae\x37\xb4\x63\x3c\xae\xe6\x7d\x07\x12\x55\x78\x4a\x2a\xf9\xa9\xed\x02\x18\x87\x98\x1e\x6c\x99\x80\xe5\xae\x1d\xbc\x71\xb7\x44\x6c\x92\x88\x70\xa7\xab\x44\x87\xab\x49\x74\xcc\x30\xcf\x15\xa5\x6f\xa7\x48\xfa\x3f\xbe\x65\x97\xd3\x76\xf8\xb5\x77\x75\xea\x3d\xf4\xe1\x7a\x0d\x24\x23\x03\x20\xc8\xd6\x9b\x98\xd7\x36\xff\x9b\x95\x81\x16\x02\xd2\xd0\x04\xd0\x04\xd1\x33\x0d\x59\xd2\xb4\xe3\xf1\x86\xbc\xd0\xed\x2f\x21\x3b\x82\x55\x4f\x0b\x14\xc8\x35\x77\xc0\x8c\x57\x15\xbf\x07\xfe\x1b\xd3\x87\xc0\xfd\xb9\x3d\x8f\xcb\x58\xae\x54\xa0\xeb\xd7\x79\xce\x37\x02\xfb\xde\x51\xee\xfe\x9b\x84\x5d\xa8\x00\x7a\xf1\x3a\xfe\x8f\x2f\x26\x67\xf1\x7f\xfc\x83\x24\x62\x5b\xaf\xa2\xfd\x73\x41\x24\x6f\x45\xb1\x75\x3e\xa7\xfd\xf3\xd5\xd5\xc3\x4d\x73\x2a\x6a\x2e\x26\xa6\x86\x78\x9e\x97\x4a\xf2\x4e\x6f\x3f\xb7\x25\x32\xbd\x13\x8a\xd4\x67\xed\xe7\x4c\xbe\x11\xbc\xdd\xd6\x8a\xfb\xf8\xcb\xce\x16\x98\xb9\xfc\x82\x4c\x23\x5f\xca\x42\x55\xb1\xd3\xb8\xc0\x82\xd8\xda\xa4\x5a\xb9\x94\x0d\x2e\x32\xcd\x9e\x2f\x1b\x9a\xf1\x75\x19\xd7\x43\xb6\x4d\x53\x91\x9a\x30\x85\x2b\x78\x6d\xae\x8d\xb8\xf6\xde\x94\xc5\xee\xae\x9c\x9f\xfe\xe3\xe7\xa7\x39\x9d\x1f\x6f\x22\xc7\x59\xfd\x54\x0b\xe9\x27\xf7\xe3\x2d\x14\xb8\xc1\x53\x5a\x51\xad\xfa\x3c\xc5\xfb\x5d\x78\xfd\x8a\x73\xf5\xbd\x87\x05\x3e\x45\x4b\x8d\xa0\x77\xb4\x22\xf3\xad\x43\xab\x9f\xb7\x9d\xf4\x45\x3a\x71\x4d\x9c\xcb\x02\x57\x31\xa9\x31\x9f\x39\x12\x5e\x40\x5c\xe7\x49\x16\x24\x4d\xf4\x7c\xc6\xcb\xb7\x17\x44\xd1\x0a\x7c\x2c\x4e\x31\xc2\xa9\x13\x8f\x2a\x8c\x43\xd3\xa4\x3b\x2c\x1f\xab\x2e\x6f\xcb\x9c\xb2\x39\xea\xd5\x31\x6c\x85\x20\x4c\x55\xcb\x20\xee\x0a\xbc\x1c\x46\xf1\x06\xa5\x18\xf4\x72\xab\x5c\xc6\xb8\xf3\x4e\xbd\xbd\x65\x29\x3f\x6a\xbc\xd4\xda\x68\xe0\xce\x99\xb5\xc0\x35\x03\x06\x80\xa9\x38\x0b\x70\xab\x28\xe2\xb2\x0d\x85\x86\x78\x43\x58\xb7\x85\x4f\xac\x7b\x75\xac\xb7\x76\xaf\xf4\x90\xb1\x4e\x8f\xeb\xf2\x37\x4d\x85\xd5\x8c\x8b\x7a\xec\xbc\x28\xe3\x9e\xe5\x1a\xd1\xad\x33\x48\x83\xf7\x90\x10\x43\xfb\x64\xaa\xb3\xb3\xb2\x22\x81\x55\xea\x17\x80\x95\x26\xf6\x89\x5a\x26\x48\xc1\xe7\x0c\x0a\x01\xd8\xdf\x82\xbd\xe5\x9d\x46\x58\x6a\x8b\x10\xb1\xb6\xaa\xb6\xee\x5b\xa4\x2d\xcb\xef\x88\x58\x10\xbc\xe5\x29\x4c\xdb\xe0\x1f\x6c\x9b\x48\x90\x46\x10\x09\x13\x6a\x22\xf0\x46\xc7\xf7\x9d\x42\x58\x4a\x5e\x00\xa9\xb1\xc9\x31\x74\x74\x63\x18\x2c\xcd\x19\x17\x08\xa3\x39\xbd\x23\x0c\x5d\x99\xdd\x70\x56\xe1\xed\x69\xb6\x02\xb7\x9d\xf3\xd0\xe3\x56\x71\x9f\x7f\x8a\xb0\x42\xb8\xac\x29\x90\x3c\x18\xe2\x02\xeb\xd5\x0c\x5b\x0d\xbe\xa2\x77\xa9\xe0\x90\x8d\x88\x2e\xb6\xcd\x4f\xfd\xac\xf7\x42\x52\xa6\xc3\x11\xf8\xe9\x02\x0b\xd1\xe1\x27\x7c\xed\x74\x54\x40\xe8\xdd\x55\x97\x89\x98\x9e\xcf\xe9\x90\xe5\xd7\xd0\xd7\xc0\xa6\x46\xad\x6f\x6b\x81\xef\x0c\xda\xa2\x5b\xe2\x4a\xab\x19\xdb\xaa\x91\x92\x98\x1a\xf0\xbd\x7e\x99\xbc\x43\x17\x10\x01\x3e\x5a\xf0\xac\x75\xd1\x91\x09\x2f\xaf\x1b\x52\x8c\xba\x2d\xe8\x16\xdc\x11\x75\x38\x0e\xb1\x2d\xfb\x13\x48\x41\xe3\x51\x11\xc6\xc9\x5c\xea\xdd\x1a\x76\x32\x84\xbd\x50\xd5\x63\x25\x01\xbb\xbe\x93\x17\x06\x2b\xf1\x2f\x22\xb6\xce\x4c\xda\xe0\xcd\x9b\x53\x75\x7c\xfb\x27\x70\xe5\x11\xb6\xc0\xac\x00\x4d\x5e\x9e\xdc\x92\x46\x9e\x48\x3a\x37\x9e\xbb\x3f\xfe\xe9\x4f\xe0\xc6\x73\x8b\x73\x72\x75\x7e\xfa\xfa\xfd\xf9\x71\xbd\x9d\x5a\xb6\x53\x9f\x5e\x83\x95\x22\x82\x7d\x87\xfe\xe7\xf0\xef\xbf\xfb\x75\x7c\xf4\xe7\xc3\xc3\x9f\x5e\x8e\xff\xf3\xe7\xdf\x1d\xfe\xfd\x18\xfe\xf1\x1f\x47\x7f\x3e\xfa\xd5\xfd\xf0\xbb\xa3\xa3\xc3\xc3\x9f\xfe\xf2\xfe\xcd\xcd\xe4\xfc\x67\x7a\xf4\xeb\x4f\xac\xad\x6f\xcd\x4f\xbf\x1e\xfe\x44\xce\x7f\xfe\xcc\x97\x1c\x1d\xfd\xf9\xb7\x5b\x76\x34\x92\xd3\x33\x95\xc7\x33\x89\xbb\x33\x23\x5f\x67\x23\x08\xa9\xe1\x06\x89\x21\x25\x48\xbb\x80\x26\x2b\x6d\x3b\x4d\xcb\xfe\xa4\xef\x15\xd7\x3d\x36\xd7\x57\x8d\x34\xd7\x4f\xc5\xef\x81\x18\x86\x72\xad\x38\x6f\x1f\xb0\x02\x35\xee\x92\xdc\x11\x31\x72\x7d\x78\xa7\x5f\x39\x89\x7c\x63\x88\x98\xd8\xf4\xbe\x48\xe6\xbd\xc8\x0d\xe2\xe6\xe5\x39\x57\xf2\x06\x88\xee\xec\x68\x41\x70\x1f\xa3\x1f\xb1\xa0\xbc\x95\x56\x43\x46\xda\x08\xe7\x0c\x94\x0c\x43\xa4\xe0\x2f\x7b\x88\xdb\x98\xac\x8b\x6d\x85\x8c\x6b\xd2\x33\x17\x97\x96\x85\xca\x4f\xfd\xa9\xbf\x24\xcf\x36\xdf\xda\x74\x5b\x13\xb1\x11\xe4\xce\x0d\x43\x38\x2a\x22\xa2\x4c\xc9\x0e\x3f\x2a\x63\x11\x6c\xbc\xa2\x9d\x42\xb3\xad\xb3\x20\x98\x32\x68\xd4\x8d\x11\x2e\xb4\x98\xd0\x2d\x14\x77\xa2\x73\x47\x28\x06\xeb\x66\x9c\xf6\xc1\xa7\x71\xc7\x2c\x5e\x38\xc6\xb2\xf5\x35\xab\xb3\xf1\x9c\xfb\xff\x62\xd6\x43\x5a\xfa\xc8\x7f\xc7\x0c\xeb\xa7\x11\xbd\x30\x07\x02\xae\xfa\x71\x21\xa8\xa2\x05\xae\x5e\x44\x00\x6c\xdd\x8b\x8a\xaa\xd5\x06\x57\xf8\x2e\x41\x90\xba\xe7\xa6\x4f\xb8\x42\xb7\x64\x79\xcf\x45\xe9\xb4\xbf\x10\x6f\xbb\x6d\x28\x5b\x6f\x0c\xa9\xdc\x70\x00\xaf\xaf\x45\xb2\x89\xf4\x88\x9a\x08\x34\x25\x0e\x9c\xb6\xf2\xe5\xe5\x31\x3a\x65\x4b\xa3\x78\x45\xd8\xff\x3e\xf0\x12\xd4\x92\x05\xed\xd6\x58\x22\xbd\xd3\x60\xb5\x1e\xd7\x37\xac\xa2\x8a\xca\x6d\x46\x16\x69\x93\xc7\x0b\x1e\xa7\xb7\x3a\x68\x11\x17\x96\xf5\x16\x04\x92\x30\x1c\xc1\xdb\x42\x88\xed\xcb\x9e\xe5\xb6\xd0\x5a\x3f\x65\x44\xca\x37\x7a\xc3\xee\xee\xcc\x60\x50\xc0\x6d\x5f\x80\x27\xb7\x63\x97\x22\x5a\x32\x99\x8c\x3f\xad\x12\xf0\xb2\xfb\xe6\xb6\x4b\x7a\xea\xa0\x32\x60\xed\x18\x06\x6b\xdd\x34\x55\x32\x8c\xbf\x9a\x38\xa9\xfe\xc6\xe9\xe5\xb6\x51\x3a\x4b\x91\x65\x54\x68\xd9\x8d\xb1\xab\x2e\xda\x1f\x25\xd8\x62\x96\xd6\x88\xfc\xb3\xc5\x15\x00\x2f\x6f\x44\x4b\xb6\x2d\x4c\x1c\x65\x70\x10\x75\xcf\xc5\xed\xc9\xb7\x7f\x7a\x09\x36\x87\xef\xdd\x78\xbe\xf5\x15\x15\x9b\x2e\x1e\x95\x28\xbe\x52\x3b\xbd\xbc\x0a\x37\xb2\x5b\x4b\xe7\xd0\xb0\x90\x5a\x53\xd0\x43\xef\x00\xbf\x40\x51\x50\x85\xa8\xb4\xf0\xf8\x84\xf0\x71\xd7\xdd\x9b\x65\xb3\xbd\x92\x14\x9f\xcb\xdd\x6b\x37\x19\x33\x7a\x16\xbe\xcd\xac\x8a\x34\x4b\xe2\xdb\x09\x90\x0f\x07\x32\xf8\x18\x18\x76\x40\x9a\x03\x22\x07\x6e\x98\x65\x93\xc0\x26\x94\x05\x10\x19\x09\x37\x71\x0e\x36\x20\xfd\x78\x56\x99\x7b\xd5\x6b\xd9\xde\xa4\x4e\x2d\x58\xf9\xa5\x2f\xa0\x61\x29\xa3\xb6\x55\x4f\x0c\x89\x28\xd4\xb8\xf4\x05\xd3\xac\xf3\x07\x70\x5d\x95\x36\xe3\x4a\x43\x86\x8a\x85\x32\x0a\x73\x2c\xbe\xa0\xa3\x91\x29\x09\xc2\x77\x98\x56\x00\xa6\x07\x57\x12\x97\x3d\x6c\x8d\x19\x6c\xc1\x99\x6c\x6b\xe8\xd1\xb6\xa1\xb4\xe9\xd2\x6a\x13\x31\xfe\x4d\x6a\x38\x22\xab\x66\xf1\x71\x36\xf9\xed\x55\xb3\xd7\x4b\x86\x6b\x5a\xb8\x55\x3c\x35\xcb\x06\x3c\x94\x3d\xf6\xf9\x78\xaf\xac\xee\x7e\x5d\xb7\x4a\x4f\x6d\x8c\x72\xb2\x8b\x9b\x21\x22\xec\x03\x97\x49\x70\x14\xc2\x94\x0c\xf2\x80\x0b\x55\x2d\x21\xa2\xd2\xfb\xd2\x08\x11\x0a\x69\xab\x06\xcd\x5e\x6d\x4f\x98\xc2\x85\xdd\x59\x46\x9f\xed\xbd\xfd\x86\xd4\x0d\x90\x21\x5a\x05\x5e\x1a\xd6\x60\xd5\x0a\xe6\x78\x50\x57\xfe\x62\xeb\xe6\x03\x4c\x63\x44\x1a\xda\x85\x42\xb8\x2c\x25\xc2\xbe\x16\x13\x55\x46\xf1\x6e\x19\xfd\x67\x4b\xaa\x25\xa2\x25\x61\xaa\xc3\xbd\xf5\xa7\xd8\xd2\x45\x59\xf9\xb0\xbd\x58\x3f\xeb\xce\xb7\x51\xf7\x09\x29\x5d\x01\x23\xeb\x4f\x7e\x64\x4d\x8d\xfb\x17\xcc\x04\xad\xab\x47\x98\x09\x3b\xd2\x09\x22\xc8\x5d\x52\x54\x81\x58\x42\x83\x1c\x59\x23\x10\x86\xdd\xbc\x91\x0c\x07\xb5\x89\x57\x15\xab\x5b\x29\x02\x3f\x69\x9e\x8e\x72\x41\x5f\x80\xe8\xf5\xe5\xf5\x2f\xef\x4e\xff\xfb\xfc\xdd\xb3\x13\x49\xf6\x54\x85\xed\xbd\x1a\xe6\xc9\xb1\x04\x57\xab\x1d\x59\x0d\x8b\xaf\xc8\x1f\x67\x81\x5b\x7d\x4e\xc6\x32\x11\x31\x87\x1a\x33\xd5\xd7\x5d\x42\x40\xd4\xbb\xce\x03\xe1\xcd\x67\x1b\x86\xa4\xaf\xe2\x8d\x72\xd7\x57\x14\x8b\x6a\xd7\xc4\xb5\x76\xbb\x77\xc2\x91\xec\xc5\x1e\xea\x4d\xed\xc7\xf7\x92\xfb\x6a\x54\xa3\xeb\xfb\x30\xeb\x9e\x02\x92\x6d\x7f\x3b\x07\x89\x65\xc0\x2a\x64\x82\xaf\x18\x31\x72\xbf\xaa\x2e\x98\x9b\x5c\xff\x45\xec\x9e\x9a\xf2\x96\x95\xe6\x76\xb3\x43\x30\xbe\xef\x30\x23\xa8\x24\x15\x51\xce\x73\x95\xa6\x20\x20\xa7\x66\x03\x51\x2c\xf8\xbc\xe0\xdd\x46\x71\x87\x7a\x69\xee\x0c\x79\x89\xac\x3f\x19\x21\x5c\x71\x36\xb7\xec\xc4\x51\xcd\x76\x6c\x01\x3e\x8a\x30\x5a\x9b\x6c\x28\xb9\x8b\xed\x35\x61\xfa\x62\x75\x9a\xf4\xcd\x1a\x2e\x97\x6e\x53\x90\x82\x8b\xd2\xf8\x74\xf4\xc4\x1b\xf7\xcd\x71\xef\xc4\x5d\xc3\x67\x44\x46\x6f\xac\x8d\x7a\x37\xcc\x2f\xe3\x50\xd4\x63\x1e\xf8\xc8\xc0\xf0\x31\x9a\x4e\x54\x73\x2b\xa1\xf2\x9e\x28\x0f\xb8\x23\x04\xaf\x50\x53\x61\x46\x6c\x35\x11\xef\x80\xcd\x32\xcd\x83\x5c\xff\xd4\xf3\x15\x24\x65\x7a\x13\x7f\x17\x8e\x0f\x4f\xd9\x6c\x0a\x23\x60\xc3\xc3\xc2\x67\xe8\x6c\xf2\x03\x6c\x93\xf7\xa4\xe6\x62\xd9\x75\xd2\xab\xe8\xfa\x14\xe0\xad\x85\xf5\xe6\x9c\x1e\x6d\x2e\x59\x88\xa0\x73\x10\x2f\xcd\xb1\xb3\x28\x1d\xdd\x93\x77\xb4\xa6\x0a\x72\xcd\xb6\x8d\x0b\x15\x4d\xfb\x62\x84\x5e\xd4\x30\x14\x88\x2c\xa1\x17\x8b\x76\x4e\x1a\x3c\x27\x72\xfc\xa2\x2f\x9e\x25\x32\x34\x3d\x2b\xde\x1f\x2c\x88\x09\x7e\x38\x24\x63\x8a\xe3\xc0\x04\x5b\xf5\x4f\x8c\x8c\xe7\x02\x43\xf8\xc6\x89\x13\x6e\x4a\xb7\xd8\x2e\xe1\xc0\x6d\x11\x25\xbd\xb5\x6d\x20\x60\x9a\x47\xc6\xc7\xa4\x27\xd6\xbf\x5e\x2e\xb0\x00\xfb\xba\xd6\x57\x52\x7f\x75\x70\x94\x1a\xb0\xad\x57\x47\xdb\xb7\xef\xc8\x1d\xa9\xba\x2d\x69\xfd\x33\x5b\x36\xbc\x7d\x2d\xc1\x68\x43\x35\xde\x6e\x2c\x22\x5c\x9c\x28\x8b\xba\x69\xf7\xb1\x16\x53\x9d\x72\x29\xf5\x51\xf7\x67\x7b\xd4\x4b\x82\x0e\xd3\x9b\xcc\x1f\xc7\x94\x56\x02\xef\x83\x3e\x3c\x1d\xef\x7b\xc8\xc3\x1f\x75\xc3\x05\x27\xa9\x24\x0d\x61\xa5\x2b\xca\x1c\xf1\xae\x27\xf2\x12\xa2\x8f\x78\x0a\xb5\xb4\x2b\x30\x03\x39\xe3\x30\x7e\xfa\x6c\x77\xa7\x6f\xfb\x2b\x34\x85\x99\x38\x9a\x97\xb8\xb7\x29\x1f\x75\x11\x6a\x2d\x84\x30\x25\x96\x16\xf7\x79\xad\x37\x56\x5f\xba\xc6\xab\x0c\xd1\x84\xc4\x69\x74\xc4\xd1\x54\xc2\xa9\x44\xc2\x29\x34\x9a\xd9\x6a\x7c\x7e\x84\xc9\xbd\xb7\xd8\x60\x09\xac\x8b\x91\xd8\xda\x38\xc8\xa2\x90\x27\xbc\x44\xf7\x00\x26\xe8\xd3\x2c\x98\x32\xc2\x17\xba\x5b\xb7\x5d\x79\x34\x77\x8f\xba\x18\x48\x74\xd3\xd6\x8f\x96\xcc\xa4\x9d\x81\x69\xca\xa2\x97\x77\xbd\x11\xac\x7a\xd6\xf3\x56\x14\x0b\x2e\x09\xb3\x18\x78\xe1\xbe\xc0\xfa\x71\xe7\xd2\xdc\x83\x49\x75\xa7\x2d\xdd\x07\xb9\x23\x62\xa9\x20\x00\xea\xe9\x8f\xad\xdf\x53\xae\x44\xbf\x02\x8c\x73\x74\xc3\x20\xb3\x6d\x52\x00\xe0\x5b\x66\xce\xe7\x0a\x23\xdd\xc9\x8e\xc8\xcb\xcf\x14\x29\xda\xf2\xd1\x32\x41\x81\xa5\x9d\xa8\x48\xd6\xc2\xe8\x38\xf5\x81\x99\x12\x3f\x40\x41\xe1\xce\x34\x2a\x78\xdd\xb4\x2a\x88\xcd\xba\xd8\x6d\xcc\xea\x27\x51\x5c\xd4\x98\xe1\x39\x19\xfb\x8e\x8c\x83\x3c\xa4\x48\x15\x22\xf2\x42\xcd\x01\x91\x47\x5f\x12\x4c\x1e\xc5\x43\xe5\x51\x06\xb8\x3c\x4a\x85\xcc\xa3\xbc\xb0\x79\xd4\xdd\x4a\x3b\x39\xba\xde\x53\xb0\x72\x78\x6d\x35\xf0\x8f\x1d\x5e\xa7\x09\xc6\x9c\x5e\xa0\x1a\xb6\x2d\x53\x89\x78\x4d\x95\x83\xe5\x05\x7a\x02\x70\x8d\x86\xe4\xa6\x56\xd0\x00\x28\x12\xc3\xfd\x49\x1e\xfe\x7f\xf6\xfe\x86\xbb\x8d\xdb\xda\x17\x87\xbf\x0a\x96\x72\xd7\xb2\x94\x92\xb4\x9d\xa4\x2f\xc7\xb7\x4f\xbb\x14\x49\x6e\x75\x13\xdb\x3a\x96\x92\xac\x3e\x4d\xef\x09\x38\x03\x92\x38\x9a\x01\x26\x00\x46\x32\x7b\x7b\xbe\xfb\x7f\x61\x6f\x00\x83\x21\x29\xd9\xc2\x40\x22\xe5\x6a\xba\x56\x63\x91\xc3\xc1\x1e\x60\x63\x63\xbf\xfe\x76\x53\xf1\x82\x9b\x08\xf9\xb9\x4c\x31\xb7\x22\xf0\x5a\x69\x4d\x70\x5e\xfb\xea\x78\xe8\x1a\xe9\xed\x3b\x97\x92\x1e\x68\x2f\x10\x59\x8d\x7d\x28\x18\xf3\x9e\x96\x27\x69\xf6\x24\xcd\x3e\xf1\xfa\xdc\xa4\x99\xeb\xe2\xfc\xf0\x15\x40\xef\x71\x60\xd2\x74\x15\x3f\x6b\x1d\x66\x03\x8a\x6b\x42\x34\xdf\xd5\xfa\x1c\x42\x0f\xfa\x11\x79\x27\x5e\x63\x6f\xd0\x11\x96\xff\x4c\xc8\xa9\x20\x5a\xd6\xae\x8f\xe9\x07\xa3\x47\xa8\xf1\x52\xa2\xdb\xa9\x66\x4e\xdf\x95\x9a\xf9\x42\x61\x57\x6d\xdd\x30\x85\xa2\x2f\xb1\x54\xc8\x4a\x2b\x24\xea\x9e\x21\xc2\xae\xa5\xba\xac\x24\x2d\xf5\xf3\x46\xe2\xff\x8d\x03\xc4\xde\xf3\x2f\xdc\xba\x8f\x9b\xbb\x43\x88\xa4\xa6\x9b\x47\x35\x98\x0f\x5d\xa4\xf1\x7e\x65\xec\x5e\x06\x6a\xaf\x82\xb5\x1f\x33\x06\x24\x37\x4c\xa2\x26\x73\x25\xdb\xc6\x47\x03\x3b\xb4\x60\x6b\x8a\xdf\x35\x6b\x48\xda\xc9\x88\x62\xb7\x58\x6e\xd0\x27\x24\x98\xf3\xe0\x79\x60\x9d\xdd\x09\x16\xa5\xd6\xa3\x8d\x98\xed\xaa\x15\x09\xa5\x0e\x58\xf7\x2a\x55\x07\x2c\xc9\xc8\x5e\xc5\xe6\xb4\x58\xee\xf5\xa9\xda\x80\x9f\xea\x3c\xe0\xf6\xf8\xb5\xc7\x3a\x52\xe7\x1b\xd2\xde\xd5\x83\x0f\x5d\x6e\xe1\xe8\xc6\xe4\x5f\xcc\x23\xd3\xee\xf5\x7d\xa9\x85\x63\x25\x57\xf2\x7f\x67\xe7\x44\x72\x75\xee\x6f\xff\xf0\xdb\xb1\x07\x3d\x80\xd7\x7c\x88\x7d\xd3\x83\xe8\xdc\x5e\x95\x46\x8f\xdb\xa6\x8c\x94\x5c\x37\xc0\x99\xe0\xea\xee\x4a\x1d\x02\xb9\xf9\x4a\x6e\x36\x0f\xe9\x99\x21\x71\xc0\x61\xab\xc1\xc5\xfc\xc1\xab\x66\xce\xfb\x43\xbb\x7d\x27\x1b\xfa\x6b\xdb\xf5\xa1\x75\x87\x15\x2a\xdb\xd1\x02\xba\x49\x84\xc6\xac\x11\x36\x6c\xe2\xe1\x6a\x59\x63\x9d\x1a\xd0\xab\x3b\x09\x12\x96\x4e\x1b\xba\xf4\x12\xb5\xff\x12\x25\x54\xbf\x30\xdf\x79\xeb\x8e\x54\x74\x88\xb6\x41\x04\x5a\x2d\xb4\x6e\xe0\x90\xf5\xdf\x26\xa7\xb6\xae\xce\xf7\x6a\x20\x83\x1a\xac\x27\x81\x3c\x08\x07\x4b\x81\xdd\x57\x20\x4d\xa4\x96\x57\x80\x09\x6a\x75\x8a\x99\x61\xea\x9a\xaa\xf2\x8e\x67\xfe\x56\xab\x6a\xfa\xaf\x0f\xdc\xd6\x61\x81\xc0\xc1\x79\x86\x18\xa8\xf3\x96\xaa\x12\xca\xa8\x3a\x9e\x78\x4a\xa4\xdd\x74\x6d\x3d\x91\xd6\x15\x4b\x47\x02\xe0\xee\xa1\x64\x7f\x9d\x50\xab\x07\xf5\x9f\x84\xb1\x12\x28\x6b\x5b\x49\xc7\x82\xc2\xe8\xa7\x74\x99\x3b\xb9\x88\x57\xf0\xc1\x1e\xf4\xac\xe9\x0f\x4d\x16\xb2\x2a\x41\x59\x1d\x57\xec\x8a\x55\x81\x34\x2b\x70\x15\x9f\xb6\xc6\xe1\x2c\x15\xb2\xae\x5d\xc9\xbb\x6b\x3e\x8f\xe5\xf1\x77\x36\x76\x10\x16\x90\x56\xaf\x7a\x10\x0b\x70\xba\x4c\x2c\x79\x0c\x38\x23\x7e\x4b\x30\x21\xbd\x52\xe0\x8e\x41\x39\x23\xcc\xb2\x69\x02\xfb\x6d\x21\x63\x62\x05\x74\x71\x1b\xce\xc5\x15\x12\x7c\xbc\xeb\xd0\x7d\x4c\x24\xa2\x35\xda\xb5\x68\x35\x5b\x6b\x2d\xd5\xc1\x69\x25\xe6\xdf\xbf\x95\x50\x9b\x0e\x8d\xc2\x43\xc0\xb3\x08\xcd\x10\xec\xb1\x0b\x85\xbb\x10\x6b\x95\x7a\x22\x5c\x0a\x71\x32\xac\xda\x20\xe7\xd9\x90\xc8\x3a\x3a\x81\xee\xfc\xc3\x61\x51\xf5\x4a\x16\xb4\x02\x04\xe2\x54\x16\x23\xd9\x82\xaa\xab\xb4\x44\xd8\x09\xd4\xbe\x26\x7c\x56\x49\x5a\x7a\x64\x75\xe6\x9b\x28\x50\xb3\x62\x7f\xa7\xc6\x22\x11\xbb\x04\x47\xf2\x25\x1f\x8d\x62\x11\x84\x55\x6f\x60\x09\x7d\x4b\x52\x07\x7b\xd3\x4f\x23\x70\x6f\x16\x43\x0b\x3a\x52\x06\x0d\xe0\x71\xc7\x66\x20\x8e\x43\x17\x4c\x2b\x2b\xb9\x26\x7b\xdf\xfb\x49\xdf\x1b\xd2\x1b\x3b\xd9\x71\x69\x12\x6b\x89\x73\xf1\x1c\xce\x43\xe0\x33\xf4\x5f\x5c\x72\x3b\x53\xb3\x4e\xc8\x79\x96\x08\x50\x74\x4d\x53\xf1\x74\x2e\xfb\x91\x56\xbc\x0c\x92\x93\xaa\x01\xcd\x61\xc3\xf2\x91\x71\xb4\x49\x1a\xc5\xc6\xeb\x1b\x25\x3d\xe5\xc0\x79\x7c\xbc\xc3\x72\xfc\xd1\xae\x3a\x03\x19\x97\x90\x1f\x04\xec\x39\xc1\x4a\xab\x6d\xc9\x6e\x29\x98\x98\x49\x85\xce\x98\x07\x67\x58\x87\xab\xbd\x8d\x63\xf8\x30\xe0\xb7\xc4\xa0\xcf\xe8\x82\x74\x79\x86\xc0\x93\xe8\xc1\xec\xbb\xcd\xbb\x74\xd6\xbb\x8f\x0b\x2d\x04\x5c\x43\x34\x3b\x73\x2e\xde\x0f\x0c\xf0\x9d\xeb\xe8\x62\x7c\x05\x02\xa2\x08\x5e\xdb\x41\x17\xbc\x41\x21\x46\x8d\xfb\x79\x8a\x70\x80\xd2\x12\xfb\xc0\xd0\xb3\xb2\x91\xe5\xab\x94\x7c\xc4\x97\x58\x99\x22\xaf\x01\xab\xf2\x2f\xa7\xc7\x61\x2f\xdb\xa7\xbe\x3e\x4f\x41\xfb\xb6\xd7\x57\xf8\x5c\xcd\xcc\x9c\x97\x64\xea\x9a\x8a\x32\x43\xf6\x05\xbb\x26\x76\x0f\x68\x57\xf9\x13\x30\x3f\xdc\x6c\xfa\xf1\xc3\xeb\x39\x22\x0e\x12\xa8\xf8\xda\xd5\xdd\x30\xe5\x21\xa6\xa6\xdc\xb5\x48\x7f\xf7\xfe\x99\x07\xea\xbc\x1e\xab\xeb\xf1\x78\x3c\x4e\x99\x3f\xef\x13\x1e\xf5\x56\x3e\x78\x59\x6a\x59\xf2\xd9\x72\x65\xfd\xed\x79\xd3\x91\x04\xba\x37\x15\x4b\xf7\xfe\x8f\x48\x17\x4c\x8d\xec\x45\xe8\x55\xbf\xfb\x26\x4d\xd4\xc4\x10\xfe\xdb\x10\x3b\x1b\xc8\x08\x40\x11\x53\xb6\xa0\x57\xdc\x9a\x00\x33\xdc\xff\x76\x67\xdd\xb4\xfa\x5e\xa3\x49\x96\x05\x0e\x34\x02\x01\xa5\xd8\x87\x46\x6a\xd8\x51\x90\x96\x78\x26\xa1\xf0\xac\x8f\x18\x8b\x7e\xb6\xa6\x81\x56\x8b\x09\x03\xf6\x84\x9e\x8b\xf1\x60\xfd\x83\x9f\x15\x32\xa5\x96\x88\xf0\xca\xfb\x2b\x0c\x9f\xd4\x1f\xf1\xd4\xed\x2a\x70\x99\x08\x49\xd8\x6c\xc6\x0a\x68\x64\xc4\x9a\x05\xab\x99\xa2\x55\x9f\x34\xdd\x16\x0b\x42\xf5\x2b\x6b\x81\x2b\xbb\x41\x51\x59\xad\xe9\x9d\xbb\x0c\x10\x07\xd4\x01\x36\x75\xc9\x93\x52\x3c\x51\xb5\x89\x80\xae\xf7\xde\x89\xf7\x52\x9a\x37\x5c\x83\xa6\xeb\x2a\x50\x30\xde\xb9\x37\xd9\xe0\xe3\xf7\xdf\x85\xac\xd6\xc7\x23\x28\x92\x94\x8a\x0e\xe3\x7d\x1b\x1b\xdc\x1e\x1b\xf6\x34\x0c\x11\x48\x97\xc2\xdc\x48\x2e\xcc\x5a\x33\x22\xab\xd7\x15\x09\x48\x5b\xf6\xfa\x41\x33\x1d\xe2\x74\x5e\x4f\x4c\x03\xc3\xc4\xeb\x0d\x5d\x86\xf2\x53\x87\xac\xbc\xe2\xa4\xc2\x38\xaa\xfb\x6e\x2a\xcd\x62\xcd\x8b\x95\xd6\xc9\xfa\x4c\x96\x2b\x0f\x1a\x75\xa0\x89\x7d\x90\xaf\xd5\x01\x0d\xa4\x67\x5b\x93\x92\x95\x4c\xdc\xb9\xff\x09\x09\xe0\x1c\xd4\x0c\xcb\xc5\xfe\x37\x3a\x4b\x61\x87\xbd\x95\x20\x87\xb6\xb1\xc7\x4e\x23\x08\x48\x98\xef\x78\x47\x81\x97\xc1\x6e\x3d\x0a\x80\x29\x52\x8c\x95\x94\x10\xe1\x4e\x5a\xd6\xd3\x99\xeb\xf9\xbf\xa6\xa6\x5d\x59\xc9\xec\x1b\xab\x43\x23\x52\x42\xbb\xc0\xb9\x91\x84\x09\xdd\x2a\xc7\x13\x77\x06\x42\xb5\x57\x29\x19\x86\xfc\xdc\xeb\xfc\x70\x7a\x4c\x5e\x90\x7d\x68\x15\x0c\x62\x7f\x46\x79\x15\x30\x9e\x56\x5b\xa3\x42\x83\x7b\xfb\x88\xc4\xd7\x0e\x29\x0b\x33\x5a\x69\x36\xb2\x67\x27\x1c\x8d\xee\xbd\xad\x0e\xe2\x55\xee\x86\x29\xc0\xa7\x4c\x4b\x5a\xfe\x1c\xc4\x4e\xea\xf6\x9d\x4a\x59\xb1\x3b\x27\x71\x84\x1e\x29\xdb\x3a\xe1\x7e\x78\x90\x13\x2e\x8e\x4b\xd8\xfd\xdb\x5f\x12\xdc\x72\x35\x33\xb4\xa4\x86\xba\x93\xcf\xdf\xf0\x6f\xcb\x88\x4f\xe7\xdf\xa7\x5d\x43\xce\x3f\xd7\x57\x6b\xdb\xb6\xe4\x06\x32\x82\x2d\xb9\x70\x2e\xa5\xb8\x85\xfd\xf9\x09\xdc\x8f\x7d\x56\x21\xdb\x00\xbd\xae\xde\xc3\x85\x56\x90\x8e\x8a\x6b\x13\xf1\xc2\xc0\xe8\x5a\x50\xdd\x37\xb7\x84\x2c\xfd\x89\x5d\xca\xb8\xfc\x3d\x10\x66\xf9\x50\x06\x32\xc2\xe9\xb7\x72\x5b\x1e\x2b\x0a\xfa\x57\x61\x08\xd4\x99\x50\xef\xed\xce\xd2\xfc\x8a\xed\x25\x15\xe8\x46\xbf\x27\x35\xa3\x42\x13\xc5\x60\xa6\xc1\x8a\x9f\xc1\x0c\xa3\xfb\x4a\x22\x2a\xee\x99\x2c\xc3\xbb\xae\x46\xf9\xbc\x1a\x91\xf2\xae\x08\xaf\x85\xa9\xb4\xba\x92\xd7\xb0\xbf\x2b\xaa\xe6\xde\x59\xa0\x47\x64\xda\x1a\xf4\x3b\x6a\x52\xf3\x0f\xd0\x00\x20\x74\x27\x83\xd9\x68\x45\xf4\xc1\x99\x2c\x75\x28\xee\x0f\x40\x3f\xce\x68\x96\x31\xf6\x0f\x38\xc5\x53\x26\xaf\xb7\x1c\x50\x5f\x01\x8e\x51\xc2\x2a\x3e\x87\x1e\xd6\xf1\x6c\x81\xf7\xed\x97\xb1\xf4\x89\xc5\xbf\x10\x57\x91\x01\xbf\x4f\x9e\xb3\x80\x28\xe0\x56\x47\xfb\x40\x18\x75\xe0\x9a\xf1\x6b\xbb\xf0\x6c\xf8\xb8\xb7\xb9\x12\xb7\x8c\x4b\xf0\x6a\xa4\xc6\xbe\xdd\x56\xb3\xdb\x38\x38\x02\x2c\x7c\x6c\xc9\x52\xa8\x38\xf1\xf3\xed\xe7\x9a\x42\x22\xe7\xd8\x28\xc6\xc8\x6b\x3e\x55\xcc\x8a\x1b\xc1\x2a\x18\x92\x9f\x1f\x9d\x9f\x76\x5c\x65\x3f\xb2\x73\x17\x7d\x98\x40\xc2\x35\xa4\x84\xdb\x67\x94\x8a\x5f\x31\x45\xec\x19\xd2\x42\xf5\xb7\x9f\x64\x2f\x11\xa6\xcb\xd0\x1c\xc0\xf5\x73\x84\xef\x81\x99\x30\x4f\xdf\xf9\x88\x79\x4a\x19\xc1\xd1\xf9\xe9\x31\x52\xc0\x85\x36\xd4\x6a\x79\xe4\x1d\xc0\x50\xc6\x93\x43\xc1\xbb\x42\x14\x1b\xc3\xd2\x57\xac\x24\xca\x4b\x82\xea\xce\xdd\x2e\xc8\xda\x66\x40\x1d\x20\xc2\x74\x05\x3f\x1c\x1c\xa5\x6e\x3a\xe0\xf6\x1e\xc2\x40\xd4\x83\x21\x69\x3b\xae\x3a\x91\x60\x65\x3f\x65\xb4\xd1\x0a\xf1\x03\x5c\x4e\x77\xa7\xa1\xe4\xfa\x36\x22\x40\x0e\xbe\x67\xb4\xfc\x49\x71\xc3\xde\x89\x82\x45\x32\x25\xd1\xb3\x17\x0b\x7d\x5f\x5f\x21\x63\x16\x19\x8a\xf5\x40\xe1\xf8\x44\x18\x99\x48\x26\x81\x33\xb3\x7f\x9e\x43\x2c\xc1\xc1\xa4\x3a\x6c\x84\x15\x55\x51\xaa\x4d\x0a\xa4\x3b\x9a\x62\xbc\x88\x94\x70\x5a\x4f\x64\xf6\x24\xa3\x93\x59\x2e\x9f\xa0\xf7\xd5\x06\x0d\x26\xee\x1d\xa5\x5d\xbb\x6d\x4c\x0c\x9d\x33\x43\xb4\x69\x8b\x4b\xfb\x16\x01\x92\xf4\xc8\x63\x64\x41\x9a\xeb\x23\x52\x5c\x93\x7c\x9b\xfd\x8e\xae\xdb\xb2\xfe\x3c\xe3\x15\xde\x06\x91\x51\x0c\x7f\x3d\x5e\x9a\xee\x7f\xe8\x27\xaa\xaf\x69\x47\x1e\x31\x0f\x21\xb4\x09\x25\x8a\x8a\x52\xd6\x6b\xf4\xd9\x9d\xc9\x68\xb1\x48\xa0\xa3\x33\x89\xee\x6a\x1f\xa6\x84\x64\x6e\xb0\x28\x07\xd8\x87\x29\x41\xe2\x15\x8b\xf2\x71\xdb\x87\x89\x79\x67\x03\x93\xc0\xd8\x15\xab\x32\x64\xe1\x00\x94\x95\x9d\x84\x20\xea\xe1\x03\x14\xf8\xab\x49\x0a\xbd\x2d\xb2\x95\xdc\x23\x25\xb3\xe4\xbb\xbd\x97\x98\x16\x49\xc3\x6b\xdb\x07\xef\xec\x5b\x67\xca\xb8\xba\x70\x09\x64\xdd\x5b\x43\x2a\xd5\xae\xbe\x75\x9b\xe4\x7d\x24\xab\x6f\xfd\x83\xc6\x8e\x61\xdd\x5b\x83\xa3\x6f\x17\xdf\xba\xdf\xeb\x7c\x5b\x67\xaf\xa3\xe2\x29\x4d\xb8\x77\x3d\xa5\x09\xdf\x77\x9a\x70\x04\xe6\x47\xc1\x8f\xd5\x4b\xdc\x7d\xac\xc9\xc2\x00\x40\x6f\x67\x91\x21\x34\x6f\x43\xcd\x62\x04\x8e\x3b\xc3\xaf\x3c\xe4\x2f\xb9\xc4\xb0\xdf\xb3\x5e\xeb\x5d\xbf\x11\xbb\x3c\x6a\x84\xfa\xcb\x94\x5b\xbc\x29\x9f\x18\xef\x79\xfb\xee\x22\x06\xfa\xa3\xbe\xeb\x5b\x72\xcf\x9e\x5d\x39\x01\xef\x27\xe7\x78\x75\x9d\xee\x2f\xe5\x38\xf1\x49\x9b\x33\x8e\x1f\x62\xbf\x7d\x5a\x16\xf2\x6a\x0e\x72\xa6\xc1\x57\x13\x92\xd7\x9f\x3e\x68\x85\x86\x1c\xf4\x51\x42\x30\xe4\x11\x6d\xc5\xd0\x3e\x0c\x05\xc7\x90\x93\xdc\x8b\xd6\x40\x43\x48\xae\xa0\xfb\x23\x44\x57\x21\x12\xcb\x05\x96\x62\xc5\x50\x41\x29\x66\xa8\x07\xac\x59\x53\xb9\xb0\xd3\x66\x4d\xd5\x12\x52\x9c\x20\x03\xc1\x65\xee\xed\xc7\x95\xd0\x07\x60\x07\xa7\x08\x92\x05\x23\xe7\x6b\xb3\xef\x3b\x16\x3b\x77\x5f\xec\x6d\x4c\x83\x69\x5d\x5f\x60\x3f\x84\x83\x81\x35\x4c\xd5\xae\x77\x17\x33\xae\x57\xab\x66\xce\x17\x1e\xe6\x27\x2d\x01\x5b\xa2\x3b\x99\xd1\xd2\xe7\xef\x62\xce\x79\xcd\xea\x29\xa6\x3d\xea\xf5\x4e\xeb\x21\xa9\xa3\xa6\xf3\x24\x19\xbf\xea\x4f\x11\x32\xc2\x25\x0a\x1c\xa6\x98\xfd\x14\x27\x56\xb6\xf3\xc5\x3a\x69\x29\x59\x2c\xb7\xbe\x0c\x44\xaa\xb4\xe9\x81\x5e\x20\x0e\x2f\xc4\xcd\x52\x91\x78\x6f\x5f\xe2\x47\xa4\x10\x3f\x30\x0a\xef\x50\xe8\xa5\x21\x61\xf5\x8c\x4d\x00\xc9\x2d\x2c\xb0\x0d\x61\x7e\x1c\x85\xe5\xd7\xeb\x4d\xb4\xcf\x9a\x41\x99\xbe\x96\x3b\xe3\x22\x4d\x05\xad\x0a\xe8\x6d\x9d\xc4\xbf\x1b\x42\xe0\x4c\xcd\x99\x0b\x7e\x9f\x1b\xc5\x0b\xb3\x39\x7f\xd8\xdd\x37\x20\x96\xb3\x7f\x58\x35\x0b\x7a\x40\x7e\xd0\x3e\x82\x8c\xdb\x27\x44\x5c\x3f\x49\xf0\x43\x9c\x07\x7d\xcd\xee\x00\x48\x8c\xda\x6c\x56\x73\xc0\xe2\x08\x10\x77\x5d\x6e\x3a\x78\x3f\x79\x00\x92\x7f\x44\xb2\x23\x4d\xfb\x59\xea\xc2\x54\x5b\x51\x79\xce\x71\x68\x28\x85\x27\x34\xe8\x3f\xa1\xa3\x50\xe9\x89\xeb\xe2\x79\xa1\xe9\x03\x04\x9f\x20\x31\xa0\x15\xa1\xad\x42\xca\xc1\xe1\x46\xd8\xbf\x29\x25\xe3\x80\xd4\x7c\xbe\x30\x21\xf7\xb2\xa2\xad\x28\x16\x8f\x88\x2b\xb6\x89\xeb\x8e\x2b\x1c\xb2\x94\x28\xb9\xb4\xd2\xbe\x22\x0d\x55\xb4\xb6\x6a\x97\xdb\xdf\x9a\x25\x45\x2e\x1e\x25\x8a\xbb\xfd\x29\x88\xe5\x84\xdf\xee\x0c\x02\xfc\xdb\xd0\x5c\xcc\x91\xb4\x84\xec\x95\xa4\x65\x24\x39\x50\xcd\x61\x46\xb3\xbc\xda\x8f\x10\x64\xdb\x95\x77\xcb\xaa\x22\x39\x49\xb2\xe5\x70\xf2\x4f\x48\x85\xd7\x39\x8a\x80\x68\x72\xff\x21\x65\xef\xbf\x71\x40\x98\xb4\x9f\x2f\xb9\x12\x89\x8d\x91\xf9\x12\x09\xf8\x48\xea\xf0\x76\x33\xd2\xd3\x4f\xa4\x2a\x2d\x2f\x73\x8b\x11\xda\x79\xad\xe9\x91\x62\xd0\xec\x94\x56\xe7\x0d\x2b\xb6\xe9\xc0\xfc\xcb\x9b\xf3\xc3\x3e\x35\x70\xce\xbb\xb6\x14\x0c\xbe\x27\xb4\xf4\xa5\x9f\xd7\x6c\xba\x90\xf2\x32\x71\xb0\xfd\x08\x91\x71\xd1\x4e\x27\x85\xac\x23\x94\xd3\xb1\xe6\x73\xfd\xdc\x09\x86\xb1\x9d\xa6\x03\xc2\x45\x05\xc7\xb5\xd7\x87\x98\x30\xde\x64\x19\xf0\xc2\xa4\x08\x6f\x0c\x0c\xe5\xa0\x37\x9d\xde\xb5\x3e\x25\x6f\x07\xa1\x5c\x0d\x3e\x52\xd6\x39\x26\xb5\xdb\xe7\x0a\xd7\xdc\xf0\xa6\x2b\x5d\x3b\x03\x1b\xac\xce\x1a\x06\x00\xb7\x32\x25\x2e\x66\x64\x4d\xd4\x6d\xee\x9e\xbf\x76\x64\xc4\xbe\x3b\x3e\x8b\xe5\x79\xe4\x57\x0e\xc5\x61\xcf\xec\x2f\x89\xfb\xe9\xb3\xe1\xad\x58\x0e\xab\x0a\xf5\x84\x33\x59\x3e\xd3\x71\x30\xb6\x03\x6d\x0b\xb9\x6f\x98\x18\xcf\xaf\x58\x8f\xfe\x54\x45\xd0\x5e\xfb\x3c\xa4\x10\x47\xfd\xff\x1d\x54\x5c\xcd\x3f\x58\xda\xe2\xb1\x22\xfa\xb0\xef\xa5\x18\x6f\xfe\x3a\xa9\xee\x9a\x40\xa1\x5e\xf0\x32\x8e\xec\x7a\xc4\x8f\xb7\xfc\xad\x5a\x86\xbd\xd6\xed\x17\x6f\x99\xb9\x96\xea\x12\xe7\x2a\xce\xb3\x32\x12\xee\x1c\xc2\xe2\x69\x65\x56\x24\x2e\xb5\xca\xb4\xdb\x93\xb9\x1c\xca\xae\x1c\x1d\xf6\xfc\xf7\x5a\xd3\xfd\x97\x61\x91\x95\x52\x2c\xfb\xe0\x07\x28\xc7\x22\x9b\x4b\xb2\xd6\x55\xa4\xc9\xfd\x14\x65\x91\x6d\x57\x08\x92\x01\x18\xba\x4c\x5d\xf1\x82\x1d\x16\x05\xa4\xc2\xdf\x69\xe8\x61\xec\x7a\xcc\xec\x2b\x53\xc3\xca\xf3\x1e\x0d\x98\xe4\x53\x86\x6f\x09\xad\x38\x85\x06\x9c\xa4\x7f\xa3\xe5\xef\xbb\x03\xbf\xfb\xc7\x42\x46\xd1\xca\xeb\xbb\x1d\x03\x31\x97\x87\x41\x30\x5e\x1b\xfe\x61\x81\x25\xd7\x5f\x7e\x5d\x97\x58\x59\x1d\x5f\xce\xb2\x82\x9b\x7e\xc7\xa1\x3f\x0d\x3f\xdf\x50\x7d\xd9\xb5\xeb\x60\xe3\x46\x96\x5d\x77\x8e\xe8\x73\x37\x8d\x63\x8a\x34\xde\xad\x6d\x47\xf2\xd2\x19\x7b\x16\xd9\x99\x3a\xd4\xaf\xff\xf3\xf8\xed\x03\xc3\x81\xfb\x23\xd1\xce\xfe\x33\x0d\x1a\x16\xac\x9a\xb7\x3d\xa3\x04\x14\xaa\xa3\x1b\x2d\xa9\x23\xa2\xa8\x8b\x56\x52\x3c\x10\x2a\x46\xd1\x7d\x4a\xf6\x23\x70\xf7\x3b\x1f\xe7\xa7\x82\x74\x09\xd5\xa8\x12\x8c\x90\x47\xb0\xd0\xcd\xd7\xe0\x00\xf2\xd3\x7f\x1e\xbf\xf5\xa1\xbe\x40\x3d\x1a\x92\x8e\xf3\x9c\xcb\x6f\xdf\x27\x33\xf4\xef\xd0\x46\xb5\x85\x21\xad\xd1\xf6\xf3\x14\x52\xfd\xc1\xf8\x09\xc4\x2a\x36\xe7\xda\xa8\xa5\x93\xe7\x72\x16\x91\xec\x9c\xcb\xe1\x96\x4b\xb6\x24\x7f\xfd\xee\xe4\x6f\xff\xf5\xfd\xbb\xa3\xc3\xef\xff\xeb\xcd\xe1\xd1\x5f\x4f\xdf\x9e\xfc\xfc\xf3\xf9\xdf\xce\x2f\x4e\xde\xfc\xfc\xf3\x51\xab\x14\x13\xe6\x08\x1b\xef\x9e\x33\xf3\xf3\xcf\x6e\x8f\xe9\x9f\x7f\xbe\x28\x1a\xde\xfc\xfc\xf3\x99\x77\x73\xc2\x39\x6a\xa7\x2a\x01\x16\x1c\xa0\xc7\xba\xea\x48\xd0\xef\x70\xf9\xe1\x2d\x7b\x75\x97\x03\x3a\x68\x40\xd5\x7f\x8a\xb8\xbc\xbb\xae\x05\x45\x6e\x4e\x2f\x7c\xeb\x9d\xfd\x0f\x2a\x32\xa1\xca\x8e\x12\xcd\xc5\x1c\xd0\xfe\x50\x45\x0d\x81\x07\x32\x65\xe6\x9a\x31\xac\xdb\x5c\x55\xad\xd2\xf1\xe0\x7e\xb2\xaa\xaf\x71\x2d\x8e\xad\x02\xd3\x6b\xcd\xe2\xd2\x94\x5c\x21\xe0\x15\x67\xd7\xa0\xa6\x6b\x3e\x17\xb4\x8a\x42\x83\xd0\xa9\x10\x33\xc0\xba\xdf\xdf\x91\x12\x1e\x15\x71\x62\x73\x67\x17\x26\xeb\x67\x99\xac\x65\x98\xf4\x3a\x63\x50\x6d\x69\x63\x25\x39\x3b\x3d\x26\x2f\xef\x3a\x19\x60\x1b\xb8\xac\x92\xf3\x4d\x0c\x11\x1c\x51\x56\xc5\x4b\xeb\x0e\xbf\x06\x79\xfc\xd0\x8c\xde\x4e\x4b\x59\x53\x2e\xb6\xdb\x64\x62\xd6\x56\xd5\x92\xfc\xda\xd2\x0a\xb5\xd7\x33\x59\xae\x9f\x34\x7b\x7f\xf4\x1f\xfd\x69\xf2\xc7\x40\xf8\x9f\x26\x7f\xb4\xd2\x27\xec\x8c\x3f\x4d\xf4\x55\x31\xf9\x63\x51\xb5\xda\x30\x45\xdc\x4d\x77\x86\x3e\xfd\x48\x67\x8a\x20\xe7\xa8\x1b\x01\x28\xa5\x60\xe7\x3e\x88\x46\x87\x4e\x05\xc8\xef\xfc\x8b\xa2\x05\x3b\x63\x8a\x83\x69\x20\x45\xf9\xa0\x1d\x2a\x3c\x07\x93\xd2\x35\x3a\x83\xee\xda\x48\x47\x98\x33\xc1\x58\x89\x96\x9a\x23\x9b\x91\xb9\xa5\x1a\xd6\x7d\x02\x46\xd5\xd4\x6a\x03\x85\x62\x14\x51\xdf\x48\xc9\x2a\x06\x8d\xec\x92\x3a\x8f\x62\x88\xc4\xa7\xec\x0a\x29\xc6\x82\xcd\x31\x85\xd6\xa5\x92\x20\x9e\x22\x1e\xb3\xff\x64\x4a\x46\xe9\x9a\xda\xc8\x86\xf0\xba\x66\x25\xa7\x86\x55\x4b\x72\xc5\xe9\x1d\xc7\x07\xb5\x02\xfa\x60\xa0\x70\xdc\x17\x92\x48\x88\x01\xb7\x82\xbb\x70\xcd\xa2\x35\xa4\x94\xd7\xe2\xee\x2a\x85\xeb\xca\x1a\x0a\x71\x05\xaf\x46\xbd\x66\x39\x30\xb9\xa4\x01\x9e\xe8\x45\x09\xd2\xac\x0e\xb4\xf5\x7b\x0f\x75\x0a\xfc\xa6\x45\x87\xce\x17\x1e\xdc\xd8\x1d\x09\xaa\x15\x00\xcb\xd9\xf5\xf6\x82\x8c\x0f\xcd\xc4\x5d\xfd\xec\x34\x66\x7d\x3f\xbd\xfe\x70\xc0\x1a\x3c\x3c\xc4\xd8\x4a\xb2\xca\x4c\xaa\x82\x4f\xab\x25\x59\xd0\xca\x30\x87\x98\x49\xe3\x55\xba\xeb\xa4\x9c\x33\x13\x2f\x44\x25\xc5\x3c\xd6\x75\xd9\x87\x86\x15\x06\x7a\x37\x31\x2a\xda\x06\xa9\xb3\x6a\xdc\x52\xb6\xc9\xfe\x8f\xd8\xef\xf1\xf5\x0b\x3f\xe9\x29\x32\x27\x25\xa7\x2a\x35\x9b\xca\xc8\x8a\x21\xa7\x0c\x11\x4e\x1b\xbb\x13\x3d\xd3\xf1\xd3\x1f\x4b\xb3\x95\x04\xaf\xdb\x85\xdb\x38\xc0\x72\x17\xe1\x95\xc1\x8f\x61\x0c\x85\x1e\x49\x56\xc4\xe2\x37\xd0\x9c\x61\x49\xac\x56\x64\x30\x82\xe6\x9a\x8a\xdd\x3d\x28\x66\x37\x96\xe2\x4d\xc5\xc8\x1f\x2f\xd9\x72\x04\xdc\x3e\x42\x75\xfe\x4f\xa4\x0d\x19\x54\xf0\x7c\xc8\x91\x6c\x2c\x01\x52\x91\x3f\xfa\x7f\xfd\xe9\x01\x7b\xc3\x0c\x09\xc3\xe1\x4b\x6d\xab\x5d\xcb\x09\x22\xd3\xf0\x08\x4c\x8e\xb9\x05\x74\xa0\x35\x46\xe2\x2c\x4f\xc8\x09\x74\x4d\x43\x03\x12\x01\xe6\xad\x25\x10\xdf\x9c\xe8\x59\xfd\xc9\x87\x53\xdd\x2e\xf3\x8e\xfb\x28\x4f\xef\xad\x74\x7d\x82\xd8\x88\x9c\x41\x57\xbd\xee\x13\x10\xc5\x6f\xe5\xc9\x07\x56\xb4\x69\xd5\xef\x83\x42\x40\x97\x2c\x21\x9b\x32\xcf\xea\x7d\xc7\x96\xfe\x54\xc4\x65\xb0\xf6\x79\x80\x03\xec\x44\x54\x54\x3f\x78\xfb\x32\x5e\xb2\xbb\xf7\x8b\xc4\xeb\xd4\xfb\x35\x80\x22\xd7\x9e\x2b\xec\x4a\xaf\x15\x9d\x7c\xe0\xda\xe8\xff\x8d\xf2\xa4\x90\xf5\xd4\x1f\xaa\x48\x8e\xe7\x35\x44\x62\x72\xab\xef\xf0\x54\x52\x49\x1b\xb4\xb6\xfe\x05\xb6\xb5\xc0\xef\xfc\x04\x2a\xd6\x28\xa6\x21\xe6\x4c\xed\x54\x3c\xd3\xae\x40\x4b\x0a\xc0\x45\x76\x11\x09\xec\x42\x9c\x34\x94\xaf\xe5\xc1\x01\x71\xd7\xe1\x72\xc1\x12\x9c\x58\x4b\x69\xd2\x53\x05\xf0\xa3\x34\xb1\x83\x0f\xb6\x9c\xf2\x6b\xcb\xaf\x68\xc5\xd0\xfd\x7a\xcd\xab\xb2\xa0\x0a\xd3\x1a\x51\xe8\x13\x2d\x5d\x0d\x2c\xb6\x41\x4b\x0a\x60\x05\x6d\x80\x75\xcc\xae\x5d\x3a\x13\x55\x86\x17\x6d\x45\x15\xb1\x12\x70\x2e\x55\x12\x5e\xcd\x20\x36\xeb\x76\x6a\x92\x35\x85\x57\x0e\x7e\xbb\x58\x25\x24\x66\x3c\xb3\x08\xaa\xb8\x9c\xa1\x66\xb9\x22\x66\xf6\xb1\xea\xcc\xed\xf6\x24\x0a\xe4\xcc\x1f\x3c\x41\xa2\xc7\x68\x28\x51\x4a\x0e\xd7\x84\xcf\x85\x54\xac\x3c\x88\x14\x90\x20\x0b\x27\xe4\xdb\xd0\xbc\x31\xa5\xef\xb7\xd5\xb8\x7c\x24\x19\x60\x65\xdc\xbb\x39\x41\xe5\xb8\xa9\x13\xbd\x33\xa9\xd8\x15\x53\x64\xdf\xe1\xba\xb1\x2b\x5e\x98\x83\x09\xf9\xff\x5b\x43\x2f\x35\xf8\x16\x2c\x48\x27\x0c\x43\x7b\x01\x07\xfe\x4f\x35\x79\x41\xf6\x61\xa8\xd8\x7a\x3c\xf0\x09\x24\x7a\xa9\x0d\xab\xd3\xf9\x79\x5b\x35\x10\xc9\x89\x8b\x39\x36\xc1\x8f\xde\xc6\xed\x16\x17\xad\xad\x15\x6e\x0f\x1d\x73\xe5\xa0\x23\x33\x1c\x92\x5c\x3b\xb9\xd8\x0b\xaf\x86\x8c\x0d\x7f\xa6\x86\xbd\xf0\xdf\x90\x23\x40\x14\x9b\x83\xf4\x42\xd9\xb3\xe5\xe6\x77\x89\x79\x98\x46\x36\xb2\x92\xf3\xe5\x79\xa3\x18\x2d\x8f\xa4\xd0\x46\x81\x8c\x7e\x48\xb7\xd2\xc5\x4d\x44\xb8\xe7\x4e\x5d\xed\x0a\x75\x15\x61\x72\x86\xb8\x4c\xb2\x9d\x2f\xb0\x15\x28\xfc\x90\xd0\x42\x49\xad\xc3\x3b\xdd\xd5\x64\x03\xdf\x9e\x9e\xf8\xbe\xa0\xde\xbf\x1c\xfa\x8c\xc2\x98\xe0\x6d\xbf\xa6\x4b\x27\x95\xe8\x94\x97\x3d\x04\x45\x4f\xfa\x5d\xd9\xe1\xd0\x9e\x8e\x37\xce\x83\xd5\x09\x0e\xdf\x1e\xdf\x35\x95\x61\x7b\x26\xef\x4d\x4b\x1a\xac\x0d\x07\x12\x1a\xd6\x2e\x18\x94\x30\xcb\x08\x31\x68\xa7\x74\xce\xaf\x98\x08\x33\xf3\x48\xda\x8e\xd6\xf4\xc3\xf9\x25\xbb\x4e\xf8\xa5\x7f\xd1\xef\xd8\xdd\x8b\x24\xc6\xe0\x0d\xfb\x41\x68\x6a\xb8\x9e\x71\x3a\xad\x1e\xb2\xf7\x29\x80\xa6\x9c\xb3\x8a\x15\x5b\x54\xdb\xbf\x8f\x89\x08\xd0\x7b\x46\x92\x19\x17\x2b\x3c\x96\x76\x74\x74\x28\x73\xbe\xd3\x1b\xd7\x01\x02\xcf\x0d\x0b\xd5\x72\xb2\x15\xae\x8f\x6e\x48\x0a\xc4\x2c\x88\xb6\x9e\x32\xe5\x45\x58\x9a\x7a\xe4\x40\x25\x49\x21\x95\x62\xba\x91\x58\xad\xea\x59\xc7\x09\xb2\xf4\xf3\x28\xb9\x84\x65\x68\x3d\x08\x4c\xe9\xc9\x07\xab\xf7\xea\xb4\x92\x00\xbc\x7a\x9c\xb4\xfa\x50\x4c\x05\xf2\xd5\x5d\x2b\x4b\xe7\x36\x3d\xf4\x86\xc7\xa0\x41\xfc\x49\xaa\x18\xee\xae\x21\x35\x50\x78\x25\x57\x42\xe1\x95\x27\x1b\x90\x20\x42\xc0\x8d\x73\x87\x73\x1c\xbe\x89\xe1\xdb\x9c\x03\x5d\x8f\xd0\x9c\x76\xb0\xad\xa2\x53\xc6\xec\xcd\x03\xc8\x02\xe3\xdc\x99\x23\x97\x6c\x09\x8f\xc7\x11\xd3\xbb\xd7\x0d\xdc\x16\x9e\xb0\x21\xf5\x5d\x78\x8d\xed\x2b\x0d\xfa\xbd\x9f\xe6\xe4\x87\x0c\xdd\xe3\x78\x25\xba\xee\xba\xab\xc7\xc7\x97\x9d\x37\x0e\x79\xb2\xe7\x8d\xeb\xe4\x72\xe7\x8b\x1b\x34\xf6\xe0\xea\x30\xbc\x86\xb8\xb8\xba\x2b\xdf\x86\x8e\x69\xfa\x14\xb7\x17\x85\xa4\x11\x39\x1b\xbc\xbd\xf0\xda\xe4\x06\x3b\x15\x23\xf2\x56\x1a\xfb\x9f\xc8\x23\x76\x2c\x99\x7e\x2b\x0d\x7c\xb2\x13\x2b\x89\x13\xb0\x4b\xeb\xe8\xbc\x16\x56\x0c\x0b\x3c\x6e\x5c\x76\x9b\x55\x14\xdc\x7a\x6d\x32\x83\x4f\x05\x91\xca\x4d\xf9\x40\x12\x82\x25\xad\x1d\x01\x71\x80\xde\xf5\xf9\xbe\xd1\x10\xb7\x54\xc4\xcb\x7c\x6f\xc4\x38\x42\x00\xf3\x18\xbf\x01\x28\xf6\xa6\x82\x82\xef\xb2\x85\x09\xa3\x76\xe6\xa8\x61\xf3\x3b\x97\x38\xae\x5e\x35\x53\x73\x46\x1a\x08\xeb\x64\xe0\xdc\x21\x8a\x04\x5e\x03\xd5\x89\x98\x98\xc1\xdb\x28\x73\x79\xe9\x3d\x3e\x14\x74\x4a\xb0\x35\xf2\xe8\xa8\x03\xf6\x7b\x44\x0a\x6a\x5d\x35\x05\x07\xc9\xff\x0b\xd1\xdb\xff\x21\x0d\xe5\x4a\x4f\xc8\xa1\xcf\x30\x8c\xbf\x73\x49\x1a\xd1\x63\x06\x90\xd2\xac\x07\x16\xa8\x20\xcc\x61\x5a\xc8\xd9\x9a\x32\x3e\x72\x78\xfb\xf6\xc0\x0e\xce\xe5\xbd\x4b\xb6\xdc\x4b\x45\x57\xc2\x2b\x96\x28\x7b\xa7\x62\xaf\x4b\x29\xec\x49\x81\xa0\x93\x02\xc0\xf9\x1e\x7c\xb7\x77\x7f\x7a\xff\x20\x0d\xb2\x03\x4c\x3a\xcb\xa0\x82\x0d\xdc\xb2\xbd\x3d\x55\xd3\x66\xd8\x96\xea\x98\xef\x3b\xb6\xdc\x5a\x08\xe6\x4d\x8f\x0a\x6f\xc2\x18\x67\xaa\x77\x9a\xa5\xc6\xfa\xfb\x0a\x62\xf4\x0b\xe7\x16\x94\x57\x4c\xa1\x4b\x30\x69\x6c\x74\x82\xd9\xb3\x26\xa4\xda\x77\x70\x3b\xc0\x8f\x30\xb0\xe5\x43\xef\xd1\xa8\xa4\xbc\x6c\x1b\xcf\xcf\x90\x86\x9b\xba\x63\xb8\x28\x64\xed\xfc\x22\xf8\x9e\xe0\x09\x77\x1b\x73\xec\x32\x9e\x50\xc6\x84\xad\x80\x39\x55\x3d\xaf\x4f\x62\x7c\x30\x9e\xcc\xe0\xe0\x65\xf6\xd8\x0f\xfe\xc0\x6e\x7a\x6f\x9d\xaa\x24\x02\x7c\xae\x7d\x3c\x0b\xae\x0d\x34\xad\x43\x60\x7d\x26\xd5\x94\x97\x25\xf8\x22\x91\xb8\x50\xf0\xb5\xc2\x38\x56\xd2\xf4\xfc\x50\x69\x42\x63\xe5\xa9\x1b\xea\xe0\x57\x9d\x5d\xe2\x99\x49\x49\x4b\xc6\x0b\x06\x71\xed\x91\xec\x83\xc2\x2b\xae\x4e\x8d\x67\x04\x3b\xfb\x49\x23\x4d\x99\x0f\x1f\xda\x23\x49\xb4\x55\x65\xb5\x3d\x50\xc4\xd0\x2d\x83\x91\x3e\x10\xc9\x2e\x29\x61\x6e\x85\xb4\xe9\x33\x5b\x52\xa3\x08\xd7\xdd\x02\xf6\xf6\x94\x19\xea\xfb\x5c\x88\x15\x34\xa8\xfe\xe4\x9f\x8a\x33\x59\xf6\x3d\xda\xb7\xc0\x42\x91\x7d\xff\x8f\xe9\x32\xb9\xe8\x85\x0c\xd6\xf1\x06\x68\x76\x39\x0f\x87\xe1\x0a\x97\x73\xa6\x6f\xef\x58\x80\xe1\xa3\x50\x14\x26\xdf\xce\x15\x43\x14\x60\x90\x4a\x20\xa5\x5c\xdb\xab\x56\xb0\x2b\x66\xb9\xb7\xe4\x76\x0e\xa7\x6d\x22\x66\x9a\xcb\xcf\xfa\x65\xcd\xab\xff\xff\x3b\x96\x6f\xa5\xf1\x61\xaa\x5f\x46\x2e\x60\x8e\x7a\xdc\x07\x5e\xb7\x35\xf6\xad\x36\xc6\xda\x30\x7c\x36\x63\x2a\xb1\x39\x1f\x09\xb5\x27\x7d\xdf\x75\x3f\x5a\xe3\xa4\x84\xa1\x6a\x0e\x05\xd3\xce\x0f\xed\x55\xae\x79\x25\xa7\xb4\x22\x35\x17\x96\xb4\xb4\x99\xb8\x58\x7b\x4e\x78\x63\xf7\xe7\x2d\xc4\x81\x0e\xea\x3a\x4b\xa1\x73\x3c\x2d\x43\x42\xb9\xe4\xf1\xd9\xca\x6c\xac\x3c\x1c\xe4\x4b\xc5\xb4\xc6\xf4\xe0\x37\x5c\x1c\xbb\xd0\x62\xd2\xb0\xaf\xad\x74\xfc\x40\xeb\xa6\x62\x23\x0c\x3f\x7e\x3d\xfe\xa7\x14\x8c\xb8\xb2\x87\x51\x60\x51\x57\xc7\x63\x24\x79\x89\x0a\x6f\x13\x60\xc9\x7c\x7d\x4d\x12\x05\x3d\xb9\x1b\x82\xad\x9a\x7c\xf5\xfc\xab\xe7\x2f\xd3\x44\xcc\xa9\x2b\x3d\x2a\xa8\x76\xdd\x6d\xd7\x57\xf7\xce\x45\x3c\x78\xfd\x8b\xd8\xd9\x79\xe9\xfe\xfb\x95\xfb\xef\xd7\xe4\x5f\x89\x4f\x23\x67\xe4\xac\xf7\x5f\xfb\x9f\xc4\xa7\x8d\x2d\xf3\x44\xcb\xf5\x72\xd4\x3f\x5b\x0b\x2a\xf0\xe0\xb3\xe7\xbc\xdb\xdf\xa0\xed\xe1\x2b\xc0\x39\x53\xc8\x9a\xc1\xd4\x7f\xf5\xbf\xd3\x74\x4d\x7c\x2e\x64\xe8\x1b\x22\x85\x7b\xfa\xcb\x7d\x98\xae\x03\x72\x0d\x79\x0f\x35\xbd\xc4\x80\xd5\x61\x61\x5a\x5a\x59\x82\xf7\xbf\x1e\xbf\x3c\x20\x52\xf4\x6e\x4f\x22\xe1\x8a\x4b\xab\xaf\xf9\x99\xd8\x7f\x99\x88\xf1\xb0\x3a\x9d\x5f\x6d\x98\xce\xde\x4c\xc2\xdb\x52\xb1\x84\x57\xc8\x2b\x93\xbd\x38\x3e\x14\xcb\x6b\xba\x0c\x42\xd9\xab\xeb\x73\x7e\xc5\xc8\x82\xcf\x17\x80\x86\x30\xa0\x5f\x2a\xc1\xbc\x6f\x90\xb1\xdc\xb7\xb4\x44\x42\x96\x84\x27\x6a\x7f\xa7\xe6\x99\x86\x8c\x16\x8c\x51\x38\xa0\x9b\x50\xa7\x16\x8a\x4f\x5e\x82\x58\x79\xb1\x02\xf4\xb1\xe5\x34\xa7\xaf\xbf\xba\xbb\x4e\x11\x64\xf2\xd6\xd4\x8a\x40\x41\xaf\xe1\xc1\xfa\x69\xb6\x7a\xb8\x0c\xe0\xda\x8f\x9c\x5a\x70\x50\x84\xc3\x33\x1c\xe3\x97\xce\x1a\xee\x4e\xb4\x6e\xf6\xd2\xfc\xb2\x67\xb2\x0c\x09\x22\xc4\xe9\xd3\x90\x58\xa7\xc9\x5e\xff\x18\xd8\x83\x44\xbb\xe0\xbd\x71\x18\xce\xce\xde\xe3\x52\xd8\xf7\xf0\x9b\x7f\x50\x1b\x70\x42\x0e\x45\xd9\x55\x13\x25\xce\x12\xfb\xb5\xa5\x15\x38\xaf\xe7\x90\x27\xa8\xf2\xcc\x57\x54\x77\xb4\xd6\xd7\xb6\x93\xe6\x89\xaf\x8d\xfb\x5e\xb7\x15\x64\x5a\x7e\xfc\xfd\xb3\x72\x82\xee\x52\xad\xc0\xea\x0c\xb9\x56\xb5\xc4\xde\xf5\xc2\xab\xff\x2e\xf3\x42\x3a\xbf\xc4\xa0\xcd\x70\x3a\xdb\x50\x4e\xd7\xe5\x6e\x91\x29\x5b\xd0\x2b\xbb\x1d\x01\xc6\x29\xde\xa9\x6e\x89\x41\xc5\x1a\x92\xed\x1d\x15\x58\x38\x11\xa8\xfb\x2c\xf3\x62\xc0\x36\xef\xde\x4d\x1a\x7c\xbf\x9f\x56\x4f\xab\x10\xff\xe8\x59\x12\x89\x26\x75\x8a\x82\xfa\xd5\x68\x65\x5e\xdd\xe7\xbf\x7d\x28\xbd\xf5\xab\x34\xbd\xf5\xde\x95\x4b\xfc\x6f\xb2\x8d\xd4\x6d\xdc\x8d\xfb\xf5\xb7\xfb\xdd\xac\x1f\x40\x86\xff\x9a\xc0\x05\x64\xac\x2e\xc9\x39\x71\x87\x39\xf5\x5e\x73\xd3\x52\x04\xe0\x12\xec\xda\x95\x54\x47\xcb\xba\xb2\x44\x91\x93\xcb\xab\x6c\x69\x72\x65\xca\x0a\xda\x6a\xbb\xa9\xeb\xc6\x9a\xdf\x44\x5b\xf6\xf3\x0e\xc3\xaf\xf7\xbf\x26\x63\xf2\xe2\xc0\xee\x6e\x81\xa2\x05\x58\x30\x56\xb8\xa1\xb1\x0d\x1a\x7a\x66\x61\x4d\x7d\xbb\xce\x89\x52\x8e\x3b\xf4\xce\x15\xb5\xf7\xf1\xa9\x4d\x42\x96\xec\x70\x36\xe3\x82\x9b\x65\x2a\x9c\x7d\x1e\xf5\xe9\xed\x1a\x25\x91\x1a\xb5\x90\xd7\xe4\xda\x61\x09\x00\x2f\x3b\x48\xbc\x98\xfc\xe7\xf6\x8f\x41\x8e\x6b\x38\x2c\x83\x2e\xe2\x2c\x8e\xa0\x0f\x38\x69\x63\xf9\x6e\xe2\xea\xe6\x5d\xa3\x9e\x94\xb1\xc6\xe4\xaf\x52\x48\xf5\x0a\x8d\x43\xec\x65\x1f\x74\x90\x1b\x5f\xcb\x9d\x2f\x45\xd5\x96\x51\x07\x8c\x4e\x7b\x4a\x3c\x3e\xc7\xe4\x14\xfc\xb7\xaf\x3e\x36\x72\xf0\xf2\x02\x88\x42\x19\x0e\xbc\xdb\x08\x4a\x4f\xe8\xdf\x58\x24\x0f\x47\x39\xc7\x40\x60\x3f\x30\x69\xbf\x85\x49\x25\x0d\xf0\xcf\x83\xd7\x1e\xd9\x19\xb9\x80\xf4\xee\xed\x6f\xa5\x98\x8e\x5b\x37\x12\xf6\x3e\xc3\xa4\xf4\xd5\x0d\x90\x34\xfa\x43\x6c\x1a\xe4\x3d\x7b\xf0\xc8\xd6\x38\xea\x47\x84\x56\x12\x82\x48\xf6\x38\xb2\x1f\xb1\xd2\xdd\x38\x93\x3e\xd6\xb4\x1a\xfb\x48\x22\x63\x01\x68\x9f\x5d\xf9\xca\xa8\xb7\x0b\x72\x6c\x41\xbf\x20\x9f\xb0\xe9\x1e\x78\x83\x21\x95\xdb\xda\x61\x51\x32\xfd\xf6\xea\xfa\x02\x09\xde\x61\x7d\xc9\x40\xb3\x80\x85\xc3\x58\xda\x04\xf6\x60\xdc\x5c\x9d\xba\x70\xb3\x53\x96\xb8\x4e\x4e\xfc\xb4\xea\x34\x07\xc8\xde\x82\x56\xb1\xdd\x61\xed\x1d\x5e\x32\x85\xea\xce\x94\xf5\x50\x98\x52\xeb\x2d\xf0\xfa\xa9\x7b\x3a\x22\x36\x01\x94\x00\x0e\xfe\x27\x04\xbf\xdd\x9b\xb6\xc5\x25\x33\x3e\x31\x43\x01\x4a\x4a\xd3\x1a\x32\xa5\x15\x15\x85\xdd\x8b\xa0\xc9\xa6\x39\xea\x67\xde\xf5\x6f\x24\x12\x80\xa3\x25\xbf\x0d\x76\x8c\x08\xf8\x3f\xf8\x0a\x51\xfd\x2a\x17\xda\x58\xaa\xb1\xb0\x75\xd8\xe4\x1d\x56\x5a\x8e\xac\xd4\xf5\x83\xae\x05\x2f\x70\x78\xf7\x6f\xcc\x9f\x71\x1a\x01\x63\xc6\xc1\xc6\x45\xc9\x2b\x32\xa5\x17\xda\x26\x5d\xcf\xe1\xf4\xf6\x4f\x8b\xb4\x97\x64\x93\x39\x64\xff\xad\x6c\x8f\xbd\x3e\x5e\xa3\x87\x80\xda\x1b\xe1\x2a\xda\x5d\xe2\x90\x3c\xf1\xe5\x41\x41\xa7\x66\xe8\x8c\x8b\x12\xf0\x81\x57\x89\x09\x4f\xed\x53\x65\x0d\x01\x4f\x11\x98\xb9\xf9\x29\xda\xec\x8e\x7d\x68\xf1\xb9\xe6\xe3\xde\x96\x10\x5d\x77\x5f\xf4\x55\x14\x28\xb2\xa1\x95\x47\xf9\xb1\x2a\x05\x9f\x59\xab\xab\x94\x0c\xb3\x22\xd0\x3d\x9e\xe8\x7c\x63\x5e\x2f\xe9\x5c\x44\xa9\xa7\x76\xcf\xdd\x42\xf6\x7d\x76\x00\x31\xac\xaa\xf0\x74\xe8\x3c\x62\xd6\x12\x36\xb2\x73\x89\xa5\xfa\xf6\xc7\xa4\x1f\x9a\xd8\x38\x58\x3c\x90\x07\x6d\x82\xc8\xe9\x32\xb4\x96\x4d\xcd\xc1\x9d\xb6\x86\xcc\xf9\x95\x55\xa1\xd6\xe2\x1f\x9b\x62\x19\x18\x7f\x5a\xb0\xaa\x21\x8a\x95\x6d\xc1\x06\x64\x02\xea\x44\x33\x9b\x90\xc3\xd8\x21\x08\x98\x19\xe1\xb8\xdc\xeb\xf1\xe2\x9e\xeb\x83\x3b\x5c\x51\xe4\x33\x90\xb0\x60\xe2\xf1\x19\x61\x57\x4c\x2d\x49\x23\xb5\x06\xd9\x0f\xfa\x02\x82\x1c\x42\x36\xe5\xcc\x17\xd6\x80\x53\x05\xe6\xcc\xf9\x17\x92\x06\xdf\x73\x4e\x89\x3d\x70\x2a\xcb\xc1\x3a\xc0\xee\x46\xad\xbf\x7e\xfe\x32\x35\x6a\x9d\xdb\xfb\x77\x06\xff\x0b\x21\xe5\x41\xa1\xe5\xd3\xd9\x26\x39\x19\xe6\xb6\x27\x79\x3e\x25\xea\x9c\x1a\x9a\x84\x99\x81\xe0\xf0\xd7\x07\x51\xc0\xfa\xeb\xe7\x5f\x3d\x7f\xb9\x6f\xe7\xfe\xab\x03\xbb\x0a\x51\x58\xf9\xab\x28\xac\x1c\x7e\xe9\xde\x22\x01\xc2\x8a\x74\x49\x3b\xfb\x2f\x0f\x26\x50\xd3\x00\xf8\xa4\xd7\x52\x95\xae\xc4\xdf\x23\x46\xda\x37\x0f\xed\x3f\x79\xed\x95\xcf\x11\x08\xad\x20\x1d\xd3\xdc\x43\x10\xd0\x80\x30\x3a\x37\xe4\xcb\x5a\x2a\xf6\x65\x34\xc4\x63\x55\x0c\xd6\x93\xbb\x6a\xda\x8c\x2f\x13\xf2\x76\x87\x14\x3b\x0f\x2d\x75\xbe\x29\x45\xad\xa6\xcd\x1d\x9e\x73\x25\xab\xb6\xbe\x6b\x16\xf6\x30\x85\xe8\x7b\x57\xb7\xea\x86\x76\xa5\x95\x98\xe6\x50\xbb\x9a\xe3\xe9\x32\x86\xf2\x9d\xb2\x4a\x8a\x39\xc6\x2a\x43\xc3\xc2\x3b\x8e\xfa\x69\xc8\xea\x85\x14\x05\x6b\x8c\x7e\xae\x8d\x54\x74\xce\x9e\x3b\x22\xef\x34\xd8\xf6\x20\x0b\x7e\x04\x6a\xfb\x95\x6f\xd8\x14\x08\xdf\x23\x00\x2d\xfb\xfa\x6f\x90\x97\xb4\x00\xd8\x49\x98\x75\xab\x2d\x45\x0d\x86\x45\xea\x74\x6f\x09\xb5\x20\xa1\x83\xe0\x90\x6a\x50\x7a\xad\x4f\x2a\xaa\x0d\x2f\xbe\xad\x64\x71\x79\x6e\x64\x9a\xa3\x2f\x87\x85\xb1\x89\x96\x1e\x27\x08\x72\xf8\xd3\x39\x39\xe6\xfa\x92\x28\xa6\x65\xab\x0a\xd7\xaa\x6c\x05\x90\xf1\xae\xd8\xb1\x78\xd9\xcd\x54\x31\xe3\x20\xf7\x49\x4d\x8b\x05\x9a\xfe\x2e\xeb\x81\x7d\x68\xa4\xee\x9a\xaf\x27\xb0\x14\x5e\x71\xa7\x8a\xc3\x9f\xce\xd7\x5f\x99\xeb\xa8\x49\x06\xfa\x10\xb1\x94\x06\x3c\xb1\x5d\xa6\xfc\xd8\x28\x96\xa6\x95\x6d\x9c\x69\xcb\xf0\xe0\x94\x52\xac\xe4\x0a\x81\x54\xdd\xbb\xb2\xa9\x9e\x14\x9a\x4f\xe8\xb5\x9e\x14\xb2\x26\x47\xe7\xa7\xa4\x54\xfc\x2a\xb5\x4f\xd2\x30\x51\xf6\x05\xbd\xd6\x0c\xc9\x9f\x5a\xf2\xed\xd7\x29\xf3\xb0\xe5\x5e\xa1\xf8\x36\xa7\xc7\x09\x3f\x1f\x5a\xff\x3d\xd3\x17\xf6\xdd\x13\xed\xb9\x5c\x55\x73\x48\x85\xf7\xc8\xce\x78\xc5\x10\xb0\x0b\x39\xd1\xc5\x7d\x9d\xd8\x87\x6d\xbe\x94\x2d\xb9\xa6\xe8\xd8\x86\x73\x36\xbd\x7c\xf3\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x91\xfa\x2a\x09\x56\x71\xf7\x7d\x84\x3d\xba\x10\xc8\x06\xb7\x1d\xc5\x7c\x00\xc4\x18\x5e\x27\x68\x9d\xe9\x57\x64\x8f\x7d\x30\xdf\xec\x8d\xc8\xde\x87\x99\xb6\xff\x11\x66\xa6\xf7\x26\xe4\xb4\x6e\x2a\x5e\x70\x63\xcd\x51\x31\x63\xaa\x73\x15\xe3\x0f\x32\x75\x59\xda\x95\x3d\x49\x72\x54\xb2\x82\x53\x18\xd8\x73\xcb\x1c\x1e\x08\xf1\x4c\x1e\x7d\x20\xee\x93\xbd\x4f\x67\x44\x62\xe9\x41\x1f\xa6\x9c\xeb\xf0\x70\xcb\xd0\x6e\x74\x91\xd0\x6f\xa9\xbb\x3a\x16\x7e\x2d\x95\x7f\xe4\xf3\x92\x5d\x3d\xd7\x25\x7d\x39\x82\xd7\x42\xfe\x5c\xae\xcc\x01\xd5\x64\xef\xe5\x9d\x1b\x05\x74\xd7\x39\xaf\x79\x45\x55\xb5\x1c\xc5\x73\xd9\x3d\xdf\x1e\x95\x9e\x10\x70\x26\xbf\xd8\x23\xfb\x88\x06\x0e\xea\x7a\xc5\x7c\x3b\xbe\xd0\xd5\x17\x2a\xa0\x92\x9b\xdd\x0d\x4d\x0c\x21\x83\x93\x43\x08\x1c\x4c\xb4\x7c\x27\xaa\x64\x70\x8f\x5c\xdc\xef\xe9\xf0\xf8\x81\xaa\x75\x51\xec\x99\x44\xcd\x8d\x75\xb7\xf8\x96\x3c\x5c\x38\x13\xe0\x8d\xe5\xd1\x01\x78\x16\xbb\x26\xce\xd2\xdb\x0f\x92\xa0\x29\x6c\x7b\x41\x3d\x1d\x90\x52\x2f\xf8\xaf\x2d\x23\xa7\xc7\xfe\xa0\x6e\x98\xd2\x5c\x1b\x26\x0c\x29\x7b\x1a\x3a\x47\xb5\x7d\xff\xb0\xa6\xff\x94\x82\x9c\x7c\x7b\xee\x1e\x94\xbc\xcd\x76\x6f\x75\x13\x0f\x2b\xfa\xcf\x56\x31\x6b\xcf\x6c\xcd\xe4\xf2\x04\xac\xda\x59\xf6\x73\x72\x4c\x0d\x45\x73\x0b\x4f\x0c\xd9\xf5\xf4\x02\xb3\x68\x0a\x78\x6e\xbe\x79\x5c\x3e\xa3\x28\x10\x75\x27\x4b\x28\x7a\x19\xbb\x28\x69\xf3\xb1\xd1\xfc\xb1\xfc\x8c\xf6\x8f\x1d\x21\x83\x05\xb4\x65\xcb\xc3\xbe\xcf\xdb\x54\x8f\x3e\xfe\xfc\x87\xf7\xa7\x5b\xb0\x5b\x0a\xb0\xc9\xe7\x6f\x64\x99\xc7\x78\x79\x16\x3d\xd0\xab\x68\xd0\x10\xf8\x08\x3f\x27\xb5\x1d\x89\xbc\x95\x82\x8d\xc8\x7b\x46\x4b\x62\x0f\x2b\xf7\xcf\x9f\x14\x37\x6c\xf2\x6c\x5b\x4a\xae\x5f\xc4\x2c\x13\xe1\x1f\xe6\x27\xe1\x6d\xd4\x26\x12\x7a\xb9\x82\x48\x77\x3a\xeb\xb4\x92\x53\xe2\x44\xea\x36\xdf\xfe\x87\xf7\xa7\xd9\x5e\xfe\x87\xf7\xa7\xfe\xdd\xed\x3f\xe5\x6c\x37\x5f\x7b\xd7\x0c\xf7\xd7\x2b\x16\xf3\x70\xcb\xe5\x8d\xab\x89\xa0\x6b\xd6\xf8\xfd\x9b\xe2\x93\x2d\x1b\xe1\x19\x20\x9c\x9c\xa1\xf7\x8a\x58\xba\xd2\xdc\xa0\x5c\x24\xc3\x23\xf6\x85\xab\x7d\x52\xd7\x93\x29\xca\x7a\x83\xde\x7e\xe5\x2b\x52\xb7\x95\x81\x2e\x37\xb0\xb5\xec\x5e\x83\x02\x32\xbf\xc9\x88\xeb\xfa\x6a\xb5\x03\xcc\x34\x29\x5f\x79\xf4\xa4\xf0\x8b\xcd\x3f\x78\x43\x05\x9d\xdb\xdb\xe1\xc4\x26\x35\xfe\x19\xed\xe9\x7d\x0c\xf0\x8b\xf0\x15\xbd\xa2\xbc\xa2\x53\x5e\x71\x03\xd6\xc8\xc1\xc4\xcf\x25\x42\xcd\x00\xc9\x5b\x13\xf6\x3b\x67\xd2\xc5\x9d\x30\xa0\x7b\x22\xd9\xb7\xdf\x3d\xbf\xb6\x87\xe2\xc1\x04\x4e\x48\xb8\x71\xc1\x54\x6c\xf5\x25\x8f\x6c\x37\xfc\xfb\x7b\xb2\x16\x87\x5b\x68\xd1\xc6\x83\xd9\x48\xb3\x04\xac\x34\xdd\xaa\x25\x60\x09\xd8\x68\x09\xc0\x17\xae\x97\xed\x16\x8c\x01\x18\x3e\xc1\x18\x80\xdf\x65\x36\x06\xec\xb1\xf4\x39\x19\x03\x9a\x15\x8a\x99\x01\xe6\x00\x88\xc6\xc4\xdf\x0f\x35\x08\x76\x4e\x2e\x96\x4f\x72\x31\xbe\x3a\xe6\xca\xb2\x42\xdd\xe3\xbc\xb2\x1e\x1a\xda\xe3\x57\x2b\x28\xd7\x28\xbc\xce\x9d\x76\xe0\x1b\xdd\xc3\xef\xad\xc8\x4a\xc1\xf7\xc7\x6b\xf0\x81\x1e\x36\x4d\x9e\x79\xf1\x4f\xf3\xd3\x82\x6a\x0f\x7c\x4c\x92\xb7\xf6\xc0\xd7\x2c\x58\xb3\x98\x6d\x0d\xda\xc1\x8e\xfe\xfa\xbc\x9f\x48\x72\xc4\x9a\x05\x79\x7d\xbe\xe1\x00\x43\xfc\x0e\x3b\x5d\x1a\xd3\x4b\x9e\x69\x52\xf1\x19\x33\x3c\x35\x32\x12\x9f\x61\x47\x48\x4b\xef\x00\x0b\xc0\x4c\xfe\xc0\xc2\xe9\x0a\x81\x47\x21\x7d\x7b\xd3\x60\xf7\x3c\xc2\xc3\xa5\x96\x82\x1b\x79\xe7\x5e\xe4\x24\x47\x1f\x03\x37\xf4\xb6\x8f\x06\x4f\x87\x5d\xd4\xf7\x7e\x3a\xc9\x9b\xe8\x53\x4a\x0a\x59\x55\xac\xf0\x58\x1a\xc0\xa6\x03\x66\x0e\xaf\x0d\x2e\x72\x97\x0a\xac\x27\x97\x7f\x00\x27\xb9\x73\x87\x3f\x47\xd6\x7b\xfe\xfe\xe4\xf0\xf8\xcd\xc9\xa4\x2e\xbf\x58\xc8\xeb\xb1\x91\xe3\x56\xb3\x31\x4f\x85\x4a\xdd\x7a\x97\x85\x0c\xd6\xf4\x3d\xa0\x16\x37\xd4\x2c\xf2\x98\xd7\xf6\x49\x96\x7d\xba\x8e\xf6\x3f\x68\xc4\x0b\x00\x44\x36\x97\x87\xa8\xa4\x34\x23\xa2\x28\x24\xdf\x86\x4e\xc9\xb3\xb6\xaa\x90\xcf\xac\xec\x19\xc5\xf1\xe1\xe7\x4f\x46\xae\x57\xa7\x7a\x93\xfb\x59\x59\xbc\xbb\x22\x1e\x86\xeb\x96\xa9\x36\x33\xc9\xc8\x30\x1d\x25\x7d\x96\x39\xef\x7d\x8e\xb9\x0f\x66\x61\x19\xe8\x92\x2d\x09\xa0\xda\x5b\xb3\xf5\x07\xcd\x54\x7f\x0b\x32\x53\xc0\xac\x3f\x6f\x35\x53\x13\x7c\xfc\x23\x5f\xe9\x21\xba\x32\xbc\xff\x7b\x36\xdb\x8d\x75\x7e\xcf\x66\x9b\x96\xd9\x7d\x0c\xdd\x99\x43\x55\x95\x55\xc5\x5b\xb3\xc0\xca\x5f\xec\x9f\x8f\x76\xca\xc6\x75\xc7\x3e\x08\x8f\x7c\xa1\x07\xe1\xab\xe7\x68\x6c\x23\x06\x58\x55\x24\x73\x13\x90\x38\x8e\xe6\x38\x63\x60\xb7\x94\x8b\x5e\x0b\x58\x84\x20\xe3\x57\xac\x5a\x06\x5d\x1d\xeb\x66\xca\x16\x11\x91\x69\x71\x79\x4d\x55\x09\xfd\xa6\x1b\x6a\xb8\xf3\x70\xf3\x74\xc5\xd2\x5e\xbe\x47\xb9\xc3\x5c\x76\x8d\x44\x5c\x01\xb6\xc6\x37\xe6\xce\x98\xc1\x82\x50\xe1\xc0\xa5\x1d\x82\x9a\x3d\x23\x69\x72\xd2\x85\x27\xa2\xb6\xb6\x5b\xc1\x94\xb5\xf6\xab\x25\xb9\x56\x32\x15\x81\xcd\x5f\x77\x4c\x2c\x91\x57\x4c\x5d\x71\x76\xfd\xfc\x5a\xaa\x4b\x2e\xe6\x63\xfb\xb2\x63\xdc\x02\xfa\xb9\xe5\x44\xfd\xfc\x0b\xf8\xcf\x00\xaa\x32\x75\xf6\x08\x1e\xea\xbd\xbd\x1c\xea\xf0\xe0\x86\x03\xf6\xb2\xe7\xdb\xb6\xa5\xba\xa5\xc1\xee\x25\x19\xeb\xd1\xca\x9f\xd8\x8a\x96\x52\xe3\x3d\x76\x1d\x7b\xf2\x9a\x96\x75\x22\x8a\x31\xd9\x19\x71\x9d\xea\xdc\xe1\xa2\x4c\x5b\xba\x2c\xce\x1d\x18\xbd\xef\xdc\x71\x9f\xb9\x24\xd0\x50\x0e\x42\x7d\x54\x02\x80\x67\x7d\x91\x47\xbf\xc6\x23\x83\x87\x07\x07\xbf\x5b\x88\xc2\x51\x9c\x39\x3e\x81\x4f\x85\x08\x85\x6c\x98\x15\xc9\xc5\xe5\x44\xaa\xf9\x7d\x14\x6d\xac\xf2\x6b\xbd\xd4\xbf\x56\x63\xa4\x60\xdc\x94\x1d\xc3\x3e\x3e\xcf\xd5\x53\x75\xc6\xad\xd5\x19\x8f\x3b\xd1\x63\x87\x6b\x2e\xee\x73\x4b\x91\xcf\xd2\x4b\xf3\x59\x85\xdc\xb6\xc8\x13\xc3\x7d\x31\xbb\x66\xa2\x77\x1a\x5d\x23\x01\x9b\xcd\x35\xcc\x04\x0b\x1c\x4f\x16\x1f\x2b\x04\x14\x06\xaa\x68\xcd\x0c\x53\x1d\x60\x7c\x21\x85\x18\xd2\x6f\xd6\x48\xf2\xae\x61\xe2\x1c\x0e\xe1\x27\xb3\xfa\xc9\xac\xbe\xfd\x7a\x32\xab\x9f\xcc\xea\x1c\x66\xf5\xce\x15\x0c\x79\x79\x8a\x20\x88\xae\x10\xb0\x43\x74\x70\x36\xcb\xe3\x3b\x33\x53\xad\x67\x29\x66\x7c\xfe\x86\x36\x83\x0d\xe8\xf0\xa4\x15\x63\x38\x7c\xec\x32\x1b\x00\x9a\xaa\x91\x0d\xb4\xe8\x73\x30\xa2\x30\xfd\x0f\x6f\x99\x0d\x3d\x8c\xdc\x86\xcb\x56\x04\x32\x80\xbf\x23\x52\xfa\xfa\x46\x6d\x3f\x99\x72\xd3\x69\x12\x9a\x19\xec\x07\x86\x3d\x57\x89\x14\xa4\x70\x08\xef\x60\xff\x44\x7d\xea\x32\xd8\x54\x82\xc8\xc2\x78\xa8\xd1\xd0\x3e\xec\xc5\x8b\x17\x2f\xb0\x77\xcc\xef\x7f\xff\x7b\x22\x15\xa1\xa4\x64\x05\xaf\xd7\x6f\x84\xbb\x7e\xfb\x32\xb1\xbd\x82\xbd\xfe\x76\xf8\xe6\x7b\xc0\x65\x69\x8c\xc6\x0e\x8d\x48\x91\x7d\x70\x6f\x50\x3d\x22\xff\xe7\xfc\xdd\xdb\xae\xf5\x5f\xff\x5b\xf0\x9a\x84\xe9\x4c\xa7\x27\x0e\xdf\xbe\xf8\xdd\x37\xdf\x0c\x78\x12\x38\x5c\xa4\xe2\x0e\xce\xd8\x43\xcc\x50\x7b\x1e\x2b\x86\x3d\x79\x40\x81\xf0\x16\x2c\x02\x80\x99\xe4\xf6\x20\xc4\x2b\x28\x35\x9f\x2f\x8c\x83\x89\xb5\x5b\xbc\xe2\x85\x41\x45\x00\xc1\xb5\xa4\x43\x6b\x86\x4d\x8f\x34\x04\xeb\x7d\x40\x02\x4b\xc9\x46\xa4\xe2\x97\x8c\xcc\xf4\x5f\x94\x6c\x9b\xae\x91\x2f\xf6\x2c\xf1\xd8\x47\x48\x44\xc7\xfb\xc9\x7d\x30\x77\xa5\x92\x7a\x50\x06\x4a\x2e\x21\x03\x44\xac\xb8\x1c\x1c\xf2\x69\xd7\x18\xb6\xa1\x3c\x80\x1d\x41\xd9\x26\xea\xb2\x7d\x1d\xb9\x48\x04\x94\xb3\xd7\x51\x38\x51\x7c\x03\x87\x46\xc9\xff\x46\x26\x07\x88\xdf\xe8\x44\x07\x68\x5c\xcb\x73\x1e\x18\xb7\xcb\x4c\x4c\x1e\xff\x92\x21\xf4\xad\xb5\xd7\x98\x08\xad\x16\xe1\xed\x01\xc5\x36\x9a\x1b\xfb\x45\xc5\xb5\x25\x0d\x3a\x02\x39\x8a\x93\xc7\xde\xf0\xa6\x61\x34\xd8\xf7\x1a\x77\x44\x2b\xd6\x46\xc5\x4e\x1a\x03\x46\x86\x23\x1d\x5e\x90\xfa\x2e\xb8\xdd\xd8\x08\x90\xee\x9a\xcc\xb8\x7b\x3d\x17\x84\x05\x4b\x6f\xdb\x1f\x2d\xa9\x66\xa6\x75\x4b\xcf\x94\x92\xca\xbe\x2b\xd3\xda\xf5\x57\xab\xa9\xba\x64\x65\x38\xff\x26\xe4\xcc\x4e\x8a\xef\x6f\x33\xc0\xc5\x53\x51\x6b\x85\xa1\x13\x9f\x2e\xe1\x35\x9d\xc1\x0e\xc4\x3d\x9b\x4c\x9e\xa1\xe0\x95\x8a\x68\x43\x95\x93\x86\xf6\xf3\x61\x92\x67\x8b\x79\x6b\x3d\xb9\xf1\x86\x36\xd0\x02\x1b\xf4\x4c\x60\x00\xf0\x61\xc0\x3b\xbb\xc3\x87\xba\x35\x4a\x3f\x5b\x32\x78\x18\x86\x3a\xdc\xf1\x1a\x27\x23\xac\xfb\xdf\xdb\x89\x19\xb2\xcf\x07\xbb\x49\x40\x52\x0d\xf9\xf9\x0a\x03\x5c\xf6\x31\xeb\x8d\xf4\xd2\x68\x98\x41\x9e\xc9\xf8\xad\x07\x28\xe1\x78\xe5\x74\x0b\x21\x3d\xfd\xe4\x9c\x4f\xd2\xc4\x0d\x7a\x7f\xaa\x01\x7b\x08\xaf\x1d\x52\xc0\xf1\xda\x35\x35\x1c\xaf\xd3\x19\x88\xf2\x95\x23\xdb\x1d\x35\xb1\x51\xe5\x75\x0d\xbb\x76\x43\x07\xdd\x9e\x06\x8d\xd7\x56\xf4\x68\xbc\x72\x68\xd3\x78\x0d\xd7\xa9\xf1\x1a\x92\x06\x8d\x57\x5e\xc1\xe1\x93\xa9\x71\x31\x9c\xda\x81\x9a\xc5\x2c\x30\x00\x44\x3d\xc1\xa7\xe2\x85\xf1\x60\x79\xe1\x94\x1a\x14\x19\x74\xaa\x65\xd5\x1a\x1c\x38\xd7\xa3\x63\x7d\x09\x5e\x88\x55\xd0\x93\x62\x90\x92\xb4\x3a\x48\xa4\x7b\x81\x76\x8c\xea\xca\xf0\x11\x76\x33\x87\x7f\x48\x28\x24\x17\xdb\xe6\x0d\x81\x6c\x3f\xfc\xb1\xf5\xd0\x47\xee\xb0\xc7\xae\x85\x3c\x72\x82\x4b\x24\x86\x3a\x82\x7f\x34\xc7\xde\xf1\x0f\x0b\xd8\x82\xd7\x0b\xe6\x8a\x5c\x22\xe3\xd7\x2a\x59\xf6\x08\x05\x8b\xdc\xf7\x5b\xc5\xa6\x3e\xdb\x8a\x96\xe7\x0d\xf7\x14\x9a\x0f\x0f\x22\x68\x4e\xf6\x8f\x02\x66\xb6\xaf\x97\x3d\x15\x86\xa9\x19\x2d\xd8\x41\x1c\x5c\x60\xcd\x82\xd5\x4c\xd9\x89\x77\xf7\x79\x08\xe6\x05\x15\x65\xe5\xa0\xcf\x71\x17\x11\xf6\xc1\x30\x65\x17\xa9\x4b\x3e\x4b\x52\x1e\xb7\x0d\x98\x05\x94\x6f\x23\xd6\x01\x03\x6f\xfb\xac\x41\x2a\xbc\x7a\x24\xa2\x93\xa7\x5b\x56\xdf\x37\xcd\xb2\x80\x8e\x03\x4c\xe9\x12\xf4\x48\x0a\xd0\x8a\x41\xdc\x2f\x65\xab\x30\xe1\x36\xe4\x51\x16\x52\x29\xab\x9f\x03\x41\x54\x13\xc5\xe6\x5c\x1b\xe8\x0e\xe3\xbb\x5a\x62\x87\x89\xad\xe1\xf1\xec\x54\x26\x5f\x48\xd9\xbb\x05\xe9\x28\x79\x0c\x67\xd1\x35\x4a\x5e\xf1\xd2\x1b\x74\xf1\xf9\xcc\x35\x69\xa8\x8e\xf0\xd3\xa9\xd6\xb2\xe0\x10\x00\xeb\xb8\x28\x79\x7c\xf4\x84\x82\xb9\x58\x32\x63\xad\x7b\xc1\x7a\xc8\xb7\x71\x92\xa1\x24\xb4\x69\xaa\xe4\x4a\x9b\xc1\x6c\x21\x64\xc9\xce\xda\x69\xc5\xf5\xe2\x7c\x57\x12\xa7\x36\xd1\x84\xc5\xc9\x6b\x15\x4d\x37\x25\x50\x0d\x48\xda\x12\x9a\x83\xc5\x65\xf5\x25\x6b\x60\x72\x29\xc0\xd5\x45\xb5\xf6\xa3\xc6\xa2\x46\x82\xde\x59\x31\xc3\xfc\x57\xe9\x7a\x74\xf7\xde\xae\xf7\x84\xb5\xc9\xed\xa7\x3f\x88\xa6\xf7\x79\x41\xab\x6a\x80\xe7\xa3\xaf\x62\x7b\xed\x05\x5d\x00\xbe\x8f\x05\x6e\x18\x6e\xf7\x92\x9f\x65\x28\x29\xc3\xd3\x6b\x82\x1d\x40\xd3\x55\xdc\x8d\x0b\xa7\xa3\x36\xff\x52\xf8\xd5\x1d\x59\x85\xdc\xff\x20\x70\x00\xc2\x77\xe1\x3e\x7e\x4a\x67\x7b\x4a\x67\xfb\xc8\xb5\x75\x9b\x8e\x3c\xa5\xb3\xdd\xf5\xda\xc5\x74\xb6\x9d\x4b\x39\xf7\x8e\x6b\x3c\x1e\x69\x39\x06\x34\x41\x4c\xba\x6a\xb1\xdc\x27\x68\xa9\x43\xb5\xe0\x8f\xe0\x0e\x6c\x2d\xe5\x1b\xdf\xeb\xd0\x18\xc5\xa7\xad\x49\x17\xc5\x79\x73\x0d\x3b\x7a\xc0\x3c\x65\xda\xe9\x0c\x63\xb7\x64\x45\x74\x78\x38\x27\x7f\x38\xd1\x22\x4d\x63\xa0\xa9\x34\x09\xb6\x0b\x98\x2d\xf8\xe1\x33\x4d\x4a\x59\xb4\x35\x13\xa6\xe3\x90\xae\xd6\x05\xe3\x2c\x5b\x3c\x55\x69\x59\x72\x54\x4a\xce\x32\x9c\xaf\x83\xc4\x51\x29\xaf\x85\x3d\x8f\x0e\xcf\x92\x10\x7e\xfb\xe8\xbe\xdd\xb3\x62\x37\x86\xff\x98\xd8\xcf\xe9\x14\x7a\xd2\xbb\x96\xab\x4f\x29\x93\x1b\x1f\x91\x67\x9b\x6e\x8a\xcc\x1a\x49\x5a\xcd\x6e\x4d\x89\xec\x22\xab\x59\x47\x7e\xca\xce\xdc\x8d\xb0\xf0\x53\x76\x66\xea\xc8\x4f\xd9\x99\x69\xc3\xf7\xe4\xd9\x29\xa6\x58\x5a\x75\xae\x72\xbd\x3d\x7b\xe7\x83\xcb\x4c\x18\xb0\x50\xbb\x95\x55\x76\xdc\x9d\x89\xe8\xdc\x58\x05\xfe\x5d\xf1\xc3\xa0\x2c\xec\xe2\xe0\x51\xd1\x9c\x3f\x34\xc1\xd8\xfc\x1c\x32\xd0\x76\x20\x83\x0c\xe6\x72\x80\x4f\x10\xaf\x3e\x5a\x5c\x07\x3d\x88\xdd\xb8\x31\x45\x37\xca\x11\x6e\x64\xf9\x0a\x1b\x50\x53\x21\x24\xaa\xa8\x7a\x84\x0d\xbc\xf5\xc8\x81\x5f\x80\x91\xda\xd0\x02\xbd\x64\x2d\x2f\x41\xa6\x76\x08\x95\xa9\xd8\x71\x78\x65\xe1\x02\x92\x89\x13\x08\x70\x03\x4c\xd1\xd9\x10\x96\x20\xd9\xd8\xc2\x5e\xb4\xe1\x3f\x32\xa5\x07\xf4\xb6\xeb\xae\x7e\xe3\x5d\x7c\xaa\xe7\x06\x5d\x2c\x58\x4d\xe1\x9f\xaf\xfd\x14\x58\x01\x69\xad\x4e\xc3\xb0\x7d\x1d\x53\xb5\x26\x72\x36\xea\x55\x60\xef\x5d\x0d\xe9\xe8\xe6\xaf\x4c\xce\x0c\xe2\x37\xd3\xd9\xe0\x74\x23\xb2\x3a\x61\x67\xbd\xe4\x20\xbb\x91\x40\x8f\xb4\x7b\xcb\x87\x9f\xba\x44\x6d\x38\x44\x70\x86\x77\x68\x72\xf2\x7b\x6a\xf0\xda\xb5\xac\xd0\xd4\x6c\xd0\x51\xc8\x18\xe8\xab\xec\x03\xc9\x79\xca\x06\xed\x5f\x4f\xd9\xa0\x4f\xd9\xa0\x59\xb3\x41\x23\x65\xc7\x9f\x5b\x1b\x12\x3b\xe3\x3c\x06\x9f\xdd\x39\x65\xde\xee\x77\x1e\x07\x9f\x9c\xe9\x33\x33\xa5\xea\x17\xa0\x3c\x9b\x4c\x9e\x61\x09\x4a\xe7\xa2\x68\xcd\x6c\xfc\x07\xc2\x44\x21\x4b\xfb\x9c\x0b\x78\xbe\xd2\x06\x54\xf8\x2e\xce\x13\xd3\x52\xfb\xb1\xe2\x22\x16\x78\x76\x0e\x8d\x6a\xf0\x51\xe1\x7b\x39\xbe\xce\xaf\x98\x0e\x16\xee\x9d\x3a\x1b\x3a\x4e\xba\x29\x2e\x7c\x46\x93\xd3\x6b\xfd\xf7\x9a\x54\xbc\xe6\xd0\xde\xa4\x04\x09\xc7\xb4\x19\x16\xe8\x22\x64\x1f\x1f\x39\x29\x9a\x76\xe4\x1e\x3f\xa9\x59\x2d\xd5\x72\x14\x86\xb0\x5f\xf6\xc6\x74\x77\x1c\x80\x12\x5d\xb4\x4a\x31\x61\xaa\xe5\x30\xc0\xf7\xee\xda\x41\x6d\xda\xaf\xc0\x8e\x28\xd3\x81\x41\x86\x34\x62\xe8\xae\xbe\x0c\xea\xf2\xe9\x20\xd4\x1c\x66\x11\xce\x4e\x07\xec\x37\xea\xb2\x18\xed\xa7\x4c\x5c\x91\x2b\xaa\xf4\xb0\x3d\x4f\xf2\xea\xcf\x25\xbf\xe2\x5a\x26\xe7\xa0\x45\x0f\x8a\xa7\xe7\x3c\x44\xd0\xec\x4e\x95\xad\x69\x5a\xe3\x8e\x13\xbf\x7d\xd9\x87\x46\x5a\x25\x2d\x6c\xdb\x15\x43\xe3\x65\x6a\x80\xb2\xbb\x1a\x6a\x0c\x53\xe2\x15\xf9\xbf\xfb\x3f\xff\xe6\x5f\xe3\x83\x3f\xef\xef\xff\xfd\xc5\xf8\x3f\xfe\xf1\x9b\xfd\x9f\x27\xf0\x8f\x2f\x0f\xfe\x7c\xf0\x2f\xff\xc7\x6f\x0e\x0e\xf6\xf7\xff\xfe\xdd\x9b\xbf\x5c\x9c\x9d\xfc\x83\x1f\xfc\xeb\xef\xa2\xad\x2f\xf1\xaf\x7f\xed\xff\x9d\x9d\xfc\xe3\x13\x1f\x72\x70\xf0\xe7\xff\x35\x98\x74\x2a\x96\xef\x06\xca\x61\xbc\xc6\x19\xf5\x81\xfe\x13\xb3\xb0\xdf\x8a\x95\xc2\x85\x19\x4b\x35\xc6\x47\xbf\x82\x9e\xd2\x03\x07\xf0\xec\x95\x7b\xff\x77\x3a\x48\x38\x97\x82\x81\xb8\x43\x1b\xfc\x3e\x6c\xc0\xcc\x25\x17\x90\x12\x72\xcc\xb7\x86\x36\xea\xc7\xef\x43\xac\x18\x56\x37\x52\x51\xb5\x24\xa5\x0b\x39\x2c\xef\xa1\x8d\xcc\xc0\x46\xd7\x40\x7a\xc9\x53\x76\xf5\x96\x43\x96\x35\x2b\x79\x5b\x6f\x3b\x5a\x89\x54\xc4\x0b\x7f\x6d\x97\x18\x32\x96\xe4\x2c\x64\xc0\xbb\xdb\x5c\xcc\x78\x4a\x8b\x4b\x74\x22\x04\xce\x18\x12\x59\x62\x31\xe4\xf0\xde\x9e\x4b\x75\xad\x19\x15\x21\x72\x0a\x69\xd9\xb2\x64\xcf\x74\xb8\x17\x49\xca\x12\xac\xc4\x94\x2c\x57\xd3\xb5\xef\x06\x38\xb0\xa6\xd0\x1b\xd0\x5f\xb7\xd6\xc6\x7d\x00\x77\x93\x2c\x8d\x09\xf8\x3f\xd9\xf7\x56\xd7\xdf\x36\x9b\x06\x42\x7c\x8e\xbe\x91\xe0\xd6\x71\x8d\xae\x66\xa4\x92\x45\x54\xb0\xd1\x53\x45\x81\x51\x4f\xbc\x88\x1b\x9a\xad\x64\xd9\xd5\x52\x83\x36\x10\x84\xd4\x2a\x8d\xf9\xd6\xbc\xa0\xd3\x8a\xa1\xeb\x08\xf8\x66\x30\x8f\xda\xc1\x6a\xfa\x81\xd7\x6d\x4d\x5a\x6d\xdf\x4c\x8a\xfe\xb3\xbb\x17\xbb\xc6\xad\x89\x7b\xa5\xe6\x02\x7e\xd4\x73\xb3\xa5\x07\xaf\x16\x8c\x9c\x87\x15\xe8\x9c\xbe\x98\xbe\xe8\x7c\x3a\xba\x05\xd3\xdf\x51\xe7\x0c\x50\x39\x83\x34\xdb\x60\x87\x68\x02\x78\x0e\xc9\x8d\x33\xc9\xba\xc0\x10\xbc\xea\x4b\x0c\x90\x5f\x8b\x68\x81\x5a\xe1\xea\xa1\x1e\xeb\x3e\x7e\x74\x5a\xfc\x40\xdd\x3d\x97\xc6\x9e\x45\x4f\xcf\xae\x9d\x87\xfa\xb2\xad\xa9\x7b\xa1\xc0\xad\xa7\xef\x39\x7f\xf4\x86\x62\x37\xea\xeb\x8c\x82\x80\x1d\x02\xb3\x7e\x11\x7c\xdf\x4e\x79\x2c\x96\x85\x6b\x20\xc4\xbb\x1c\xc5\x90\xa7\x86\x7b\x17\x80\x78\xc6\xf6\xff\xbc\x8f\xdc\xa7\x2f\x4d\xd9\x0c\xd3\xfb\xf1\x37\xe0\x5f\xd4\x69\x90\x40\x18\x25\xa8\x98\x01\xe4\x21\x26\xc2\x43\xa1\x46\xa1\x96\x57\x56\x84\x24\x3d\xf9\x07\xed\x12\xec\x78\xe2\xb6\xa0\x07\x3d\x44\x49\x8d\x0e\x3f\xc1\x58\x89\x28\x49\x55\x37\x03\xaa\x15\x89\xef\x3f\x3d\x20\x33\x46\x4d\xab\x30\x77\x5d\x48\x05\x11\x11\x14\x62\xe8\xca\x57\xcc\xb2\x00\x34\x76\x52\xb2\x26\x5a\xd0\x46\x2f\xa4\x01\xb7\x31\x6d\x68\xc1\x4d\x32\xbc\x8d\x51\xb4\xb8\xb4\x4f\x86\x2c\x26\x78\xb3\xb4\xd7\x28\x0e\x5c\x8d\x7e\xcc\xab\x7d\x5c\x29\xb3\x50\xb2\x9d\x2f\x00\x78\x08\xef\x2a\x2a\xaa\x11\xe5\x2a\x2d\x01\x71\xe3\x98\xce\xd1\xa9\x49\xb9\x14\xb4\xe6\x85\x5f\x3f\xa8\x22\xd3\x5c\xba\x04\x13\xa0\x25\x75\xda\x28\x39\x63\x4a\x73\x6d\x98\x30\x98\xeb\x72\x54\x51\x5e\x93\x7d\xcd\x18\x39\xf1\x5b\x1d\xbf\x39\x47\x33\x1d\x83\x5b\xe9\x65\x07\x71\xf2\x8c\x6b\x32\xea\x70\xa4\xed\x27\x3e\xa8\x17\x25\x94\xa6\xb7\x80\x70\xbb\x72\xe3\x2b\x1e\x0c\xd8\x8c\x9b\xe7\x4c\x2a\xa8\x10\x72\xfe\xb9\x2b\x26\x4a\xd9\x25\x56\x27\x8d\x75\x78\x76\xaa\x63\x87\x28\xca\xb4\x06\x47\x87\x2f\x5c\x13\xd4\xd0\xb9\x30\x48\xc4\xa4\xf1\xac\xc2\x25\x08\x17\x25\xbf\xe2\x65\x4b\x2b\x54\xb5\x92\xa7\xe9\xe8\xfc\x14\x89\xe4\xf3\x85\x19\x5f\x33\x08\x27\xa2\xae\xdd\x9d\x22\xfe\xd5\xf8\x5a\xc9\x2c\xd7\xa0\x94\x19\x62\x64\x9a\x40\x62\x2e\x8c\x6d\x27\xed\x9a\x2e\xa1\x9b\xb7\x2b\x7b\xec\x65\x9a\xbb\x15\x73\xc3\xce\x64\x9a\xce\x50\x7b\x2d\xcf\x31\x77\xe2\xc4\x1d\x82\x18\x2e\xa8\x00\xd3\x15\xa2\xd0\x96\xff\x41\xa6\xae\xcf\x5a\xaa\xc4\x69\x02\x07\x77\x8f\x42\xc5\x57\x53\xbb\xe3\x12\x3d\x32\x5b\xf6\x8a\x5c\x75\xbb\xf1\x82\xd5\x4d\x45\xcd\xd6\x13\xba\x7f\x8a\x82\xf2\x51\xae\xa0\x3d\x3a\xa8\x28\xc7\xb4\xb2\x22\xe3\xec\xc7\x23\x07\x5d\x86\x82\x3d\x4b\x65\xcc\x85\x57\x3f\x84\xb3\x70\xd0\x94\xdd\x28\xd3\xa1\xbb\xde\x94\x95\xa0\x0f\x38\x8a\x87\x94\x52\xca\x6b\xc1\x94\xdf\x57\x67\x3f\x1e\x8d\x08\x9f\xb0\x89\xff\x2b\x0c\xe1\xd5\x25\x23\xe7\x08\x4e\xe1\x21\x72\xd2\x33\x0c\x65\x39\xc1\x57\x8f\xe3\xd7\xf1\x98\xbf\xfc\xd1\x4e\x8a\xfd\xf6\x4f\xe3\x3f\xba\x03\x06\xfe\xfa\xc5\x6a\x6d\x03\xaa\xe9\x7e\x59\x79\x5a\x8c\x07\x00\xea\x8e\xfd\xeb\x97\x33\x59\x9e\x37\xac\x98\xe0\xf4\xeb\x5f\x06\x25\xbd\x12\xc2\x84\x51\xcb\x09\x39\x93\x50\x21\xc3\x4b\x14\x68\xf0\xae\x8a\xfd\xb7\x4f\xc8\x00\x36\x08\x51\xdf\x82\x1a\x26\x40\xfb\x15\xe9\xbd\xcf\x89\xc7\xd5\x84\x61\x41\xcc\x53\x98\xe7\x7d\x08\xd5\x21\xbc\xf8\x88\x18\x89\x8d\xba\x53\x4f\x5b\x7b\x1d\x0a\xc2\x3e\x70\x0d\x7d\x44\x70\x25\x81\x49\xa8\x83\x36\xf0\x26\x87\x25\xc6\xf2\x5d\xe8\x8b\xd3\xc8\xf4\x8c\x5b\x98\xc1\x2f\x85\x34\x5f\x86\xcd\xeb\x2b\xd6\xc0\xb6\x90\x84\x5e\x49\x5e\x92\x56\x83\xce\x29\x48\x2b\x20\x65\x61\x00\x84\xac\xe3\x9e\xe9\x92\xd4\x5c\x1b\x7a\xc9\x26\xe4\xdc\x9a\x23\x71\x1a\x31\xf2\x94\x20\xd3\x4a\x16\x97\xac\x24\xad\x30\xbc\x1a\xe4\x99\x09\x74\xc3\xd4\x46\xa6\x0a\x80\xc6\xb6\x85\xd5\x72\x1b\xc5\xc6\xde\x60\xc2\xbb\x06\x78\x8c\xf1\x40\x0f\xb3\xda\xad\xd5\x28\x6c\xd5\x05\x45\xd7\x6d\x53\xc2\x90\xae\xf6\x75\xa0\x30\x5a\xab\xd3\xb7\xf3\x29\xe1\x6f\xf7\x07\x30\x99\x9e\x90\xb7\x60\xb9\x54\xe9\x9b\x12\x8b\x26\xd0\xdb\xed\x32\x64\x04\x2b\x98\xd6\x54\x2d\xb1\xb0\x98\x1b\x5f\xd3\xde\x6a\x36\x6b\x2b\x30\x18\xd3\x27\x95\x8a\xd6\x12\x4c\x14\x2b\xa4\xd0\x46\xb5\x05\x70\x0d\x25\x53\x25\x2f\x99\xe8\x80\x3e\x06\x1c\x26\x71\xc5\x74\x57\xd4\x69\xd5\x6b\x21\x49\xb1\xa0\x62\xce\x02\x94\x30\xa9\x69\x09\x9c\xfc\x5d\x70\x7e\xa4\x4f\xa6\x0c\x7c\x41\x67\xc6\xaa\x85\x06\x18\x64\x6a\xad\x04\x9f\x8d\x94\xfe\x62\xef\x43\xc1\x77\x1d\x25\x34\x09\x5e\x6d\xb1\xd4\x70\x78\x46\xc9\x18\xac\xd5\x54\x87\x61\x86\x0c\x92\x9a\x19\x5a\x52\x43\x77\x05\x43\xe0\x0d\x5d\x86\xcc\x34\xcc\xd9\x07\xd6\x8d\x72\xf9\x9d\x99\xe0\xfd\x43\xb2\xe1\x31\xa0\xf5\xd9\x8f\x47\x83\xc6\x07\x87\x10\x70\x2b\x74\xc3\x32\x56\xca\xb8\xd4\x45\xd8\x55\x08\x1d\xe1\x11\x01\x2c\x69\x9e\x12\x3c\xc6\x59\x49\xca\x76\x70\x34\xbb\x53\x11\x86\xe4\x4e\x65\xc9\x9c\xb2\xfc\xb9\x2b\xcc\x71\xd1\x25\xa3\x17\xfd\xea\xf4\x8d\x86\x3e\xe6\x2c\x32\x61\xb8\x62\x11\xe0\xfa\x20\x12\x1c\xbf\xb5\x02\x25\x69\x9f\xf3\x90\x35\xe7\xcc\xe8\xae\xec\x12\x15\xca\x81\xa3\x1a\x67\x24\xe1\x1b\x81\xe5\xe7\xb9\xd1\xc5\x5a\x36\x4e\xc0\xa0\x31\x91\xcf\xb5\x74\x8a\xa3\x55\xb9\xb7\xce\x8c\xf9\xb2\xe6\x68\x61\xcf\xf9\x37\xb2\x1c\x9e\x7e\x97\x37\x0f\xb4\x47\x5a\x07\x6e\x83\x18\x50\x1a\xc2\x9d\x78\x03\xa4\x52\xeb\x1e\xb8\x3d\x6a\x32\x0b\x7a\x35\x18\x00\x3a\x39\x16\xd6\xf9\x2b\xc6\x3e\x2c\x86\xe4\x8e\x81\xdc\xf1\xcb\x81\x84\x0d\x2f\x40\xf4\xd7\xc0\x42\xc4\x3e\x41\x59\x72\xc4\xee\x01\xe2\xd5\x5f\xf6\x88\x3f\xcf\x92\x1f\x96\x9b\xdb\x3b\xca\x9c\xda\xea\xca\x05\x42\x61\x8b\x83\xc5\x64\xdc\x1e\xc2\xc3\xd7\xeb\xcb\x9e\x99\xea\x9c\x2b\x21\xbe\x81\x90\x52\xfb\x3e\xe0\x31\x71\x6c\xed\xbb\x6f\xf5\x6f\x3f\xc8\x4c\x0c\x58\xe5\x9b\x7d\xe0\x83\x47\x3a\x75\xd5\x91\xde\x73\xc5\x14\x54\xea\x44\xd0\x96\x56\xd4\x28\x59\x55\x4c\xc1\x12\xb8\xa0\xc6\x4a\x01\x98\x5d\x2d\x82\x69\x80\xe9\xfd\x38\xfc\xe5\xc3\x7c\xc1\xd5\x26\xd8\x75\xb0\xae\xa9\xc6\x4e\xd7\x3e\x03\x1e\xc2\x97\xbe\xaa\x6f\x13\x3d\xc3\x45\xde\x4f\x3e\x18\x78\x28\x96\x38\xf9\xc7\x11\x73\x62\xc8\x8c\xcc\x2d\xa9\x5c\x13\x26\xe8\xb4\xb2\xe6\x48\xc4\xc0\x81\xce\x15\xed\xd4\xc8\xe8\xae\xf7\x6c\x36\x7c\xea\x20\x86\x19\x3f\xf2\xd3\xc6\x46\xf5\xb6\xf7\xc3\x49\x57\x0b\xeb\x7c\x33\x19\x1a\x02\xfb\xcb\x71\x5d\x6f\x88\x7e\x7d\xd4\x0a\x35\x71\xb7\x99\x8d\x6f\x30\x94\xa6\x6c\xd5\x04\xf9\xea\x09\xa0\x5f\x08\x4f\x8c\x0f\xf4\x1f\x33\xc8\x4f\x88\x57\xbe\xb2\x04\xa8\xf2\x85\x92\xb0\x1c\xf9\xdd\xb9\xcf\x1d\x82\x61\x3b\xa0\xcf\xbb\x80\xe7\xf0\x87\xb7\x29\x42\xbe\xf3\x94\x59\xe9\xdc\x35\x9f\x1a\xbe\x2f\x08\xee\x8d\x78\xfc\x0d\xa5\x83\x9d\x98\xfb\x8e\x8b\x32\x14\x71\x7a\x50\x58\xab\xa0\x1d\x9e\x9d\x22\xd5\x79\x68\x7a\x0d\x67\xc2\xd2\x19\xbc\x66\xc1\x55\x39\x6e\xa8\x32\x4b\x0c\x6d\x8d\x7a\x14\x07\x3c\xc7\x0c\x43\x67\xcd\xb4\xb7\x9b\x29\x3b\xcb\xc1\x12\xf8\xb4\x44\x97\x37\x7b\x23\x87\xec\xda\x8c\x0c\x45\x89\xf4\x57\x6f\x46\xde\x76\xed\xd0\x42\x10\xe7\x91\xcc\xc8\x7d\x55\x8c\x93\xfe\x69\xb6\xbb\xba\xb6\x3d\x6a\x75\xbf\x76\x09\x55\x5f\xf0\x57\xb8\x30\xa4\x8c\x61\xc3\x82\x95\x09\x5e\x7e\xfb\xa4\x11\xe1\x33\xab\xb4\x49\x31\x86\xcc\xc7\xc1\xe4\x75\x69\x4f\xce\xd2\x9d\xb8\xf2\x66\xf4\xc0\x83\x60\x8a\xa8\x8c\x86\xee\xe4\x20\xd9\x17\x32\xdd\x41\xef\x2f\x90\xad\x38\xd6\x01\x56\xb4\xdf\x90\x49\x32\x1d\xde\xc2\x8a\x74\x9a\x67\xec\xba\x8f\xce\x02\xaf\x12\x73\x51\xda\x4d\x05\x2a\x12\x38\xf5\x75\x5b\x14\x8c\x85\x90\xa1\x13\x4b\xc3\x4d\xda\xde\xd9\xe3\xa6\xbc\xa6\xa6\x58\x30\x4d\xb4\x84\x5e\xc7\xda\xd0\xaa\x62\x65\x48\x75\x42\x46\x91\x60\x55\xb8\x34\xa8\xc1\x74\x44\xc6\xca\xf0\x29\x8e\x02\x23\x2e\xea\xda\x54\xd4\x05\x95\x66\xad\x28\xb0\x7e\x91\x9b\x65\xc8\x32\x59\x35\x4c\xc1\x0f\xad\x21\xd6\x36\xdc\xf4\x99\x61\xc6\x48\xe4\x53\x0e\xcc\x0c\x87\xff\x12\x8f\xfb\x05\xbd\x62\x5d\xb6\x87\xeb\x12\x69\x4f\xe9\x00\x75\x9b\x81\xd7\x23\xa8\xdc\x11\x5a\x08\xb1\xc2\x2e\x9e\xc5\xc9\xe0\x5c\xe4\x36\x65\xe2\x79\xd8\x8f\x26\x7d\xcd\xc4\x39\x08\xa6\x8d\x66\x26\x80\x78\x0f\xd7\x78\x89\xcb\x9f\xa7\xad\x91\x35\x35\xbc\x80\x10\x1d\x9f\x45\x49\x62\x35\x26\x5e\x58\x49\xe3\x13\xe1\x51\x45\x02\xc5\xcd\xad\x5b\x26\x31\xb0\xd9\x58\xba\x87\x89\x8f\xe6\xda\xad\x72\x7f\x5a\xfd\xb4\x44\xaa\x67\xa6\xf7\xbc\xf0\x88\xc8\xc4\x2c\x14\x63\x84\xd7\x8d\x54\x86\x0a\x43\x4a\x3e\x0b\x18\xdd\x3e\xc3\xf0\x36\x9e\xc8\xe1\x0f\xfa\x09\xf2\x6a\xa3\x51\x30\x60\x5a\x55\xf2\x5a\x13\x73\x2d\x43\xc8\xa1\xcb\xef\x72\x98\xc7\xa3\x3e\x31\x19\x74\x1c\x37\xaa\x3d\xea\x2c\x5f\x45\xe7\xd0\xc8\xca\x9e\x6b\x56\x55\xf6\xbf\xb7\x9d\x46\x83\x71\x4c\x36\xce\x09\x9f\x0b\x84\xa1\xe5\xda\x07\xbf\x1c\x86\xca\x7e\xa9\x64\xd3\xb8\xe4\x87\xfa\x20\xff\x9c\x40\xf2\xba\xba\x62\x1a\x8a\x4c\x3c\xae\x8b\x65\x85\x39\x13\x4c\x51\x03\xe9\x75\xae\x9f\x2b\xa8\x24\xab\x44\x0e\x0d\xfa\xe0\x95\xd1\x2f\xf2\x11\xa6\xc3\xd4\xcb\xcd\x4c\xe6\xef\x71\xdf\x66\x78\x2f\x2e\x90\xdf\xbc\xdc\xc9\xc0\x40\xfb\xdf\x32\x43\x0f\xc8\x0f\x1a\xd9\x22\x9c\xbc\x01\x87\xe7\x93\xbc\x6c\x0e\x6f\x1d\x1d\x6d\x19\x88\x3a\xac\x9a\x45\x44\x55\xec\x97\x0a\x10\x72\xfd\xb9\xee\xd1\x7b\xa4\xa4\xd6\x6f\xfd\x4f\x1e\x90\xf4\x27\x9f\xd5\x47\xae\x27\x9f\xd5\x93\xcf\xea\xc9\x67\x05\xd7\x93\xcf\x6a\xf5\xfa\x5c\x7c\x56\xa4\x3b\xae\x76\x55\x36\xbd\x8d\x4d\x97\xfe\x01\x7b\xcf\xf3\x4c\xc8\x5b\x69\x5c\x8a\x31\x58\xb0\xf4\xc6\xa0\x13\x85\x13\xfa\x9a\x2e\x27\x82\x19\xd7\xc9\xc4\xc7\x77\xdf\x7b\x9a\xfe\xa2\xac\x35\xe2\x5c\x1f\x91\xdc\xf0\x82\xcc\xb7\xb7\x89\x46\x31\x12\x55\xb3\x2e\xe3\x19\x3e\x7f\xa6\x5d\x5e\xab\xfd\x1e\x20\x0b\xe3\x07\x14\x6c\x42\xce\x5d\xad\xcb\xca\xe0\xeb\x4d\x16\x4a\x66\x28\x1f\xd2\xbb\x29\xbe\xbc\x36\x74\x71\x83\x76\xb6\x35\x6d\x87\xe4\xdc\x36\x01\x74\x69\xd7\x5c\xb1\x1d\x88\x5b\x54\x9d\x1b\xd7\xf4\x77\x37\xdc\x57\x86\xcf\xe9\x8c\xbc\x67\x85\xbc\x62\x0a\x57\xf7\xe4\x43\x43\x85\xe6\x52\xbc\xa6\xbc\xb2\x6b\xeb\xd7\xb8\x8b\x76\x93\x56\x33\xd5\x4f\x81\x8c\x52\x34\xc2\x06\x77\x8c\x64\xb9\x77\xb8\x81\x12\xba\x9b\xd8\xf1\x5c\x05\x5d\xa3\xd8\x15\x97\xad\xf6\xc8\x07\xad\x41\x4d\x43\x1b\xe7\x21\x5a\xf0\xf9\xc2\xdf\xec\x2b\x56\x21\xeb\x5a\x95\x61\x13\x0f\xa6\x4c\x1b\x6a\x5a\xdd\x87\x9f\x2e\x20\xf1\x70\x87\xb2\xaf\x02\x1f\xed\x8e\x11\x92\x53\x5d\x47\x04\x8a\x5d\x3d\x10\xbf\x47\x7c\x0c\x7c\xf4\xd4\xed\x65\x0f\xf5\xd1\xc1\x9a\x14\xb2\x6e\x5a\xc3\xa2\x3d\xef\x76\x57\x1e\x51\x7f\x47\x66\xea\xf5\x7f\x7a\x5e\x53\x41\xe7\x6c\x1c\x48\x1b\x77\x28\x1f\xcf\xb3\x49\xfa\x2c\x6c\x45\xb2\x37\xff\x89\xaf\x47\x87\xce\xd1\xbf\xb2\xe1\xec\x91\x7b\xc1\xda\x23\xf9\xf1\xf6\xc8\xfd\x63\xee\x91\x00\x81\xba\xab\x02\xe8\xbd\xa3\x6f\x55\x04\x39\x25\xe3\x36\x11\x94\xd3\x54\x76\xca\x86\xa3\x85\x6b\x22\x6b\x6e\x0c\xf3\xe5\x88\x41\xa4\x8c\x08\x37\x3d\x74\x4c\x27\x40\x21\xc0\x89\xd5\x83\xec\x43\x53\xf1\x82\x9b\xa8\x7d\x5d\x22\x80\xc4\xea\x05\x0e\x84\x6b\xae\x51\x95\x17\x84\xd7\x4d\xc5\x82\x06\x3e\x76\xe8\x42\x3e\x08\x17\xde\xa6\x80\xda\x14\xc2\x3e\x40\x28\x16\x09\x7e\x92\xdb\x77\xbc\x9e\xe4\xf6\x0d\xd7\x93\xdc\xce\x2e\xb7\x11\xbb\x74\x38\x14\x70\x4f\x5e\xfb\x87\xba\xee\x4b\x74\xca\x2a\xf2\x6b\xcb\xd4\x92\x58\x03\xab\xc3\x05\x91\x56\xd8\x69\x5e\x22\x7e\x85\xcf\xe9\xd8\xa1\x08\x41\x4e\xe5\x1c\x72\x46\x4e\x3e\x58\xfb\x16\xba\x52\x64\x3f\x25\x57\x07\xe8\xf7\xbe\xc2\x55\x08\x2b\x13\x5b\xa5\x58\x48\x15\x7f\x02\x26\xe6\xe1\xdb\xe3\x9c\x0e\x8c\x1c\x65\x2a\x24\x5f\xa9\x0a\xb9\x27\x25\x83\x90\xc3\x5b\xe6\x1a\xd7\x24\x7c\x03\xe7\x78\x28\x6b\x0a\xd1\x5c\x72\xc9\x96\x23\x57\xea\x49\x2c\x07\x52\x7f\x73\x26\x12\xb1\x7a\x1e\xd5\x9f\x4b\x86\x79\x1c\xc3\x7a\x95\xf6\xaf\xcc\x07\x62\xce\x50\x1d\x5e\x63\xfb\xda\xd9\x9e\xe5\x97\x28\xcf\x19\x9d\xf9\xcc\x27\xf6\x55\x73\x3d\x6a\x65\xcf\x58\xde\x71\xde\x6d\xe4\x79\xfb\x41\x40\xa3\x0c\x6c\x0e\x48\xa1\x20\xf0\xf3\xb0\x17\xc9\x1d\x4c\xc0\xcb\x2f\xe3\x3d\x4d\x56\x36\x01\x43\x22\x5a\xfb\x78\x86\x97\x6c\xf9\x4c\xbb\x36\x24\x52\xe8\x05\x6f\x40\x7d\x87\x64\x26\x39\xcb\xba\xc5\xf1\xfa\x11\xca\x61\x3d\x31\x78\x6e\x9c\x8a\x11\x79\x2b\x8d\xfd\xcf\x09\x80\x53\x80\x78\x39\x96\x4c\xbf\x95\x06\x3e\xd9\x69\x2e\xc0\x49\x7a\x0c\x3c\xe0\x72\x8e\x38\x64\xfc\xc0\xf1\x8a\xf8\xd5\x80\x55\xe8\xd6\xda\x57\x1d\x05\x7e\xe1\x9a\x9c\x0a\x22\x95\x5b\xa2\x8c\xe4\x80\x6b\x1e\x49\x42\x62\x7c\xbc\xbb\x4b\x0a\xdc\x44\x8d\xe3\x11\xa9\x7a\x2c\xf2\x20\x84\x39\xa2\x20\xea\x83\xdf\x40\x74\x0b\x72\x61\x3d\x74\x01\x80\x5e\x29\x6a\xd8\x3c\x43\x12\x6f\x77\xd5\x4c\xcd\xa1\x4f\x50\xb1\xc8\xbd\x1b\x72\x29\x5a\x78\x65\x54\xb7\xf0\xba\x87\x2d\x7b\xaf\xd5\xc2\x0f\x32\x00\xe8\xee\xdf\x03\xc4\xc7\xae\x7a\xcf\x22\x12\x51\x8b\xad\x69\x63\xe5\xcd\xff\xb3\xca\x2a\x6c\xaf\xff\x21\x0d\xe5\x4a\x4f\xc8\x21\xd1\x5c\xcc\x2b\xd6\xfb\xce\x05\x8b\xa3\xc7\x64\x22\x0b\x72\x59\xac\x7e\x78\x45\x2b\x86\x38\x4d\x54\x10\x86\xee\x2a\xc0\xe7\x5e\x31\x8c\x46\xe4\x7a\x21\x35\x6a\xbe\xa1\xc4\x60\xef\x92\x2d\xf7\x46\x59\x42\x61\x24\x3e\x9f\xed\xa3\x4f\xc5\x5e\xd7\x08\xae\x27\x89\x82\xee\x0f\x19\x8f\x7b\xf0\xdd\xde\xc3\xd8\x63\x8f\xc0\x5d\xf5\x28\x8a\x9c\x5c\xb8\xf1\xa8\xa2\x98\x22\xb0\x6b\xc1\xf5\x55\xfa\x56\x33\x7e\x00\xe9\x3e\xba\xa7\x4b\xef\x70\x28\x67\x3b\x17\xc5\x05\xdc\xe2\x4c\xe0\x19\x19\x98\x0b\xc9\x3a\x34\x46\xf1\x69\x6b\x98\xde\x59\x4e\xb8\x91\xd0\x08\xd6\x2d\xf4\x4f\xb5\x2b\xff\xe3\xa6\x1f\x44\x08\x78\x5c\xe7\x62\x8e\xd3\xd9\x6a\xee\x64\x04\xa9\x1b\xe3\x22\x48\xe5\x10\xf6\xd6\xaa\xf0\xec\xdf\x34\x90\xea\x30\xd4\x87\xa7\x53\x75\xc9\x9a\x8a\xe9\x46\x62\xd5\xd9\xc6\x89\x71\x8a\xe4\x82\x6a\xc8\xba\x9f\xb9\xa4\xa8\xa6\x55\x8d\x04\x2c\x74\x2a\xd6\x36\x63\x16\xdc\x08\x07\x12\xe2\x41\x98\x10\x70\x2e\xec\x5c\xbb\xdf\x43\xff\xcb\xc3\x95\xce\x2f\x52\x41\x33\x09\x57\x18\x20\x4a\x5e\x38\xbf\x10\x35\x44\xa4\x01\x18\xc7\xd7\x66\x06\xf2\x95\x4b\xe8\x16\x08\xf0\xf7\xc8\x4a\xde\x44\x40\xda\x99\x30\x90\x63\x23\xc8\xa9\x98\x31\xaa\xf9\xb4\x62\xae\xb8\x41\x1b\x6a\x32\xcc\x5f\x94\x90\xef\xe6\xd1\x9a\xd3\xa0\x45\x70\xa3\x57\x93\x6b\xf6\xb9\x28\xaa\x16\x78\x40\xf0\xea\x00\x5c\xd8\x54\x14\xac\x42\xdd\x46\x96\x01\x8d\x2b\x1b\x5e\x44\x94\x48\x34\x63\x4a\xe1\x7c\x4d\x97\x9b\x77\x33\x29\x25\xc3\x54\x64\x00\x52\x19\xe1\xeb\x6d\xae\x90\x71\xcb\x30\xfc\x80\xc1\xd9\xa2\xe4\x8c\xe1\xee\xc0\x95\x21\xd4\x1e\x25\xb3\x0a\x71\xe0\xdc\x59\x02\x33\xe4\x2a\x1d\xce\xa3\x8c\xa1\x11\x82\x82\x3a\xec\xce\xb8\xf1\xe7\x60\xf2\x1c\x40\xe6\xb6\xce\x2f\x5c\xa6\x71\x27\x99\xc6\x70\x7c\xb1\xc1\x81\xc7\xcc\xe7\xd7\x9b\xc1\xfd\xbd\xef\xeb\xc0\x82\x36\xd1\xbe\x25\x46\xaf\x55\x57\x57\x23\x7d\x4f\x3a\xcb\x8f\xb0\xe9\xe5\x8c\xbc\xe6\x15\xd3\x4b\x6d\xb0\xf8\x91\xd7\x28\xb8\xb0\x3c\x54\x1a\x82\x52\x01\x93\xe9\x50\x70\xd9\xd3\x2c\x4f\x20\x2b\xdb\x0a\x67\x57\x49\xba\xc7\x7a\x9d\xd2\x57\x65\xaf\xc1\xd6\xae\x4a\x20\x28\xd9\x0d\xf5\x50\x59\x56\x6b\xd0\x6c\xcd\x92\x60\x1d\x7b\xb3\x31\x2b\xfa\xbe\xd8\xd7\x7c\xaa\x18\x39\x5a\x50\x21\x58\x15\xf5\x8b\x74\xa9\x1b\xd4\x18\x5a\x2c\x50\x9a\x53\x62\x25\x49\xc5\xcc\x33\x4d\x16\x52\x1b\x52\xd3\x62\xc1\x45\x68\x34\x25\x42\xdf\xd4\x0e\x05\xf8\x11\x02\xdd\xcf\xf4\x85\x25\x20\x71\x9d\x73\x09\x17\xa4\xc2\x73\xec\xac\xdb\xd8\x20\x55\x8c\x24\x90\x06\x94\xa1\xc9\xde\xda\xb3\x43\x0f\x68\x2f\xa5\x60\xad\xd1\x53\x00\xe7\x26\xdc\x9b\x3e\xf2\xc9\x87\x09\xd9\x63\x1f\xcc\x37\x7b\x23\xb2\xf7\x61\xa6\xed\x7f\x84\x99\xe9\xbd\x09\x39\xad\x43\xa2\x10\x17\x91\x1a\xc1\xdc\x0f\x08\x9f\x91\x56\x0c\x2e\xea\x1c\x2c\xb1\xaa\x56\x64\xe1\x8f\x67\x55\x2b\xec\x12\xbf\x73\xad\x98\x5f\x91\xd7\x47\xc4\x50\x35\x67\xc6\x8e\x41\x44\x5b\x4f\x99\x4a\x6d\xd9\x9a\x23\x71\x64\x78\x9b\x7d\xc5\x68\xf9\x4e\x54\xc9\xb1\xbd\x5c\x1b\xca\xd3\xd1\x9f\xef\xe3\x28\x71\x6d\x46\x2b\xcd\xc8\xbe\xbd\xf1\xf9\xb5\xe2\x86\x1d\x4c\xc8\x7b\xff\x2b\x28\x7f\x07\x5d\x74\x26\x87\xe8\x7b\x58\x35\xe2\x1e\xaa\x99\x41\xcc\x62\xe1\x6c\x90\x37\x76\x53\x27\x6b\x81\xb8\xe0\x53\x29\x2b\x96\x08\xe9\x8e\xbc\xf7\xd3\x4f\x6f\x93\x5d\x63\x7d\xfe\xee\x9e\x77\x13\x9b\x5f\x4b\x55\x95\xd7\xbc\x74\x85\x47\x64\xdf\xde\x7c\x30\x8c\xe5\x87\x84\x16\x06\x06\x12\x72\xb7\xb5\xcb\xe3\xc3\xbf\xbe\xe6\x65\x9e\x15\x1d\xb0\x01\x81\x88\x3e\x0f\x78\xc7\x88\xe5\x01\x02\x4c\xc0\x4b\x26\x8c\x15\xee\x4a\x93\x7d\xf8\x45\x3a\x8e\xe6\x09\xc7\xbe\x27\x30\xae\x54\xa4\x90\xf5\x94\x8b\xae\x2d\x51\xc7\x9b\x56\x81\xb1\xf2\xd6\x47\xdc\x34\x33\xd8\x4b\x00\x50\x0d\xa5\x59\x10\xcd\xeb\xb6\x32\x54\x30\xd9\xea\x2a\x19\x4e\xe3\x89\x3d\xd7\xae\x59\xc5\x3e\xa0\xec\xdb\x56\xd3\xc5\x8e\x82\xbe\x66\x0c\x48\x15\x5d\x67\xb8\x55\xd5\x38\x69\xac\x0e\x1e\xa9\x7c\x1e\x54\xeb\xd0\xe7\x84\x7d\x60\x85\x43\x51\x6d\xaa\x76\xce\x13\xbd\x33\xc7\xf6\x2d\x0a\x6a\x58\xf9\x8a\xbc\xee\x5e\x0e\x30\xba\xfc\x37\x13\x72\xe4\x73\x1a\xdd\xf0\xe4\xe8\xfc\xf4\xd8\x35\x07\x13\xda\x30\xba\x0d\xdd\x7d\x58\x02\xd5\xd8\xb9\x62\xb7\x60\x34\xe0\xc0\x59\x44\x6c\xd7\xa1\x6d\x35\xfe\xe1\xbe\x71\x9d\xb7\x43\x07\xe5\x61\xcd\xac\x06\x8b\x84\x27\x7b\x69\x6b\xf6\x52\xdc\x70\x39\x22\xab\x64\x0d\x13\xf6\xcc\x13\xf1\xfe\xc7\x79\xde\x1a\x9b\x48\x58\xe3\x4c\x7a\xa5\x7b\x58\x5f\xa9\x8c\x7c\xe4\x0b\x59\x95\x9a\xb0\x0f\x46\x51\x7b\xec\xd7\xf6\x80\x0f\xbf\x99\x11\x2a\x96\x93\x61\x2a\xe6\xa0\xb0\x74\xde\x50\xf4\xe0\x95\xd9\x6d\x0b\xad\x7c\xb2\xd0\xe2\x4b\xb3\x42\x31\x33\x00\x46\x2d\x5b\xe3\x7f\x4f\x48\x7f\xb9\x7a\x1f\xaf\x39\x58\xf1\x5b\x0f\xd2\xe0\xd2\x4a\x86\xf8\x8d\x35\x13\x9a\x1b\x7e\xd5\xeb\x0e\x0a\x30\xa8\x54\xeb\xe0\x87\x04\x65\xca\x09\x40\xdd\x43\x28\x4d\x1e\x18\xe3\x93\x7c\x46\x84\x5c\x79\xab\x18\xba\x22\xc4\x09\x7b\xb7\x24\x0f\x1a\xf2\x70\x6a\x6c\xac\x4d\x05\x00\x1e\xe2\xc3\x47\x80\xb5\x86\xff\xc6\x54\x1c\x3b\x07\x91\x37\x16\x66\x21\x7d\xa6\xdd\xec\x6d\x4f\x6c\xe6\x48\x39\x1f\x8a\x50\x93\x33\x76\xf4\x36\x52\xed\x3c\x38\xc9\xb0\xf0\x42\xbf\x93\x1c\x9b\xcd\x58\x61\xf7\x06\x74\xaf\xf3\xad\xd8\xac\x59\x5b\xb6\x08\x00\xe2\x01\x49\xfb\x80\xa2\x43\xa1\xf7\x22\x98\x89\x2e\x7b\xf5\x54\x68\x43\x01\x23\x12\xde\xd8\xea\x69\x56\x79\x72\xfd\x07\xdd\x76\xc2\xe8\xb5\x47\x9a\x1c\x48\x44\x6d\xd5\xb0\x82\x29\xbb\x63\xaa\x25\xb9\x56\x72\x68\xd1\xd6\x1d\x63\xab\xf2\x8a\xa9\x2b\xce\xae\x9f\x3b\xc4\x9a\xb1\x7d\xd9\xb1\x03\x01\x7c\x0e\xee\xae\xe7\x5f\xc0\x7f\x06\x50\x95\x29\xfa\xe6\x4e\xd9\x57\x64\x6f\x2f\x87\x5f\x60\x70\xea\xda\x0c\x9a\x70\x26\x19\x54\x79\x7c\x02\x30\xfc\x4a\xa8\xcc\x7d\xe8\x1c\x02\x9f\x12\x1a\x73\x67\x4d\xa4\x90\xdb\xcd\xee\x1f\xe4\xda\xb7\x10\x6d\xf9\xa4\x03\x59\x6a\x85\x48\xae\x2f\xec\xdb\xfe\x38\x4c\xcf\xf0\x0f\x09\x9e\x5c\x8c\x8d\x62\x2c\xbc\xaa\x71\xe6\x93\x90\xbe\xf1\x79\x30\x6c\x1e\x61\x10\xaf\xa4\x86\x6a\x66\x86\x04\x93\x73\x89\xfa\x88\x14\x3b\xbf\xb1\xd4\x77\x5f\x41\xbe\x15\x03\xa4\x6a\xdf\xdb\x91\x8c\xff\xe4\x4c\x7f\xd1\xbb\xd3\x1a\xfd\x6e\x5d\xd3\x4f\x72\x44\x24\x82\x6e\x2d\xe8\x03\xc2\xb1\x3b\x26\xd9\x96\x8d\xe8\xde\xf2\x87\x1f\x4e\x8f\xf3\xb8\x52\xba\xe7\x79\xcf\x00\xfc\xbb\x3f\xfd\x6e\x93\x72\x4d\x5a\xc1\x7f\x6d\x63\x27\x34\x74\xed\x0f\x1b\xc9\xdd\xbf\x8d\xd9\x99\x17\xac\x4b\x4e\x38\xe6\xfa\x72\x5b\x92\x71\x8d\x90\xbe\x8c\xfc\xcb\xd1\x09\x71\x9f\xde\x96\x49\x90\x34\xf4\xc3\x64\x1f\xf4\x65\xe8\x5f\x8e\x4e\x56\x5e\x77\xc5\x8d\x7a\x58\x55\xde\xd7\x23\x85\x0e\xa0\x9e\x4e\xba\x66\x9a\x62\x90\xcd\x56\xa3\x57\xac\xe4\x0a\x53\xd5\xfc\x5b\x96\x93\x42\xf3\xd0\xf4\x6c\x7e\xc9\x26\x5c\x46\x69\xa9\x69\x53\x30\x28\x8b\x4c\x7f\x31\x2f\x58\x97\x10\x5d\x72\x7d\xf9\xf8\x3c\xc9\x4d\xf9\x36\x0d\xe4\xf6\x73\x4b\x3f\x59\x75\x77\x3a\xd9\xe9\x94\x20\xd8\xdd\x4b\xd9\x92\x6b\xd7\x7b\x7c\xa0\x9b\xf5\x82\x37\xaf\xc8\x89\xd0\xad\x62\x5d\x85\xee\x2a\x09\xd6\xc2\xbe\x77\xa7\x2b\x34\xd9\xd7\xaf\xb6\x9c\xaa\xb2\x13\x5b\x91\xe4\x38\xdb\x1b\xaa\x0c\x78\x3d\xb7\xcd\xda\x81\x10\xaf\x12\x44\x1f\x88\xfb\xe4\xed\xd3\x99\xc7\x50\x1a\xb9\xde\xb0\xe8\xb9\xe7\x3a\x3c\xbc\xcb\x98\x06\xed\x2f\x07\xff\xbe\x96\xc1\x62\x79\x5e\xb2\xab\xe7\xba\xa4\x2f\x47\xf0\x5a\x1e\x03\xb2\x3f\x07\x54\x93\xbd\x97\x7b\xe9\x23\x9f\xf3\x9a\x57\x54\x55\xd8\x13\x25\x34\x9b\x09\xcf\xb7\x27\xa4\x27\x04\xca\xce\x5e\xec\x91\x7d\xa9\x80\xa2\x82\x0a\x52\x31\xdf\x3f\xc5\x49\xd2\x25\x3a\x07\x0e\x3e\x93\x2d\xb4\xed\x7c\x2c\x3c\xd8\xb6\xbe\x09\x4b\x6f\x0f\x39\x9d\x3b\x8e\x73\x9e\x1d\x77\xea\x23\x17\x56\x07\x9b\x90\x1f\x9c\x66\xe7\x74\x73\xe4\xda\x12\x14\x32\xbc\xe3\xf3\xe0\x8e\xcf\x29\x8c\xb3\x12\x90\xb9\xd7\xc0\x0a\x59\xcf\xe4\xfb\x4c\x38\x22\x35\x58\x34\xe7\xe6\x3d\x6b\xe4\xd6\xec\x44\x1c\x7e\x25\xa5\x86\x1b\xfb\x81\xd4\xdc\x48\xb5\x24\xd4\x10\x8a\x27\x43\xd1\x56\x54\x11\xc5\x30\x39\x26\x83\xd9\xe6\x46\x5f\x31\xd6\x2e\x64\x97\x81\x13\x63\x18\x3a\x37\x74\xa0\x6f\xe4\x4e\xe3\xc4\x18\xdd\x89\x3d\xaf\x8e\xb9\xb2\x52\x5a\x62\x55\x18\x37\x47\x61\x30\x84\x53\xaa\xa4\x70\xd0\x46\x76\x44\x97\x85\x33\xe7\xc6\xb5\xd8\x45\x02\xec\xd7\xfe\x69\x49\xa4\x00\x05\x20\x53\x65\xf9\x4c\x77\x6f\xfc\x08\x73\x7b\x3a\xc6\xd9\x86\x3f\x11\xcc\x6e\xa9\xb6\x2e\x5d\x03\x21\xa1\x49\x04\xe6\xd1\x76\x9f\x0f\x53\x1c\x21\xcf\x45\xc8\x10\x9c\x25\x58\xc3\xa8\x0c\xee\x91\x67\x93\xc9\xb3\x09\xa8\xb2\xcf\x26\xcf\xbc\x21\x56\x85\x72\x58\xa7\xed\x75\xc4\xf8\x22\xca\x21\x80\x05\x7d\xa9\x31\x21\xe4\x9d\x47\xfd\x84\x76\x96\x2b\x15\xb9\xa1\xd8\xb6\xaa\xc2\x3b\x40\xd3\x95\xbe\xec\x19\x10\x09\x85\x78\x6e\x3b\x8d\x5f\xd2\x15\xf6\xce\xf9\x95\xeb\x06\xb7\xb5\x34\x9b\xee\x15\xb3\x70\x6a\x3c\x63\xce\x81\xfa\xfe\xfb\xed\xbd\x1b\x8a\xee\x4c\x6f\xe6\xce\x01\xf7\x5e\x85\xac\x6b\x6e\xc8\x82\xea\x45\xf0\xe2\x75\x9d\x71\x86\x1d\x4d\x43\x9d\xbf\x55\xab\x0d\x53\xb3\x24\xd9\x95\xe5\x30\xf7\x04\xac\x38\x7b\xc3\xc7\x0e\x93\x58\x74\xae\x18\x38\xe4\xf4\x82\x2a\x66\xef\x6c\xe0\xf4\xa9\xf8\x8c\x19\x9e\xba\x39\x7a\xe7\x7b\x18\xf9\xf6\xe0\x56\x47\xf8\x6e\x85\xb7\x86\x9e\x85\x4c\x94\x8d\xe4\xa9\xad\x1a\xc6\xa4\xa1\x26\xa5\x21\xea\xd0\x53\x34\x90\x9d\x65\x07\x87\xa7\xf9\x2d\xec\x3f\x40\x63\x12\x38\xd0\xf5\x5f\x89\x18\xc6\xc8\x46\x56\x72\x3e\x30\x87\x7f\x90\x23\xcc\x2c\xb6\xad\x45\x58\x1a\xfc\xac\x75\x53\x13\x7c\x35\x66\x00\xda\xd7\x06\xe3\x89\x39\x67\x94\x6f\xd9\xe3\x0c\xa5\xe7\x61\x77\x3e\x7f\x7f\x72\x78\xfc\xe6\x64\x52\x97\x5f\x20\x06\xc4\x98\x8e\x1b\xb9\xb5\x30\xe4\xa3\xb0\xa4\xd7\x96\x0d\xbd\xcf\x20\x89\x59\x89\x3a\x89\x7d\xc0\x18\x30\x9b\x1a\xa6\x6a\x8e\xb8\x52\xbb\x6a\x62\x6f\x85\x4b\x52\xad\x6b\x7b\xc6\x9d\x25\x6e\xe4\x1c\xec\xe1\xc7\xef\x1f\xc8\x8d\x62\x63\x00\x92\xb0\xb6\xe4\x8c\x57\x00\x44\xd3\xe9\xa9\xd1\xf9\x9c\x34\xa8\x8f\xb8\xfa\x90\x2e\x3e\xb9\x5a\xae\x46\x5e\x3b\x2b\x33\x44\xd6\xb1\xed\x6b\x55\xa5\xd5\x3d\x01\x96\x8f\x55\xca\x5c\x14\x88\xce\xe1\x85\xa5\x72\x1d\x04\x1b\xc5\xaf\x78\xc5\xe6\x96\x84\x05\x17\x73\xdd\x75\x20\x72\xc9\x68\x49\xc3\x02\xc6\x10\xeb\x74\x9a\x90\xd4\xf3\x06\x52\xcb\x02\x38\x3f\x6e\xcd\xb7\xef\x2e\x88\x60\x48\x42\xe2\x26\x1b\xe8\x78\xb2\x44\x26\x9e\xec\xdb\x8e\xb6\x6e\x47\x1f\xd9\x99\xa3\xd8\x27\xa4\x6c\xda\xaa\x83\x02\x4e\x18\xdb\xc1\xc3\x9e\x12\xbd\xac\x2b\x2e\x2e\xa1\x65\x87\x3b\x4e\x5c\xfb\x3b\x46\xec\x17\x7e\x03\x2b\x46\xab\xfc\x6a\xc0\x03\xb1\x32\xc9\xa1\x02\x98\x1d\x88\xc1\x83\xc9\x62\xa5\xde\x5f\xbd\xb0\x47\x4f\x79\x96\xf3\x3b\x39\xcf\xf3\x51\x2f\x2d\xaf\xe9\x7c\x6b\x85\xa6\x30\x78\xef\xc0\x16\xe4\xdd\xd1\xa9\xaf\x1b\xd8\x8f\x1d\xd2\x78\xaf\x54\x84\x2a\xc3\x67\xb4\x30\x07\xa4\x69\xab\xca\x99\xb8\x5e\xc9\x73\x52\xe2\x86\xdc\xd3\x24\x22\x2f\x3a\x17\x1a\x14\x70\x68\x59\x5d\xd9\x51\x8d\xb5\xe1\xd1\x13\xd8\x36\x2e\xa1\x15\xa0\xd9\x04\xb9\x5e\xf0\x62\x41\xce\xda\xaa\x3a\x93\x15\x2f\x96\xa1\x81\x3b\x3a\xdb\x4b\x7b\x2c\x24\x9e\x0b\x87\xd5\x35\x5d\xea\x57\xf1\x5b\x12\x0a\x9f\x11\x6a\x0c\xab\x1b\x64\x66\x3b\x35\xab\x2d\x3a\x3b\x7f\x3b\x28\x8b\xdc\x12\x0a\x22\x8f\xf2\x2a\x48\xc6\xd6\x7d\x90\x78\x5e\x8f\xc9\x5b\x76\xc5\x54\x9f\x3e\x61\x3f\x82\x47\xeb\x3e\x4d\xb0\x74\xa0\x8d\xb7\x1a\xbc\x22\xd8\x33\x7e\x6d\xa9\x3f\x42\x3b\x9f\xad\x3c\x96\x6b\xf1\xcc\x10\xc7\x55\xa9\x2f\x72\x3a\x7b\x2b\xcd\x19\x3e\xa3\xff\x3e\xf8\x26\x37\x8c\x4a\x2b\x6b\x63\x2c\xfd\xe8\x96\x1d\x4a\xae\x2f\x07\xbd\x42\xf0\xe2\xc4\xcb\x33\x94\x99\xe7\xcc\x58\x76\x1e\x07\x8e\x76\x34\x58\xae\x86\xef\x4a\xfb\xb2\x6e\x7f\x29\xe6\xa0\x08\x47\x8e\xb9\x6b\x46\x85\xc7\x1b\x64\xd7\x44\xb1\x5a\x1a\xd4\x73\x2d\xbd\xce\xc9\x5d\xc8\x9a\x11\x7a\x45\x79\x45\xa7\x15\x64\xee\xda\x87\xbb\x67\x25\xfb\x0e\x0f\x61\x06\x20\x1f\x4a\xfa\xfd\x68\xb9\x25\xf0\x3c\xf2\x8f\x83\x01\x8f\x37\x29\x92\x55\xc9\xe2\x32\xd6\x55\x67\x4a\xd6\x78\x0b\x56\x9d\x97\x50\x09\x45\xcb\x92\x68\x3e\x17\x00\x0c\x28\x0c\xa9\xa8\x61\xa2\x58\x4e\x88\x6b\x2c\xda\xc1\x21\x2a\x66\x14\x0f\x55\xeb\x42\xaa\x9a\x56\x7e\x92\xa7\xb4\xb8\x94\xb3\x19\x3c\xb5\xbb\xdf\x25\x6a\x39\x61\x85\x73\x42\xb5\x14\x38\x38\xd3\x9a\xce\x07\x08\x2b\xe8\x18\x6e\x15\x28\x57\x58\x81\xab\xe4\xa0\x42\xbd\xa0\xf4\x38\xa0\x3e\x75\x5f\x79\xa8\xb6\x0e\x8a\x2d\xf0\xab\x6a\x85\xe1\x56\xfc\xf5\x7a\x89\x11\x88\x18\xae\x25\x9e\xda\xa1\x5c\x63\x36\x00\x8f\x70\x10\x6b\x50\x8a\x75\x05\x5d\x07\x90\xbe\xb5\x7c\xb5\x55\x51\x0f\x55\x3b\xe9\xb3\x10\x9d\x23\xc0\xcd\xfe\xc5\xb9\xa5\xda\xc1\x5c\x77\xda\xe5\x3e\xe0\xbe\x75\x4c\xf1\xf7\x2f\xff\x31\xb9\x8a\xa3\xf0\xf0\x73\xab\x72\x1c\x58\x7a\x6b\xa6\xe6\x88\x82\xc6\x48\x4d\x05\x9f\x31\x6d\x39\x64\x69\xd9\xc9\x45\x57\x34\xad\x19\xb9\xb6\x8c\x84\x39\xb0\x2b\xaf\x97\x28\x5f\x2f\x56\xe2\x39\xd1\x8a\x76\xae\x8d\x7d\x25\x0f\x60\x2d\x00\xc0\xff\x03\x2b\x5a\x03\xfb\x0f\xb2\x06\xc9\xbe\x90\xf6\xb3\xc4\xec\xa1\xf3\x76\x8a\xea\x33\x0c\xbb\xf2\x6a\x58\x64\x07\x0d\xf5\xc3\xea\x7e\x74\x66\x75\x3b\x6d\x70\x5e\xd9\xcc\xea\x51\x2f\x27\x5f\x7f\x9d\x3e\x39\x58\xeb\x05\x63\x6a\x56\xb4\x8a\x9b\xa5\x15\xbc\xec\x83\x99\xcc\x34\x74\xd0\x3f\x02\xb8\x55\x77\x30\x2f\x28\x38\xc0\xb1\x30\x0c\x37\x64\xb7\x29\x2c\xa3\x3e\xc2\x4a\x8f\x26\xe8\x1d\xdb\xd6\xd7\xdd\x24\xcf\x9c\x70\xb6\x3b\xa6\xdb\x96\x7a\x42\xce\xa4\x46\x64\xd8\x80\xad\x3e\xa0\x14\x71\xc7\x35\x23\x7b\x7d\x26\xba\x11\x01\x4b\x7a\xb7\xb5\xa3\xd4\xf7\x8a\x2d\x42\xe4\x28\x3b\xfa\x2b\x68\xbb\x65\x88\xa1\xf3\x95\x46\xfc\x52\xf5\xa6\xa2\xeb\xbf\xb9\xc5\x78\xb7\x9b\xa5\x6d\xef\xfe\xf7\xde\x05\x46\x4e\x57\x99\xb6\x5f\x07\xef\x10\xcc\xd3\x17\xed\x5b\xb6\xa0\x57\x6c\xe3\xd1\xdb\xc8\x72\xb2\xe1\x04\x82\x6d\x94\x3e\xa0\x35\xed\x42\x61\x79\x80\xc5\xd6\x9a\xd5\xd0\x60\xfe\x06\x15\x60\x93\x96\x33\x5d\x92\x4a\x4a\x80\x54\x6d\x1b\x22\x64\xc9\xec\x06\x80\x94\x4e\x5a\xe9\x11\x39\x3f\x74\x37\x36\xd1\x90\xd8\x94\x02\x34\xdb\x86\x15\x1b\x6e\x78\x30\x2f\x55\xd4\x8f\x15\xd5\x9a\xf4\x3a\x87\x5e\xa5\xb6\x74\xf0\x09\x50\x1b\x05\x1e\x39\xd7\x0c\xbf\x62\x57\x0c\xd2\x58\x66\x7c\x4e\xb0\x3d\x6c\xed\x9a\x87\xf8\xec\x71\xa9\xa0\x5d\xa5\xe2\x65\xba\x63\x68\x55\x5b\xb3\x4b\x7a\x2d\xd5\x65\x25\x69\xe9\xab\x54\x2b\xab\xf0\x54\xfc\x92\x91\x63\xd6\x54\x72\xe9\x3a\x7e\x88\x92\x9c\x1b\x6a\xd8\xac\xad\xce\x07\x2c\xc5\x30\xaf\x8e\x2e\x34\xdf\x9a\x57\xc7\x0e\xbe\xe2\xd5\x39\x3d\x3f\x3a\x3f\x7d\xf4\x75\x70\xc3\xfc\x7c\xcf\xbf\x80\x99\x79\x7c\xb1\x08\xfe\x6b\x5a\x6a\xd8\x98\x54\x6d\xea\x2f\x31\x89\xef\x4c\x2a\x43\xab\x2d\xe8\xd0\xc5\x82\x36\x87\xad\x59\x1c\x73\x5d\x58\x61\x92\x47\x95\x5e\x7b\x6a\x04\x8f\xce\x20\x6e\xe7\xec\x26\xc2\xfd\x7e\x71\xf7\x1d\xfd\xf5\xf0\x8c\xd0\xd6\x72\xb3\x71\x8d\x0a\xb6\x12\xe5\x25\xd1\xdc\x9c\x63\x5b\xa6\xac\x33\xe3\x9e\xf9\x91\x79\xf1\x77\xed\xd2\xac\xec\x5a\x95\xe2\xa6\x32\xc1\xa7\x4a\xc5\x47\x55\xa9\x98\x7a\x5c\x90\x1c\x66\x04\x17\xdc\x70\x6a\xa4\xda\x85\xe2\xa8\x1e\x31\x21\x3f\xb5\xd5\x46\xd6\x4e\x24\x9c\xfa\x3b\x00\x4e\x62\x50\x84\x78\x6d\xb0\x2e\xe9\x15\x72\x88\x60\x59\x4e\x85\x61\x6a\x46\x0b\xb6\x02\x84\x3b\x02\x77\x38\xd2\xc4\xfd\x3d\xc9\xd4\xfc\xd1\xe5\xb2\x37\x70\x0e\xfe\xe9\xd5\x1f\xa3\x52\xc8\x3f\x05\xc3\xc3\xb9\xe6\x63\x1b\x43\xb0\x62\x48\x33\x9b\xe1\xdc\xf3\x6b\x9e\x73\x81\xff\x2a\x56\xd2\xfa\x71\x6a\xff\xb3\xa5\x15\x2e\xc9\x90\xe5\x1e\xfe\x9a\x3d\x56\xd8\xfa\x2e\xe9\x33\xa6\x9b\xb7\xc0\x85\x08\xb4\x02\x92\x19\x5d\x4a\xc2\x4d\xa6\x51\x54\x68\xcb\x62\x79\xdc\x26\xcf\x9c\x21\xf6\x8c\xec\x9b\xa2\x49\xae\x52\xcd\x80\xe3\x14\x30\x9c\xdc\x3f\x92\x1e\x93\xab\xb5\x41\xd5\x8a\xd8\x28\xc2\xa9\xbf\x40\xa6\xfe\x3e\xb4\x36\x18\x36\x5b\x5b\x2f\xa5\x05\x39\xb5\x75\x60\x75\x47\x46\xd8\x01\xf1\x54\xa3\x49\x41\xbe\xe7\xda\x20\x5c\x2c\xde\x0c\xf0\x70\x08\x8f\x6e\xcd\xd5\x33\x22\x15\xe1\xcd\x7f\xd1\xb2\x54\xaf\x50\xf3\xf4\xd1\x51\x95\x8e\x56\xc8\xb5\x4b\xcf\x03\xa0\x42\xef\xaf\xd8\x37\xcb\x86\x17\xb4\xaa\x96\xe4\xe2\xe8\x0c\x46\xd0\xe4\x0f\xbf\x7b\x01\xf6\xeb\xd7\x5f\xfd\xee\xc5\xc0\x2d\xf4\x84\xae\xbe\x72\x3d\x8a\x6c\xe6\x47\x50\x17\xbc\x6b\xd8\xad\x3d\xa4\x55\xe8\x45\x69\xed\xc3\x73\x04\x1a\xb5\xca\x91\x3b\xee\x50\x10\xd8\xdd\x15\x54\xbd\x9c\x56\xe4\x13\xa4\x67\x74\x3d\x41\x7a\x3e\x41\x7a\x3e\x41\x7a\xde\x7c\xc5\x7e\xce\x6d\x9f\x47\x31\x2d\xd0\x2e\x71\x5d\x6f\x42\x95\xe9\xec\x73\x57\x99\x12\x59\x2d\x55\xf0\xe6\x58\xc0\x18\x2e\x66\x48\xff\x8b\xae\xad\xc3\xf1\xdb\xf3\xff\xfa\xfe\xf0\xdb\x93\xef\x61\x56\x1d\x2a\x8d\xdd\xde\x5c\x3c\x68\x18\xe5\x5e\x45\xcc\xb0\xf5\xde\x5e\x01\xb2\x58\x29\x3d\x16\xe4\xed\xeb\xf3\x3b\x56\x1d\x6f\x21\x06\xf6\x85\x98\xa5\xaf\xd2\x63\x2b\xc6\xb1\x3f\xd5\x4c\x6d\xa7\xff\xce\xce\x54\xf2\xf8\x30\x2f\xfb\xd0\xf7\xfa\x5b\x7e\xc5\xd9\xd9\x9a\x83\x3d\x8d\x19\xc9\xbf\x4d\x45\xad\x5d\x22\x5c\xb6\x47\x5f\x4b\xfb\x90\x6c\x31\xcc\x22\x56\xb9\xda\x66\x0d\x6a\x65\xa2\xa2\x8e\x5b\xf6\x20\x41\xf5\x42\x59\x35\xcf\x2a\x78\x4c\x6b\xaf\x6c\xfc\xfb\xee\xe3\x66\x53\x7b\xfe\x6d\x29\x04\x1b\x89\x71\x0d\xfb\x31\xdf\xa6\x57\x18\xdd\x4b\xc0\x4b\xcb\xba\x59\xed\x0d\x0e\x23\xf6\x72\xdf\x40\x29\x6b\x68\x91\xaa\x8a\xa6\x71\x45\x37\x13\x63\xcf\x20\xdd\x47\xf8\x09\x34\x2e\x7f\x84\x8a\x08\xd0\xbd\x25\x18\xe6\x30\xf6\xb6\x85\x53\x20\x64\xb5\x23\x20\xbd\x0b\x4b\x12\xaa\x43\xf5\x0d\x56\xee\x64\x68\x1d\xb8\x93\x3c\x4b\x3e\x4b\x7d\xe5\xa7\x07\x76\x97\x6f\xd3\x55\xde\x2c\xa4\x91\x62\x37\xda\x1d\x6c\xa2\xa5\x7f\xb4\x9c\xc1\x1d\x47\x21\x49\x36\x3a\x9a\x10\x9f\x36\x24\x7c\xae\x54\xee\xba\x34\xce\x1c\x45\xbb\x31\x34\xd6\xd9\x26\x8a\x6f\x47\xc9\xda\xf8\x92\x9f\x17\x60\x56\x53\x9e\x1e\x6f\xe1\x14\x79\x0c\x69\x72\x9f\x69\x6f\xd4\x07\x4a\x7b\x1b\x0e\x07\x56\x66\x6a\x76\x63\x1f\xe4\xd7\xf8\xf4\xd8\x39\x22\x7c\x27\x1b\xed\xe4\x02\xb9\x59\x50\x6d\xc5\xa6\x90\xca\x5c\x4b\xb5\xe5\x0e\xe0\x7d\x2a\x56\x20\x95\xdc\x77\x6b\x5d\xbf\x1e\x48\x9a\xf7\x49\xbb\x53\xf3\x99\xd5\xf7\xb2\x2b\x95\x44\xd0\x0d\x9d\x67\x3e\x94\x13\x3f\xc2\xa4\x90\x75\xd4\x74\x86\x5c\x2f\x18\x6a\xa1\x47\xe7\xa7\x6f\xf8\x1c\x09\xf4\xef\x42\x66\x8c\x9a\x56\xb1\xf1\x9c\x9a\x34\x82\xb8\x26\x69\xd9\x7e\x5b\x3e\x85\x90\x87\xfe\x9d\x4f\xa2\x73\x38\x89\xa2\x1d\x76\xdb\x89\xf4\x39\x1c\x48\x8f\xe7\x20\xda\x39\x9b\xe7\xa9\xf3\x73\xef\xf2\xc2\x23\xcb\xfa\xf8\x87\xb9\x40\xa7\xe5\xcd\x4e\x55\xa0\xe1\xd8\x71\xf7\x6d\x45\x35\x50\xf2\xbf\xe1\xbc\x19\xac\x15\x84\x27\x61\x7e\x1f\x1c\x93\xb4\xaa\xec\xca\x4a\xc1\x42\x85\x9e\xee\xea\x4d\xb1\xe0\xb2\xa6\x8d\xab\x3d\x2d\xe5\xb5\xb8\xa6\xaa\x24\x87\x67\xa7\x0f\x7f\xea\x0c\xc6\xae\xc7\x7d\xf4\x46\x96\x5b\x97\xff\x11\x29\xa0\x55\x00\xa2\x88\xfd\x63\xca\x8d\x46\x98\x47\x00\x5d\x34\x71\x90\xc5\xaa\x57\x21\xe9\x1f\x40\x3d\xa6\x41\x38\x64\x30\x5a\x04\x91\x85\xa1\x95\xcb\x54\x9a\x32\x73\xcd\x98\x20\x2f\x5e\xbc\xc0\xfc\x8a\x17\xbf\xff\xfd\xef\xa1\x98\x9b\x94\xac\xe0\xf5\xfa\x8d\x70\xd7\x6f\x5f\xbe\x4c\x27\xe5\x6f\x87\x6f\xbe\x27\xb4\x00\x1f\x19\x99\x4a\xb3\x70\x14\x01\xeb\xc5\x83\xea\x11\xf9\x3f\xe7\xef\xde\x7a\x3d\x44\xaf\x7c\x0b\x9c\x1d\xa6\x73\x80\x0f\xc8\x01\xc5\x70\x80\xfd\xe9\x32\x20\xa8\x59\x04\xc8\x13\x0a\x99\x68\x11\xb4\x8e\x93\x97\x03\x0a\xaa\xa0\x2b\x3b\x9f\x2f\x60\x59\xb8\x80\x5d\x58\xf1\xc2\x75\x1e\xc0\xbc\x18\xac\x94\xf6\xf8\x9e\x88\x63\xe2\x55\x88\xe4\x91\xed\x94\x8d\xb0\xb6\xd9\xa1\xa6\x8c\x82\x8f\x44\x31\xdd\x56\x06\x3a\x53\x4d\x99\x23\xa2\xe3\x58\xcd\x92\x39\x70\x37\x52\xd8\x9d\xe8\xdb\xb6\x5c\xf0\x12\xd8\x99\xaf\x15\xb7\x4a\xd9\x2c\x00\x52\xa3\x00\x87\x80\x2b\x39\xa1\xc5\x82\x30\x61\xa0\x87\x03\xb2\x9e\xbd\x3d\x79\xe8\x05\x15\xa5\x95\x29\xd0\x48\x1f\xc8\x78\xb4\xf9\xe7\xf9\x32\x59\xcf\xc2\x8c\xf7\xe0\xb4\xba\x93\x94\x56\x52\xcc\xe3\x8d\xd9\x29\xd6\x11\x9c\xd0\x00\x19\x04\x85\x8d\x00\x2e\x6c\x17\x06\x83\xaf\xda\x01\x1e\x69\xc4\xda\x9a\xb2\x21\xfb\x2f\x4b\xfe\x72\x9e\x0c\x66\x42\x0a\xc4\xb8\xbe\x50\xad\x36\xdf\xb6\x96\x21\x87\x3c\x2d\x6f\x4e\x33\x21\x47\x6b\xd4\x61\x42\xb0\xcb\xb1\x82\x98\x6a\x51\x30\x8d\x9b\xf7\x17\x44\x20\x31\xdd\xdd\xbf\xe0\xb2\x0d\xa4\x42\xce\x36\x11\xe2\x51\xdf\xb8\xb0\x27\x39\x6d\x8d\x1c\xb7\x4d\x49\x03\x02\x76\x22\x72\x60\x77\x1d\x56\xcd\x82\x8e\xc8\x9c\x46\x46\xe3\x3a\x1d\xd1\x86\x71\xde\x0d\xf8\xc5\xe0\xd1\x6f\x79\x63\x7b\x24\xb9\x84\x54\xd8\x09\x55\x38\x8f\x05\xad\x19\x60\xf5\x20\xb9\x03\x49\x28\x64\x3d\xe5\xc2\x81\xe0\xcd\x00\x25\x90\x29\x8c\x42\x02\x02\x1e\xa9\xe8\x94\x55\x8e\x00\xa9\x06\xbf\xf2\x77\x1e\x59\x89\x29\x7b\xbe\x69\x42\xe7\x73\xc5\xb4\xe6\x57\xcc\xc1\x0d\xf2\x7f\x06\x6a\xa0\xb5\xd5\xc9\x1b\x0f\xc5\xa8\x89\x35\x0e\x0d\x4b\x6f\xee\x83\x57\x68\x9b\x65\xd9\xbb\xf3\x21\x4c\x08\x39\xd1\xd2\x30\xc5\x0b\x18\xd5\x2d\xb5\x26\xba\x2d\x16\x84\x6a\xac\x3e\x1c\x03\xe6\xe2\xf0\x59\xef\x10\x56\x10\xc4\x71\xc1\x68\xe9\x51\xe7\xac\x51\xd5\x34\xac\x9c\x10\x72\x64\xc5\xcf\x8c\x17\xd4\x20\xa6\x18\x29\x59\xd9\x36\x15\x47\x1f\xe1\x40\x32\x2e\x16\x8c\x48\x55\x32\x00\x97\x94\x33\x48\xbe\x0f\x83\x45\xba\x21\x80\xcd\x73\x3b\xfe\x94\x1b\x45\xd5\x12\x35\x28\xb7\x96\x03\x89\xb0\xa7\x4f\x01\x38\x76\x30\x16\xd0\x03\xa0\x37\x24\xbd\x9b\x8c\xbf\xb2\x1c\x02\x64\xb0\x6f\xb0\xbb\x06\xe4\x5f\xfa\x2b\xcf\x99\x64\x2f\xd8\xda\xe7\x6e\x67\x0f\x7d\x58\xee\x63\xc9\x5e\x48\x1b\x98\xf3\xeb\xa2\x32\x60\x81\x9a\x62\xe1\x34\xc5\xbe\xa8\x22\x04\xfd\x47\x74\x58\x75\x0c\x5e\x0e\x55\x91\x7b\x11\x19\xea\xe9\x99\x99\x58\x73\xd3\xb4\xb4\xaa\x96\x63\xf6\xc1\x1e\xf6\x56\x98\x81\xf6\x04\xcd\xc2\xa0\x10\xbf\x15\x9a\x99\x51\x06\x42\x40\x08\x35\x0a\xd1\x6c\x35\xd9\xc3\xf7\x17\x12\x5a\x23\xec\xe1\x60\xd6\xc4\x9e\xb6\x06\x8b\x74\x46\x9b\x7f\x92\x63\x4e\xae\x98\x5a\xba\x71\x07\x3f\x2e\xdb\x56\x25\x59\xf7\x08\x01\x09\x65\x8a\xc5\xc9\x87\x46\x21\x54\x4b\x96\x67\xae\x6c\x97\xd5\x21\x10\xd1\xdf\x5b\x4a\x7d\xc6\xf6\xc2\x08\x4e\x10\x2c\x62\x89\x3f\x81\x53\xe2\xf0\xed\xf1\xf0\xe3\x01\xaf\xe1\x86\x4f\xff\x1a\x68\x06\xf5\xaf\xfc\x32\x07\xaf\xc3\x5b\xe6\xdc\x75\x5b\xf0\xdf\x60\xc3\x4f\xc4\x58\xd3\xc1\x93\x43\xc9\x25\x73\xc7\x24\x15\x2e\x04\xe1\x6e\xce\x46\xa4\x62\x00\xe5\x88\x88\x95\x6c\x09\x83\xe1\xf8\x79\x56\x3e\xf3\xa6\xc4\x2b\xd7\x49\xda\x5d\x63\xfb\xf2\x19\x9f\xe6\x17\x2b\xd3\x23\xf3\xca\x22\xbc\x2e\x59\x72\x20\x67\xd3\xd5\xdb\x45\x96\x93\xbc\xa7\x06\xf6\x80\xfd\x20\x60\x20\x05\xb6\xa7\xd0\x19\x54\x13\x23\x73\x31\x1b\xc9\x57\x1d\xd9\xbf\xfc\x82\xde\xdb\x94\x65\x14\x3c\x24\xa2\xb7\x9f\xab\x70\xc9\x96\xcf\x34\xee\x79\x7b\x42\x2c\x78\x03\xa6\x39\x1c\xf6\x72\x96\x79\xe3\xe3\xf5\x23\x60\x9c\x7b\x72\xf0\x64\x39\x15\x23\xf2\x56\x1a\xfb\x9f\x93\x0f\x5c\x3b\x1b\xe6\x58\x32\xfd\x56\x1a\xf8\x64\xe7\xf9\x01\xa7\xea\xb1\x70\x83\xf3\xfe\x73\x28\x8c\x83\x63\x18\x0c\x75\x98\x12\xbf\xea\x1e\xd8\x39\x70\x0e\xd7\xe4\x14\xba\xfb\xe2\x52\x65\x25\x08\xaa\x32\x3d\xc8\xb5\x25\xc7\xfb\xeb\x00\xa2\xdd\x55\x8f\xaf\xd3\xe3\xb8\x45\xaa\x1e\xb3\x3c\x10\x69\x8e\x2c\x88\x42\xe0\x37\xd0\xff\xa4\xa9\x68\xc1\x4a\xdf\x5e\x81\xda\x59\xa5\x86\xcd\x13\xeb\x9f\x6f\xba\x6a\xa6\xe6\x10\x60\x29\x06\xb4\x5c\x5a\xbf\x72\x2b\x66\x78\x65\x55\xcf\xf0\xba\x97\x4d\x7c\x2f\x68\x2a\x0f\x3e\x04\xe8\xfd\xdf\xdb\x63\xf6\x3e\xac\x8a\x6c\x92\x28\x22\x13\xb5\xdf\x9a\x36\x56\x0a\xfd\x3f\xab\xe4\xc2\x86\xfb\x1f\xd2\x50\xae\xf4\x84\x1c\xfa\x86\x14\xf1\x77\xce\x8f\x14\x3d\x26\x1b\x61\x0d\xd4\x63\xfe\xda\xf2\x2b\x5a\x39\xf0\x64\x2a\x08\xc3\xe6\x1e\x96\xc6\x55\xd3\x6a\x44\xae\x17\x52\xa3\xc6\x1c\xa0\x37\xf6\x2e\xd9\x72\x6f\x94\xc1\x9f\xea\xaf\x58\xf2\xed\x9d\x8a\xbd\x2e\xe6\xd8\x93\x4f\xc1\x6e\x80\xda\xc3\x3d\xf8\x6e\xef\xa1\x6c\xba\x8c\x7a\x3d\x2d\x4b\x8e\x28\xd7\x67\xd9\xd5\xdd\xac\xe2\x23\x3f\xea\x45\x77\x0d\xc5\xaa\xc1\xeb\xfe\xdc\x68\x7e\x67\x6e\x08\x3b\x4c\x97\xbe\xc1\x8c\x73\x59\xad\x7b\xb4\x32\x10\x02\x3e\xb1\xc8\x7f\x66\xb7\x44\xcf\x09\x99\xcb\x8d\x94\x85\x59\x3c\x6e\xfb\x2e\x2e\xa9\xd5\xaf\x54\xcb\x46\xa4\x94\xe2\x99\x71\x21\x84\xb8\x3d\xd4\x6a\x9b\x89\x72\xc3\xaa\xef\xeb\x83\x0c\xa4\x50\xc5\xa0\x1b\x86\x6f\x8d\xe5\xfc\x9d\xd8\x40\x0a\x62\x55\xc6\xe7\x0b\xdb\x3f\x37\x11\x32\x14\xc0\xc8\x11\xe2\x60\x8c\x84\x84\x53\x00\x5a\xe5\xc6\xc4\x74\x8c\x17\x91\xd4\x8f\x7f\x65\xa0\xe2\x36\xf6\x86\xb3\xb3\x03\x5b\x42\xd7\xed\x3f\x99\x92\x19\xc6\xdd\xe0\x20\xcf\xb5\x9b\x86\xe4\x35\x76\xd7\x10\x10\x87\xee\xea\x6d\xa5\xf7\x60\x0c\x5f\xb9\xe4\x25\xe8\x7d\x16\x61\x42\x2b\x89\x8c\x00\x19\xa5\xf0\xc5\x14\xe6\x65\xa7\x84\x4c\xc7\x2e\xbb\x28\x66\xee\x18\x80\x89\xa2\xc7\x39\xf4\x94\x8f\x44\x55\x2e\x16\xac\x8b\x0c\xcb\x19\x50\xe9\x03\xe5\xf7\xb3\xa1\x02\x4a\x71\x2b\x10\xb0\x17\x73\xf8\xf2\x05\x64\xb3\xb1\x16\xe6\xb8\xbe\xa1\x4d\xc6\x4c\x93\xf0\x4c\xa8\x09\x56\x35\x0a\x4d\x3a\x95\xad\xf1\x50\xcd\xee\xfb\x92\x1a\x0a\xfd\xa9\x30\x6f\x62\x37\x42\xb8\xf9\xfc\xb0\x99\x4c\xe4\xfc\xdb\x15\x33\xa0\xfb\x15\x07\x23\xc2\x68\xb1\xb0\xd6\xce\x18\x53\x5b\xad\x9d\xe6\x0d\xb2\x63\xbb\x50\x68\x04\xc9\x55\x85\x21\xc7\x16\x0a\x1c\xe1\x37\x4e\x94\xad\xed\x93\x30\x7c\xe9\x95\x76\x05\x1d\xce\x3c\x13\x5d\x51\x7c\x06\x4a\x7c\x78\xc4\x37\xf5\x74\x0e\x6e\x98\x11\xf0\x56\x45\xf3\xe5\x73\x14\x59\x69\x7f\x16\x36\x7d\x06\x2a\x36\xbc\x7d\x87\xc7\x6e\xcf\x30\x97\x91\xde\x8a\xb5\xf1\xad\x52\x93\x89\x06\xec\x96\x66\x5f\x9a\x7a\x67\x7f\x84\x0a\x0f\x1d\x51\xa1\x32\xb8\x6b\x4a\xe6\xb8\x25\x2c\x67\x0e\xa7\x5d\xb4\xf4\x9a\x85\x86\xa6\x4c\x29\xa9\xec\xfb\x33\xad\x09\x87\x75\xaa\xa9\xba\x64\x65\xd0\xc6\x27\xe4\xcc\x4e\x94\xf7\xec\x65\xa0\x44\x79\x2d\xc2\xb7\x4b\xb5\xaf\xee\x0c\x73\x20\xf3\xd9\x64\xf2\xcc\x75\x72\x57\xa8\x60\xe3\x39\x64\x3f\xcf\x25\xf1\xf3\xb8\xf1\xb2\x39\xef\x7a\xb2\xe9\x0d\x6d\x34\x3a\x47\xad\x1a\x0d\xe1\x20\x49\x28\xce\x88\xcb\x12\xa2\x83\xc1\x26\xba\x2b\xb3\x73\x22\x6f\xc0\x31\x5f\xb0\x31\x43\x2a\x10\x5e\xb9\x03\x8c\x19\x83\x8b\x37\x05\x16\x1d\x0f\x39\x79\x98\x37\x5a\x9d\xd1\xcf\x5c\x0f\x28\xaa\x59\xbd\xee\x2b\x44\x04\xe5\x0a\x5c\x93\x77\xde\x5b\xf1\x69\x25\x37\x06\x91\x87\x73\x58\x43\xfe\xda\xa1\x9a\x9b\xd5\x6b\xd7\x6a\x70\x56\xaf\xd3\x19\x76\x1a\xee\x2b\x21\xee\x78\x8c\xcb\xaa\x82\x01\x32\xa8\xc7\xe4\xea\xb5\xbd\xe2\x9c\xd5\x6b\x2b\xc5\x3a\xab\x57\x8e\xe2\x9d\xd5\x6b\x78\x31\xcf\xea\x95\xc7\x9f\x82\xd7\x7d\x09\x27\x50\x11\xb8\xef\x06\x1c\x3b\x6b\x9c\xb9\x01\x0a\x3f\xb8\xc2\x9a\xe8\x60\xc8\x28\x93\x9c\x3a\x87\x62\x89\x4e\xb5\xac\x5a\x83\x24\xe4\x1f\x24\xd6\x19\xe1\x25\x7d\x14\x2a\x8f\xa2\xb8\x3a\x5c\xa4\x89\x82\x25\x81\xea\x59\xce\xb1\xee\x2f\xf2\x92\x3b\x96\xba\xab\xa1\x97\xfc\x2d\x03\xf0\xda\x8d\xc6\x01\x78\xed\x44\xfb\x00\x4f\x4a\xfe\x26\x02\x78\xed\x12\xce\x77\xff\xca\xba\x49\x87\xb7\x15\xf0\xd7\x3d\x45\xcf\x42\x33\x65\xd4\x95\x96\xa1\xab\x66\xcf\x41\x01\xf0\xfd\x46\xa3\xff\xc4\xe7\x00\x61\x1f\xce\xe1\x7e\xad\x7c\x41\x91\xfb\x0a\x46\x7b\x44\x83\xc3\xb3\xd3\x8c\xfe\xdf\xe8\xa9\x37\x78\x80\xe3\x3b\x9e\x7c\xc0\x9f\x72\xf5\x26\xf8\x14\xdd\xb7\x71\xe6\xff\x71\x37\xa3\x0e\xe7\x29\x8b\xba\xbd\xfb\x3e\xa7\xb5\x17\x7f\x6d\x35\xc5\xb8\xe7\x5c\xc4\x81\x46\x3a\x08\x89\x4e\xa7\x74\xba\x18\x62\xa1\xfa\x4a\xbf\xe1\x65\xaa\x64\xf7\xfd\x53\x3b\xea\x55\x82\xd9\x1f\xd0\x1d\x6b\xf5\xea\x71\xcb\xb3\xf7\x7e\x12\x5d\xc8\x12\x83\x09\x51\x5c\xa3\x91\xe5\x2b\x4c\xb2\xa2\x42\x48\x83\x39\xd4\x23\x0c\xcf\xeb\x91\x4b\x54\x88\x00\x75\x45\x49\x5a\x5e\x62\x35\x66\x40\xc6\x7c\xf6\xef\x55\x56\x01\x13\x78\x96\x87\x9d\xc8\x3d\x55\x42\xd0\x86\xff\xc8\xd4\x90\xde\xdd\x9b\xae\x1e\x73\xb9\xe7\x7b\x4e\xd2\xc5\x82\xd5\x14\xfe\xf9\xda\x4f\x90\x15\xda\xae\x36\x19\x82\x25\x4c\xd5\x56\xf1\x1d\xf5\x50\xae\xf6\xae\x5e\x66\xa8\x93\xeb\xae\x7b\x49\xab\x0d\x6b\x7e\x6f\xd3\x79\xd6\x33\xff\xed\x16\x05\x0f\x25\x24\x1a\x78\x74\xeb\x10\x8e\xb2\x9a\xc4\x15\xce\xff\x8e\x4f\xdd\x7d\x26\x16\xe2\xf5\x18\xbc\xd1\xa9\x5e\xe8\x51\xd0\xd2\xfb\xde\xe3\x6c\x84\x3d\x79\xa1\x3f\x7e\x3d\x79\xa1\xdd\xf5\xe4\x85\xfe\xe4\xeb\xde\xbc\xd0\x91\x4a\xe7\x4f\xd8\x0d\x6e\xe4\xb8\x53\x9c\xf7\x25\x77\x5d\xe4\x27\x18\x93\xf2\x0e\x60\xef\xfd\x95\xaa\x1f\xde\x7f\x36\x99\x3c\xc3\x00\xff\x24\x04\xb1\x5a\x33\x1b\xff\x81\x30\x51\xc8\xd2\x3e\xe7\x02\x9e\xaf\xb4\x01\x73\xa7\xf3\xe8\xc5\xb4\xd4\x7e\xac\x38\x45\x00\x9e\x9d\x57\x6f\xcc\x78\x6c\x79\x74\xc4\xd7\xf7\xa9\x9c\x67\x3c\x5e\x3a\xe5\xde\x53\xee\x97\xc2\x2d\x28\x53\x4e\xcb\xef\x70\x1f\x2b\x5e\x73\x57\xa5\x68\xe5\x29\xd3\x26\x57\xf1\x09\x21\xfb\xf8\xf0\x49\xd1\xb4\x23\x37\xd0\xa4\x66\xb5\x54\xcb\x51\x18\xcc\x7e\xd9\x1b\xdd\xdd\x71\x00\xc6\x45\xd1\x2a\xc5\x84\xa9\x96\xc3\x00\xf8\x37\x5d\x8f\xc4\xca\xf0\x2b\xb5\xc3\x46\x46\x60\xae\x3c\x79\xba\xdd\xd5\x97\x78\x47\x7e\x18\x0c\x67\x84\xd9\x86\xf3\xde\xb5\x52\x19\x75\x1e\x50\xfb\x29\x13\x57\xe4\x8a\x2a\x9d\x4b\xc2\x90\xfb\xb2\x2b\x4a\x7e\xc5\xf5\x3d\x96\x60\x9f\x3b\xa5\x05\x63\x8d\xb2\x35\x4d\x6b\xdc\x71\xe7\x45\x04\xfb\xd0\x48\xab\x8a\x06\xd1\xb0\x62\x9e\xbd\x1c\xea\xf2\x8e\xaf\x86\x1a\xc3\x94\x78\x45\xfe\xef\xfe\xcf\xbf\xf9\xd7\xf8\xe0\xcf\xfb\xfb\x7f\x7f\x31\xfe\x8f\x7f\xfc\x66\xff\xe7\x09\xfc\xe3\xcb\x83\x3f\x1f\xfc\xcb\xff\xf1\x9b\x83\x83\xfd\xfd\xbf\x7f\xf7\xe6\x2f\x17\x67\x27\xff\xe0\x07\xff\xfa\xbb\x68\xeb\x4b\xfc\xeb\x5f\xfb\x7f\x67\x27\xff\xf8\xc4\x87\x1c\x1c\xfc\xf9\x7f\x65\x7c\x09\x2a\x96\xef\xb2\x9d\x09\x78\x8d\xef\x45\xaf\xe9\x3f\xfb\x7e\x2b\x4d\xb9\x30\x63\xa9\xc6\x38\xc8\x2b\x28\xc3\xc9\x36\x94\x67\xcd\xfb\x93\x31\x9d\x56\x15\x4e\xd0\x60\x7e\xef\xb8\x10\xb9\x5f\x0b\xfb\xde\xc2\xd3\x8d\x2c\x23\x10\xb7\x5d\x42\x7e\x74\xb0\x86\x3a\x60\x2b\x2a\x70\x8c\x8a\xb9\xd5\x9f\x01\x30\x9c\x56\xae\x66\x86\xec\x37\x8a\x5f\x51\xd3\x01\xcd\x44\x58\x71\x03\xc9\x28\x16\x94\x8b\x83\x0e\x62\xa4\x91\x25\x98\x57\xad\x66\xa1\x27\xb7\x55\xf9\x2e\xbe\x3f\x27\x45\xc5\xa1\xac\x57\x85\x36\x8d\x03\x07\xf7\x78\x84\x73\x26\x98\x42\x90\x3d\xb2\xfa\xaa\xad\x66\x90\x8c\x0c\x1b\x45\x94\x89\x2d\x06\xbb\xeb\xac\xc7\x11\xef\x51\x2d\xf4\x8d\x37\xb0\x46\x0e\x2b\x69\x00\xc2\xcc\x35\x05\x73\xb5\x35\xb4\x69\x94\xbc\x62\x39\xf2\xe2\x9d\x3e\x0a\xaf\xc8\xb5\x86\xa2\xe4\x78\x59\x71\x61\x46\x61\x8a\xa0\x8e\xaa\x87\x36\x34\x74\xe1\x57\xc7\x22\x37\xe1\x32\x5e\xb8\x0f\x4b\xc9\x74\x64\x62\xb5\xc2\xf0\x2a\x1f\x11\x9a\x2c\xe8\x15\x23\x53\xc6\x04\x4e\x08\x6a\x5e\x50\x3f\xd1\xdf\xc5\x51\x26\xff\x20\x0c\x7d\x7f\x39\x49\xcc\x05\x44\xad\x01\x61\x35\x17\x63\x3b\x5f\xcd\xdc\xce\xae\x5a\x42\x3c\x4c\x12\xd8\xe8\xc8\x57\xf1\x22\xb8\x0d\x68\x78\x6d\x69\x29\xb1\xa6\x69\x20\x1d\x0e\x54\xd5\xb1\xaf\xef\x4e\xc8\x36\x6f\x82\xc9\xb9\xa1\xa6\xd5\x93\x6f\x2d\xbd\xef\xd9\x4c\x31\xbd\x38\x1c\x6a\xbc\xd8\xd7\xd1\x86\xd6\x4d\xb6\x39\xb5\xd2\x09\xab\x0a\x43\x4d\x35\x3a\x31\xc3\xa4\xf9\xd7\xee\x04\xa9\x43\x92\x1d\x1e\x4d\x01\x9f\xf9\x08\x45\x60\x43\xad\xcc\xc2\xbd\xb2\x61\xf4\x4b\xb6\x04\xdf\x49\xd6\xad\x7a\x64\x77\x2a\x3c\x16\xe1\x9a\x07\xcf\xea\x45\x6f\x9e\xfc\x81\x83\x20\x6b\xdd\xe4\xda\xcd\x01\xa8\xac\xa0\xd3\x3b\x99\x80\x2e\x99\xb3\x93\x37\x03\x49\x70\x88\xe3\xae\x8b\x66\x24\xfe\xf7\xed\xa8\xdf\x1d\x9d\x7f\xf1\x07\x37\xf0\x41\xec\x09\xac\x5d\x84\x39\x0f\x01\xdc\x21\xbc\xae\xee\x4a\x14\x8d\x4e\x20\xf5\xb7\xd3\xbe\x59\x36\xbc\xa0\x55\xb5\x1c\x5a\x92\x83\x0f\x74\xc5\x46\x8a\x99\x56\x81\x73\x8c\xab\x4d\xa4\x08\x52\x31\x3a\x1b\x83\xc6\x20\x0d\x42\xb6\x1e\x0c\xe6\x83\x33\x48\x90\x8b\x44\xc4\x3a\x53\xe0\x1a\x8c\x2c\x5f\x14\x8c\x2c\x65\xeb\x70\xc8\x0a\xcc\x03\x28\x64\x39\x58\x19\xa1\x02\x7a\xd4\xd8\xf3\x1e\x55\x3f\x3b\xbb\x58\x46\xbe\x94\x2d\x28\x25\xd1\xb6\xda\xb8\x31\x86\xae\xc5\xda\x7b\x81\x67\xb1\xa6\x97\x8c\x98\x6b\xd9\xdf\xf6\x40\x6c\x00\x80\xd2\x8c\x14\x92\x8b\x82\x0f\x9e\x07\x4c\xd4\xeb\x2d\xbe\x72\x61\xf3\x91\x2b\xcc\x6a\xa4\xd6\x7c\x5a\xb1\x48\x73\x5b\x51\x9c\x2c\x97\x64\xd4\x11\xec\xfc\xc3\xda\x74\x45\x5a\x4a\x31\xdd\x48\x01\xf1\x25\x38\xa7\xc1\x21\x3f\x21\xe4\x6f\x2b\x73\x38\x78\x3a\xaa\x8a\x08\x86\x81\xac\x62\xc1\x8a\x4b\xd7\x8f\x8d\x6b\x52\x48\x81\xe0\x27\x23\xe7\xe6\x1b\x03\x91\xa0\x9c\xd8\x69\x59\x66\x48\x6e\x2c\xa4\x70\xdd\xfc\xb2\x88\xdb\x58\xc9\x04\xef\x96\x92\x95\x26\xc5\x42\x4a\xed\x34\xbc\xbe\xeb\x24\x5e\x05\x3e\xf4\x3c\x46\x5d\xf3\x7f\xc3\x3b\xb5\x95\x89\xe5\x19\xaf\x1b\x4c\x99\x86\x35\x7b\xa6\x49\x29\x8b\x36\xfc\x6d\xe7\xbe\x62\x54\x09\xb2\x90\xd7\xc4\x0c\x45\x4d\xb0\x5b\x79\xe5\xe5\x5c\xcd\xa1\x1e\x8c\xa4\xb7\x83\xc0\xd3\x97\x6c\x79\x91\xda\x23\x30\x7e\x4e\x87\x58\xb0\x23\xa9\x78\x9b\x44\xf0\x2e\xe6\x82\xff\x14\x70\x28\xd6\x8f\x54\x10\xa0\x56\xa6\x42\xa8\xcb\x95\x10\xac\xd8\x18\x83\x77\x3e\x81\x3c\x66\x6b\xf1\x75\x72\x51\x13\xbd\x90\x6d\x05\x46\xee\x46\x6d\x75\x42\xc8\x4f\x0b\x26\xdc\xb1\xec\x8e\xbe\x1c\xa9\xda\x37\x1d\x9e\xeb\xc7\x9f\x95\xbb\xba\x13\xbc\xe1\xb8\xc9\x53\x89\xe9\x0f\xaa\xbe\x25\xa4\x58\x24\x73\x47\x64\xca\x0a\x6a\x67\x68\xf5\xe4\x93\x78\x20\xe5\x29\x52\xc7\xf6\x57\x35\x2f\xc7\xfe\xa8\xdd\x19\x3c\x09\x7b\x6d\xe2\x8e\x1d\xdf\x67\x6b\x0a\xe4\x83\xed\xb3\x4f\x34\x6a\xfa\xe0\xd1\x75\x5b\x19\xde\x54\xd8\xf4\x02\x30\x9d\xb2\x64\x77\xf4\x2c\x25\x87\x15\x05\x94\x9c\xbd\x3f\xfd\xf1\xf0\xe2\x84\x7c\x77\xf2\x37\xfc\x78\x14\xe7\xcd\x52\x6f\xf9\x38\xb5\x2e\x03\x25\x97\x6c\x99\x6d\x76\x3b\xf3\x0b\x67\x0a\xf6\xec\xd1\xc9\xfb\x8b\xd3\xd7\xa7\x47\xf6\xad\xf0\xe3\xd1\x6a\x2a\x30\x1a\x52\x19\x88\x58\x97\xe2\x01\x81\xc8\x9b\x67\x20\x57\x10\x03\x7c\x89\x30\xfc\x35\x2b\xb9\x55\x34\x86\x9b\x4b\xf6\xfa\x41\xf7\xbd\xb5\xdd\xc6\x24\xd0\xae\x18\x44\xe9\x99\x2c\x9f\xe9\x35\x3b\x09\xed\x09\xcf\x8d\x39\xe4\x28\x58\x4b\x5e\x1e\x52\x63\xad\x48\xc5\xd9\x15\xba\x15\x83\x2c\xdd\xe4\x40\xc6\xe9\x0b\x46\x56\x9e\xec\xe5\xff\x76\xa9\x41\x35\xfa\x6d\xfb\xae\x92\x8d\xa6\x63\x4f\xcb\xcf\x31\x23\x01\x14\xb1\x5a\xae\x9e\x5d\x6b\x27\xce\x35\xd5\xde\xc6\x77\x5e\x50\xd8\x2c\x43\x69\xc8\x28\xff\xdd\xd9\xbf\xdb\x22\x1f\xb8\xeb\x49\x99\x7a\x52\xa6\x76\x5c\x99\x72\xd6\xd8\x2e\x6e\x26\x7b\xb8\x42\xb1\xa6\x9c\x59\x32\x01\x2f\xaa\x17\x4d\xf0\xb1\xb2\xd0\x92\xbe\x91\x65\x96\xfd\x84\x78\xf3\x01\x20\x97\x91\xbd\xf7\xe7\x87\x5f\xbf\xf8\xfd\x57\x7b\x23\xf8\xe7\x37\x2f\xfe\xe3\x77\xf6\x9f\x27\x47\xc7\xe7\x87\x67\x5f\xfd\x36\xfa\xe3\xeb\x3f\x7c\xb3\x97\x03\x96\xc8\x3d\xee\xb7\x5f\xbd\x74\x90\xbd\x7b\x27\xc7\x5f\xfd\xf6\xb7\x2f\xff\x23\x5b\x8b\x9b\x2c\xec\x53\xd3\x0f\x27\x1f\x1a\x8e\xad\xf7\xcf\x59\x21\x45\xb9\x93\x88\x64\x9b\xe8\xf4\x7e\xf6\x9a\x7e\xe0\x75\x5b\x93\x8a\xcf\x18\x84\x9c\x20\x39\xdc\x18\x17\x76\xcb\x23\x06\x22\x39\x94\x85\x45\x43\x08\x48\x36\x98\x6c\xc4\x5d\xcf\x17\x72\xc5\xd4\x94\x1a\x5e\x77\xd8\x5e\x1b\x43\x5c\x7a\xb8\x03\xcd\x5e\x5d\xbc\x3a\xf8\x21\xbb\x46\xaa\x59\xde\xf4\x74\x46\x24\x2e\xc7\x88\x5c\xb6\x53\x36\xa6\x0d\xc7\xa0\x3b\x4a\x01\xcd\x8c\x0b\x8a\xff\xe1\x77\xdf\xbc\x78\xb1\xff\xd5\x37\x64\x21\x5b\xa5\x0f\x26\x2b\xb7\x67\xa0\xc5\x45\x25\x40\xa5\x73\xe2\x41\x2f\xa4\x32\x50\xf7\x4b\x05\xf9\xfa\x77\x2f\x5e\x90\xfd\x97\x40\xc0\x81\x8b\x0d\x79\xf6\x82\xf2\x74\x3a\xcd\xa2\xe3\xe2\x4a\x73\x4d\x7e\xff\x87\xdf\x7d\xf5\x8d\x1d\xf3\x3f\x5e\x92\x92\x2e\x33\xa9\xf3\x17\x37\x79\x42\xdd\x96\xb1\x16\x06\x83\x83\x12\x34\xc5\x15\xff\xbc\xab\xad\xcf\x71\x8c\x87\x2d\xf9\xa5\x9b\xe6\x2f\x71\x9e\xdf\x6c\xd8\xce\x08\x34\x20\xe4\xfa\x8a\x64\x20\x44\x3b\x91\xd1\x5b\x5b\xf4\xb9\x6b\xa3\x28\x47\x28\x3f\x26\x66\x52\x15\x18\x1d\xeb\xf3\x5e\x0e\xf3\xf9\x97\x5e\xa1\xff\x2f\xfd\x50\x99\x60\x76\x43\xe0\x72\xac\xb5\x4f\x84\x42\x5e\x9c\xc9\x1c\x8b\x22\xc5\xdc\x4f\xaf\xdf\x6c\xb9\x0e\xa5\x5c\xe9\x78\x39\x0b\x0c\xee\x0d\x1a\xd7\xc9\xf0\x67\x3a\x48\xd1\x92\x1c\x9d\xbf\xef\xe0\x5d\x69\x59\x2a\xa6\xb5\x37\xc5\x02\xb2\xed\xce\xa8\x00\x9a\x15\x8a\x99\x8c\xb9\x64\xf8\xc0\x1b\xca\xfa\xdd\x97\x4f\x15\xfd\x9f\x72\x7d\xfe\xa8\xae\xe7\xc8\x0e\x4f\x90\xae\xe4\xf1\x43\xba\xe2\x5a\x3e\xe1\xb9\x3e\xe1\xb9\x3e\xe1\xb9\x0e\x7e\xd2\x8e\x22\x6f\x3c\xe1\xb9\xfa\xeb\x31\x54\xd0\x3f\xe1\xb9\x7e\xc2\xf5\x54\x49\x7f\xeb\xf5\x54\x49\xdf\xbb\xfe\xcd\x2b\xe9\x9f\xf0\x5c\x13\x07\x79\xc2\x73\xbd\xed\x7a\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x7d\xc2\x73\x4d\xa0\x69\x13\x9e\x2b\x32\xff\x26\x54\x57\xe7\x6f\xea\x20\x5d\xff\x0d\x11\x5d\xb5\x65\xbf\x82\x1d\x16\x85\x6c\x85\xb9\x90\x97\x6c\x20\xde\xdd\x8a\xf7\x77\xed\xe9\x56\x0c\xdd\xe4\x0d\x5e\xbf\x79\x27\x5d\xc3\xf9\x52\xe7\x07\x1b\xf6\xf9\x4c\x7a\xda\x96\x9c\x89\x1c\x08\x01\xf9\x0f\x47\x4f\x9b\xd7\x10\xad\xc6\x2d\x4a\x56\x76\x5f\xb8\x93\xd3\x58\xa6\x99\x90\x43\xa2\x58\xc1\x1b\xee\x1a\x35\x53\xfc\x3c\x47\xd6\x81\x95\x0f\x1c\xb2\xaf\x66\x4b\x2b\x35\x58\x35\x0b\x47\x95\xfb\x9c\x33\x15\xf9\x48\x9d\x96\xb7\x42\x68\x0e\xe7\x97\x7d\x25\xb4\x79\xc0\xc2\xb9\xe6\x9a\xf9\x2c\x31\x17\xd0\x8e\x66\xe4\x22\xa6\x21\x06\x27\xc9\x43\x4c\xf4\xea\x6e\x25\x32\x06\x4a\x33\x9e\x5b\xec\x31\xa4\xb6\xac\x11\xd9\x19\x46\x90\xe8\xc1\x4a\x52\xb6\xca\x77\x96\xb5\xba\x11\x2f\xad\x8e\xe6\x61\x44\x51\x8c\xe6\xd8\x76\x28\x89\xc3\xae\xd2\x1d\x47\x21\x5c\x00\x2d\x16\x4c\x47\xf4\xa2\x37\xe2\xd2\x65\xb2\x64\x29\x60\xb7\x57\x53\xb5\x73\x2e\xd0\xa5\x01\xa3\x7a\x0d\xb6\x2b\x36\x77\x2f\xbd\x4a\xf2\x45\x44\x8e\xfd\x79\x8e\xc4\x01\x30\xa6\x36\x56\xbc\xe3\xcc\xf0\x59\xfc\x87\x26\xb2\x2a\x7d\x70\xfd\x0f\x2f\x48\xc3\x54\x81\x62\x29\x4b\x00\x4f\x63\x4d\xbd\x91\xa4\xb2\x16\xb3\x55\x65\x6e\x1e\x3e\xc4\xf6\x8f\x23\x01\x80\xf9\x0f\x99\x32\x34\x03\xd6\xa6\x21\x15\xa3\xda\x90\x97\x2f\x48\xcd\x45\x6b\xf2\xf5\x0c\xbe\x87\x84\x82\xdf\x7d\x33\xf0\x69\xf7\xd0\x81\x38\x8b\x24\x89\xbd\x2a\xf0\xef\xe0\x5a\x71\x11\xc5\x1a\x36\x4b\x23\xb9\x30\xab\x8e\x96\x28\xd1\x3d\xd7\x69\x05\x91\xcc\x9d\x38\x0f\x32\xbb\x18\x7e\x6d\xe5\x74\x99\x06\xc1\x93\x63\xd1\xdd\xf0\x31\x88\x3d\x25\xff\xe9\x3e\xc4\x25\x96\xa8\x86\x2c\xac\xd1\x0b\x7e\x59\xbd\xa0\x0a\x31\x69\xa0\x88\xc3\x67\x13\xa5\xad\xce\xb1\x1d\x18\x00\x22\x5e\x85\x71\xb9\x26\x65\xf8\x38\xb8\x66\xb9\x18\x1b\xc5\x58\x20\x19\x6c\x7d\x88\x20\xfb\x2c\xa4\x41\x68\x85\x03\x55\xfc\x61\x8a\xfd\x98\x28\x36\xe7\xda\xa8\xb4\xb0\xdf\x38\xfd\xc0\x1c\x6a\x05\xcc\x95\x6c\x93\x1b\x3a\xe7\x12\x5b\x40\x84\x77\xf1\xfa\x44\x8f\xa2\x60\x5a\x0f\x29\x9a\x71\x47\x9d\xe3\x31\x18\x23\xf1\x59\x83\xc5\x8e\x62\xb4\x7c\x27\xaa\xe4\x98\x69\xae\x89\xf6\x74\xa0\x3f\x0d\xb4\x2a\xc8\x72\x84\x0d\xea\xb7\xaf\x5b\x00\x74\xd5\x81\x0c\x61\x25\x5a\x3a\xf6\xe7\x63\x80\x42\x8d\x22\x85\xe9\x52\x3d\xd6\x45\x66\xb4\xd2\xc9\x71\xc6\xe1\xbe\x16\xbf\x7d\xb7\xbf\x40\x48\x47\x5f\xa0\xbb\xea\x4e\xa9\xba\x6a\x4e\xbf\x58\xef\xfd\x0f\x9c\x1a\x9c\xee\x2b\xec\x0c\x57\x1a\x65\x72\x50\x0d\x27\xc7\x2b\x2b\x98\x31\x21\x6c\x3f\xd0\x10\x03\xcc\xf8\x62\x38\xc7\x29\x85\xac\x6b\xaa\x0f\x92\x89\xc1\xfc\x22\x0a\x40\x72\xda\xd5\xb7\x0b\xa3\x68\xd5\xcd\x50\x04\x60\xba\xad\x6d\x6d\x98\xa0\x22\x39\x65\x32\x17\xcf\x20\x15\x44\x5e\x87\x72\xd4\x39\xbf\x62\x62\x75\x3f\x3b\x77\xc4\xb7\xb4\xb8\x64\x03\xb0\x9b\x7e\xd0\x7e\x8d\xcb\xa5\xa0\x0e\xcb\xc6\x1e\x43\x57\xdc\x8a\x03\x56\xae\x8c\xab\x47\x5d\x86\xbb\x66\xc6\x83\x0d\xa1\x61\xb7\xad\x85\x6b\x35\x4b\x86\x8d\xcd\xb5\x6c\x96\x86\xfb\x3a\xf3\x34\x66\x74\x28\x7e\x55\x30\x6f\x17\xdb\xf1\xb6\x35\xdf\xf8\x7e\x59\x66\xdc\x73\x73\x24\xa3\x5c\x65\xb0\x4b\x47\x45\xe8\xc9\xca\x9e\x55\x4b\x0f\xda\xbe\xba\x17\xa6\x4b\x88\x06\x0e\x3b\x6f\x12\xe7\x43\x4d\x93\x94\xcc\x1c\x6c\xa7\xa6\x65\xff\x60\x79\x4f\x4b\xa9\xc9\xb7\x50\xbd\x7f\xcc\xc0\x8d\xf2\xd0\x46\xc3\xfb\x6f\x8f\x3f\x62\x30\x58\xaa\x3f\x2f\x63\x81\xd7\x74\x9e\x66\x5a\x8f\x49\x2d\x05\x37\x52\xa5\x9c\x79\x43\x6d\x85\x99\x1e\x52\x5e\x9a\x4b\x6e\x22\x15\xde\xb7\xd1\x41\x7a\x86\xfa\xd2\x28\x2d\x0a\x58\x77\x29\x5b\x72\x4d\xc1\x33\x88\xdc\x9d\xae\xb1\x5e\xf0\xe6\x15\x39\x11\xba\x55\x11\x42\xd9\x2a\x09\xf6\xa0\xf3\xcc\xe9\x8f\x3b\xd8\x48\x76\xf6\x11\x0b\xd7\x81\x90\x26\xd3\x71\xf2\x81\xd6\x4d\xc5\xf4\x2b\xb2\xc7\x3e\x98\x6f\xf6\x46\x64\xef\xc3\x4c\xdb\xff\x08\x33\xd3\x7b\x13\x72\x5a\x37\x15\x2f\xb8\xa9\x96\x84\x8b\x19\x53\x2a\xc4\xde\xf1\x07\x2b\xa9\xff\xe9\x94\xdc\x31\xe6\xad\x8d\x54\x74\xce\x9e\x3b\xdd\xe0\x0b\x35\x4d\xd5\x44\x06\x9f\x49\xb0\x09\xb7\xcd\xcc\x40\x44\x70\xf2\x83\x34\xc6\x8f\x86\x1c\x4f\x1b\x57\x85\x39\x96\x99\x5c\xfe\x01\xd6\xc5\xad\xc0\x73\x35\x2d\x9f\xbf\x3f\x39\x3c\x7e\x73\x32\xa9\xcb\x2f\x16\xf2\x7a\x6c\xe4\xb8\xd5\x6c\x9c\x5c\x52\x3a\x78\x65\x2e\xd9\x12\x70\xd0\xb7\xbc\x36\x8e\x8c\x9e\x17\xd5\x48\x48\x16\x80\xcf\xad\x01\xf2\xfe\xdb\xe3\x1f\xf4\x90\x48\x57\xe4\xa4\x78\xce\x4c\xf1\xbc\x60\xcd\xe2\xb9\x1b\xf9\xdf\x75\xfd\xa3\x14\x93\xb5\x39\x49\x7a\xa0\x3f\x33\xb7\xcd\x51\x9e\x0e\xd4\x5e\x0b\x59\x55\x58\x5b\x6d\x4f\xad\x23\xd6\x2c\xc2\x0d\x8f\x7a\xe5\x87\x94\xa9\x0c\x2c\x4e\xd9\xbd\xf8\x00\x01\xb4\x7e\x99\x9c\xe2\x94\x8b\xf5\x2c\x0d\xfd\x73\x06\x3e\x19\x76\xcc\x44\xc2\x4b\x4d\xf3\x2a\x11\x8f\x53\x5c\xa5\xaa\x33\x8f\xc2\x3f\xfc\xde\x7f\xa9\x99\x01\x2d\x96\x0b\x82\x7d\x94\xdf\x58\xad\x7a\x17\x1c\xc1\x3b\xc1\x4a\x43\xfc\xd0\x58\x16\x3d\xa0\x6b\x5a\x2e\x4e\x08\x84\x80\xd5\x1d\x65\x28\xd3\xd6\x2c\x98\x30\x1e\xfa\xc9\xd5\x71\xc7\xba\x10\x39\x9d\xa1\x3f\xb0\x1c\x90\x46\x29\xaf\x98\x52\xbc\x64\x9a\x0c\x56\x86\xe2\x38\x10\xaf\x1e\x35\x6b\x0d\xca\x60\xcc\x91\x30\x38\x34\x87\x3e\x67\xa2\x43\xfe\xbc\xf9\xdd\xc8\x98\xdf\x89\x5c\xf9\xfb\xc8\x92\xdf\xc5\xfc\xf8\x4c\x19\x86\xc3\x73\xe2\xf3\x67\x79\xef\x4c\x90\xa3\xa7\x76\xc2\x27\xd9\xd4\x4e\x5a\xd6\x7c\x00\x08\xdf\x0e\x88\xf4\x3c\x8a\x27\xcc\xc3\x9d\x1f\xa2\x0b\x5a\xb1\xd3\x77\xdb\x0a\x47\xb8\xe1\xfb\x21\x89\x73\xf7\x61\xc3\x94\x47\x77\xf5\xd1\x31\x63\x68\xb1\x70\x01\x02\x9f\x97\x20\x05\x40\xef\xe0\xbe\x21\x42\x96\xa9\xe9\x86\x71\x4c\xc2\xd3\x70\x7b\x5c\xc2\x93\xff\x79\xc5\x26\xe6\xd4\xb0\xeb\x44\xfb\x7d\xdc\xa9\x8d\xa9\xbf\x07\xc7\xf8\x53\x6c\x63\x63\x60\x61\x78\xfc\x22\x94\xdf\xaf\x3d\xfb\xfe\x23\x16\x93\x1b\x62\x15\x39\x8e\x01\x78\xe2\x56\xa2\xb9\x78\x05\x39\xfc\x61\x96\xa6\x8c\xb8\x5d\x97\x85\xff\xdc\xb3\x3c\x17\xc1\x42\x3a\xf4\x31\xaf\x2e\x7b\x01\x77\x78\x76\x4a\xfe\x82\xb7\x6f\x6d\xf6\x1a\x25\x0d\xba\x41\x8f\x65\x4d\x79\x72\x0d\x5a\x6f\x0e\x56\x1f\xea\x27\x23\xb6\x64\xfd\x24\x9c\x85\x7b\x89\xbb\xd9\x63\xd0\x16\x52\xcc\xf8\xbc\x55\xac\x24\x2e\x70\xb5\xb5\x59\xda\x39\x0f\xd1\x9a\xcf\x86\xec\xdb\xef\x9e\x43\x0f\xbb\x83\x49\xe7\x2d\x5a\x71\x25\xa5\xfb\x76\xef\xd1\x05\xf5\x59\x3a\x6e\xa2\x8c\x18\x8f\x22\xd6\x39\x6b\x3c\xf3\x83\x3a\x1e\x2a\xc9\x06\x8c\x2a\x34\x87\xf2\x82\xa8\xc0\xd3\x75\x10\xe3\xba\x03\x0a\x43\xaf\xd0\x88\x7c\x2f\xe7\x5c\xf8\xe3\x45\xba\x02\x9f\x19\x4d\x77\xcf\x3c\xf9\x47\xd6\xae\x27\xff\xc8\x93\x7f\xe4\xc9\x3f\x72\xf3\xa5\x75\x75\x22\xe8\xb4\x4a\xaf\xe6\xee\x17\xbc\x87\xc7\x91\xd7\x15\x9d\x13\x06\x7f\x3c\x2f\xb9\xb6\xff\x25\xe7\xe7\xdf\x43\x56\x74\x2b\xbc\xeb\x1c\x78\xd3\x69\x5f\x23\x3f\x43\x78\x96\x6e\xef\x18\x43\x35\xe7\xcd\x00\x50\xb3\x6c\x07\x59\x47\x4a\xe8\x42\xab\x7b\x20\x0e\xee\x0e\x38\xcf\x68\x00\x8a\xc4\x3a\xe8\x29\xb3\xd2\xaa\xb8\x3c\x8b\x12\x93\xa5\xb2\x9f\x89\xe8\xa3\x2c\xc6\x47\xa6\x67\xe6\x34\x43\x56\x48\x1a\xc2\x0a\x67\xb9\x82\xd7\xd1\xf3\xbc\x36\xee\x95\x90\x73\xb7\x90\xf0\x1d\xd5\x5a\x16\xbc\x2b\x25\x70\x9d\x56\xbc\x8a\x5e\x82\x8a\xbe\xb5\x49\x46\x3b\x38\xcf\x84\xa0\xf9\xbd\xc1\x32\xf1\x8c\xed\xee\xa0\x3a\xb6\x44\xb8\xf0\xf3\xb6\xb5\x49\xc0\xad\x36\x04\x45\x3b\x97\x90\xe8\x28\x59\x9d\xc7\x20\x10\x56\x53\xc1\x3d\x4a\xad\xe3\xbd\x64\x8f\x13\x5e\x90\x05\xca\xf5\x06\xae\xe5\x3a\x88\x24\xe8\xc4\xbe\x95\xd5\x4a\x07\xf5\xce\xe2\xe0\x45\x7b\xa3\x5f\xcb\x84\x9f\xb9\xa4\x72\x90\xd5\x8d\x6c\xda\x0a\x2b\xe9\xc3\xa4\xa5\xcd\xd6\xc0\x6c\x54\xa4\xed\xe1\x7d\xb6\x43\x2d\x8f\x08\xfd\x71\xdb\x1b\x32\x06\xa2\xbc\x3b\xe2\xa8\xdf\xa3\xd8\x68\x69\xba\xf4\x8f\xcb\xe0\xf1\xdc\x3e\xe0\x68\x2e\x80\xd1\x74\xef\x72\x0f\x98\xb4\xe7\xc1\x79\xf1\xbb\x6f\xbe\x19\xa0\x0c\x71\xc5\x0a\x23\xa1\x18\xd0\x81\x3d\x87\x8c\x59\xaa\x18\xd8\xfe\x88\x06\xea\xfd\xcb\x58\x0c\x66\x06\xe5\x75\x6c\x0f\x91\x74\x2b\x08\xa4\x39\x30\x30\x86\x23\x8c\x0e\x4a\xd0\xcc\x96\x35\x0f\xdd\x0b\x4e\xb7\xdc\xbd\x60\xab\x3d\x0b\xb6\xd9\xa9\x60\x7b\xfd\x09\xb6\xd8\x95\x60\xdb\xbd\x08\xb6\xd2\x81\x60\xeb\x09\xdd\x0f\xdf\x63\x20\x0b\x54\x60\x0e\x98\xc0\xa1\x5d\x04\x06\x42\x0c\xe6\x81\x17\x1c\xdc\x27\xe0\x21\xba\x03\x64\xf2\x71\x0e\xef\x04\x90\x17\x06\x6a\xdb\xa8\xff\x3b\xa4\x7a\xe3\xb5\x9b\x08\xff\x5b\xc1\xf5\xdf\x36\x9a\xff\x16\x31\xfc\xf3\x61\xc9\xe5\xc2\xeb\x1f\x8e\x21\x97\x57\x70\x6c\x09\x91\xff\x1e\x71\xf8\x1f\x04\x7d\xff\xbe\x31\xf7\x77\xb3\xb8\x6d\x28\x86\xf7\x60\xe4\x6e\x9d\x09\xba\x3b\x57\x0e\xc8\x2e\xb8\xc5\x3b\x4a\x36\x86\x17\x7c\x63\x46\xdf\x68\xfb\x19\x96\xf8\xe8\x86\x16\xb0\xaf\xdb\xcc\x15\x58\x0f\xe2\x83\x25\x83\x7d\xe5\x48\x89\x4c\x52\x78\xb3\xb8\xcb\x91\x80\x77\xe7\x2b\x19\xd1\xe1\xe3\x87\x4f\x84\x0e\x43\x7f\x24\x15\xda\x4f\xdd\x8e\x25\x43\x3f\x65\x05\x7f\xca\xb5\x8b\x59\xc1\x0f\x85\x60\xf2\xf9\x25\x66\x96\x4f\x89\x99\xf1\xb5\x83\x89\x99\x9e\x69\x75\x7c\x1a\xe3\xb1\x0b\xa6\xa5\x9c\x5a\x25\xd5\x83\xf9\x75\x32\xf8\xf0\xec\x34\x79\xf4\x42\x31\x00\xea\xa7\x95\x9e\x6c\xb2\x39\x7d\xfa\x91\xb3\x70\x43\xd7\x6a\x63\x58\xdd\x24\x0a\x6f\xf2\x94\x97\xb9\xe9\x7a\xca\xcb\x7c\xca\xcb\x7c\xca\xcb\xbc\xf9\xda\xe5\xec\xa2\x45\x5b\x53\x31\xb6\xe7\x29\x24\x75\xf6\xca\x49\x56\xd4\xf4\x09\x71\x27\xe0\x20\xa1\x85\xe8\xba\x80\xb9\xdc\x0a\xfe\x6b\xcb\xba\x48\x47\x30\xd9\x76\x20\x0f\x0c\xe8\xd8\x9d\xe5\x42\x4b\x76\xe5\x9c\x2d\xe4\x1a\x3e\xa0\x9b\xcb\xb0\x74\xfe\x68\x1c\xb6\x64\x30\x78\x2f\x30\x69\x16\x0c\x8d\xed\xb3\x15\x63\xbb\xe7\xd3\x75\x82\x1c\xe4\xe8\xb0\xe8\x70\x6c\x09\x5a\x16\xb5\xef\xee\x9a\x96\x4c\x19\xa9\xb9\x52\x52\xb9\x4c\xb5\xf8\xf5\xb1\xf0\x89\xcf\x17\x86\x29\xf4\x90\x62\x79\x46\xba\xf8\x3c\x67\xc6\xed\x02\xd8\x45\x46\x12\x2a\x10\x7b\xd5\xfe\xdb\x83\x7c\xc0\xd4\x78\x0d\x64\xca\x16\xf4\x8a\xcb\x76\x00\xa8\xda\x39\xea\x53\x7b\xee\x91\x60\x2b\x2c\x65\x1b\x72\x51\x5a\x6d\x27\x23\xac\x82\x5e\xe7\x83\xe4\xa1\xdf\x76\x0f\x05\xb7\x79\x29\x7d\x30\x7a\xcc\x3e\x70\x6d\xd6\xe7\xdc\xb3\x80\xcb\x7d\xda\xca\x66\xbe\xd2\x8d\x3d\x7d\x7f\x4c\x86\xe9\xcd\xb1\x85\x7b\x44\xf4\x5d\x20\x57\xe7\xf0\xd5\xc7\x1c\x20\xae\xdf\x0f\x42\x96\x93\x9a\x16\x0b\x2e\x32\x40\xd4\xfe\xd8\x23\xac\xe7\x09\x99\x90\xc3\xaa\xea\xea\x98\x74\x28\x1d\xf4\x9e\x91\xfe\x4b\xd9\x45\x4a\x22\xc7\x72\xae\x62\x25\xe4\x59\xa1\x8a\x05\xf5\x89\x9a\x4f\xdc\x00\x93\xab\xfa\x9a\x2a\x36\x29\x64\x4d\x8e\xce\x4f\x49\xa9\x78\x62\x07\xae\x2d\xd7\x9f\xe3\x12\x9f\xa5\x85\xae\x3f\x37\x7f\xcf\x93\xaf\x67\xa7\x7c\x3d\xa1\x84\xa1\xe2\xc5\xf2\xf4\x38\x6f\x59\x04\x3e\xd3\x2b\x9a\x3a\x94\x44\xd8\xcf\xc9\xb7\x54\xb3\x92\xbc\xa1\x82\xce\x31\x60\xb5\x7f\x7e\xf6\xed\x9b\x03\xcb\xf0\x10\x8c\x3b\x3d\xde\x58\x37\x71\x1e\x3f\xfc\xed\xb6\x10\xcf\xc9\xea\xd4\x65\xd3\xed\xd7\x9e\x9a\x38\x7d\x5b\x03\x83\x27\x41\x6d\x3d\x1b\x10\x04\xde\x00\x90\x7f\xb6\xda\xff\x0b\x0b\x15\x7c\xb3\x46\xbd\x7a\xa4\x5e\xd5\xe5\xe5\x43\x4f\xc0\x7a\x34\xd2\xda\x8f\x97\x6c\x79\x67\xe9\x3d\x86\x15\x1c\x38\x38\xbe\x47\x4d\x6f\xee\x12\x14\x65\xca\xdc\x46\xe1\xa7\x65\xcd\x7d\x42\x66\x5c\x6f\x5d\xcf\x8d\xa2\x86\xcd\x97\xc7\xac\xa9\xe4\xd2\x72\xf1\x59\x94\xb8\x83\xb7\x4e\x51\x95\x56\x53\x5a\x10\xd5\x56\xd0\x0b\xa1\x5c\xeb\x90\x28\x18\x2b\x3b\x31\xcf\x85\x36\xb4\xaa\xec\x02\xc2\xf3\x6f\xa5\xe8\x93\x95\x83\x4f\x55\x03\xc6\x48\xe7\x47\xef\xea\x77\x08\x7e\xfb\xb1\xd5\xfe\x74\x45\x00\x86\xff\x38\xbf\xdd\x25\x13\xf2\x93\x73\x1e\x53\x14\x06\x94\x68\xef\xdb\xca\x1e\xd0\x55\xd9\xef\xa8\x8c\x26\x87\x63\x05\xec\xd6\x00\xf2\xcf\xbe\xa4\x73\x01\x4a\xa6\x7b\xa9\x10\xd1\xcf\x3f\x69\x7c\x6c\xda\x7c\xbd\x40\x0d\xd4\x3e\x98\xd0\xa6\xa9\x38\xa2\x0c\x48\xe5\x92\x70\xa3\x78\xf2\xfa\x6d\x9f\x22\x6a\xef\xa8\x86\xde\x4d\xed\x1c\x93\x2b\xa6\xa6\x9f\xe2\x7f\xbb\xab\x46\x49\x1b\x0e\xe9\x4c\x9f\x2c\xc2\x52\x95\xc6\xc3\xb3\x53\x1c\x68\x53\x84\xdf\x7f\x89\x0c\xe1\x96\xda\x27\xf4\x60\x39\x9a\x0b\x03\x84\x66\x4e\x87\x67\xa7\xd8\x23\xcd\xf5\x73\xea\x42\x03\xd6\x62\xa7\x58\x7c\xd9\xb5\xa1\xa5\x73\xfb\x44\x43\xa4\x60\x77\x69\x68\x6a\x29\x60\xa2\xad\x19\xf6\x8a\x0a\xc4\x10\x2e\x60\x9c\x40\x45\x17\x81\x40\xaf\xf2\x84\xec\xed\xc5\x36\x21\xc2\xb3\xa8\x88\x6e\x10\x75\x7b\x5f\xf6\xee\xb2\x72\xad\x7b\xb1\x4f\x3d\xe1\xef\x9e\xf5\x7c\xc7\x2c\xe7\x84\x13\x33\x43\xe6\x8e\x90\xe2\xbd\x9b\xef\x1f\xde\x7f\x7f\xef\x0c\xfa\xb6\x3f\x9c\xeb\xd8\xc3\xa0\xdb\x68\x43\x95\xe1\xb4\x22\xad\xaa\x7c\x7a\x21\x22\x91\xb8\x8a\xc0\x05\xbd\x8a\xba\x21\x4d\x08\xf9\x12\xb9\xd2\x31\x03\x8a\x32\x70\x8a\xba\xee\x60\xb3\xb6\xaa\x46\x64\xc6\x05\xb5\x07\x19\x6b\x48\x94\xe4\xf5\xc9\x14\x9f\x73\x51\x30\x3b\x4d\x63\xcf\x97\x04\x28\xf7\x6e\xa3\x20\xd3\x20\x47\x33\x0e\xb9\x20\x29\x56\xbe\x15\xe0\x17\x9e\x49\x45\x8e\xaa\x56\x1b\xa6\xde\x4b\x7b\x0c\x77\xe5\x26\x64\xa6\x64\x4d\x68\xfc\xf5\xb7\x5c\x94\x77\xaa\x84\x7a\x0f\x47\x7b\x41\x05\x61\x1c\x12\xa3\xec\xd0\x90\x0f\x6d\x99\xbd\xdb\x54\xfb\xba\x2d\x16\x76\x8a\xf6\x1a\x59\xea\x3d\x2b\x9d\xf7\x30\xdc\xa8\xf7\x0e\xec\x5f\xab\xef\x8a\xd5\x1b\xd1\xef\x9e\xd3\x86\xef\x1d\x8c\x08\x4c\x38\x24\xe7\xc9\x4f\xcf\xc6\xfb\x4c\xf7\x91\x9f\x30\x70\xf5\x25\xed\xa2\xf7\xf1\x13\x60\x63\x88\x2e\xf5\xed\x7a\xc1\x0d\xd6\xeb\xd8\x9d\x82\x31\x80\xd0\x6b\x66\xf5\x20\x25\xe4\xd0\x07\xd1\xec\xd6\xaa\x19\xf5\xf9\xba\xec\x8a\xa9\xa5\x59\xb8\x06\x16\x5e\x8a\x3e\xad\x1c\xec\x8c\x41\xab\xe6\x44\x99\x5f\xa1\x6e\xbb\x81\x4c\x58\x5b\xa1\x67\x5f\x3e\x5b\x3d\x92\xba\x33\xf8\xdf\x7b\x3d\x40\x09\x4b\x5a\x8b\x1f\xed\x2f\xfb\xeb\x80\x1f\xe1\x61\x12\xc4\xe1\xf7\xdf\xbb\xf4\x14\x9c\xf0\xef\xb8\x80\xa8\x37\xe8\x43\x1e\x0b\xc0\x2d\xda\xc6\x95\x02\x0a\xff\x6d\x57\x69\xdd\xe8\xfa\x54\x43\xe9\x16\x1a\xbd\x9d\x79\xd3\xa3\x6e\x7d\x80\x33\x56\xdf\xc8\x72\xf3\x26\xee\x31\xc9\x69\x74\x73\xc8\x25\xee\xdc\x9c\xee\x59\xce\x72\x5a\x36\x1b\xad\xd0\xdb\xd7\xf4\x96\xf5\xbb\x89\x92\xce\x4f\x07\x62\x3f\xfa\xe6\xa2\x4b\x8c\x20\xb3\x8a\xce\x3b\x5e\x04\x21\x8e\x9a\xfd\xd1\xf9\x8f\xfe\x15\x34\xb9\x01\x7a\xf8\xa3\xa6\xd3\xc7\x8c\xa5\x71\x37\x4b\x37\xde\x71\x63\x28\xe3\xe3\x16\x53\x78\xf8\xcd\xdc\xf4\x29\x79\x5f\xe6\x56\x57\xfd\x4d\xf3\xef\x5d\xeb\x34\xe2\x04\xdf\x39\xce\xbb\x42\xa0\xda\x04\x74\xb8\xf3\x1f\x7b\x6c\xf2\x11\x7a\x6f\x60\xda\x4b\xb6\xbc\x96\xaa\xfc\x38\xc3\x1e\x06\x61\xe6\x7f\xe2\x8d\x79\x9f\x0c\x86\xee\x78\xb9\x31\xb0\x93\xcc\xaa\xb7\x12\x5f\xd1\x29\xab\x3e\x4e\xfa\x0d\x86\xc1\x1b\xda\xd8\xd7\xe9\x4a\x36\xd1\x23\xe5\xb2\xcc\xd0\x3a\xc5\x3a\x1f\x5f\x91\x26\xd5\x9c\x0a\xfe\x4f\xac\x73\x2d\xac\xa4\x90\x8a\xff\x73\x33\xab\xed\x63\x4c\x1f\x7d\x5c\x15\x2b\xcc\x81\xe3\xfa\x8d\x22\xfb\x23\xdb\x82\x96\x25\x47\x15\xec\xec\x23\x1c\x7c\xfb\x7c\x71\x71\x79\x97\x95\x86\xfb\xb1\xcc\xa6\x0b\xec\xdd\xe3\x32\xdf\x22\x16\x3e\xbe\x73\x6f\x4f\xa3\xfb\x84\xe3\xa9\x55\xb7\x14\x8a\xdc\xfa\xfb\x9a\x72\x3c\xb5\x37\xb7\xf1\xba\x61\x76\x1d\x37\x51\xa7\x5b\x5b\x59\x6a\xdf\x2f\x3c\xed\x01\xf6\xd5\xa0\x09\x67\x35\xe5\xa9\x33\x86\xd7\x80\x25\xab\xa9\x69\x15\x37\x1b\x4f\xea\xdb\x7f\xc8\xc5\x77\xed\x94\xfd\xc8\x94\xb6\xeb\x71\xd7\x9f\x0b\xa8\x38\x3b\x3c\x3b\xdd\x38\x2d\x79\x4e\xe4\x1b\x1d\x19\xe0\x37\x73\x94\x5b\x75\x91\xb4\x82\xd6\x53\x3e\x6f\x65\xab\xab\x65\x1c\x41\xa1\xe4\x92\x8b\x72\x42\xc8\x29\xba\x55\xc5\x33\x43\xa8\x90\x62\x59\xbb\x5b\x45\x51\xb5\x25\xeb\x3d\xf1\xa6\xa3\x4c\x12\x7a\x25\x79\x49\x68\x6b\x64\x4d\x0d\x2f\x48\x21\x99\x2a\x00\x44\x35\x7e\x7e\xab\x19\xa1\xbd\x27\x76\xbf\x2d\x5a\x6d\x64\x4d\x6a\xaa\xf4\x82\x56\xd5\x4d\x2c\x91\x41\x3b\x00\x77\xda\x8d\xdf\xda\x59\xb9\xf1\xcb\xab\x5b\xe6\xe1\xe3\xdb\x01\x06\x1e\xb4\x1d\x2c\x71\x83\x1e\x70\x75\x33\x53\x7f\xc2\x33\x1c\x02\xee\xc6\xbe\x1c\x3d\xfe\xbc\x58\x30\xd2\xb4\xd3\x8a\x6b\x30\xe1\x41\x70\x2d\xc9\x94\x2d\xb8\x2b\xbd\xf9\xb8\xc4\xba\x71\x89\x3f\x36\xcf\xb7\x89\x8c\x8f\xce\xd0\x2d\x12\xfe\xd6\xdf\xba\x13\xf0\xb4\xa6\xf3\x4f\x50\xed\x6f\xd8\xbe\xdf\x5b\xb1\x4f\xc5\x32\x9c\xa7\xd0\x4c\x55\x8f\x88\x54\xae\x90\xd8\xdb\x7e\xca\x7d\x15\x5a\x04\x2b\xf2\xce\xcd\xa8\xab\x8b\x76\xdb\x00\x50\x06\x98\x9a\x49\x55\xdb\x79\xe7\x8a\xcc\x5a\x01\xde\xf0\x1b\xec\x42\xc8\xe1\x83\xf3\xc7\x39\x33\x69\xa5\x65\x10\x06\xb0\x6c\xc2\x13\x46\xa8\x26\xd7\xac\xaa\x30\x8d\x08\x3b\xbf\x46\xb0\xcd\x1d\x96\x65\x97\x4a\x38\xdd\x6c\x5b\x96\x7c\xce\xb4\x21\xfb\xe7\x7f\x3d\x3c\x00\x85\x08\x9c\x75\x4b\x62\xe8\x7c\xb2\x92\x1f\x8e\xc9\xa4\x56\xdd\x2a\x5b\x50\xcb\x0a\x6a\x68\x25\xe7\x98\x81\x66\x45\x8a\xfd\x7d\x53\xd1\x25\x94\x71\x35\x54\x41\xad\x60\x81\x0e\x4b\xa2\x5a\x71\x53\xe7\xef\xfb\x3b\x29\x3f\x2e\x93\x6e\xeb\xa9\x7d\x4b\x78\xf8\xe3\x32\xe7\x23\x7d\x82\xef\xf7\x08\x56\xac\xf9\xff\xd8\xbb\xb6\xde\xc6\x6d\x25\xfc\xde\x5f\x41\xf8\x25\x6d\x10\x67\x71\xd0\xee\x79\xe8\x5b\xe0\xa4\x40\x70\x72\x59\x38\x69\xfb\x5a\xc6\x62\x6c\x21\x32\xa9\x92\x52\x2e\x2d\xfa\xdf\x0f\x38\x43\x52\xa2\x2d\x91\x94\xad\x38\x8b\x45\xf5\x92\x5d\x4b\xbc\xdf\x66\xbe\x99\xf9\x58\xd0\x1e\xc0\x6a\x6b\xbf\x68\xa8\x0f\xb5\xde\x02\xc0\x86\xe0\xcc\xe5\x71\x4a\xee\x70\x3e\xad\x69\xb5\x40\xff\x90\x3f\xd6\xac\xa2\x19\xad\xe8\xa9\x56\xee\xff\xf0\x29\x92\x44\x91\xe9\x8c\xfa\x07\xba\xa7\xce\x28\x8a\x8b\xf8\x1e\x77\xa5\x55\x0b\xf7\x39\x28\x5c\x76\xdd\x06\x11\xb2\x3d\xb7\x37\x68\xfe\xc5\xab\xd6\xad\x83\xa6\x7c\xaf\xae\x9b\x89\x7c\xec\xa9\xf0\x5b\x62\x66\xeb\x9a\xf1\x4a\x9d\xc2\xd0\xb4\x7f\x01\x7b\xc2\xd9\xcd\x79\x3f\x1c\x1b\x07\x92\x22\xc0\x51\xba\xcd\xe6\x2c\x50\x77\x6b\xb2\x31\x6f\x7c\x5b\xa2\x25\xca\x00\x1a\x26\x24\x6f\xa0\xdc\x9d\x4a\xf0\x71\xa0\x58\x1c\xe7\x86\xca\xa5\x51\x0a\xfb\xc1\xb6\x24\x8b\x70\x8a\x1d\x38\xc6\xac\x33\x75\xcd\xe8\xfd\x28\xcd\x2c\x1c\x65\xbf\xe9\x63\xb7\xc1\x31\x01\x5a\x05\x8b\xfc\xbb\x61\x48\x35\xa3\x27\x82\x85\xb6\xa9\x03\x2a\x1a\x35\x02\xba\x59\xe0\x39\xf1\x3e\xb1\xb7\x23\xa3\xe9\xea\x15\xb4\xca\x4b\xe4\x6f\x32\x36\xc1\xd8\xf0\xe3\xf3\x1b\x2d\xf2\xcc\x15\x80\x6b\xe9\x92\x9f\x90\x1b\x51\xe9\x3f\x17\xaf\xb9\xaa\x10\x63\x38\x17\x4c\xdd\x88\x0a\x7e\x19\xa5\xa7\xb0\x82\x63\xf6\x93\x81\x41\xd0\x00\x04\xcb\xbd\x05\x96\x98\xfe\xc0\x3b\x14\x1a\x79\x4f\x7f\x7d\xc9\xb5\x40\x83\x4d\x8e\x14\xe1\x48\xe1\x94\x29\xc0\x92\x25\x70\xc1\xa7\x36\x46\x6b\xbb\x04\xd3\x8f\x42\x7a\xdd\xb8\x73\x61\xa6\x20\x0c\x6f\x80\x37\xb9\xb2\xe7\x92\x13\x43\xa8\x85\x86\xa3\xb8\xf4\x9a\xc9\x25\xd8\x76\x17\x11\x5b\x64\x2a\x22\x9f\x84\xc3\x27\xa3\xef\x3b\x61\xee\x3b\x24\x82\x33\xe9\xaa\x17\x9f\x23\x03\xe6\x63\x2b\x2b\xdc\xf5\xd7\x08\xdc\xfd\xad\x37\x77\x18\xd2\x7f\x80\x50\x51\x9d\x92\x33\xa2\x72\xbe\x2c\x98\xf7\xce\x98\xdb\x5b\xd9\x04\x8a\x2a\x21\x4a\xf1\xcf\x3a\x7f\xa6\x85\x3e\x66\x20\x2a\xc4\x51\xb1\x88\xc7\xad\xc3\xf6\xc4\x10\x27\xea\x0d\xd1\x89\xb1\x93\x27\xf6\x36\x39\x09\x86\xc9\xb4\x67\xf4\xe4\x92\x4f\x1a\x8e\x21\x6f\x96\xba\x33\x0d\x24\xe3\x09\xbc\x9b\xec\x7e\x6e\x07\x4f\xa8\x74\x94\x91\xc4\xa7\xdc\xb0\xd8\x3b\xf5\x94\x77\xbb\x25\xa5\x4c\x12\x2b\x5f\x7e\xaf\x7e\x00\x5c\x8d\x33\x02\x24\x58\x12\x4c\x12\xfa\xd7\x36\xa3\xb3\xd6\x58\x9e\xf2\xb2\x6c\xe8\xb6\xeb\x72\x29\x69\xc6\xc8\x52\xd2\xb2\x67\xd1\x0e\x93\x4e\x51\xc4\xed\x2a\x32\xa0\x96\x7d\xfd\x3a\x50\xcf\x58\x07\x50\x87\x60\xba\x17\xf6\xb0\x12\xe2\x09\x98\x71\x60\xde\xbd\x23\xa4\xf6\x3b\x96\x75\xde\xfc\x66\xe1\x0e\x45\x32\x56\xd1\xbc\x00\x17\xc1\xdb\xab\x6b\xe3\x44\x68\x65\x35\x5b\xcb\xee\x3d\x63\x04\xdd\x90\x66\xc6\x4f\x76\xce\x9e\x73\xf6\x62\x90\xb3\xbe\x2d\x6a\x4a\x96\x8c\x83\x83\x5a\xc0\xcd\x74\x4a\x54\x9e\xb1\x0b\x08\xb5\xee\xcf\x68\x0f\x23\x59\x4f\x9d\x63\x7b\x45\xf8\xac\x8b\x9e\x73\x09\x67\x9c\x43\x50\xbe\x08\x19\x60\x96\x4f\xa3\x59\x4b\xa3\x50\x73\x51\xca\x3f\xfd\xf4\x63\xe0\x5c\x79\xcd\xd7\xf5\xfa\x67\xf2\xdf\xcf\x9f\x7f\xfc\xdc\xff\x59\xce\xf1\xb3\xff\xf4\xb7\xcf\xac\xb6\xd9\xfc\xfc\x2b\xe8\xef\xcc\xf9\x7b\x87\x0d\xf0\x09\x59\x3d\xd2\xbc\xa8\xa5\x09\x97\x48\xd4\x1e\x7f\x69\xa7\x01\xe3\x69\x13\x56\x4b\x6d\x8e\xd6\xcf\xd8\xf8\x1f\x3f\xe6\x9c\x29\xb2\x12\x2f\xa4\xe6\x92\x2d\xc4\x92\xe7\x7f\xb1\x0c\xc9\x72\x15\x3a\xc0\xc1\x55\xf2\x76\x8a\x13\xc6\xb3\x52\xe4\xbc\x82\x23\x76\x45\x79\x56\x84\x7c\x95\x12\x5a\xda\x5e\xc1\x7b\x75\x19\x9c\x46\x83\x3a\xec\xba\x49\xb1\xd1\x5d\xba\xcd\xd6\xd4\x8c\xa7\x1c\x76\xdb\x5e\x2d\xc5\x8d\xf1\x2e\x80\xb9\x74\xd4\x71\x18\x24\x80\x50\x07\xfc\xf6\x67\xcd\xe4\x1b\xc4\xed\x36\x8a\x5b\xcb\xa3\xf8\xbe\xa1\x6f\xb4\x6d\x34\x42\x25\xed\xb5\x09\x90\x0e\x48\xa6\x25\x6a\x35\x0e\x6e\x1b\xb5\x82\x34\x0c\xdd\x74\xac\xd5\x97\x9c\x11\x5e\x17\x45\xa0\xa4\x9e\x4c\xb8\x08\x59\x8e\xf1\x49\xc2\x1f\xd2\x80\x81\x54\x08\x0a\x9f\x8f\x03\xa2\xda\x0d\x1f\x49\x8b\x1a\xea\x4e\xfc\x41\x00\x15\x3e\xbb\xc0\x54\xf8\x0c\x08\x5f\x48\x0f\x5d\x48\xa3\x84\x4e\x80\xaf\xf0\x19\x12\xdb\x90\x48\xe4\xfc\x9e\x80\x16\x3e\x83\x7c\xe0\xd2\xc0\xad\x8e\xaa\x27\xfa\xb9\xbf\x23\xd0\x85\xcf\x7b\xc0\x5d\xf8\x0c\xea\xc7\x14\xe8\x0b\x9f\x5d\x7a\xf1\x00\x30\x98\x69\xf3\x21\xc1\xb0\x48\x91\x23\x43\x62\xf8\x24\x03\x63\xa6\x72\x83\x1c\x56\x07\x38\xab\x0e\x74\x54\xdd\xc3\x49\x75\xe7\xa4\x09\xe0\x19\x3e\xc3\x66\xf4\x01\x81\x34\x5b\xe0\xc1\xe0\x34\x7c\x0e\x0d\xaa\xe1\x93\x7c\x9e\x0e\x03\xd8\xda\x99\x47\xa6\xeb\x2e\x44\x57\x92\xe5\xfc\x59\xe0\x7d\x9f\x83\x94\x88\xf9\x56\xc2\x0d\x5d\xe2\x05\x8e\x51\xa3\x4c\x38\xed\xab\xad\x53\xad\x84\x78\x22\xb5\x8a\x5b\xd4\x82\xed\x8e\x84\xc7\x8e\xa2\x04\x0f\x59\x61\xf3\xba\x60\xbf\xe7\xd5\xea\xb6\xa1\x5c\x81\x65\x56\xd5\x65\x01\x7d\xd1\x7a\xa1\xe7\xe5\xbc\x51\x4e\x2e\x2b\xdc\x62\x17\x62\xbd\x66\x3c\x43\x6f\xcb\x35\x7d\x0a\x4f\x78\xa5\xd5\x5b\x8c\x2a\x28\x0a\x54\xe1\xa0\x28\xf6\x5a\x52\xde\x28\x2b\xcf\xfa\xa0\x0e\x4d\xe1\xc4\x09\x9c\x2a\x93\x25\xc7\x99\x0e\x96\xb7\x37\xe3\x4a\x5b\x81\xa1\x5e\xfc\x28\x79\x60\x85\x00\x4e\x29\x8c\x9c\xc0\x28\xa3\xe4\x50\xcb\xcb\x47\x9b\xca\x48\x4e\xe6\x9e\x22\xc6\x97\x0d\xd1\xbc\x2a\xf2\x05\x73\x47\xa6\x48\x21\xf3\x99\x1b\x69\x3a\x4d\x40\x4f\x39\xfb\x12\xcf\xbd\x01\x67\xde\x1e\xe7\x1d\x2d\xf3\x38\x14\x88\xcf\x0e\x23\x6f\xb3\x6e\x8f\xfd\xb3\xfd\x2d\x65\xf4\xed\xc7\xff\x8e\x7f\xe8\xd9\x63\xfc\x1b\xaa\xa9\xb1\x87\xdf\xdf\x51\x1b\x19\xd8\x8d\xfd\xc6\xd1\xb2\xa0\x52\x1f\xf6\x80\xe4\x4f\xc9\x6c\x7e\x71\x76\x7f\x71\x42\x7e\xfd\x72\x0e\x7f\xcf\x2f\xae\x2e\xf4\xdf\xd9\xed\xcd\xcd\xc5\xec\x5e\x0b\xcf\xc7\xd1\x2a\xc0\x45\xce\x45\x81\xa3\xaf\x25\x14\xe1\x6f\xe6\x94\xbf\x91\xc7\xba\xd2\x3b\x72\x53\x19\xaf\x96\x14\x21\x44\x9a\x65\x29\xc1\x8e\xdf\xdc\x1c\xf4\xc6\xdc\x0d\xe8\x26\x6a\xdb\xea\x33\x73\x77\xb6\x89\xeb\x8f\xb7\xec\x30\x93\x3c\x39\x4e\x73\xe8\x1c\xdf\x2d\x84\xf3\xbb\x68\xbe\xbf\x08\x49\xd8\x2b\x5d\x97\x45\x42\x84\xdc\x51\x29\x32\x75\x64\x62\x75\xf5\xbf\xe3\xdd\x0e\x49\x3e\x15\x62\x79\xe4\x42\x7c\x19\x29\xc4\x92\xa8\xfa\xc1\xc5\x6f\x83\x20\x98\x94\xdb\xb1\xcd\xc6\x0b\x46\x3d\x71\x41\xde\xad\x5c\x93\x2b\xe7\xe5\xd9\xce\x60\x48\xbd\x3e\xa9\x05\x2d\x98\x97\x93\xfe\x61\x68\x85\x8e\x3f\x75\xb7\xd0\x6a\x2a\xb9\xdc\xc8\x31\x65\xa7\x78\xc9\x8b\x6c\x41\x65\xb6\xb5\x5d\x80\xe8\x87\xab\x09\x66\x0e\x5e\x0c\xc8\x41\x70\x6c\x8a\x46\x22\xc8\x38\x62\xf5\xcc\x64\x41\x4b\x8c\x03\x84\x1b\x2d\xc1\x6f\x39\xa1\x8a\xe7\xac\x64\xc0\x23\x80\x97\x78\x31\xc2\xf8\xa2\x10\xc0\x74\x89\x52\xe7\x89\x3f\x2c\xe8\xe5\x6c\x2f\xdc\x49\x8d\x0f\xff\xc6\x8f\x57\x08\x28\x1b\x7b\xd7\xc1\x28\xb5\x5e\x36\x5a\x1b\x7f\x1c\xcd\x07\xc1\x40\xa7\x65\x33\x32\x31\x24\x12\x93\x13\x32\x71\xc4\xa3\x99\xd1\xc8\x27\xc7\x71\x4a\x67\x97\x41\x9b\x39\x00\x14\x76\xe3\xe9\x30\x85\x7a\xb6\x89\x5a\x60\x76\x5b\x1f\x8d\xe4\xaa\x37\xa4\xbc\x5a\xa4\x34\xa6\x16\x68\x83\x5f\x50\x3c\xa7\x76\x43\xb7\x6a\xdd\x30\x74\xec\x5d\xe3\xc9\xb1\x97\x7d\x65\xd9\xc9\x09\x17\x66\xf0\x24\xd3\xb3\x31\x14\x0a\xd0\x7e\xee\xbc\xb5\xe7\x7c\x5c\xda\xac\xc4\xb9\x24\x25\x95\x8c\x57\xae\xf2\xf1\x6c\xcd\x25\xce\x00\xc6\x1c\x4f\xd2\x56\x65\x70\x11\xb5\xdc\x1a\x12\xb1\x8a\x3b\x97\x62\x56\x50\xa5\x3a\x0c\x9e\x70\x06\xe8\x8c\x0d\x37\xbd\x3e\x7b\x8d\xcf\x07\x5c\x65\xba\xa2\xcf\x81\xa6\x26\x54\xba\xa2\x72\xc9\xaa\xb0\x43\x02\xe5\x6f\xb7\xc1\x4b\x20\xa6\xc9\x57\xc3\x4d\x77\x40\x8c\x72\x5e\x4d\x85\x9c\x62\x92\x9f\x49\x25\xeb\x3e\xdc\xa1\xca\xd7\x4c\xd4\xd5\x1d\x5b\x08\xde\x1d\x34\x6c\xbe\x1b\xcd\xc3\x62\x40\x24\xb5\x71\xf2\x39\xb3\xe2\x77\xfb\x66\x1a\x0b\x47\x35\xb2\xb9\x75\xec\xf1\xc9\x45\x6f\xaf\xae\xf7\x19\x6c\x02\x0c\x52\xe1\x91\xfc\xcd\x9c\xc9\x7c\xe9\x6a\x6a\x6a\x1e\x4c\x76\x5d\x57\xc3\x13\xcd\x9c\xc3\x48\xf8\x6b\xd3\x19\x61\xa2\xc7\xde\xf6\xab\x8a\x56\xf5\xd6\x6c\x88\x1d\x45\x66\x7f\xbf\x43\x22\x07\xa3\xde\xdf\x41\x56\x6d\x9b\x55\x9b\x43\x0e\x35\x3a\x24\xd1\x84\xef\x6c\x44\xc9\x29\x31\x09\xf5\x92\xad\x24\xcd\x11\x0e\xa3\x8b\xaa\xa6\xdb\x26\x77\x9d\xd8\x44\xa3\x74\x33\xc7\x06\x00\xb1\x10\x08\xb6\x60\xb2\x52\x57\x54\x55\xbf\x96\x19\xed\xe1\x10\xd8\x88\x32\x51\x15\xac\x29\xd4\x69\x5f\x38\xcb\xf4\x21\x64\xba\x04\xf3\x23\x2f\x7a\x77\xaf\x31\xc7\x8e\x0c\x23\xb3\xd2\xae\x31\x9d\x7c\xaa\x8b\xea\xae\xf5\x5c\xe8\x3e\x39\xeb\xdc\xa3\xfc\x60\x9e\x58\x6d\xf5\x89\x26\x21\x37\xc2\xd9\x6b\x97\x54\xb9\x7f\x8d\x0b\x46\x79\x77\xb0\xa5\x57\xd7\x19\x7e\x37\x7c\x4e\x99\x02\xc8\xcb\x2a\xd7\xea\x16\x72\x2d\x28\x62\x85\xd8\x8c\x15\xac\x87\x72\x61\xcf\xf8\x1f\x53\xc2\xb9\x29\x60\x5f\xd7\xe9\x2f\x7e\x76\xce\xe2\x6d\x74\x4b\x13\x95\xdb\x68\x69\x46\xf6\x71\x58\xc5\x66\x83\x41\x78\x7b\x28\xc4\xe2\x09\x49\xcd\x81\xd4\x2c\xff\x8b\xc9\x80\x90\x01\x56\xc4\x9c\x67\xf9\xc2\xb9\x2b\x94\x52\x2c\x25\x53\x5e\x57\x23\x07\xac\xc2\xdc\x75\x99\xba\xcf\x5d\xb9\x42\x36\xb6\x9d\x9a\x1b\xda\x8b\xc3\x84\x28\x59\xbd\x1c\xe2\x37\x3d\x5b\xfa\xb6\x8a\x8e\xfc\x92\x70\x2b\x86\x01\x68\xe8\xda\x04\x59\x7f\xfa\x5f\x7f\xe8\xf1\xa8\xf1\x43\xa1\x00\x68\xfc\x22\xb7\xf7\xde\x04\xbf\x0a\x84\x4a\xa7\x9a\x02\x22\x21\xd1\x24\x5d\x75\x72\x55\x4e\xc9\x6d\xd4\x98\x8a\xd1\xdd\x64\x12\xd8\x80\x87\x38\xbf\xa4\xde\x1e\x35\xc8\xec\xcd\x87\x5c\x9b\xe2\xad\x96\x46\x99\x32\xdc\x29\xe8\x1f\xf7\x28\x64\xaf\xda\x36\x5e\xe5\xc3\x01\xf4\xd1\x8c\xb4\x4c\xdb\xef\x88\xee\x1f\xdc\x76\x07\x75\x49\x4e\x08\x25\xab\x5c\x55\x42\x1a\x0f\x11\x7d\x00\x56\x92\x72\x85\xef\x7b\xcf\x8a\x7d\x5d\xdb\x67\xae\x0a\x84\x96\x25\xa3\xd2\xda\xe9\xcd\x71\x46\x15\x80\xa8\x0b\x21\xb3\xce\x8a\x59\x48\xa6\x53\x1c\xeb\x2c\x7e\x04\xee\x90\x82\xaa\xea\xde\xd5\x41\xcb\x14\x89\xbb\xb1\x2f\x31\x99\x26\x36\xad\xb1\x1c\x96\x82\x37\x2f\x05\xa1\xdc\x00\x55\x7d\x45\x24\xcd\xaf\xb8\x5c\xd2\xb4\x0d\x05\xc0\x9d\xda\xf5\xe2\x84\xbd\x56\x13\x0f\x53\xf3\x35\x53\x2a\x18\x50\xbe\xc1\x64\x03\x37\x4e\x11\x77\xe3\x94\x49\x6e\x0f\x7b\x14\x1c\x30\xb6\xc2\x32\x33\xbf\xf5\x4f\x35\x02\x62\x02\xc2\x20\x6e\x59\xed\x35\x64\xe5\x8a\xaa\xd4\xc6\xb8\x55\xe4\x62\x78\x92\x97\x43\x62\x6d\x24\xa3\x2a\xc4\xcd\x31\xc4\x09\xfa\x41\xe6\xec\x91\xcc\xe8\x9a\x15\x33\xaa\xc6\xec\x79\xd8\x1e\x42\x50\x0d\x3b\x5d\x9e\x92\xa3\x79\xcb\x4d\xe6\x46\x54\xd7\xac\x3a\xda\xad\x6f\xd2\x36\x82\x77\xdd\x02\xf6\x56\x47\xe2\x0b\x7e\xcf\xa5\xbe\x77\x0d\x03\x0b\xfb\xab\x58\xd2\x61\x5e\x9a\xbe\x65\xec\x2f\xe0\x5a\x02\x3c\xb9\xd8\x75\x21\x47\xb8\x2e\xfa\x16\x6f\xca\xb2\xfd\xa0\x05\x3b\x64\xa9\x46\x5a\xef\xb2\xb8\xeb\x84\x7a\xb6\x3a\xe2\xde\x53\xa7\xc1\x56\xd4\xf6\x8d\xc7\x9b\xa8\x72\xa5\x95\xbc\x31\x05\xa3\x8f\xe5\x8f\x32\x83\xda\xfb\x3e\x20\xf9\x4f\xc3\xe7\xfc\xbe\xdc\x54\x19\xd8\xdf\xf4\x0c\x38\xa4\xbb\xdc\xb9\x2d\xd5\x00\x30\xee\xfe\x1b\xf8\x1f\x5a\xf7\x5d\xcd\xbc\xf9\xf1\x7d\x25\x48\x29\xd9\x33\xc4\x51\x70\x88\x0f\x65\x84\x33\xa5\x17\xca\x0f\x81\xe2\x13\x55\xb6\x34\x75\x2d\xae\x4a\x47\xd5\x64\x12\x1f\x5a\xfb\x51\x68\x80\xf1\x49\xd5\x0a\x13\xb4\xee\x01\xea\x60\x5c\xa7\x1a\x90\x59\x54\xc0\x1c\x98\x5f\x37\xf0\xbc\xf9\x6c\x5c\x55\xa3\x93\xcc\x61\x3f\x47\x4f\x8b\x85\xde\x95\x17\x70\x0b\x13\x6e\xf3\xee\xa2\xbc\x36\xc8\x3c\xdf\xdc\x03\xc1\xe7\xde\x9f\xe1\x63\x35\xab\xae\xf3\xf1\xfa\x3c\x4a\x0a\x97\x9c\xdf\x57\xc0\x70\x17\x9d\x40\xef\x4b\x79\x85\x4f\x6c\xd6\x7d\xfc\x7c\x4b\x61\x3b\x0d\xce\xb1\x77\x22\x1b\x54\x4c\x3e\xb3\xcc\xb3\x30\x9a\xdb\xd0\xfc\xdf\x5a\xf6\xe8\x26\x7f\xd3\xed\xe4\xef\x7f\xbe\xfb\x7f\x00\x00\x00\xff\xff\x90\x1c\x07\x44\xe8\x50\x0c\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -225,7 +225,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xe4\xb6\x95\x28\xfe\x7f\x3e\x05\x4a\x49\x95\xa4\xa4\xbb\x67\x9c\xcd\xdd\xcd\x9d\x9b\x4a\x4a\x96\x34\x59\x5d\x7b\xc6\xba\xa3\xb1\x53\xfb\xf3\x7a\xd7\x10\x89\xee\x46\x44\x02\x34\x01\xb6\xa6\xb3\xde\xef\xfe\x2b\x9c\x03\x80\x64\xbf\x08\x50\xdd\x2d\x8d\x97\xf8\xc3\x1e\xb1\x49\x3c\x0f\xce\xfb\x41\x0b\xfe\x1d\x2b\x15\x97\xe2\x0d\xa1\x05\x67\x9f\x34\x13\xe6\x2f\x35\x79\xf8\xa3\x9a\x70\xf9\x6a\xf1\xc5\xaf\x1e\xb8\x48\xdf\x90\xcb\x4a\x69\x99\x7f\x60\x4a\x56\x65\xc2\xae\xd8\x94\x0b\xae\xb9\x14\xbf\xca\x99\xa6\x29\xd5\xf4\xcd\xaf\x08\xa1\x42\x48\x4d\xcd\x63\x65\xfe\x24\x24\x91\x42\x97\x32\xcb\x58\x39\x9e\x31\x31\x79\xa8\xee\xd9\x7d\xc5\xb3\x94\x95\xd0\xb9\x1b\x7a\xf1\x7a\xf2\xc5\x1f\x27\xaf\x7f\x45\x88\xa0\x39\x7b\x43\x54\x75\xaf\x92\x92\x17\xd0\xd3\x44\x16\xac\xa4\x5a\x96\x6a\x92\xc8\x92\x49\xf3\xbf\xfc\x57\xaa\x60\x89\x19\x63\x56\xca\xaa\x78\x43\x36\xbe\x83\xdd\xb9\xa9\x50\xcd\x66\xb2\xe4\xee\x6f\x42\xc6\x44\x66\x39\xfc\x1b\x97\x78\xd7\x18\x15\x1e\x67\x5c\xe9\xaf\xd6\x7e\xfa\x9a\x2b\x0d\x3f\x17\x59\x55\xd2\x6c\x65\xb6\xf0\x8b\x9a\xcb\x52\xbf\xaf\xc7\x36\x63\xa9\xea\xbe\xf9\x6f\xfb\x22\x17\xb3\x2a\xa3\x65\xbb\x93\x5f\x11\xa2\x12\x59\xb0\x37\x04\xfa\x28\x68\xc2\xd2\x5f\x11\x62\xb7\xcb\xf6\x39\x26\x34\x4d\xe1\x08\x68\x76\x5b\x72\xa1\x59\x79\x29\xb3\x2a\x17\x7e\x4c\xf3\x4e\xca\x7c\xaf\x6f\xc8\xc7\x39\x23\x05\x4d\x1e\xe8\x8c\xb9\xf1\xee\x59\x4a\xb4\xf4\x1f\x10\xf2\x77\x25\xc5\x2d\xd5\xf3\x37\x64\x62\xb6\x78\x62\x76\xb0\xf1\x33\x9e\xcf\x2d\x76\xd2\x78\xae\x97\x66\xba\x4a\x97\x5c\xcc\x76\x0d\x9f\x50\x4d\x33\x39\x23\x08\x46\x64\x2a\x4b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xd4\xcd\x6f\xc7\x8c\xf0\xd3\xb5\x39\xdd\xad\x3e\x0e\x9e\xd2\x9c\x0a\xc1\x32\x22\xa7\xa4\x2a\x52\xaa\x99\x22\x5a\xd6\xfb\xb3\x7b\x7b\xec\xc7\x6b\xb3\xb9\x5c\x7b\xbe\x61\x3a\xf8\xea\xe2\x0b\x9a\x15\x73\xfa\x85\x7d\xa8\x92\x39\xcb\x69\x7d\x86\xb2\x60\xe2\xe2\xf6\xe6\xbb\x7f\xba\x5b\xf9\x81\xb4\x97\xd2\x04\x51\xf2\xc0\x58\xa1\xea\x4b\x41\xaa\xc2\xac\xc9\x2c\x8e\xdc\x2f\x89\x2e\x69\xf2\xc0\xc5\x0c\x96\x3e\xc3\xf5\x5e\xe2\xc1\xa8\xc9\xda\x94\xe5\xfd\xdf\x59\xa2\x1b\x8f\x4b\xf6\x53\xc5\x4b\x96\x36\xa7\x62\x76\xd6\x61\x82\x95\xc7\x66\x9f\x1a\x8f\x8a\xd2\x4c\x4b\x37\xee\x21\xb6\x06\x2a\x6a\x3d\x5f\x59\xe6\xcf\xe3\x95\x5f\x09\x31\xbb\x83\x5f\x92\xd4\xe0\x25\xb3\xa0\x39\x73\xd7\x85\xa5\x76\x4b\xcd\x01\xeb\x39\x57\xa4\x64\x45\xc9\x14\x13\x88\xa9\xcc\x63\x2a\xec\x2a\x27\x6b\x9d\xdf\xb1\xd2\x74\x64\xae\x74\x95\xa5\x06\xa1\x2d\x58\xa9\x49\xc9\x12\x39\x13\xfc\x1f\xbe\x77\xd8\x44\x33\x6c\x66\x20\x48\x13\xb8\x90\x82\x66\x64\x41\xb3\x8a\x8d\x08\x15\xe9\x5a\xdf\x39\x5d\x92\x92\x99\x71\x49\x25\x1a\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xc9\x08\x17\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x66\x5c\x3b\x54\x9d\xc8\x3c\xaf\x04\xd7\xcb\x57\x80\x75\xf9\x7d\x65\x8e\xfe\x55\xca\x16\x2c\x7b\xa5\xf8\x6c\x4c\xcb\x64\xce\x35\x4b\x74\x55\xb2\x57\xb4\xe0\x63\x58\x8c\x40\x24\x9b\xa7\xbf\x2e\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc8\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\x5b\x9f\x89\x79\x64\xb6\xf1\xc3\xf5\xdd\x47\xe2\x66\x84\xe7\x86\x47\x54\xbf\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x4a\xfc\x72\x5a\xca\x1c\x7a\x65\x22\x2d\x24\x17\x1a\xfe\x48\x32\xce\x84\x36\x37\x3d\xe7\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x09\xa4\x8d\xdc\x33\x8b\x23\xd2\xf5\x57\x6e\x04\xb9\xa4\x39\xcb\x2e\xa9\x62\x47\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xf8\xf4\x9a\x84\x7b\xfd\x83\xb5\x5b\x4f\x88\x23\xb9\x5b\x8f\xbb\x89\x82\xee\x0a\x96\xf8\xeb\x48\x05\xb9\x28\x8a\x8c\x27\x78\xe3\xf4\x9c\x6a\x92\x50\x61\xb6\x93\x0b\xa5\x69\x96\xb1\xd5\xdb\xb1\x75\x16\xdb\xf0\x0f\x01\x64\xb3\x42\xae\xdc\xe3\x35\x9a\xd1\xfe\xc1\x93\xd9\x95\x37\xb6\xe1\x2a\xd3\x2c\xe6\x5f\xff\x61\xc7\x96\x13\x64\x89\xa6\x7c\xb6\xe9\xb3\xad\x7b\x79\x09\x9f\x00\x33\x45\xb9\x50\xb6\x8b\xaa\xc4\xdd\xac\x69\xa7\xa1\xa6\xb4\xc5\x49\xac\xc3\xe1\xce\x9d\xed\x5a\xb3\x69\x74\x0a\xac\xdf\x72\xf3\xaf\xdd\x08\xc0\xb5\x9b\x69\x3d\xf3\x11\x91\x0b\x56\x96\x3c\xb5\xa8\xbb\x90\xe9\xa9\x02\xc4\x9a\x56\x19\x10\x2a\x29\x94\x2e\x29\xdf\x78\xe9\x5d\x13\x3c\x33\x8b\x1f\x53\x8d\x37\x88\x29\xf2\xc8\xb3\x8c\xfc\x56\x48\xfd\x5b\x3f\x02\x0c\x20\x4b\x3e\xe3\x1e\x3b\x2b\xc2\x85\x1b\x17\xc8\xba\xe5\x4b\xa4\x62\x2b\x1d\x6e\x1f\xfc\x5b\xc5\x08\xcb\x0b\xbd\x74\x68\xea\xec\xbf\xfe\xfb\xdc\xd0\x04\x56\x52\xd5\x18\xb0\xd5\xdf\x56\x4c\x8f\xad\xe3\xa4\x48\xc0\x69\xc1\xbe\xc8\x94\x5d\x74\x9c\x1a\x59\x3d\xb9\x2b\x86\xec\x8f\x82\xcf\xfd\xa9\x37\x0f\xa5\xac\x32\xa6\x3c\x0b\x67\xf6\x6e\x47\xe7\x01\x6b\x09\x5d\x0f\xbe\xc7\xa6\xac\x2c\x59\x7a\x55\x99\x5b\x76\xe7\x67\x75\x33\x13\xd2\x3f\xbe\xfe\xc4\x92\x4a\x6f\x60\x29\x76\x2e\x7d\x07\xd0\xba\x66\xf8\x46\xbb\x13\xac\x44\x28\xc3\x19\x01\xeb\x68\x7f\x30\x5b\x02\x6c\x81\xd9\x41\x85\x58\x4f\x51\xcd\xd5\x74\xd9\x39\x80\xd9\x51\xbf\xe7\xec\x93\xa1\x78\xc0\xfb\x37\x6e\xbb\x61\xe4\x80\xb8\x71\x96\xa5\x23\x72\x5f\x69\xc2\x35\x50\xbe\x64\x2e\xa5\x5a\xc7\x76\xab\x8d\xe2\xd1\xc2\xbc\x16\x5c\x02\xe3\x42\xa4\x30\xc0\x4a\x72\x43\xae\x80\x61\x62\xcd\xe1\x27\xb0\xf2\xfa\x33\xbe\x4a\x6d\xd6\x5b\x2e\x95\xae\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x47\xae\xe7\xf0\xc7\xac\x64\xc8\x34\xa9\x2a\x37\x83\x3e\x32\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x26\xf3\xc6\xb4\x72\xc6\xb4\x22\x34\xcb\xdc\x12\x9a\x50\x8b\xd4\x23\x37\x0c\x04\x39\x73\x1c\x46\xe7\x28\x96\x3b\x18\x79\xea\xb3\x0a\x78\x1b\x8f\x6b\x44\x98\x4e\x26\xe7\xa3\xce\xee\x13\x99\x17\x06\x21\x50\xd8\x83\xfb\x25\xe1\xda\xf0\xee\xc8\x0d\x95\xb2\x9a\xe1\x4e\xb1\xcc\x4e\xdc\xf1\xb2\x70\xf8\x86\xb9\x04\x69\x70\x03\xb9\x59\x6d\x27\xb8\xb9\x27\x8e\x5d\x35\xc3\x71\xdc\x24\xd8\xbf\x9c\xea\x64\x6e\xd1\x70\x22\xcb\x92\xa9\x42\x0a\xd3\x33\xfe\x72\x5d\xaf\xed\xff\x98\x77\x3a\xc7\x33\x9d\x9e\xa9\xf3\xfa\xb0\xe7\x7c\x36\x77\x67\x4d\x4b\x44\xc7\x6d\x18\xe9\x3a\x72\x44\x25\xb4\x2c\x69\xd7\x3d\xe2\x9a\xe5\x1d\x88\x84\xf4\xb8\xfd\x84\x5c\x08\x8b\xec\x6b\xc0\x6e\x80\x98\x66\x65\xee\x37\x12\xa0\x10\xd0\x9e\xc2\x4d\xe0\xb9\xe1\x84\xb8\xb6\x60\x4e\x5e\x07\x8c\x77\x66\x6e\x02\xe1\xfa\x54\xc1\xad\x1d\xcb\xe2\x7c\x42\x2e\x88\xa8\x3c\xe2\xd9\x35\x05\x21\xfd\x0c\x6c\x47\x66\x5a\x4a\xd6\x7d\x75\xe3\xa3\x30\xf4\x8d\x6d\x3b\x83\xb6\xde\xc6\x76\xfe\x4c\x04\x5c\x42\xf3\x3a\xee\x5a\xe7\xab\xa1\x84\xc4\xbd\xed\xe6\x10\xf2\xf6\x0a\xc4\x5c\xe0\xcd\x51\x2c\x63\x89\x36\xd4\x90\x95\xf9\x88\x50\xa5\x64\xc2\x8d\xa8\x50\xc3\x7e\xfb\x42\xe1\x4a\xba\xf7\x9e\xc4\xee\x3f\x89\x5e\x3f\x01\x69\xb4\x7d\xbf\x43\xbf\x5b\xdb\x8d\x8c\x2b\x6d\x10\x54\x7b\x57\x5a\x78\xf7\x7e\x09\xbf\x9e\x2a\x92\xd1\x7b\x96\xed\xe0\xab\x56\x5b\xf8\xe5\xaf\x5b\x20\x1a\xd8\xb2\xa0\x20\x84\x50\xb7\x55\x68\x68\xac\xdb\xca\xbd\x1e\x4e\x40\x0c\x72\x4c\x3d\xb2\x82\x23\x42\xc9\x03\x5b\x8e\x10\xa5\x0b\xaf\xc2\x89\x9a\x02\x74\x5c\x32\x24\xe8\x06\xee\x1e\xd8\x12\x3a\xdc\xcd\x6e\x6e\xec\x2a\x16\xee\xb0\xc5\x60\x80\xba\x8d\xcd\x44\x23\xbf\xe8\xb1\x41\xf1\x57\x03\xdb\x03\xdb\xc9\x3e\x6f\x6a\x6b\xca\x46\x00\x77\x38\x0f\x38\x24\xa0\xc0\x0e\x1e\xa8\x11\x91\xd9\x66\xfd\xc3\xee\xb6\x53\xe0\xdc\xd5\xdc\xee\x3d\x69\x5d\x91\x17\xc4\xb4\x0f\x5e\x87\x83\xf0\x7e\xaa\x10\x5e\x0d\xde\x99\x73\x50\x56\x9a\x8b\x02\x68\x24\x1e\x68\xb1\x7d\x47\x33\x9e\x36\x74\xa0\x86\xd9\xb8\x11\x23\xf2\x5e\x6a\xf3\xbf\xeb\x4f\x5c\x19\x1e\xf3\x4a\x32\xf5\x5e\x6a\xf8\x73\x42\xfe\xaa\xf1\xea\x7d\x1d\x88\x97\xeb\xd6\xfb\x0c\x70\x7d\xc7\x3e\x81\x0b\x81\x48\xd4\xec\x70\x53\x13\xa7\x26\x46\x32\x07\x16\xdd\xee\x9c\xc1\x5a\x37\xc2\x08\x05\xb8\x73\xd1\x43\x81\x32\x16\xe5\x6c\x1c\x32\xaf\x14\xa8\xd2\x84\x14\x63\x60\xa3\x36\x8e\x89\x07\x64\xc6\x6d\x1e\xd1\x1e\x87\xdf\x3e\xf4\x5f\xb5\x19\xf6\x6b\x3d\x6a\x7c\x1c\x3d\x6e\x63\xb0\x39\x5d\x00\x6b\xcf\xc5\x2c\xf3\x4c\xfc\x88\x3c\xce\x79\x32\x47\xe9\x11\x34\x61\x9a\x95\x45\xc9\x0c\xc7\x40\x41\x67\x66\x9e\xcc\x58\x19\x0f\xfa\x1f\x8d\x68\x80\xe3\xa3\xbe\x3b\xa3\x09\x4b\x49\x0a\x22\x0b\xaa\x5e\xa9\x66\x33\x9e\x90\x9c\x95\x33\x46\x0a\x43\xfa\xfb\x01\x7c\x1c\x25\xc6\x16\x4d\x8f\x9b\x03\xf6\xb8\x61\x84\x7c\x1a\x3f\x54\xf7\xac\x14\x4c\x33\x35\x36\xfc\xc9\xd8\xce\x5e\xcb\x9c\x27\xc1\x9d\xed\xa5\x1b\xe0\xb3\xde\x1a\xb9\xed\x48\x2c\x16\xc8\x88\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x15\xdc\x06\x16\xeb\xc9\xc3\x0f\x2c\xd6\xc0\x62\x1d\x9d\xc5\x6a\x75\x91\xd3\x22\xb6\x07\xd4\xcb\xf5\x50\x04\xfe\x0d\x15\xba\xab\x9a\x3f\x60\xf8\x9c\x5f\x43\x5b\x05\x68\xf8\x98\x3b\x4b\x9c\x3e\x82\xda\xd0\x5a\x22\x4b\x2a\x66\x8c\x7c\x31\xfe\xe2\xf5\xeb\x18\x05\xa1\x05\xe7\xa0\x2f\xa6\xb2\xcc\xa9\x86\x6f\xfe\xe9\xf7\x1d\x5f\x3c\xe1\x54\xb6\xd9\x4b\x8e\x63\xa8\xb3\x98\xc7\xdb\x66\x5a\x2c\xf2\x16\x5b\x1a\x90\x31\x21\x35\xc9\x99\x26\xb4\x9b\x27\x6b\xaa\xdd\x79\xce\x46\xce\x1c\x8a\x68\xc7\xba\x8d\x38\xa3\x60\x4a\xa4\xb0\xa6\x17\x73\xf8\xdd\x87\xdb\x6b\x05\x09\xa3\x8a\x19\x12\x7f\xcf\xcc\x2a\xba\x4d\x81\x9a\x28\x99\x9b\x59\x73\xa1\x1d\x12\x33\x4b\x60\xee\x60\xc8\x19\x9b\xcc\x26\x24\xad\xa0\x5b\x2a\xac\x1f\xcc\x39\xae\x56\x2d\x95\x66\x79\xb7\x2d\xd0\x10\xc3\x12\xfe\x67\xb6\x45\x97\x4b\xb0\x90\x2f\x98\xd0\x15\xcd\xb2\x25\x61\x0b\x9e\x68\xbf\x7f\xe0\xb6\xc3\xb5\x0a\xda\xa9\x08\x36\x3a\x9c\x75\x1e\xaf\xdd\xd0\x2e\x22\x15\xc3\xf9\xae\xf5\x1d\x82\x73\x5a\x37\xe0\x83\x5d\xc9\x64\xab\x4c\xa8\x4d\xbf\x68\xb6\x85\x7f\x02\x70\x7f\xf3\xa1\xdb\xca\x46\xa2\xe9\x4f\x04\xcd\xe9\xc7\x5a\x59\x83\x97\x2c\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xd6\xad\x91\xd3\xc0\x01\xf5\x9c\xa1\x91\xf2\xe2\xfd\x55\xd8\x8e\x11\xeb\x1c\xf0\x51\x16\x32\x93\xb3\x65\xf3\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb0\x36\xe8\x2d\x9e\x3c\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x77\x1b\x58\xac\x9d\x6d\x60\xb1\x7c\x1b\x58\xac\x81\xc5\x1a\x58\xac\x81\xc5\x1a\x58\xac\x63\x75\xf3\x54\xd3\xd0\x93\xa6\xd0\x6f\xf0\x42\xa6\x4f\x08\xde\x2a\x64\xba\x23\x76\x0b\x75\xfa\x89\x1c\x67\x32\xa1\xda\x86\xd9\x9a\x4f\xac\x15\x4a\xd1\x1c\xcd\x14\x23\xf2\x0f\x29\x18\x46\xb3\x98\xeb\x01\xc6\x02\xa9\xe7\xac\x34\xaf\x9f\xa9\xf3\x9d\x21\x04\x43\xec\xd7\x10\xfb\x35\xc4\x7e\x6d\x6d\x2f\x26\xf6\x6b\x4e\x15\xc2\x2d\x92\xc6\xed\xa1\x60\x0d\x9c\xf4\x91\x95\xf9\x2f\x34\x12\xcc\x80\xbb\x05\x47\x48\x12\x51\x83\x14\xee\x4c\x6a\x0d\xfe\x2c\xbd\x6d\xef\x87\x15\xab\x61\x51\x34\x4d\x59\x4a\x0a\x56\x8e\x11\x44\x25\x99\x72\x91\x6e\x58\xab\xdb\x9f\x6e\xf4\x70\xc0\x50\xac\xf6\x3a\x82\xbe\x39\x4c\x3c\x56\x7b\x22\x3d\x8c\x8a\x4d\xcb\x68\x8b\x08\xbe\x88\xe8\xac\x58\x09\x7d\x4c\xb4\x35\x28\x7e\x15\x28\xa3\xc7\x8b\xd9\x20\x1c\x3b\xf3\x63\x4f\xf5\x53\x94\x28\x74\x61\xe5\xf1\x9f\x2a\x56\x2e\x21\x3e\xbf\x16\x3b\x7d\x2e\x12\xeb\x11\xc3\x15\x49\xa8\x42\xb2\x1a\xc3\x2a\xdf\x4c\x31\x6a\x52\x54\x59\x36\xc2\x7e\x56\x2f\xab\x43\x73\x00\x07\x42\x9a\xdf\xa3\x35\x62\x91\x2a\x9a\x7e\x3a\x90\xfe\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\xa3\xed\xe3\xd8\xfa\x0a\x30\xbd\xc4\x97\x27\xcb\xeb\x3b\xf6\xe4\x09\x7a\x45\x78\x39\x7a\x32\xfb\xd1\x2d\x92\xfe\xfa\x45\xd2\x5b\xc7\x48\x7a\xe9\x19\x49\x5f\x5d\x23\x79\x82\xbe\x91\xf4\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xc3\xa8\x1f\xc9\xd3\x84\xf3\xfe\x6a\x48\xb2\x87\x8b\xd5\x1c\xbf\x91\xd9\xe9\x70\x7a\x49\x12\xaa\x9b\x84\x6b\xd5\x52\x4f\x1e\xfb\x5c\xfa\xa9\x26\xc9\x9e\x4e\xc5\x65\xc6\x01\x5d\xd8\xb1\x94\x95\xe4\xf9\x15\x96\x3b\xa7\x60\x87\x0f\xd6\xf0\xf5\x1a\xfd\x09\x5a\x41\xf2\x24\xcd\x20\xe9\xaf\x1d\x24\x4f\x05\xf6\xbd\x69\x09\xf7\xda\x15\xf0\x49\x5f\x83\x1f\xda\x13\xb8\xad\xe8\x1b\xd8\x18\x16\xb9\x8b\x9c\x16\xe6\xf6\xfd\x97\x61\x22\x00\x30\xff\x9b\x14\x94\x97\xca\x48\x37\x56\xaf\xdd\xfc\xcd\xaa\xef\x1a\xdd\x44\x4f\xa0\x30\x03\x1b\x1a\xbf\xa0\x99\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\x79\x84\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\xf2\xc0\x96\x27\xa3\x20\xf5\x40\xbb\x35\x6f\xf6\xc9\x8d\x38\x41\xd6\x69\xed\x5e\x7a\x3e\x4b\x8a\x6c\x49\x4e\xe0\xb7\x93\x7d\xf3\xa8\x3d\xf8\xa3\x66\x6a\xd6\xbe\xec\x47\xaf\xeb\xf4\x54\x05\x37\x69\x41\xdf\x57\x6c\xd9\xd7\x11\x21\x0a\xe6\xdf\xb5\x46\x74\x0c\x35\x80\x99\x91\xdd\x3d\xdf\x84\x99\x59\x81\x65\xb2\x3a\x2a\x54\x57\xf1\x2c\x8b\x18\xed\x9e\x11\x4d\x1f\x18\x58\x78\x24\xa4\x96\xe3\x29\xc3\x64\x7a\x08\x3a\x30\x92\x01\x99\x4a\x41\x7a\x5c\x92\x49\xf9\x50\x15\x0e\xf4\x5c\x36\xc9\x88\x21\xb9\x48\x64\xee\x7c\xea\xd1\xaf\x75\x64\x13\xcc\x3d\xb0\xe5\x18\x73\x60\xe2\x73\x18\x18\x48\x80\x55\x4d\xfc\xd8\x12\xcc\x7f\x24\x54\x91\x1f\x81\xa9\x14\xe4\x0c\x3e\x3c\xff\x31\xc6\xa5\xc0\x6f\x20\x6a\x5f\x65\x05\x98\x85\x19\x62\x69\x27\xa8\x56\xf7\x76\xd7\x8e\x45\x0c\xed\x32\xc5\x35\x37\xe3\x14\xed\x0d\x67\x54\x68\x7e\xee\x95\x34\x13\x02\x70\x00\x5c\x72\x2a\xc5\xa9\xc6\xf9\x39\xbc\xe6\x3a\x88\xf1\x3a\xf0\xfb\x5e\x5b\xfc\xd0\x5a\x80\x47\x9e\xb2\x29\xad\x32\x6d\xb3\x91\x1a\xd4\x07\x94\x3e\x62\x84\x8f\xce\x5e\x62\x19\xfe\xa9\x2c\xef\x79\x9a\x32\x01\x21\x0e\x6e\xfa\xf7\xd2\x05\x04\xd5\xe0\x6e\x30\x5b\xeb\x8c\x63\x86\xbd\xc8\x94\x1c\xad\xf6\x98\xf8\x6c\xa5\xe6\x16\x3d\xce\x99\x68\x0f\x40\xb8\x32\x9b\xaa\x58\x04\x53\x7b\x14\xd7\x9f\xa7\xe3\xbc\xde\xae\x57\x5c\x3d\x03\xde\x5b\x1d\x74\x40\x7d\x41\xa8\x4f\x48\x3d\x60\xbf\xcf\x16\xfb\xad\x01\xfd\x3e\x10\xe0\x5a\xa7\x03\x0e\x8c\xc6\x81\xc2\xa5\x41\x7e\x66\x2b\x00\x2a\xc6\xd0\x8b\xd5\x4d\x49\xd5\x3a\x33\x08\xf4\xea\xa7\x2f\x73\x61\x70\x80\x67\xa1\x87\xd4\x19\x43\x2b\x61\x93\xc1\x83\x39\xb4\x1e\x16\xf1\xc5\xaa\xcd\x3d\x62\x4c\x27\xb8\x48\xc1\x14\xa8\xd8\x99\xf7\xaf\x68\x0c\x03\xbd\xc6\x2c\x05\x42\xe1\x6a\xf5\xa1\x48\x57\x83\xe3\xea\xbe\x41\xaf\x9f\x33\x2a\x14\x39\x71\x2e\x1e\xa7\xaa\x7e\xe3\x24\xea\xbe\xb9\xd4\x97\x7e\x6c\xc8\x74\xdc\x4c\x77\x59\x0f\x3d\xd8\x51\x06\x3b\x4a\xb3\x0d\x76\x94\xf5\x49\x0c\x76\x94\x6d\x6d\xb0\xa3\xf4\x1a\x7f\xb0\xa3\xb4\xdb\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xc1\x8e\x12\xfa\xd1\x3e\xec\x28\xb5\x18\x74\x0c\x39\xba\x29\xb2\x5a\x3f\x71\xac\xb2\x45\x35\x4f\xea\xa8\x50\xf7\x16\xfe\xeb\xb9\x84\xea\xa6\x18\xfc\x54\x91\xba\x29\xa0\xaf\x69\x30\xa2\x25\xea\xad\xf2\xb3\x97\xb0\xd7\xc6\xd8\x93\x68\xfd\x0b\x57\x2e\x35\x1c\x58\x8f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x9e\xd5\x71\x2e\x29\x39\x73\xba\xd6\x73\x73\xe0\x42\xea\xf6\x8f\x42\xf3\x71\xfd\x86\x77\x10\x06\x95\xb0\xcb\xe6\x16\xb3\xe9\x4e\x66\xa9\x75\x8f\x62\xa5\xec\x65\x0d\x6d\x06\xff\xb3\xb2\x35\x5b\xae\x6c\x25\x35\x08\x4d\x2b\x2b\x21\x0c\x7b\x24\x85\x8d\xe2\x88\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xfa\x98\x1a\x01\x00\x54\x63\x99\x44\x9b\x73\x49\x0a\xab\x24\x37\x4f\xb0\x9f\x88\x49\xf8\x0b\x0b\xfb\xc9\xfd\x8a\x62\xee\xea\x35\xdc\xd1\xe6\x64\xb9\x82\x73\xa4\x59\x26\x1f\x63\xe8\x53\xe4\x8d\xe8\x9d\x1c\x30\x18\x7a\x1f\xa3\xb3\x08\xae\x78\xcb\x87\xf2\xea\x43\xaa\xc1\x9d\x6d\x48\x35\xf8\x32\x52\x0d\x36\xec\xa0\xcd\x9c\x83\xdd\x7b\x05\x39\x09\x0f\x9a\x73\x90\x90\xbf\xcd\x19\xdc\xa2\x92\xa1\xf1\xb2\xca\x34\x2f\xea\x28\x63\x85\x27\x94\xa1\x48\x3d\xb5\xd1\x80\xed\xdb\x6b\x66\x43\x93\x79\xe7\x50\x2b\xb7\x1c\xc6\x83\xa8\x65\x05\xd8\x14\x23\xe6\x40\xff\x8e\x89\xfe\x9c\xac\x8d\x61\x87\xfc\xb9\xa3\xa9\x82\xf0\xdf\x95\x2b\x18\xda\xb0\x81\x2b\x72\x66\xa8\x63\xb6\xb4\x56\xe3\x16\x22\x6c\x91\xd5\x80\x01\x50\x0f\xb6\x60\x8e\x41\x9d\xf1\x05\x13\x35\xf5\x3d\x53\xe7\xe7\x8e\x27\x5e\xe5\x1f\x02\x7a\x7f\x0a\x87\x11\x82\xb5\x63\x39\x83\x15\x7a\x1f\x30\xc2\x06\x8e\xe0\x4f\x0d\x2a\xfb\xe7\x6e\x9e\x20\x60\x10\xbc\xd2\x2e\x3c\xb3\x71\xd0\x35\x2f\xd0\xd9\xcb\x01\xa3\xe0\x62\x42\xad\xe2\xb4\xe2\x3d\x42\xac\xfa\x66\xca\x3c\x6c\x68\xd5\x41\xc3\xaa\x3e\x9f\x84\x96\xcf\x6c\xfe\xfb\x0c\xb2\x31\xbd\x10\x73\xdf\x90\x8e\x69\x5b\x7b\xae\x74\x4c\x07\x37\xe7\x7d\x76\x59\x99\x8e\x6a\xbe\x3b\x8e\xe9\xee\x33\xcb\xca\xf4\x2c\xa6\xba\x17\x9e\x9f\xe9\x70\x26\xba\x21\xf9\xd1\xf3\xe4\x97\x8c\x35\xc3\xf5\xbf\x55\xcf\x6a\x7e\x7b\x56\xd3\xdb\xf3\x9b\xdd\x7a\xf1\x2a\x4f\x35\xb7\x45\x5f\x93\xa7\x9a\xd9\xfa\xb8\xec\xf7\x83\xe7\xe3\x85\x28\x1d\xd9\x47\xff\x65\x84\x26\x3d\x93\x63\xfe\x73\x39\xe5\x1f\xd6\x21\xff\x19\x42\x91\x8e\x12\x86\x14\x4b\xf6\xa3\x88\xfd\xd3\x70\x57\x1f\x8a\xdc\x33\xe4\xa8\x27\xfe\x3a\x66\xa8\xd1\x2f\x00\x85\xf5\x0a\x31\x1a\xb0\xd8\x33\x61\xb1\xfd\x85\x14\x1d\x2b\x9c\xe8\x17\x86\xcb\x7a\x86\x0e\xed\x4d\xbb\x7d\x98\x90\xa1\x63\x87\x0b\x1d\x20\x54\xe8\x39\xc2\x84\x0e\x10\x22\x34\xd8\x04\x02\xdb\x60\x13\x08\x6d\x83\x4d\x60\x5b\x1b\x6c\x02\xab\x6d\xb0\x09\x0c\x36\x81\xc1\x26\x30\xd8\x04\xd6\x07\x1c\x6c\x02\x83\x4d\x20\xac\x0d\x36\x81\xe3\xd8\x04\x62\xc3\x6e\xfa\xc1\xf2\xf3\x84\xdb\x1c\x37\xd4\x66\xff\x61\x36\xcf\x18\x62\xf3\x0b\x53\xb8\x44\x87\xd3\xf4\x03\xf3\x97\x12\x46\xf3\x32\x42\x68\x9e\x3d\x7c\xe6\xa9\xa1\x33\xfb\x09\x9b\x89\x80\xf6\x9e\x70\x5e\xc8\xf4\x42\x68\xfe\xd4\xc2\x47\x4d\x00\xdc\x56\xfd\x88\x2e\x24\x4f\x49\x51\x69\x5b\x70\x65\xa8\x80\xd4\x09\x03\xc7\xa9\x80\xd4\x3a\xbc\xa1\x0c\xd2\xae\xf6\x62\xca\x20\x6d\x3b\xb3\xa1\x16\x52\xbb\x0d\xb5\x90\x86\x5a\x48\x43\x2d\x24\x6c\x43\x2d\xa4\xa1\x16\xd2\x90\xc3\x6f\xc8\xe1\x37\xe4\xf0\x0b\xff\x6a\xc8\xe1\xb7\xbd\x0d\x39\xfc\x62\xda\x90\xc3\x2f\x78\xf4\x21\x87\xdf\x90\xc3\x2f\x6e\xe0\x21\x87\x1f\x19\x72\xf8\x0d\x39\xfc\x3e\xe3\x1c\x7e\x43\x2d\xa4\xcf\xa2\x20\xc8\x50\x0d\x24\x62\xec\x97\x55\x0d\x64\xa8\x85\xb4\x73\x90\xa1\x16\xd2\x80\xfa\x86\x5a\x48\xbf\x58\xec\x37\xd4\x42\x0a\x18\x64\xa8\x85\x34\xd4\x42\xda\xd9\x86\x5a\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x12\xfb\xd5\x60\x47\xd9\xde\x06\x3b\x4a\x4c\x1b\xec\x28\xc1\xa3\x0f\x76\x94\xc1\x8e\x12\x37\xf0\x60\x47\x21\x83\x1d\x65\xb0\xa3\x7c\xc6\x76\x94\xa1\x16\xd2\x50\x0b\x69\xa8\x85\xe4\x47\x1e\x6a\x21\x0d\xb5\x90\xa0\x0d\xb5\x90\x02\x46\x18\x6a\x21\x7d\xae\xb5\x90\x5a\xf1\x40\x9f\x6f\x41\xa4\xf8\x65\x0c\x55\x91\x86\xaa\x48\x5b\xda\x50\x15\x69\xa8\x8a\xb4\xa9\x0d\x55\x91\x86\xaa\x48\x3b\xda\x90\x01\x31\xb0\x0d\x19\x10\x43\xdb\x90\x01\x71\x5b\x1b\x32\x20\xae\xb6\x21\x03\xe2\x90\x01\x71\xc8\x80\x38\x64\x40\x5c\x1f\x70\xc8\x80\x38\x64\x40\x0c\x6b\xcf\x6f\x80\xfb\x9f\x91\x01\x71\xa8\x8a\xf4\x22\x4b\x8a\x0c\xf5\x44\x3a\xda\xcb\xa9\x27\x32\x54\x45\x6a\x75\x3e\x54\x45\x1a\x50\xd8\x50\x15\xe9\xb3\xc3\x62\x43\x55\xa4\x0d\x9d\x0f\x55\x91\x86\xaa\x48\x43\x55\xa4\xc1\x26\xd0\xd9\x06\x9b\xc0\x60\x13\x68\xb6\xc1\x26\xb0\xda\x06\x9b\xc0\x60\x13\x18\x6c\x02\x83\x4d\x60\x7d\xc0\xc1\x26\x30\xd8\x04\xc2\xda\x60\x13\x18\xaa\x22\x0d\x55\x91\x86\xaa\x48\xd0\x86\xaa\x48\x43\x55\xa4\xa1\x2a\xd2\xc6\x8f\x41\xd1\x8a\x92\xcd\x36\xc8\x0e\x85\xe5\x8b\xba\x2b\xcb\xc1\x57\x42\xe9\xb2\x4a\x74\x55\xb2\x14\x0e\x0c\x0f\xd3\x30\x06\x4a\xcb\xd2\x59\x05\xa0\xc4\xcc\x15\x2b\x32\xb9\x34\xd4\x76\x44\x6e\x65\x3a\x22\x17\xb7\x37\x77\xac\x5c\xf0\x84\x39\xe8\xfb\xc6\xd2\xf4\xed\xfb\xf6\x71\x59\xf0\x84\x66\x19\x68\x2c\xea\xd9\xe4\x74\xe9\x74\xc9\xf7\x4b\xc2\x3e\x69\x56\x0a\x9a\x11\x2d\x65\x86\xe6\x17\x33\x19\x40\x88\x25\xd3\x25\x67\x0b\x46\x68\x79\xcf\x75\x49\xcb\x25\xc9\x99\xa6\x29\xd5\x74\xfb\xa8\xdf\x2a\xd6\x8c\xd1\xd0\x92\x14\x25\x1b\xe3\x0d\x68\xcd\x03\x60\xf3\x9b\xaf\xdf\xb9\xfb\x4d\xd3\xd4\x05\x24\x38\x08\xbf\xab\xee\xfd\x6e\x9f\x6e\xe7\xb6\x52\xbf\x5b\x6a\x04\xe0\x69\x55\x34\x05\x57\xb8\x67\x5b\x25\xd2\x00\xb6\x24\x8e\x09\xe9\x84\x4f\x26\x16\x4f\x05\xad\x6b\xb1\x68\x6b\xf6\x98\x58\xf0\x52\x0a\xe0\x23\x17\xb4\xe4\xf4\x3e\x63\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x3b\xe0\xe5\xd2\xdb\x19\x30\xd8\x65\xeb\x95\xec\xa6\x67\x1d\x14\xac\xb5\xd2\x6b\xb1\xf8\x8e\xb6\xd5\x0c\x62\xe3\x92\x88\x7d\xc1\x2c\x89\x92\xcb\xee\x05\x05\x31\x9d\x21\xea\xb0\x31\x60\xf8\xad\x2f\x84\x29\xad\x4c\x17\xbb\xe9\x65\x6b\x5b\xde\xd3\xbc\xae\x8c\xb5\x61\x37\x26\xe4\x9d\x15\x8d\x29\xb9\xfc\xcf\x9b\xab\xeb\xf7\x1f\x6f\xde\xde\x5c\x7f\xd8\x8d\x47\x03\xf1\x27\xa0\xa6\x88\xc9\x76\x12\xf5\xef\xdc\x19\x42\xf5\x21\x26\x0c\xe3\xf5\x9b\xb3\xef\x2e\x3e\xfc\xe7\xfb\x8b\x77\xd7\xe7\x20\x52\xb0\x4f\x05\x15\x29\xeb\x62\x11\x2b\xe5\x22\x70\x8a\x92\x2d\xb8\xac\x54\xb6\xf4\x14\x76\xf3\x55\x58\xbd\x03\x06\x3d\x74\x8c\x62\xe8\xa3\xc5\x1e\x9b\x3b\x05\x35\x08\xad\x81\xb3\xb6\xd2\x95\x4c\xc9\x6c\xc1\xd2\x2e\xed\x07\xc4\x42\xba\xed\xa8\xed\xa0\x45\xa5\x9d\x92\xc7\x99\x36\x2b\x91\xcc\xa9\x98\xb1\x74\x42\xae\x64\x65\x46\xfb\xcd\x6f\x60\xcb\x4a\x96\x56\x49\xe7\x8e\xa1\x86\x0e\x05\xda\xdf\x8c\x1c\x03\x60\xc8\xae\xc2\xaa\x66\x2a\xa1\x85\xdb\xd4\xe6\xa9\xa8\xa5\xd0\xf4\xd3\x9b\x90\xfa\x68\x27\xbf\x69\x7c\x78\xe2\xea\xd5\x49\x33\x3d\x64\x96\x70\x45\x19\x94\x1a\xcb\xc8\x49\xf3\xed\xae\xbe\xaf\xcd\xfc\x58\xda\x84\x1d\x8c\x3c\x64\x0b\x56\x82\x72\xc8\x42\xce\x88\x94\x6c\x46\xcb\x34\x63\x0a\x62\xde\x1e\xe7\x0c\x8a\x07\xa2\xa4\x8b\x07\xd5\x31\x16\xf3\x8a\x2c\x21\x3b\x15\x8c\x57\x68\x65\x06\x5c\x7b\xd2\xb1\x8c\x98\x9b\xf7\xb6\x94\x1d\x25\xa8\x5a\xb7\xef\x0e\x82\x6a\xbc\x2d\x7e\x13\xb8\x9e\x5a\x23\xc6\xa4\x89\xe5\x95\xe1\x4e\xa7\xb5\x8d\xdc\x3c\x0f\xb0\x93\x07\xcb\xf2\xe1\xca\xfc\x44\x8a\x29\x9f\xbd\xa3\xc5\x57\x6c\xf9\x81\x4d\x23\xe3\xfb\x90\x31\xb7\xea\x69\x60\x77\x0d\x75\xc0\x0e\xbb\xd9\xca\x03\x86\x73\x85\x98\x4c\xe2\x2c\x1e\xc1\x76\x8e\xb5\xc2\x72\x28\x22\x58\x36\x7e\xef\xcc\x36\x09\x22\x70\x1b\x27\x17\x2c\x10\x36\x29\xa2\x45\x05\xc1\x26\x80\x8f\x35\x47\xca\x15\x61\xd3\x29\x4b\x34\x5f\xb0\xcc\x47\x1a\xdb\xca\x96\x36\xf2\xf7\x9e\x26\x0f\x8f\xb4\x4c\x15\xd4\x4a\xa4\x9a\xdf\xf3\x8c\xeb\x65\x48\x1d\x4a\x6c\x56\xa8\xb1\xc1\xc9\x4e\x6f\x2e\x94\xa6\x80\xbe\x5c\x45\x45\xb3\xc3\xc8\xf6\x53\x67\xb8\xc6\xdb\xe8\xc2\x7a\x83\x87\x83\xda\x7e\x09\x2b\x0d\x81\xcb\x96\xe4\xb1\x94\xe1\xa2\xd9\x3b\x09\xf1\xbc\x53\xf9\x86\xcc\xb5\x2e\xd4\x9b\x57\xaf\x6a\xd1\x69\xc2\xe5\xab\x54\x26\xea\x55\x22\x45\xc2\x0a\xad\x5e\xc9\x85\xa1\x8b\xec\xf1\xd5\xa3\x2c\x1f\xb8\x98\x8d\xcd\x02\xc6\x78\x81\xd4\x2b\x90\x85\x5f\xfd\x1a\xfe\x77\x08\x28\x23\xce\xb7\xe7\x0d\x39\x39\x09\x78\x5f\x16\xc8\xbd\xf7\x80\xcc\x3b\x10\xf0\x97\x2d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x48\x61\xb9\x90\x88\x65\xdf\x4b\x99\x31\xda\xed\x6d\xf5\x14\xcd\x24\x80\x7d\x3c\x56\x0d\xba\x97\x35\xea\xc5\xcb\x65\xaf\x67\x21\xd3\x37\x44\x55\x45\x21\x4b\xad\x6a\xa1\xd1\x00\xc5\xa8\xfd\x27\xa8\x4d\x46\xe4\x47\xff\x10\xbd\xba\xbe\x3f\xfd\xd3\x57\xd7\xff\xf6\xe7\xd3\x1f\x7e\x6c\xfe\xd6\x10\x1f\x1b\x2f\x04\x4c\x53\x15\x2c\x99\x08\x99\xb2\xf7\x30\x03\xf8\xd3\x72\x77\x17\x49\x22\x2b\xa1\xed\x0f\x9a\xea\x4a\x4d\xe6\x52\xe9\x9b\x5b\xff\x67\x21\xd3\xd5\xbf\x02\x6c\x9c\x07\xa4\x2b\xb0\xd7\xb7\x54\x07\x44\xee\x47\x51\x17\x5a\xf0\xef\x58\xa9\x02\x72\x55\x60\x6b\xc1\x8b\xfd\xb2\x59\x0a\x37\xa7\xf0\xcf\xb7\x6e\xba\x06\xf7\x3e\x96\x5c\x6b\x70\x39\xb4\xc9\x02\xe4\x74\xe4\xae\x34\x32\x52\x8b\x2f\xa2\xf4\xaa\xc1\x98\xc3\xef\x5a\x8f\xc5\xc1\xec\xed\xca\xbc\x62\xc3\x3a\x5c\xae\xa9\x03\x2f\x6e\x6f\xc8\x02\x77\xe3\x00\x0b\x79\x0a\x2a\x70\x01\xd8\x6f\x8f\x82\x12\xdc\x68\x6e\xe3\xbc\xfc\xf5\x06\x2d\x4c\x3e\x1c\x9c\x64\x3c\xe7\xd6\xc0\x6f\x0b\x20\x87\xd0\x8e\x33\xfc\x6c\x92\x14\xd5\xc8\x76\x31\xc9\x59\x2e\xcb\xa5\xff\x93\x15\x73\x96\x1b\x89\x63\xac\xb4\x2c\xe9\x8c\x8d\xfc\x00\xf8\x99\xff\x0b\x3f\x6c\x4d\x61\xfd\x6b\x14\x54\x93\xaa\x34\xbc\x47\xb6\x74\x28\x2e\x44\x7b\x79\x40\x74\x10\x5c\x5c\x3a\x0e\x1b\xf8\xe3\x7a\xdf\x8f\xb1\x3b\xf5\x2a\x1a\x64\x0d\xfd\xaa\x40\x52\x59\xc8\xac\xca\x99\x1a\x79\x02\x8d\xa2\xa8\x58\x18\x99\x45\x9d\x1e\x02\x01\xa4\x7c\xc1\x55\x2f\xff\xd0\x3b\x6f\x67\x03\xa3\x54\xa5\x8d\x90\x8e\x49\x86\x1a\xd5\xcb\xa5\x02\x21\xd5\xe7\x38\x68\x61\xb5\x2f\x42\x98\x15\x42\x0a\xaa\x35\x2b\xc5\x1b\xf2\x1f\x67\xff\xfe\xbb\x9f\xc7\xe7\x7f\x39\x3b\xfb\xfe\xf5\xf8\x7f\xff\xf0\xbb\xb3\x7f\x9f\xc0\x3f\x7e\x7b\xfe\x97\xf3\x9f\xdd\x1f\xbf\x3b\x3f\x3f\x3b\xfb\xfe\xab\x77\x7f\xfd\x78\x7b\xfd\x03\x3f\xff\xf9\x7b\x51\xe5\x0f\xf8\xd7\xcf\x67\xdf\xb3\xeb\x1f\x02\x3b\x39\x3f\xff\xcb\x6f\x82\xa6\x47\xc5\xf2\x9b\x00\xac\x81\x6d\xdc\x23\x73\x53\xfd\x55\x5f\x93\x16\x17\x7a\x2c\xcb\x31\x7e\xfe\x86\xe8\xb2\x0a\xe1\xa2\xdd\xb1\xf5\x81\x73\x57\xfa\xf9\x4d\x8d\xf1\x3c\x75\x38\x00\x20\x3f\x85\x00\x28\x96\x94\x4c\xef\x4b\xca\xc6\xde\x1c\x01\x5c\x31\x8e\x0e\x82\x77\x2d\x78\xfb\x84\x33\xb0\x5f\x35\xeb\x30\x2d\x65\x3e\x21\x0d\x4d\xee\x02\x1c\xe1\xec\x7b\x0f\x2c\x30\x62\x61\x10\xd4\x07\x41\x7d\x10\xd4\xdb\x82\xfa\x1d\xde\xa1\x17\x2e\xa5\x33\xb1\xd8\xa5\xec\x8d\x30\x09\xbe\x85\xec\x71\x4d\xb3\xa0\x63\xae\xb5\x24\x85\x2c\xaa\x8c\xea\x2d\xa6\x8c\x08\x1b\xa1\x8f\xa0\x73\x06\x17\x03\x52\x60\x8f\xb3\x84\x2f\xdf\x6c\x94\x22\x17\x59\x46\xb8\x40\xf4\x66\x3a\xd8\x3a\x82\xb3\x79\x94\x0c\x39\x6b\x42\xd1\x20\xb8\x30\x53\x7e\xb4\x39\xef\x1a\xa6\x1c\xae\x8c\x60\x5e\x6a\x2e\x66\x13\xcc\x89\x87\x04\xca\x2a\xf2\xb9\xf0\x99\xf1\xb6\x0e\xe9\x19\x36\xef\x11\xb7\x96\x0c\x13\xfd\x2d\x94\x76\xcb\x84\x59\x6a\xfa\x00\x46\xa8\x84\xa5\x4c\x24\x3b\x4c\x24\xdf\xa1\x97\x9d\xdb\xb3\x7b\x23\x66\x80\x19\x17\x31\x0a\x49\xab\x22\xe3\x89\x39\x1f\x33\xf3\xb8\xbe\x6f\xf2\xbc\xd2\x60\x10\x3c\x96\xb5\xd6\x40\x9a\x35\x39\x34\x8c\xb6\x40\xdf\xbc\xb8\xe7\x3d\xc2\xbd\xbe\x0c\x6c\x2a\x78\x29\xb7\x1f\x7e\x10\x4b\x10\x46\xb8\xbd\x49\xa1\x93\xd3\x59\xa3\xd8\xb5\x8e\xaf\x4d\xa9\x8f\x6d\x15\x09\xa3\xd3\xf1\x34\xba\x2f\x7d\x3e\x26\x6d\x3e\x22\x5d\xee\x4f\x93\x9f\x8f\x1e\x47\xd1\xe2\x70\x3a\x1c\x4e\x83\x23\x14\xe5\xb1\x74\x37\x9c\xe6\xf6\x95\x84\x8a\x92\x4d\xf9\xa7\x08\xac\xf0\x8d\xd3\x51\x68\xf6\x49\x5b\x9f\xa6\x82\x09\xef\x01\x2b\xec\x8d\x02\xe7\xa5\xa3\x7b\x6b\xa0\xb8\x10\x8f\xe7\xee\x36\x89\x23\x03\x92\x1b\x90\x5c\xab\x0d\x48\xae\x53\xc8\x78\x49\x18\x4e\xc8\xb4\x33\x12\x3e\xf4\x36\xbd\x6f\xf4\xb5\x12\x20\x8b\x4e\x44\x6e\xe1\xba\xac\x6a\xff\x93\x42\x02\x44\x4f\xb9\xae\xbd\x9c\xb7\x03\xda\xdd\x86\x1e\xc1\x7d\xd9\x7e\x79\xaa\x5c\xa2\x87\x95\xfe\x57\x72\x8e\xa3\x3f\xe9\xee\xb1\x22\x41\x19\x59\xc8\x0a\x13\x62\xbc\xa2\x4a\xf1\x99\x18\x17\x32\x1d\x9b\x51\x5e\xed\x64\xb7\x8f\xe9\x52\xea\x35\xce\x4f\x3d\xee\x0f\xde\x1e\xd3\xe0\xeb\x0d\x5a\xab\x34\x6b\x18\x6b\xbc\x1a\xdf\xe5\x19\x08\x90\x1b\x3b\xa5\x94\x27\x1e\x4e\x4e\x05\x9d\xb1\xb1\x9d\xec\xd8\x4f\x76\xec\xe7\xf6\x84\xf3\x0a\x21\x66\x49\x46\xf9\xee\xa0\x8d\x18\x12\x76\x09\xbd\xd9\xe4\xed\x3e\xaa\x66\x25\x85\xb2\x13\x27\xb9\x40\x83\xb6\xfb\x09\x3f\xde\x6d\x16\x87\xcb\xe2\xb3\xe0\x6c\x38\xc8\x9d\x5f\x03\x8d\xb4\x71\xa9\x59\x31\x77\xc6\x7f\x67\x3b\xe3\x25\x53\x84\x09\x7a\x9f\x59\xa7\xc2\x9d\x9d\x5d\x2d\x05\xcd\x79\xe2\x80\xef\x22\x83\xc0\x09\x2e\x05\x99\x32\xaa\xab\x92\x91\x19\xd5\x2c\x64\x46\x9e\x6a\x73\x0f\x6d\xe4\x46\x93\x84\x0a\xb4\x37\x5a\xaf\x77\x83\x47\xfc\x4a\x77\x1a\xf2\xc3\x02\x77\x02\xc2\x75\x5a\x67\xff\xa1\x79\x4e\x4d\xa7\x46\x29\x18\x61\x42\x97\x90\xc5\xec\x56\xa6\x86\xe2\x4c\x5a\x6f\x77\xb8\x1d\x04\xb3\x67\xa1\xda\xf4\x0e\xc7\x67\xf2\x72\x38\xbd\x06\xdd\x68\x32\xe4\xad\x2d\x2d\x64\x3a\xd9\x70\x53\xc2\xd3\xd3\xdf\xca\xd4\xc6\xf7\xe8\x16\xbc\x99\x4b\x04\xa0\x96\xd3\x07\x17\x75\xe3\x4d\x41\x74\x41\x79\x16\xe0\x79\x4a\x20\x9d\x94\xe2\xa9\x91\x11\x02\x50\xaa\x9f\x58\x38\x97\x64\x0d\xdb\x87\x38\x84\x0f\xd8\xb5\x4b\xa2\x00\xfb\x9f\xcc\xa5\x62\x02\xee\x1b\x75\x63\xfb\x22\x30\x0e\xec\x53\x44\x9d\x21\x9c\xe8\xcd\x14\xb9\xdf\x11\x61\x0b\x56\x2e\x35\x94\x62\x70\x09\xbb\xb0\x1b\x33\x7e\x4e\xd3\xc6\xae\x8f\x88\x34\xec\xda\x23\x57\x21\x07\x00\x78\x02\xe7\xa7\xaa\x4c\x7b\x16\xdc\xce\x7e\x6f\xa7\xb1\x1e\x9c\x64\x98\xbb\x87\xce\x4c\x6c\x9d\x17\x72\x5b\xd4\x53\x4e\x8b\xad\x5f\xa1\xaf\xc4\xbe\x68\xd7\xd7\xe8\xcb\x81\x9f\xdc\x5b\x93\x79\x4e\x3f\xf1\xbc\xca\x09\xcd\x65\x85\xd1\xce\xeb\x7c\x45\x50\x20\xd8\x3e\xb8\x84\x0d\xdc\x81\xda\xc6\x1e\x90\x70\xb4\x1a\x1f\xae\xfc\x42\x8d\xfd\x41\x46\xfe\x38\xe3\x7e\x84\x51\xbf\xb7\x31\xdf\xb9\xed\xec\x0b\x90\x2d\x4a\x5b\x03\x65\x2e\x3a\x41\xd9\xd1\xd7\xdd\xb0\x7c\x33\xad\xc7\xe0\x8a\xc8\x9c\x6b\x6d\xbd\x63\x1a\x14\x60\x44\xb8\x6e\xb9\x92\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x91\xf1\x84\x83\x47\x92\xf3\x42\xdb\xcd\xff\x79\x9c\x68\xd3\x10\xf0\xbc\xc0\x44\x04\x70\x51\xc6\x8e\xb5\xb4\x31\x03\x7e\x96\x36\xc8\x85\x7d\x4a\x18\x4b\xed\x44\x86\xfb\x3a\xdc\xd7\xe8\xfb\xaa\xf6\xa4\xa1\x68\x6a\x27\xea\x98\x68\xaf\xa5\x30\x57\x09\xe2\x95\x51\x5f\xe0\xa0\x6b\xd7\xc5\xbc\x76\x19\x33\x3f\x30\x30\xca\xdd\x31\xad\x6c\xf4\x35\xf4\xb4\x4b\xdd\xb6\x96\x81\xcf\x67\xd9\x74\xa9\x0c\x28\xe8\x13\x1b\x6f\xd4\xb1\xab\x3b\x84\x67\xbd\xca\xde\x82\x0a\x84\xe5\x45\x46\x75\xad\x20\x79\x42\x90\x6b\x08\x13\x1f\x93\xa4\xee\x79\xd3\xd2\x1d\x46\x6c\xeb\x64\x83\x9f\x31\xbd\x5c\xdf\x84\x72\x07\x10\x18\xbb\x5d\xaf\x02\x13\xc3\x85\x0b\x96\x41\xbe\x59\x87\x4e\xf7\x16\x21\x86\x85\xa7\x74\x8b\x97\xc3\x0e\x9c\xb6\xed\x50\x89\xda\x22\x76\x2f\x34\x19\x5b\xfc\xde\x1d\x29\xe1\xda\xd1\x53\xac\x1d\x33\xa9\x5a\x54\x1a\xb5\x98\xc4\x38\xc1\x49\x71\xfa\xfb\xd2\xc6\x24\xc3\xe9\xf9\x61\x60\xca\xb3\x18\xd8\x3d\x72\x5a\xb3\x23\x27\x32\x7b\x8e\xd4\x65\x07\x93\x1f\x02\x40\x33\xde\xe0\xa7\x65\x66\x73\xb6\x87\x19\x80\x3e\xd6\xef\xc3\x76\xd4\xae\xdb\x8d\x9e\x8e\xe3\x4c\xb6\x13\xb2\x3f\x3a\x3e\xd7\x60\xa7\x7a\xd2\x00\xe3\x5a\xd3\x64\x6e\x13\x90\xe1\x2f\x06\x12\xc4\x92\x18\x20\xd0\x48\xc9\x6d\x0e\xa4\x5d\xe7\x3c\x67\x44\x97\x50\x34\xf7\x4f\xfe\x42\x8c\xd0\xe4\xff\xe7\x46\x9e\x09\x5f\xf6\xd5\x03\xe3\x9f\xdc\xbf\xfe\xfc\xc4\xec\x23\x61\x4c\x0e\x4e\x69\x9f\xbc\xea\x35\xf4\x48\xb8\x48\xc1\xef\x10\x59\x21\xdc\x3c\x1c\xcc\x6c\x2d\xac\x7b\x62\x33\x37\x61\x1a\x34\x6b\x99\x05\x07\xc5\xfa\xe5\x4e\xd6\x01\xfc\x32\x6b\xd5\x84\x77\x7c\xf0\x77\x98\x91\xf7\xd2\xd6\xcf\x66\x23\x72\x0b\xda\xe1\xfa\x09\xdc\xf9\xf7\x12\x2b\x69\x77\xa4\xa2\x08\x44\xff\x9d\x3c\x63\xdc\x7e\x7e\x55\x33\x94\xb8\x31\x2d\x86\xb2\xbe\x58\x4d\x96\x72\xe7\xc6\x3e\xb0\x65\xe7\xae\x5a\x26\xc1\x32\xb3\x56\x35\xee\x61\xd4\x11\x79\xe4\x1b\xfe\x8f\xb3\xf0\xe5\xf7\x5c\xe0\x54\x70\x60\x77\xce\x30\xb6\x3b\x0f\x23\x81\x64\x59\xc0\x24\x02\x77\x3b\x8c\xe3\x8d\xdb\xf2\x6f\x22\x38\x5d\x4f\x2f\xba\xb6\x74\x13\x7f\xdb\x60\x6a\xaf\x7f\xaa\x68\x36\x69\xe5\xfd\xc0\x47\x5d\xd7\xcd\x3a\x23\xaf\xd2\xcd\x47\x9e\xa5\x09\x2d\x6d\x44\x1c\xa0\x1f\xa2\xa4\xb5\xce\x02\xf6\x4b\x3a\xdd\xce\x1d\x02\xac\x81\x47\xa1\x07\x6e\x41\x4b\xcd\x93\x2a\xa3\x25\x31\x77\x7c\x26\xcb\xa0\xc4\x1e\x9d\x87\x59\x43\xf3\x1d\x4b\xa4\x48\xf7\x2a\x44\x7f\x5c\xed\x7c\xd5\xc7\xb8\x60\x25\xb7\x25\x9c\x79\xce\x56\xaf\xd7\x59\xcb\x2f\xa5\x4b\x0e\x9b\x3a\x64\xe7\x71\xcb\xa8\xa9\x19\x6d\xdb\x94\xb1\xbc\xc8\x79\x83\xe0\xf8\xdb\x3e\x21\x5f\x2e\x9d\x8a\xb6\x8b\x21\xe7\xda\xa5\x5a\x51\x4c\xbb\x64\x3c\xee\x2a\xda\x93\xac\xd1\xc8\x54\x96\x90\xe4\xe6\x2c\x95\x98\x9e\x65\xc1\x13\x7d\x3e\x21\xff\x1f\x2b\x65\x40\x16\x23\xc1\x66\x58\x73\xdc\x5e\x6c\xaf\x8f\x2a\x19\xb5\xbe\xf5\xaf\xc9\x19\x96\xa1\xe7\x79\xce\x52\x4e\x35\xcb\x96\xe7\xa8\x9e\x62\xb6\x90\x7d\x08\xd4\x84\xa8\x15\x31\x60\x12\xde\xfd\xe7\x3f\xec\x78\xf3\x00\xd9\xa7\x6c\x86\x9b\x7a\x63\xd1\x81\x6e\x05\x7a\x7c\xda\xc4\x4e\x79\x7f\xab\x7c\xd6\x0c\x22\xa8\x13\x57\x3a\xdc\xec\x61\xeb\xef\x06\x40\x29\x29\xd9\x0c\xee\x27\xde\xb9\x27\xde\x4e\x8c\xa8\x7d\x27\x2b\xb1\xdd\x06\xd2\xda\xb7\xaf\xad\x0a\xee\xbb\xc6\x87\xb1\x69\xe3\xf6\xcb\x10\x36\x66\xd2\xb0\xba\x50\x02\xa6\x16\xe0\xc0\x0c\x62\xc3\xb7\xea\xd0\x93\x00\x63\xf9\x1e\x53\xc1\xc1\x5c\x3a\x92\x2f\xec\x25\x61\x9c\x1f\x68\x9f\x57\x01\x12\x19\xd8\x9d\x5b\xc9\x89\xe6\x4a\x6e\x01\x00\xe3\x16\xd7\x10\x0c\x93\x61\xa9\x0d\x56\xec\x42\x3b\xd2\x6b\x37\xc9\xe9\x9b\xd3\xbd\x50\x1d\xdc\x8d\x52\x16\x74\x06\x97\x75\x9f\x9b\xb2\xda\x37\x49\x99\x66\x65\xce\x05\x53\x64\x2e\x1f\xf1\x77\x64\x06\x0a\xfb\x16\x4b\x6b\xcf\x83\xb9\xec\xdc\x11\x2c\xaf\x55\x67\x9f\x43\xec\x01\x7e\xa4\x8f\x74\x49\x68\x29\x2b\xd1\x99\x44\x00\xb8\x68\x4f\x39\xde\xad\x4c\xfa\xbd\x14\xcc\x3b\xa3\x74\x51\xd9\x16\x69\xbb\x67\x9a\x9a\x0b\xff\xc5\xe4\x8b\xd7\x41\x73\xf8\xc0\x92\xaa\x54\x7c\xc1\x3e\x30\x9a\x7e\x63\x24\x6e\xae\x00\x6b\x68\x49\x6e\xa6\xb7\x52\x29\x7e\x9f\x31\x22\x4b\x60\x90\x04\xbd\xcf\x0c\xd3\xbf\x3a\x61\xcf\xa1\xc2\xcc\x65\x49\x2a\xe1\x45\x84\x8e\x59\x58\x32\xdf\xb4\x8a\x9a\x4e\xce\xf7\x02\x69\x91\x89\x1a\x61\x2f\x57\xec\x33\xce\xf9\xdc\xe1\xaa\xbd\xcc\xab\xb4\x9b\xbd\x4f\xc8\x7f\x87\xd7\x1a\xfa\x1e\x83\xee\x84\x4f\xc1\x6a\x37\xc2\x47\x8f\x25\xd7\xac\x41\xb7\xce\xa6\x34\x53\xab\x87\xd5\xb1\xed\xed\x3c\x79\xd0\x41\xc8\x7e\x74\xbb\x47\x97\xab\x60\xb8\xcf\x9d\x59\x87\xf1\x3a\xd9\xba\x73\x01\xaf\x77\xcd\x62\x88\x1a\x5f\xce\xa9\x48\xb3\x4e\x38\xf6\x2b\xc8\x96\x1d\x0e\x8e\xd6\x5b\xa0\xbe\x6e\xb0\x8f\xa3\x26\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf5\x37\xac\x71\x58\xb1\xe3\x20\x30\x20\xca\x6a\x22\x0d\x7b\xdd\xaf\xb8\xb2\xd7\x1b\x34\x25\x40\xb9\x2d\x7f\x9b\xd3\xce\xec\xd6\x8d\xf5\xd7\x9b\x39\xb1\xec\xd5\x86\xd1\x6a\xe4\xb2\x32\x5e\xdf\xb1\x46\x06\xde\x91\x25\xf7\xb9\x5c\x1c\xf3\x5b\x23\xec\xd2\x70\x1f\x39\xab\x27\xd6\x31\xd4\xea\xb4\x3d\x0a\x5c\x9b\xf3\xe6\x59\xf9\x49\x75\x8c\xd3\x3d\xe5\xb6\x3c\x83\x0a\x35\xcc\x9d\x69\x2b\x0a\x6a\x8a\x41\xb6\x01\x09\x51\x09\x2b\x4b\x59\x7a\x19\x62\xc6\x04\x48\x2b\xa0\x85\x73\x8a\x24\xeb\x3b\x47\x95\x14\x21\x80\xd6\x71\xc8\x06\xcf\x74\x93\x0f\xfc\xac\x63\x30\xa0\x31\x67\xb2\x5c\xb9\x0d\x4e\x00\xdb\x40\x49\x62\x67\x0f\x84\xb9\xee\x17\x81\xaa\x21\x68\x99\x0d\xac\x85\x7f\x39\xf5\x57\x67\x3f\x31\x60\xd5\xfd\xa1\x59\x45\xcb\x13\x02\xdb\x53\x73\x8a\x1e\xe4\x4e\xd5\x76\xae\x31\x82\x3e\x9c\x9c\x90\x33\xec\xe7\x54\x91\x52\x4a\xbd\x1f\xa2\x6e\xf7\xe7\xfa\x53\xb1\x57\x25\xd4\xb5\xcd\x3c\x4b\x8a\xa3\x6d\xd6\x97\x6c\x4e\x17\x4c\x11\xc5\x73\x9e\xd1\x32\x83\xb4\x9e\x77\xb8\x3c\x88\x4c\xdb\x98\x3b\x3b\x20\xef\x72\x43\xe3\xdd\x9c\x67\xa3\xbb\x43\x9e\x23\x71\x6b\x30\x47\x04\xf4\xc6\xad\x09\xea\xe6\x56\xba\xa2\x59\xb6\x24\xec\x53\x92\x55\x06\x5f\xee\x45\x58\xee\x23\x27\xaf\x8a\xc8\x85\x75\xd4\x3f\xa2\x80\xdc\x56\x79\x1a\x7e\x35\x75\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\x49\x98\x52\x2e\xf3\xc0\xb2\x99\x3d\xc1\xaf\xe1\x73\x49\xa3\x4e\x1f\xd5\x75\x46\x95\xe6\xc9\x97\x99\x4c\x1e\xee\xb4\x2c\xf7\xaa\x2b\xda\xd4\xff\x4a\x72\xfa\x8b\xbf\xdd\x19\xe4\xfd\xd0\x48\xf7\x64\x1d\x31\x9b\x86\x29\xda\x31\xd0\x43\x75\xcf\x32\xa6\x4f\x15\xc8\x8f\x24\xa7\xc9\x1c\x4b\x24\x80\x70\x28\x7c\x42\x31\xab\xbe\xde\x79\x44\xd8\xae\xcc\x2c\xa1\xe8\xc8\x1b\x33\xc7\xf5\x65\xa0\xbf\x99\x7d\x07\x73\x72\xa0\x06\x0b\x8c\x81\x75\x2d\xe7\xb1\x2e\x59\x17\x3b\xb5\x71\x9f\x20\x52\xd5\x26\x26\xe7\x25\x7a\xba\xd9\xf9\xb3\x7b\x35\x49\x14\x9f\xd0\x47\x35\x49\x64\x4e\x2e\xef\x6e\x48\x5a\xf2\x45\x77\x88\x43\xa4\x0b\xa9\x4d\xd5\xf7\xca\xde\xf0\x5f\xd3\x47\xc5\x70\xa2\xf7\x66\xa2\x50\xde\x22\x00\x77\xec\xd5\x29\x0a\xe7\x72\x73\xb5\xf3\xc5\x70\x87\xa7\xa9\xfa\x68\xe6\xd8\xf1\x56\x1f\x17\x18\xec\xd9\xa9\x4a\xa7\x3c\x63\xa8\x02\xc6\x93\xb5\xe1\xd4\x16\xd5\x00\xd0\x2f\x65\x45\x1e\x29\x5a\x33\x80\x80\x05\xc5\x58\xf3\xe2\x0d\xb9\x16\xaa\x2a\x59\x6d\x24\x5b\x1d\x6c\x13\x4b\x0e\x37\xc5\x82\xac\x98\x05\xa9\xa7\xb1\x5d\x7f\xa2\x79\x91\x31\xf5\x86\x9c\xb0\x4f\xfa\x0f\x27\x23\x72\xf2\x69\xaa\xcc\xff\x84\x9e\xaa\x93\x09\xb9\xc9\xbd\x0b\x35\x17\x53\x56\x96\x3e\x2c\x1b\x3f\x30\x2c\x79\x4b\x8a\xea\x1e\xf3\xd8\x70\x4b\xe2\x9c\x5f\xc0\x3c\xd4\xad\x49\x23\xbd\xe0\xc8\x77\xee\x40\xa9\xf1\x40\xec\x07\x88\x6e\xa6\xce\x63\x1e\xe5\x2a\x57\xf2\x9d\x2b\xdf\x8d\x01\x1b\x3b\x8e\xa1\x3c\x71\x80\xf2\xd6\x27\xa9\x24\xaf\x52\xb6\x78\xa5\x52\xfa\xc5\x08\xa6\xaa\x6c\x24\x78\x7b\x5d\x54\x91\x93\xb0\xcc\xb5\x77\x8e\x73\x1b\x35\x77\xa2\xee\xc9\x20\x62\x37\x24\xf8\xbd\xbc\x3e\x01\xd1\xc5\x8c\x9d\x50\x41\x32\x46\x17\x56\x9c\x43\x94\xb1\x44\x03\x43\x27\x87\x15\x63\xac\x21\x6d\x83\xcd\x3f\xfd\xbe\x53\xbc\x0e\xd1\xc1\x90\x5e\xd0\xe4\xfa\x76\x56\x9b\xb2\xb2\x19\x98\xa6\xb2\x4c\xbc\xcc\x69\xb5\x34\x4c\x03\x6e\xe0\xa2\x65\xd7\x78\xd9\x17\x36\x2c\xc1\x98\xa3\x22\x07\xf1\x7d\xb4\x7d\x83\x06\x59\xf0\x9f\x2a\x46\x6e\xae\x7c\x3a\x6f\x56\x2a\xae\xb4\x11\x28\xd2\x16\xdf\xc3\x91\x19\x3a\xbb\xc8\xe9\x3f\xa4\x20\xd7\x5f\xde\xd9\x8e\x02\x40\xf1\x45\x23\x48\xfa\x8f\xaa\x64\x86\xc7\xdb\x2b\x6b\xe9\x3a\x5d\xe5\x27\xcd\x73\x72\x45\x35\x45\xb6\xd2\x06\x16\x89\x9a\xe4\x19\xa6\xf0\x9e\x8b\xd4\xfe\xd4\x93\x25\xf4\xc3\x47\xf1\x81\x8d\x69\x9b\xcd\xeb\x5a\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x28\xfe\xef\x00\xdc\x98\x99\xcd\xfb\xae\xb8\x66\xf7\xe2\xb7\x1f\x6e\xf6\xc4\xb5\x25\xc0\xe1\xcf\xde\xc9\x34\x96\x75\x3b\x6d\x7c\xea\x08\xea\xbf\x1a\xb8\xb8\xc4\xe7\x24\x37\x7d\x82\xe2\x6a\x04\xca\x5b\xf2\x0d\xe8\x36\xe1\x9f\x7f\x2b\xb9\x66\x93\xee\x3c\xb4\x11\xac\x83\xdb\xc0\xc8\x65\xb8\xcf\xdc\x12\x9a\x29\x7a\x52\x03\xfd\x80\x5c\x2c\x7f\x70\x9f\xc9\x7b\x62\xaf\xfc\xbe\xe7\xfe\xed\x87\x9b\x1e\x53\xff\xf6\xc3\x8d\x9b\xb9\xf9\xa7\x9c\x1e\x6f\xd2\xc7\x60\xf8\xdf\xae\xf0\xdf\x31\xbc\x58\x9d\xdc\x6a\x95\x8b\xdf\x27\x0b\x3f\x39\x1a\xf3\xde\x2f\xf3\x90\x19\xab\x4b\xe8\xe7\x22\x20\x85\x71\xfb\xf2\x9b\x6f\x08\xfb\x54\x20\x46\x6d\xb8\x4c\xde\xcd\x29\x64\x9d\x76\x09\x2e\x11\xfc\x0c\x3c\x2a\x43\xb2\x1d\x20\x12\x8a\x25\x2e\x0c\x35\x40\x2d\x7d\xfa\xc6\x39\x82\xfb\x2f\x36\x7f\xf0\x0e\x02\x30\xd3\x37\x48\x03\x08\xc6\x63\xa6\x0d\xb8\x3f\x43\x73\x85\xf0\x3f\xd9\xb8\x7b\x4c\x82\xa5\x98\x3e\x9f\xb4\x74\xeb\x0a\xa6\xbc\x57\x64\x74\x14\xc6\x73\xcd\x82\x49\xce\xcc\x6f\xaf\xc0\x3e\x7a\x3e\xa9\x2d\x66\x90\x1d\xa2\xe6\x4d\x03\xc6\x30\x97\xe2\xc3\x93\xb9\xd7\xb8\x44\xb5\x1e\x64\x61\x2d\x5d\x7c\x90\xc1\x0c\x7b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\x3b\x3d\x24\x2b\x04\x03\xf5\x60\x85\xe0\xbb\xde\xac\x90\x41\x90\x2f\x87\x15\xc2\xd4\x81\x41\xcc\x10\x5c\xdd\xce\x37\xc3\xd9\xa1\xa3\xdc\xdb\xf4\x97\x74\x6f\xeb\xc3\x8a\xdc\xb3\xfa\x43\xc7\xc0\xf8\x04\x39\x2e\x25\x7d\x2b\x20\x15\x2f\xe2\x9d\xa5\x06\xb6\x42\x12\xb2\x6b\xe6\xfa\x7d\x15\x90\x5d\x3f\x02\x81\x7b\xc0\x8a\x5d\x95\xfb\xce\x2d\x0a\x89\x14\x3c\x26\x01\x20\x1d\x3c\xc9\x84\x15\xf3\xe9\x5e\xbd\x9c\x4d\x8f\x6f\xef\xda\x66\x9c\x4b\x56\xcc\xc9\xdb\xbb\x0d\x28\x0f\x0e\x07\x96\xa5\xd0\xb8\x73\xaa\x48\xc6\xa7\x0c\x7c\x12\x22\xb0\xde\x25\x8e\xda\x42\x79\xde\x19\xcd\xa1\x38\x5c\xac\x57\xc1\x0a\x49\x32\x29\x66\x86\x39\x08\xab\x75\x73\x00\x24\x95\x4b\xc1\xb5\x2c\x77\x7b\x43\x84\x23\x1e\xd7\xdd\x21\x10\x8f\xeb\xdb\x6c\x5d\x5d\x16\xe4\x5d\xe3\x29\x25\x89\xcc\x32\x96\x68\x5b\x2b\x0b\x8e\x3d\x68\x85\xd8\x36\x28\x4d\x98\xd5\x59\x4e\x1e\xfe\x08\x6a\x13\xab\x20\x79\x85\x47\xf9\xea\xc3\xf5\xc5\xd5\xbb\xeb\x49\x9e\xfe\x7a\x2e\x1f\xc7\x5a\x8e\x2b\xc5\xc6\xbc\xbb\xe4\xc6\x67\x1c\x9d\x49\x30\x59\x47\x40\xa5\xaf\x36\xab\x5d\xd8\x22\x65\x2e\xdf\xef\x1b\xf2\xad\x42\xef\x0d\xef\xb9\xc3\x52\xb0\x66\x8f\x48\x49\x6d\x1a\x50\x8a\x57\x75\x5a\x65\x19\x9e\xa6\xb9\x47\xa3\xa6\x3e\xfa\xd5\xe7\xc7\xf0\xb6\x36\xe1\xc5\x73\xbf\xc7\xbf\x16\x31\x14\xbb\x9b\x7f\x26\xbd\x0e\xab\xee\xbd\x7d\x5c\x77\xad\xe7\x68\xa5\xd0\x73\x73\x78\x0f\x6c\x49\x20\xa8\xdb\x30\xb6\xdf\x2a\x56\xb6\xc1\x94\xe9\x04\x76\xe7\x55\xa5\x58\x39\xc1\xee\x5f\xe0\xde\x87\x71\x15\x61\x49\xb1\xc9\x13\x76\xfe\x03\x9b\x6e\xda\x78\xfb\xb8\x2e\xed\x6d\x39\x7f\x5a\xe9\x39\x13\x9a\xdb\xec\x96\x96\xf3\xda\x78\x12\x01\x55\x98\xb1\x1d\x7b\xeb\x03\xab\x35\xc5\xd5\x56\x1a\xea\x11\xd5\x6d\xa8\x47\xf4\x32\xea\x11\x3d\xa5\xc8\x9a\xc1\x9e\x87\xc0\x3a\xa6\x5f\x48\x14\xd7\xe4\x4e\x7c\xea\xab\x92\xa6\x52\xe1\x3b\x58\x67\xb7\x81\x4f\x68\x9a\xf3\x6e\xad\xd0\x0b\xc4\xe4\x09\x17\x69\xd7\x66\x46\x8a\x5e\xd0\x63\x5b\xf4\xb2\xcf\xac\x21\xde\x3b\x71\x51\xa7\x65\xc2\x04\xe3\xd6\x61\xab\xed\xaf\x15\x25\x7f\xe1\x30\x71\x2a\x27\x3b\xb7\xde\xfa\x26\xfc\x1e\x34\x4e\xb2\x60\x06\x91\x24\x0f\x13\x59\xce\x9e\xe6\x80\xb5\x0a\x15\xf9\x52\xfd\x94\x8d\x71\xac\x71\x91\xd6\x60\x71\x6c\x59\xf1\x17\xe2\x69\xf5\xf2\x8c\x2f\x2f\xc2\x7f\x6a\x3f\x60\x47\x5e\xa0\xbc\xf5\xe2\x15\x95\x47\x39\x8f\x18\xa9\xea\x18\xac\x7d\x4d\x69\x0b\xc9\x6d\x74\xb4\x2f\x7b\x8a\x78\xcb\x69\x4d\xcd\xa6\x16\xb4\xa4\x39\xd3\xac\xc4\x28\x4c\x1b\xf5\x29\x42\x38\x66\x08\x11\xfd\xa6\x60\xe2\x0e\x10\xf4\xc0\x8e\x6f\x6e\x03\x3b\xbe\xa3\x0d\xec\xf8\xc6\x76\x14\xb7\x39\x77\xdf\x79\x6a\x44\x7c\xeb\x1c\x5a\xc7\x64\x58\x2e\xec\x65\x60\xd9\x6e\xae\xdb\xd5\x6e\x8b\x60\xbc\xfd\x37\x2b\xac\x75\x5d\x4b\x11\xad\x18\x10\xed\xe4\xeb\x91\xc2\xed\xc1\x6d\xda\x0f\xa7\x18\x8e\xea\x2c\xf8\xf5\x70\xc7\x0a\x82\x8c\x46\xf7\x6d\x4a\x92\x9b\x27\xf7\x5c\xd7\x34\x42\x31\x4d\x0a\x56\xe6\xdc\xe6\xc7\x95\x82\x24\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\xa2\xf8\x41\x41\x64\xa2\xa9\xcd\xea\x44\xee\x99\x7e\x64\x4c\x90\xd7\xaf\x5f\xbf\x06\xd1\xe6\xf5\xbf\xfc\xcb\xbf\x10\xc8\x35\x9e\xb2\x84\xe7\xeb\x2f\xc2\x5b\xff\xeb\x8b\x2f\x42\x06\xfd\xb7\x8b\x77\x5f\x43\x9c\x51\xa1\x15\xb9\x97\x7a\x6e\xc7\x36\x5d\xb4\xba\x57\x23\xf2\x7f\xef\xbe\x79\x5f\x17\x8a\x69\xff\x0a\xf2\x8f\xdf\xa2\x90\x91\x9b\xca\xe9\xd7\xff\xfc\x87\x3f\x04\x7d\x03\x42\x92\x2c\x21\x98\xbb\x0e\xda\x2b\x5c\xb8\x99\x90\x7a\x3d\x55\xb3\x65\x9d\x82\x8b\xc8\xe5\x7c\x36\x87\x83\x30\xf7\x5f\x8a\x69\xc6\x13\x8d\x44\x02\x13\x3f\x20\x48\xd8\x72\x21\xd4\x66\x5d\xb3\xb2\x40\x90\xa9\x29\x65\x23\x92\xf1\x07\x46\xa6\xea\xaf\xa5\xac\x8a\x3a\x37\xa2\xad\x5e\x91\x50\x61\xc6\xc7\xe1\x6a\xb8\x53\x2c\x38\x23\xeb\x21\x3c\xc5\x03\x6d\x45\xf1\x57\x0e\x3a\x5e\x11\x34\x46\x58\x93\xf1\x81\x2d\xc7\x08\xdd\x05\xe5\x3e\xec\x0d\x5c\x6e\x91\x9b\x68\xf3\x23\x49\x50\x79\xe8\xba\xc4\xa5\x8b\x89\x2e\x4a\xf9\x77\x04\x1a\x2e\x5c\xda\x31\xab\x54\x50\x56\x3e\xb3\xb9\x30\x45\x6d\xb7\x0e\x18\xc9\xe5\x74\x36\xbc\xa6\xcd\x26\x5d\xa7\x34\x23\x37\xd3\x66\xe0\x31\x24\x35\xe6\xca\x4c\x02\x2a\x35\xdb\xb9\x05\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x12\x6b\xfd\x63\x38\x79\xd0\x18\x40\x1a\x60\xd2\xd4\xa5\xae\xab\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x38\xe7\xad\x8d\xb0\x65\xba\xb2\x47\x84\x11\xec\x95\xc8\x98\x52\x36\x42\x3b\xa7\xe5\x03\x4b\x3d\x7e\x9e\x40\xd8\xb3\x0a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x9c\x2e\x5b\xd9\x6f\xcc\x34\x4e\x27\x93\x53\x44\x2d\xb2\xc4\x80\x7b\xc4\x02\xe6\xf9\x33\xe5\xc8\x6d\xdd\x2d\x28\xce\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1d\xd1\x4c\xed\x5e\x86\xe0\xbe\x28\xc9\x24\x5c\xb5\x83\x2d\x24\xbf\xb8\x7b\xb3\xd8\x9d\xa3\xc9\xb5\x38\xe1\x28\x30\xdb\x38\xb6\x6d\x39\xc7\xed\x1e\xdb\xfb\x16\xca\xde\x47\x33\xd8\x79\x10\x6b\xb3\x61\xaa\xc1\xa2\x1c\x8e\xd1\x36\x82\x05\xf1\x37\x36\x75\xc2\xae\x7a\x80\xab\xed\x59\xd8\x1a\x6c\xcf\xc7\xdc\x60\xbb\x99\xae\x66\x97\x68\xa0\xb7\x26\xa3\xe9\xe8\x50\x48\x0e\xa8\xba\x1d\x83\x5b\xc1\x76\x60\x9e\x05\x5b\x1c\xe7\x82\x2d\x86\x7f\xc1\x16\xe6\x5e\x82\xad\xef\xe5\x72\xee\x28\xb8\x3d\x96\xcc\x20\x25\x99\xfa\xcd\xc7\x0c\xae\x45\x03\xb1\x44\xdc\x29\x4b\xae\xf0\x5a\xd1\x7b\x25\xb3\x4a\xe3\x10\xf1\x9d\x34\x69\x1e\x4c\xd2\xa5\x04\x0f\x23\x74\xab\xdd\x35\x28\x25\x70\x22\x48\x9e\x62\xfa\x3a\x9e\xaf\xd1\x50\xc4\x7a\x28\x62\xbd\xa5\xbd\xac\x22\xd6\xee\x33\x1f\xc3\xbc\xb9\x64\xbf\x2c\x89\x41\xba\xc0\xdf\xbf\xa4\xe2\xd6\xd8\x12\xc5\x63\x14\x53\x8a\x93\xb3\x4b\x9f\xf1\xc4\x79\x35\xdf\x08\xcd\xca\x29\x4d\xd8\x79\x53\x61\xc5\x8a\x39\xcb\x59\x69\x36\xc8\xbe\xe7\x52\x7b\xd8\x84\x6e\xe4\x7e\xe9\xe0\x8f\xb0\x4f\x9a\x95\x66\x33\x6b\x53\xea\xf1\xeb\xed\xe0\xb8\xfb\xd2\x89\x41\x67\x07\x51\x87\x41\xcf\xad\xf2\xa0\x16\xaf\xd5\x9b\x87\x7b\x8d\x1b\xad\x9a\xaa\xc1\x90\x1b\x7e\x29\x05\xf0\x0f\x80\x62\x96\xb2\x2a\xd1\xe9\xc1\xdb\xd3\x13\x59\x96\x86\x67\x81\xa1\xa9\x22\x25\x9b\x19\x21\xb6\xc4\x02\xca\xf0\x46\x56\x99\x07\x7b\x8d\x0e\x3b\xb8\xfd\xd8\x1b\x8a\x77\xc4\xc7\x05\xf4\x66\x39\xcc\xa2\x94\x0b\x9e\x3a\x06\xb3\x89\xa5\xb9\x22\x05\x55\x8d\x7c\x34\x54\x29\x99\x70\x50\x52\xd6\x27\x18\x30\x12\x4a\xf8\xc0\xa8\xfa\x2c\xab\xad\xfc\x0d\x4d\x23\xb6\x84\x7c\xf9\x01\x9e\x70\x11\x47\x22\x64\xca\x6e\xab\xfb\x8c\xab\xf9\xdd\x21\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\x6d\x06\xc5\x20\x73\xa5\x50\x1c\xf8\x42\x43\xdd\x0c\x13\xcb\x8d\x78\x25\xe1\xb4\x5c\xff\xcd\x2b\x26\x81\xc6\x67\xcc\xe6\xea\xbb\xbc\xdb\x1d\xde\x8c\xed\x7d\xbd\x16\x9b\x81\x0a\x2b\x32\xa4\xec\x5b\x51\xb4\x9e\x27\x34\xdb\x5e\x89\xae\xd9\xda\x2c\x8a\xa3\x4b\x28\x0e\xb8\xbc\x55\x08\x80\xdc\xc0\xa6\xdb\x23\xde\x28\xae\x69\xb3\x70\x07\x1b\x75\x57\x36\x58\x91\x5c\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x68\x64\x4d\x83\xe4\xbf\x70\x03\x06\xe3\xec\x96\x36\x18\x67\x77\xb4\xc1\x38\xbb\xb1\x1d\xc5\xb9\xa6\xce\xdc\x4b\x1b\x49\x56\x5b\xb5\x66\x3d\x9f\x10\xce\x71\x74\x44\x45\xec\xd5\xe5\x05\x67\x75\xa1\x75\xc9\xef\x2b\x7d\xa0\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x49\x03\x61\x59\x65\x90\xc7\x8c\x0d\x7a\x13\xcc\x12\x4e\x3c\xe7\x06\x4c\x1b\x3e\x3c\x55\x24\x95\x49\xe5\x0b\x12\xc3\xe9\xd4\xde\x6c\xa1\xf5\x0a\xa3\xf0\x70\x7c\x39\xaf\xe6\x20\x9d\x57\x2b\x95\x8f\xc2\x60\xbb\x8b\xdb\x8e\xdc\x13\xed\xbc\x13\xf5\x57\x4d\x31\xc5\x3d\x26\xe6\x39\xbd\x97\x95\xf6\xd9\x7d\xff\x87\x99\xd9\x37\xe9\x9d\xb5\x24\x95\x62\x3b\xcd\xe8\xb5\x36\xb9\xe7\x18\x83\xed\x7e\xb0\xdd\x0f\xb6\xfb\x6d\xad\x75\x8f\x6f\xd0\x2c\xdf\x2c\xfa\xdc\xc2\x5f\x2e\x55\x72\xc8\xd6\x1d\xde\x1a\x7a\x55\x63\x5c\x14\x69\x56\x13\x55\xac\xc8\x59\x78\xdb\x6b\x6d\x7c\xc3\x1d\xd4\xa1\x64\x60\x89\x9f\xdf\x72\x7a\x20\x7b\x28\xac\x2e\x48\x86\xc6\xd6\x8e\xb8\xad\x83\xa4\xb1\x94\x3b\xba\x49\x34\x3c\x32\x0a\x99\xbe\xc1\xaa\x9e\x54\x08\x89\xec\x80\x1a\xd9\x92\xe7\x23\x1b\xea\x02\x8c\x70\x41\x13\x94\x4b\x2b\x9e\x02\x26\xa8\x23\xd6\xbb\xe3\x6f\xb1\x45\x9e\x00\x89\x3e\x05\x02\x27\x01\x0b\xec\x28\x21\xd4\x6c\xb1\x47\x62\x1a\x2d\xf8\x77\xac\x54\x41\xf9\x3d\xeb\xd6\x4e\x36\x8d\xdf\xbb\x93\x50\xc9\x9c\xe5\x14\xfe\xf9\xd6\x2d\xc0\x5c\x6b\xc3\xef\x6a\x86\x89\x3d\x59\x99\x1b\xc1\x6b\xd4\xf2\x67\x3f\x59\x84\xe5\xc5\x74\x2d\x5a\x58\x21\x0e\x0c\xbb\x53\xe0\xef\x58\xee\x6d\xcb\xb0\x66\x40\x10\xe8\x7b\x86\x85\x32\x57\xdc\x61\x00\x71\xe1\xfe\x1c\x78\x69\x4f\x91\xae\xb0\x1d\xc3\x0f\xa0\xaf\xfd\x7f\xe4\xed\x0b\x6d\x96\x27\x78\xe0\xc1\xfe\x3f\xd8\xff\xdb\xed\x85\xdb\xff\x1b\x24\xcf\x61\xd0\x0d\x06\xfe\xa6\x85\xc4\x59\xf9\xef\x99\x93\x2d\xac\xfc\xe2\x4c\xf7\xce\x6e\x2f\xcb\xb6\xe3\xd9\xe9\x64\x72\x8a\xae\x67\xb5\xc0\x53\xe9\xe9\xf8\x8f\x84\x89\x44\xa6\xa6\x9f\x8f\xd0\x7f\xa9\x34\xb0\x4b\xb5\xe6\xaf\x39\x97\xdc\x8d\xd5\x74\x5e\x83\xbe\xe3\xe8\x6a\x04\xda\x73\x19\x66\xdf\x3e\x85\xb9\x88\x40\x5f\x35\xf3\xe1\x73\xdb\xda\xad\xf0\xb5\x12\x2c\x17\xe2\x7e\x57\x24\xe3\x39\xb7\x75\x61\xcd\x7d\x67\x4a\x87\x2a\x2e\x09\x39\xc3\x8f\x27\x49\x51\x8d\x6c\x47\x93\x9c\xe5\xb2\x5c\x8e\x7c\x67\xe6\xc7\x56\xef\xf6\x0d\xac\xda\x91\x54\x65\xc9\x84\xce\x96\xa1\x89\x79\xea\x76\x24\x2e\xc7\xed\xd4\x01\x99\x1c\x7f\x38\x61\xe9\xa3\xea\xd6\xbe\x91\xb5\x75\x18\xd4\xeb\x7e\xb5\x58\x96\x17\x03\x9e\x47\xb5\xed\xdc\x3c\x65\x62\x41\x16\xb4\x54\xa1\x37\x80\xf4\xe5\x6b\x52\xbe\xe0\xaa\xab\x72\xf2\x8e\xc5\xdd\x79\xdd\x27\x94\x1c\xac\x74\x51\x69\x8b\xee\x1c\x88\xbb\x4a\x13\x1e\xb4\x57\xd8\xb7\x2f\xba\x55\xc0\x75\x2b\xa8\xd6\xac\x14\x6f\xc8\x7f\x9c\xfd\xfb\xef\x7e\x1e\x9f\xff\xe5\xec\xec\xfb\xd7\xe3\xff\xfd\xc3\xef\xce\xfe\x7d\x02\xff\xf8\xed\xf9\x5f\xce\x7f\x76\x7f\xfc\xee\xfc\xfc\xec\xec\xfb\xaf\xde\xfd\xf5\xe3\xed\xf5\x0f\xfc\xfc\xe7\xef\x45\x95\x3f\xe0\x5f\x3f\x9f\x7d\xcf\xae\x7f\x08\xec\xe4\xfc\xfc\x2f\xbf\x89\x98\x24\x15\xcb\x6f\x82\x71\x0a\xb6\x71\x2f\xba\xd2\xfe\x36\xf2\xe8\x57\x78\x3f\x2e\xf4\x58\x96\x63\xec\xe4\x0d\x64\x41\x0f\xee\xca\x1d\x6d\xff\x3b\x52\x53\xad\xba\xea\x89\x63\x8f\x0f\x7c\x09\x9e\xc6\x01\xf7\x76\xec\x02\x53\xd1\x15\xdf\x6b\xf6\x01\xd7\x67\x3b\x48\x4a\xb3\xbc\x90\x25\x2d\x97\x24\xb5\xca\xad\xe5\x93\x92\xbe\x3d\x31\xb1\x3a\x4c\x32\xe5\xbb\x61\xfc\x00\xaa\xe2\x9c\xa5\xbc\xca\x0f\x92\x96\x0d\x7a\x6e\x6e\xfa\x23\x94\x1d\xb1\x45\x4d\x9c\xaf\x8f\x7d\xcd\x95\xe4\xa2\xc9\x03\x0a\x2a\xfe\x54\xc2\xf4\x87\xad\x5a\x14\x27\x27\x2b\x35\xbe\x41\x37\x0d\x4e\x30\x32\x65\xa7\xca\xbf\x8b\x83\x47\x2a\x89\xd1\x9c\x69\x7d\x23\xcf\x6c\x57\xe7\x86\x11\x7c\x07\xbc\xc2\x11\xd2\xf0\x07\x41\x0b\x89\x4c\xde\xc4\xff\xc1\xbe\x36\x5c\xd1\x41\x22\xbc\x5d\xe7\xbe\x22\xb8\x04\x61\xce\x26\x5e\x9c\x92\x4c\x26\x0d\x07\xb0\x16\x33\x00\xe0\x70\xed\x2e\x71\xb8\xad\xd0\x00\x85\x19\x17\x79\x3d\x50\x86\x66\x0a\xbd\x5b\x78\x02\x05\xda\x40\x34\x84\x33\x8b\x80\x04\xd3\x6d\x4e\x3f\xf1\xbc\xca\x49\xa5\xcc\x6c\xa5\x68\xf7\x52\x4f\xf6\xd1\xd5\x99\x83\x54\x76\x5c\xc0\x47\x2d\xd1\x38\x44\x45\x39\x67\xe4\xce\xef\x5f\xad\x0e\x41\x53\xba\x95\xe4\x54\x05\x82\x84\x9d\x87\x65\x93\xe5\x14\x1c\x2b\x3c\xc7\xa6\x7c\xa9\xb2\x1e\x97\x4a\xf0\xac\x7d\xab\x5c\x11\x21\xbf\xbd\x95\xb0\xfe\x8a\x2f\xe9\x06\xbc\x60\xde\x28\x98\x23\x8a\xe7\x83\x22\xb9\x9f\x27\xf0\x3c\xde\x7b\x73\xaf\x24\xdb\xbb\x84\xb6\x68\x76\xb3\x7e\x51\xdb\x3d\x94\x3a\x4f\x42\x8f\x42\xc2\xd2\xec\x7c\xf4\x3a\x1d\x4b\xea\x93\x65\x62\x53\xf8\xf1\x56\x1d\x38\x1c\x14\xe1\x1b\xc2\xd8\xc6\xe6\x3f\x4e\xf7\xe3\xcc\x8f\xf7\x6c\x8a\xee\x4d\xf8\x0d\xc8\xee\xaa\x2b\x74\x0e\x35\x5a\x19\xd3\x10\x8b\xc7\x7c\x75\x40\xf4\xbb\xca\xe5\x22\xa0\x80\xf0\xb7\xca\x1a\x9c\x79\x27\x40\xd1\xf3\x56\x9c\xbc\x42\x11\x5b\x30\x96\x62\x2c\x60\x56\xcf\xbf\xac\x44\xe7\xec\xef\xcf\xc9\x94\x51\x5d\x95\xe8\xfd\x23\x8c\x94\x93\x39\x01\x0e\xd5\x4e\x25\x33\x87\x02\x29\x10\x4b\x99\x13\x25\x68\xa1\xe6\x52\x83\xea\x84\x16\x34\xe1\x3a\x20\xbc\x4c\x97\x34\x79\x80\x1a\xcb\x25\xb3\xb3\xed\x9a\x5a\x72\x6e\xa3\x18\x9a\x10\xd1\x8e\x7d\xd4\xf3\x52\x56\xb3\x39\x84\xe2\xe1\x5b\x49\x46\x15\xc6\x5c\x76\x19\xd9\x37\xf6\x6e\x15\x03\x8a\xa4\x4b\x41\x73\x9e\xf8\x4a\x53\xa5\x5c\x70\xc5\xa5\x35\x52\xc1\xa8\xdd\x8b\xa6\xe4\xd6\x97\x01\x42\xcb\xd8\x65\x46\x79\x4e\xce\x14\x63\xe4\xda\x5d\x12\xfc\xe5\x0e\x05\x04\x54\x77\x86\x38\x58\x35\x8d\x6a\x36\xf5\xb1\xcd\x9c\x62\x9e\x38\xd5\x6d\xc3\x8d\x21\x24\x21\x96\x85\xe7\x8d\xd3\xee\x2e\xf0\x6b\xc0\x78\xf3\x8a\x65\x09\xfe\x82\xae\x1a\x1e\x13\xa9\xac\xdd\x63\x3a\x7a\xbd\xb8\xbd\x51\x4d\xb5\x02\xde\x65\x5b\x60\x09\x7e\xb0\xe9\x96\x7d\x5e\x59\x8f\x09\x3a\x7a\x36\x04\x56\x40\x21\xe6\x05\x4f\x2b\x9a\x21\x69\x0d\x58\xe4\xe5\xdd\x0d\x0e\xcc\x67\x73\x3d\x7e\x64\xa0\x08\x46\x1e\xa8\xc6\x7d\x6e\xba\x7c\xcd\x69\x9b\x2b\x20\xc2\x01\x35\x98\xad\x62\x1a\x97\xfc\x48\x97\x90\x7f\xde\x3a\xff\xb6\xbc\x7d\x5c\x4d\x18\x1c\x60\x2a\xbb\xa8\x4c\xee\xe8\xb7\x05\xa1\xce\x65\x5f\x00\x4a\x49\xa8\x00\x66\x1c\x34\xfa\x06\x9e\x00\x6b\xac\xaf\xb9\xfb\xfe\x35\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xa7\xcc\x76\x00\x69\x6a\x51\x43\xec\x47\x96\x17\x19\xd5\x07\x71\xc0\xf9\x5b\xc3\xe4\xd0\xb0\x87\x1b\x24\x46\x45\x3a\xa6\x99\xb9\x2a\xb7\xdf\x5d\xda\x80\x57\x44\x3c\x91\x9e\x76\x1f\x1d\x11\x12\xbe\x96\xb2\x61\xc3\x37\xe2\x1c\xc8\x9e\x7a\xcf\x52\xa0\x20\x76\x6e\x61\x4e\xc2\xf2\x51\xb0\xd2\xc1\xde\xed\x77\x97\x23\xc2\x27\x6c\xe2\xfe\xf2\x9d\x39\xf2\xa8\xe5\x0c\x43\x67\x5c\x88\x5a\x88\x6d\x5d\xa6\x13\x5c\x4e\x53\xbf\xdf\xec\xfd\xc7\x3f\x99\x85\x9a\x5f\xff\x3c\xfe\x53\xa3\x76\xe1\x9f\x7f\x34\xf4\x38\xc8\x57\xf5\xc7\x95\xef\x9a\x31\x17\x40\xf4\xcc\x5f\x3f\xde\xda\xb2\xc5\xb6\xa8\xf1\x8f\x81\x4e\x15\x84\x30\xa1\xcb\xe5\x84\xdc\x4a\xf0\xc3\xe3\x29\x5e\x59\x98\x7f\xc9\xfe\xee\xcc\x42\x70\x5c\x5e\x83\x9e\x50\xcd\x04\x70\x25\x3b\x2b\x00\xd7\xcd\x66\x00\x80\x01\x00\x39\x51\xd8\xa5\x33\x50\xbd\x62\x3a\x9c\x11\xd1\x12\x93\xd3\x77\xe3\x72\xd3\x2e\x04\x61\x9f\xb8\x82\xec\x67\xb8\xe3\x70\x6c\xd4\x86\x84\x38\x46\xce\x0c\x6b\x20\xc1\xe7\xcc\x2b\x64\x88\xef\x06\xac\xff\xb7\x42\xea\xdf\xfa\xcb\xe0\x3c\x4a\x81\x63\x93\x84\x2e\x24\x77\x35\xb6\x0d\xe2\x11\x60\x64\x09\x4a\x34\x61\xcf\xf3\x7e\x49\x72\xae\x34\x7d\x60\x13\x72\x67\xd8\xb9\xa6\x93\x09\x9e\xb2\x20\x50\x0b\x8f\xa5\xa4\x12\x9a\x67\x81\x12\x9d\x9f\x0b\x6c\x4c\x83\xd5\x83\xd4\x12\x55\x62\x78\x92\xa2\x64\x63\xc7\x5a\xe2\x5b\x41\x7a\x17\x5b\xd5\xd3\xed\x49\xbd\xa7\x23\x0f\xfa\x73\x8a\x6a\x91\x22\x85\xce\xad\xa7\x76\xf0\x85\x5d\x8b\xa6\x30\xbb\x21\x45\x52\xb3\x8e\x70\xec\x6a\x42\xde\x03\x3f\x98\x85\x00\x39\x3a\x8d\xa1\x1e\xc8\x5a\xd9\x04\x4b\x98\x52\xb4\x5c\xa2\x13\x3b\xf7\xd5\xb5\x2b\xc5\xa6\x55\x06\xec\x72\xc8\x96\x50\x81\x95\xcc\x4b\x96\x48\xa1\x74\x59\x25\x70\x8e\x94\xdc\x97\xf2\x81\x89\x3a\x0c\x29\x08\x31\x36\x3d\xee\x6b\xd7\x66\xc3\xf6\x08\x49\x92\x39\x15\x33\xe6\x53\x80\x90\x9c\xa6\x00\x45\x5f\x79\x01\x2b\x64\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\xf7\x86\x23\x73\xf6\xc8\x90\xc9\x7e\xf0\x41\x00\x79\xc3\x78\x29\x78\xb6\x67\x47\xde\x18\x5b\xd5\x18\xf8\xef\x6e\xc1\x3d\xca\x36\x95\x33\x4d\x53\xaa\xe9\x21\xe3\x34\xde\x51\x5f\xc6\xdd\xfa\x42\xc1\xa1\x37\x7c\xa4\x2c\x9b\xe5\xa4\x42\x59\xf0\x66\x62\x97\xdb\xef\x2e\x03\x47\x02\x31\x10\xce\x19\xf2\x46\x6a\x73\x8f\xac\x79\x1e\x20\x0f\x43\x63\x5c\x2c\x86\x99\x84\x1b\x13\xc9\x01\x4b\x49\x5a\x45\x68\xfb\x6b\xa2\x12\x66\xcf\x8c\xb4\x66\x9a\xf3\x3e\xe4\xc1\x7c\xac\xdd\x84\x92\x76\x64\xc1\x46\x61\x02\x2d\xf0\x4c\x68\x5e\xb2\x46\x7a\x9f\xc0\xc1\xec\xa9\x56\x02\x6f\x7a\xfb\x7c\x11\x00\x66\x4c\xab\xda\x25\x19\xc9\x7f\x70\xff\xda\x32\x8e\x38\x4b\xe0\x65\xdd\x99\x5b\xfd\xdd\xc6\x45\x05\xf6\x8e\x70\xa3\xa4\x25\xf3\x86\xbd\x39\xc8\x91\xf7\xb1\x2d\xd3\xc4\x60\xfb\x77\x32\x8d\x31\x47\xf7\xf5\x3e\x68\x0d\x57\x87\xa7\x61\x54\xa4\x02\xe5\x33\xbe\x00\x0e\x31\xaa\x95\xdc\x08\x69\xd4\x9c\x2e\x22\x52\xa9\xf4\xd6\x78\xd6\x72\xce\xd8\x57\xe1\x85\x89\x8d\x61\x62\xe3\x2f\x82\xa7\x10\xe3\xc8\xeb\x5a\xb0\x43\x6f\x7b\x90\x48\xab\xeb\x93\x12\x41\xb8\x66\xd0\xff\x5d\xa4\xc5\xb5\x3f\xf4\xd4\xa3\x59\x66\xc0\x3a\x51\x79\x07\x3c\x1b\xec\xcf\xb8\x41\xdb\x31\x3b\xf8\xdb\x16\xdb\x6c\x05\x2d\xaf\x33\xc3\x70\xca\x33\xa7\x44\x9b\x58\x30\x71\x79\x2a\xdb\xaf\x9f\xf7\x1e\x16\x38\xff\xcd\x5a\x9c\x88\x3e\x6f\xac\x3f\xb1\x93\x41\x8d\xac\x57\x82\x0d\xcd\x85\xf1\x9b\x8b\x57\xca\x2c\x63\x25\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\x87\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\xa3\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x31\x57\xfd\x6f\x4e\x8d\x7b\x21\x96\xb8\x75\x57\x0d\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\xfb\xcc\xb0\x68\x0d\x90\xf2\x33\x5a\xe1\x25\xb4\x6c\xbc\xf5\x81\x4d\x63\xb6\x03\xf4\xcc\xcd\x8f\xc3\x46\x41\x66\xa4\xf5\xe1\xa4\xf6\xfd\xb6\xd2\x5b\x54\x92\x71\xd7\x2c\x74\xb4\x3a\x6b\xfb\x5b\xae\x8c\xdb\xcc\x7b\xb7\x71\xae\xe1\xa3\xf7\xf0\xc7\xea\xe3\x91\x05\xd9\xd3\x78\xa7\x2e\xab\xfd\x41\xa0\xbc\x8e\xad\x8f\x0b\x17\x78\xaa\x83\x2b\x68\x9c\x3f\x4e\x7f\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x67\x06\xff\xd4\x49\x21\x63\x20\x8a\x20\x54\x35\x47\xda\xe0\xc4\x5b\x5f\xef\xaf\xa0\xa8\xa9\x35\xed\xbb\x94\x14\x86\x4c\x5f\xdc\xde\xe0\xfc\x62\x47\x7f\x0b\xf8\x6d\x69\x99\x75\x3d\xe7\x65\x3a\x2e\x68\xa9\x97\xa8\xec\x1c\xb5\xe6\xe6\xa3\xea\xa3\x06\xe9\xe9\xd7\x14\x56\x06\xb9\xd9\x5a\xc7\x0d\x5b\xe5\x8c\xf7\xd6\x87\x63\xeb\x99\x1d\x63\x3d\xe1\x51\xf9\x1b\xd7\xd3\x2c\x62\xe9\x14\x83\xcf\xb8\x9e\xa7\x47\x1c\x90\x36\xae\x3c\x2e\x0f\x64\x90\xb3\x6a\x7b\x3d\x22\xa3\x02\xd2\x8f\x55\x20\xcb\x66\x70\xac\xe7\xa6\x41\xf7\x64\x7a\x1a\x11\x3e\x35\x44\x5a\x8a\x31\x58\xf7\x23\x26\x52\x1b\x33\x2d\xef\x3e\xb1\x0e\xf6\xa8\x2d\x82\x0b\xd9\x98\x4f\x63\x90\xfa\xa6\x93\x33\x21\x43\x94\x49\xae\x01\x9e\xc0\x5e\xcf\x31\xf6\x61\x8b\xe5\xea\x3e\x26\xe1\x24\xa9\xb9\x87\xa6\x9a\xa9\x81\xc1\x1c\x03\xc3\x45\x6a\x80\x14\x48\x22\x28\xa0\x54\x95\x24\x8c\x79\x15\xb0\xbd\xa4\x31\xac\x7b\x0b\x37\xda\x0d\xcb\xa9\x4e\xe6\x4c\x11\x25\x21\xab\xba\xd2\x34\xcb\x58\xea\xcd\x9a\x78\xa0\x12\xf8\x3a\x6b\xf2\x8c\x18\xb1\xc1\x18\xc6\x6c\x50\x43\x05\x67\x75\xe0\x45\x46\xad\xf2\x71\x5a\x89\x04\x7d\x86\xb9\x5e\x7a\xab\xd6\x2a\xb3\x0e\x7a\x1b\x05\x7a\xd6\x18\x86\x72\x8a\x76\xab\x86\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xd6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x0a\xce\x1a\x89\x3a\x46\xc8\x8d\x35\x59\x26\x71\xda\x74\x0a\xe2\xa2\x3f\x83\xd8\x5c\xdb\x59\x63\xcb\xd6\x18\xc7\x73\xcf\x30\x2a\xe6\xcb\x81\xab\x18\xae\x85\x58\x2f\x28\x5a\x69\x99\x53\xcd\x13\x50\xcf\xf2\x69\xc3\xc8\x9b\xfb\xa2\x7c\xde\xc9\x09\x89\x2a\x10\x75\xbb\xeb\xd1\xd7\x6a\x33\xb3\xf9\xa4\x6d\x6b\xec\x94\x3d\x8d\xf6\xa6\xb8\xa5\x36\x58\x8d\xe8\xb9\x7f\x74\x79\x53\x88\x9e\x97\x8c\x11\x9e\x1b\x31\x89\x0a\x4d\x52\x3e\xf5\xf9\x72\x9c\xcd\x7e\xd7\xd9\xc5\x49\xa2\x7f\x03\x7f\x90\x46\x7f\xa8\xea\xce\x32\xf9\xa8\x88\x7e\x94\x5e\xed\x56\xdb\x72\x6d\xbe\x94\x51\x7b\xd8\x28\x0a\x6a\xfb\x37\x68\xdb\x9c\x74\x03\xd3\x8e\xcc\xad\x7d\x64\x59\x66\xfe\xbf\x0b\xdf\x46\x44\x7a\x6d\x5c\x27\x9f\x09\x4c\xc4\xc1\x95\x53\xb3\xda\x78\xb2\xb3\xb4\x94\x45\x61\xcd\x40\xf9\xf9\x53\xd6\x09\xae\x4d\xe5\x82\x29\x70\xd3\x73\xd1\x6c\xe6\xc8\x66\x4c\xb0\x92\x6a\x30\x84\xdb\x0c\xda\x40\x1c\x57\xa7\x13\xae\xb6\xc4\xd6\x4b\x4e\xeb\x00\x03\x74\x5b\xd8\x7c\xec\xee\x1d\xfb\x6b\xd4\x5c\xb9\x40\x08\x70\x37\x36\xea\x48\xcf\xbe\x64\x9a\x9e\x93\x6f\x15\x1e\x94\xa7\x17\x3e\x4a\x30\x48\x3a\xb7\x59\x8e\x50\x40\x8f\x1a\xfe\x22\x2b\xe6\x8d\xf1\x9b\x52\xae\x0f\xb5\x6e\xef\x54\x6b\x66\x97\xa5\x54\xea\xbd\xfb\xe4\x20\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\xdd\x6d\x90\x80\x8f\xbd\x1e\xc0\x77\xc7\xbc\x93\xef\x9b\x0c\x61\x1b\x51\xef\x6d\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\x6e\x55\x7a\x52\xc0\xe9\x8f\x74\x39\x11\x4c\xdb\x3c\x74\x4e\xb7\xff\xc1\x8d\xfe\xd7\xd2\x70\x7e\x56\x40\x6b\xdc\x22\x77\x81\x5d\x12\xc1\xc6\x28\x5a\x22\x29\xae\xbd\x6f\xe0\xf9\xa9\xb2\x1e\x1d\xe6\x77\x08\xb6\x27\xad\x92\x2c\x13\x72\x67\xbd\x05\x57\x06\x5f\x4f\x15\x96\x32\x4d\x79\x58\x1e\xca\x66\x73\x94\xf2\xe3\x16\x1a\x7d\x04\x4a\x48\xfa\x81\xac\x0f\xdd\x3c\x86\xaa\xa5\x0e\x81\x6e\x78\xc4\x37\xa3\x4a\xea\x17\x9e\x6e\xa9\xbc\x99\x92\x0f\x2c\x91\x0b\x56\xe2\x7e\x5f\x7f\x2a\xa8\x30\x62\xfa\x5b\xca\x33\xb3\xdb\x6e\xd7\x6b\xeb\x05\x14\x41\x6e\xbb\x25\x34\x8c\x60\xfe\x1a\xd9\xa3\x35\x90\x13\xc3\x0c\xfa\x9c\x77\xa6\x67\xeb\xa7\x5b\x94\x6c\xc1\x65\xa5\x5c\x3c\x4d\xa5\x91\x8e\x29\x6d\x65\xd3\x39\x9f\xcd\xdd\xcb\xce\xcf\x1c\x3c\x80\xca\xd4\x5f\x95\x88\x39\x28\x4d\x75\xa5\xda\x89\x72\x12\x70\x27\x78\x16\x1b\xb0\x3f\xef\xc3\x32\x7c\xfd\x98\x2b\x8c\x3f\x3a\x26\x1a\xff\x1a\x23\x9e\xb0\x93\x7b\x7b\x0b\x5c\x98\x56\x1d\x66\x96\xc8\xbc\xa8\x34\x6b\xdc\x16\x0b\xad\xb1\x68\x2b\xf2\x20\x5b\x79\x2f\x5f\xe5\x54\xd0\x19\x1b\xfb\x49\x8c\xeb\x08\xad\x57\x3d\xb0\x56\xe4\x91\x92\x27\x24\x5e\x6c\xb6\x17\x1c\x59\xb5\xb2\xd8\xf8\xc8\x73\xf2\xc4\xe8\x73\xf2\x94\x08\x74\xb2\xcf\x28\x74\xe2\x53\x59\x1c\xf3\x3a\x7e\xb0\x63\xae\x5e\x48\x4b\xac\x76\x5d\xc8\x7e\x22\x81\x25\x5a\x76\x54\xae\x88\xcc\xb9\xd6\xcc\x39\x32\xfb\x0b\x36\x22\x5c\xb7\x32\x2d\x58\xc4\x01\x4a\x73\xf4\x46\x66\x9f\x7c\x59\xed\x9a\x31\x8b\x9c\x0c\x08\x3f\x8f\x5c\x21\xe3\x25\x08\xcf\x0b\x2c\xcc\x02\x08\x60\x6c\xe3\x24\x9d\x6a\xd8\xcf\x3b\x01\x5f\x42\xc2\x3e\x81\x22\x1f\xa7\x36\x60\xa6\x01\x33\xad\xb4\x5f\x02\x66\xc2\x2c\x16\x31\x49\x56\x5a\x18\xc9\x7d\x6e\x73\x5c\xd2\x7b\x96\x91\x9f\x2a\x56\x2e\x89\x61\x5b\xeb\x48\x2f\xa8\x06\xae\x78\x8a\x31\x4d\xce\x6a\x76\x60\x2d\x59\x3f\xa6\x09\x2c\x6d\xd7\x9f\x0c\x77\x0f\x39\xdb\x9e\x80\xaf\x57\xbb\x6a\x67\x02\xc5\xdd\xf2\x3b\xd8\xe4\xc9\xd1\xe9\xb4\xf9\x04\xd8\xee\x8b\xf7\x57\xfd\x04\xaa\x38\x67\x43\xd2\xc7\xe1\x70\x6d\xf1\xd1\xc4\x8a\x90\x8b\x1d\x7b\x82\x7b\xe7\x7f\x01\x2a\xe1\xdd\x45\xbd\xce\x9e\x3c\xb0\xe5\xc8\xba\x83\x13\x73\xfa\xd4\xbd\x1c\x3d\x19\x8c\x0b\xa9\xab\x16\x9a\x4e\x43\xb3\x6f\xb7\x5b\x6f\x24\xdc\x4f\xd1\x8b\x2d\xbc\x5c\x64\xfb\x2b\xb7\x69\xb1\xb8\xbe\x37\x95\x88\x2a\x2b\xd9\x6c\xdb\x4a\x4c\x22\x0c\x41\x3d\x38\x97\x1b\xc1\x83\x0d\x64\x9d\x00\x84\x14\x7b\x88\xa4\xbf\x42\x0d\x9b\xdb\xd8\x27\x2f\xb5\xc7\xc5\x6a\x8e\xdf\x8e\xe5\x7f\x60\xcb\x53\x65\x93\xde\x49\xa1\xe6\xbc\xc0\x12\xa8\x8a\x01\x8e\xea\x07\xf0\xd8\xbe\x03\xd7\x76\x37\x2c\x62\xb0\x1b\x31\x22\xef\xa5\x36\xff\xbb\x86\xd0\x24\xb8\x56\x57\x92\xa9\xf7\x52\xc3\x93\xa3\x9f\x0b\x2e\xf1\xb9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x6e\x04\x91\xa5\xdd\xca\x5e\x03\x6b\x57\x44\x59\xd9\x61\x9d\xf5\xa1\x36\xea\x6f\x1a\xd7\x9e\x9a\x2c\x5b\x87\xb6\xe7\x29\xd8\xe1\x41\x17\x89\xbf\x80\x76\x15\xbc\x4b\x5c\x48\x0d\x96\xed\xa5\x9a\xcd\xa2\x5c\x5d\xea\x96\xb3\x72\x06\x59\x1e\x93\x88\x82\x8f\x8d\xc9\xf7\x24\xac\xd8\x7a\x91\xd7\xe6\xc0\x3d\x81\x7d\x4f\x3e\xfe\x7b\xee\x0a\xf8\xa4\xaf\x21\x94\xeb\x98\xd2\x71\x63\x58\xe4\x2e\x72\x5a\x98\xdb\xf7\x5f\x86\x89\x00\xc0\xfc\x6f\xa8\x99\xae\x26\xe4\x82\x28\x2e\x66\x19\x6b\xfd\x66\xd5\xfc\x8d\x6e\xa2\x27\x00\xd6\x37\x43\xe3\x17\x34\x63\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x9d\x3c\xb0\xe5\xc9\x28\x52\x91\x4a\x9a\x34\xc1\x74\x72\x23\x4e\xea\x94\xb4\xad\x7b\xe9\xf9\x2c\xf0\x37\x38\x81\xdf\x4e\xf6\xcd\xa3\x3e\x93\x90\xfa\x6c\x6e\xa2\x56\xa9\x7c\x99\x51\x34\xac\x1c\xc3\x7c\xb1\x3a\xe6\xa6\xa2\x84\x77\x8d\x77\x6a\x93\x96\x8d\x5e\x7e\x46\x4d\x3b\x64\x84\x89\x0e\xb3\x8a\x3a\xd8\xd5\x32\x40\x47\x3d\x9b\xad\x83\x37\x82\xad\x7d\x4e\x71\x73\x16\xdf\x6d\xfa\xa0\x11\x6b\xce\x55\xfc\x71\xdd\x4c\x57\x7d\x14\x1a\xe9\x4e\x9a\x51\x3c\xb2\xb4\x51\xeb\x6b\x3e\xc4\x50\x21\xb1\xae\xa4\x14\x5a\x3b\xb5\x6e\xb5\xfb\x43\xc9\x54\x21\xd1\xbf\x76\xe3\x62\x2d\x8b\x30\xa7\x0a\x7c\xb2\xa6\xd6\xdc\x5a\x54\x65\x21\x95\x2d\x6f\xb7\x0a\xf2\x91\x91\x4b\x36\x9c\xcc\x05\x99\x62\x18\xb8\xbf\x09\xe6\xfe\xf8\xbc\xd4\x17\x2b\x39\x09\xd1\x20\xd6\xc8\xd2\x26\xe4\xe6\x65\x44\xcc\xc8\x39\x7c\xa2\x1c\xe3\x33\x63\xe1\x64\x30\x36\xff\x14\x5d\x4d\x1a\xe6\x3f\xc3\xed\xeb\xa6\xf7\x95\x96\xed\x99\x42\xca\x00\x4c\x1e\x17\x91\x6c\x9c\x20\xbc\x54\xa2\x76\x63\x71\xd4\x63\xb3\x4b\x20\xe4\xa6\xbb\x97\x95\xb0\xa0\xe5\xb2\xda\xed\x6b\x53\xcc\x2a\x5d\x96\x05\x3f\x01\x0b\x9a\x8d\x00\x37\x3e\x35\x6b\xb5\x99\x11\xe2\xd6\xda\xf2\x0f\x02\xeb\x7c\x69\x8b\xf0\x2d\x37\xdf\x5f\x92\x4a\x86\xe7\x01\xe3\x8d\xf0\x14\x36\x6f\x8f\x5d\x46\x0c\x3a\x47\x0f\x57\x4a\x6e\x19\xde\x12\xa5\xa9\x66\x23\xac\xf1\x3a\xcd\x1a\x75\x80\x18\xc9\x65\xca\xa7\xd6\xcf\xee\xae\x61\x43\x1d\x61\xba\x0c\x9b\xeb\xa2\x99\x06\x3c\x62\x22\xf1\x9b\xf9\xa4\xbc\x83\xe3\x1a\xbf\x8c\x81\x2c\xb0\x28\xb5\x78\x90\x53\xe2\x66\xec\xba\xdd\xcf\x81\x9c\xc9\xe9\xb4\x51\xf2\x2a\xa0\x0a\x9e\x6b\xbd\x29\x55\x58\x65\x31\xd7\x9e\x4a\x9a\xa0\xcc\x82\x4b\xbd\xd7\x4a\x22\x5b\xc7\x7d\x3c\x99\x5f\xf8\x0e\x90\xa6\x9c\x92\xb7\x75\x2d\x5c\xae\xc0\x70\xc3\x5d\x62\x3e\x73\x9d\xb8\x48\xb2\xca\x3a\x10\x20\xf6\x33\x58\xe8\x08\x7b\xfe\x04\x76\xa0\xee\xc0\xf1\x5d\x2e\x7a\x64\x2d\x91\xcb\x2a\x86\x80\x90\x05\x0f\xae\x91\xbb\x1a\xb8\xd6\x69\x47\x72\x88\xd6\x5a\xa6\x49\x5b\x8f\xf4\x96\xdf\x97\x8c\x5c\xce\xa9\x10\x2c\x6b\xe4\xc9\xb6\xc6\x3c\xaa\x35\x4d\xe6\x88\x2b\x29\x31\x37\x3d\x63\x86\x52\xcd\xa5\xd2\x24\xa7\xc9\x9c\x0b\x9f\x44\x55\xf8\xac\xec\x75\x56\x9b\xa3\xa7\x10\x3b\x78\xf5\x6a\x0b\x01\xcd\x92\xcf\xad\xa2\xd6\x01\x3d\xf9\x64\xc8\x6b\xbd\xd4\xf5\x22\xed\x3d\x84\x7d\x46\x69\x0f\xe8\x04\xbc\x1b\x32\xc6\xf6\xd2\xda\xe4\x26\xf7\x06\x5a\x2e\x1a\xa4\x90\xd9\x0f\x0c\xa1\x6d\x30\x07\x7b\xad\x64\x9d\x55\x01\xb5\x9d\xda\x59\xdc\xb3\x4a\x98\x4d\xaf\xab\xf5\xbc\xbd\x24\x9a\x96\x33\xa6\x4d\x6f\x44\x54\xf9\x3d\x2b\xbb\xd3\xb9\x1f\xae\xc0\xdc\x51\xea\xc1\xb6\x76\xa0\xa3\x8c\x2b\xf9\xe0\xbe\x82\xb0\x17\xe0\x4f\xa6\x32\x8c\x33\x40\x5f\x45\x57\x84\x16\x4b\x10\x1a\x5c\xfd\x9d\x25\x25\x95\x08\xe1\x17\x62\xea\xc4\xe2\x59\xfe\xed\x6f\xef\x63\x8b\xf4\x9d\xd6\x5f\x6e\x03\x90\x47\x59\x66\xe9\x23\x4f\xad\x5b\x2a\x39\x33\x2f\x9f\x87\x02\xcb\x9e\x6b\xf6\xf5\x4f\x29\x1c\xab\xa3\x7b\x7c\xe4\xe9\x41\xea\xed\x42\xc7\xed\x9d\x76\x22\xa4\xd9\x69\x02\x5b\xcd\x53\x26\xb4\x41\x1d\xa5\x22\x67\xf0\x45\x48\xce\x8b\x6b\x8e\x99\x09\x61\x04\xa8\x0a\x94\xdf\x73\x51\x27\xd7\xac\xcf\xda\x90\x1b\x73\xf3\x9d\xd6\x59\x31\x8d\xf9\xcd\x20\xb3\x81\xd4\x73\xa2\x78\x5e\x65\x9a\x0a\x26\x2b\x15\x5e\x8a\xff\xb3\x3c\xee\x69\xc6\x3e\xe1\xdd\xdc\x67\x02\xe9\xba\xd7\x36\xb7\x00\x71\x55\x75\x56\xde\x55\x76\xa1\xa3\xd7\x3a\x5c\x35\x7d\xe5\x19\x0b\x9f\x5d\x90\x7d\x62\x89\xcd\x2b\x52\x64\xd5\x8c\x77\xe6\xd2\xba\x32\x33\x4b\x8c\x0c\xff\x86\xbc\xad\x27\x0c\x51\xcc\xee\x17\x2c\xd5\x0c\xfe\x0b\x76\x20\x72\x79\x77\x73\x65\xd3\xc0\x0a\xa5\x19\xdd\x17\x8f\x12\x6a\xf2\x1d\x5b\xb5\xcc\x9e\x18\x1e\xec\x2c\xf2\xb2\xd7\x79\x70\x57\xb5\x88\xf6\x17\x5b\xf3\xc1\xd7\x0f\x08\x4d\x7c\x1a\x01\xf4\x03\xa7\x86\x6d\x07\xa7\xd6\x2c\x21\xd0\x98\x40\xca\x0a\x26\x52\x28\x4a\xd8\x80\x7b\xdc\xa5\xbd\x1e\x91\x2d\xa0\x17\x4b\x97\x5d\xdd\xbd\x16\x51\x6e\xc8\xeb\x73\x99\xa5\x8a\xb0\x4f\xba\xa4\x06\xcd\xe7\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x40\xf5\xd3\x97\x54\x28\x9d\x3c\x0b\x17\x98\xfe\x92\xb8\x40\xc5\x92\x92\xe9\xa0\x00\xeb\x1e\xe5\x53\x5c\xe7\xed\x0d\x6c\x3d\x5e\x13\xe5\xf1\x57\x17\x26\x54\xd7\x48\x0e\x1a\x4f\x28\x0e\xc5\x08\x57\x2a\x2f\x17\x54\x29\x2f\x1d\x03\x91\xb3\xd7\x56\xb5\x32\x6e\x04\x0c\x81\x7a\x60\x3e\x25\x42\xae\xcc\xb4\x19\x10\xe5\x5d\x01\x5a\xaf\x04\x74\xef\x2d\x87\x39\x16\x64\xa0\x02\x52\x0b\x60\x37\x23\x88\xb7\xc6\x7f\xa3\xf1\xd0\xac\xab\x21\xf7\xc3\xca\x42\xf6\xc9\xae\x7d\xbf\x97\x3d\xce\xa5\x29\x3c\x0a\xb0\x9f\x1e\xee\x7d\x83\xb8\xba\xc0\xb2\x50\x15\x50\x3b\x57\x2e\x83\x0a\xa6\x7c\xc1\x20\x13\xaf\x4b\x4c\x6b\x18\xdf\xb4\x42\xa5\xa6\x4b\x8f\xd1\x4e\x7a\x11\x1e\xe4\xde\xb0\x3d\xd4\xde\x1c\x37\x42\x69\x0a\xf9\x11\x60\x15\x86\xaa\x1a\x02\x68\x73\x1e\x5b\x40\x44\x9b\x89\xcb\xb2\x10\x3c\x5c\x6e\x88\x66\xc2\x4a\x03\x6b\xd9\x92\x3c\x96\x32\xdc\xb9\x34\x52\x13\x2d\x17\xac\x5c\x70\xf6\xf8\xca\x46\x05\x8e\xcd\x02\xc6\x36\xb0\xfe\x15\x88\x87\xaf\x7e\x0d\xff\x0b\x1a\x3f\x5a\x0f\x69\xb1\xf5\x1b\x72\xd2\x5d\x9a\xb0\xaf\x99\x7a\x0a\x89\xb4\xf7\x5a\xfd\xcd\x76\xb9\xa2\x34\xb4\x0f\xad\x18\x10\xa2\x24\xb4\xf8\xad\xc1\xba\x98\x0b\xe1\x3a\xb2\x56\x1e\xa2\xcc\x19\xd5\xe1\xa2\x95\x10\x01\xde\xc6\x6d\x39\x00\x3b\x6c\x09\x01\xde\xbc\xc5\xc5\x58\x97\x8c\xf9\x45\x69\xcb\x26\x0a\xe9\x4a\x58\x04\x16\x26\x3d\x80\xe2\x32\xa5\x9a\x2a\xa6\xc3\xd4\xd4\xf1\xa8\xa8\xd1\xbd\x59\x71\x13\x2b\xd9\x9f\xc0\xe2\xca\x20\xaf\x8f\xcb\x06\x4d\xc6\x7f\xb6\xc2\x81\x68\xbd\x69\xc4\x02\xbb\xd3\x21\x58\x7e\xee\xca\x78\x39\x5f\x72\x1c\xa5\x3e\xa0\x7d\xf2\xac\x76\x8e\xdf\x7e\x7b\x73\x15\x2b\x14\xd5\x5f\x3a\xd9\x01\xfe\xdd\xde\x26\x0b\xc8\x60\x13\xe5\x3f\x55\x4d\x75\x07\xd4\x33\xf1\x20\x68\xdf\xdf\xd7\xda\x66\x09\xab\x8d\x0b\x57\x5c\x3d\xec\xf3\x96\xaf\x75\xde\xbe\xef\x7f\xbd\xbc\x26\xf6\xe9\x2e\xfb\x40\xc7\x20\xfb\xb6\x1e\xb4\x6f\xfe\x5f\x2f\xaf\x57\x96\xb0\xa2\x08\xb8\xc8\x32\x27\x9f\x19\x41\xc3\xa5\x8d\xb0\x38\x21\x7a\x83\x00\x77\x18\xde\xa7\x64\x58\x6b\xb1\x31\xf3\x74\x92\x28\xee\x53\xcb\xce\x1e\xd8\x84\xcb\x86\x43\xc6\x81\x6b\x61\xce\x12\x56\x9b\xd1\x53\xae\x1e\x8e\xad\xdf\x28\xd2\xf7\x5d\x09\x48\x5e\x96\x41\x67\x55\xb8\x77\x65\x92\x1a\xf5\xd2\x96\xb2\x22\x8f\xb6\x32\x44\xb0\xfa\xe0\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x3e\xed\xab\x83\x19\x7e\x7d\x8f\xca\x04\x28\x34\xa2\xde\x1c\xcd\xf8\x73\x64\x70\x25\x71\xd4\xa0\xa0\xa5\x06\xc9\xff\x10\x00\xe4\x3b\x77\xe4\xa2\xf1\x40\xec\x07\x82\x6e\xa6\x2e\x12\xb3\xed\x7a\xc3\x95\xef\xa6\xf6\x61\x01\x5a\x1d\x07\x25\x6f\x7d\x59\x2f\xf2\x2a\x65\x8b\x57\x2a\xa5\x5f\x8c\x60\xaa\x2e\xf7\x40\x7b\x5d\x54\x91\x93\x2f\x4e\x42\xc6\xb8\xe3\x39\xcf\x68\x99\x61\x66\x3f\x9f\xf0\xd0\xf7\x64\xf0\xaf\x1b\x12\xdc\x58\x5f\x9f\x90\x33\x59\xc2\xd8\x09\x15\x24\x63\x2e\x0b\xa0\xc5\x15\x4b\x14\x35\x82\xfc\x33\x9e\x09\x24\x0f\x61\x5d\x44\x64\x7a\x10\xf0\x4d\x1d\x37\x68\x39\x99\x56\x81\xa7\xab\x9a\xd8\x73\x61\xa8\xeb\x84\x7c\x6b\xa9\xb3\xe5\x78\x10\x36\x52\x20\xb5\xf8\xc6\xcb\x3d\x99\x97\xa3\xc2\x5b\x51\xc6\xed\x49\xd5\x46\xd6\x6d\xc2\x2f\xf8\x34\xba\x55\x82\x33\xae\x3f\xb0\x42\xee\x95\xc7\xc5\x2e\x57\x0c\x5a\x5c\x9b\x07\x52\x71\xa8\x60\x4e\x35\xa1\x88\xa3\x92\x2a\xa3\x46\xea\x45\x83\x55\x14\x23\x6a\xc7\x59\x61\x3f\x3f\x36\x6b\xc9\x35\x22\xea\xad\x22\xc5\xcf\x64\x64\xb1\x7a\xa7\xc6\xd4\x57\x49\x86\x02\x2a\x54\x90\x1b\xc1\xf5\xa5\xef\x16\x03\x2d\x33\x29\xac\x5f\x9c\xe9\xdb\xda\xc0\x66\x5c\xdb\xf4\xf0\x38\x94\xf9\xd9\xf5\xd6\x31\x68\x5d\xac\x05\xaa\xbb\xfb\x55\x1c\xdd\x86\x56\x1f\xda\xbe\xe4\x6f\x57\x30\xfd\x20\xd2\xb7\xaf\x91\xef\x12\xa0\xa1\x7f\x42\xfd\x3c\x94\x74\xbf\x73\x75\xa8\x5c\x25\x25\x59\x62\x9d\x5c\x84\xa3\xd3\xc9\xe4\x74\x02\x6c\xc3\xe9\xe4\xd4\xb1\x96\x99\x77\x0a\xb7\x54\xb8\x1e\x36\xae\xdc\x60\xfb\xb6\x4c\x08\xf9\xc6\xe5\x69\x80\xe4\xd3\x2b\x1e\xe8\xde\xb9\xbc\xae\xa1\x8d\x69\xfb\xda\x77\x2e\x48\x53\x0c\x3a\xec\xea\xbe\x39\x71\xeb\xb2\x3e\xe3\x0b\x9b\x97\x76\xaf\xa6\xaf\x7a\x82\x91\xf0\xd0\x5c\x99\x55\x22\x7c\xf8\x7a\xbf\x33\x43\x24\x12\x3d\x2f\x8b\x7b\xec\xac\x12\x99\xe7\x58\x16\x6d\xee\x65\xe1\xda\x21\x3c\x14\xf1\x85\xab\x2f\xb0\x44\xdc\xb4\xe3\x1e\x46\xa2\x74\xd7\xe9\x8a\xba\xc2\x3f\xb6\x79\x52\x44\x2d\x54\x01\x5a\x54\x73\x5a\x32\x85\xa5\xdc\x6d\xe1\xea\xee\x7a\xa7\x2b\x58\xde\x8f\xb1\x5b\xd5\x58\x4f\xb1\xb7\xb2\x71\x23\x99\xb6\x15\x25\x95\x4b\x6e\x67\x49\xf2\x2b\x3f\xde\xab\x0f\xd7\x17\x57\xef\xae\x27\xf9\x6e\xed\xda\x01\x50\x33\x13\x69\x21\x79\x77\x86\xb2\x31\x29\xa8\xde\x9d\x3f\x3c\x1c\x7d\xfb\x41\x0f\x81\xbe\x7d\xe7\xee\xf2\xb8\x07\x8d\x3a\x9c\x36\x7f\x5f\x03\x30\xb4\x2c\x64\x26\x67\x41\x89\xaa\x9f\x76\xc2\xbf\xc6\x58\x96\x31\x1d\x87\x54\xfe\x8c\x12\x9f\xf5\xfc\x30\x92\xb3\x9e\xbb\xbd\xac\x37\xcc\xcb\x88\x3a\x28\xb2\xf7\x85\xee\xd9\xb3\x49\x11\x6b\x1b\x89\x7a\x1d\xc0\x81\xae\x48\x69\x5d\x6f\xb3\x60\x65\xce\x31\x36\xf5\x98\xe2\xc5\x81\x4f\xa8\x5b\xb2\x30\x54\xe0\xb6\x13\xac\xe3\x8e\xc6\xf5\xd9\x26\x43\x45\xc9\xc6\xbe\x20\xd8\x94\x67\x10\x7c\x57\x73\x30\x0d\xaa\xd4\xd1\xbd\xd3\x94\x3b\xa5\x3b\xf6\x91\x2d\x57\x35\xe6\x35\x37\xee\x6d\x14\x98\x08\xbd\xbb\x80\xac\xaf\xfe\x6b\x35\x93\x74\x86\x05\xbd\x4a\x9b\x87\xb8\x28\xf9\x82\x67\x6c\x06\xa5\xd0\xb9\x98\xa9\x3a\xa7\xa4\x35\x1a\x77\x0c\x00\xf1\x8f\xac\xa6\xc3\xde\x2c\xf8\x0e\x4c\xc0\x3e\x4d\x16\x02\xf5\xfb\x6f\x3e\x12\xc1\x70\xb0\x4e\xf0\x7c\xa2\x10\x6b\xa6\xd3\x49\x88\x0e\xa1\x25\xdf\x1f\xf1\x3b\x28\x9a\x76\xe6\xaf\x4d\x80\x1b\xa8\xc2\x44\x1d\x22\xa2\x7c\x4a\xd4\x32\xcf\xb8\x78\x18\xf9\x02\x73\x53\x69\x53\xeb\x32\x62\x7e\x70\xe0\x5c\x32\x9a\x3d\x85\x18\xec\x1d\x08\x48\x1c\x21\xd0\x07\xb2\x5b\x00\x23\x69\xee\xea\xbf\x3a\xb4\x83\xba\xa2\x48\x2c\x1e\xe0\x87\xf0\xe2\xb6\x95\xe7\x74\xb6\x57\x47\x67\xe8\xb0\x85\xb6\x05\xf9\xe6\xf2\xc6\xd7\x89\x6c\x2a\x6a\xf0\x5d\x59\x12\x5a\x6a\x3e\xa5\x89\x3e\x27\x45\x05\xd5\x7c\xa0\x36\x89\x25\xb3\xf6\x76\x6c\xf1\x82\xe8\x98\xce\xc7\x5a\x6c\x06\x97\x34\x25\xb3\x85\xe9\x5f\x43\x51\x70\x90\xf3\xab\xc2\x3a\x51\x60\x00\xb0\x2d\x0e\x75\x5b\x65\xd9\xad\xcc\x78\xb2\xf4\x85\x2d\x50\xdd\x94\x1a\x54\xd4\x89\x8b\x2e\xb2\x47\xba\x54\x6f\x9a\x33\x27\x14\x9e\x11\xaa\x35\xcb\x0b\x04\x19\xb3\xdc\xd5\x04\xd7\xb5\xc6\x09\x0b\x2e\xbb\xc2\xfa\x53\xca\x33\x7f\xf7\x2b\xfb\xa0\x13\x97\x8f\xc9\x7b\xb6\x60\x65\x7b\x26\xc2\x3c\x82\x4e\x54\x7b\x74\xd8\x78\xe0\x66\x2a\x05\xf2\x1c\xd6\xd2\x58\x3b\xa8\x8e\x59\xf2\xe9\x4a\xb7\x58\x87\xc6\xc2\x44\xf7\x94\x6f\xa6\xef\xa5\xbe\xc5\xb7\xdb\x33\xc7\x39\x6f\xe9\x9f\x66\x86\x1b\x5b\xba\x71\xcc\x61\xa6\x5c\x3d\x3c\x69\xb2\x5e\xfe\x6c\x6e\x79\x38\xd0\x41\xe5\xe5\x12\x13\x58\x02\xe4\xd9\xd1\x0c\xf4\xc1\x6f\xa9\x59\x96\x85\xf8\x92\xd9\x10\xfa\x91\x05\xc2\x66\xc8\x3c\x7b\x84\x8a\xfc\xba\xae\x10\x6d\x55\x4d\x89\xcc\x19\xa1\x0b\xca\x33\x7a\x9f\x81\x67\x89\xe9\xdc\xf6\x15\xa0\x71\xb8\x80\x55\x81\x45\x55\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x36\xd4\xbc\x36\x38\x81\x4c\x26\x0f\x4d\x7e\x03\x2a\x9a\xc1\x2b\x18\x87\x90\x82\x0f\x26\x4d\x53\xa2\xf8\x4c\x40\x49\x6c\xa1\x49\x46\x35\x13\xc9\x72\x42\x6c\x0a\x6f\xd5\xa8\x18\xae\x4b\xee\xe3\x18\x04\xd4\xeb\xaf\xab\xa4\x26\x0f\x72\x3a\x5d\xa9\x30\x6e\x4d\xbd\x16\x51\xe0\xea\xa9\x92\x02\x07\x67\x4a\xd1\x59\x10\xa2\x58\x2d\x19\x84\x3b\x6f\x93\x4e\x38\x74\xe4\x32\x4a\x38\x57\xad\xd2\x85\x02\xd7\xa1\xbe\x1e\xda\xca\x4a\x68\x9e\xb3\x95\x6c\xab\x04\xf4\xd5\x6b\x2e\x1b\x66\x28\x9b\x8e\x16\x02\x71\x6c\x60\xaf\x2b\xc5\xc3\x53\x3b\xbf\x35\xdb\xf6\x2a\x42\x05\xff\xc6\x90\xf5\x36\xf0\x32\xc0\xa2\x5b\x22\x14\xf5\xb6\x69\x7e\x6a\x2e\xe5\x0c\xe2\x8a\xeb\x83\xfe\xfe\xb7\x3f\x4c\x16\x4d\x9b\x0a\x7c\x6e\xc8\xe7\xb9\x99\x59\xce\xca\x99\xab\x35\x93\x53\xc1\xa7\x4c\x99\x53\x5f\x1a\x10\xb1\x7a\x4b\x28\x46\xf5\x68\x80\x03\xbd\x47\x56\x16\xd2\x89\xdb\x3e\xae\xe8\x44\x1b\xa7\x54\x8b\x65\x67\xa5\x3c\x87\xfd\x85\x74\x5e\x9f\x58\x52\x69\xb8\x27\xe0\x35\x40\xce\x84\x34\xcf\x3a\x6d\xa0\x77\xd5\x3d\x32\x5c\x30\xc0\xca\x74\x5d\xe5\x35\xdd\x38\x9b\xce\xdd\x52\xd5\x7d\x81\x7b\xc5\xa6\x86\x27\xf8\x62\xf2\x4f\xff\x14\xb2\x60\xf4\x5e\x85\xde\x15\x4b\xaa\x92\xeb\xa5\x41\x6f\xec\x93\x9e\x4c\x15\xd4\x31\xb9\x84\x14\x1d\x96\x78\xcd\x29\x28\xc8\xd0\xd5\x15\xaf\x48\x0d\xbc\x06\xa0\x8e\xee\x97\x57\x78\xca\x7a\x08\x5e\xce\x2e\x7b\x6a\x11\x98\x81\xc0\x1a\xcc\xd5\x84\xdc\x4a\xa5\xb8\x39\x7f\x9f\xd7\x29\xc8\x59\xf9\xc5\xd0\x73\xd3\x3e\x3b\x8a\x4e\x40\x6a\x79\xd9\x34\xbd\x7b\x05\x4d\x5e\x1f\xe1\xc1\x8c\xf3\x06\x92\xa3\x6a\xa2\xe9\x6c\xa5\x74\x8a\x2c\x5b\x8b\xae\x73\x70\xef\xd9\xae\x62\xd7\x78\x88\xdb\xf4\xc1\x09\xdf\xe4\x66\x15\x60\xda\xf1\x1d\x36\x2b\x53\xc8\x36\x7e\xc9\xe6\x74\xc1\x36\x12\x81\x42\xa6\x93\x0d\x78\x13\x80\x35\xa4\x6b\xc3\xb4\xfb\x30\x0a\x9f\x21\x48\x29\x96\x43\x62\x92\x2d\x64\x67\x13\x0d\xbd\x5f\x92\x4c\x4a\x48\x34\x51\x15\x44\xc8\x94\x19\x30\x03\x37\x0d\x9a\xa9\x11\xb9\xbb\xb0\x2f\x16\x8d\x21\x31\x69\x1c\x70\x48\x05\x4b\x36\xbc\x70\x00\xb9\xbb\x91\x0f\x1d\x89\x66\x88\x17\x5d\x2b\x0a\x42\xda\xf0\x9d\xba\x24\x8f\x2d\x54\x92\xb1\x05\x03\x43\xe3\x94\xcf\x08\x26\x62\xcf\x6d\x6a\x3e\xe7\x35\x25\x4b\x48\x6f\x5d\xf2\x34\x44\x58\x5e\xa5\xef\xe6\x40\x1e\x65\xf9\x90\x49\x9a\x36\xf2\x12\x29\x92\xf1\x07\x46\xae\x58\x91\xc9\xa5\xcd\xa7\x27\x52\x72\xa7\xa9\x66\xd3\x2a\xbb\x0b\xda\xc8\x50\xf9\x57\x25\x8a\xef\x55\xfe\x35\x1d\xae\xc8\xbf\x37\x77\x97\x77\x37\x2f\xd2\xdf\x37\x42\x9f\x0c\x0b\x7b\x3e\x1b\x18\xff\xa9\xcb\xaa\x3d\x26\x59\xd5\xfd\x0e\xfa\x09\xdc\xca\x52\xd3\x6c\x4f\x0c\x4d\x32\xa7\xc5\x45\xa5\xe7\x57\x5c\x41\x8d\xa2\x58\xbe\x66\xed\xfb\x46\x6e\x21\x06\xca\x62\xcb\x56\x12\xee\x00\xc9\xbe\x77\xf9\xaf\x17\xb7\x84\x56\xe6\xf0\x35\x4f\x80\x08\xee\x4d\xad\xdf\x5c\xd9\x1d\xe6\xdc\xec\xb9\x2e\xfb\x75\xc7\xaa\xdc\x5b\x87\x5e\xd3\x73\x45\x49\x0f\x2e\xd0\x47\x74\x81\x06\x64\xb5\x4f\x2e\x8b\x0b\xae\x39\xd5\xb2\x3c\x94\xef\x68\x6b\x00\xef\x52\x52\x29\x2d\x73\x7b\x41\x6e\xdc\x1b\x10\x6b\x14\x68\x28\x58\xeb\xb6\xf6\x48\x01\xf3\x25\x6c\xd4\x8d\xd0\xac\x9c\xd2\x84\xad\xe4\xf9\x18\x81\xd6\x09\x47\xe7\xee\x9d\x80\x71\xff\x64\x9d\xb1\xa0\x24\x74\xf6\xe7\x37\x7f\x6a\x78\x53\xff\xd9\xf3\x65\x56\xd7\xd5\x64\xc1\x04\x4b\x42\x34\x56\x71\x27\xf7\x53\x2c\xde\xe2\x3f\x89\x15\xaf\x32\xdc\x82\xff\x57\xd1\x0c\xb7\x2e\xec\x00\x62\x26\xd9\x3a\x86\x83\xc0\x57\xfb\xa0\xed\xfa\xfc\xa9\x62\xfc\x1a\xe0\x13\x94\x13\x85\x5d\xb4\x2e\xa9\x50\xe6\x20\x63\x25\xa4\x53\xcb\x23\x9e\x92\x33\x9d\x14\x01\x4e\xe6\x51\x01\xa0\x3e\xf8\xd3\xfe\xa3\xe3\x83\xf8\x2c\x59\x59\x25\x9a\x5c\x1c\x6e\xc6\x47\x04\x87\xaf\x7d\x96\xac\xd0\x55\x1d\xc4\x8f\x1d\x6e\xd7\x41\xdc\x73\x6c\xd7\x1e\x4a\x9a\x8b\x47\xd6\x89\x7c\xcd\x95\xc6\x7c\x1a\xf8\x32\xc4\x53\x63\xc6\x21\xc3\xf1\xde\x1a\xd1\x80\x17\xff\x49\xd3\xb4\x7c\x83\x54\xde\x29\xbe\xcb\x90\x70\x79\x23\x97\x68\x5f\x2d\xd1\x89\x1b\x67\x7a\x59\xd8\xd2\xfc\x1f\x2f\x6f\xa1\x2f\x45\xfe\xf8\xcf\xaf\x81\x05\xfe\xa7\xdf\xff\xf3\xeb\x60\x30\xfb\x2c\x53\x13\x91\xff\x81\x2e\xf5\xc7\x48\x79\xd1\x4a\x5b\x01\xa9\x9e\x0d\x0f\x7a\x87\x19\x1e\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xfb\x71\xaa\x43\xde\x85\x21\xef\x42\xdd\x86\xbc\x0b\x9b\x27\xd6\x90\xd4\x0f\xe2\xf5\xd1\xe8\x1f\x32\xeb\xae\x53\x39\x24\x70\xb7\x9f\x23\x81\xeb\x3c\xd0\x6e\x74\x11\xb7\xa5\xcd\x58\xb7\xb0\xe4\x66\x75\x2e\xb0\xab\xf7\x77\xff\xf9\xf5\xc5\x97\xd7\x5f\xc3\x3a\x6d\xf0\x9c\x01\x6b\x2e\x9e\xa0\xc9\x3a\xc2\x25\x0a\xdd\xeb\xfd\x7a\xe9\x8b\x15\xff\x7c\x41\xde\xbf\xbd\x8b\x74\xcd\xdf\xef\x76\xae\xca\xdf\x62\x1a\xb2\x6f\xc7\xf5\xfe\x33\x2f\x29\x56\xee\x2f\x51\xe0\x41\x9d\x04\x1b\xc5\x5f\x5b\x5a\x1c\x73\xd2\xb8\x8a\x23\xa8\x51\xba\x8e\x91\x7c\x26\x8e\xdc\x66\xd3\x70\x23\x5f\xa4\x0b\xf7\x61\x8e\x24\x94\x67\x2e\xe3\xb3\x5d\x06\xe6\x88\x2b\x1b\x29\x31\x0d\x42\x42\x12\x51\x1a\xe2\x69\xc8\x26\x53\xca\x11\x8c\xcf\x15\xaa\x8b\x4d\xf5\x2b\xf6\x89\xea\x37\x0e\x60\x6b\x57\xb8\xe2\x1b\x0d\x0f\xf9\x96\x4d\xb6\xcb\x9c\xb4\xa5\x36\x49\xc3\x48\x0a\x04\xb0\xa0\x49\x37\x29\xdf\x5b\x71\xa3\xd5\x7a\x25\x90\xe1\xff\xe8\xc4\x04\x46\xdd\x63\xce\x15\xdf\xdf\x21\x2e\x9a\xef\x7c\x35\xfd\x2c\x8d\x39\x62\x42\x95\x77\x9f\xab\xea\x82\x20\xa1\x79\x6a\x9f\x19\x06\xc8\x0b\xa4\x44\x7f\x3b\x98\x02\x65\xdf\xca\x93\x62\x2e\xb5\x14\x87\xcb\x86\xb5\xa9\xff\x36\xe2\xba\x85\x37\x2e\xeb\xda\x44\x35\x0c\x60\x42\x0c\x6f\x27\x5f\x71\x0d\xb7\x36\xf1\x38\xaf\xf0\x66\xdc\xe9\xed\xa6\xb9\xed\x0e\x41\xdd\xb8\x9c\xc3\xa7\xbe\x8b\xc9\x17\x75\x73\xb5\x27\xcc\x35\x24\x95\xc6\xf6\x42\xcb\x7f\x98\x93\x8e\x3c\x1c\xf3\x89\xdb\xf5\x9b\x2b\x2b\x68\xb8\x94\x7b\xca\xde\x07\xb2\xfd\x2a\xee\x8d\x77\x92\xa5\x7e\x94\xe5\x01\x92\xed\xb7\x7b\x5e\x89\x21\xb4\xbf\xad\xa5\xda\xdc\x3b\x5e\x69\x4f\x22\x2a\x77\xde\xea\x0a\xcc\x8e\x76\x0c\xbd\x25\x71\xde\xa7\x74\xe2\xfa\x9a\x24\x32\x6f\x15\x31\x9c\x33\xe4\x03\x2e\xef\x6e\xde\xf1\x19\x4e\xc5\xcd\xda\xd5\xf7\x1a\xcf\xa8\xee\x1a\x9a\x2b\xd2\x65\xb3\x3d\x00\x8e\xc3\xf3\xfb\x1c\xf0\xdc\x1d\xe0\xb9\x06\x14\xee\xc2\x77\x2f\x15\xdd\x3d\x2f\x9a\x3b\x0a\xbf\xf6\x8b\x4a\xff\xee\xae\x47\xe4\x8e\xb9\xcf\xac\x12\xd6\x9c\x75\x4d\x1a\xa8\x47\x6a\xf6\xbd\xbd\x91\x82\x52\xfe\x1d\xf0\x56\x04\x15\xf0\xdf\xa0\x95\x16\x50\x28\xcd\x32\xb3\xab\x52\xd4\x95\x54\x54\xed\x9c\x8b\x9e\xac\x39\x2d\xac\xa3\x6e\x2a\x1f\xc5\x23\x2d\x53\x72\x71\x7b\xb3\x1f\xec\x15\x91\x1c\x09\x61\x2d\xac\x6e\x61\x8f\xf4\x48\x75\xf7\x40\x19\x34\xd6\xbd\x64\xe4\x9e\x6b\xd5\xaa\x9f\xdb\x50\x79\x19\xb2\xe7\x9d\x72\x20\x3a\xa6\x2e\xe2\x18\xc5\x86\x09\x22\x13\x4d\x33\x6b\x4b\xbb\x67\xfa\x91\x31\x41\x5e\xbf\x7e\x8d\x76\x8c\xd7\xff\xf2\x2f\xff\x02\x9e\xe4\x24\x65\x09\xcf\xd7\x5f\x84\xb7\xfe\xd7\x17\x5f\x84\x0c\xfa\x6f\x17\xef\xbe\x26\x34\x01\x99\x12\x6b\x15\xe1\xd8\x70\xc0\xcd\xee\xd5\x88\xfc\xdf\xbb\x6f\xde\xd7\xb5\x2d\xdb\xbf\x02\xfc\xf8\x2d\x0a\x92\xc5\x6c\x64\x14\x87\xd8\xb5\xda\x56\x41\xf5\xdc\xc7\x03\x51\xb0\x74\x36\xa2\xc6\xec\xdd\x0f\x72\xf4\x83\xf2\x05\x7c\x36\x87\x4d\xe5\x02\xe0\x37\xe3\x89\x4d\x4c\x85\xd6\x23\x57\xe5\x03\x93\x07\x60\x90\x8f\x23\x2f\x01\x63\x98\x05\x8f\xd0\xdd\xda\x06\x0f\xd5\x85\xcf\x4b\xa6\x8c\xa8\x69\xeb\xfe\xe2\x70\x35\x0c\x05\x95\xc7\x3d\x9c\xf3\x8b\xbd\xdc\x07\xd1\x5b\x5a\xbc\x61\x59\xe4\x8c\x2b\xdd\x28\xed\x69\xd1\x0e\xa8\x88\xc9\x35\x4d\xe6\x84\x09\x0d\x49\xb7\xf0\x80\xcd\xeb\x01\x83\xcc\xa9\x48\xcd\x0d\x83\x1a\x10\x30\xe0\x33\x79\xae\xf4\xf1\x05\xb8\xf5\x7b\xd0\x8a\x90\xac\x31\x32\x35\x12\x70\x13\x4c\x6b\xc6\xa4\x11\x79\x16\x58\x26\xf7\xfa\x13\x85\xdc\x1c\x66\xab\x50\x5d\xac\x6c\x14\x9c\x6a\x56\x2c\x0b\xe9\x2c\xb2\xbe\x7e\x9c\xff\x05\x21\x09\xa6\x5c\xf9\x58\x56\x4a\x7f\x59\x99\x03\x0e\xad\x8f\xda\xb7\x22\xed\xe5\xda\x88\xe8\xfa\x60\xed\x7d\xa0\x05\x4e\x12\xa6\x10\x94\x7f\xc4\xe0\x1a\x5d\xbf\xfd\x23\x6e\x64\xf0\x78\x72\xba\x69\x48\x17\x2e\xcb\x85\xc1\xfd\xb4\xd2\x72\x0c\x25\xd1\x5d\x9a\x96\xce\x80\xe9\xba\x5d\x64\xc5\x9c\x8e\xa0\xaa\xb0\x67\x62\xd7\x47\x6c\x00\x60\xb3\x0e\x71\xc4\x38\x3b\x56\x61\x10\x9e\x35\xf4\x03\x64\xd5\xd5\xa3\x05\xcd\x19\x84\x75\xe1\xc4\x82\x07\x5b\xa9\xbc\xa7\xf8\x4c\xb0\x12\xb5\xb4\x10\xf8\x4b\x32\x7a\xcf\x32\x3b\x94\x2c\x23\x96\xf1\x95\x0b\xa1\x63\xa5\xc1\x9e\x8a\xd0\xd9\xac\x64\x4a\xf1\x05\xb3\x91\xd3\xfc\x1f\x75\xc5\xbf\x39\x23\xb7\xd7\xef\x5c\xfc\xb8\x22\x86\xb1\xd5\x2c\x24\x5b\x20\x36\x9f\xab\xd2\x80\x56\x2d\x7b\x4c\x08\xb9\x56\x52\x43\x1d\x3b\xd3\xbf\x3d\x12\xe5\x2b\x69\x83\x97\xe9\x18\x02\xc5\x63\xf6\xac\x0e\xfd\xc1\x18\xf3\x39\xa3\xa9\x0b\xb6\x35\x2c\x65\x51\x18\x49\x9a\x5c\x9a\x2b\x3a\xe5\x46\xb0\x56\x36\x1c\x3b\xad\x8c\xa8\x42\x03\x12\xc1\xd5\xed\xe3\x9c\x11\x59\xa6\x0c\xeb\xc0\x4f\xc1\x99\xc7\x77\xdb\xa0\xef\x90\x77\x88\x9b\x91\xee\xb9\x2e\x69\xb9\x44\x8a\x69\x4f\x22\x78\x38\x83\x33\xb1\x96\x3e\xf4\x0a\x23\x43\x2c\x15\x09\x49\x9c\xe7\x5a\x24\x42\x23\x11\x12\x76\xdd\x82\x6c\xeb\xae\xc5\xe2\x4c\xd3\x00\xfc\xef\x2c\xf4\x87\x7f\xf6\x94\x42\xde\x84\xe0\x78\x20\x32\xac\x23\x03\x1f\xfa\xaf\x93\xb9\xa5\xeb\xed\x2b\x4a\x08\x4a\x82\x34\xa6\x3c\x3f\x71\x61\xd8\xdc\x21\x01\xef\x95\xcf\xf4\xc4\x30\xd0\xba\xa2\x59\xb6\x1c\xb3\x4f\x86\x94\x98\x4b\x0c\x34\x14\x72\x71\x82\x3b\x7f\x25\x14\xd3\xa3\xa8\x21\xe1\xf2\x15\x25\x26\x99\x50\xe4\x04\xd7\x24\x24\x64\x9d\x3a\xc1\x6e\x8d\x20\x70\x5f\x69\x74\x81\x1b\x6d\xfe\x24\x6e\x9d\x0b\x56\x2e\xed\x08\x11\x1f\xf6\x00\x67\xd2\x13\xe6\x08\xdc\x41\x9d\xcc\xaf\x3f\x15\x25\x86\x1e\x45\x7e\xbd\x02\x7e\xab\x9d\x61\x6a\x26\xc7\x3d\xb6\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\xd6\x7c\x02\x58\xec\xe2\xfd\x55\x0c\xfa\xc2\x16\xc3\x22\xb6\x5b\x30\xc3\xd8\x6e\x4f\xb9\x81\xd8\x2e\x76\xec\x8d\x4d\x6f\xe5\x7e\xc1\x0c\xcc\xae\x90\x9a\x93\xea\x28\x79\x60\x16\x09\x1b\xc9\x13\x94\x5d\xf6\xe5\x1e\xd3\x29\x19\xc4\x73\x63\x80\x3a\x5b\x42\xb7\x38\x52\xec\x59\xf4\x06\x67\x37\x91\x58\x3c\x5d\xb7\xb1\x99\x7a\xaf\xef\xdc\xf6\x45\x7f\xdc\xf7\x0e\x62\x7b\x60\x01\xaa\xbd\x4d\xad\x05\x7f\xe6\xbc\x9c\xd4\x06\x30\x65\x1e\xf8\x18\x39\x0f\x46\x14\x12\x38\x2b\xa2\x65\xfc\x91\x92\x3e\x1e\xb3\xed\xe6\xb6\x78\x0f\x0b\xee\x75\xe1\x9a\x73\x68\xdb\x46\x1e\xd8\xf2\x54\xe1\x0d\x30\x18\x6c\xce\x0b\x2c\x40\x66\xc8\x83\x91\x80\x7b\x5e\x03\x6c\xdf\x41\x0a\x1b\x37\x30\xe2\xb8\x1b\x31\x22\xef\xa5\x36\xff\xbb\xfe\xc4\x95\xe5\xf6\xae\x24\x53\xef\xa5\x86\x27\xcf\x72\x42\xb8\xd0\xe7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x3b\xc4\x9f\x25\x57\xe4\x06\xd2\x97\xe3\x96\xf6\x1c\x1a\xfc\x77\x5d\x6e\x14\x33\xb0\x93\xb1\x21\x7f\x8e\xf5\xa4\x5f\x1f\xd9\x9e\x9f\x2c\x5b\xc7\xb7\xf7\x49\xd8\x09\x80\x6e\x0c\x7f\x81\xb4\x6e\x45\x46\x13\x96\xba\x1c\x55\xd4\xec\x14\xd5\x6c\xd6\xe9\x63\xbe\xad\xe5\xac\x9c\x81\x2a\x2f\x09\xca\x95\xb8\x61\x01\xbd\x09\x31\xb6\x9e\xe4\xb8\x39\x78\x6f\xf0\x7f\x62\x84\xd2\x01\x3b\x03\x1e\xeb\x6b\x83\xda\x9f\xc6\xab\xf5\xb8\x97\x8d\xa1\x91\x2b\xc9\x69\x61\xee\xe4\x7f\x19\xe6\x03\x40\xf5\xbf\x49\x41\x79\xa9\x26\xe4\xc2\xe5\xce\x6a\xfe\x66\xa5\xc7\x46\x37\x3d\xa6\x50\x80\x47\xf0\x4f\x15\x5f\xd0\xcc\x66\xe2\xa0\x82\x30\xcc\x2d\x66\x66\xb3\xca\x84\x8e\xc8\xe3\x5c\x2a\xe4\x64\x7c\xf8\xcd\xc9\x03\x5b\x9e\x8c\xa2\x34\x18\xae\x35\x6f\xfc\xc9\x8d\x38\xa9\xb5\xc5\xad\xdb\xea\x79\x34\xf0\xaa\x3d\x81\xdf\x4e\xf6\xcf\xe7\xf6\xe2\xac\xfa\x56\xae\xde\x34\x81\xe8\x2b\xf6\x94\x78\x98\xba\x85\x47\x7a\x61\xdb\x87\x98\xec\x60\x7a\x83\xe2\xec\x7e\xe9\xb2\xc8\x59\x41\x75\x5d\x8e\x8d\x1a\x12\x64\xde\x86\x7c\x6c\x40\xac\xa5\x22\x88\x17\x29\x23\x0f\xca\xa5\xc4\x39\xd6\x26\x1b\x7a\x5a\x56\x6c\x44\x52\x29\x4e\xb5\x55\x77\x35\x33\x2d\xae\xe6\xb3\x4a\x37\x9c\xc3\x99\x3a\x8f\x1a\x94\x96\x0c\x12\x6c\xb9\xcc\x91\x56\xc3\x80\x59\x17\x41\xd3\xa9\x9d\x87\x88\xf9\x73\xd3\x90\xe1\x01\x79\x76\x48\x1b\x96\x27\x24\xe0\x2e\xc8\xe5\xdd\x1c\xb6\x3e\xf4\xc6\xe0\x6d\xed\x69\xd4\x78\xbb\x80\x08\xb0\x78\x1d\x26\x88\x6a\x91\x7f\xb0\x52\x46\x8d\xb0\x41\x75\x14\x0f\x9d\x61\x16\xfd\xba\x85\x05\x9e\xd4\xad\x05\x9a\x1f\x80\xbd\x5f\x58\x43\x25\x24\xeb\x6c\xe4\x25\x29\x25\x1e\x0d\xf8\x3c\xc0\x0f\xf7\xb0\xaa\x83\x5f\xb9\xfa\xa8\x5e\xa8\x02\xb0\xa1\xb5\x8f\xa3\x56\x1d\x5a\xbd\x8f\x73\x56\x6b\xe4\xe5\xd4\x56\x82\x47\xa3\xc3\x53\x41\xd1\xe7\xda\xa8\x04\x26\xae\x40\xab\x78\x1f\xf5\x78\x8f\x63\x45\x7f\x8b\x77\xb4\xe8\x65\x05\xf3\x5f\xb7\x4a\xfe\xd3\x7b\x59\x69\x97\x2e\xc4\xfe\x0e\x85\x95\xb5\x74\xf6\xc7\xc3\xa9\xce\xfb\xe8\x38\xa2\x19\xf9\xa7\x80\x34\x7a\xc2\xb4\xfd\xb0\x46\x84\xd1\x64\x6e\x38\xc0\x31\xba\x59\x18\x2e\xd5\xb1\xa3\x57\x66\xeb\x90\x31\x94\xab\x24\x26\x0e\xf8\xfc\x69\x38\x90\x6b\xf8\xe7\x38\xb3\x91\x73\xb9\x54\xd6\x75\xcd\x32\xa7\xa2\x0e\x5d\x88\x1a\xd3\xa9\xe7\x5c\x3e\x64\xab\xfa\x81\x55\x82\x8c\xba\x52\x3e\xcb\xc8\x1e\x2c\x35\x9f\xf9\x8b\x11\x35\xde\x86\x15\xd5\xd9\x74\x0c\x36\xb5\x7e\x45\x95\x58\x1b\xc9\x10\xbc\xe8\xd1\x30\xb5\xa6\x59\x08\x75\xaa\xad\x46\xf6\x1e\x48\x10\x0d\xfe\xe6\x75\x5e\x4b\x7b\xaa\xfe\x30\xe2\xc4\xef\xc6\x11\x29\xe6\xf3\x3b\xb3\xb2\x94\xa5\x59\x13\x53\x8a\x70\xd8\xe5\x9c\x96\x0f\x2c\xf5\x5c\xd2\x84\xdc\x9a\xc5\x3b\x19\x3d\x6a\xcc\xd2\x51\x23\x97\x27\xba\x59\x89\xcd\x4c\xe8\x74\x32\x39\xb5\x65\x13\xd6\xeb\xb2\x45\x63\xaf\x58\x81\xbc\x87\x18\xde\xba\xbf\xef\x68\xa1\x50\x1d\x61\xd8\x1b\x50\x47\x4a\x28\x88\xa8\xe7\xce\xa6\x48\x23\x42\x6c\x56\x97\xd3\x43\x00\xea\xab\x56\xee\xa3\x52\x8e\x32\x1c\x62\xeb\xaf\x46\xee\xa5\x42\xde\xa6\x3e\xb6\x27\x65\x6f\x7c\x5f\xcd\x7f\x2f\x0d\x4c\x1e\xe4\x12\xb8\xda\x9e\xae\x76\x04\xd7\x2e\xae\xc8\x37\x4e\xf6\x09\x73\x18\xd4\x73\x5b\xee\xbb\x8f\x9e\xec\x59\x3c\x06\x57\xdb\xf3\x79\x10\xae\xb6\x9b\x29\x26\x11\xdf\x58\xf5\xb1\xe9\xd2\xe9\xd9\xba\xc0\x94\xbb\xab\xed\x18\xae\x85\xab\xed\xc0\xae\x86\xab\x2d\xce\xf5\x70\xb5\xc5\xb8\x22\xae\xb6\x58\xe9\x0c\xdb\xd3\x2f\x70\xb3\x04\x5c\xd9\x12\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x45\x03\xc9\xf5\xba\xb7\x96\x50\xe3\xd5\xa5\xf7\x4a\x66\x95\x0e\xaf\x33\xb7\xad\xbb\x26\xdd\x87\x89\x3b\xcd\x66\x2c\xb1\x5f\xed\xb8\xc1\x37\x00\xd7\x86\xe4\xb8\x5f\xaf\xfb\xd0\xfc\xf5\xd7\x82\x1f\x53\xf5\xf7\x94\x84\x4f\xd8\x8e\x9d\xf6\x09\xdb\x91\x93\x3f\xb9\x41\x9f\x92\x02\x0a\xdb\xf3\x26\x82\xc2\xd6\x13\xbc\x63\x92\x42\xb9\xf6\x64\x2d\xab\xcf\x5c\x8e\x14\x73\xe9\x33\x0b\xb7\x84\x20\x48\xd4\xa4\x15\x4a\x63\xce\x8e\x68\x4b\xb6\x1c\x58\x55\xf7\x74\x75\xbf\x8b\x51\xb9\xb8\xbd\xe9\xa5\x45\x69\x7c\xbf\x45\x8f\xd2\x7c\xe3\x17\xac\x49\xb9\x41\xd5\x48\xd3\x27\xeb\xaa\x5e\xb9\x8d\xb3\x8c\x64\x6d\x9e\x47\xa6\x5c\x9b\xf6\x5b\x43\xd7\x9b\xb9\x4a\x1b\xe7\xac\xa5\x0d\xe9\xa9\x39\x00\x4b\x65\x5d\x6d\x1e\xf4\xe5\x8d\x71\x02\x27\xcf\x23\x7f\x1e\x51\x96\x84\xfd\x08\xca\x23\xb9\xda\x5a\x27\x75\x5a\x97\xcf\x40\x65\x33\x2a\xbe\x1a\xda\xb6\x42\xa6\x6f\xd0\x48\x4a\x85\x90\x58\x1e\x4a\x8d\xd0\x50\xa1\x46\xd6\x0c\xd3\x48\xd1\x21\x52\x52\xf1\x14\x3d\xa0\x7d\x76\x81\xd3\xcf\xc9\x31\x0d\x96\x7f\x1b\x7b\x94\xe4\xc9\x1e\x66\xb4\xe0\xdf\xb1\x32\x2c\x8b\xfd\xa6\xd6\x3a\x58\xdb\x93\x3b\x45\x95\xcc\x59\x4e\xe1\x9f\x6f\xdd\xf2\x0c\xaa\xb1\xfe\xf5\xa0\x96\x63\x65\x6e\x58\x8f\x51\x2b\xca\xf4\x64\xf1\x45\x94\x7f\x6c\xdd\x9e\xe8\xe2\xe1\x4f\x61\x0f\x9b\x71\xdb\x12\x31\x0c\x70\x83\xa6\x00\x8c\x2b\x2e\xd3\x8c\x57\x5b\x1a\x2a\xb3\xc0\xdd\x7b\x86\x85\xef\xc7\xfc\x8e\xed\xb9\xf4\x34\x7d\xf5\x33\x23\xcf\xfb\xb4\xb5\x2d\x3d\xa6\x30\xe8\x67\x06\xfd\xcc\xff\x68\xfd\x4c\x83\xb0\x3b\x5c\xbf\x41\xed\xd2\xcc\x88\xea\x74\x2f\x75\xdd\x83\x09\x6a\x3f\x9d\x1a\xc5\xe9\x50\xea\xba\x82\x68\xfe\x38\x9d\x4c\x4e\xd1\x00\x32\xf1\xea\xd2\x4a\x4f\xc7\x7f\x24\x4c\x24\x32\x35\xfd\x60\x55\xc0\x52\x69\x60\x2d\x6b\x89\xbd\x39\x97\xdc\x8d\xd5\x34\xa1\x40\xdf\x7d\xb9\x87\x5e\x28\xd8\x45\xe5\xbf\xdd\x0f\x83\xd5\x0b\x81\xd6\xac\x98\x2f\xc6\x64\xb7\xcc\xd7\xa7\xb2\x3c\x59\x9d\x43\x20\xe3\x39\xb7\xde\xc9\x06\xbb\x30\xa5\xe3\xdd\xf7\x08\x39\xc3\x6e\x26\x49\x51\x8d\x6c\x97\x93\x9c\xe5\xb2\x5c\x8e\x7c\xb7\xe6\xc7\xd6\x38\xf6\x8d\x73\x60\xfa\x92\xaa\x2c\x99\xd0\xd9\x32\x34\xb9\xd4\xa6\xf6\x8c\xdc\x9f\xdb\xd1\x23\x33\x7f\xfe\x60\x63\xfd\x4b\xea\xd6\xbe\xff\x75\xf1\x41\x50\xc8\xf9\x5d\x01\x1a\x63\xd3\xd8\x8d\x6a\xfd\x84\x79\xca\xc4\x82\x2c\x68\xa9\xe2\xef\x1b\x79\x3a\xbf\x97\xf2\x05\x57\x7b\x09\x39\xb8\xb3\xc4\x0f\xf5\xcc\xb2\xd2\x45\xa5\x2d\x3a\x76\xd7\xc8\x95\x21\xf3\xd7\x67\x85\xe9\xfd\x22\x5c\x45\xd4\x6c\x05\xd5\x9a\x95\xe2\x0d\xf9\x8f\xb3\x7f\xff\xdd\xcf\xe3\xf3\xbf\x9c\x9d\x7d\xff\x7a\xfc\xbf\x7f\xf8\xdd\xd9\xbf\x4f\xe0\x1f\xbf\x3d\xff\xcb\xf9\xcf\xee\x8f\xdf\x9d\x9f\x9f\x9d\x7d\xff\xd5\xbb\xbf\x7e\xbc\xbd\xfe\x81\x9f\xff\xfc\xbd\xa8\xf2\x07\xfc\xeb\xe7\xb3\xef\xd9\xf5\x0f\x81\x9d\x9c\x9f\xff\xe5\x37\xbd\xa6\x4b\xc5\xf2\x9b\x1e\xf8\x0d\xdb\xf8\x89\xf4\xb1\xdd\xcb\xbe\x3c\xc1\xb9\xd0\x63\x59\x8e\xb1\xbb\x37\xe0\xb2\xd8\xa3\x53\x07\x16\xfb\xb8\x87\x35\x1d\xae\x0b\xeb\x39\xe1\xe3\x19\x2e\xda\xbe\xe4\x8b\x3d\x18\x0b\x30\xeb\x4d\x2f\x9d\x21\x7e\xba\x45\x5d\x68\x7f\xfc\x05\x6b\x0a\x3f\x1b\x9f\x2b\x5b\xa0\x64\x70\xb8\x7a\x76\x87\x2b\x3c\x89\xc1\xdb\xaa\x5e\xdc\xe0\x6d\x05\x6d\xf0\xb6\x6a\xb6\xc1\xdb\xaa\x35\xee\xe0\x6d\x35\x68\xf3\x06\x6d\xde\xf3\x6b\xf3\x06\x6f\xab\xc1\xdb\x6a\x73\x1b\xbc\xad\xba\xdb\xe0\x6d\xf5\x3f\xcd\xdb\x0a\x41\x6c\x93\xcf\x95\x95\x48\x6b\x87\xab\xcf\xce\xdf\x4a\x99\x43\x4e\xd8\x45\x92\xc8\x4a\xe8\x8f\xf2\x81\x05\xfb\x0b\xac\xe8\x50\xd6\xfa\x81\x1a\x83\x5b\x74\x2a\xeb\x2f\x1f\x4d\xc1\xf2\x02\xf3\xc1\xd1\x2a\xe5\x4c\xc4\x69\x08\x9f\x82\x7a\xdd\x78\xcd\xaa\xd8\x22\x65\x69\xfd\x83\xc5\xcb\xda\x1c\xcd\x84\x5c\x90\x92\x25\xbc\xe0\x36\xe9\x02\xc5\xe7\x51\x43\xc2\xbd\xb0\xa9\xb5\x97\xe6\xb6\xb0\x6c\xea\xd1\xa3\x4f\xb9\x5d\x36\xf4\x0f\x96\x52\xaf\x4c\x29\x4e\x8c\x35\xd3\x44\x3e\x10\xb8\xbe\x47\xae\x18\x51\x73\x59\x65\x29\x29\xd9\xdf\x1d\xcb\x69\x57\xf9\xb1\x39\x5a\x53\x81\x1f\x3b\x6c\x63\x39\x76\x1f\x69\xc1\xc3\xab\x7d\xf9\xd9\xf7\xc1\x95\xec\x53\xc1\xb1\xb2\xc1\x1d\x4b\xa4\x48\x8f\xa6\x16\x5c\x1b\xb8\x66\x16\xc1\xae\x87\xd9\x6a\x7c\x6e\xce\x05\xcd\x78\x6a\xa8\xaf\x73\x29\x42\x94\x10\x07\xc6\x88\x3f\x3c\x94\xaa\xfa\x34\x09\x2d\x8a\x52\xd2\x64\xce\x54\x63\x66\x28\xf1\xd8\x4a\x17\xa1\x29\xdd\x9b\xad\xc8\xaa\x19\x17\x28\x20\x41\xff\x8e\xdf\x90\xda\xb9\x1c\xda\x85\xac\x4e\xee\x63\x63\x60\xf3\x79\xd4\xb0\xc8\x60\xea\x72\x09\x3e\x8c\xb2\x39\x1c\xae\x96\x4f\x9b\x7f\x28\x22\xb3\xd4\x55\x5a\xfd\xe3\x6b\x23\x53\x27\x78\x75\x23\x15\xbd\x0a\x72\x73\x9a\x11\x33\xc3\xed\x1b\x32\xb7\x7d\xa0\xdf\xff\x81\xcc\x65\x55\xaa\x49\xb3\x4a\xe0\x17\xf0\x2c\xee\x54\x45\x5a\x7b\xee\x68\x92\x31\xaa\x34\xf9\xe2\x35\xc9\xb9\xa8\x74\x9f\x6c\x03\xf1\x52\x5a\x43\x3e\xfb\xe7\x3f\x04\x7f\xf7\xa4\x2c\x05\x91\xb7\xad\x29\x8d\xc1\xbf\xbd\x48\x66\xf5\xc6\x58\x1c\xb5\x90\x5c\xe8\x55\x01\xcd\x52\xd8\x7e\xd8\x14\x34\xd3\x07\xc3\x62\xbd\xc5\x98\x9f\x2a\x79\xbf\xd4\x7b\x2d\xaa\x63\xbb\x6c\x67\x8c\xfb\x7f\xf6\x61\x5c\xed\xd9\x98\x32\x3a\x6e\x84\xdd\x15\xb9\xdc\xe4\x5e\x52\x11\xae\x92\xcd\xb8\xd2\x65\x97\x1a\x77\x1c\x82\x78\xc3\xb9\xa8\x59\x29\xab\x80\x84\x0b\xf1\x97\x0d\x3a\x76\x0a\x0d\x67\x58\xb2\xb9\xc5\x43\x72\xa6\xb8\xd2\x75\x78\x3a\xd0\x5b\xe7\x57\x2f\xad\x42\xcc\xa6\xda\xb2\x0e\x40\x5d\x62\xfb\xe7\xad\x2f\x1b\x23\x35\x39\x00\x3d\xcc\x96\x61\xdf\x6d\x74\x61\x73\x48\xc9\x92\xe4\x55\xa6\x79\x91\xd5\xdb\xf7\xc1\x7d\x60\x19\x86\x10\x29\xba\x66\x8e\x69\xc3\xee\x43\xb1\x66\x17\x16\x65\x07\xc3\xeb\x99\x1f\x8d\x09\x0d\xf5\x3a\xc0\x81\x9e\x15\xb4\xa4\xfe\x94\x12\x99\xe7\x34\x28\x85\x12\x5a\x02\x29\xf8\x90\x21\xc9\x31\xec\x44\x49\xb3\x7a\xd5\x0d\x37\xa0\x7d\x02\xb9\x66\x82\x8a\x00\xa3\x7e\x8f\x62\xf8\xd0\x33\x91\x8f\x3e\x2e\x64\xc6\x17\x4c\xac\x42\xb7\x15\x42\xbe\xa4\xc9\x03\x13\x21\xd2\xfc\xb7\xca\xed\x6f\xba\x14\x34\xb7\xb5\xed\x8b\x52\x2e\xb8\xb9\x06\x2c\x5d\x19\x41\x8d\xac\x5a\x08\x93\x62\xbb\x12\x00\xc8\x68\xee\x73\x2b\x2b\x75\x98\xaa\xc7\xa6\xdf\xa7\x63\x49\x85\xf6\x9f\x92\x2f\x12\xe6\x38\x67\xd3\xf3\x3e\x77\x60\x11\x50\x77\x8f\x6c\xae\x0f\x65\xf3\x32\xe3\x7d\x03\x4a\xef\x5d\x18\x30\x63\x69\x66\x70\xde\xd2\x57\x13\x5a\x81\x22\x5b\x4a\x61\x6f\x15\xc2\xca\xfb\x98\xc2\x51\x9d\xc7\x58\xde\xa7\x6d\xb4\xf5\x81\xa6\x52\x91\x2f\x21\x2b\xdb\x15\x03\x71\xe6\x70\x0c\xcf\x87\x2f\xaf\x3a\x98\x1d\x33\xbf\xde\x8c\xce\x46\xbd\x27\xfb\x44\xf3\x22\x63\x6a\xf2\xf0\x47\xd0\x7c\xda\xbb\xf8\xaa\xbc\x4f\x5f\x7d\xb8\xbe\xb8\x7a\x77\x3d\xc9\x77\xdf\xf6\x03\xf0\x4f\x3c\xa7\xb3\x2e\x8e\x7c\x4c\x72\x29\xb8\x96\xe5\x6e\x34\xfb\x22\xca\x00\xee\x2c\x77\x6a\x65\x12\xc7\x44\x18\x58\x5a\xca\x8a\x3c\x52\xcc\xf2\x19\x5c\x0a\xf5\x23\x2f\xde\x90\x6b\xa1\xaa\x92\xd5\x99\xaf\x57\x07\x33\xb8\x75\x8f\x95\x02\x11\x76\xde\x1c\xad\x3c\xea\x93\x0b\xc0\x97\xf7\xdd\xa4\x2b\x02\x91\x02\xa0\x1e\x02\x64\xa0\x63\xaf\x37\x02\x24\x84\x8f\x42\x93\xd0\xf5\xbd\xea\xbf\x9e\xcb\xc7\xb1\x96\xe3\x4a\xb1\x31\xef\x56\x24\x47\xec\xd5\x03\x5b\x82\xf3\xe8\x01\x76\xcb\x76\xdd\x52\x03\x68\x09\x56\x08\x78\x6e\x78\xb2\x0f\x5f\x5e\x7d\xab\xc2\xd4\x8e\x0d\x79\xe5\x15\xd3\xc9\xab\x84\x15\xf3\x57\x76\x8c\xcf\x73\xef\x1b\x76\xa3\xb5\x15\x75\x7c\xea\xb0\xec\x21\xce\xcd\xf5\x8d\x4c\x45\x22\xb3\xcc\x96\x76\x92\x53\x72\xc9\x8a\xb9\x7f\xe1\xc5\xed\xfa\x9e\x4b\xb1\x1d\x47\x35\x44\xa0\x40\xb2\x0c\xb0\x03\xc6\x1f\xa5\xe9\xb7\x8d\xaf\xe0\x49\x28\xba\x6a\x5c\xb9\xf2\xbe\x2f\x21\x78\x39\x97\xac\x9b\xcc\x3c\x9b\xd2\xe2\xe9\xb5\x68\x7b\x69\x27\x8e\x7c\x60\x61\x6a\x10\xf4\x68\x0f\x0a\x46\xeb\x51\x4c\xd2\x75\x0e\xcc\x7a\xc3\xc5\x83\x56\x7a\xce\x84\xe6\x09\x9a\x80\xac\x5b\x7d\x93\x46\x91\x9b\x29\x0a\xca\x69\x90\xdd\x5c\x2e\x58\x59\xf2\x94\x29\x12\x41\xa4\x9a\x4a\x39\x9e\xbd\xb8\x03\x0c\x34\x64\xc7\xd9\x98\xc3\x9d\x7a\xfa\x59\x24\x9e\xe2\xc8\x73\x6c\x17\x9e\x23\x3b\xef\x3c\xcd\x6d\xe7\x79\x1d\x76\xa2\xcd\xcf\x31\x4e\x3a\x4f\x71\x5c\x39\xa8\x26\xab\x45\xcc\xe1\x49\x0f\x62\x4e\xd3\x9c\x07\xa5\x7b\x78\xd1\xe4\x1c\x56\xb1\xe3\x75\x95\xd0\x8c\xdd\x7c\xb3\x4f\x4d\x94\xed\xb2\xad\x8d\xba\xb3\x0f\x0b\x56\x2a\xae\x20\x10\xc7\x29\x1a\xb5\xa6\xc9\xdc\x6a\x8c\x9c\x09\x42\x0a\xa8\x4d\x89\xb0\x45\x84\x4c\xbb\x6d\xc6\x4d\x75\x94\x1b\x6d\xb7\x4a\xca\x4d\xf4\x25\xd9\xdf\x66\x54\xb3\xc7\x4e\xfe\x7c\x5c\x93\xe8\xee\x37\x41\x29\xf2\x99\x6b\x9a\x62\xb4\x49\x3e\x62\x60\xad\x97\x7d\xea\x8f\x26\x5b\x34\x47\x71\x48\x06\xbe\xdd\x9b\x4a\x19\x9b\xbf\xfb\x9f\xa6\x5d\x44\xc2\x42\x5b\xe4\x79\xda\xaf\xdc\x59\xc1\x26\xd2\x34\x2d\x99\x52\x8e\x85\x70\x17\xf0\xe2\xf6\x86\xfc\x15\x5f\xdf\xeb\x2a\x8b\x52\x6a\x14\xb8\xaf\x64\x4e\x79\x80\xbb\x63\x6b\x05\xab\x9f\xbb\xa5\x34\x79\x5d\xb7\x84\x5b\xff\x2e\xb1\x2f\x4f\x65\xd9\x48\xe6\x5f\x95\x2c\x25\x56\x59\xb7\xd7\x35\x1e\x45\xce\x5a\x93\x87\xc8\x99\xf9\xed\x15\x94\xd2\x38\x9f\xd4\x32\xd7\x8a\x40\x16\xa2\x19\xd8\x8b\xc8\xf6\x02\x85\xa2\x86\xd9\xc8\x05\x78\xd6\x82\x90\x03\x1b\x60\x3b\xbc\xd3\x62\x50\xff\x42\x71\xf0\xfe\x69\xf8\xdb\xda\xaa\x75\x5c\xd5\x31\x9c\x28\x5b\x8d\xc8\xd7\x72\xc6\x5d\xe5\x50\x03\x9c\x78\x36\x34\x44\x20\x1a\xe4\x94\x41\x4e\x59\x6d\x83\x9c\xb2\xb1\x29\x95\x5d\x0b\x7a\x9f\x85\xb8\x9a\xb7\x7d\xe9\xfd\x87\xe4\x6d\x46\x67\x84\xc1\x1f\xaf\x52\xae\xcc\xff\xc9\xdd\xdd\xd7\xe0\xbc\x51\x09\xa7\x4c\x01\x08\xb0\xb4\xd2\xe7\x1e\x41\x9c\xbc\x5f\x24\x89\xa4\xea\x5d\x50\x0c\x69\x0f\x34\x59\x77\x4f\xb8\x48\x5d\x29\xfa\x46\xbc\x85\x7d\x03\xb0\x25\xf5\xd1\xe4\xe8\xd0\x7d\xcf\xcc\x2d\x4d\x1e\x6e\x1b\xbe\x16\xb2\x34\xcf\x44\xe3\x51\x24\x93\x15\xfd\x75\x3f\x76\x6b\x65\x98\xb0\x63\xb8\x8d\x57\x6a\x37\xbe\x74\x7c\x8b\x23\x3a\x77\x76\x6b\xe1\x37\xaa\x94\x4c\x78\xed\x2b\x04\xf6\xa5\x9a\x99\x49\x81\x99\xd9\xeb\x66\x20\xff\x1c\xbb\x1c\x64\xd0\x37\x70\x60\x0e\x50\xec\x1b\x54\x35\x39\x2e\x2e\xdc\xaa\xf7\xba\x04\x04\xc7\xb0\x8c\x4b\xf1\x97\xa3\xee\x7d\x75\xbd\xfe\x22\xac\x7a\xa1\xb8\x64\x0d\xf6\x84\x03\xa4\x39\xbb\xe6\x39\x45\x35\xc6\x1a\x14\x70\xe5\x2f\x1d\x24\x9f\xd9\xdb\xfe\x85\x64\x6f\x89\x54\x25\x20\x5f\xd5\x76\xc7\xc3\x67\xd6\x73\x05\xb0\x46\x21\x8b\x2a\x43\x67\x7a\xbf\xb8\x1e\x0e\x25\x31\xd6\x78\x9c\xc5\x7e\xb4\x03\xe1\x1c\x56\x23\xc0\xfb\x10\xe0\xd9\x8c\x1f\x8f\x0f\xf3\x77\x10\x0b\x52\xb7\x91\xb0\x6d\x77\x51\x32\xfb\x31\xa3\xfc\xf7\x15\xd5\x1f\xa2\xdd\x68\xc5\xfd\xb7\xa4\xae\xd7\xff\xfc\x87\x3f\x04\x11\x34\x5e\x42\x09\x48\x0e\x15\xf2\x20\x2f\x88\xf7\x18\xa0\x25\x03\xe9\x00\x43\xf0\x9d\x7e\x03\xbd\x11\x75\xa0\x55\xe5\x18\x01\xff\x07\x0e\xf0\x8f\x0b\x15\x89\x09\xe0\x0f\x34\x87\xf7\xf0\x96\x81\x44\x4c\x37\x47\x4b\xc4\x74\xa4\xf4\x4b\xc7\x49\xba\x74\x8c\x54\x4b\x47\x49\xb0\x74\xbc\xb4\x4a\x07\x4e\xa6\x74\x10\x17\x93\x43\xa6\x4b\x8a\x8c\x3d\x8e\x8b\x3b\x0e\x4f\x88\x14\x1c\x9d\x1c\x1b\x99\x1c\x91\xf2\x68\xbf\x89\x8e\xa2\x25\xfa\x98\xa4\x46\x7d\xa3\xee\x8e\x97\xc0\xe8\x19\xd3\x16\x3d\x77\xb2\xa2\x03\xa7\x28\x3a\x5e\x62\xa2\xa3\xa4\x23\xea\x13\xde\x1a\x9f\x7a\x28\x26\xac\xb5\xef\xe5\x3a\x78\x72\xa1\xbd\xa4\x14\xda\x73\x22\xa1\xfd\xa5\x0f\x3a\x9e\x23\x65\x78\x52\x95\x27\xa7\x52\x89\xaf\x5d\x15\x6f\xef\x39\x94\xb2\xa6\xee\x7d\xa3\x72\xca\xe5\x9b\x75\x25\x71\x4e\x55\xa3\xe6\x8d\x96\x06\xab\x1d\x21\x2a\x20\x40\x0f\x41\x22\x34\x38\xd8\xbb\xec\x60\x2e\x22\x95\x38\xd8\xe9\x37\x77\x2b\x1e\x21\xfe\xf1\x21\x1d\x41\xfc\x20\x1d\xae\x20\x6e\xe1\x47\x70\x06\x19\xbc\x2d\xf6\xe7\x6d\xb1\xff\x38\x9d\x97\x66\xa0\x4f\x07\x03\x7d\xb4\x81\x5e\xb5\xd2\xfd\x3b\x85\x31\xa0\x64\x60\x6a\xe5\x7d\xb3\x96\x5c\x8d\x23\x2e\x6e\x6f\x02\xc6\x49\x4a\x06\xb9\x81\x68\xa6\x26\x9b\xb8\x5d\x67\xba\xb3\x5c\xb4\xe3\x72\xa9\xd6\x2c\x2f\x82\x6a\x5f\x0c\xf6\xf9\xc1\x3e\xbf\xda\x06\xfb\xfc\xc6\x76\x6c\x7b\xdd\xbc\xca\xa9\x18\x1b\x0c\x0c\x66\xfc\x96\xc3\xd8\x0a\x43\x33\x21\x16\x93\x06\x5e\x4b\x4c\xf0\x00\x29\x37\x2a\xc1\x7f\xaa\x58\xad\xcf\xf2\x8c\xe5\x81\x6c\x9d\xd0\xf7\x61\x37\x10\xf9\xe2\x15\xcc\x9c\xc8\xb5\x28\x62\xbb\x66\xbf\x99\x0e\xc5\x86\x6e\x22\x0c\xd3\x52\xd1\xea\x39\x43\x26\xfd\x76\x85\x49\x6f\xe9\x1f\x2c\xfa\x01\x9c\x10\xaa\xe5\x6e\x72\xa6\x06\x10\xcc\x7a\x6c\x76\xaf\x7b\x46\x72\x5e\x96\xb2\xb4\x76\xd7\xe6\x92\xd0\x81\x90\xcf\xe6\x9a\x95\x28\xf9\xa3\x0b\x57\x08\x2a\xb8\x63\xda\x42\x15\x40\xa5\x96\x84\x0a\x4c\x4c\x60\xfe\xed\xc2\x69\x60\xb9\x8e\x0e\xdd\xb3\x39\x5d\x70\x59\x05\x05\x90\xde\x21\xa5\x3c\xb1\x1f\x03\xff\xb4\x94\x95\xb7\x30\x55\xca\x2c\xd0\xef\xa1\x5a\x3f\xaf\x80\x41\xde\xd7\x9f\x83\x82\x26\x95\x4e\x7d\x3e\x66\x9f\xb8\xd2\xeb\x3b\xe6\x8e\xca\x95\x21\xdb\xd7\x35\x58\xa8\xc2\x60\xf1\xef\x02\xb2\x4a\xc4\x01\x7f\xab\xe3\xb6\xe0\xb3\xb8\x83\x9f\xba\xc4\x1e\x9b\x68\x0e\xf3\xc2\x90\x9c\x26\x73\x2e\xa2\x72\x32\x7c\xd7\x9a\x42\x4b\xfe\x99\x90\x8b\x2c\xab\x7d\x07\x95\x77\x69\x75\xf2\x50\x7b\xfa\x66\x33\x3b\x06\x36\xf0\x51\xb2\x14\x6c\x94\x48\x52\xc1\x43\x56\xf1\x89\xed\x6a\xb2\xc8\x1f\x69\xc9\x26\x89\xcc\xc9\xe5\xdd\x0d\x49\x4b\xde\x99\x4a\xf1\x00\xfe\xf5\xb8\xe9\x9d\xa5\x5c\x5f\x96\x8c\x36\xc8\x67\x75\x8b\x71\x47\x72\x8e\x52\x19\x4f\x96\x37\x57\x7d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa9\x62\x29\x79\x47\x05\x9d\xa1\xfa\xf0\xec\xee\xf6\xcb\x77\xe7\x06\x80\x40\xdd\x79\x73\xb5\xd1\x0f\xeb\xae\xd9\xf9\xfb\x7d\xa6\x95\x59\x5b\x78\x0f\xde\x68\xed\xfb\x9e\x8b\xdf\x6b\xbe\x1c\xe2\xd9\x89\xb0\x12\xc0\x1b\x32\x00\xdd\xae\x26\x5c\x44\x27\x29\x97\xe9\x55\xad\xa2\xe6\x45\x9e\x3e\x3c\x6d\xfa\xdc\x48\x13\x59\x76\x9b\x51\x71\x51\x14\xa5\x5c\x6c\xd6\xba\x86\x20\x07\xf7\xbd\x5b\x00\x3a\x98\xbb\x87\x05\x9e\x08\xf8\x54\x0a\x14\x62\x70\xd8\xcd\xfb\x7f\xa3\xbd\x62\x56\x0a\x60\xc1\x4e\x2e\x2a\x2d\x73\xaa\x79\x72\x42\x64\x49\x4e\xde\x51\x51\xd1\x6c\x63\x6c\xca\xce\x15\x6f\x13\x30\x77\x7e\xb4\xbd\xb6\x5a\xc0\x67\x3b\x19\xd8\xdd\xdf\x6b\x5a\x1a\x54\x77\x79\xf7\x5d\xd4\xb7\x4a\x53\x5d\xad\x51\x86\x1d\xd4\x6a\x3b\x7d\x1a\x93\x8c\x2a\xfd\x6d\x91\x1a\xfc\xb0\xf2\xeb\x2e\x22\x94\x50\x4d\x33\x39\xfb\x57\x46\xb3\xcd\x97\x21\x04\xa4\x2e\x9b\x9d\x38\x8b\x88\xf5\x28\xad\xee\xfd\xf7\xa7\x8a\x18\x51\xd2\x40\x09\xd7\x8a\x94\x2c\x63\x0b\x2a\xb4\xfb\xfc\x0e\xeb\x25\x9e\xda\x6d\xd9\x0a\x70\xbc\xb6\xb1\xa6\x4c\xb3\x32\xe7\xa2\x3d\xce\x1d\x7c\x7f\x29\x45\xca\x91\x2b\x01\x2b\x12\x7e\xd1\x1e\x6b\x3b\x54\x6e\x73\x3d\xd8\xe1\x6c\xd0\xae\x14\xd9\x98\x4f\x7b\x7b\xf0\xb5\x7b\x2b\xba\xcc\xf1\x21\x78\x6e\xb6\xe6\xb6\xb6\x7b\xe4\x41\x18\x89\x02\x12\xa7\x6f\xde\x9b\x4e\x36\xa7\x8b\xbd\x19\x3b\x70\xc0\x29\x6c\x8f\x0a\x1c\xdb\x79\x6f\x73\x4a\xd8\x05\x8d\xd8\xba\x19\xa3\xd5\xa9\x6c\xc7\xd4\xad\x8d\xbf\x5c\xf9\x0c\x13\xab\x78\xdf\x26\xf4\xf2\x68\xbd\xb4\x9d\xb2\x04\xf1\x8d\x61\x2c\x5e\x68\x05\xfe\xd6\x5a\x1a\xf5\xe2\xe3\x74\x61\x81\xa4\x30\xb0\x10\x7e\x1c\xcb\x79\x63\x03\x9b\x4a\x2b\xc1\x52\x52\x70\x86\x29\xdb\xa9\xb0\x9b\x09\xf4\x8c\xd1\xd4\x3e\x34\x74\xb3\x64\xf6\xb7\x91\xf5\x38\x0c\x62\x50\xd0\x6f\xd7\xd9\x60\x29\x66\x12\x07\x6f\x84\x57\x7f\x95\x56\x07\x68\x33\x10\x1a\xac\x02\xdc\xc5\x88\xa8\x2a\x99\x13\x6a\x04\x19\x65\xae\x83\xc1\x17\x6c\x92\x53\xc1\xa7\x4c\xe9\x89\xaf\x97\xab\xbe\xff\xfd\x0f\x5d\x6c\xc7\x5b\x59\x12\x1b\xa5\x3d\x72\x09\xb1\xed\x1a\x6b\x98\xe3\x0a\x37\xc2\xf7\x5c\x6b\x64\x0a\x99\xda\x05\x3f\xc2\x52\x34\x7d\x30\xa4\x14\x97\x52\x31\xf0\x1a\xe8\xe2\x51\x4e\x0c\xdb\xdb\x98\xf6\x7f\x19\xda\xf9\xdf\x27\xe4\xec\x11\x98\x90\x13\xf3\xe7\x09\x4e\xc7\x47\x9a\x35\x15\x4e\xf5\xb4\x30\x69\x5a\xc9\x67\x33\x56\x76\xda\x58\xcd\xa7\x6c\xc1\x84\x3e\xb7\xc9\xc0\x85\x6c\x74\xe5\xfc\xfc\x6a\xfd\xc9\xea\x34\xbf\xff\xfd\x0f\x27\xe4\xac\xbd\x27\x1d\x43\x72\x91\xb2\x4f\xe4\xf7\x68\x2d\xe5\xca\xec\xde\xf9\x04\x15\x2e\x6a\x29\x34\xfd\x64\x46\x4c\xe6\x52\x31\x81\x0a\x30\x2d\xc9\x9c\x2e\x18\x51\x32\x67\xe4\x91\x65\xd9\xd8\xda\x8f\xc9\x23\x5d\x76\xe7\x40\x77\x47\x08\x99\x55\x49\x41\x4b\xdd\x02\xe3\xbd\x5c\xc2\x07\x2e\xf6\x9a\xc0\xf1\x2b\x2e\x56\x5d\x3a\x3b\x05\xbc\x0d\x4a\xe1\x19\xd7\x2e\xeb\x80\x8d\x2f\xd2\xcb\x57\xe6\xb0\x4a\x7e\x5f\x69\x59\xaa\x57\x29\x5b\xb0\xec\x95\xe2\xb3\x31\x2d\x93\x39\xd7\x2c\xd1\x55\xc9\x5e\xd1\x82\x8f\x13\x29\x0c\x60\x40\xaa\xdf\x3c\xfd\xb5\xd9\x09\x35\x36\x0b\xdd\xad\x25\x0e\xdc\xb1\x6e\xdb\x43\xdc\x8e\xf5\xb1\x35\x3c\x8f\x1a\x3d\x62\x83\x02\x54\xb1\xf1\xbb\x84\xfa\xce\x67\xdf\x2a\x50\xf9\xbd\xda\xc7\x4e\xb9\xc2\xc9\xf1\xb4\xb9\x73\xbf\x6c\xad\xf0\x64\x75\x0c\x83\x93\xd0\xdb\x17\x50\x58\x8b\x4a\xe4\x34\x45\x32\x42\x45\x67\x9c\xfb\x81\xef\xac\x39\x0f\xa8\xb7\x9f\x2c\xc7\xd0\x85\xcc\xc6\x54\xa4\xe6\xdf\x98\x78\x23\xd9\xed\x91\x1a\x78\x00\x15\xdf\x2b\xf2\xfb\xf6\xe6\xea\xf9\xc1\xf3\xd5\xaf\x2b\xbe\x0f\x4c\xd7\xc7\x9e\x65\xf9\xf2\x40\x66\x19\x45\x12\xf4\xd0\x2d\x2b\xe6\x18\x98\xb6\x20\xc2\x95\xeb\xf5\xff\x58\xcf\x01\x5f\x3f\xa7\x8b\x75\xde\x6d\xcd\x6f\xc8\x08\x81\xf3\xfd\xba\xfe\xa2\xa9\x0b\x07\xcf\x7f\xaa\xb4\xad\x50\xe2\x32\xbf\xb6\x96\xe1\x84\xd3\x39\x15\xb3\x1d\xac\x4d\xd0\xc1\x38\xbf\x49\x33\x91\xb1\x19\x73\x5d\xac\xf6\xc2\x67\xa7\x4c\xdd\x90\x53\x41\x54\xc9\xb8\xf2\x55\x3a\x8c\xd8\xaa\x34\xa1\x0b\xca\x33\xb0\x13\xca\x7b\xc5\xca\x85\x55\xb6\x63\x0d\x2d\xba\x2a\x63\xe3\xb5\xd5\xc8\xf0\x1e\x49\xc2\x75\x6b\x58\x3f\x95\x5d\x0b\x00\xa9\x77\x65\xf6\x5b\x67\xbd\x17\xf9\x16\x55\x0b\x5b\x7f\xde\x6a\xa0\xe8\x16\xf2\x0c\xfc\xfd\x2b\xa3\xa5\xbe\x67\x54\x7f\xe4\xbb\x38\x94\x35\x90\x6e\x7d\xe7\xf4\x72\x35\x40\x3f\x32\x32\x93\xda\xb0\x9d\x15\xc0\x3e\xca\x07\x98\xa2\xde\x03\xda\xa1\x21\xba\x5e\xe5\xc7\x92\x42\x86\x09\x29\x22\x97\xd9\xfe\x70\x7d\x9d\x56\x16\xb1\x90\xa4\xf1\x6d\x32\x2d\x65\x0e\xca\x45\x3c\x3b\x34\x55\xee\x4e\x86\xb1\xd7\x25\xe7\x4c\xa9\x9d\x29\x8e\xdb\x61\x25\xf8\x36\x5e\xe5\x15\x23\x7f\xee\x7e\xc3\x70\x76\x23\x54\xa4\x4c\x53\x9e\xb9\xab\x8c\x5b\xe1\x77\xa9\x0b\xbb\xee\x5c\x60\xc9\xa8\xda\xc5\xd0\xb4\x66\xfd\x01\x5e\xc6\x49\x4b\xc1\xc6\x8f\xb2\x4c\xc9\x25\xcd\x59\x76\x49\x15\xb3\x7d\x35\xf3\xd5\xe0\x19\x9d\xaa\xbd\x4e\x79\xb3\x3a\x74\xcb\x94\x51\xc9\x57\x1b\x14\xe0\xaf\x5a\xa0\xc5\x09\x8e\x9c\x56\xfa\x63\x59\xb1\x11\x79\x6b\xa8\xd7\x88\x7c\x2b\x1e\x84\x7c\x7c\xda\x5c\xf5\x4e\x63\x5d\x6b\xa6\x4d\x0f\x49\x97\xee\xbc\xa5\xd8\xf3\xd3\xed\x39\x23\x8b\xf0\xb7\x68\x9f\xdb\xc4\xc6\xbf\xea\x66\x64\xfe\xb9\xa6\x6a\x34\xa2\x75\x29\x67\x25\x53\x0a\xb5\x38\xd1\xea\xfb\x86\xc1\xe2\xaf\x4c\x58\xfb\x70\xe7\xf4\x6e\x36\x7d\xe5\x66\xea\xe8\xda\xac\xfe\xc5\x9e\xb7\x1d\xac\xc8\x36\xb2\x1a\xbb\x23\x23\x1a\x13\xdd\xa2\x64\xdc\x36\xc3\xcd\xca\xc5\x06\xd5\x6b\xbc\x8b\x4c\xc9\x2e\xcd\xb8\x5b\xdd\xe5\xdd\x77\xdb\x37\x7b\x2b\xed\xeb\xa2\x4f\xdd\xea\xc7\xa7\x2a\x1e\x3b\xef\x4c\xa7\xb2\x31\x94\xd3\x3f\x8e\x82\xf1\x39\x55\x8b\xcf\xab\x54\x3c\xba\x3a\xf1\xa8\x8a\xc4\xe3\xa9\x10\x7b\x2a\x0f\x3b\x2f\xd2\x2e\x85\x61\xe8\x1d\x8a\x53\x12\x3e\xbb\x7a\xb0\x73\x4f\x76\xa9\x04\x43\xf7\x24\x4e\x0d\x78\x6c\x05\x60\xd0\x16\xec\x54\xfa\xc5\xec\x43\xa4\xa2\xef\xc8\x2a\xbe\xce\xbd\x08\x54\xeb\x85\xee\xc8\xe1\x54\x79\x2f\x56\x89\xd7\xb9\xc5\x3b\x14\x77\xa1\xdb\x1a\xa5\xac\x3b\xb2\x9a\xae\x63\xfd\x71\xaa\x39\xcb\x63\xb2\x34\x84\x45\xbf\x69\xbc\xdc\x64\xd2\x2d\x83\x08\x0e\x70\xf6\x0d\xe7\x70\xd7\x64\x25\xfb\x72\xea\x86\x79\xee\xeb\xff\x61\xa7\x1c\xce\x0d\x5b\x16\x9e\xa5\x5e\xa6\xec\x5a\x02\x21\x57\xd7\xb7\x1f\xae\x2f\x2f\x3e\x5e\x5f\xad\x72\xe1\xf1\xec\xf2\x6e\x45\xd1\xb8\xc1\x2e\x6f\x79\xc1\x10\xab\x2d\x3f\x19\xd8\xda\xf2\x53\x55\xf1\x4d\x5f\x3d\x9d\x79\x7f\x12\xcf\xf0\x24\xe2\xda\x8d\x27\xf6\x84\x28\x00\xb6\xd0\x6b\xd5\x70\x95\x73\x99\xa5\xca\xc5\x37\xdc\x5c\xf9\x44\x04\x5c\x24\x59\x95\x1a\x96\xeb\xdb\x6f\x6f\xae\xd4\x84\x90\x2f\x59\x42\x2b\x65\x58\xb7\xed\xe2\xba\x14\xa7\x9a\x7c\xf3\xfe\xeb\x7f\x83\xd0\x2e\xf8\x72\xe4\xd3\xa5\x42\x49\x3f\x4e\xb1\x2a\x21\x2c\x14\x7a\x45\xb6\x0e\x66\x94\xd0\xc2\x60\xe0\xed\x2a\x7f\x8e\xd9\x6b\xa8\x48\xc9\x9c\x65\x85\xa1\x0e\x0f\x8c\xd4\x75\xca\xcc\x80\xf0\x2b\xc6\x6f\x58\x3f\xf6\x19\xd3\x98\x94\x60\x97\xab\xfa\xce\x03\xe8\xd0\xb0\x3f\x41\xb7\xde\x52\x17\x58\xed\xcb\x23\x55\x56\x43\xb9\x71\xb6\x1d\xa0\xd2\xad\x8f\xdb\xae\xd2\xda\xa2\xcc\x42\xca\x02\x7f\xad\xcd\xd9\x4c\xb6\xd6\x5b\xa1\x73\x18\xd7\xc1\xda\xf3\xed\x9e\x80\x9b\x0b\x4f\xaf\xe9\xae\xd8\xea\x26\xb7\x06\xf6\xb1\x40\x8d\x29\x87\xcd\x45\xb1\x72\xc1\xd2\x37\x60\xcf\x71\x8f\xd0\xdb\xb6\xfd\xac\xba\x77\xcc\x4c\x03\xeb\x58\x0d\x1c\xf9\xaf\xff\xfe\xd5\xff\x1f\x00\x00\xff\xff\x20\x58\x67\x59\xb4\x7f\x03\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfd\x77\xe3\xb6\x95\x30\x8e\xff\xde\xbf\x02\xc7\xed\x39\xb6\x5b\x49\x33\xd3\x76\xdb\xee\x3c\xfd\xb6\xc7\xf1\x78\xba\x7e\x92\x99\xf8\x19\x4f\xd2\xb3\xdf\x6c\x76\x03\x93\x90\x84\x9a\x04\x18\x02\x94\x47\xdd\xec\xff\xfe\x39\xb8\x17\x00\x41\x49\x36\x01\x59\x92\x3d\x59\xe2\x87\x64\x4c\x91\x78\xbd\xb8\xef\x2f\xb4\xe2\xdf\xb2\x5a\x71\x29\x5e\x13\x5a\x71\xf6\x49\x33\x61\xfe\x52\x93\xdb\x3f\xa9\x09\x97\x2f\x16\xaf\x7e\x71\xcb\x45\xfe\x9a\x9c\x37\x4a\xcb\xf2\x03\x53\xb2\xa9\x33\xf6\x86\x4d\xb9\xe0\x9a\x4b\xf1\x8b\x92\x69\x9a\x53\x4d\x5f\xff\x82\x10\x2a\x84\xd4\xd4\x3c\x56\xe6\x4f\x42\x32\x29\x74\x2d\x8b\x82\xd5\xe3\x19\x13\x93\xdb\xe6\x86\xdd\x34\xbc\xc8\x59\x0d\x9d\xbb\xa1\x17\x2f\x27\xaf\xfe\x34\x79\xf9\x0b\x42\x04\x2d\xd9\x6b\xa2\x9a\x1b\x95\xd5\xbc\x82\x9e\x26\xb2\x62\x35\xd5\xb2\x56\x93\x4c\xd6\x4c\x9a\xff\x95\xbf\x50\x15\xcb\xcc\x18\xb3\x5a\x36\xd5\x6b\xb2\xf1\x1d\xec\xce\x4d\x85\x6a\x36\x93\x35\x77\x7f\x13\x32\x26\xb2\x28\xe1\xdf\xb8\xc4\xeb\x60\x54\x78\x5c\x70\xa5\xbf\x5c\xfb\xe9\x2b\xae\x34\xfc\x5c\x15\x4d\x4d\x8b\x95\xd9\xc2\x2f\x6a\x2e\x6b\xfd\xbe\x1d\xdb\x8c\xa5\x9a\x9b\xf0\xdf\xf6\x45\x2e\x66\x4d\x41\xeb\x6e\x27\xbf\x20\x44\x65\xb2\x62\xaf\x09\xf4\x51\xd1\x8c\xe5\xbf\x20\xc4\x6e\x97\xed\x73\x4c\x68\x9e\xc3\x11\xd0\xe2\xaa\xe6\x42\xb3\xfa\x5c\x16\x4d\x29\xfc\x98\xe6\x9d\x9c\xf9\x5e\x5f\x93\x8f\x73\x46\x2a\x9a\xdd\xd2\x19\x73\xe3\xdd\xb0\x9c\x68\xe9\x3f\x20\xe4\x1f\x4a\x8a\x2b\xaa\xe7\xaf\xc9\xc4\x6c\xf1\xc4\xec\x60\xf0\x33\x9e\xcf\x15\x76\x12\x3c\xd7\x4b\x33\x5d\xa5\x6b\x2e\x66\x0f\x0d\x9f\x51\x4d\x0b\x39\x23\x08\x46\x64\x2a\x6b\xa2\xe7\x8c\x98\xa1\xf8\x94\xb3\xdc\xcd\xef\x81\x19\xe1\xa7\x6b\x73\xba\x5e\x7d\x1c\x3d\xa5\x39\x15\x82\x15\x44\x4e\x49\x53\xe5\x54\x33\x45\xb4\x6c\xf7\xe7\xe1\xed\xb1\x1f\xaf\xcd\xe6\x7c\xed\xf9\x86\xe9\xe0\xab\x8b\x57\xb4\xa8\xe6\xf4\x95\x7d\xa8\xb2\x39\x2b\x69\x7b\x86\xb2\x62\xe2\xec\xea\xf2\xdb\xdf\x5d\xaf\xfc\x40\xba\x4b\x09\x41\x94\xdc\x32\x56\xa9\xf6\x52\x90\xa6\x32\x6b\x32\x8b\x23\x37\x4b\xa2\x6b\x9a\xdd\x72\x31\x83\xa5\xcf\x70\xbd\xe7\x78\x30\x6a\xb2\x36\x65\x79\xf3\x0f\x96\xe9\xe0\x71\xcd\x7e\x6c\x78\xcd\xf2\x70\x2a\x66\x67\x1d\x26\x58\x79\x6c\xf6\x29\x78\x54\xd5\x66\x5a\x3a\xb8\x87\xd8\x02\x54\xd4\x79\xbe\xb2\xcc\x9f\xc6\x2b\xbf\x12\x62\x76\x07\xbf\x24\xb9\xc1\x4b\x66\x41\x73\xe6\xae\x0b\xcb\xed\x96\x9a\x03\xd6\x73\xae\x48\xcd\xaa\x9a\x29\x26\x10\x53\x99\xc7\x54\xd8\x55\x4e\xd6\x3a\xbf\x66\xb5\xe9\xc8\x5c\xe9\xa6\xc8\x0d\x42\x5b\xb0\x5a\x93\x9a\x65\x72\x26\xf8\x3f\x7d\xef\xb0\x89\x66\xd8\xc2\x40\x90\x26\x70\x21\x05\x2d\xc8\x82\x16\x0d\x1b\x11\x2a\xf2\xb5\xbe\x4b\xba\x24\x35\x33\xe3\x92\x46\x04\x3d\xc2\x27\x6a\x7d\x2e\xef\x64\xcd\x08\x17\x53\xf9\x9a\xcc\xb5\xae\xd4\xeb\x17\x2f\x66\x5c\x3b\x54\x9d\xc9\xb2\x6c\x04\xd7\xcb\x17\x80\x75\xf9\x4d\x63\x8e\xfe\x45\xce\x16\xac\x78\xa1\xf8\x6c\x4c\xeb\x6c\xce\x35\xcb\x74\x53\xb3\x17\xb4\xe2\x63\x58\x8c\x40\x24\x5b\xe6\xbf\xac\x2d\x72\x57\x2b\x03\x6f\xbc\x48\xc4\xa1\xcd\xc4\xc3\x32\xf8\x94\x70\x45\xa8\xed\x10\x17\xdb\x9e\x89\x79\x64\xb6\xf1\xc3\xc5\xf5\x47\xe2\x66\x84\xe7\x86\x47\xd4\xbe\xba\x61\x87\xdc\x69\x99\x9d\xe5\x62\xca\x6a\xfc\x72\x5a\xcb\x12\x7a\x65\x22\xaf\x24\x17\x1a\xfe\xc8\x0a\xce\x84\x36\x37\xbd\xe4\x5a\x01\x58\x33\xa5\xcd\x41\xae\x77\x7c\x0e\xa4\x8d\xdc\x30\x8b\x23\xf2\xf5\x57\x2e\x05\x39\xa7\x25\x2b\xce\xa9\x62\x07\x3f\x3b\x73\x46\x6a\x6c\x0e\x24\xfa\xf4\x42\xc2\xbd\xfe\xc1\xda\xad\x27\xc4\x91\xdc\x7b\x8f\x3b\x44\x41\xd7\x15\xcb\xfc\x75\xa4\x82\x9c\x55\x55\xc1\x33\xbc\x71\x7a\x4e\x35\xc9\xa8\x30\xdb\xc9\x85\xd2\xb4\x28\xd8\xea\xed\xb8\x77\x16\xf7\xe1\x1f\x02\xc8\x66\x85\x5c\xb9\xc7\x6b\x34\xa3\xfb\x83\x27\xb3\x2b\x6f\xdc\x87\xab\x4c\xb3\x98\x7f\xfd\x87\x07\xb6\x9c\x20\x4b\x34\xe5\xb3\x4d\x9f\xdd\xbb\x97\xe7\xf0\x09\x30\x53\x94\x0b\x65\xbb\x68\x6a\xdc\xcd\x96\x76\x1a\x6a\x4a\x3b\x9c\xc4\x3a\x1c\x3e\xb8\xb3\x7d\x6b\x36\x8d\x4e\x81\xf5\x5b\x6e\xfe\xb5\x1f\x01\xb8\x76\x39\x6d\x67\x3e\x22\x72\xc1\xea\x9a\xe7\x16\x75\x57\x32\x3f\x56\x80\x58\xf3\xa6\x00\x42\x25\x85\xd2\x35\xe5\x1b\x2f\xbd\x6b\x82\x17\x66\xf1\x63\xaa\xf1\x06\x31\x45\xee\x78\x51\x90\x5f\x0b\xa9\x7f\xed\x47\x80\x01\x64\xcd\x67\xdc\x63\x67\x45\xb8\x70\xe3\x02\x59\xb7\x7c\x89\x54\x6c\xa5\xc3\xfb\x07\xff\x46\x31\xc2\xca\x4a\x2f\x1d\x9a\x3a\xf9\xef\xff\x39\x35\x34\x81\xd5\x54\x05\x03\x76\xfa\xbb\x17\xd3\x63\xeb\x39\x29\x12\x71\x5a\xb0\x2f\x32\x67\x67\x3d\xa7\x46\x56\x4f\xee\x0d\x43\xf6\x47\xc1\xe7\xfe\xd4\xc3\x43\xa9\x9b\x82\x29\xcf\xc2\x99\xbd\x7b\xa0\xf3\x88\xb5\xc4\xae\x07\xdf\x63\x53\x56\xd7\x2c\x7f\xd3\x98\x5b\x76\xed\x67\x75\x39\x13\xd2\x3f\xbe\xf8\xc4\xb2\x46\x6f\x60\x29\x1e\x5c\xfa\x03\x40\xeb\x9a\xe1\x1b\xed\x4e\xb0\x1a\xa1\x0c\x67\x04\xac\xa3\xfd\xc1\x6c\x09\xb0\x05\x66\x07\x15\x62\x3d\x45\x35\x57\xd3\x65\xef\x00\x66\x47\xfd\x9e\xb3\x4f\x86\xe2\x01\xef\x1f\xdc\x76\xc3\xc8\x01\x71\xe3\xac\xc8\x47\xe4\xa6\xd1\x84\x6b\xa0\x7c\xd9\x5c\x4a\xb5\x8e\xed\x56\x1b\xc5\xa3\x85\x79\x2d\xb8\x04\xc6\x85\x48\x61\x80\x95\x94\x86\x5c\x01\xc3\xc4\xc2\xe1\x27\xb0\xf2\xf6\x33\xbe\x4a\x6d\xd6\x5b\x29\x95\x6e\x8f\xcb\x90\x7e\xb8\x80\x82\x91\x3b\xae\xe7\xf0\xc7\xac\x66\xc8\x34\xa9\xa6\x34\x83\xde\x31\x3e\x9b\x6b\x35\x22\x7c\xb2\x81\x92\xae\x36\x03\x80\x8c\x66\xf3\x60\x5a\x25\x63\x5a\x11\x5a\x14\x6e\x09\x21\xd4\x22\xf5\x28\x0d\x03\x41\x4e\x1c\x87\xd1\x3b\x8a\xe5\x0e\x46\x9e\xfa\xac\x02\xde\xc6\xe3\x1a\x11\xa6\xb3\xc9\xe9\xa8\xb7\xfb\x4c\x96\x95\x41\x08\x14\xf6\xe0\x66\x49\xb8\x36\xbc\x3b\x72\x43\xb5\x6c\x66\xb8\x53\xac\xb0\x13\x77\xbc\x2c\x1c\xbe\x61\x2e\x41\x1a\xdc\x40\x6e\x56\xdb\x11\x6e\xee\x91\x63\x57\xcd\x70\x1c\x37\x09\xf6\xaf\xa4\x3a\x9b\x5b\x34\x9c\xc9\xba\x66\xaa\x92\xc2\xf4\x8c\xbf\x5c\xb4\x6b\xfb\x3f\xe6\x9d\xde\xf1\x4c\xa7\x27\xea\xb4\x3d\xec\x39\x9f\xcd\xdd\x59\xd3\x1a\xd1\x71\x17\x46\xfa\x8e\x1c\x51\x09\xad\x6b\xda\x77\x8f\xb8\x66\x65\x0f\x22\x21\x5b\xdc\x7e\x42\xce\x84\x45\xf6\x2d\x60\x07\x20\xa6\x59\x5d\xfa\x8d\x04\x28\x04\xb4\xa7\x70\x13\x78\x69\x38\x21\xae\x2d\x98\x93\x97\x11\xe3\x9d\x98\x9b\x40\xb8\x3e\x56\x70\x6b\xc7\xb2\x3a\x9d\x90\x33\x22\x1a\x8f\x78\x1e\x9a\x82\x90\x7e\x06\xb6\x23\x33\x2d\x25\xdb\xbe\xfa\xf1\x51\x1c\xfa\xc6\x76\x3f\x83\xb6\xde\xc6\x76\xfe\x4c\x44\x5c\x42\xf3\x3a\xee\x5a\xef\xab\xb1\x84\xc4\xbd\xed\xe6\x10\xf3\xf6\x0a\xc4\x9c\xe1\xcd\x51\xac\x60\x99\x36\xd4\x90\xd5\xe5\x88\x50\xa5\x64\xc6\x8d\xa8\xd0\xc2\x7e\xf7\x42\xe1\x4a\xfa\xf7\x9e\xa4\xee\x3f\x49\x5e\x3f\x01\x69\xb4\x7b\xbf\x63\xbf\x5b\xdb\x8d\x82\x2b\x6d\x10\x54\x77\x57\x3a\x78\xf7\x66\x09\xbf\x1e\x2b\x52\xd0\x1b\x56\x3c\xc0\x57\xad\xb6\xf8\xcb\xdf\xb6\x48\x34\x70\xcf\x82\xa2\x10\x42\xdb\x56\xa1\x21\x58\xb7\x95\x7b\x3d\x9c\x80\x18\xe4\x98\x7a\x64\x05\x47\x84\x92\x5b\xb6\x1c\x21\x4a\x17\x5e\x85\x93\x34\x05\xe8\xb8\x66\x48\xd0\x0d\xdc\xdd\xb2\x25\x74\xf8\x30\xbb\xb9\xb1\xab\x54\xb8\xc3\x96\x82\x01\xda\x36\x36\x13\x4d\xfc\x62\x8b\x0d\x4a\xbf\x1a\xd8\x6e\xd9\x83\xec\xf3\xa6\xb6\xa6\x6c\x04\x70\x87\xf3\x80\x43\x02\x0a\xec\xe0\x81\x1a\x11\x99\x6d\xd6\x3f\x3c\xdc\x1e\x14\x38\x1f\x6a\x6e\xf7\x1e\xb5\xae\xc4\x0b\x62\xda\x07\xaf\xc3\x41\x78\x3f\x56\x08\xaf\x06\xef\xcc\x39\x28\x2b\xcd\x45\x01\x34\x92\x0e\xb4\xd8\xbe\xa5\x05\xcf\x03\x1d\xa8\x61\x36\x2e\xc5\x88\xbc\x97\xda\xfc\xef\xe2\x13\x57\x86\xc7\x7c\x23\x99\x7a\x2f\x35\xfc\x39\x21\x7f\xd3\x78\xf5\xbe\x8a\xc4\xcb\x6d\xdb\xfa\x0c\x70\x7d\x87\x3e\x81\x33\x81\x48\xd4\xec\x70\xa8\x89\x53\x13\x23\x99\x03\x8b\x6e\x77\xce\x60\xad\x4b\x61\x84\x02\xdc\xb9\xe4\xa1\x40\x19\x8b\x72\x36\x0e\x59\x36\x0a\x54\x69\x42\x8a\x31\xb0\x51\x1b\xc7\xc4\x03\x32\xe3\x86\x47\xb4\xc3\xe1\xef\x1f\xfa\x6f\xda\x0c\xfb\x95\x1e\x05\x1f\x27\x8f\x1b\x0c\x36\xa7\x0b\x60\xed\xb9\x98\x15\x9e\x89\x1f\x91\xbb\x39\xcf\xe6\x28\x3d\x82\x26\x4c\xb3\xba\xaa\x99\xe1\x18\x28\xe8\xcc\xcc\x93\x19\xab\xd3\x41\xff\xa3\x11\x0d\x70\x7c\xd4\x77\x17\x34\x63\x39\xc9\x41\x64\x41\xd5\x2b\xd5\x6c\xc6\x33\x52\xb2\x7a\xc6\x48\x65\x48\xff\x76\x00\x9f\x46\x89\xb1\x25\xd3\xe3\x70\xc0\x2d\x6e\x18\x21\x9f\xc6\xb7\xcd\x0d\xab\x05\xd3\x4c\x8d\x0d\x7f\x32\xb6\xb3\xd7\xb2\xe4\x59\x74\x67\x3b\xe9\x06\xf8\xac\xb7\x46\x6e\x3b\x10\x8b\x05\x32\xe2\xc0\x62\x0d\x2c\xd6\xc0\x62\x0d\x2c\xd6\xc0\x62\x45\xb7\x81\xc5\x7a\xf4\xf0\x03\x8b\x35\xb0\x58\x07\x67\xb1\x3a\x5d\x94\xb4\x4a\xed\x01\xf5\x72\x5b\x28\x02\xff\x8e\x0a\xdd\x55\xcd\x1f\x30\x7c\xce\xaf\xa1\xab\x02\x34\x7c\xcc\xb5\x25\x4e\x1f\x41\x6d\x68\x2d\x91\x35\x15\x33\x46\x5e\x8d\x5f\xbd\x7c\x99\xa2\x20\xb4\xe0\x1c\xf5\xc5\x54\xd6\x25\xd5\xf0\xcd\xef\x7e\xdb\xf3\xc5\x23\x4e\xe5\x3e\x7b\xc9\x61\x0c\x75\x16\xf3\x78\xdb\x4c\x87\x45\xbe\xc7\x96\x06\x64\x4c\x48\x4d\x4a\xa6\x09\xed\xe7\xc9\x42\xb5\x3b\x2f\xd9\xc8\x99\x43\x11\xed\x58\xb7\x11\x67\x14\xcc\x89\x14\xd6\xf4\x62\x0e\xbf\xff\x70\xb7\x5a\x41\xc6\xa8\x62\x86\xc4\xdf\x30\xb3\x8a\x7e\x53\xa0\x26\x4a\x96\x66\xd6\x5c\x68\x87\xc4\xcc\x12\x98\x3b\x18\x72\xc2\x26\xb3\x09\xc9\x1b\xe8\x96\x0a\xeb\x07\x73\x8a\xab\x55\x4b\xa5\x59\xd9\x6f\x0b\x34\xc4\xb0\x86\xff\x99\x6d\xd1\xf5\x12\x2c\xe4\x0b\x26\x74\x43\x8b\x62\x49\xd8\x82\x67\xda\xef\x1f\xb8\xed\x70\xad\xa2\x76\x2a\x81\x8d\x8e\x67\x9d\xc7\x6b\x37\xb4\x8f\x48\xa5\x70\xbe\x6b\x7d\xc7\xe0\x9c\xce\x0d\xf8\x60\x57\x32\xb9\x57\x26\xd4\xa6\x5f\x34\xdb\xc2\x3f\x01\xb8\xbf\xfe\xd0\x6f\x65\x23\xc9\xf4\x27\x81\xe6\x6c\xc7\x5a\x59\x83\x97\xac\xad\xf1\x6d\x7d\xa5\x1b\x4c\x5e\xb8\xf6\xce\xad\x91\xd3\xc8\x01\xf5\x9c\xa1\x91\xf2\xec\xfd\x9b\xb8\x1d\x23\xd6\x39\xe0\xa3\xac\x64\x21\x67\xcb\xf0\x78\x61\x3b\xc1\xfc\x67\xe7\x81\xbe\x3a\xc8\x82\x1b\x98\x7f\xbf\x02\x0f\x83\x69\x68\x30\x0d\x0d\x7a\x0b\x68\x83\xde\x62\xd0\x5b\x0c\x7a\x8b\xb8\x36\xe8\x2d\x1e\x3d\xfc\xa0\xb7\x18\xf4\x16\x83\x69\x68\xbd\x0d\x2c\x56\x7f\x1b\x58\xac\x07\xdb\xc0\x62\xf9\x36\xb0\x58\x03\x8b\x35\xb0\x58\x03\x8b\x35\xb0\x58\x87\xea\xe6\xb1\xa6\xa1\x47\x4d\x61\xbb\xc1\x2b\x99\x3f\x22\x78\xab\x92\xf9\x03\xb1\x5b\xa8\xd3\xcf\xe4\xb8\x90\x19\xd5\x36\xcc\xd6\x7c\x62\xad\x50\x8a\x96\x68\xa6\x18\x91\x7f\x4a\xc1\x30\x9a\xc5\x5c\x0f\x30\x16\x48\x3d\x67\xb5\x79\xfd\x44\x9d\x3e\x18\x42\x30\xc4\x7e\x0d\xb1\x5f\x43\xec\xd7\xbd\xed\xd9\xc4\x7e\xcd\xa9\x42\xb8\x45\xd2\x78\x7f\x28\x58\x80\x93\x3e\xb2\xba\xfc\x99\x46\x82\x19\x70\xb7\xe0\x08\x49\x22\x5a\x90\xc2\x9d\xc9\xad\xc1\x9f\xe5\x57\xdd\xfd\xb0\x62\x35\x2c\x8a\xe6\x39\xcb\x49\xc5\xea\x31\x82\xa8\x24\x53\x2e\xf2\x0d\x6b\x75\xfb\xd3\x8f\x1e\xf6\x18\x8a\xd5\x5d\x47\xd4\x37\xfb\x89\xc7\xea\x4e\x64\x0b\xa3\x62\x68\x19\xed\x10\xc1\x67\x11\x9d\x95\x2a\xa1\x8f\x89\xb6\x06\xc5\x2f\x23\x65\xf4\x74\x31\x1b\x84\x63\x67\x7e\xdc\x52\xfd\x94\x24\x0a\x9d\x59\x79\xfc\xc7\x86\xd5\x4b\x88\xcf\x6f\xc5\x4e\x9f\x8b\xc4\x7a\xc4\x70\x45\x32\xaa\x90\xac\xa6\xb0\xca\x97\x53\x8c\x9a\x14\x4d\x51\x8c\xb0\x9f\xd5\xcb\xea\xd0\x1c\xc0\x81\x90\xe6\xf7\x64\x8d\x58\xa2\x8a\x66\x3b\x1d\xc8\xf6\x56\x58\xb2\x7a\x4e\xab\x5d\xa1\x6e\xcc\xa9\x0e\xf1\x58\x36\xea\x0e\x37\x58\xd3\x93\xed\xe3\xd8\xb6\x15\x60\xb6\x12\x5f\x1e\x2d\xaf\x3f\xb0\x27\x8f\xd0\x2b\xc2\xcb\xc9\x93\xd9\x8d\x6e\x91\x6c\xaf\x5f\x24\x5b\xeb\x18\xc9\x56\x7a\x46\xb2\xad\xae\x91\x3c\x42\xdf\x48\xb6\xd3\x39\x92\x55\x68\x33\x27\x64\x19\xdf\xfd\xa8\x1f\xc9\xe3\x84\xf3\xed\xd5\x90\x64\x07\x17\x2b\x1c\x3f\xc8\xec\xb4\x3f\xbd\x24\x89\xd5\x4d\xc2\xb5\xea\xa8\x27\x0f\x7d\x2e\xdb\xa9\x26\xc9\x8e\x4e\xc5\x65\xc6\x01\x5d\xd8\xa1\x94\x95\xe4\xe9\x15\x96\x0f\x4e\xc1\x0e\x1f\xad\xe1\xdb\x6a\xf4\x47\x68\x05\xc9\xa3\x34\x83\x64\x7b\xed\x20\x79\x2c\xb0\xef\x4c\x4b\xb8\xd3\xae\x80\x4f\xfa\x0a\xfc\xd0\x1e\xc1\x6d\x25\xdf\xc0\x60\x58\xe4\x2e\x4a\x5a\x99\xdb\xf7\xdf\x86\x89\x00\xc0\xfc\x1f\x52\x51\x5e\x2b\x23\xdd\x58\xbd\x76\xf8\x9b\x55\xdf\x05\xdd\x24\x4f\xa0\x32\x03\x1b\x1a\xbf\xa0\x85\x61\x72\xd0\xe9\xd7\xea\x20\xcc\x5c\x56\x59\xc8\x11\xb9\x83\x84\x59\x86\xbc\xa1\x66\x82\x2b\x72\x74\xcb\x96\x47\xa3\x28\xf5\x40\xb7\x85\x37\xfb\xe8\x52\x1c\x21\xeb\xb4\x76\x2f\x3d\x9f\x25\x45\xb1\x24\x47\xf0\xdb\xd1\xae\x79\xd4\x2d\xf8\xa3\x30\x35\xeb\xb6\xec\xc7\x56\xd7\xe9\xb1\x0a\x6e\xd2\x81\xbe\x2f\xd9\x72\x5b\x47\x84\x24\x98\x7f\xd7\x19\xd1\x31\xd4\x00\x66\x46\x76\xf7\x7c\x13\x66\x66\x05\x96\xc9\xea\xa8\x50\x5d\xc5\x8b\x22\x61\xb4\x1b\x46\x34\xbd\x65\x60\xe1\x91\x90\x5a\x8e\xe7\x0c\x93\xe9\x21\xe8\xc0\x48\x06\x64\x1a\x05\xe9\x71\x49\x21\xe5\x6d\x53\x39\xd0\x73\xd9\x24\x13\x86\xe4\x22\x93\xa5\xf3\xa9\x47\xbf\xd6\x91\x4d\x30\x77\xcb\x96\x63\xcc\x81\x89\xcf\x61\x60\x20\x01\x56\x35\xf1\x43\x47\x30\xff\x81\x50\x45\x7e\x00\xa6\x52\x90\x13\xf8\xf0\xf4\x87\x14\x97\x02\xbf\x81\xa8\x7d\x95\x0d\x60\x16\x66\x88\xa5\x9d\xa0\x5a\xdd\xdb\x87\x76\x2c\x61\x68\x97\x29\x2e\xdc\x8c\x63\xb4\x37\x9c\x50\xa1\xf9\xa9\x57\xd2\x4c\x08\xc0\x01\x70\xc9\xb9\x14\xc7\x1a\xe7\xe7\xf0\x9a\xeb\x20\xc5\xeb\xc0\xef\x7b\x6b\xf1\x43\x6b\x01\x1e\x79\xce\xa6\xb4\x29\xb4\xcd\x46\x6a\x50\x1f\x50\xfa\x84\x11\x3e\x3a\x7b\x89\x65\xf8\xa7\xb2\xbe\xe1\x79\xce\x04\x84\x38\xb8\xe9\xdf\x48\x17\x10\xd4\x82\xbb\xc1\x6c\x9d\x33\x4e\x19\xf6\xac\x50\x72\xb4\xda\x63\xe6\xb3\x95\x9a\x5b\x74\x37\x67\xa2\x3b\x00\xe1\xca\x6c\xaa\x62\x09\x4c\xed\x41\x5c\x7f\x1e\x8f\xf3\xb6\x76\xbd\xe2\xea\x09\xf0\xde\xea\xa0\x03\xea\x8b\x42\x7d\x42\xea\x01\xfb\x7d\xb6\xd8\x6f\x0d\xe8\x77\x81\x00\xd7\x3a\x1d\x70\x60\x32\x0e\x14\x2e\x0d\xf2\x13\x5b\x01\x50\x31\x86\x5e\xac\x6e\x4a\xaa\xd5\x99\x41\xa0\xd7\x76\xfa\x32\x17\x06\x07\x78\x16\x7a\xc8\x9d\x31\xb4\x11\x36\x19\x3c\x98\x43\xdb\x61\x11\x5f\xac\xda\xdc\x13\xc6\x74\x82\x8b\x14\x4c\x81\x8a\x9d\x79\xff\x8a\x60\x18\xe8\x35\x65\x29\x10\x0a\xd7\xaa\x0f\x45\xbe\x1a\x1c\xd7\xf6\x0d\x7a\xfd\x92\x51\xa1\xc8\x91\x73\xf1\x38\x56\xed\x1b\x47\x49\xf7\xcd\xa5\xbe\xf4\x63\x43\xa6\xe3\x30\xdd\x65\x3b\xf4\x60\x47\x19\xec\x28\x61\x1b\xec\x28\xeb\x93\x18\xec\x28\xf7\xb5\xc1\x8e\xb2\xd5\xf8\x83\x1d\xa5\xdb\x06\x3b\xca\x60\x47\x19\xec\x28\x83\x1d\x65\xb0\xa3\x0c\x76\x94\xd8\x8f\x76\x61\x47\x69\xc5\xa0\x43\xc8\xd1\xa1\xc8\x6a\xfd\xc4\xb1\xca\x16\xd5\x3c\x6b\xa3\x42\xdd\x5b\xf8\xaf\xa7\x12\xaa\x43\x31\xf8\xb1\x22\x75\x28\xa0\xaf\x69\x30\x92\x25\xea\x7b\xe5\x67\x2f\x61\xaf\x8d\xb1\x23\xd1\xfa\x67\xae\x5c\x0a\x1c\x58\x0f\x71\x1d\x3e\xba\x50\x16\x5b\xb8\xef\x86\xb5\x71\x2e\x39\x39\x71\xba\xd6\x53\x73\xe0\x42\xea\xee\x8f\x42\xf3\x71\xfb\x86\x77\x10\x06\x95\xb0\xcb\xe6\x96\xb2\xe9\x4e\x66\x69\x75\x8f\x62\xa5\xec\x65\x0b\x6d\x06\xff\xb3\xba\x33\x5b\xae\x6c\x25\x35\x08\x4d\xab\x1b\x21\x0c\x7b\x24\x85\x8d\xe2\x48\x98\x09\x92\x16\x54\xf3\xda\x5b\x89\xc2\x14\xac\x11\x24\xaa\xf6\x98\x82\x00\x00\xaa\xb1\x4c\xa2\xcd\xb9\x24\x85\x55\x92\x9b\x27\xd8\x4f\xc2\x24\xfc\x85\x85\xfd\xe4\x7e\x45\x29\x77\xf5\x02\xee\x68\x38\x59\xae\xe0\x1c\x69\x51\xc8\xbb\x14\xfa\x94\x78\x23\xb6\x4e\x0e\x18\x0d\xbd\x77\xc9\x59\x04\x57\xbc\xe5\x63\x79\xf5\x21\xd5\xe0\x83\x6d\x48\x35\xf8\x3c\x52\x0d\x06\x76\xd0\x30\xe7\x60\xff\x5e\x41\x4e\xc2\xbd\xe6\x1c\x24\xe4\xef\x73\x06\xb7\xa8\x66\x68\xbc\x6c\x0a\xcd\xab\x36\xca\x58\xe1\x09\x15\x28\x52\x4f\x6d\x34\x60\xf7\xf6\x9a\xd9\xd0\x6c\xde\x3b\xd4\xca\x2d\x87\xf1\x20\x6a\x59\x01\x36\xc5\x88\x39\xd0\xbf\x63\xa2\x3f\x27\x6b\x63\xd8\x21\x7f\xea\x68\xaa\x28\xfc\xf7\xc6\x15\x0c\x0d\x6c\xe0\x8a\x9c\x18\xea\x58\x2c\xad\xd5\xb8\x83\x08\x3b\x64\x35\x62\x00\xd4\x83\x2d\x98\x63\x50\x67\x7c\xc1\x44\x4b\x7d\x4f\xd4\xe9\xa9\xe3\x89\x57\xf9\x87\x88\xde\x1f\xc3\x61\xc4\x60\xed\x54\xce\x60\x85\xde\x47\x8c\xb0\x81\x23\xf8\x73\x40\x65\xff\xd2\xcf\x13\x44\x0c\x82\x57\xda\x85\x67\x06\x07\xdd\xf2\x02\xbd\xbd\xec\x31\x0a\x2e\x25\xd4\x2a\x4d\x2b\xbe\x45\x88\xd5\xb6\x99\x32\xf7\x1b\x5a\xb5\xd7\xb0\xaa\xcf\x27\xa1\xe5\x13\x9b\xff\x3e\x83\x6c\x4c\xcf\xc4\xdc\x37\xa4\x63\xba\xaf\x3d\x55\x3a\xa6\xbd\x9b\xf3\x3e\xbb\xac\x4c\x07\x35\xdf\x1d\xc6\x74\xf7\x99\x65\x65\x7a\x12\x53\xdd\x33\xcf\xcf\xb4\x3f\x13\xdd\x90\xfc\xe8\x69\xf2\x4b\xa6\x9a\xe1\xb6\xbf\x55\x4f\x6a\x7e\x7b\x52\xd3\xdb\xd3\x9b\xdd\xb6\xe2\x55\x1e\x6b\x6e\x4b\xbe\x26\x8f\x35\xb3\x6d\xe3\xb2\xbf\x1d\x3c\x1f\x2e\x44\xe9\xc0\x3e\xfa\xcf\x23\x34\xe9\x89\x1c\xf3\x9f\xca\x29\x7f\xbf\x0e\xf9\x4f\x10\x8a\x74\x90\x30\xa4\x54\xb2\x9f\x44\xec\x1f\x87\xbb\xb6\xa1\xc8\x5b\x86\x1c\x6d\x89\xbf\x0e\x19\x6a\xf4\x33\x40\x61\x5b\x85\x18\x0d\x58\xec\x89\xb0\xd8\xee\x42\x8a\x0e\x15\x4e\xf4\x33\xc3\x65\x5b\x86\x0e\xed\x4c\xbb\xbd\x9f\x90\xa1\x43\x87\x0b\xed\x21\x54\xe8\x29\xc2\x84\xf6\x10\x22\x34\xd8\x04\x22\xdb\x60\x13\x88\x6d\x83\x4d\xe0\xbe\x36\xd8\x04\x56\xdb\x60\x13\x18\x6c\x02\x83\x4d\x60\xb0\x09\xac\x0f\x38\xd8\x04\x06\x9b\x40\x5c\x1b\x6c\x02\x87\xb1\x09\xa4\x86\xdd\x6c\x07\xcb\x4f\x13\x6e\x73\xd8\x50\x9b\xdd\x87\xd9\x3c\x61\x88\xcd\xcf\x4c\xe1\x92\x1c\x4e\xb3\x1d\x98\x3f\x97\x30\x9a\xe7\x11\x42\xf3\xe4\xe1\x33\x8f\x0d\x9d\xd9\x4d\xd8\x4c\x02\xb4\x6f\x09\xe7\x95\xcc\xcf\x84\xe6\x8f\x2d\x7c\x14\x02\xe0\x7d\xd5\x8f\xe8\x42\xf2\x9c\x54\x8d\xb6\x05\x57\x86\x0a\x48\xbd\x30\x70\x98\x0a\x48\x9d\xc3\x1b\xca\x20\x3d\xd4\x9e\x4d\x19\xa4\xfb\xce\xec\x80\xb5\x90\x54\x73\xa3\x6b\x9a\xe9\xa4\x82\x48\xce\xe0\x38\x94\x44\x5a\x6b\x43\x49\xa4\xa1\x24\xd2\x50\x12\x69\x28\x89\x34\xa4\xf2\x1b\x52\xf9\x85\xed\xd9\xd8\xf1\xc8\x90\xca\x2f\xf1\xd3\x21\x95\x5f\x5f\x1b\x52\xf9\x0d\xa9\xfc\xee\x1b\x7d\x48\xe5\x37\xa4\xf2\x4b\x1b\x78\x48\xe5\x47\x86\x54\x7e\x43\x2a\xbf\xcf\x38\x95\xdf\x50\x12\xe9\xb3\xa8\x0b\x32\x14\x05\x49\x18\xfb\x79\x15\x05\x19\x4a\x22\x3d\x38\xc8\x50\x12\x69\x40\x7d\x43\x49\xa4\x9f\x2d\xf6\x1b\x4a\x22\x45\x0c\x32\x94\x44\x1a\x4a\x22\x3d\xd8\x86\x92\x48\x83\x1d\x85\x0c\x76\x94\xc1\x8e\x92\xfa\xd5\x60\x47\xb9\xbf\x0d\x76\x94\x94\x36\xd8\x51\xa2\x47\x1f\xec\x28\x83\x1d\x25\x6d\xe0\xc1\x8e\x42\x06\x3b\xca\x60\x47\xf9\x8c\xed\x28\x43\x49\xa4\xa1\x24\xd2\x50\x12\xc9\x8f\x3c\x94\x44\x1a\x4a\x22\x41\x1b\x4a\x22\x45\x8c\x30\x94\x44\xfa\x5c\x4b\x22\x75\xc2\x82\x3e\xdf\xba\x48\xe9\xcb\x18\x8a\x23\x0d\xc5\x91\xee\x69\x43\x71\xa4\xa1\x38\xd2\xa6\x36\x14\x47\x1a\x8a\x23\x3d\xd0\x86\x44\x88\x91\x6d\x48\x84\x18\xdb\x86\x44\x88\xf7\xb5\x21\x11\xe2\x6a\x1b\x12\x21\x0e\x89\x10\x87\x44\x88\x43\x22\xc4\xf5\x01\x87\x44\x88\x43\x22\xc4\xb8\xf6\xf4\x06\xb8\xff\x1d\x89\x10\x87\xe2\x48\xcf\xb2\xb2\xc8\x50\x56\xa4\xa7\x3d\x9f\xb2\x22\x43\x71\xa4\x4e\xe7\x43\x71\xa4\x01\x85\x0d\xc5\x91\x3e\x3b\x2c\x36\x14\x47\xda\xd0\xf9\x50\x1c\x69\x28\x8e\x34\x14\x47\x1a\x6c\x02\xbd\x6d\xb0\x09\x0c\x36\x81\xb0\x0d\x36\x81\xd5\x36\xd8\x04\x06\x9b\xc0\x60\x13\x18\x6c\x02\xeb\x03\x0e\x36\x81\xc1\x26\x10\xd7\x06\x9b\xc0\x50\x1c\x69\x28\x8e\x34\x14\x47\x82\x36\x14\x47\x1a\x8a\x23\x0d\xc5\x91\x36\x7e\x0c\x8a\x56\x94\x6c\xee\x83\xec\x58\x58\x3e\x6b\xbb\xb2\x1c\x7c\x23\x94\xae\x9b\x4c\x37\x35\xcb\xe1\xc0\xf0\x30\x0d\x63\xa0\xb4\xac\x9d\x55\x00\x2a\xcd\xbc\x61\x55\x21\x97\x86\xda\x8e\xc8\x95\xcc\x47\xe4\xec\xea\xf2\x9a\xd5\x0b\x9e\x31\x07\x7d\x5f\x5b\x9a\x7e\xff\xbe\x7d\x5c\x56\x3c\xa3\x45\x01\x1a\x8b\x76\x36\x25\x5d\x3a\x5d\xf2\xcd\x92\xb0\x4f\x9a\xd5\x82\x16\x44\x4b\x59\xa0\xf9\xc5\x4c\x06\x10\x62\xcd\x74\xcd\xd9\x82\x11\x5a\xdf\x70\x5d\xd3\x7a\x49\x4a\xa6\x69\x4e\x35\xbd\x7f\xd4\x6f\x14\x0b\x63\x34\xb4\x24\x55\xcd\xc6\x78\x03\x3a\xf3\x00\xd8\xfc\xfa\xab\x77\xee\x7e\xd3\x3c\x77\x01\x09\x0e\xc2\xaf\x9b\x1b\xbf\xdb\xc7\xf7\x73\x5b\xb9\xdf\x2d\x35\x02\xf0\xb4\x2a\x9a\x8a\x2b\xdc\xb3\x7b\x25\xd2\x08\xb6\x24\x8d\x09\xe9\x85\x4f\x26\x16\x8f\x05\xad\x0b\xb1\xe8\x6a\xf6\x98\x58\xf0\x5a\x0a\xe0\x23\x17\xb4\xe6\xf4\xa6\x60\xd6\x92\xe6\xed\x2b\x96\xb7\x63\x0f\xc0\xcb\xb9\xb7\x33\x60\xb0\xcb\xbd\x57\xb2\x9f\x9e\xf5\x50\xb0\xce\x4a\x2f\xc4\xe2\x5b\xda\x55\x33\x88\x8d\x4b\x22\xf6\x05\xb3\x24\x4a\xce\xfb\x17\x14\xc5\x74\xc6\xa8\xc3\xc6\x80\xe1\xef\x7d\x21\x4e\x69\x65\xba\x78\x98\x5e\xa6\xd1\xc9\xf7\xb4\x6c\x2b\x68\x6d\xd8\xae\x3e\x84\xfa\x0e\x39\x7e\x65\x81\xc8\x10\x84\xaa\xe6\x42\xc3\x56\x9f\x5d\x9f\x5f\x5e\x92\x6c\x4e\x6b\x9a\x69\x56\x2b\xc2\x3e\x65\xac\xd2\xe4\xf8\xff\x77\xfc\x70\xbf\x91\x08\x1a\x70\xdf\x2e\x77\xe3\x5b\x07\x24\x50\xde\x88\x09\xc3\xd9\xfd\xea\xe4\xdb\xb3\x0f\xff\xf5\xfe\xec\xdd\xc5\x29\xc8\x2c\xec\x53\x45\x45\xce\xfa\x78\xd0\x46\xb9\x10\x9f\xaa\x66\x0b\x2e\x1b\x55\x2c\x3d\x09\xdf\x7c\xd7\x56\x2f\x99\xc1\x3f\x3d\xa3\x98\xfd\xb6\xe8\x69\x73\xa7\xa0\x67\xa1\x2d\xf4\xb7\x66\xc0\x9a\x29\x59\x2c\x58\xde\xa7\x5e\x81\x60\x4b\xb7\x1d\xad\xa1\xb5\x6a\xb4\xd3\x22\x39\xdb\x69\x23\xb2\x39\x15\x33\x96\x4f\xc8\x1b\xd9\x98\xd1\x7e\xf5\x2b\xd8\xb2\x9a\xe5\x4d\xd6\xbb\x63\xa8\x02\x44\x89\xf9\x57\x23\xc7\x61\x18\xba\xae\xb0\x7a\x9a\xca\x68\xe5\x36\x35\x3c\x15\xb5\x14\x9a\x7e\x7a\x1d\x53\x87\xed\xe8\x57\xc1\x87\x47\xae\x2e\x9e\x34\xd3\x43\x6e\x0c\x57\x54\x40\x49\xb3\x82\x1c\x85\x6f\xf7\xf5\x7d\x61\xe6\xc7\xf2\x10\x76\x30\xb4\x91\x2d\x58\x0d\xda\x27\x0b\x39\x23\x52\xb3\x19\xad\xf3\x82\x29\x08\xaa\xbb\x9b\x33\x28\x52\x88\xa2\x34\x1e\x54\xcf\x58\xcc\x6b\xca\x84\xec\xd5\x60\xbe\x41\x33\x36\x20\xf3\xa3\x9e\x65\xa4\xdc\xbc\xb7\xb5\xec\xa9\x71\xd5\xb9\x7d\xd7\x10\xb5\xe3\x8d\xfd\x9b\xc0\xf5\xd8\x5a\x49\x26\x21\x19\x51\x86\xfd\x9d\xb6\x46\x78\xf3\x3c\xc2\x10\x1f\xad\x2c\x88\xb7\x16\x64\x52\x4c\xf9\xec\x1d\xad\xbe\x64\xcb\x0f\x6c\x9a\x18\x40\x88\x9c\xbf\xd5\x7f\x03\xb2\x34\xe4\x07\x3b\xec\xe7\x5b\xf7\x18\x2f\x16\x63\x93\x49\x33\xa9\x44\x1b\x52\xd6\x2a\xd7\xa1\x0c\x62\xe5\x84\x9d\x73\xf3\x24\x8a\x82\x6e\x9c\x5c\xb4\xc4\x19\x52\x54\x8b\x0a\xa2\x6d\x0c\x1f\x5b\x96\x97\x2b\xc2\xa6\x53\x96\x69\xbe\x60\x85\x0f\x65\xb6\x15\x34\x6d\x68\xf1\x0d\xcd\x6e\xef\x68\x9d\x2b\xa8\xc9\x48\x35\xbf\xe1\x05\xd7\xcb\x98\x7a\x97\xd8\xac\xd4\x64\xa3\x9f\x9d\x62\x5e\x28\x4d\x01\x7d\xb9\xca\x8d\x66\x87\x51\xae\xa0\xce\x32\x8e\xb7\xd1\xc5\x0d\x47\x0f\x07\xc5\x03\x33\x56\x1b\x02\x57\x2c\xc9\x5d\x2d\xe3\x65\xbf\x77\x12\x02\x86\xa7\xf2\x35\x99\x6b\x5d\xa9\xd7\x2f\x5e\xb4\xb2\xd9\x84\xcb\x17\xb9\xcc\xd4\x8b\x4c\x0a\xc3\x63\xa8\x17\x72\x61\xe8\x22\xbb\x7b\x71\x27\xeb\x5b\x2e\x66\x63\xb3\x80\x31\x5e\x20\xf5\x02\x84\xed\x17\xbf\x84\xff\xed\x03\xca\x88\x73\x1e\x7a\x4d\x8e\x8e\x22\xde\x97\x15\x8a\x07\x5b\x40\xe6\x35\x68\x10\x96\x1d\x32\xe2\x11\x8b\x21\x11\x5c\x2b\xb8\x57\xce\x0a\x62\xb9\x90\x84\x65\xdf\x48\x59\x30\xda\xef\xce\xf5\x18\xd5\x27\x80\x7d\x3a\x56\x8d\xba\x97\x2d\xea\xc5\xcb\x65\xaf\x67\x25\xf3\xd7\x44\x35\x55\x25\x6b\xad\x5a\xa9\xd4\x00\xc5\xa8\xfb\x27\xe8\x65\x46\xe4\x07\xff\x10\xdd\xc6\xbe\x3b\xfe\xf3\x97\x17\xff\xfe\x97\xe3\xef\x7f\x08\x7f\x0b\xe4\xd3\xe0\x85\x88\x69\xaa\x8a\x65\x13\x21\x73\xf6\x1e\x66\x00\x7f\x5a\xee\xee\x2c\xcb\x64\x23\xb4\xfd\x41\x53\xdd\xa8\xc9\x5c\x2a\x7d\x79\xe5\xff\xac\x64\xbe\xfa\x57\x84\x11\x75\x8f\x74\x05\xf6\xfa\x8a\xea\x88\xd4\x00\x49\xd4\x85\x56\xfc\x5b\x56\xab\x88\x64\x18\xd8\x3a\xf0\x62\xbf\x0c\x4b\xee\x96\x14\xfe\xf9\xd6\x4d\xd7\xe0\xde\xbb\x9a\x6b\x0d\x3e\x8d\x36\x1b\x81\x9c\x8e\xdc\x95\x46\x46\x6a\xf1\x2a\x49\x71\x1b\x8d\x39\xfc\xae\x6d\xb1\x38\x98\xbd\x5d\x99\xd7\x9c\x58\x8f\xce\x35\x7d\xe3\xd9\xd5\x25\x59\xe0\x6e\xec\x61\x21\x8f\x43\x05\x05\xdb\x8a\xc5\x8a\x42\x06\x6f\x7d\xef\x76\x6b\x02\x96\xcc\x32\xa6\x30\x83\x98\x4d\xb1\xf5\x5a\xd1\xe7\xe3\x42\x2c\x4c\xdf\x8a\x4c\x19\xd5\x4d\xcd\xc8\x8c\x6a\x97\x59\x84\x09\xc3\xdf\x46\xe8\x27\x9f\x98\xcf\x83\x7a\xba\x31\x57\xd6\xbc\xb8\x90\x45\x53\x02\xb2\x7a\x16\xfc\x63\x82\x51\x00\x19\x4d\xc3\x11\xd8\x6b\xe1\x0f\x9d\x9c\x99\x4b\xbf\x00\x57\x12\x7c\x07\x4b\xa7\x2f\xc0\xda\x1a\x26\x59\x51\x9a\xd6\x3a\x41\x77\xed\xfd\xc6\x9d\x16\xc0\x0e\x4f\x09\xe6\x33\xc0\xa2\xe8\x3b\xd7\xa5\xb4\x0d\x33\x09\x91\xb3\xa2\x9a\x83\xa1\x6f\xe6\xf9\xd4\x8d\x90\x3b\xf2\x9e\x65\x8a\xff\x13\x24\xaf\x82\x97\x5c\x23\xbb\xf8\xea\xb7\x7f\x0a\x26\xb3\x17\x44\xf8\x08\x96\x28\x1a\x12\x36\xf1\x4e\x06\x0c\x1e\x60\x9b\xbc\xe7\x8a\x7b\x2f\xde\xa5\x2d\x97\xcc\x8a\xaf\xe0\xd7\x62\x7a\x69\xa1\x6f\x41\x6b\x27\xdd\x56\xcd\x4d\xc1\xd5\x3c\xde\x34\x7e\x39\xf5\xbb\x65\xfa\x50\x0c\x1c\x03\x74\xdd\x30\x6f\x03\x6d\xf1\xbe\x59\xd3\xca\x4c\x12\x8c\x58\x1b\x75\xaa\x9d\x14\x4e\xad\xba\xf8\x0a\x0c\x9d\x5e\x9f\xa5\x26\xbf\x78\xd4\x7a\xa6\xb4\x50\xbb\x5d\x90\x11\x67\xea\x5a\xd6\x5e\x85\x55\x33\xdd\xd4\xa2\xf5\x05\xba\x92\x39\xc9\x6a\x86\x91\x1f\x7b\x60\x98\x49\x28\x28\xc0\xfa\x22\x3e\xa9\xb6\x63\x0e\x92\xd0\xa3\x19\x23\xc4\x8f\x88\xea\x11\xf1\xa1\x66\xae\x1b\x2b\x12\x4b\x30\x4d\x7b\x67\x2f\x94\xcf\x65\x64\x8e\xd4\xe5\xb7\xb2\xd0\x02\x9d\x1e\x4f\x26\xc7\x38\x13\x59\x23\xba\x45\x29\xd4\x3c\xdf\x0b\xca\x69\x09\xda\x96\xea\x0b\x11\x08\xff\x76\xcb\x4a\xc3\xb7\xbb\x65\x39\xf5\x65\x0a\x8f\x71\x40\xc6\xcb\xa5\xd6\x79\x7b\x10\x59\xcc\x8d\xe6\x36\xcc\x23\x8a\xd7\xe8\x3b\xe4\x13\xfd\x20\xe1\x51\xd6\x9c\xf8\x63\xc3\x94\x8e\x11\xda\x4f\xf0\xb3\x49\x56\x35\x23\xdb\xc5\xa4\x64\xa5\xac\x97\xfe\x4f\x56\xcd\x59\xc9\x6a\x5a\x8c\x95\x96\x35\x9d\xb1\x91\x1f\x00\x3f\xf3\x7f\xe1\x87\x9d\x29\xac\x7f\x8d\x16\x82\xac\xa9\x6b\x26\x74\xb1\x74\xb2\xe5\x13\xf3\x7d\x6e\x1f\x77\xcc\xa4\xf9\xe3\xda\xf2\xbe\x1c\x7b\xe3\x1b\xea\xe4\xfc\xaa\x40\x45\x8c\xb7\x47\x8d\x5a\x42\x00\x36\x00\x24\x94\xea\x78\x1f\xb7\x3f\xe7\x0b\xae\xb6\x8a\xfc\xb9\xf6\x1e\x54\xe0\x6e\xd4\xe8\xaa\xd1\x36\x7d\xa4\x97\x2a\x3e\x55\x52\x81\x75\xc0\x67\xaf\xea\x88\x93\xaf\x62\xb4\x44\x80\xfb\x35\xab\xc5\x6b\xf2\x9f\x27\xff\xf1\x9b\x9f\xc6\xa7\x7f\x3d\x39\xf9\xee\xe5\xf8\x5f\xbf\xff\xcd\xc9\x7f\x4c\xe0\x1f\xbf\x3e\xfd\xeb\xe9\x4f\xee\x8f\xdf\x9c\x9e\x9e\x9c\x7c\xf7\xe5\xbb\xbf\x7d\xbc\xba\xf8\x9e\x9f\xfe\xf4\x9d\x68\xca\x5b\xfc\xeb\xa7\x93\xef\xd8\xc5\xf7\x91\x9d\x9c\x9e\xfe\xf5\x57\x51\xd3\xa3\x62\xf9\x75\x04\xd6\xc0\x36\xde\x22\x27\x67\xfb\xd5\xb6\xce\x4a\x5c\xe8\xb1\xac\xc7\xf8\xf9\x6b\x60\x92\x22\x3a\x71\xc7\xb6\x0d\x9c\x7f\x70\xb7\xb5\xc5\x78\x9e\x78\xee\x01\x90\x1f\x43\x00\x14\xcb\x6a\xa6\x77\x65\xde\xc0\xde\x1c\x37\xb8\xe2\xf6\xf6\xdc\x25\xe1\x43\x5a\x3c\x7c\x2a\x41\xd8\xaf\x96\xb3\x32\xec\xd6\xa4\x65\x98\x28\x41\xb9\xd4\xbe\x77\xcb\x22\x63\x51\x07\x0b\xc9\x60\x21\x19\x2c\x24\x5d\x29\xff\x1a\xef\xd0\x33\x37\x8f\x30\xb1\x78\xc8\xca\x9e\xe0\xec\xf5\x16\xf2\x02\x87\x0e\x5f\x8e\xb9\xd6\x92\x54\xb2\x6a\x0a\xaa\xef\xf1\x21\x49\xf0\xfe\xea\xd7\x71\x79\x54\x76\xfe\x5f\x97\x6f\x2e\xde\x7f\xbc\x7c\x7b\x79\xf1\x61\x42\xce\x8a\x22\x54\xbb\xdd\x0f\x71\xad\xa4\x8e\x9c\x35\xa1\xe8\xea\x05\xfa\xb9\x3b\xa7\x50\x69\x7d\x68\xb8\x6a\x15\x75\x98\xed\x18\x09\x94\xf5\xa0\xe0\xc2\xe7\x3c\xbe\x77\x48\xcf\xb0\xf9\x58\x87\xb5\x34\xe7\xe8\x49\xab\xb4\x5b\x26\xcc\x52\xd3\x5b\xf0\xfe\xc9\x58\xce\x44\xf6\x80\xac\xf7\x2d\xc6\x4f\xb8\x3d\xbb\x31\x62\x06\x38\xe8\x21\x46\x21\x79\x53\x15\x3c\x33\xe7\xe3\x35\x92\xd1\x7d\x5f\x96\x65\xa3\x1f\xf2\xe4\xda\xb9\x1f\x9e\x81\x34\xeb\xeb\x11\xb8\xe3\x01\x7d\xf3\xe2\x9e\x8f\xf5\xf3\x86\x4a\x70\x66\xc1\x4b\x79\xff\xe1\x47\xb1\x04\x71\x84\xdb\xfb\x72\xf4\x72\x3a\x6b\x14\xbb\x35\xae\x76\x29\xf5\x83\xbd\xec\xc1\x1d\x25\x8e\x4e\xa7\xd3\xe8\x6d\xe9\xf3\x21\x69\xf3\x01\xe9\xf2\xf6\x34\xf9\xe9\xe8\x71\x12\x2d\x8e\xa7\xc3\xf1\x34\x38\xc1\x43\x21\x95\xee\xc6\xd3\xdc\x6d\x25\xa1\xaa\x66\x53\xfe\x69\x97\x8e\xa5\x5f\x3b\x25\x86\x66\x9f\xb4\x75\x67\xaf\x98\xf0\xc1\x4f\x4e\x6f\x08\x7e\xeb\x9f\x9d\x1f\x2e\xca\x23\xe9\x88\xf4\x7a\x93\xbc\x33\x60\xd1\x01\x8b\x76\xda\x80\x45\x7b\xa5\x98\xe7\x84\x42\x85\xcc\x7b\x93\x28\xc5\xde\xa6\xf7\x41\x5f\x2b\xb9\x55\xd0\x08\xe5\x16\x0e\xa6\x4e\xe7\x59\x5c\x49\x80\xe8\x29\xd7\x6d\x80\xdc\xfd\x80\x76\xbd\xa1\x47\x88\x7c\xb3\x5f\x1e\x2b\x97\x23\x6c\xa5\xff\x95\x72\x35\x18\x8a\xf4\xf0\x58\x89\xa0\x8c\x3c\x6a\x83\xb9\xd4\x5e\x50\xa5\xf8\x4c\x8c\x2b\x99\x8f\xcd\x28\x2f\x1e\xe4\xe7\x0f\x19\x8d\xe4\x55\xda\x8f\x3d\xee\x0f\xde\xe0\x13\x08\x0e\x06\xad\x35\x9a\x05\xd6\x20\x6f\x27\x70\x29\xaa\x22\x04\xd3\x5e\x31\xe8\x91\x87\x53\x52\x41\x67\x6c\x6c\x27\x3b\xf6\x93\x1d\xfb\xb9\x3d\xe2\xbc\x62\x88\x59\x56\x50\xfe\x70\xbc\x6f\x0a\x09\x3b\x87\xde\x6c\xdd\x1f\x1f\x90\xbd\x52\x7d\xc3\xc9\xab\x5c\xa0\xab\xa2\xfb\x09\x3f\x7e\xd8\x06\x0f\x97\xc5\x27\x50\xdc\x70\x90\x0f\x7e\x1d\xd0\xc8\x1c\xf8\x28\x85\x17\xf0\x61\x42\xf4\x66\x29\x68\xc9\x33\x07\x65\x67\x05\x04\xd7\x72\x29\x3a\x6e\x2f\xf1\x43\x73\x45\xb8\x07\x2b\x72\xa9\x49\x46\x05\x5a\x2e\xad\x1b\x84\x41\x18\xa1\xf7\xc3\x03\xdb\x11\x15\xdc\x1d\x11\xd2\xdd\x39\xe4\x0f\xe1\x81\x84\x71\x29\x52\x30\xc2\x84\xae\x21\xd3\xed\x95\xcc\x0d\x69\x99\x74\xde\xee\x71\xe9\x89\xe6\xc3\x62\xf5\xf2\x3d\xc1\x71\xe4\xf9\xb0\x74\x01\x81\x08\x39\xf7\xce\x96\x56\x32\x9f\x6c\xb8\x12\xf1\x25\x8c\xae\x64\x6e\x63\xc0\x75\x07\xde\xcc\x6d\x01\x50\x2b\xe9\xad\x8b\xcc\xf6\x46\x25\xba\xa0\xbc\x88\x08\x1e\x22\x90\x72\x54\xf1\x9c\x11\x1a\x83\x3b\xfd\xc4\xe2\xd9\x21\x6b\x22\xdf\xc7\x21\x7c\xc0\xae\x5d\xa2\x2d\xd8\xff\x6c\x2e\x15\x13\x70\xdf\xa8\x1b\xdb\x17\x0a\x74\x60\x9f\x23\x8e\x8c\x61\x39\x2f\xa7\xc8\xe6\x8e\x08\x5b\xb0\x7a\xa9\xa1\x5c\x97\x4b\xea\x8a\xdd\x98\xf1\x4b\x9a\x07\xbb\x3e\x22\xd2\xf0\x65\x77\x3c\xca\x89\x07\xf0\x04\xce\x4f\x35\x85\xf6\xbc\xb6\x9d\xfd\xce\x4e\x63\x3d\x80\xdd\x70\x71\xb7\xbd\xd9\x7a\x7b\x2f\xe4\x7d\x91\xf1\x25\xad\xee\xfd\x0a\xbd\x2e\x76\x45\xa4\xbe\x42\xaf\x10\xfc\xe4\xc6\x1a\xdf\x4b\xfa\x89\x97\x4d\x49\x28\xfa\xdd\xc8\xe9\x06\x06\x22\x2a\x59\xc0\x2e\xd8\x81\x0d\x6c\x80\xba\x8f\x0f\x20\xf1\x68\x35\x3d\xa5\xcd\x33\x75\x1b\x88\x72\x17\x48\x73\x13\x48\x70\x0f\xd8\xda\x2d\xc0\x39\x00\xed\x0a\x90\x2d\x4a\x5b\x03\x65\x2e\x7a\x41\xd9\xd1\xd7\x87\x61\xf9\x72\xda\x8e\xc1\x15\x91\x25\xd7\xda\xfa\xd9\x04\x14\x60\x44\xb8\xee\x38\xa5\xd8\x0b\xc6\xa7\x48\x68\xb8\x22\xec\x53\x55\xf0\x8c\x83\x6f\x93\xf3\xbf\x7c\x98\xd1\xf3\x38\xd1\xa6\xaa\xe2\x65\x85\xc9\xaa\xe0\xa2\x8c\x1d\x0f\x69\xc3\x3e\xfd\x2c\x6d\x9c\x32\xfb\x94\x31\x96\xdb\x89\x0c\xf7\x75\xb8\xaf\xc9\xf7\x55\xed\x48\x15\x11\xaa\x21\xda\xbc\x39\x5e\x1d\x61\xae\x12\xe4\xb4\x41\xc5\x80\x83\xae\x87\x2e\xe6\x85\xcb\xaa\xfe\x81\x81\x79\xef\x9a\x69\x65\x33\xf4\x40\x4f\x0f\xe9\xd5\xd6\xb2\x34\xfb\x4c\xec\x2e\xdd\x15\x05\xc5\x61\xf0\x46\x9b\xdf\xe4\x01\x29\x59\xaf\xb2\xb7\xa0\xeb\x60\x65\x55\x50\xdd\x6a\x42\x1e\x91\x08\x25\x86\x89\x4f\x49\x64\xfc\xb4\xa9\x8b\xf7\x23\xb6\xf5\xb2\xc1\x4f\x98\x82\x78\xdb\xa4\xc3\x7b\x10\x18\xfb\x9d\xb8\x22\x93\x07\xc7\x0b\x96\x51\x5e\x5e\xfb\x4e\x09\x9c\x20\x86\xc5\xa7\xfd\x4d\x97\xc3\xf6\x9c\xda\x77\x5f\xc9\x7c\x13\x76\x2f\x36\x61\x6f\xfa\xde\x1d\x28\x29\xef\xc1\xd3\xf0\x1e\x32\xf1\x6e\x52\xaa\xdd\x94\xe4\x89\xd1\x89\x13\xb7\xf7\xca\x4d\x49\x98\xb8\xe5\x87\x91\x69\x71\x53\x60\xf7\xc0\xa9\x6f\x0f\x9c\xec\xf6\x29\xd2\xdb\xee\x4d\x7e\x88\x00\xcd\x74\xcb\x9e\x96\x85\xad\xeb\x13\x67\xe9\xf9\xd8\xbe\x0f\xdb\xd1\x3a\x81\x07\x3d\x1d\xc6\x2d\xed\x41\xc8\xfe\xe8\xf8\x5c\x83\x9d\xda\x49\x03\x8c\x6b\x4d\xb3\xb9\x4d\x52\x8b\xbf\x18\x48\x10\x4b\x62\x80\x40\x23\x25\xb7\x79\x32\x1f\x3a\xe7\x39\x23\xba\xe6\x55\xc1\xc8\x9f\xfd\x85\x18\xa1\x6d\xff\x2f\x41\xaa\x30\x97\x54\xb4\x05\xc6\x3f\xbb\x7f\xfd\xe5\x91\x19\xea\xe2\x98\x1c\x9c\xd2\x2e\x79\xd5\x0b\xe8\x91\x70\x91\x83\x07\x23\xb2\x42\xb8\x79\x38\x98\xd9\x5a\x58\xf7\xc4\x66\xf7\xc4\x54\xb9\xd6\x04\x0b\xae\x8e\xed\xcb\xbd\xac\x03\x78\x78\xb6\xaa\x09\xef\xe1\xe0\xef\x30\x23\xef\xe5\xb5\x35\xdb\x8e\xc8\x15\x68\x87\xdb\x27\x70\xe7\xdf\xcb\x8b\x4f\x2c\x6b\x74\x8f\xd3\x4d\x24\xfa\xef\xe5\x19\xd3\xf6\xf3\xcb\x96\xa1\xc4\x8d\xe9\x30\x94\xed\xc5\x0a\x59\xca\x07\x37\xf6\x96\x2d\x7b\x77\xd5\x32\x09\x96\x99\xb5\xaa\x71\x0f\xa3\x8e\xc8\x23\xdf\xf0\x7f\x9c\x29\xaf\xbc\xe1\x02\xa7\x82\x03\xbb\x73\x86\xb1\xdd\x79\x18\x09\xa4\x28\x22\x26\x11\xb9\xdb\x71\x1c\x6f\xaa\xf3\x56\x3c\xa7\xeb\xe9\x45\xdf\x96\x6e\xe2\x6f\x03\xa6\xf6\xe2\xc7\x86\x16\x93\x4e\xea\x36\x7c\xd4\x77\xdd\xac\x5b\xf3\x2a\xdd\xbc\xe3\x45\x9e\xd1\xda\xc6\xd6\x01\xfa\x21\x4a\x5a\x33\x2c\x60\xbf\xac\xd7\x81\xdd\x21\xc0\x16\x78\x14\xfa\xf2\x56\xb4\xd6\x3c\x6b\x0a\x5a\x13\x73\xc7\x67\xb2\x8e\xca\xcd\xd6\x7b\x98\x2d\x34\x5f\xb3\x4c\x8a\x7c\xa7\x42\xf4\xc7\xd5\xce\x57\xbd\x95\x2b\x56\x73\x89\xb9\x82\x78\xc9\x56\xaf\xd7\x49\xc7\x01\xa5\x4f\x0e\x9b\x3a\x64\xe7\x71\xcb\x28\xd4\x8c\x76\x6d\xca\x58\x82\xee\x34\x20\x38\xfe\xb6\x4f\xc8\x17\x4b\xa7\xa2\xed\x63\xc8\xb9\x76\xf9\x04\x14\xd3\x2e\x9f\xa2\xbb\x8a\xf6\x24\x5b\x34\x32\x95\x35\xe4\x29\x3c\xc9\x25\xc6\xd1\x2f\x78\xa6\x4f\x27\xe4\xff\xcf\x6a\x19\x91\x88\x52\xb0\x19\xc6\x72\xdb\x8b\xed\xf5\x51\x35\xa3\xd6\x4b\xff\x25\x39\x81\x4e\x09\x2f\x4b\x96\x73\xaa\x59\xb1\x3c\x45\xf5\x14\x23\x6a\xa9\x34\xeb\xb1\xcd\xc5\xab\x15\x31\xf4\x12\xde\xfd\xc3\xef\x1f\x78\x73\x0f\x09\x44\x6d\x92\xc2\x76\x63\xd1\x53\x6e\x05\x7a\x7c\x6a\xed\x5e\x79\xff\x5e\xf9\x2c\x0c\x47\x68\x93\x9b\x3b\xdc\xec\x61\xeb\x1f\x06\x40\x29\xa9\xd9\x0c\xee\x27\xde\xb9\x47\xde\x4e\x8c\xcd\x7d\x27\x1b\x71\xbf\x0d\xa4\xb3\x6f\x5f\x59\x15\xdc\xb7\xc1\x87\xa9\xa9\x85\x77\xcb\x10\x06\x33\x09\xac\x2e\x14\xa3\xf5\x81\x03\x33\x88\x0d\xdf\x6a\x83\x58\x22\x8c\xe5\x3b\x4c\x17\x0c\x73\xe9\xc9\x9f\xb5\x93\xa4\xc2\x7e\xa0\x5d\x5e\x85\xab\x95\x0c\x12\x41\x5a\x5b\x57\x96\x35\xc8\x92\xd0\x42\x30\x4c\x86\xe5\x36\xec\xb1\x0f\xed\x04\x19\x23\x8e\x5f\xef\xc6\x9b\x19\x77\xa3\x96\x15\x9d\xc1\x65\xdd\xe5\xa6\xac\xf6\x4d\x72\xa6\x59\x5d\x72\xc1\x14\x99\xcb\x3b\xfc\x1d\x99\x81\xca\xbe\xc5\xf2\xd6\xf3\x60\x2e\x7b\x77\x04\x4b\xb0\xb6\x09\x84\x11\x7b\x80\xc3\xe8\x1d\x5d\x12\x5a\xcb\x46\xf4\xa6\x23\x00\x2e\xda\x53\x8e\x77\x2b\x93\x7e\x2f\x05\xf3\xce\x28\x7d\x54\xb6\x43\xda\x6e\x98\xa6\xe6\xc2\xbf\x9a\xbc\x7a\x19\x35\x87\x0f\x2c\x6b\x6a\xc5\x17\xec\x03\xa3\xf9\xd7\x46\xe2\x6e\xd3\xc1\x5c\x4e\xaf\xa4\x52\xfc\x06\xb3\xf0\x18\x06\x09\x73\x6c\xad\x4f\xd8\x73\xa8\x30\x73\x59\x93\x46\x78\x11\xa1\x67\x16\x96\xcc\x87\x56\x51\xd3\xc9\xe9\x4e\x20\x2d\x31\x99\x37\xec\xe5\x8a\x7d\xc6\x79\x99\x3b\x5c\xb5\x93\x79\xd5\x76\xb3\x77\x09\xf9\xef\xf0\x5a\x43\xdf\x63\xd0\x9d\xf0\x29\x58\xed\x46\xf8\xe8\xae\xe6\x9a\x05\x74\xeb\x04\xb3\xfd\x74\x0f\xab\x67\xdb\xbb\xa9\x8e\xa1\x83\x98\xfd\xe8\xf7\x83\xae\x57\xc1\x70\x97\x3b\xb3\x0e\xe3\x6d\x41\x1e\xe7\xeb\xdd\xee\x9a\xc5\x10\x2d\xbe\x9c\x53\x91\x17\xbd\x70\xec\x57\x50\x2c\x7b\xb3\x30\x81\xb7\x40\x7b\xdd\x60\x1f\x47\x21\x93\x3a\xa7\x86\xaf\x04\x5e\x12\xf4\xb6\x22\xf7\x37\x2c\x38\xac\xd4\x71\x10\x18\x10\x65\x85\x48\xc3\x5e\xf7\x37\x5c\xd9\xeb\x0d\x9a\x12\xa0\xdc\x96\xbf\x2d\x69\x6f\x05\x94\x60\xfd\xed\x66\x4e\x2c\x7b\xb5\x61\xb4\x16\xb9\xac\x8c\xb7\xed\x58\x23\x03\xef\xc8\x92\xfb\xac\x30\x8e\xf9\x6d\x11\x76\x6d\xb8\x8f\x92\xb5\x13\xeb\x19\x6a\x75\xda\x1e\x05\xae\xcd\x79\xf3\xac\xfc\xa4\x7a\xc6\xe9\x9f\x72\x57\x9e\x41\x85\x5a\x27\x2d\x98\xa6\x18\xae\x1b\x91\xd3\x7e\x25\x29\xd7\x8c\x09\x90\x56\x40\x0b\xe7\x14\x49\xd6\x77\x8e\x2a\x29\x62\x00\xad\xe7\x90\x0d\x9e\xe9\x27\x1f\xf8\x59\xcf\x60\x40\x63\x4e\x64\xbd\x72\x1b\x9c\x00\xb6\x81\x92\xa4\xce\x1e\x08\x73\xdb\x2f\x02\x55\x20\x68\x99\x0d\x6c\x85\x7f\x39\xf5\x57\x67\x37\xc1\x5e\xcd\xcd\xbe\x59\xc5\x0d\xc9\xc6\x42\x90\x3b\x56\xf7\x73\x8d\x09\xf4\xe1\xe8\x88\x9c\x60\x3f\xc7\x8a\xd4\x52\xea\xdd\x10\x75\xbb\x3f\x17\x9f\xaa\x9d\x2a\xa1\x2e\x6c\xf1\x80\x98\xcc\x6c\x3b\xda\xac\x2f\xd8\x9c\x2e\x98\x22\x8a\x97\xbc\xa0\x75\x01\x99\xd9\xaf\x71\x79\x10\x82\xb6\x31\x17\x60\x44\xe9\x8c\x40\xe3\x1d\xce\x33\xe8\x6e\x9f\xe7\x48\xdc\x1a\xcc\x11\x01\xbd\x71\x6b\x32\x73\x2c\x1b\xdd\xd0\xa2\x58\x12\xf6\x29\x2b\x1a\x83\x2f\x77\x22\x2c\x6f\x23\x27\xaf\x8a\xc8\x95\x75\xd4\x3f\xa0\x80\xdc\x55\x79\x1a\x7e\x35\x77\xe0\x04\x02\x31\x9a\x4d\xc0\x06\x02\x51\x0f\x34\xcb\x98\x52\x2e\x87\xc1\x32\xcc\xc3\xe0\xd7\xf0\xb9\x94\xda\xa1\x77\xea\xa2\xa0\x4a\xf3\xec\x8b\x42\x66\xb7\xd7\x5a\xd6\x3b\xd5\x15\x6d\xea\x7f\xa5\x80\xd1\xd9\xdf\xaf\x0d\xf2\xbe\x0d\x12\x47\x59\x47\xcc\xd0\x30\x45\x7b\x06\xba\x6d\x6e\x58\xc1\xf4\xb1\x02\xf9\x91\x94\x34\x9b\x63\x19\xad\x1c\x33\x90\xba\xd4\x64\x56\x7d\xfd\xe0\x11\x61\x7b\x63\x66\x09\x85\xe9\x5e\x9b\x39\xae\x2f\x03\xfd\xcd\xec\x3b\x98\xdd\x03\x35\x58\x60\x0c\x74\x81\x74\x5c\x8c\x75\xcd\xfa\xd8\xa9\x8d\xfb\x04\x21\xa9\xb6\xb6\x0c\xaf\xd1\xd3\xcd\xce\x9f\xdd\xa8\x49\xa6\xf8\x84\xde\xa9\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\x2f\xfa\x43\x1c\x12\x5d\x48\x6d\xd2\xbf\x17\xf6\x86\xff\x92\xde\x29\x86\x13\xbd\x31\x13\x85\x12\x68\x11\xb8\x63\xa7\x4e\x51\x38\x97\xcb\x37\x0f\xbe\x18\xef\xf0\x34\x55\x1f\xcd\x1c\x7b\xde\xda\xc6\x05\x06\x7b\x76\xaa\xd2\x29\x2f\x18\xaa\x80\xf1\x64\xbb\x29\x34\x01\xe8\x97\xb2\x21\x77\x14\xad\x19\x40\xc0\xa2\x82\xa9\x79\xf5\x9a\x5c\x08\xd5\xd4\xac\x35\x92\xad\x0e\xb6\x89\x25\x87\x9b\x62\x41\x56\xcc\xa2\xd4\xd3\xd8\x2e\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\xde\x85\x9a\x8b\x29\xab\x6b\x1f\x7f\x8d\x1f\x18\x96\xbc\x23\x45\xf5\x8f\x79\x68\xb8\x25\x69\xce\x2f\x60\x1e\xea\xd7\xa4\x91\xad\xe0\xc8\x77\xee\x40\x29\x78\x20\x76\x03\x44\x97\x53\xe7\x31\x8f\x72\x95\x65\xe1\x61\x40\xdb\x8d\x01\x1b\x3b\x8e\xa1\x3c\x69\x80\xf2\xd6\xa7\xbb\x24\x2f\x72\xb6\x78\xa1\x72\xfa\x6a\x04\x53\x55\x36\xe4\xbb\xbb\x2e\xaa\xc8\x51\x5c\xf1\x81\x6b\xc7\xb9\x8d\xc2\x9d\x68\x7b\x32\x88\xd8\x0d\x09\x7e\x2f\x2f\x8f\x40\x74\x31\x63\x67\x54\x90\x82\xd1\x85\x15\xe7\x10\x65\x2c\xd1\xc0\xd0\xcb\x61\xa5\x18\x6b\x48\xd7\x60\xf3\xbb\xdf\xf6\x8a\xd7\x31\x3a\x18\xb2\x15\x34\xb9\xbe\x9d\xd5\xa6\x6e\x6c\x2e\xa7\xa9\xac\x33\x2f\x73\x5a\x2d\x0d\xd3\x80\x1b\xb8\xe8\xd8\x35\x9e\xf7\x85\x8d\x4b\x55\xe6\xa8\xc8\x5e\x7c\x1f\x6d\xdf\xa0\x41\x16\xfc\xc7\x86\x91\xcb\x37\xbe\x22\x0b\xab\x15\x57\xda\x08\x14\x79\x87\xef\xe1\xc8\x0c\x9d\x9c\x95\xf4\x9f\x52\x90\x8b\x2f\xae\x6d\x47\x11\xa0\xf8\xac\x11\x24\xfd\x67\x53\x33\xc3\xe3\xed\x94\xb5\x74\x9d\xae\xf2\x93\xe6\x39\x79\x43\x35\x45\xb6\xd2\x06\x16\x89\x96\xe4\x19\xa6\xf0\x86\x8b\xdc\xfe\xb4\x25\x4b\xe8\x87\x4f\xe2\x03\x83\x69\x9b\xcd\xeb\x5b\xe3\x46\xe6\xcf\x40\x0d\x72\x7f\xa6\xaf\x24\xfe\x6f\x0f\xdc\x98\x99\x4d\x44\x79\x0c\x7c\xf1\x9b\x0f\x97\x3b\xe2\xda\x32\xe0\xf0\x67\xef\x64\x9e\xca\xba\x1d\x07\x9f\x3a\x82\xfa\x6f\x06\x2e\xce\xf1\x39\x29\x4d\x9f\xa0\xb8\x1a\x81\xf2\x96\x7c\x0d\xba\x4d\xf8\xe7\xdf\x6b\xae\xd9\xa4\x3f\xa3\x6d\x02\xeb\xe0\x36\x30\x71\x19\xee\x33\xb7\x84\x30\x17\x4f\x6e\xa0\x1f\x90\x8b\xe5\x0f\x6e\x0a\x79\x43\xec\x95\xdf\xf5\xdc\xbf\xf9\x70\xb9\xc5\xd4\xbf\xf9\x70\xe9\x66\x6e\xfe\x29\xa7\x87\x9b\xf4\x21\x18\xfe\xb7\x2b\xfc\x77\x0a\x2f\xd6\xa6\xc2\x5d\xe5\xe2\x77\xc9\xc2\x4f\x0e\xc6\xbc\x6f\x97\x62\xc8\x8c\xd5\x27\xf4\x73\x11\x91\x0c\xb9\x7b\xf9\xcd\x37\x84\x7d\xaa\x10\xa3\x06\x2e\x93\xd7\x73\x0a\xf9\xab\x5d\xaa\x4c\x04\x3f\x03\x8f\xca\x90\x6c\x07\x88\x84\x62\x95\x32\x43\x0d\x50\x4b\x9f\xbf\x76\x8e\xe0\xfe\x8b\xcd\x1f\xbc\x83\x00\xcc\xfc\x35\xd2\x00\x82\xf1\x98\x79\x00\xf7\x27\x68\xae\x10\xfe\x27\x1b\x77\x8f\xd9\xae\x14\xd3\xa7\x93\x8e\x6e\x5d\xc1\x94\x77\x8a\x8c\x0e\xc2\x78\xae\x59\x30\xc9\x89\xf9\xed\x05\xd8\x47\x4f\x27\xad\xc5\x0c\xb2\x43\xb4\xbc\x69\xc4\x18\xe6\x52\x7c\x78\x34\xf7\x9a\x96\xf2\x36\xba\xb8\x09\x9c\xbb\xc1\x0c\x3b\xe7\x83\x4c\xa7\x1b\xf9\x20\xf8\xc1\x15\xc4\xdf\x27\x2b\x04\x03\x6d\xc1\x0a\xc1\x77\x5b\xb3\x42\x50\x5f\xe4\xd9\xb0\x42\x98\x23\x30\x8a\x19\x82\xab\xdb\xfb\x66\x3c\x3b\x74\x90\x7b\x9b\xff\x9c\xee\x6d\x7b\x58\x89\x7b\xd6\x7e\xe8\x18\x18\x9f\x20\xc7\x25\xb7\xef\x04\xa4\xe2\x45\xbc\xb6\xd4\xc0\x16\xb9\x44\x76\xcd\x5c\xbf\x2f\x23\xf2\xf4\x27\x20\x70\x0f\x58\xa9\xab\x72\xdf\xb9\x45\x21\x91\x82\xc7\x24\xaa\xfc\x5d\xe4\x24\x33\x56\xcd\xa7\x3b\xf5\x72\x36\x3d\xbe\xbd\xee\x9a\x71\xce\x59\x35\x27\x6f\xaf\x37\xa0\x3c\x38\x1c\x58\x96\x42\xe3\xce\xb1\x22\x05\x9f\x32\xf0\x49\x48\xc0\x7a\xe7\x38\x6a\x07\xe5\x79\x67\x34\x87\xe2\x70\xb1\x5e\x05\x2b\x24\x29\xa4\x98\x19\xe6\x20\xae\x6a\xce\x1e\x90\x54\x29\x05\xd7\xb2\x7e\xd8\x1b\x22\x1e\xf1\xb8\xee\xf6\x81\x78\x5c\xdf\x66\xeb\xda\x02\x23\xef\x82\xa7\x94\x64\xb2\x28\x58\xa6\x6d\xb9\x53\x38\xf6\xa8\x15\x62\xdb\xa0\x34\x61\x56\x67\x39\xb9\xfd\x13\xa8\x4d\xac\x82\xe4\x05\x1e\xe5\x8b\x0f\x17\x67\x6f\xde\x5d\x4c\xca\xfc\x97\x73\x79\x37\xd6\x72\xdc\x28\x36\xe6\xfd\xc5\x3b\x3e\xe3\xe8\x4c\x12\x5d\x8f\xad\xcb\x6a\x57\xb6\xce\xac\x4b\x0c\xfc\x9a\x7c\xa3\xd0\x7b\xc3\x7b\xee\xb0\x1c\xac\xd9\x23\x52\x53\x9b\xef\x93\xe2\x55\x9d\x36\x45\x81\xa7\x69\xee\xd1\x28\xd4\x47\xbf\xf8\xfc\x18\xde\xce\x26\x3c\x7b\xee\xf7\xf0\xd7\x22\x85\x62\xf7\xf3\xcf\x64\xab\xc3\x6a\x7b\xef\x1e\xd7\x75\xe7\xb9\x76\x75\x03\xb5\x84\x50\x31\x08\xea\x36\x8c\xed\x37\x8a\xd5\x5d\x30\x65\x3a\x83\xdd\x79\xd1\x28\x56\x4f\xb0\xfb\x67\xb8\xf7\x71\x5c\x45\x5c\xf6\x6b\xf2\x88\x9d\xff\xc0\xa6\x9b\x36\xde\x3e\xf6\x1e\x37\x8e\xf3\xa7\x8d\x9e\x33\xa1\xb9\xcd\x6e\x69\x39\xaf\x8d\x27\x81\x81\xf9\xcf\x70\xeb\x23\xeb\x3e\xa5\x55\x69\x1a\x2a\x1b\xb5\x6d\xa8\x6c\xf4\x3c\x2a\x1b\x3d\xa6\x5c\x9b\xc1\x9e\xfb\xc0\x3a\xa6\x5f\x48\x14\x17\x72\x27\x3e\xf5\x55\x4d\x73\xa9\xf0\x1d\xb3\x87\x1d\x7c\x42\xf3\x92\xc7\x94\xbd\x7d\x76\x98\x3c\xe3\x22\xef\xdb\xcc\x44\xd1\x0b\x7a\xec\x8a\x5e\xf6\x99\x35\xc4\x7b\x27\x2e\xea\xb4\x4c\x98\x49\xdc\x3a\x6c\x75\xfd\xb5\x92\xe4\x2f\x1c\x26\x4d\xe5\x64\xe7\xb6\xb5\xbe\x09\xbf\x07\x8d\x93\xac\x98\x41\x24\xd9\xed\x44\xd6\xb3\xc7\x39\x60\xad\x42\x45\xb9\x54\x3f\x16\x63\x1c\x6b\x5c\xe5\x2d\x58\x1c\x5a\x56\xfc\x99\x78\x5a\x3d\x3f\xe3\xcb\xb3\xf0\x9f\xda\x0d\xd8\x91\x67\x28\x6f\x3d\x7b\x45\xe5\x41\xce\x23\x45\xaa\x3a\x04\x6b\xdf\x52\xda\x4a\x72\x1b\x1d\xed\x0b\xa8\x22\xde\x0a\x6b\x88\x57\xb4\xa6\x25\x83\x5a\x3e\x8d\x75\xdd\xcd\xa4\x10\x31\x1c\x33\x84\x88\x7e\x5d\x31\x71\x0d\x08\x7a\x60\xc7\x37\xb7\x81\x1d\x7f\xa0\x0d\xec\xf8\xc6\x76\x10\xb7\x39\x77\xdf\x79\x6e\x44\x7c\xeb\x1c\xda\xc6\x64\x58\x2e\xec\x79\x60\xd9\x7e\xae\xdb\x55\x81\x4b\x60\xbc\xfd\x37\x2b\xac\x75\x5b\x95\x11\xad\x18\x10\xed\xe4\x2b\x9b\xc2\xed\xc1\x6d\xda\x0d\xa7\x18\x8f\xea\x2c\xf8\x6d\xe1\x8e\x15\x05\x19\x41\xf7\x5d\x4a\x52\x9a\x27\x37\x5c\xb7\x34\x42\x31\x4d\x2a\x56\x97\xdc\xe6\xc7\x95\x82\x64\x36\x6e\x10\x38\x3a\xc3\xbd\xd9\xee\x92\xf8\x41\x41\x64\xa6\xa9\xcd\xea\x44\x6e\x98\xbe\x63\x4c\x90\x97\x2f\x5f\xbe\x04\xd1\xe6\xe5\x1f\xff\xf8\x47\x02\xb9\xc6\x73\x96\xf1\x72\xfd\x45\x78\xeb\x5f\x5e\xbd\x8a\x19\xf4\xdf\xcf\xde\x7d\x05\x71\x46\x95\x56\xe4\x46\xea\xb9\x1d\xdb\x74\xd1\xe9\x5e\x8d\xc8\xff\xbd\xfe\xfa\xbd\xc3\xd7\x6a\xe5\x57\x90\x7f\xfc\x16\xc5\x8c\x1c\x2a\xa7\x5f\xfe\xe1\xf7\xbf\x8f\xfa\x06\x84\x24\x59\x43\x30\x77\x1b\xb4\x57\xb9\x70\x33\x21\xf5\x7a\xaa\x66\xcb\x3a\x45\x57\x8b\x2b\xf9\x6c\x0e\x07\x61\xee\xbf\x14\xd3\x82\x67\x1a\x89\x04\x26\x7e\x40\x90\xb0\xe5\x42\xa8\xcd\xba\x66\x65\x81\x28\x53\x53\xce\x46\xa4\xe0\xb7\x8c\x4c\xd5\xdf\x6a\xd9\x54\x6d\x6e\x44\x5b\xbd\x22\xa3\xc2\x8c\x8f\xc3\xb5\x70\xa7\x58\x74\x46\xd6\x7d\x78\x8a\x47\xda\x8a\xd2\xaf\x1c\x74\xbc\x22\x68\x8c\xb0\x78\xe3\x2d\x5b\x8e\x11\xba\x2b\xca\x7d\xd8\x1b\xb8\xdc\x22\x37\xd1\xe5\x47\xb2\xa8\x42\xd3\x6d\xb1\x4c\x17\x13\x5d\xd5\xf2\x1f\x08\x34\x5c\xb8\xb4\x63\x56\xa9\xa0\xac\x7c\x66\x73\x61\x8a\xd6\x6e\x1d\x31\x92\xcb\xe9\x6c\x78\x4d\x9b\x4d\xba\x4d\x69\x46\x2e\xa7\x61\xe0\x31\x24\x35\xe6\xca\x4c\x02\x6a\x3e\xdb\xb9\x45\x8c\xb2\x61\xf6\xbe\x5f\xb8\x1b\x0a\x21\xac\x11\x6b\xfd\x63\x38\x79\xd4\x18\x40\x1a\x60\xd2\xd4\xa5\xae\x6b\x47\xc1\x50\x59\x1b\x4d\x6d\xdf\x75\xa7\xe5\xb7\x3b\x3a\xe7\xad\x8d\xb0\x65\xba\xb1\x47\x84\x11\xec\x8d\x28\x98\x52\x36\x42\xbb\xa4\xf5\x2d\xcb\x3d\x7e\x9e\x40\xd8\xb3\x8a\xcc\x20\x46\x5c\xee\x6d\xbe\x40\xd7\x88\x92\x2e\x3b\xd9\x6f\xcc\x34\x8e\x27\x93\x63\x44\x2d\xb2\xc6\x80\x7b\xc4\x02\xe6\xf9\x13\xe5\xc8\xed\xdc\x2d\x28\xf3\x4c\x5d\x9e\x63\x48\x5c\x28\x21\x7d\x5c\x1b\xd1\x4c\xed\x5e\xc6\xe0\xbe\x24\xc9\x24\x5e\xb5\x83\x2d\x26\xbf\xb8\x7b\xb3\x7a\x38\x47\x93\x6b\x69\xc2\x51\x64\xb6\x71\x6c\xf7\xe5\x1c\xb7\x7b\x6c\xef\x5b\x2c\x7b\x9f\xcc\x60\x97\x51\xac\xcd\x86\xa9\x46\x8b\x72\x38\x46\xd7\x08\x16\xc5\xdf\xd8\xd4\x09\xfd\x15\x74\xdb\xf6\x24\x6c\x0d\xb6\xa7\x63\x6e\xb0\x5d\x4e\x57\xb3\x4b\x04\xe8\x2d\x64\x34\x1d\x1d\x8a\xc9\x01\xd5\xb6\x43\x70\x2b\xd8\xf6\xcc\xb3\x60\x4b\xe3\x5c\xb0\xa5\xf0\x2f\xd8\xe2\xdc\x4b\xb0\x6d\x7b\xb9\x9c\x3b\x0a\x6e\x8f\x25\x33\x48\x49\xa6\x7e\xf3\x31\x83\x6b\x15\x20\x96\x84\x3b\x65\xc9\x15\x5e\x2b\x7a\xa3\x64\xd1\x68\x1c\x22\xbd\x93\x90\xe6\xc1\x24\x5d\x4a\xf0\x38\x42\xb7\xda\x5d\x40\x29\x81\x13\x41\xf2\x94\xd2\xd7\xe1\x7c\x8d\x86\x6a\xd5\x43\xb5\xea\x7b\xda\xf3\xaa\x56\xed\x3e\xf3\x31\xcc\x9b\x8b\xff\xcb\x9a\x18\xa4\x0b\xfc\xfd\x73\xaa\x62\x8d\x2d\x53\x3c\x45\x31\xa5\x38\x39\x39\xf7\x19\x4f\x9c\x57\xf3\xa5\xd0\xac\x9e\xd2\x8c\x9d\x86\x0a\x2b\x56\xcd\x59\xc9\x6a\xb3\x41\xf6\x3d\x97\xda\xc3\x26\x74\x23\x37\x4b\x07\x7f\x84\x7d\xd2\xac\x36\x9b\xd9\x9a\x52\x0f\x5f\x6f\x07\xc7\xdd\x95\x4e\x0c\x3a\xdb\x8b\x3a\x0c\x7a\xee\x94\x07\xb5\x78\xad\xdd\x3c\xdc\x6b\xdc\x68\x15\xaa\x06\x63\x6e\xf8\xb9\x14\xc0\x3f\x00\x8a\x59\xca\xa6\x46\xa7\x07\x6f\x4f\xcf\x64\x5d\x1b\x9e\x05\x86\xa6\x8a\xd4\x6c\x66\x84\xd8\x1a\x2b\x25\xc3\x1b\x45\x63\x1e\xec\x34\x3a\x6c\xef\xf6\x63\x6f\x28\x7e\x20\x3e\x2e\xa2\x37\xcb\x61\x56\xb5\x5c\xf0\xdc\x31\x98\x21\x96\xe6\x8a\x54\x54\x05\xf9\x68\xa8\x52\x32\xe3\xa0\xa4\x6c\x4f\x30\x62\x24\x94\xf0\x81\x51\xf5\x59\x56\x3b\xf9\x1b\x42\x23\xb6\x84\x7c\xf9\x11\x9e\x70\x09\x47\x22\x64\xce\xae\x9a\x9b\x82\xab\xf9\xf5\x3e\x0d\x89\x9b\xc6\x41\x07\xf0\x35\xcf\xc0\xfb\x0c\x8a\x51\xe6\x4a\xa1\x38\xf0\x85\x86\xba\x19\x26\x96\x1b\xf1\x4a\xc2\x69\xb9\xfe\xc3\x2b\x26\x81\xc6\x17\xcc\xe6\xea\x3b\xbf\x7e\x38\xbc\x19\xdb\xfb\x76\x2d\x36\x03\x15\x56\x64\xc8\xd9\x37\xa2\xea\x3c\xcf\x68\x71\x7f\x25\xba\xb0\x75\x59\x14\x47\x97\x50\x1c\x70\x79\xab\x10\x00\xb9\x81\x4d\xb7\x47\x3c\x28\xae\x69\xb3\x70\x47\x1b\x75\x57\x36\x58\x91\x52\x62\x02\x1a\x01\x75\xa2\xf1\x25\x28\x4e\xe1\x3e\x08\xb2\xa6\x41\xf2\x5f\xb8\x01\x83\x71\xf6\x9e\x36\x18\x67\x1f\x68\x83\x71\x76\x63\x3b\x88\x73\x4d\x9b\xb9\x97\x06\x49\x56\x3b\xb5\x66\x3d\x9f\x10\xcf\x71\xf4\x44\x45\xec\xd4\xe5\x05\x67\x75\xa6\x75\xcd\x6f\x1a\xbd\xa7\xf2\x77\x2b\x63\x00\x0b\xcc\x94\xa5\x1c\x63\xbb\x89\x59\x80\xb0\xac\x32\xc8\x63\xc6\x80\xde\x44\xb3\x84\x13\xcf\xb9\x01\xd3\x86\x0f\x8f\x15\xc9\x65\xd6\xf8\x82\xc4\x70\x3a\xad\x37\x5b\x6c\xbd\xc2\x24\x3c\x9c\x5e\xce\x2b\x1c\xa4\xf7\x6a\xe5\xf2\x4e\x18\x6c\x77\x76\xd5\x93\x7b\xa2\x9b\x77\xa2\xfd\x2a\x14\x53\xdc\x63\x62\x9e\xd3\x1b\xd9\x68\x9f\xdd\xf7\x7f\x99\x99\x7d\x93\xde\x59\x4b\xd2\x28\xf6\xa0\x19\xbd\xd5\x26\x6f\x39\xc6\x60\xbb\x1f\x6c\xf7\x83\xed\xfe\xbe\xd6\xb9\xc7\x97\x68\x96\x0f\x8b\x3e\x77\xf0\x97\x4b\x95\x1c\xb3\x75\xfb\xb7\x86\xbe\x69\x31\x2e\x8a\x34\xab\x89\x2a\x56\xe4\x2c\xbc\xed\xad\x36\x3e\x70\x07\x75\x28\x19\x58\xe2\xa7\xb7\x9c\xee\xc9\x1e\x0a\xab\x8b\x92\xa1\xb1\x75\x23\x6e\xdb\x20\x69\x2c\xe5\x8e\x6e\x12\x81\x47\x46\x25\xf3\xd7\x58\xd5\x93\x0a\x21\x91\x1d\x50\x23\x5b\xf2\x7c\x64\x43\x5d\x80\x11\xae\x68\x86\x72\x69\xc3\x73\xc0\x04\x6d\xc4\x7a\x7f\xfc\x2d\xb6\xc4\x13\x20\xc9\xa7\x40\xe0\x24\x60\x81\x3d\x25\x84\xc2\x96\x7a\x24\xa6\xd1\x8a\x7f\xcb\x6a\x15\x95\xdf\xb3\x6d\xdd\x64\xd3\xf8\xbd\x3b\x09\x95\xcd\x59\x49\xe1\x9f\x6f\xdd\x02\xcc\xb5\x36\xfc\xae\x66\x98\xd8\x93\xd5\xa5\x11\xbc\x46\x1d\x7f\xf6\xa3\x45\x5c\x5e\x4c\xd7\x92\x85\x15\xe2\xc0\xb0\x3f\x05\xfe\x03\xcb\xbd\xea\x18\xd6\x0c\x08\x02\x7d\x2f\xb0\x50\xe6\x8a\x3b\x0c\x20\x2e\xdc\x9f\x3d\x2f\xed\x31\xd2\x15\xb6\x43\xf8\x01\x6c\x6b\xff\x1f\x79\xfb\x42\x97\xe5\x89\x1e\x78\xb0\xff\x0f\xf6\xff\x6e\x7b\xe6\xf6\xff\x80\xe4\x39\x0c\xba\xc1\xc0\x1f\x5a\x48\x9c\x95\xff\x86\x39\xd9\xc2\xca\x2f\xce\x74\xef\xec\xf6\xb2\xee\x3a\x9e\x1d\x4f\x26\xc7\xe8\x7a\xd6\x0a\x3c\x8d\x9e\x8e\xff\x44\x98\xc8\x64\x6e\xfa\xf9\x08\xfd\xd7\x4a\x03\xbb\xd4\x6a\xfe\xc2\xb9\x94\x6e\xac\xd0\x79\x0d\xfa\x4e\xa3\xab\x09\x68\xcf\x65\x98\x7d\xfb\x18\xe6\x22\x01\x7d\xb5\xcc\x87\xcf\x6d\x6b\xb7\xc2\xd7\x4a\xb0\x5c\x88\xfb\x5d\x91\x82\x97\xdc\xd6\x85\x35\xf7\x9d\x29\x1d\xab\xb8\x24\xe4\x04\x3f\x9e\x64\x55\x33\xb2\x1d\x4d\x4a\x56\xca\x7a\x39\xf2\x9d\x99\x1f\x3b\xbd\xdb\x37\xb0\x6a\x47\xd6\xd4\x35\x13\xba\x58\xc6\x26\xe6\x69\xdb\x81\xb8\x1c\xb7\x53\x7b\x64\x72\xfc\xe1\xc4\xa5\x8f\x6a\x5b\xf7\x46\xb6\xd6\x61\x50\xaf\xfb\xd5\x62\x59\x5e\x0c\x78\x1e\xb5\xb6\x73\xf3\x94\x89\x05\x59\xd0\x5a\xc5\xde\x00\xb2\x2d\x5f\x93\xf3\x05\x57\x7d\x95\x93\x1f\x58\xdc\xb5\xd7\x7d\x42\xc9\xc1\x46\x57\x8d\xb6\xe8\xce\x81\xb8\xab\x34\xe1\x41\x7b\x85\x7d\x7b\xd5\xaf\x02\x6e\x5b\x45\xb5\x66\xb5\x78\x4d\xfe\xf3\xe4\x3f\x7e\xf3\xd3\xf8\xf4\xaf\x27\x27\xdf\xbd\x1c\xff\xeb\xf7\xbf\x39\xf9\x8f\x09\xfc\xe3\xd7\xa7\x7f\x3d\xfd\xc9\xfd\xf1\x9b\xd3\xd3\x93\x93\xef\xbe\x7c\xf7\xb7\x8f\x57\x17\xdf\xf3\xd3\x9f\xbe\x13\x4d\x79\x8b\x7f\xfd\x74\xf2\x1d\xbb\xf8\x3e\xb2\x93\xd3\xd3\xbf\xfe\x2a\x61\x92\x54\x2c\xbf\x8e\xc6\x29\xd8\xc6\x5b\xd1\x95\xee\xb7\x89\x47\xbf\xc2\xfb\x71\xa1\xc7\xb2\x1e\x63\x27\xaf\x21\x0b\x7a\x74\x57\xee\x68\xb7\xbf\x23\x2d\xd5\x6a\xab\x9e\x38\xf6\x78\xcf\x97\xe0\x71\x1c\xf0\xd6\x8e\x5d\x60\x2a\x7a\xc3\x77\x9a\x7d\xc0\xf5\xd9\x0d\x92\xd2\xac\xac\x64\x4d\xeb\x25\xc9\xad\x72\x6b\xf9\xa8\xa4\x6f\x8f\x4c\xac\x0e\x93\xcc\xf9\xc3\x30\xbe\x07\x55\x71\xc9\x72\xde\x94\x7b\x49\xcb\x06\x3d\x87\x9b\x7e\x07\x65\x47\x6c\x51\x13\xe7\xeb\x63\x5f\x73\x25\xb9\x68\x76\x8b\x82\x8a\x3f\x95\x38\xfd\x61\xa7\x16\xc5\xd1\xd1\x4a\x8d\x6f\xd0\x4d\x83\x13\x8c\xcc\xd9\xb1\xf2\xef\xe2\xe0\x89\x4a\x62\x34\x67\x5a\xdf\xc8\x13\xdb\xd5\xa9\x61\x04\xdf\x01\xaf\x70\x80\x34\xfc\x51\xd0\x42\x12\x93\x37\xf1\x7f\xb2\xaf\x0c\x57\xb4\x97\x08\x6f\xd7\xb9\xaf\x08\x2e\x41\x98\xb3\x89\x17\xa7\xa4\x90\x59\xe0\x00\xd6\x61\x06\x00\x1c\x2e\xdc\x25\x8e\xb7\x15\x1a\xa0\x30\xe3\x22\xaf\x07\xca\xd0\x42\xa1\x77\x0b\xcf\xa0\x40\x1b\x88\x86\x70\x66\x09\x90\x60\xba\x2d\xe9\x27\x5e\x36\x25\x69\x94\x99\xad\x14\xdd\x5e\xda\xc9\xde\xb9\x3a\x73\x90\xca\x8e\x0b\xf8\xa8\x23\x1a\xc7\xa8\x28\xe7\x8c\x5c\xfb\xfd\x6b\xd5\x21\x68\x4a\xb7\x92\x9c\x6a\x40\x90\xb0\xf3\xb0\x6c\xb2\x9c\x82\x63\x85\xe7\xd8\x94\x2f\x55\xb6\xc5\xa5\x12\xbc\xe8\xde\x2a\x57\x44\xc8\x6f\x6f\x23\xac\xbf\xe2\x73\xba\x01\xcf\x98\x37\x8a\xe6\x88\xd2\xf9\xa0\x44\xee\xe7\x11\x3c\x8f\xf7\xde\xdc\x29\xc9\xf6\x2e\xa1\x1d\x9a\x1d\xd6\x2f\xea\xba\x87\x52\xe7\x49\xe8\x51\x48\x5c\x9a\x9d\x8f\x5e\xa7\x63\x49\x7d\xb6\xcc\x6c\x0a\x3f\xde\xa9\x03\x87\x83\x22\x7c\x43\x18\xdb\xd8\xfc\xc7\xe9\x7e\x9c\xf9\xf1\x86\x4d\xd1\xbd\x09\xbf\x01\xd9\x5d\xf5\x85\xce\xa1\x46\xab\x60\x1a\x62\xf1\x98\xaf\x0e\x88\x7e\x57\xa5\x5c\x44\x14\x10\xfe\x46\x59\x83\x33\xef\x05\x28\x7a\xda\x89\x93\x57\x28\x62\x0b\xc6\x72\x8c\x05\x2c\xda\xf9\xd7\x8d\xe8\x9d\xfd\xcd\x29\x99\x32\xaa\x9b\x1a\xbd\x7f\x84\x91\x72\x0a\x27\xc0\xa1\xda\xa9\x66\xe6\x50\x20\x05\x62\x2d\x4b\xa2\x04\xad\xd4\x5c\x6a\x50\x9d\xd0\x8a\x66\x5c\x47\x84\x97\xe9\x9a\x66\xb7\x50\x63\xb9\x66\x76\xb6\x7d\x53\xcb\x4e\x6d\x14\x43\x08\x11\xdd\xd8\x47\x3d\xaf\x65\x33\x9b\x43\x28\x1e\xbe\x95\x15\x54\x61\xcc\x65\x9f\x91\x7d\x63\xef\x56\x31\xa0\x48\xbe\x14\xb4\xe4\x99\xaf\x34\x55\xcb\x05\x57\x5c\x5a\x23\x15\x8c\xda\xbf\x68\x4a\xae\x7c\x19\x20\xb4\x8c\x9d\x17\x94\x97\xe4\x44\x31\x46\x2e\xdc\x25\xc1\x5f\xae\x51\x40\x40\x75\x67\x8c\x83\x55\x68\x54\xb3\xa9\x8f\x6d\xe6\x14\xf3\xc4\xa9\x6e\x03\x37\x86\x98\x84\x58\x16\x9e\x37\x4e\xbb\xbf\xc0\xaf\x01\xe3\xcd\x2b\x96\x35\xf8\x0b\xba\x6a\x78\x4c\xe4\xb2\x75\x8f\xe9\xe9\xf5\xec\xea\x52\x85\x6a\x05\xbc\xcb\xb6\xc0\x12\xfc\x60\xd3\x2d\xfb\xbc\xb2\x1e\x13\xf4\xf4\x6c\x08\xac\x80\x42\xcc\x0b\x9e\x37\xb4\x40\xd2\x1a\xb1\xc8\xf3\xeb\x4b\x1c\x98\xcf\xe6\x7a\x7c\xc7\x40\x11\x8c\x3c\x50\x8b\xfb\xdc\x74\xf9\x9a\xd3\x36\x57\x40\x84\x23\x6a\x30\x5b\xc5\x34\x2e\xf9\x8e\x2e\x21\xff\xbc\x75\xfe\xed\x78\xfb\xb8\x9a\x30\x38\xc0\x54\xf6\x51\x99\xd2\xd1\x6f\x0b\x42\xbd\xcb\x3e\x03\x94\x92\x51\x01\xcc\x38\x68\xf4\x0d\x3c\x01\xd6\x58\x5f\x73\xff\xfd\x0b\x0a\x64\xf9\x8f\x90\x21\x51\xd4\xc0\x6a\xaf\xcc\xb6\x07\x69\x6a\xd1\x42\xec\x47\x56\x56\x05\xd5\x7b\x71\xc0\xf9\x7b\x60\x72\x08\xec\xe1\x06\x89\x51\x91\x8f\x69\x61\xae\xca\xd5\xb7\xe7\x36\xe0\x15\x11\x4f\xa2\xa7\xdd\x47\x47\x84\x84\xaf\xa5\x6c\xd8\xf0\x8d\x38\x07\xb2\xa7\xde\xb0\x1c\x28\x88\x9d\x5b\x9c\x93\xb0\xbc\x13\xac\x76\xb0\x77\xf5\xed\xf9\x88\xf0\x09\x9b\xb8\xbf\x7c\x67\x8e\x3c\x6a\x39\xc3\xd0\x19\x17\xa2\x16\x63\x5b\x97\xf9\x04\x97\x13\xea\xf7\xc3\xde\x7f\xf8\xb3\x59\xa8\xf9\xf5\x2f\xe3\x3f\x07\xb5\x0b\xff\xf2\x83\xa1\xc7\x51\xbe\xaa\x3f\xac\x7c\x17\xc6\x5c\x00\xd1\x33\x7f\xfd\x70\x65\xcb\x16\xdb\xa2\xc6\x3f\x44\x3a\x55\x10\xc2\x84\xae\x97\x13\x72\x25\xc1\x0f\x8f\xe7\x78\x65\x61\xfe\x35\xfb\x87\x33\x0b\xc1\x71\x79\x0d\x7a\x46\x35\x13\xc0\x95\x3c\x58\x01\xb8\x6d\x36\x03\x00\x0c\x00\xc8\x89\xc2\x2e\x9d\x80\xea\x15\xd3\xe1\x8c\x88\x96\x98\x9c\xbe\x1f\x97\x9b\x76\x26\x08\xfb\xc4\x15\x64\x3f\xc3\x1d\x87\x63\xa3\x36\x24\xc4\x31\x72\x66\x58\x03\x09\x3e\x67\x5e\x25\x63\x7c\x37\x60\xfd\xbf\x16\x52\xff\xda\x5f\x06\xe7\x51\x0a\x1c\x9b\x24\x74\x21\xb9\xab\xb1\x6d\x10\x8f\x00\x23\x4b\x54\xa2\x09\x7b\x9e\x37\x4b\x52\x72\xa5\xe9\x2d\x9b\x90\x6b\xc3\xce\x85\x4e\x26\x78\xca\x82\x40\x2d\x3c\x96\x93\x46\x68\x5e\x44\x4a\x74\x7e\x2e\xb0\x31\x01\xab\x07\xa9\x25\x9a\xcc\xf0\x24\x55\xcd\xc6\x8e\xb5\xc4\xb7\xa2\xf4\x2e\xb6\xaa\xa7\xdb\x93\x76\x4f\x47\x1e\xf4\xe7\x14\xd5\x22\x55\x0e\x9d\x5b\x4f\xed\xe8\x0b\xbb\x16\x4d\x61\x76\x43\x8a\xac\x65\x1d\xe1\xd8\xd5\x84\xbc\x07\x7e\xb0\x88\x01\x72\x74\x1a\x43\x3d\x90\xb5\xb2\x09\x96\x31\xa5\x68\xbd\x44\x27\x76\xee\xab\x6b\x37\x8a\x4d\x9b\x02\xd8\xe5\x98\x2d\xa1\x02\x2b\x99\xd7\x2c\x93\x42\xe9\xba\xc9\xe0\x1c\x29\xb9\xa9\xe5\x2d\x13\x6d\x18\x52\x14\x62\x0c\x3d\xee\x5b\xd7\x66\xc3\xf6\x08\x49\xb2\x39\x15\x33\xe6\x53\x80\x90\x92\xe6\x00\x45\x5f\x7a\x01\x2b\x66\x2b\xa4\x3f\x29\x3a\x35\x52\x0d\xd7\x70\x64\x37\x86\x23\x73\xf6\xc8\x98\xc9\x7e\xf0\x41\x00\x65\x60\xbc\x14\xbc\xd8\xb1\x23\x6f\x8a\xad\x6a\x0c\xfc\x77\xbf\xe0\x9e\x64\x9b\x2a\x99\xa6\x39\xd5\x74\x9f\x71\x1a\xef\xa8\x2f\xe3\x6e\x7d\xa1\xe0\xd0\x03\x1f\x29\xcb\x66\x39\xa9\x50\x56\x3c\x4c\xec\x72\xf5\xed\x79\xe4\x48\x20\x06\xc2\x39\x43\xde\x48\x6d\xee\x91\x35\xcf\x03\xe4\x61\x68\x8c\x8b\xc5\x30\x93\x70\x63\x22\x39\x60\x39\xc9\x9b\x04\x6d\x7f\x4b\x54\xe2\xec\x99\x89\xd6\x4c\x73\xde\xfb\x3c\x98\x8f\xad\x9b\x50\xd6\x8d\x2c\xd8\x28\x4c\xa0\x05\x9e\x09\xcd\x6b\x16\xa4\xf7\x89\x1c\xcc\x9e\x6a\x23\xf0\xa6\x77\xcf\x17\x01\x60\xc6\xb4\x6a\x5d\x92\x91\xfc\x47\xf7\xaf\x2d\xe3\x88\xb3\x04\x5e\xd6\x9d\xb9\xd5\xdf\x6d\x5c\x54\x64\xef\x08\x37\x4a\x5a\x32\x6f\xd8\x9b\xbd\x1c\xf9\x36\xb6\x65\x9a\x19\x6c\xff\x4e\xe6\x29\xe6\xe8\x6d\xbd\x0f\x3a\xc3\xb5\xe1\x69\x18\x15\xa9\x40\xf9\x8c\x2f\x80\x43\x8c\xea\x24\x37\x42\x1a\x35\xa7\x8b\x84\x54\x2a\x5b\x6b\x3c\x5b\x39\x67\xec\xab\xf0\xc2\xc4\xc6\x30\xb1\xf1\xab\xe8\x29\xa4\x38\xf2\xba\x16\xed\xd0\xdb\x1d\x24\xd1\xea\xfa\xa8\x44\x10\xae\x19\xf4\x7f\x9d\x68\x71\xdd\x1e\x7a\xda\xd1\x2c\x33\x60\x9d\xa8\xbc\x03\x9e\x0d\xf6\x67\xdc\xa0\xed\x94\x1d\xfc\x75\x87\x6d\xb6\x82\x96\xd7\x99\x61\x38\xe5\x89\x53\xa2\x4d\x2c\x98\xb8\x3c\x95\xdd\xd7\x4f\xb7\x1e\x16\x38\xff\xcd\x5a\x9c\x84\x3e\x2f\xad\x3f\xb1\x93\x41\x8d\xac\x57\x83\x0d\xcd\x85\xf1\x9b\x8b\x57\xcb\xa2\x60\x35\x6c\xa0\x55\x9f\xad\x38\x7e\x42\xed\x4b\x34\x80\xc7\xe4\x21\x73\xcd\x29\x68\xbd\x78\x2c\xd8\x9d\xe7\xeb\xa9\xc2\x0c\xf3\xce\xdf\x08\x54\xcc\xce\xeb\x76\xd3\xc8\x29\x57\xfd\xef\x4e\x8d\x7b\x26\x96\xb8\x75\x6f\x02\x70\x41\x75\x29\x99\x99\x49\x19\xd1\x59\xd0\x9b\xc2\xb0\x68\x01\x48\xf9\x19\xad\xf0\x12\x5a\x06\x6f\x7d\x60\xd3\x94\xed\x00\x3d\x73\xf8\x71\xdc\x28\xc8\x8c\x74\x3e\x9c\xb4\xbe\xdf\x56\x7a\x4b\x4a\x32\xee\x9a\x85\x8e\x4e\x67\x5d\x7f\xcb\x95\x71\xc3\xbc\x77\x1b\xe7\x1a\x3f\xfa\x16\xfe\x58\xdb\x78\x64\x41\xf6\x34\xde\xab\xcb\xea\x7e\x10\x29\xaf\x63\xdb\xc6\x85\x0b\x3c\xd5\xc1\x15\x34\xcd\x1f\x67\x7b\x6c\x49\x50\x0d\x0b\x63\x3a\xe5\xc8\x0c\xfe\x70\x9c\x9a\xf7\x70\xb9\x61\x06\xff\xb4\x49\x21\x53\x20\x8a\x20\x54\x85\x23\x6d\x70\xe2\x6d\xaf\xf7\x97\x50\xd4\xd4\x9a\xf6\x5d\x4a\x0a\x43\xa6\xcf\xae\x2e\x71\x7e\xa9\xa3\xbf\x05\xfc\xb6\xb4\xcc\xba\x9e\xf3\x3a\x1f\x57\xb4\xd6\x4b\x54\x76\x8e\x3a\x73\xf3\x51\xf5\x49\x83\x6c\xe9\xd7\x14\x57\x06\x39\x6c\x9d\xe3\x86\xad\x72\xc6\x7b\xeb\xc3\x71\xef\x99\x1d\x62\x3d\xf1\x51\xf9\x1b\xd7\x13\x16\xb1\x74\x8a\xc1\x27\x5c\xcf\xe3\x23\x0e\x48\x17\x57\x1e\x96\x07\x32\xc8\x59\x75\xbd\x1e\x91\x51\x01\xe9\xc7\x2a\x90\x65\x18\x1c\xeb\xb9\x69\xd0\x3d\x99\x9e\x46\x84\x4f\x0d\x91\x96\x62\x0c\xd6\xfd\x84\x89\xb4\xc6\x4c\xcb\xbb\x4f\xac\x83\x3d\x6a\x8b\xe0\x42\x06\xf3\x09\x06\x69\x6f\x3a\x39\x11\x32\x46\x99\xe4\x1a\xe0\x09\xec\xf5\x14\x63\x1f\xee\xb1\x5c\xdd\xa4\x24\x9c\x24\x2d\xf7\x10\xaa\x99\x02\x0c\xe6\x18\x18\x2e\x72\x03\xa4\x40\x12\x41\x01\xa5\x9a\x2c\x63\xcc\xab\x80\xed\x25\x4d\x61\xdd\x3b\xb8\xd1\x6e\x58\x49\x75\x36\x67\x8a\x28\x09\x59\xd5\x95\xa6\x45\xc1\x72\x6f\xd6\xc4\x03\x95\xc0\xd7\x59\x93\x67\xc2\x88\x01\x63\x98\xb2\x41\x81\x0a\xce\xea\xc0\xab\x82\x5a\xe5\xe3\xb4\x11\x19\xfa\x0c\x73\xbd\xf4\x56\xad\x55\x66\x1d\xf4\x36\x0a\xf4\xac\x29\x0c\xe5\x14\xed\x56\x81\x0e\xc6\x03\x12\x90\x96\x25\x12\x13\x23\x19\xb6\x96\x28\x9b\x31\xd8\x50\x06\x9f\x7e\x23\x09\xce\x82\x44\x1d\x23\xe4\xc6\x42\x96\x49\x1c\x87\x4e\x41\x5c\x6c\xcf\x20\x86\x6b\x3b\x09\xb6\x6c\x8d\x71\x3c\xf5\x0c\xa3\x62\xbe\x1c\xb8\x4a\xe1\x5a\x88\xf5\x82\xa2\x8d\x96\x25\xd5\x3c\x03\xf5\x2c\x9f\x06\x46\xde\xd2\x17\xe5\xf3\x4e\x4e\x48\x54\x81\xa8\xdb\x5d\x4f\xbe\x56\x9b\x99\xcd\x47\x6d\x5b\xb0\x53\xf6\x34\xba\x9b\xe2\x96\x1a\xb0\x1a\xc9\x73\xff\xe8\xf2\xa6\x10\x3d\xaf\x19\x23\xbc\x34\x62\x12\x15\x9a\xe4\x7c\xea\xf3\xe5\x38\x9b\xfd\x43\x67\x97\x26\x89\xfe\x1d\xfc\x41\x82\xfe\x50\xd5\x5d\x14\xf2\x4e\x11\x7d\x27\xbd\xda\xad\xb5\xe5\xda\x7c\x29\xa3\xee\xb0\x49\x14\xd4\xf6\x6f\xd0\xb6\x39\xe9\x00\xd3\x8e\xcc\xad\xbd\x63\x45\x61\xfe\xff\x10\xbe\x4d\x88\xf4\xda\xb8\x4e\x3e\x13\x98\x88\x83\x2b\xa7\x66\xb5\xf1\x64\x27\x79\x2d\xab\xca\x9a\x81\xca\xd3\xc7\xac\x13\x5c\x9b\xea\x05\x53\xe0\xa6\xe7\xa2\xd9\xcc\x91\xcd\x98\x60\x35\xd5\x60\x08\xb7\x19\xb4\x81\x38\xae\x4e\x27\x5e\x6d\x89\x6d\x2b\x39\xad\x07\x0c\xd0\x6d\x61\xf3\xb1\xbb\x77\xec\xaf\x49\x73\xe5\x02\x21\xc0\xdd\xd8\xa4\x23\x3d\xf9\x82\x69\x7a\x4a\xbe\x51\x78\x50\x9e\x5e\xf8\x28\xc1\x28\xe9\xdc\x66\x39\x42\x01\x3d\x69\xf8\xb3\xa2\x9a\x07\xe3\x87\x52\xae\x0f\xb5\xee\xee\x54\x67\x66\xe7\xb5\x54\xea\xbd\xfb\x64\x2f\x93\x1c\x24\xe0\x41\x02\x1e\x24\xe0\x87\xdb\x20\x01\x1f\x7a\x3d\x80\xef\x0e\x79\x27\xdf\x87\x0c\x61\x17\x51\xef\x6c\x3f\x08\x79\x2f\xb5\x75\x77\x01\xfe\x9d\xde\xab\xf4\xa4\x80\xd3\xef\xe8\x72\x22\x98\xb6\x79\xe8\x9c\x6e\xff\x83\x1b\xfd\x6f\xb5\xe1\xfc\xac\x80\x16\xdc\x22\x77\x81\x5d\x12\xc1\x60\x14\x2d\x91\x14\xb7\xde\x37\xf0\xfc\x58\x59\x8f\x0e\xf3\x3b\x04\xdb\x93\x4e\x49\x96\x09\xb9\xb6\xde\x82\x2b\x83\xaf\xa7\x0a\xcb\x99\xa6\x3c\x2e\x0f\x65\xd8\x1c\xa5\xfc\x78\x0f\x8d\x3e\x00\x25\x24\xdb\x81\xac\x0f\xdd\x3c\x84\xaa\xa5\x0d\x81\x0e\x3c\xe2\xc3\xa8\x92\xf6\x85\xc7\x5b\x2a\x2f\xa7\xe4\x03\xcb\xe4\x82\xd5\xb8\xdf\x17\x9f\x2a\x2a\x8c\x98\xfe\x96\xf2\xc2\xec\xb6\xdb\xf5\xd6\x7a\x01\x45\x90\xbb\x6e\x09\x81\x11\xcc\x5f\x23\x7b\xb4\x06\x72\x52\x98\x41\x9f\xf3\xce\xf4\x6c\xfd\x74\xab\x9a\x2d\xb8\x6c\x94\x8b\xa7\x69\x34\xd2\x31\xa5\xad\x6c\x3a\xe7\xb3\xb9\x7b\xd9\xf9\x99\x83\x07\x50\x9d\xfb\xab\x92\x30\x07\xa5\xa9\x6e\x54\x37\x51\x4e\x06\xee\x04\x4f\x62\x03\xf6\xe7\xbd\x5f\x86\x6f\x3b\xe6\x0a\xe3\x8f\x0e\x89\xc6\xbf\xc2\x88\x27\xec\xe4\xc6\xde\x02\x17\xa6\xd5\x86\x99\x65\xb2\xac\x1a\xcd\x82\xdb\x62\xa1\x35\x15\x6d\x25\x1e\x64\x27\xef\xe5\x8b\x92\x0a\x3a\x63\x63\x3f\x89\x71\x1b\xa1\xf5\x62\x0b\xac\x95\x78\xa4\xe4\x11\x89\x17\xc3\xf6\x8c\x23\xab\x56\x16\x9b\x1e\x79\x4e\x1e\x19\x7d\x4e\x1e\x13\x81\x4e\x76\x19\x85\x4e\x7c\x2a\x8b\x43\x5e\xc7\x0f\x76\xcc\xd5\x0b\x69\x89\xd5\x43\x17\x72\x3b\x91\xc0\x12\x2d\x3b\x2a\x57\x44\x96\x5c\x6b\xe6\x1c\x99\xfd\x05\x1b\x11\xae\x3b\x99\x16\x2c\xe2\x00\xa5\x39\x7a\x23\xb3\x4f\xbe\xac\x76\xcb\x98\x25\x4e\x06\x84\x9f\x3b\xae\x90\xf1\x12\x84\x97\x15\x16\x66\x01\x04\x30\xb6\x71\x92\x4e\x35\xec\xe7\x9d\x81\x2f\x21\x61\x9f\x40\x91\x8f\x53\x1b\x30\xd3\x80\x99\x56\xda\xcf\x01\x33\x61\x16\x8b\x94\x24\x2b\x1d\x8c\xe4\x3e\xb7\x39\x2e\xe9\x0d\x2b\xc8\x8f\x0d\xab\x97\xc4\xb0\xad\x6d\xa4\x17\x54\x03\x57\x3c\xc7\x98\x26\x67\x35\xdb\xb3\x96\x6c\x3b\xa6\x09\x2c\x6d\x17\x9f\x0c\x77\x0f\x39\xdb\x1e\x81\xaf\x57\xbb\xea\x66\x02\xc5\xdd\xf2\x3b\x18\xf2\xe4\xe8\x74\x1a\x3e\x01\xb6\xfb\xec\xfd\x9b\xed\x04\xaa\x34\x67\x43\xb2\x8d\xc3\xe1\xda\xe2\x93\x89\x15\x21\x67\x0f\xec\x09\xee\x9d\xff\x05\xa8\x84\x77\x17\xf5\x3a\x7b\x72\xcb\x96\x23\xeb\x0e\x4e\xcc\xe9\x53\xf7\x72\xf2\x64\x30\x2e\xa4\xad\x5a\x68\x3a\x8d\xcd\xbe\xdd\x6d\x5b\x23\xe1\xed\x14\xbd\xd8\xe2\xcb\x45\x76\xbf\x72\x9b\x96\x8a\xeb\xb7\xa6\x12\x49\x65\x25\xc3\x76\x5f\x89\x49\x84\x21\xa8\x07\xe7\x72\x23\x78\xb0\x81\xac\x13\x80\x90\x52\x0f\x91\x6c\xaf\x50\xc3\xe6\x36\xf6\xd1\x4b\xdd\xe2\x62\x85\xe3\x77\x63\xf9\x6f\xd9\xf2\x58\xd9\xa4\x77\x52\xa8\x39\xaf\xb0\x04\xaa\x62\x80\xa3\xb6\x03\x78\x6c\xdf\x82\x6b\xbb\x1b\x16\x31\xd8\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x40\x68\x12\x5c\xab\x37\x92\xa9\xf7\x52\xc3\x93\x83\x9f\x0b\x2e\xf1\xa9\x4e\xc5\x5a\x33\x39\x58\x18\x01\x4d\x63\x56\x1e\x88\xd3\xb7\xbb\xef\x3c\x34\xfd\x09\x72\x45\x2e\x05\x91\xb5\xdd\xca\xad\x06\xd6\xae\x88\xb2\xb2\xc3\x3a\xeb\x43\x6b\xd4\xdf\x34\xae\x3d\x35\x59\x77\x0e\x6d\xc7\x53\xb0\xc3\x83\x2e\x12\x7f\x01\xed\x2a\x78\x97\xb8\x90\x1a\x2c\xdb\x4b\x35\x9b\x25\xb9\xba\xb4\xad\x64\xf5\x0c\xb2\x3c\x66\x09\x05\x1f\x83\xc9\x6f\x49\x58\xb1\x6d\x45\x5e\xc3\x81\xb7\x04\xf6\x1d\xf9\xf8\xef\xb8\x2b\xe0\x93\xbe\x82\x50\xae\x43\x4a\xc7\xc1\xb0\xc8\x5d\x94\xb4\x32\xb7\xef\xbf\x0d\x13\x01\x80\xf9\x3f\x50\x33\x5d\x4d\xc8\x19\x51\x5c\xcc\x0a\xd6\xf9\xcd\xaa\xf9\x83\x6e\x92\x27\x00\xd6\x37\x43\xe3\x17\xb4\x60\x18\x2f\x4a\x85\xaf\x1e\x2a\xa7\x6b\x2c\xe4\xc8\x16\x51\x37\xe4\xcd\xbb\xa5\x1d\xdd\xb2\xe5\xd1\x28\x51\x91\x4a\x42\x9a\x60\x3a\xb9\x14\x47\x6d\x4a\xda\xce\xbd\xf4\x7c\x16\xf8\x1b\x1c\xc1\x6f\x47\xbb\xe6\x51\x9f\x48\x48\x7d\x32\x37\x51\xab\x54\x3e\x2f\x28\x1a\x56\x0e\x61\xbe\x58\x1d\x73\x53\x51\xc2\xeb\xe0\x9d\xd6\xa4\x65\xa3\x97\x9f\x50\xd3\x0e\x19\x61\x92\xc3\xac\x92\x0e\x76\xb5\x0c\xd0\x41\xcf\xe6\xde\xc1\x83\x60\x6b\x9f\x53\xdc\x9c\xc5\xb7\x9b\x3e\x08\x62\xcd\xb9\x4a\x3f\xae\xcb\xe9\xaa\x8f\x42\x90\xee\x24\x8c\xe2\x91\xb5\x8d\x5a\x5f\xf3\x21\x86\x0a\x89\x6d\x25\xa5\xd8\xda\xa9\x6d\x6b\xdd\x1f\x6a\xa6\x2a\x89\xfe\xb5\x1b\x17\x6b\x59\x84\x39\x55\xe0\x93\x35\xb5\xe6\xd6\xaa\xa9\x2b\xa9\x6c\x79\xbb\x55\x90\x4f\x8c\x5c\xb2\xe1\x64\x2e\xc8\x14\xc3\xc0\xfd\x4d\x30\xf7\xc7\xe7\xa5\x3e\x5b\xc9\x49\x28\x6b\x48\xd6\x66\x1d\xc4\x44\xce\x33\x2b\x4f\x52\x4d\x44\x5f\xc2\x98\xb0\x6d\x3e\x68\xe7\xfb\x89\x22\x8d\x4f\x92\x85\x47\xee\x58\x37\x9c\x25\x13\x1a\xac\x82\x82\x5c\x8a\x29\xa3\x8a\xdf\x14\xcc\xba\xb3\x29\x4d\x75\xd2\x9e\x04\x4e\x5c\x76\x6f\x8c\x30\x01\x94\x8b\x6b\xb5\x6a\x0e\x3c\xe1\x22\x2b\x1a\x38\x41\xc1\x8b\x53\x50\x04\x51\x91\xb1\x02\x29\xa7\xcc\x7d\xac\xf0\x16\x11\x4b\x81\x39\x73\xca\xea\xda\x96\xc3\x5b\x6e\xbe\x49\x24\x97\x0c\x9d\x70\x20\xb8\x6e\x84\x0b\xd9\xec\xbb\x68\xb7\x36\x05\xb1\xe2\x0e\x50\x72\xc5\x10\x5e\x71\x5f\xb1\xda\xea\xb4\x08\x2a\xf2\xd8\x55\x5b\x8f\xb7\xeb\xc0\x9a\x39\xc2\xc4\x15\x36\xeb\x44\x98\x90\x3b\x61\x22\x36\xe1\xc3\xfe\x31\x34\x6e\xf2\xb8\xbd\xe9\x63\x40\xd0\x2c\x41\x41\xbd\x35\x86\x8e\xab\xa8\xe5\xda\x63\x51\x32\x94\x17\x70\x29\xe7\x3a\xc9\x53\xdb\x78\x87\x47\xd3\xc9\x6f\xe1\xba\xc8\x29\x79\xdb\xd6\x80\xe5\x0a\x0c\x16\xdc\x25\xa4\x33\xc0\x8b\xf7\x09\x0d\xe7\x78\xb9\x0d\xbe\x4e\x55\xa4\x6e\xb1\xe7\x8f\x20\x83\x6d\x07\x8e\xdf\x70\x51\x13\x6b\x09\x4c\x56\xef\x23\xb8\xea\x7b\xdf\xd1\xc4\x5d\x8d\x5c\xeb\xb4\x27\x29\x42\x67\x2d\xd3\xac\xab\x3f\x79\xcb\x6f\x6a\x46\xce\xe7\x54\x08\x56\x04\xf9\xa1\xad\x11\x8b\x6a\x4d\xb3\x39\x62\x26\x4a\xcc\xbd\x2a\x98\x3e\x56\x64\x2e\x95\x26\x25\xcd\xe6\x5c\xf8\xe4\xa1\xc2\x67\x23\x6f\xb3\xb9\x1c\x3c\x75\xd6\xde\xab\x36\x5b\x08\x08\x4b\x1d\x77\x8a\x39\x47\xf4\xe4\x93\x00\xaf\xf5\xd2\xd6\x49\xb4\xf7\x10\xf6\x19\xa5\x1c\xc0\xca\xf0\x6e\xcc\x18\xf7\x97\x94\x26\x97\xa5\x37\x4c\x72\x11\x10\x1e\x66\x3f\x20\x7c\x4a\x1a\x91\xe0\xe2\x9d\x70\x27\x8b\x26\xa2\xa6\x51\x37\x7b\x79\xd1\x08\xb3\xe9\x6d\x95\x9a\xb7\xe7\x44\xd3\x7a\xc6\xb4\xe9\x8d\x88\xa6\xbc\x61\x75\x7f\x1a\xf3\xfd\x15\x56\x3b\x48\x1d\xd4\xce\x0e\xf4\x94\x2f\x25\x1f\xdc\x57\x10\xee\x01\xdc\xc0\x54\xc6\xd1\x61\xf4\xd1\x73\xc5\x57\xb1\xf4\x9e\xc1\xd5\xdf\x5a\x52\xd2\x88\x18\xea\x9c\x52\x1f\x15\xcf\xf2\xef\x7f\x7f\x9f\x5a\x9c\xee\xb8\xfd\xf2\x3e\x00\xb9\x93\x75\x91\xdf\xf1\xdc\xba\x63\x92\x13\xf3\xf2\x69\x2c\xb0\xec\xb8\x56\xdd\xf6\xa9\x74\x53\x75\x53\x77\x77\x3c\xdf\x4b\x9d\x59\xe8\xb8\xbb\xd3\x4e\x74\x32\x3b\x4d\x60\xab\x79\xce\x84\x36\xa8\xa3\x56\xe4\x04\xbe\x88\xc9\xf5\x70\xc1\x31\x23\x1f\x8c\x00\xd5\x70\xca\x1b\x2e\xda\xa4\x92\xed\x59\x1b\x72\x63\x6e\xbe\xd3\xb6\x2a\xa6\x31\xaf\x17\x44\xf4\x4b\x3d\x27\x8a\x97\x4d\xa1\xa9\x60\xb2\x51\xf1\x25\xe8\x3f\xcb\xe3\x9e\x16\xec\x13\xde\xcd\x5d\x26\x4e\x6e\x7b\xed\x72\x0b\x10\x4f\xd4\x66\xa3\x5d\x65\x17\x7a\x7a\x6d\xc3\x34\xf3\x17\x9e\xb1\xf0\x59\xf5\xd8\x27\x96\xd9\x7c\x1a\x55\xd1\xcc\x78\xaf\x44\xf5\xc6\xcc\xcc\xc8\xa4\xf9\x6b\xf2\xb6\x9d\x30\x44\xef\xba\x5f\xb0\x44\x31\xd8\xed\xed\x40\xe4\xfc\xfa\xf2\x8d\x4d\x7f\x2a\x94\x66\x74\x57\x3c\x4a\xac\xa9\x73\x6c\xd5\x11\x3b\x62\x78\xb0\xb3\xc4\xcb\xde\xe6\x7f\x5d\xd5\x9e\xd9\x5f\x6c\xad\x03\x9f\x37\x3f\x36\xe1\x67\x02\xd0\x0f\x9c\x1a\xb6\x07\x38\xb5\x30\x75\x7e\x30\x81\x9c\x55\x4c\xe4\x50\x8c\x2f\x80\x7b\xdc\xa5\x9d\x1e\x91\x2d\x1c\x97\x4a\x97\x5d\xbd\xb9\x0e\x51\x0e\xf4\x2e\x73\x59\xe4\x8a\xb0\x4f\xba\xa6\x06\xcd\x97\x06\xa1\xfb\x6f\xa6\x84\x8a\x65\x44\xd5\xcf\xe7\x54\x20\x9c\x3c\x09\x17\x98\xff\x9c\xb8\x40\xc5\xb2\x9a\xe9\xa8\xc0\xe2\x2d\xca\x86\xb8\xce\xbb\x1b\xd8\x79\xbc\x26\xca\xe3\xaf\x2e\x3c\xa6\xad\x0d\x1c\x35\x9e\x50\x1c\x8a\xf0\xad\x54\x1c\xae\xa8\x52\x5e\x3a\x06\x22\x67\xaf\xad\xea\x64\x9a\x88\x18\x02\x35\xb5\x7c\x4a\x84\x5c\x99\x69\x18\x08\xe4\xf5\xa8\x9d\x57\x22\xba\xf7\x16\xb3\x12\x0b\x11\x50\x01\x21\xf5\xd8\xcd\x08\xe2\x8c\xf1\xdf\x68\x34\x33\xeb\x0a\xe4\x7e\x58\x59\xcc\x3e\xd9\xb5\xef\xf6\xb2\xa7\xb9\xf2\xc4\x47\xbf\x6d\xa7\x87\x7b\x1f\x10\x57\x17\x50\x15\xab\x02\xea\xe6\x88\x65\x50\xb9\x93\x2f\x18\x64\xa0\x75\x09\x59\x0d\xe3\x9b\x37\x18\xb4\xe4\xd2\x42\x74\x93\x3d\xc4\x07\x77\x07\x21\x37\xad\x17\xc3\xa5\x50\x9a\x42\x5e\x00\x58\x85\xa1\xaa\x86\x00\xda\x5c\xbf\x16\x10\x51\x5b\xee\xb2\x0b\x44\x0f\x57\x1a\xa2\x99\xb1\xda\xc0\x5a\xb1\x24\x77\xb5\x8c\x77\xaa\x4c\xd4\xfb\xca\x05\xab\x17\x9c\xdd\xbd\xb0\xd1\x70\x63\xb3\x80\xb1\x0d\x28\x7f\x01\xe2\xe1\x8b\x5f\xc2\xff\xa2\xc6\x4f\xd6\x43\x5a\x6c\xfd\x9a\x1c\xf5\x97\xe4\xdb\xd6\x3c\x3b\x85\x04\xd2\x3b\xad\x7a\x66\xbb\x5c\x51\x1a\xda\x87\x56\x0c\x88\x51\x12\x5a\xfc\x16\xb0\x2e\xe6\x42\xb8\x8e\x6c\xfa\x3e\xa2\xcc\x19\xb5\x61\x92\x8d\x10\x11\x5e\xb6\x5d\x39\x00\x3b\xec\x08\x01\xde\x29\x80\x8b\xb1\xae\x19\xf3\x8b\xd2\x96\x4d\x14\xd2\x95\x6e\x88\x2c\xc8\xb9\x07\xc5\x65\x4e\x35\x55\x4c\xc7\xa9\xa9\xd3\x51\x51\xd0\xbd\x59\x71\x88\x95\xec\x4f\x60\x69\x64\x90\xcf\xc6\x65\x41\x26\xe3\xbf\x58\xe1\x40\x74\xde\x34\x62\x81\xdd\xe9\x18\x2c\x3f\x77\xe5\xab\x9c\x0f\x35\x8e\xd2\x1e\xd0\x2e\x79\x56\x3b\xc7\x6f\xbe\xb9\x7c\x93\x2a\x14\xb5\x5f\x3a\xd9\x01\xfe\xdd\xdd\x26\x0b\xc8\x50\xa7\x8a\xff\xd8\x84\xea\x0e\xa8\xe3\xe1\x41\xd0\xbe\xbf\xab\xb5\xcd\x32\xd6\x1a\x17\xde\x70\x75\xbb\xcb\x5b\xbe\xd6\x79\xf7\xbe\xff\xed\xfc\x82\xd8\xa7\x0f\xd9\x07\x7a\x06\xd9\xb5\xf5\xa0\x7b\xf3\xff\x76\x7e\xb1\xb2\x84\x15\x45\xc0\x59\x51\x38\xf9\xcc\x08\x1a\x2e\x5d\x82\xc5\x09\xc9\x1b\x04\xb8\xc3\xf0\x3e\x35\xc3\x1a\x83\xc1\xcc\xf3\x49\xa6\xb8\x4f\xa9\x3a\xbb\x65\x13\x2e\x03\x47\x84\x3d\xd7\x80\x9c\x65\xac\x75\x3f\xc9\xb9\xba\x3d\xb4\x7e\xa3\xca\xdf\xf7\x25\xde\x78\x5e\x06\x9d\x55\xe1\xde\x95\x07\x0a\xea\x84\x2d\x65\x43\xee\x6c\x45\x84\x68\xf5\xc1\x47\x5e\xbd\x26\x17\x42\x35\x35\x6b\x7d\xb9\x57\x07\x33\xfc\xfa\x0e\x95\x09\x50\x60\x43\xbd\x3e\x98\xf1\xe7\xc0\xe0\x4a\xd2\xa8\x41\x45\x6b\x0d\x92\xff\x3e\x00\xc8\x77\xee\xc8\x45\xf0\x40\xec\x06\x82\x2e\xa7\x2e\x02\x71\x64\x73\x8a\xfb\x42\x8a\xae\x9b\xd6\x63\x04\x68\x75\x1a\x94\xbc\xf5\xe5\xac\xc8\x8b\x9c\x2d\x5e\xa8\x9c\xbe\x1a\xc1\x54\x5d\xcc\x7d\x77\x5d\x54\x91\xa3\x57\x47\x31\x63\x5c\xf3\x92\x17\xb4\x2e\x30\xa3\x9d\x4f\xf4\xe7\x7b\x32\xf8\xd7\x0d\x09\xee\x9b\x2f\x8f\xc8\x89\xac\x61\xec\x8c\x0a\x52\x30\x97\xfd\xce\xe2\x8a\x25\x8a\x1a\xa7\xcf\x18\x24\xf7\x61\x5d\x44\x64\xba\x17\xf0\xcd\x1d\x37\x68\x39\x99\x4e\x61\xa3\x37\x2d\xb1\xe7\xc2\x50\xd7\x09\xf9\xc6\x52\x67\xcb\xf1\x20\x6c\xe4\x40\x6a\xf1\x8d\xe7\x7b\x32\xcf\x47\x85\xb7\xa2\x8c\xdb\x91\xaa\x8d\xac\xdb\x84\x9f\xf1\x69\xf4\xab\x04\x67\x5c\x7f\x60\x95\xdc\x29\x8f\x8b\x5d\xae\x18\xb4\xb8\x36\x0f\xa4\xe2\x50\xb9\x9b\x6a\x42\x11\x47\x65\x4d\x41\x8d\xd4\x8b\x06\xab\x24\x46\xd4\x8e\xb3\xc2\x7e\x7e\x0c\x6b\xa8\x05\x91\xe4\x56\x91\xe2\x67\x32\xb2\x58\xbd\x57\x63\xea\xab\x03\x43\xe1\x10\xf0\x8d\xe4\xfa\xdc\x77\x8b\x01\x86\x85\x14\x36\x04\xd0\xf4\x6d\x6d\x60\x33\xae\x6d\x5a\x74\x1c\xca\xfc\xec\x7a\xeb\x19\xb4\x2d\x52\x02\x55\xcd\xfd\x2a\x0e\x6e\x43\x6b\x0f\x6d\x57\xf2\xb7\x2b\x14\xbe\x17\xe9\xdb\xd7\x86\x77\x89\xbf\xd0\x3f\xa1\x7d\x1e\x4b\xba\xdf\xb9\xfa\x4b\xae\x82\x10\xfa\xc0\xd6\x1a\xe1\xe8\x78\x32\x39\x9e\x00\xdb\x70\x3c\x39\x76\xac\x65\xe1\x9d\xa1\x2d\x15\x6e\x87\x4d\x2b\xb3\xd7\xbd\x2d\x13\x42\xbe\x76\xf9\x09\x20\xe9\xf2\x8a\xe7\xb5\x77\xaa\x6e\x6b\x47\x63\xba\xba\xee\x9d\x8b\xd2\x14\x83\x0e\xbb\xb9\x09\x27\x6e\x5d\xb5\x67\x7c\x61\xf3\xb1\xee\xd4\xf4\xd5\x4e\x30\x11\x1e\xc2\x95\x59\x25\xc2\x87\xaf\x76\x3b\x33\x44\x22\xc9\xf3\xb2\xb8\xc7\xce\x2a\x93\x65\x89\xe5\xc0\xe6\x5e\x16\x6e\xf3\xf9\xc5\x22\xbe\x78\xf5\x05\x96\x46\x9b\xf6\xdc\xc3\x44\x94\xee\x3a\x5d\x51\x57\xf8\xc7\x36\x3f\x88\x68\x85\x2a\x40\x8b\x6a\x4e\x6b\xa6\xb0\x84\xb9\x2d\xd8\xdc\x5f\xe7\x73\x05\xcb\xfb\x31\x1e\x56\x35\xb6\x53\xdc\xbf\xb2\x31\x1e\x7b\x32\x91\x57\x92\xf7\x27\xcf\x1a\x93\x8a\xea\x87\x53\x5b\xc7\x63\x58\x3f\x68\x22\xe4\xfa\xef\x1c\xe8\xba\x07\x41\xf5\x47\x9b\x35\x2e\x38\x16\x2d\x2b\x59\xc8\x59\xb4\xf7\x4f\xa4\x38\xa9\xe7\xfb\x91\x24\xf5\xdc\xad\xae\x5d\x82\x97\x99\x74\x54\x84\xe7\x06\x66\xce\xd6\xdb\x54\x2e\xf5\x9f\x65\xdc\x5e\x78\xa8\x7c\xf1\xe1\xe2\xec\xcd\xbb\x8b\x49\x99\xff\x12\xe3\x40\xc6\x74\x1c\x53\x35\xf3\x73\xe0\xaa\xd7\x36\x12\xf5\x1c\x80\x13\x5c\xb1\xca\xb6\xee\x62\xc5\xea\x92\x63\x8c\xe2\x21\xd9\xed\x3d\x9f\x50\x3f\xa7\x6d\xb0\xe2\x55\x2f\x58\xa7\x1d\x8d\xeb\xb3\x8b\x96\xab\x9a\x8d\x7d\x61\xa8\x29\x2f\x20\x08\xab\xa5\xe8\x01\x96\xee\xe9\xde\x69\x8e\x9d\x12\x1a\xfb\x28\x96\xab\x1a\xe4\x96\x3b\xf5\x3a\x7b\x4c\x88\xdd\x5f\x48\xd4\x57\x81\xb5\x9a\x3a\x3a\xc3\xc2\x4e\xb5\xcd\x47\x5b\xd5\x7c\xc1\x0b\x36\x83\x92\xd8\x5c\xcc\x54\x9b\x5b\xd0\x1a\x51\x7b\x06\x80\x38\x38\xd6\xd2\x25\x6f\x26\x7b\x07\x26\x51\x9f\x2e\x09\x81\xfa\xfd\xd7\x1f\xa1\x58\x3d\xd8\x5f\xf7\xac\x3e\x36\xd3\xe9\xc5\xfa\xfb\xd0\x1a\xef\x8e\xd2\xec\x15\x4d\x3b\x73\xd0\x26\xc0\x8d\x54\xe9\xa1\x4e\x0d\x51\x3e\x25\x6a\x59\x16\x5c\xdc\x8e\x7c\xa1\xb1\xa9\xb4\x29\x56\x19\x31\x3f\x38\x70\xae\x19\x2d\x1e\x43\x0c\x76\x0e\x04\x24\x8d\x10\xe8\x3d\xe9\xf1\x81\xb1\x32\x77\xf5\xdf\x1c\xda\x41\xdd\x49\x22\x16\x8f\xb0\xcb\x3f\xbb\x6d\xe5\x25\x9d\xed\xd4\xf1\x17\x3a\xec\xa0\x6d\x41\xbe\x3e\xbf\xf4\xf5\x02\x43\xc5\x05\xbe\x2b\x6b\x42\x6b\xcd\xa7\x34\xd3\xa7\xa4\x6a\xa0\xaa\x0b\xd4\xa8\xb0\x64\xd6\xde\x8e\x7b\xbc\x02\x7a\xa6\xf3\xb1\x15\x23\xc1\x45\x4b\xc9\x62\x61\xfa\xd7\x50\x1c\x1a\xe4\xde\xa6\xb2\x4e\x05\x10\xb2\xea\xaa\xcc\x5f\x35\x45\x71\x25\x0b\x9e\x2d\x7d\x81\x03\x54\xbf\xe4\x06\x15\xf5\xe2\xa2\xb3\xe2\x8e\x2e\xd5\xeb\x70\xe6\x84\xc2\x33\x42\xb5\x66\x65\x85\x20\x63\x96\xbb\x9a\xe8\xb8\xd5\xc0\x60\xe1\x5d\x57\x60\x7d\x4a\x79\xe1\xef\x7e\x63\x1f\xf4\xe2\xf2\x31\x79\xcf\x16\xac\xee\xce\x44\x98\x47\xd0\x89\xea\x8e\x0e\x1b\x0f\xdc\x4c\xa3\x40\xbe\xc1\x9a\x0a\x6b\x07\xd5\x33\x4b\x3e\x5d\xe9\x16\xeb\x91\x58\x98\xe8\x9f\xf2\xe5\xf4\xbd\xd4\x57\xf8\x76\x77\xe6\x38\xe7\x7b\xfa\xa7\x85\xe1\xc6\x96\x6e\x1c\x73\x98\x39\x57\xb7\x8f\x9a\xac\x97\xc7\xc2\x2d\x8f\x07\x3a\xa8\xc0\x5b\x63\x22\x43\x80\x3c\x3b\x9a\x81\x3e\xf8\x2d\x37\xcb\xb2\x10\x5f\x33\x1b\x4a\x3d\xb2\x40\x58\x32\xea\x6a\x39\x0b\x76\x07\x95\xd9\x75\x5b\x29\xd8\xaa\x5e\x32\x59\x32\x42\x17\x94\x17\xf4\xa6\x00\x4f\x0b\xd3\xb9\xed\x2b\x42\x02\x3f\x83\x55\x81\x85\x51\xba\x1b\x62\xce\xda\xc3\x26\x9e\xbe\x4d\x3a\x13\x5e\x1b\x9c\x40\x21\xb3\xdb\x90\xdf\x80\xca\x56\xca\x95\xa8\x87\x9b\x4c\x97\x84\xe6\x39\x51\x7c\x26\x20\xdc\x59\x68\x52\x50\xcd\x44\xb6\x9c\x10\x9b\xca\x59\x05\x95\xa3\x75\xcd\xbd\x5f\xbf\x80\xba\xed\x6d\xb5\xcc\xec\x56\x4e\xa7\x2b\x95\xa6\xad\xe9\xd3\x22\x0a\x5c\x3d\x55\x52\xe0\xe0\x4c\x29\x3a\x8b\x42\x14\xab\xa5\x63\x70\xe7\x6d\xf2\x01\x87\x8e\x5c\x66\x01\xe7\xba\x54\xbb\xd0\xd8\x36\xf4\xd5\x43\x5b\xdd\x08\xcd\x4b\xb6\x92\x75\x93\x80\xfe\x76\xcd\x85\xc1\x0c\x65\xd3\x92\x42\x60\x8a\x0d\x74\x75\x25\x59\x78\x6e\xe7\xb7\x66\xeb\x5d\x45\xa8\xe0\xef\x17\xb3\xde\x00\x2f\x03\x2c\xba\x25\x42\x71\x67\x9b\xee\xa5\xe5\x52\x4e\x20\xce\xb6\x3d\xe8\xef\x7e\xfd\xfd\x64\x11\xda\x18\xe0\x73\x43\x3e\x4f\xcd\xcc\x4a\x56\xcf\x5c\xcd\x91\x92\x0a\x3e\x65\xca\x9c\xfa\xd2\x80\x88\xd5\xe3\x41\x51\xa2\x3b\x03\x1c\xe8\x4d\xb1\xb2\x90\x5e\xdc\xf6\x71\x45\x47\x18\x9c\x52\x2b\x96\x9d\xd4\xf2\xd4\xd6\xc4\x17\x63\xf6\x89\x65\x8d\x86\x7b\x02\x56\x74\x72\x22\xa4\x79\xd6\x6b\x13\xbc\x6e\x6e\x90\xe1\x82\x01\x56\xa6\xeb\x2a\x70\xe9\xe0\x6c\x7a\x77\x4b\x35\x37\x15\xee\x15\x9b\x1a\x9e\xe0\xd5\xe4\x77\xbf\x8b\x59\x30\x7a\x73\x42\xef\x8a\x65\x4d\xcd\xf5\xd2\xa0\x37\xf6\x49\x4f\xa6\x0a\xea\x59\x9c\x43\xaa\x06\x4b\xbc\xe6\x14\x14\x46\xe8\xfa\x89\x57\xa4\x05\x5e\x03\x50\x07\xf7\x53\xab\x3c\x65\xdd\x07\x2f\x67\x97\x3d\xb5\x08\xcc\x40\x60\x0b\xe6\x6a\x42\xae\xa4\xc2\xec\x0f\x3e\xbf\x4f\x94\xf3\xee\xb3\xa1\xe7\xa6\x7d\x76\x14\x9d\x80\xd4\xf2\xbc\x69\x7a\xff\x0a\x42\x5e\x1f\xe1\xc1\x8c\xf3\x1a\x92\x64\x6a\xa2\xe9\x6c\xa5\x84\x86\xac\x3b\x8b\x6e\x73\x31\xef\xd8\xce\x60\xd7\xb8\x8f\xdb\xf4\xc1\x09\xdf\xe4\x72\x15\x60\xba\xf1\x0e\x36\x3b\x4f\xcc\x36\x7e\xc1\xe6\x74\xc1\x36\x12\x81\x4a\xe6\x93\x0d\x78\x13\x80\x35\xa6\x6b\xc3\xb4\xfb\xb0\x02\x9f\x1e\x46\x29\x56\x42\x69\x88\x7b\xc8\xce\x26\x1a\x7a\xb3\x24\x85\x94\x90\x78\xa1\xa9\x88\x90\x39\x33\x60\x06\x6e\x0b\xb4\x50\x23\x72\x7d\x66\x5f\xac\x82\x21\x31\x79\x18\x70\x48\x15\xcb\x36\xbc\xb0\x07\xb9\x3b\xc8\x8b\x8d\x44\x33\xc6\xab\xac\x13\x15\x20\x6d\x38\x4b\x5b\x9a\xc5\x16\xac\x28\xd8\x82\x81\xe1\x6d\xca\x67\x04\x13\x72\x97\x36\x45\x9b\xf3\x22\x92\x35\xa4\x39\xae\x79\x1e\x23\x2c\xaf\xd2\x77\x73\x20\x77\xb2\xbe\x2d\x24\xcd\x83\x02\xec\x8a\x14\xfc\x96\x91\x37\xac\x2a\xe4\xd2\xe6\x55\x13\x39\xb9\xd6\x54\xb3\x69\x53\x5c\x47\x6d\x64\xac\xfc\xab\x32\xc5\x77\x2a\xff\x9a\x0e\x57\xe4\xdf\xcb\xeb\xf3\xeb\xcb\x67\xe9\xff\xfa\x38\x6d\xc4\x8b\x5f\xc2\x6a\x0f\xad\xe7\xe3\x3f\xf6\x19\x7c\xc7\xa4\x68\xfa\xdf\x41\x13\xfa\x95\xac\x35\x2d\x76\xc4\xdb\x64\x73\x5a\x9d\x35\x7a\xfe\x86\x2b\x28\x5b\x93\xca\xe2\xac\x7d\x1f\xa4\xdd\x61\xa0\x37\xb6\x1c\x26\xe1\x0e\xa6\xec\x7b\xe7\xff\x76\x76\x45\x68\x63\xe0\x40\xdb\x84\x52\x3b\xd3\xf0\x87\x2b\xbb\xc6\x34\x8c\x5b\xae\xcb\x7e\xdd\xb3\x2a\xf7\xd6\xbe\xd7\xf4\x54\x01\xc4\x83\x77\xf0\x01\xbd\x83\xfb\x51\x14\x49\x63\xb8\xb8\xe0\x9a\x53\x2d\xeb\x7d\xb9\x55\x76\x06\xf0\xde\x16\x8d\xd2\xb2\xb4\x17\xe4\xd2\xbd\x01\x61\x38\x91\x36\x83\xb5\x6e\x5b\x67\x0d\xb0\x64\xc2\x46\x5d\x0a\xcd\xea\x29\xcd\xd8\x4a\x0a\x8c\x11\x28\xa0\x70\x74\xee\xde\x89\x18\xf7\xcf\xd6\x4f\x09\xaa\x04\x17\x7f\x79\xfd\xe7\xc0\xd1\xf8\x2f\x9e\x45\xb3\x6a\xaf\x90\x1b\x13\x2c\x8b\x4b\x8a\x97\x72\x72\x3f\xa6\xe2\x2d\xfe\xa3\x58\x71\xb8\xc2\x2d\xf8\x7f\x0d\x2d\x70\xeb\xe2\x0e\x20\x65\x92\x9d\x63\xd8\x0b\x7c\x75\x0f\xda\xae\xcf\x9f\x2a\x86\x76\x01\x3e\x41\x91\x51\xd8\x45\xeb\x9a\x0a\x65\x0e\x32\x55\x58\x3a\xb6\xec\xe2\x31\x39\xd1\x59\x15\xe1\x7f\x9d\x14\x1b\xe9\xe3\x22\xed\x3f\x7a\x3e\x48\x4f\x20\x55\x34\x22\x64\xe8\x70\x33\x3e\x22\x38\x7c\xe5\x13\x48\xc5\xae\x6a\x2f\x2e\xde\x70\xbb\xf6\x92\xb0\xc7\x76\xed\xa1\x24\x5c\x3c\xb2\x4e\xe4\x2b\xae\x34\xa6\x9a\xc0\x97\x21\xd4\x18\x93\xf1\x18\xe6\xf7\xca\x48\x09\xbc\xfa\x2f\x9a\xe7\xf5\x6b\xa4\xf2\x4e\x07\x5e\xc7\x44\x92\x1b\x11\x45\xfb\x02\x7a\x4e\xf2\x38\xd1\xcb\xca\x56\x6b\xff\x78\x7e\x05\x7d\x29\xf2\xa7\x3f\xbc\x04\x6e\xf8\x77\xbf\xfd\xc3\xcb\x68\x30\xfb\x2c\xb3\xf6\x90\xff\x85\xde\xe6\x87\xc8\x06\xd1\xc9\xe8\x00\xd9\x7f\x0d\x0f\x7a\x8d\xc9\x0f\x0c\x79\xb2\xa8\x10\x2f\x80\x81\x35\x4f\x56\xb7\xe3\x54\x87\x94\x04\x43\x4a\x82\xb6\x0d\x29\x09\x36\x4f\x2c\x90\xd4\xf7\xe2\x00\x12\xf4\x0f\x49\x67\xd7\xa9\x1c\x12\xb8\xab\xcf\x91\xc0\xf5\x1e\x68\x3f\xba\x48\xdb\xd2\x30\x0c\x2c\x2e\xef\x57\x9b\x26\xeb\xcd\xfb\xeb\xff\xfa\xea\xec\x8b\x8b\xaf\x60\x9d\x36\xae\xcc\x80\x35\x17\x7b\x52\x6a\xed\xe8\x12\xc5\xee\xf5\x6e\x1d\xd8\xc5\x8a\xeb\xba\x20\xef\xdf\x5e\x27\x7a\xad\xef\x55\x47\xf8\x4b\x31\x8d\xd9\xb7\xc3\x3a\x02\x9a\x97\x14\xab\x77\x97\x43\x6f\xaf\xfe\x82\x41\x3d\xd0\x8e\x16\xc7\x9c\x34\xae\xe2\x00\x6a\x94\xbe\x63\x24\x9f\x89\x4f\xb7\xd9\x34\xdc\xc8\x67\xe9\xcd\xbd\x9f\x23\x89\xe5\x99\xeb\xf4\x44\x90\x91\xe9\xd3\xea\x20\x5b\xa4\x41\x48\x48\x22\x6a\x43\x3c\x0d\xd9\x64\x4a\x39\x82\xf1\xb9\x42\x75\xb5\xa9\x90\xc2\x2e\x51\xfd\xc6\x01\x6c\x11\x05\x57\x05\x22\x70\x96\xef\x98\x67\xfb\x2c\x4b\x9b\xab\x40\x84\xf6\x52\x20\x80\x15\xcd\xfa\x49\xf9\xce\xea\xdd\xb4\x8f\xf0\x09\x24\xbf\x3f\x38\x31\x81\x51\x77\x98\x8e\xc4\xf7\xb7\x8f\x8b\xe6\x3b\x5f\xcd\xcc\x4a\x53\x8e\x98\x50\xe5\x3d\xe9\xd0\x0b\x2f\x29\x85\xeb\x13\xc3\x00\x79\x86\x94\xe8\xef\x7b\x53\xa0\xec\x5a\x79\x52\xcd\xa5\x96\x62\x7f\x89\xa2\x36\xf5\xdf\x45\x5c\x57\xf0\xc6\xb9\x77\x07\x08\x10\x1f\xe6\x8a\xf0\x26\xf3\x15\x2f\x71\x6b\x1e\x4f\x73\x10\x0f\x43\x32\xaf\x36\xcd\xed\xe1\xe8\xcc\x8d\xcb\x79\x4e\x81\x9a\x55\x7e\xf9\x66\x47\x98\x6b\xc8\xb7\x8c\xed\x99\x56\xc6\x30\x27\x9d\x78\x38\xe6\x13\xb7\xeb\x97\x6f\xac\xa0\xe1\xb2\xd1\x29\x7b\x1f\xc8\xfd\x57\x71\x67\xbc\x93\xac\xf5\x9d\xac\xf7\x90\x87\xbe\xdb\xf3\x4a\x38\xa1\xfd\x6d\x2d\x0b\xe5\xce\xf1\x4a\x77\x12\x49\x69\xe5\x56\x57\x60\x76\xb4\x67\xe8\x7b\x72\xca\x7d\xca\x27\xae\xaf\x49\x26\xcb\x4e\x5d\xbb\x39\x43\x3e\xe0\xfc\xfa\xf2\x1d\x9f\xe1\x54\xdc\xac\xc9\x94\x51\xdd\xd4\x6c\x3c\xa3\xba\x6f\x68\xae\x48\x9f\xcd\x76\x0f\x38\x0e\xcf\xef\x73\xc0\x73\xd7\x80\xe7\x02\x28\x7c\x08\xdf\x3d\x57\x74\xf7\xb4\x68\xee\x20\xfc\xda\xcf\x2a\x33\xba\xbb\x1e\x89\x3b\xe6\x3e\xb3\x4a\x58\x73\xd6\x2d\x69\xa0\x1e\xa9\xd9\xf7\x76\x46\x0a\x6a\xf9\x0f\xc0\x5b\x09\x54\xc0\x7f\x83\x56\x5a\x40\xa1\xb4\x28\xcc\xae\x4a\xd1\x16\x19\x51\xad\x9f\x2e\x3a\xb5\x96\xb4\xb2\x3e\xbb\xb9\xbc\x13\x77\xb4\xce\xc9\xd9\xd5\xe5\x6e\xb0\x57\x42\xde\x20\x84\xb5\xb8\x92\x7e\x5b\x64\x0e\x6a\xbb\x07\xca\xa0\xb1\x00\x23\x23\x37\x5c\xab\x4e\x49\xd5\x40\xe5\x65\xc8\x9e\x77\xca\x81\x40\x99\x1b\x7f\x29\x92\xd8\x30\x41\x64\xa6\xa9\xab\x01\x7a\xc3\xf4\x1d\x63\x82\xbc\x7c\xf9\x12\xed\x18\x2f\xff\xf8\xc7\x3f\x82\x53\x39\xc9\x59\xc6\xcb\xf5\x17\xe1\xad\x7f\x79\xf5\x2a\x66\xd0\x7f\x3f\x7b\xf7\x15\xa1\x19\xc8\x94\x58\xc6\x07\xc7\x86\x03\x0e\xbb\x57\x23\xf2\x7f\xaf\xbf\x7e\xef\x28\x8c\x5a\xf9\x15\xe0\xc7\x6f\x51\x94\x2c\x66\x83\xa4\x38\x84\xb1\xb5\xb6\x0a\xaa\xe7\x3e\x34\x88\x82\xa5\x33\x08\x20\xb3\x77\x3f\xca\xd1\x0f\x32\xfb\xf3\xd9\x1c\x36\x95\x0b\x80\xdf\x82\x67\x36\x67\x13\x5a\x8f\x5c\x01\x0c\xcc\x23\x80\xf1\x3e\x8e\xbc\x44\x8c\x61\x16\x3c\x42\xcf\x6b\x1b\x47\xd4\xd6\xc2\xae\x99\x32\xa2\xa6\x2d\x77\x8a\xc3\xb5\x30\xa4\x58\x74\xd1\x90\x7d\x38\xbf\xd8\xcb\xbd\x17\xbd\xa5\xc5\x1b\x96\x45\x2e\xb8\xd2\x41\xd5\x4b\x8b\x76\x40\x45\x4c\x2e\x68\x36\x27\x4c\x68\xc8\x47\x85\x07\x6c\x5e\x8f\x18\x64\x4e\x45\x6e\x6e\x18\x94\x47\x80\x01\x9f\xc8\x73\x65\x1b\x5f\x80\x2b\xbf\x07\x9d\x60\xc9\x16\x23\x53\x23\x01\x87\x60\xda\x32\x26\x41\x10\x5a\x64\xbd\xd6\x8b\x4f\x14\xd2\x74\x98\xad\x42\x75\xb1\xb2\x01\x71\x2a\x2c\xe6\x15\xd3\x59\x62\xc9\xf5\x34\xff\x0b\x42\x32\xcc\xbe\xf2\xb1\x6e\x94\xfe\xa2\x31\x07\x1c\x5b\x3a\x74\xdb\x62\xad\xe7\x6b\x23\xa2\xeb\x83\xb5\xf7\x81\x16\x38\xcb\x98\x42\x50\xfe\x01\xe3\x6c\x74\xfb\xf6\x0f\xb8\x91\xd1\xe3\xc9\xe9\xa6\x21\x5d\xe4\x2c\x17\x06\xf7\xd3\x46\xcb\x31\x54\xc9\x76\x19\x5b\x7a\x63\xa7\xdb\x76\x56\x54\x73\x3a\x22\x33\x1a\x30\xb1\xeb\x23\x06\x00\x68\xe5\x14\xf8\x22\x61\x9c\x07\x56\x61\x10\x9e\x35\xf4\x03\x64\xb5\x65\x8c\x05\x2d\x19\x44\x78\xe1\xc4\xa2\x07\x5b\x29\x4a\xa7\xf8\x4c\xb0\x1a\xb5\xb4\x10\x03\x4c\x0a\x7a\xc3\x0a\x3b\x94\xac\x13\x96\xf1\xa5\x8b\xa6\x63\xb5\xc1\x9e\x8a\xd0\xd9\xac\x66\x4a\xf1\x05\xb3\x41\xd4\xfc\x9f\x6d\x31\xbc\x39\x23\x57\x17\xef\x5c\x28\xb9\x22\x86\xb1\xd5\x2c\x26\x91\x1e\x36\x9f\xc6\xd1\x80\x56\x2b\x7b\x4c\x08\xb9\x50\x52\x43\x89\x37\xd3\xbf\x3d\x12\xe5\x4b\x3a\x83\x97\xe9\x18\x62\xc6\x53\xf6\xac\x8d\x02\xc2\x70\xf3\x39\xa3\xb9\x8b\xbb\x35\x2c\x65\x55\x19\x49\x9a\x9c\x9b\x2b\x3a\xb5\x65\xc6\x31\x32\x3b\x6f\x8c\xa8\x42\x7b\x55\x6f\x61\xfb\x38\x67\x44\xd6\x39\xc3\x22\xe6\x53\x70\xe6\xf1\xdd\x06\xf4\x1d\x52\x10\x71\x33\xd2\x0d\xd7\x35\xad\x97\x48\x31\xed\x49\x44\x0f\x67\x70\x26\x96\x57\x87\x5e\x61\x64\x08\xab\x22\x31\x39\xe5\x5c\x4b\x44\x68\x24\x41\xc2\x6e\x5b\x94\x6d\xdd\xb5\x54\x9c\x69\x1a\x80\xff\xb5\x85\xfe\xf8\xcf\x1e\x53\xe3\x9a\x10\x1c\x0f\x44\x86\x75\x64\xe0\xb3\x00\xe8\x6c\x6e\xe9\x7a\xf7\x8a\x12\x82\x92\x20\x8d\xf5\x48\xc3\x66\x23\xb2\xb9\x43\x02\xde\x2b\x9f\xe9\x89\x61\xa0\x75\x43\x8b\x62\x39\x66\x9f\x0c\x29\x31\x97\x18\x68\x28\xa4\xa9\x04\x77\xfe\x46\x28\xa6\x53\xea\xd6\x13\xbc\x7c\x55\x8d\xf9\x26\x14\x39\xc2\x35\x09\x09\x09\xa8\x8e\xb0\x5b\x23\x08\xdc\x34\x1a\x5d\xe0\x46\x9b\x3f\x49\x5b\xe7\x82\xd5\x4b\x3b\x42\xc2\x87\x5b\x80\x33\xd9\x12\xe6\x08\xdc\x41\x9d\xcd\x2f\x3e\x55\x35\x86\x1e\x25\x7e\xbd\x02\x7e\xab\x9d\x61\x96\x26\xc7\x3d\x76\xc1\xc7\x5d\x42\xc0\x70\xe8\x64\x16\x3e\x01\x2c\x76\xf6\xfe\x4d\x0a\xfa\xc2\x96\xc2\x22\x76\x5b\x34\xc3\xd8\x6d\x8f\xb9\x81\xd8\xce\x1e\xd8\x1b\x9b\xe9\xca\xfd\x82\xc9\x89\x5d\x8d\x31\x27\xd5\x51\x72\xcb\x2c\x12\x36\x92\x27\x28\xbb\xec\xcb\x5b\x4c\xa7\x66\x10\xda\x8d\xb1\xea\x6c\x09\xdd\xe2\x48\xa9\x67\xb1\x35\x38\xbb\x89\xa4\xe2\xe9\xb6\x8d\xcd\xd4\xb7\xfa\xce\x6d\x5f\xf2\xc7\xdb\xde\x41\x6c\xb7\x2c\x42\xb5\xb7\xa9\x75\xe0\xcf\x9c\x97\x93\xda\x00\xa6\xcc\x03\x1f\x23\xe7\xc1\x88\x42\x6e\x63\x45\xb4\x4c\x3f\x52\xb2\x8d\xc7\x6c\xb7\xb9\x2d\xde\xc1\x82\xb7\xba\x70\xe1\x1c\xba\xb6\x91\x5b\xb6\x3c\x56\x78\x03\x0c\x06\x9b\xf3\x0a\x6b\x73\x19\xf2\x60\x24\xe0\x2d\xaf\x01\xb6\x6f\x21\x9b\x8d\x1b\x18\x71\xdc\xa5\x18\x91\xf7\x52\x9b\xff\x5d\x7c\xe2\xca\x72\x7b\x6f\x24\x53\xef\xa5\x86\x27\x4f\x72\x42\xb8\xd0\xa7\x3c\x1f\xab\x93\xe2\xe0\xdc\x09\xe8\x1c\x04\x07\x58\x90\x3b\x07\x97\x46\xc4\x9f\x25\x57\xe4\x12\x32\x7b\xe3\x96\x6e\x39\x34\xf8\xef\xba\x34\x29\x66\x60\x27\x63\x43\x2a\x1d\xeb\x49\xbf\x3e\xb2\x3d\x3f\x59\x77\x8e\x6f\xe7\x93\xb0\x13\x00\xdd\x18\xfe\x02\x19\xde\xaa\x82\x66\x2c\x77\xe9\xaa\xa8\xd9\x29\xaa\xd9\xac\xd7\xc7\xfc\xbe\x56\xb2\x7a\x06\xaa\xbc\x2c\x2a\x6d\xe2\x86\x05\x6c\x4d\x88\xb1\x6d\x49\x8e\xc3\xc1\xb7\x06\xff\x47\x46\x28\xed\xb1\x33\xe0\xb1\xbe\x32\xa8\xfd\x71\xbc\xda\x16\xf7\x32\x18\x1a\xb9\x92\x92\x56\xe6\x4e\xfe\xb7\x61\x3e\x00\x54\xff\x87\x54\x94\xd7\x6a\x42\xce\x5c\x1a\xad\xf0\x37\x2b\x3d\x06\xdd\x6c\x31\x85\x0a\x3c\x82\x7f\x6c\xf8\x82\x16\x36\x29\x07\x15\x84\x61\x9a\x31\x33\x9b\x55\x26\x74\x44\xee\xe6\x52\x21\x27\xe3\xc3\x6f\x8e\x6e\xd9\xf2\x68\x94\xa4\xc1\x70\x2d\xbc\xf1\x47\x97\xe2\xa8\xd5\x16\x77\x6e\xab\xe7\xd1\xc0\xab\xf6\x08\x7e\x3b\xda\x3d\x9f\xbb\x15\x67\xb5\x6d\x51\xe7\x4d\x13\x48\xbe\x62\x8f\x89\x87\x69\x5b\x7c\xa4\x17\xb6\x5d\x88\xc9\x0e\xa6\x37\x28\xce\x6e\x96\x2e\xa1\x9c\x15\x54\xd7\xe5\xd8\xa4\x21\x41\xe6\x0d\xe4\x63\x03\x62\x1d\x15\x41\xba\x48\x99\x78\x50\x2e\x3b\xce\xa1\x36\xd9\xd0\xd3\xba\x61\x23\x92\x4b\x71\xac\xad\xba\x2b\x4c\xba\xb8\x9a\xda\x2a\xdf\x70\x0e\x27\xea\x34\x69\x50\x5a\x33\xc8\xb5\xe5\x92\x48\x5a\x0d\x03\x26\x60\x04\x4d\xa7\x76\x1e\x22\xe6\xcf\x4d\x43\xc6\x07\xe4\xd9\x21\x6d\x58\x9e\x90\x80\xbb\x20\xad\x77\x38\x6c\x7b\xe8\xc1\xe0\x5d\xed\x69\xd2\x78\x0f\x01\x11\x60\xf1\x36\x4c\x10\xd5\x22\xff\x64\xb5\x4c\x1a\x61\x83\xea\x28\x1d\x3a\xe3\x2c\xfa\x6d\x8b\x0b\x3c\x69\x5b\x07\x34\x3f\x00\x7b\xbf\xb0\x86\x4a\xc8\xdb\x19\xe4\x25\xa9\x25\x1e\x0d\xf8\x3c\xc0\x0f\x37\xb0\xaa\xbd\x5f\xb9\xf6\xa8\x9e\xa9\x02\x30\xd0\xda\xa7\x51\xab\x1e\xad\xde\xc7\x39\x6b\x35\xf2\x72\x6a\x8b\xa4\xa3\xd1\xe1\xb1\xa0\xe8\x73\x6d\x34\x02\x13\x57\xa0\x55\x7c\x1b\xf5\xf8\x16\xc7\x8a\xfe\x16\xef\x68\xb5\x95\x15\xcc\x7f\xdd\xa9\x86\x4f\x6f\x64\xa3\x5d\xba\x10\xfb\x3b\xd4\x1c\xd6\xd2\xd9\x1f\xf7\xa7\x3a\xdf\x46\xc7\x91\xcc\xc8\x3f\x06\xa4\xd1\x13\xa6\xeb\x87\x35\x22\x8c\x66\x73\xc3\x01\x8e\xd1\xcd\xc2\x70\xa9\x8e\x1d\x7d\x63\xb6\x0e\x19\x43\xb9\x4a\x62\xd2\x80\xcf\x9f\x86\x03\xb9\xc0\x3f\xc7\x99\x8d\x9c\xcb\xa5\xb2\xae\x6b\x96\x39\x15\x6d\xe8\x42\xd2\x98\x4e\x3d\xe7\x52\x23\x5b\xd5\x0f\xac\x12\x64\xd4\x95\xca\x52\x46\xf6\x60\xb9\xf9\xcc\x5f\x8c\xa4\xf1\x36\xac\xa8\xcd\xa6\x63\xb0\xa9\xf5\x2b\x6a\xc4\xda\x48\x86\xe0\x25\x8f\x86\x59\x36\xcd\x42\xa8\x53\x6d\x05\xd9\x7b\x20\x57\x34\xf8\x9b\xb7\x29\x2e\xed\xa9\xfa\xc3\x48\x13\xbf\x83\x23\x52\xcc\xa7\x7a\x66\x75\x2d\x6b\xb3\x26\xa6\x14\xe1\xb0\xcb\x25\xad\x6f\x59\xee\xb9\xa4\x09\xb9\x32\x8b\x77\x32\x7a\xd2\x98\xb5\xa3\x46\x2e\x65\x74\x58\xa4\xcc\x4c\xe8\x78\x32\x39\xb6\x15\x14\xd6\x4b\x96\x25\x63\xaf\x54\x81\x7c\x0b\x31\xbc\x73\x7f\xdf\xd1\x4a\xa1\x3a\xc2\xb0\x37\xa0\x8e\x94\x50\x2b\x50\xcf\x9d\x4d\x91\x26\x84\xd8\xac\x2e\x67\x0b\x01\x68\x5b\xb5\xf2\x36\x2a\xe5\x24\xc3\x21\xb6\xed\xd5\xc8\x5b\xa9\x90\xef\x53\x1f\xdb\x93\xb2\x37\x7e\x5b\xcd\xff\x56\x1a\x98\x32\xca\x25\x70\xb5\x3d\x5e\xed\x08\xae\x5d\x5c\x91\xaf\x9d\xec\x13\xe7\x30\xa8\xe7\xb6\x12\xf6\x36\x7a\xb2\x27\xf1\x18\x5c\x6d\x4f\xe7\x41\xb8\xda\x2e\xa7\x98\x4f\x7c\x63\x41\xc4\xd0\xa5\xd3\xb3\x75\x91\xd9\x77\x57\xdb\x21\x5c\x0b\x57\xdb\x9e\x5d\x0d\x57\x5b\x9a\xeb\xe1\x6a\x4b\x71\x45\x5c\x6d\xa9\xd2\x19\xb6\xc7\x5f\xe0\xb0\x1a\x5c\xdd\x11\xf2\x2c\x6b\x07\x2c\x17\x88\xba\x55\x80\xe4\xb6\xba\xb7\x96\x50\xe3\xd5\xa5\x37\x4a\x16\x8d\x8e\x2f\x39\x77\x5f\x77\x21\xdd\x87\x89\x3b\xcd\x66\x2a\xb1\x5f\xed\x38\xe0\x1b\x80\x6b\x43\x72\xbc\x5d\xaf\xbb\xd0\xfc\x6d\xaf\x05\x3f\xa4\xea\xef\x31\x09\x9f\xb0\x1d\x3a\xed\x13\xb6\x03\x27\x7f\x72\x83\x3e\x26\x05\x14\xb6\xa7\x4d\x04\x85\x6d\x4b\xf0\x4e\x49\x0a\xe5\xda\xa3\xb5\xac\x3e\x89\x39\x52\xcc\xa5\xcf\x2c\xdc\x11\x82\x20\x51\x93\x56\x28\x8d\x39\x3b\xa2\xad\xde\xb2\x67\x55\xdd\xe3\xd5\xfd\x2e\x46\xe5\xec\xea\x72\x2b\x2d\x4a\xf0\xfd\x3d\x7a\x94\xf0\x8d\x9f\xb1\x26\xe5\x12\x55\x23\xa1\x4f\xd6\x9b\x76\xe5\x36\xce\x32\x91\xb5\x79\x1a\x99\x72\x6d\xda\x6f\x0d\x5d\x0f\x73\x95\x06\xe7\xac\xa5\x0d\xe9\x69\x39\x00\x4b\x65\x5d\x99\x1e\xf4\xe5\x4d\x71\x02\x27\x4f\x23\x7f\x1e\x50\x96\x84\xfd\x88\xca\x23\xb9\xda\x3a\x27\x75\xdc\x56\xd2\x40\x65\x33\x2a\xbe\x02\x6d\x5b\x25\xf3\xd7\x68\x24\xa5\x42\x48\xac\x14\xa5\x46\x68\xa8\x50\x23\x6b\x86\x09\x52\x74\x88\x9c\x34\x3c\x47\x0f\x68\x9f\x5d\xe0\xf8\x73\x72\x4c\x83\xe5\x5f\xa5\x1e\x25\x79\xb4\x87\x19\xad\xf8\xb7\xac\x8e\xcb\x62\xbf\xa9\x75\x0e\xd6\xf6\xe4\x4e\x51\x65\x73\x56\x52\xf8\xe7\x5b\xb7\x3c\x83\x6a\xac\x7f\x3d\xa8\xe5\x58\x5d\x1a\xd6\x63\xd4\x89\x32\x3d\x5a\xbc\x4a\xf2\x8f\x6d\xdb\x23\x5d\x3c\xfc\x29\xec\x60\x33\xae\x3a\x22\x86\x01\x6e\xd0\x14\x80\x71\xc5\x65\x9a\xf1\x6a\x4b\x43\x65\x16\xb8\x7b\x4f\xb0\xf0\xdd\x98\xdf\xb1\x3d\x95\x9e\x66\x5b\xfd\xcc\xc8\xf3\x3e\x5d\x6d\xcb\x16\x53\x18\xf4\x33\x83\x7e\xe6\x7f\xb5\x7e\x26\x20\xec\x0e\xd7\x6f\x50\xbb\x84\x19\x51\x9d\xee\xa5\xad\x7b\x30\x41\xed\xa7\x53\xa3\x38\x1d\x4a\x5b\x62\x10\xcd\x1f\xc7\x93\xc9\x31\x1a\x40\x26\x5e\x5d\xda\xe8\xe9\xf8\x4f\x84\x89\x4c\xe6\xa6\x1f\x2c\x10\x58\x2b\x0d\xac\x65\x2b\xb1\x87\x73\x29\xdd\x58\xa1\x09\x05\xfa\xde\x96\x7b\xd8\x0a\x05\xbb\xa8\xfc\xb7\xbb\x61\xb0\xb6\x42\xa0\x2d\x2b\xe6\xeb\x32\xd9\x2d\xf3\xa5\xaa\x2c\x4f\xd6\xe6\x10\x28\x78\xc9\xad\x77\xb2\xc1\x2e\x4c\xe9\x74\xf7\x3d\x42\x4e\xb0\x9b\x49\x56\x35\x23\xdb\xe5\xa4\x64\xa5\xac\x97\x23\xdf\xad\xf9\xb1\x33\x8e\x7d\xe3\x14\x98\xbe\xac\xa9\x6b\x26\x74\xb1\x8c\x4d\x2e\xb5\xa9\x3d\x21\xf7\xe7\x76\xf4\xc0\xcc\x9f\x3f\xd8\x54\xff\x92\xb6\x75\xef\x7f\x5b\x87\x10\x14\x72\x7e\x57\x80\xc6\xd8\x34\x76\xa3\x56\x3f\x61\x9e\x32\xb1\x20\x0b\x5a\xab\xf4\xfb\x46\x1e\xcf\xef\xe5\x7c\xc1\xd5\x4e\x42\x0e\xae\x2d\xf1\x43\x3d\xb3\x6c\x74\xd5\x68\x8b\x8e\xdd\x35\x72\x15\xc9\xfc\xf5\x59\x61\x7a\x5f\xc5\xab\x88\xc2\x56\x51\xad\x59\x2d\x5e\x93\xff\x3c\xf9\x8f\xdf\xfc\x34\x3e\xfd\xeb\xc9\xc9\x77\x2f\xc7\xff\xfa\xfd\x6f\x4e\xfe\x63\x02\xff\xf8\xf5\xe9\x5f\x4f\x7f\x72\x7f\xfc\xe6\xf4\xf4\xe4\xe4\xbb\x2f\xdf\xfd\xed\xe3\xd5\xc5\xf7\xfc\xf4\xa7\xef\x44\x53\xde\xe2\x5f\x3f\x9d\x7c\xc7\x2e\xbe\x8f\xec\xe4\xf4\xf4\xaf\xbf\xda\x6a\xba\x54\x2c\xbf\xde\x02\xbf\x61\x1b\x3f\x92\x3e\x76\x7b\xd9\x95\x27\x38\x17\x7a\x2c\xeb\x31\x76\xf7\x1a\x5c\x16\xb7\xe8\xd4\x81\xc5\x2e\xee\x61\x4b\x87\xdb\x1a\x7b\x4e\xf8\x78\x82\x8b\xb6\x2b\xf9\x62\x07\xc6\x82\x4a\xe6\x41\x60\xf4\xbe\xf3\x10\xd8\x80\x7c\xe5\xe3\xff\x6b\x50\x66\x88\x59\x50\x40\xd3\x7a\x12\x92\x93\xaa\xe6\x0b\xaa\xdb\xf0\xba\x20\xd2\x3a\x7a\xc0\x6c\x4e\xb9\x38\x6d\x83\xbb\x2a\x99\x03\x7b\xda\x28\xe6\xb3\xf4\x1b\x12\xff\xf1\xab\x6b\x92\x15\x1c\xdc\xe3\x6b\x9f\x62\x38\x7a\x18\x17\x5f\x3f\x63\x82\xd5\x18\x60\x4e\x56\xa7\x0f\xf5\x92\xb8\x46\xc0\x13\x79\x6f\xda\xdd\x60\xd7\x3a\x67\xf4\x01\x09\xbe\x4b\xdd\x86\x3e\xb7\xe8\x75\x08\xe1\xc6\x36\x8d\xa8\xf5\x43\xa4\x55\x55\xcb\x05\x4b\xf3\x9a\xb2\x3c\x05\x96\x30\x51\x0a\x1c\xf6\xc3\xed\xc7\x6d\x1d\xf9\x65\x83\x17\x68\x27\x16\x32\xfe\x80\x56\x7b\x25\xf7\xe5\x0e\xf8\x68\x1f\xe6\x92\xa9\x80\x45\x6d\x84\xe6\x0f\x57\x68\xbc\x67\x38\x45\xe6\x74\x61\x64\x4f\x26\x70\x91\x48\x95\xc1\x0b\xae\x7b\x2b\x02\x8f\xae\xc8\x7c\x56\xae\x59\x5c\xc3\x05\x58\x16\x20\xab\x46\x3a\x50\x59\x29\x71\x66\xf6\xa6\x5e\x82\x3e\x56\x12\xb8\x38\x78\xd2\xe1\x16\x5a\x30\xc7\xc2\xf2\x22\x47\xef\xcd\xe8\x11\x6d\x22\x0d\x0b\x3a\x2e\xbb\x2f\xdb\x0c\x80\x93\x6b\x4d\x75\xa3\x26\x5f\x98\x99\x7d\x60\xd3\x9a\xa9\xf9\x59\x3c\xa3\x68\xa6\xa8\x34\x2d\xab\x2d\x76\xc4\xdc\x60\xf4\x3c\xf6\xf1\x06\xa8\xba\xf0\x4b\xf6\xe5\xef\x3d\x5a\xb1\x19\x41\x52\x34\x8a\xa0\xa5\x1a\x21\x42\xa8\xa8\xb9\xd7\x08\x91\x1b\xc6\xb9\x65\x4b\x90\xf0\xb6\x04\xfd\x73\x03\xf9\xd0\x01\x26\xac\x49\xd8\x93\x8f\x9d\x55\x3a\xe4\x89\x01\xd1\xed\xd6\x18\x10\x84\x9c\x1b\xc0\x81\x4d\x48\x20\x0c\x5e\x5d\xbc\x8b\x1e\xcc\xe6\x30\xb2\x19\xa0\x03\x04\x77\x62\xfa\xff\xf2\xfc\xfa\x97\x7f\xb2\x43\x9c\x86\x5a\x81\xd2\xda\x11\x52\x87\xe2\x36\x53\xc7\x2a\x94\x23\xa2\xb0\x97\xb6\x0b\xb4\x6d\x65\x94\x78\xa7\x46\xfc\xd4\xba\x60\xd6\x4c\x37\x35\x08\xd5\xbc\xde\x34\xa8\x20\x05\xa3\xd3\x31\xd0\x2e\xa9\x31\x21\xc7\x69\xc2\x79\x5d\x81\x89\x3c\xb8\x5c\xeb\x87\x87\x3b\x38\x32\xe7\x97\x31\xb2\x94\x8d\x8d\x45\xc6\xda\x51\xc4\x88\xf3\xf1\x40\x46\x05\x64\x2e\x34\x94\x07\xd9\x02\xb3\x37\x18\x4c\xb1\x94\x0d\x10\xc2\x00\x78\x37\x02\x65\xfc\x4e\xae\xcd\x15\xf4\x09\x25\xbd\x65\x44\xdf\xc9\xee\x35\x82\x69\xf9\xf0\x54\x65\xc4\x6a\x2e\xb2\xb8\x62\xd1\xd8\xd0\x28\xdf\x39\xa4\xda\x1a\x47\x46\xd6\x05\xb5\x72\x15\xfd\x5b\x0e\x60\x85\x2c\x9b\xd3\xdc\x8a\x5a\x99\xdd\x83\x9d\x6d\xdd\x51\xeb\x9a\xa9\x4a\x0a\xd0\xb1\x02\x1d\x01\x15\xd8\x84\x90\x7f\x5f\xd9\x97\x84\x25\x16\x05\x11\x0c\xd5\xb6\xd9\x9c\x65\xb7\x36\x07\x2c\x57\x46\x5a\xc5\x10\xb5\x91\x55\x04\x8c\x61\x3a\x40\x10\xcd\x52\x97\x49\xce\x09\x99\x14\x36\x7b\x6f\x22\xf2\x09\x19\x10\x57\xa8\x5b\x91\x6c\x2e\xa5\xb2\x3c\x41\x57\xec\x0b\xf7\x90\xc7\xd3\x0b\xe4\x43\xfe\x0f\xcc\xb3\x29\x74\x78\xe7\x79\x59\xa1\x03\x10\xec\xed\xb1\x22\xb9\xcc\x1a\xff\xb7\xd9\xb9\x82\xd1\x5a\x90\xb9\xbc\x23\x3a\x3e\x6e\xc7\x5c\x8d\x95\x09\x5b\xcf\x66\x95\x10\xdf\x7e\xa0\xd4\x3b\xb7\x6c\xf9\xb1\x3f\xfb\x6f\xf8\x45\x1b\x49\xb3\x47\x63\xfc\x26\x74\x72\x28\xbf\xa4\xbf\xfb\xd8\xa4\x75\x34\x0e\xc8\xc0\xe0\x07\x50\xcb\x5a\x57\xb2\x15\x2e\x2f\xe1\x1e\x10\xf0\xca\x31\x1c\x73\x7b\xc7\x15\x51\x73\xd9\x14\xc0\xf8\x6f\xe4\x43\x26\x84\xfc\x7d\xce\x84\x25\x05\x16\x09\xa7\x39\x13\xdd\x87\xb0\xd7\x11\xb1\xc1\x21\xaa\x45\x22\x1e\x1d\xa6\x7a\x6b\x3b\x94\xd9\xe5\x3a\x6b\x16\xe0\x8f\x11\xb9\x61\x19\x35\xab\x5e\xc5\xc1\x12\x11\x66\x6a\x00\x07\x26\x19\x2d\x79\x3e\x76\xe8\x7d\xef\x61\x66\x9b\xce\xeb\x09\xe0\x76\x8d\x35\xd8\x03\xdc\x46\x32\x90\xdd\xa4\x3a\x65\x53\x68\x5e\x15\x98\x28\x0e\xe2\x50\x13\x2d\x65\x1d\xfe\xd3\x46\xb2\xc2\x98\x57\x1f\x2e\xbf\x3d\xfb\x78\x41\xbe\xbc\xf8\x77\x7c\x3c\x0a\x3d\x51\xa8\xe3\x32\x2d\x19\x4f\x1a\xf3\x96\x2d\xb7\xd8\x9b\x96\x7d\xc5\x75\x02\xb4\x9f\x5f\x7c\xf8\x78\xf9\xf6\xf2\xdc\xcc\x14\x1f\x8f\x56\x1d\x66\x90\x3d\x4d\x1a\x6e\x1d\x4f\xf9\xb8\x4b\xc7\xde\xc2\xdd\xc3\x1c\x46\x4b\x4c\xc0\x55\xb2\x9c\x1b\xd2\x94\xc2\x84\x9a\xf6\x8d\xea\xea\x5d\x5a\x40\x27\x90\xd0\x1e\x50\xc8\x15\x14\x83\x5b\xe5\x3e\x91\xa3\x73\xf0\x91\x86\x3f\x80\x07\x75\x78\x80\x6a\xc3\x6f\xd7\x9c\x2d\x50\xc5\xe0\x71\xc8\x26\xa5\x0f\x6e\x89\x67\x5d\x53\x7d\x7c\xfe\x61\x0d\x9f\x25\x6a\x60\xba\x02\xdd\x46\x26\xbb\xc3\x7d\xa5\xad\xd2\x27\x0f\x28\x96\xab\x18\x77\x0d\x7b\xde\x51\xe5\x64\x19\xab\xfb\x00\x40\x8d\x1f\x6d\x2b\x0c\x67\xe9\xcd\xe1\x91\x1a\x9c\xec\x40\x7e\x07\xf2\xfb\x40\xb3\xdc\xec\xa1\x80\xd3\xa0\x79\x70\xf3\x96\x53\x33\x34\x44\xbe\x76\xb4\x6f\x4e\xaf\xeb\x0b\x70\x40\xa5\xd1\xa4\x31\x30\xaf\x95\x4f\x7f\xc2\xc8\xd1\x87\xeb\xb3\xdf\xbd\xfc\xe3\x6f\x8f\x46\xf0\xcf\xdf\xbf\xfc\xd7\x3f\x98\x7f\x5e\x9c\xbf\xb9\x3e\xbb\xfa\xed\xbf\x04\x7f\xfc\xee\x4f\xbf\x3f\x4a\x0b\xd1\xb4\x1f\xfe\xcb\x6f\x5f\xd9\xd4\x2b\x47\x17\x6f\x7e\xfb\x2f\xff\xf2\xea\x5f\xb7\x48\xb3\x98\x78\x74\x25\xfd\x74\xf1\xa9\xe2\x58\x26\xe4\x9a\x19\x21\xf5\x60\x71\xcd\x9b\xc6\x76\xda\xaa\x92\x7e\xe2\x65\x53\xfa\xc2\xa6\xe8\x00\xa5\xb5\x55\xfb\xa6\x5e\x8a\xe0\xfe\x25\x02\x82\x57\x62\xca\x0a\xcd\xa3\xdc\xe6\x28\x24\x0b\x56\xdf\x50\x0d\x85\xd7\x2c\x21\xd8\xa8\x78\x55\x29\x62\xb3\x69\xad\x55\xc2\xeb\x0e\xda\xf4\xe4\x89\xb3\xbf\x9c\x12\x89\xdb\x36\x82\xda\x37\x63\x5a\x71\x5b\xc1\x11\x6e\x8a\x62\xda\x1a\x39\xfe\xf4\x87\xdf\xbf\x7c\x79\xf2\xdb\xdf\x93\xb9\x6c\x6a\x75\x3a\x59\x79\x3d\x69\x54\xab\x99\x03\x12\x6e\xaf\x90\x9a\xcb\x5a\xbb\xba\xc8\xbf\xfb\xc3\xcb\x97\xe4\xe4\x15\x0c\x75\x6a\xb5\x9b\xee\xc0\x21\xcc\x83\xde\x24\xf2\x29\x78\x22\x5c\x91\x3f\xfe\xe9\x0f\xbf\xfd\xbd\xe9\xfd\x5f\x5f\x91\x9c\x2e\x93\xd9\xac\x8f\xf7\xe9\x29\x2c\x60\x1a\x1e\x8f\x01\x72\x06\x1e\x60\x45\x9f\x65\xe3\x4e\xd2\x88\x84\x07\xf1\x5f\xdb\x4d\xfa\x35\xee\xd2\xbb\x0d\xd7\x03\x03\x6b\x84\x5c\xdf\xcf\xa4\x21\x95\xbd\x6c\x9d\x33\x40\x1d\x95\xd2\x35\xe5\x18\x76\xcf\x04\x14\x42\x01\x9d\x6d\x17\x1a\xd2\x84\x87\x1f\x3a\xe1\x2e\x3f\x74\x15\xb8\x82\x61\x39\x51\xb3\x99\x6b\xc9\x99\xc1\xad\x3f\xaa\xb2\xf1\xca\x96\x62\xa9\x36\xd8\x1c\x07\xd2\xe9\xa8\x34\xdd\x4c\xbf\x9d\x03\xdb\x0e\x92\xa4\x58\x2c\x75\xac\x3c\xf6\xc8\xc9\xf9\xf5\x87\x36\x55\x88\xad\xcc\xea\x98\x56\x9f\xf9\x64\xaf\x04\x06\x6b\xb4\x6c\x65\xa5\xc6\x4f\xef\x09\x6e\xb1\x3f\xfe\x8c\xe3\x5a\x3e\x9b\x0c\x21\xd7\x78\x14\x43\x7a\x90\x27\x4f\x0f\x82\x27\x31\xe4\x06\x69\x17\x37\xe4\x06\x81\x36\xe4\x06\x09\xdb\x90\x1b\xa4\x33\xee\x90\x1b\x64\x88\x3d\x19\x62\x4f\x9e\x3e\xf6\x64\xc8\x0d\x32\xe4\x06\xd9\xdc\x86\xdc\x20\xfd\x6d\xc8\x0d\xf2\xbf\x2d\x37\x08\x82\xd8\xa6\x0c\x21\x56\x22\x6d\xd3\x83\x7c\x76\xd9\x41\x94\x39\xe4\x8c\x9d\x65\x99\x6c\x84\xfe\x28\x6f\x59\x74\x74\xfb\x8a\x0e\x65\xad\x1f\x73\x29\xef\xd3\xa9\xac\xbf\x7c\x30\x05\xcb\x33\xac\x5e\x46\x9b\x9c\x33\x91\x16\xcf\xf2\x18\xd4\xeb\xc6\x73\xf4\xdc\xf0\x31\x22\x67\x79\xfb\x83\xc5\xcb\xda\x1c\xcd\x84\x9c\x91\x9a\x65\xbc\xe2\xb6\x44\x00\xc5\xe7\x69\xf6\x17\x73\x2f\x6c\x21\xe8\xa5\xb9\x2d\xac\x98\x7a\xf4\xe8\x0b\x44\xd7\x81\xfe\xc1\x52\xea\x95\x29\xa5\x89\xb1\x66\x9a\xc8\x07\x02\xd7\x77\xc7\x15\x73\xb6\x5f\x6b\x32\x08\x56\xf9\x31\x1c\x2d\x0c\x37\x4b\x1d\x36\x58\x8e\xdd\xc7\xad\x94\xd9\x5b\xe1\x4a\xf6\x54\x06\xb6\xb5\x81\x5b\x66\x11\x4c\x53\x58\x5b\xc5\x57\x92\x5c\xd0\x82\xe7\x86\xfa\xba\x04\x18\x88\x12\xd2\xc0\x18\xf1\x87\x87\x52\xd5\x9e\x26\x06\xb7\xd0\x6c\xce\x54\x30\x33\x94\x78\x6e\xad\x95\x2d\x31\x60\xc3\xb4\xaa\x68\x66\x5c\xa0\x80\x04\xfd\x3b\x7e\xa3\x0d\xb9\xb0\x0b\x59\x9d\xdc\xc7\x60\x60\xf3\x79\x9a\x09\x05\x18\xcc\x8d\x11\x1e\xb8\x5a\x3e\x0d\xff\x50\x44\x16\xb9\x33\x49\xfc\xe9\xa5\x91\xa9\x33\xbc\xba\x89\x8a\x5e\x85\xd1\x22\x5a\x92\xc2\x70\xfb\x86\xcc\xdd\x3f\x90\xb7\x7d\xbc\x09\xae\x0e\xda\x7c\x92\xfd\x18\x7c\x9e\x09\x4d\x0a\x46\x95\x26\xaf\x5e\x92\x92\x8b\x46\x6f\x93\x1b\xff\x51\xa6\x95\x3f\xfc\x3e\xfa\xbb\x47\xe5\xd4\x4f\xbc\x6d\xa1\x34\x06\xff\xf6\x22\x99\xd5\x1b\x97\x00\x7c\x95\xe4\x42\xaf\x0a\x68\x81\xc3\x53\x3a\x36\x05\xcd\xf4\xde\xb0\xd8\xd6\x62\xcc\x8f\x8d\xbc\x59\xf6\x05\x29\xa6\x6d\xb8\xed\xb2\x5b\xdf\xec\xff\xd9\x87\xb8\xbd\x12\x49\xd4\xdc\xb0\xe6\xa0\xc7\x50\x73\x5a\x33\x5b\x39\xf9\x58\x79\x7b\x62\xdf\x7e\xbd\x31\x43\x40\xd0\xd0\x6b\x3f\x02\x57\x24\xf7\x8f\xbd\x2a\x83\x8b\xb1\xae\x19\xf3\x93\x03\x29\x03\x74\xf4\xce\x0e\x19\x19\xd5\x1f\xcd\x38\xc5\xb2\x4b\x63\x52\xb3\x19\x57\xba\xee\x53\xe3\x8e\x63\x10\x6f\x3c\x17\x35\xab\x65\x13\x51\x1e\x20\xfd\xb2\x41\xc7\x4e\xa1\xe1\x0c\x4b\xb6\x12\x76\x8c\xcb\x9f\x45\x83\xf6\x74\xa0\xb7\xde\xaf\x12\x2e\x4b\xcd\x68\xfe\xb5\x28\x22\xb4\xd2\xe9\x4b\x77\x7d\xa3\xac\x0a\xd4\x0e\xac\xf3\x00\x82\x0e\x40\x5d\x19\x76\x10\x83\xe1\x3e\xb0\x1c\x39\x3a\xf3\xf9\x18\xd2\x5f\x04\xda\xdc\x18\x9c\x11\x52\x8e\x29\x2d\x54\x74\x45\xfb\x38\xa9\xc9\x01\xe8\x7e\xb6\x0c\xfb\xee\xa2\x0b\xeb\x25\x2d\xeb\xd6\x2b\xda\x6d\xdf\x07\xf7\x81\x65\x18\x62\xa4\xe8\x96\x39\xa6\x81\xdd\x87\x2a\xc0\x40\xaf\xcd\xb5\x47\xc3\xeb\x89\x1f\x2d\x0c\x95\x73\x8e\xad\xf6\x94\x32\x59\x96\x34\xaa\xe0\x0f\x5a\x02\x29\x04\x67\x2b\x1b\x35\x21\x74\x4d\x8b\x76\xd5\x41\xd2\x8a\x5d\x02\xb9\x66\x82\x8a\x08\xa3\x7e\xfa\x79\x61\xcf\x44\xde\x79\xa7\xec\x19\x5f\x30\xb1\x0a\xdd\x56\x08\xf9\x82\x66\xb7\x2c\x2a\x7e\xf3\x1b\xe5\xf6\x37\x5f\x0a\x6a\x63\xea\x0c\x3a\x5b\x70\x73\x0d\x58\xbe\x32\x82\x1a\xb5\xfe\x44\x50\x43\x19\x43\x16\x91\xd1\xdc\xe5\x56\x36\x8a\x45\x24\xef\x48\xdf\x48\xd3\xef\xe3\xb1\xa4\x42\xfb\x4f\xcd\x17\x19\x73\x9c\xb3\xe9\x79\x97\x3b\x80\xb3\x4b\xdc\x03\x07\x07\xc1\x7d\xb3\xbe\xe9\xd6\x85\x01\x13\x16\x14\x06\xe7\x2d\x5d\x62\xa6\x55\x28\xb2\x85\xff\x63\xb1\x59\xef\x6a\xea\x9b\x1e\x72\x9c\x76\x8c\xf5\x4d\xde\x45\x5b\x1f\x68\x2e\x15\xf9\x02\x22\x2f\xde\x30\x10\x67\xf6\xc7\xf0\x7c\xf8\xe2\x4d\x0f\xb3\x63\xe6\xf7\x9c\x18\x1d\x5e\xd2\x59\x1f\xeb\x3c\x26\xa5\x14\x5c\xcb\xfa\x61\x7c\x18\xcf\xe7\x4c\x55\x9c\xdb\x73\xfa\x0d\xc6\x9e\x9d\x34\xd1\x26\x56\xf0\x7e\xcf\x81\x99\x10\x0e\x7d\x29\x1b\x72\x47\xb1\x78\x24\xc0\x45\x0c\x6d\xff\xc8\xab\xd7\xe4\x42\xa8\xa6\x0e\x22\x6e\x57\x07\x33\x48\xd0\x1d\xab\x43\x85\x00\x6c\x58\x35\x12\x0a\xbc\x61\xd2\x87\x88\x11\x2f\x3e\xd1\xb2\x2a\x98\x7a\x4d\x8e\xd8\x27\xfd\xfb\xa3\x11\x39\xfa\x34\x55\xe6\x7f\x42\x4f\xd5\xd1\x84\x5c\x96\x55\xc1\x33\xae\x8b\x25\xe1\x62\xca\xea\xda\x6b\xf5\xf1\x83\x15\x27\xa7\x98\x31\x13\x75\xec\x4a\xcb\x9a\xce\xd8\x0b\x4b\x0b\x7e\x59\xdf\xf4\xd3\x98\x04\x8c\x07\x80\xba\x0f\x90\x81\x8e\xbd\x82\x07\xb0\x05\x3e\x8a\xad\x6d\xb6\x61\x9f\x98\x3d\xae\xc9\xed\x9f\x60\xa7\xec\x9e\xbc\xa8\x6f\xf2\x17\x1f\x2e\xce\xde\xbc\xbb\x98\x94\xf9\x2f\xe7\xf2\x6e\xac\xe5\xb8\x51\x6c\x1c\xe1\xea\x9c\xb0\x57\xb7\x6c\x09\x39\x89\xf6\xb0\x5b\xb6\xeb\x8e\xbc\xae\x25\x98\x0b\xe0\xb9\x61\x9e\x3e\x7c\xf1\xe6\x1b\x15\xa7\x1f\x0c\x04\x8b\x17\x4c\x67\x2f\x32\x56\xcd\x5f\xd8\x31\x3e\xcf\xbd\x0f\x0c\x3c\x6b\x2b\xea\xf9\xd4\x61\xd9\x7d\x9c\x9b\xeb\x1b\xa9\x7f\x26\x8b\x02\xfd\xe2\x0d\x4e\x3c\x67\xd5\xdc\xbf\xf0\xec\x76\x3d\xce\x11\x2d\xda\xfd\xec\x30\x3a\x1c\x02\x39\xa7\x64\x84\xc1\x2e\xfd\x28\x4d\xbf\x5d\x7c\x05\x4f\x62\xd1\x55\x70\xe5\xea\x9b\x6d\x09\xc1\xf3\xb9\x64\xfd\x64\xe6\xc9\xb4\x0b\x1f\xdc\x8f\x8a\x69\xa0\xf7\x5c\x10\xcc\x51\xff\xce\x70\x1a\xfb\x52\x23\x1c\xf8\xc0\xe2\xf4\x15\xe8\x7a\x1e\x95\xe3\x34\xfd\x14\x7c\xe7\xc0\x55\x07\xbe\x18\xb4\xd1\x73\x26\xb4\x0b\x4f\xb4\xfe\xef\x21\x8d\x22\x97\x53\x94\x68\xf3\x28\x03\xb7\x5c\xb0\xba\xe6\x39\x53\x24\x81\x48\x85\xda\x33\x5e\x3c\xbb\x03\x8c\xb4\x38\xa7\x19\x83\xe3\xbd\x6f\xb6\x33\x1d\x3c\xc6\xe3\xe6\xd0\xbe\x36\x07\xf6\xb2\x79\x9c\x7f\xcd\xd3\x7a\xd6\x24\xdb\x89\x53\xbc\x69\x1e\xe3\x61\xb2\x57\x95\x53\x87\x98\xc3\x93\x2d\x88\x39\xcd\x4b\x1e\x15\xb2\xfc\xac\xc9\x39\xac\xe2\x81\xd7\x55\x46\x0b\x76\xf9\xf5\x2e\x55\x46\xb6\xcb\xae\xda\xe8\xda\x3e\xac\x58\xed\x72\x35\x38\x8d\xa0\xd6\x34\x9b\x5b\xd5\x8e\xb3\x15\x48\x01\xa1\x64\x08\x5b\x44\xc8\xbc\xdf\xb8\x1b\xea\x8d\xdc\x68\x0f\xeb\x8e\xdc\x44\x9f\x93\xfe\x68\x46\x35\xbb\xeb\xe5\xcf\xc7\x2d\x89\xee\x7f\x13\x94\x22\x9f\xb9\xa6\x29\x45\x9b\xe4\x5d\xfb\xd7\x7a\xd9\xa5\xfe\x68\x72\x8f\xe6\x28\x0d\xc9\xc0\xb7\x3b\xd3\xfd\x62\xf3\x77\xff\xd3\xb4\x8f\x48\x58\x68\x4b\x3c\x4f\xfb\x95\x3b\x2b\xd8\x44\x1b\xd7\xe9\x58\x08\x77\x01\xcf\xae\x2e\xc9\xdf\xf0\xf5\x9d\xae\xb2\xaa\xa5\x46\x81\xfb\x8d\x2c\x29\x8f\xf0\x4b\xec\xac\x60\xf5\x73\xb7\x94\x90\xd7\x75\x4b\xb8\xf2\xef\x12\xfb\xb2\xcb\xe6\x80\x35\xe2\x9b\x9a\xe5\xc4\x2a\xeb\x76\xba\xc6\x83\xc8\x59\x6b\xf2\x10\x39\x31\xbf\xbd\x80\x3c\xa9\xa7\x93\x56\xe6\x5a\x11\xc8\x62\x34\x03\x3b\x11\xd9\x9e\xa1\x50\x14\xd8\x77\x5c\x24\x66\x2b\x08\x39\xb0\x01\xb6\xc3\x7b\x17\x46\xf5\x2f\x14\x07\x37\x9d\xc0\x31\xd6\xe6\xb9\xe4\xaa\x0d\xb6\x44\xd9\x6a\x44\xbe\x92\x33\x2e\x1c\xf2\x92\xd6\xf1\x6c\x4a\x63\x04\xa2\x41\x4e\x19\xe4\x94\xd5\x36\xc8\x29\x1b\x9b\x52\xc5\x85\xa0\x37\x45\x8c\x4f\x78\xd7\xe9\xdd\x7f\x48\xde\x16\x74\x46\x18\xfc\xf1\x22\xe7\xca\xfc\x9f\x5c\x5f\x7f\x05\x5e\x16\x8d\x70\xca\x14\x80\x00\x4b\x2b\x7d\x49\x0b\xc4\xc9\xbb\x45\x92\x48\xaa\xde\x45\x05\x7b\x6e\x81\x26\xdb\xee\x7d\xbe\x6b\xd5\x09\x8c\xb0\x6f\x00\xb6\xa4\x3e\xec\x1b\x3d\xaf\x6f\x98\xb9\xa5\xd9\xed\x55\xe0\x14\x21\x6b\xf3\x4c\x04\x8f\x12\x99\xac\xe4\xaf\xb7\x63\xb7\x56\x86\x89\x3b\x86\xab\x74\xa5\x76\xf0\xa5\xe3\x5b\x1c\xd1\xb9\xb6\x5b\x0b\xbf\x51\xa5\x64\xc6\x5b\xa7\x1e\x9b\x2d\xcd\x31\x33\x39\x30\x33\x3b\xdd\x0c\xe4\x9f\x53\x97\x83\x0c\xfa\x06\x0e\xcc\x01\x8a\x7d\x83\xaa\x90\xe3\xe2\xc2\xad\x7a\xa7\x4b\x40\x70\x8c\xcb\x81\x92\x7e\x39\xda\xde\x57\xd7\xeb\x2f\xc2\xaa\xbb\x88\xcb\xaa\x60\x4f\x38\x42\x9a\xb3\x6b\x9e\x53\x54\x63\xac\x41\x01\x57\xfe\xd2\x41\x9d\x81\x9d\xed\x5f\x4c\x9a\x95\x44\x55\x02\xf2\x55\x5d\xbf\x39\x7c\x66\x5d\x4c\x00\x6b\x54\xb2\x6a\x0a\xf4\x7a\xf7\x8b\xeb\x5b\xd5\x23\xad\xf1\x38\x8b\xdd\x68\x07\xe2\x39\xac\x20\x12\x7b\x1f\xe0\x19\x06\x7a\xa7\xc7\xe3\x3b\x88\xc5\xc4\x7f\x37\x4b\xd7\x5d\x92\xcc\x7e\xc8\x70\xfc\x5d\x85\xdf\xc7\x68\x37\x3a\x01\xfa\x1d\xa9\xeb\xe5\x1f\x7e\xff\xfb\x28\x82\xc6\x6b\x96\x69\x09\x2e\x9b\x36\x81\x87\xf7\x18\xa0\x35\x03\xe9\x00\x63\xe5\x9d\x7e\x03\xdd\x06\x75\xa4\x55\xe5\x10\x91\xf9\x7b\x8e\xc4\x4f\x8b\xe9\x48\x89\xb4\x8f\x34\x87\x6f\xe1\x2d\x03\x19\x93\x2e\x0f\x96\x31\xe9\x40\x79\x92\x0e\x93\x1d\xe9\x10\x39\x91\x0e\x92\x09\xe9\x70\xf9\x8f\xf6\x9c\xf5\x68\x2f\x2e\x26\xfb\xcc\x6b\x94\x18\x24\x9c\x16\x20\x1c\x9f\xb9\x28\x3a\x8c\x38\x35\x84\x38\x21\x37\xd1\x6e\x33\x12\x25\x4b\xf4\x29\xd9\x87\xb6\x0d\x8f\x3b\x5c\xa6\xa1\x27\xcc\x2f\xf4\xd4\x59\x85\xf6\x9c\x4b\xe8\x70\x19\x84\x0e\x92\x37\x68\x9b\x38\xd4\xf4\x1c\x41\x29\xf1\xa7\xdb\x5e\xae\xbd\x67\x01\xda\x49\xee\x9f\x1d\x67\xfc\xd9\x5d\x9e\x9f\xc3\x39\x52\xc6\x67\x3f\x79\x74\xce\x13\x95\x9c\xf4\x24\xdd\xde\xb3\x2f\x65\x4d\xdb\xfb\x46\xe5\x94\x4b\x0c\xeb\x12\xbb\x1f\xa3\xab\x9c\xaa\x28\x96\x89\x6d\xb6\xf6\x2d\xdc\xb1\x1e\x82\x24\x68\x70\xb0\x77\xd9\xc3\x5c\x24\x2a\x71\xb0\xd3\xaf\xaf\x57\x3c\x42\xfc\xe3\x7d\x3a\x82\xf8\x41\x7a\x5c\x41\xdc\xc2\x0f\xe0\x0c\x32\x78\x5b\xec\xce\xdb\x62\xf7\x71\x3a\xcf\xcd\x40\x9f\x0f\x06\xfa\x64\x03\xbd\xea\x54\x91\x77\x0a\x63\x40\xc9\xc0\xd4\xca\x9b\xb0\xe2\x52\x8b\x23\xce\xae\x2e\x23\xc6\x69\xab\xc2\xa8\xc9\x26\x6e\xd7\x99\xee\x2c\x17\xed\x33\x9f\x6b\xcd\xca\xaa\x17\x8d\x90\xc1\x3e\x3f\xd8\xe7\x37\xb4\xc1\x3e\xbf\xb1\x1d\xda\x5e\x37\x6f\x4a\x2a\xa0\x62\x2a\x98\xf1\x3b\x0e\x63\x2b\x0c\xcd\x84\x58\x4c\x1a\x79\x2d\x31\x13\x03\xe4\xc6\x68\x04\xff\xb1\x61\xad\x3e\xcb\x33\x96\x7b\xb2\x75\x42\xdf\xfb\xdd\x40\xe4\x8b\x57\x30\x73\x26\xd7\xa2\x88\xed\x9a\xfd\x66\x3a\x14\x1b\xbb\x89\x30\x4c\x47\x45\x0b\xd5\x52\x6c\x59\x9c\x0e\x93\xde\xd1\x3f\x58\xf4\x03\x38\x21\x56\xcb\x1d\x72\xa6\x06\x10\xcc\x7a\x6c\x1a\xae\x1b\x46\x4a\x5e\xd7\xb2\xb6\x76\xd7\x70\x49\xe8\x40\xc8\x67\x73\xcd\x6a\x94\xfc\xeb\xe8\xfa\x58\xd7\x4c\x5b\xa8\x02\xa8\xd4\x12\x2a\xfa\x09\xfb\x6f\x17\x4e\x03\xcb\x75\x74\xe8\x86\xcd\xe9\x82\xcb\x26\x2a\x80\xf4\x1a\x29\xe5\x91\xfd\x18\xf8\xa7\xa5\x6c\xbc\x85\x09\xcb\x9e\xf9\x3d\x54\xeb\xe7\x15\x31\xc8\xfb\xf6\x73\x50\xd0\xe4\xd2\xa9\xcf\xc7\xec\x13\x57\x7a\x7d\xc7\xdc\x51\x59\x1b\xe3\xce\xae\xc1\x42\x55\x06\x8b\x7f\x1b\x91\xfe\x21\x0d\xf8\x3b\x1d\x77\x05\x9f\xc5\x35\xfc\xd4\x27\xf6\xd8\x8c\x70\x98\xc0\x85\x94\x34\x9b\x73\x91\x94\x3c\xe1\xdb\xce\x14\x3a\xf2\xcf\x84\x9c\x15\x45\xeb\x3b\xa8\xbc\x4b\xab\x93\x87\xba\xd3\xd7\xfd\x25\x82\x0d\x7c\xd4\x2c\x07\x1b\x65\x5b\x91\x30\x53\x7c\x62\xbb\x9a\x2c\xca\x3b\x5a\xb3\x49\x26\x4b\x72\x7e\x7d\x49\xf2\x9a\xf7\xe6\x3c\xdc\x83\x7f\x3d\x6e\x7a\x6f\xcd\xbe\xe7\x25\xa3\x0d\xf2\x59\xdb\x52\xdc\x91\x9c\xa3\x54\xc1\xb3\xe5\xe5\x9b\x6d\xdd\xac\xf0\x6b\xc7\x00\x28\xef\x62\x65\x9e\x93\x2f\xa8\x62\x39\x79\x47\x05\x9d\xa1\xfa\xf0\xe4\xfa\xea\x8b\x77\xa7\x06\x80\x40\xdd\x79\xf9\x66\xa3\x1f\xd6\x75\xd8\xf9\xfb\x5d\xe6\x7f\x59\x5b\xf8\x16\xbc\xd1\xda\xf7\x5b\x2e\x7e\xa7\x89\x6d\x88\x67\x27\xe2\x0a\x90\x6e\x48\xd5\x73\xb5\x9a\x19\x11\x9d\xa4\x5c\x4a\x56\xb5\x8a\x9a\x17\x65\x7e\xfb\xb8\xe9\x73\x23\x4d\x14\xc5\x55\x41\xc5\x59\x55\xd5\x72\xb1\x59\xeb\x1a\x83\x1c\xdc\xf7\x6e\x01\xe8\x60\xee\x1e\x56\x78\x22\xe0\x53\x29\x50\x88\xc1\x61\x37\xef\xff\xa5\xf6\x8a\x59\x29\x80\x05\x3b\x3a\x6b\xb4\x2c\xa9\xe6\xd9\x11\x91\x35\x39\x7a\x47\x45\x43\x8b\x8d\xb1\x29\x0f\xae\xf8\x3e\x01\xf3\xc1\x8f\xd0\x11\x6d\xcb\xcf\x1e\x64\x60\x1f\xfe\x5e\xd3\xda\xa0\xba\xf3\xeb\x6f\x93\xbe\x55\x9a\xea\x66\x8d\x32\x3c\x40\xad\xee\xa7\x4f\x63\x52\x50\xa5\xbf\xa9\x72\x83\x1f\x56\x7e\x7d\x88\x08\x65\x54\xd3\x42\xce\xfe\x8d\xd1\x62\xf3\x65\x88\x01\xa9\xf3\xb0\x93\xb6\x4a\x37\x20\xa8\xe6\xc6\x7f\x7f\xac\x88\x11\x25\x0d\x94\x70\xad\x48\xcd\x0a\xb6\xa0\x42\xbb\xcf\xaf\xe1\x14\xd4\xb1\xdd\x96\x7b\x01\x8e\xb7\x36\xd6\x9c\x69\x56\x97\x5c\x74\xc7\xb9\x86\xef\xcf\xa5\xc0\x2a\xc8\x0a\xad\x48\xf8\x45\x77\xac\xfb\xa1\xf2\x3e\xd7\x83\x07\x9c\x0d\x3a\x3b\x15\xce\xa7\xbb\x3d\xf8\xda\x8d\x15\x5d\xe6\xf8\x10\x3c\x37\x3b\x73\x5b\xdb\x3d\x72\x2b\x8c\x44\x01\x19\xce\x37\xef\x4d\x2f\x9b\xd3\xc7\xde\x8c\x1d\x38\xe0\x14\xee\x8f\x0a\x1c\xdb\x79\xdf\xe7\x94\xf0\x10\x34\x62\xeb\x67\x8c\x56\xa7\x72\x3f\xa6\xee\x6c\xfc\xf9\xca\x67\x98\x58\xc5\xfb\x36\xa1\x97\x47\xe7\xa5\xfb\x29\x4b\x14\xdf\x18\xc7\xe2\xd1\x8a\x7f\xcb\x6a\x65\xa6\x18\x2f\x1d\x9c\x5d\x5d\x92\x05\x7e\x95\xa6\x0b\x8b\x24\x85\xa0\x23\xeb\xa7\x82\x69\x2c\xe7\xa5\x0d\x6c\xaa\xad\x04\x4b\x49\xc5\x19\xe6\x56\xa7\xc2\x6e\x26\xd0\x33\x46\x73\xfb\xd0\xd0\xcd\x9a\xd9\xdf\x46\xd6\xe3\x30\x8a\x41\x41\xbf\x5d\x67\x83\xa5\x98\xf2\x1b\xbc\x11\x5e\xfc\x4d\x5a\x1d\xa0\x4d\x15\x68\xb0\x0a\x70\x17\x23\xa2\x9a\x6c\x4e\xa8\x11\x64\x94\xb9\x0e\x06\x5f\xb0\x49\x49\x05\x9f\x32\xa5\x27\xb6\x37\x56\xab\xef\x7e\xfb\x7d\x1f\xdb\xf1\x56\xd6\xc4\x46\x69\x8f\x5c\xe6\x6a\xbb\xc6\x16\xe6\xb8\xc2\x8d\xf0\x3d\xb7\x1a\x99\x4a\xe6\x76\xc1\x77\xb0\x14\x4d\x6f\x0d\x29\xc5\xa5\x34\x0c\xbc\x06\xfa\x78\x94\x23\xc3\xf6\x06\xd3\xfe\x6f\x43\x3b\xff\xe7\x88\x9c\xdc\x01\x13\x72\x64\xfe\x3c\xc2\xe9\xf8\x48\xb3\x50\xe1\xd4\x4e\x0b\x93\xa6\xd5\x7c\x36\x63\x75\xaf\x8d\xd5\x7c\xca\x16\x4c\xe8\x53\x9b\xb5\x5b\xc8\xa0\x2b\xe7\xe7\xd7\xea\x4f\x56\xa7\xf9\xdd\x6f\xbf\x3f\x22\x27\xdd\x3d\xe9\x19\x92\x8b\x9c\x7d\x22\xbf\x45\x6b\x29\x14\x17\xcf\x4f\x27\xa8\x70\x51\x4b\xa1\xe9\x27\x33\x62\x36\x97\x8a\x09\x54\x80\x69\x49\xe6\x74\xc1\x88\x92\x25\x23\x77\xac\x28\xc6\xd6\x7e\x4c\xee\xe8\xb2\x3f\x59\xb9\x3b\x42\x48\x81\x4a\x2a\x5a\xeb\x0e\x18\xef\xe4\x12\xde\x72\xb1\xd3\x4c\x8b\x5f\x72\xb1\xea\xd2\xd9\x2b\xe0\x6d\x50\x0a\xcf\xb8\x76\x59\x07\x6c\x7c\x91\x5e\xbe\x30\x87\x55\xf3\x9b\x46\xcb\x5a\xbd\xc8\xd9\x82\x15\x2f\x14\x9f\x8d\x69\x9d\xcd\xb9\x66\x99\x6e\x6a\xf6\xe2\xff\x63\xee\x7c\x7e\xdb\x06\xa1\x38\x7e\xdf\x5f\x81\xd4\x43\x2f\xf1\x7a\xdf\x4e\x5b\xd2\x6d\x91\xaa\x6d\x6a\x93\x49\x3b\x52\x9b\xa5\xa8\x8e\x1d\x81\xdd\x68\x9a\xf6\xbf\x4f\xf0\xc0\x86\xc4\xfc\x4a\x5c\x67\xb7\x36\xb6\x93\xc7\x03\xc3\xf7\x7d\x78\x00\xde\xd1\x2c\xaf\x2b\xd1\x30\xe4\x9e\xbc\xdb\xe2\x4a\x78\x82\x67\xa2\xa0\x7e\x4a\x1c\xe9\xb1\xf0\xdc\x43\x9a\xc7\x4e\x99\x6b\xb8\x0c\x46\x4f\x70\x50\x04\x8a\x4d\xf7\x12\xf0\xce\x8b\xbb\x4a\x22\xbf\x9b\x31\x3c\xc5\x08\x68\xff\xf4\xb1\x39\xe8\xaf\x07\xe8\xf8\xf2\xc3\xdf\x10\x7d\x12\x64\xfb\xca\x2e\xcc\x1a\x25\xb6\xb8\x80\x61\x04\x57\xc1\x75\xee\xaf\xfc\xce\x8a\xfa\x68\x99\xb0\xec\x77\x26\xbf\xa2\x2e\x33\x5c\x15\xe2\x6f\xd8\x78\x23\xf7\x67\xa4\x46\x56\x40\x4b\x47\xed\xfc\xd6\xcb\xc5\xe5\x9b\xe7\xcd\x55\x4b\xc7\xe8\xe9\x4e\x99\xcf\x52\xba\x3c\x52\x2c\x43\x48\x02\x19\xba\xac\x25\x5a\xc0\xd8\x81\x08\xe5\xfa\x5b\xdf\xab\xcc\x81\xee\xa0\x9b\x90\x74\xf6\xcf\xe6\x1b\x31\x42\xa4\xbd\x77\xfd\x13\x26\x0b\x97\x99\xff\x98\x37\xea\x28\x11\xbd\xf3\xab\x55\x0c\x1d\x9c\x3e\xe1\x6a\xe3\x91\x36\x51\x15\xa3\xf3\x26\x85\x21\xd9\xe0\x61\xee\x79\x17\x7c\x06\x63\x6a\x23\x4e\x95\xa1\x4a\x49\x79\x77\x9c\x86\x08\x5b\x79\x83\xf0\x0b\xa6\xa5\x9c\x27\xac\x1f\x39\x61\x2f\x0a\xb6\xc3\x61\x57\xf8\x30\xc6\x86\xd7\xb6\x01\xc1\x3b\x51\x84\xab\xcb\x70\x5c\x2b\xbe\x02\xc8\xa8\xf7\xc0\x7a\xa7\xd5\xa3\xc4\xb7\x80\x16\x9c\x97\x9d\x13\x14\xe1\x20\x4f\xb4\xbf\x2f\x04\xb3\xe6\x91\xe0\x66\x45\x7d\x0a\xe5\xa8\x49\x5b\xcf\x69\x2e\xd7\x37\xe8\x3d\x41\x9b\xba\x11\xb2\xb3\x95\x6d\x1f\xe2\x03\xd8\x4b\xbe\x6b\x68\xaf\xdd\xa2\xfb\x52\xae\x18\x96\x3b\x4c\xd4\x55\x62\x31\xed\x07\x8f\xcb\xa9\x62\x11\xd5\x92\x1a\xb8\x1b\xfd\x62\xf5\x56\xc2\x45\xa8\x3b\x98\xaa\xf4\x6f\x86\x31\x6a\x91\xb7\x84\x73\xef\x16\xc7\xf6\xb2\x12\xb8\x1b\x5e\xe5\x83\x49\xfe\xad\xbe\x06\xcb\xd9\x45\x50\x51\x90\x06\xd3\x52\xbf\xca\xe0\x8a\xce\x4b\xa1\xde\xd5\x5b\x40\x46\x30\xf7\x09\x1a\xcb\xea\x7b\x79\x33\x18\x5d\x57\x24\xdb\xd7\xac\x40\x73\xbc\x25\xe5\x1c\x73\xa2\xbe\xcb\xdc\xaf\x06\xea\xe8\x9a\x8f\x6a\xf2\x30\x0e\x75\x98\x0c\x90\xaf\x9f\x50\x90\xff\xf5\x01\x2d\x18\x38\xd3\x54\x7a\xc5\x5a\x32\x43\x9f\xc4\xe8\x35\x43\xeb\xea\xb9\xaa\xf7\xe7\xd9\xda\x78\x27\xeb\x2c\x4b\xcd\x0c\x49\xbd\xdd\xb9\x05\xf6\x3a\x73\x4f\xb4\x48\x75\xf8\x0e\xfa\x6c\x0f\x36\xdd\xad\xda\x22\xf1\xe7\x11\x6a\x14\xa1\x35\xab\x37\x8c\x70\x0e\x14\x27\x19\xdf\x1b\x13\x16\x9f\x49\xa5\xe6\x87\x83\xe6\x2d\x87\x9e\xd2\x96\xea\x71\x6d\xd3\x5f\x51\xf5\xad\x7e\x6c\x57\x0e\x4a\x0d\xff\xca\x08\xc3\x50\x07\x64\x74\x59\x38\x0c\x17\x8d\x51\xcf\xb8\x17\x44\x89\x8f\x8c\xeb\xd2\xcd\x1f\x7e\xb8\x9d\xed\x1c\xfb\x42\xe3\x53\x18\x3f\x9e\x0b\x1e\x83\xef\x4c\x10\x36\xc6\x2a\xfd\x69\x00\xe3\x25\xd1\xe2\x65\xa1\xe2\xe4\x38\x71\x52\x90\x38\x1d\x42\x3c\x11\x1e\x06\x5f\x24\x1f\x30\x8c\x7d\x87\xd2\x20\xe1\xc5\xf1\x60\xd0\x27\x3e\x24\x18\xeb\x93\x34\x0c\x38\x35\x00\x8c\x72\x81\x17\xfa\xa5\xf8\x21\x11\xf4\x4d\x8c\xf8\x82\xbe\x88\xc4\x7a\xb1\x1e\x79\x3d\x94\xf7\xdf\x42\xbc\xa0\x8b\x3d\xe0\x2e\xd6\xad\x49\xb0\x6e\x62\x4c\x17\x28\x7f\x1a\x9a\x53\x1a\x93\x14\x31\x12\x7d\x69\xdc\x6c\x8a\x74\x25\x10\x65\x02\x9c\xba\x43\x27\xdc\x99\x52\xf2\x54\xa5\x2e\xc4\xf3\xa9\xf9\x1f\xca\xe4\x78\x35\xac\x24\x3c\x29\xba\x98\x32\x54\x04\x84\x16\xb7\xdf\xef\x6f\xe7\x1f\x56\xb7\x8b\x43\x15\x9e\x2e\x97\xfd\xa0\x28\x33\xe4\xb2\xe3\x06\x31\x58\x39\x2e\x89\xb6\xe5\xb8\xd4\xb6\x74\xe8\xa9\xf3\xc5\xfb\x59\x9a\xe1\xac\xc1\x35\xdc\x4f\x8c\xd4\x51\xc8\xb6\x05\x59\xab\x42\x55\x3e\xd5\x65\xc1\xf5\xfa\x86\xe5\xa2\xdb\x88\x80\x56\x79\xd9\x16\x42\x72\xad\xd7\xcb\x05\x7f\x8b\xd0\x47\x92\xe3\x96\x0b\xe9\xe6\x0e\xd7\xeb\xea\xba\x41\xdf\xbe\xde\xfd\x94\x4b\xbb\xe4\x93\xb3\x6e\xbb\x54\x79\xf6\x1e\xc5\x70\x7c\xa0\x2c\xa8\xfc\x56\x90\x75\xd2\xa2\x1c\xef\x44\x0f\xec\x46\xfe\x14\x76\xaf\xc1\x55\x81\x9e\x48\xb9\x13\xa3\xc3\x33\x41\xfd\x39\x65\xe2\x07\xe5\x55\x58\xbf\xa1\xf2\xd8\x37\xa4\x81\x4d\x09\x7c\xa9\xea\xde\x0a\x08\x10\xf6\x33\xd8\xba\x85\x0b\x14\x7d\xd9\x63\xae\x08\xe5\xa0\xb5\x81\xa6\x12\xe6\x71\x6e\xa4\xe5\x80\x59\x30\xb2\xc8\xff\x8e\x6c\x16\xc6\xf6\xdc\x0a\x92\xc3\x68\x13\x4d\xcf\xdd\x99\x80\xc3\x27\x44\x1f\xb1\x2b\x72\xe8\x64\xeb\x87\xbb\xb5\x40\x86\xc9\x71\xb6\x70\xc2\x5e\x48\xf1\x4e\xce\xe7\xe8\x8f\x20\xdb\xd6\xfe\xac\x7d\xd4\x62\xc6\xe8\x75\x14\x81\x43\x7f\xfe\xbe\xf9\x17\x00\x00\xff\xff\xc4\xc9\x92\x01\x49\xa6\x03\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/catalog/main.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/catalog/main.go index b82f1689cb..4092bf8922 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/catalog/main.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/catalog/main.go @@ -57,9 +57,16 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error { o.catalogNamespace = catalogNamespaceEnvVarValue } + // create a config client for operator status + config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig) + if err != nil { + return fmt.Errorf("error configuring client: %s", err.Error()) + } + listenAndServe, err := server.GetListenAndServeFunc( server.WithLogger(logger), server.WithTLS(&o.tlsCertPath, &o.tlsKeyPath, &o.clientCAPath), + server.WithKubeConfig(config), server.WithDebug(o.debug), ) if err != nil { @@ -72,11 +79,6 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error { } }() - // create a config client for operator status - config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig) - if err != nil { - return fmt.Errorf("error configuring client: %s", err.Error()) - } configClient, err := configv1client.NewForConfig(config) if err != nil { return fmt.Errorf("error configuring client: %s", err.Error()) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go index ff6e7354e6..a5ea596910 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go @@ -123,7 +123,18 @@ func main() { } logger.Infof("log level %s", logger.Level) - listenAndServe, err := server.GetListenAndServeFunc(server.WithLogger(logger), server.WithTLS(tlsCertPath, tlsKeyPath, clientCAPath), server.WithDebug(*debug)) + mgr, err := Manager(ctx, *debug) + if err != nil { + logger.WithError(err).Fatal("error configuring controller manager") + } + config := mgr.GetConfig() + + listenAndServe, err := server.GetListenAndServeFunc( + server.WithLogger(logger), + server.WithTLS(tlsCertPath, tlsKeyPath, clientCAPath), + server.WithKubeConfig(config), + server.WithDebug(*debug), + ) if err != nil { logger.Fatalf("Error setting up health/metric/pprof service: %v", err) } @@ -134,12 +145,6 @@ func main() { } }() - mgr, err := Manager(ctx, *debug) - if err != nil { - logger.WithError(err).Fatal("error configuring controller manager") - } - config := mgr.GetConfig() - // create a config that validates we're creating objects with labels validatingConfig := validatingroundtripper.Wrap(config, mgr.GetScheme()) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index c26c3da927..24336fbd95 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -1654,12 +1654,6 @@ func (o *Operator) ensureInstallPlan(logger *logrus.Entry, namespace string, gen return nil, nil } - // Check if any existing installplans are creating the same resources - installPlans, err := o.listInstallPlans(namespace) - if err != nil { - return nil, err - } - // There are multiple(2) worker threads process the namespaceQueue. // Both worker can work at the same time when 2 separate updates are made for the namespace. // The following sequence causes 2 installplans are created for a subscription @@ -1680,6 +1674,13 @@ func (o *Operator) ensureInstallPlan(logger *logrus.Entry, namespace string, gen o.muInstallPlan.Lock() defer o.muInstallPlan.Unlock() + // Check if any existing installplans are creating the same resources + // This must be done inside the lock to prevent TOCTOU race condition + installPlans, err := o.listInstallPlans(namespace) + if err != nil { + return nil, err + } + for _, installPlan := range installPlans { if installPlan.Spec.Generation == gen { return reference.GetReference(installPlan) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go index 4fdf56e26b..c7aea05f44 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc/source.go @@ -163,7 +163,7 @@ func grpcConnection(address string) (*grpc.ClientConn, error) { })) } - return grpc.Dial(address, dialOptions...) + return grpc.NewClient(address, dialOptions...) } func (s *SourceStore) Add(key registry.CatalogKey, address string) (*SourceConn, error) { @@ -203,6 +203,11 @@ func (s *SourceStore) stateTimeout(state connectivity.State) time.Duration { func (s *SourceStore) watch(ctx context.Context, key registry.CatalogKey, source SourceConn) { state := source.ConnectionState + + // Make initial connection + source.Conn.Connect() + + // Periodically observe connection state change for { select { case <-ctx.Done(): diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go index a6b94264f7..67cb40108c 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go @@ -25,8 +25,8 @@ import ( //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_rolebinding_namespace_lister.go k8s.io/client-go/listers/rbac/v1.RoleBindingNamespaceLister //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../fakes/client-go/listers/fake_rbac_v1_clusterrolebinding_lister.go k8s.io/client-go/listers/rbac/v1.ClusterRoleBindingLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionLister -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionNamespaceLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionLister +//go:generate ../../../hack/scripts/run-counterfeiter.sh ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1 ClusterServiceVersionNamespaceLister // OperatorLister is a union of versioned informer listers // diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go index bb0b092d85..6b7fcab02e 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorstatus/status.go @@ -214,7 +214,7 @@ func MonitorClusterStatus(name string, syncCh <-chan error, stopCh <-chan struct log.Errorf("Failed to get related objects: %v", err) } if !reflect.DeepEqual(previousStatus.RelatedObjects, existing.Status.RelatedObjects) { - diffString := diff.ObjectDiff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) + diffString := diff.Diff(previousStatus.RelatedObjects, existing.Status.RelatedObjects) log.Debugf("Update required for related objects: %v", diffString) } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/server/server.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/server/server.go index 3d79a192e0..3fab132997 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/server/server.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/lib/server/server.go @@ -11,6 +11,9 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/profile" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/metrics/filters" ) // Option applies a configuration option to the given config. @@ -43,11 +46,18 @@ func WithDebug(debug bool) Option { } } +func WithKubeConfig(config *rest.Config) Option { + return func(sc *serverConfig) { + sc.kubeConfig = config + } +} + type serverConfig struct { logger *logrus.Logger tlsCertPath *string tlsKeyPath *string clientCAPath *string + kubeConfig *rest.Config debug bool } @@ -62,6 +72,7 @@ func defaultServerConfig() serverConfig { tlsCertPath: nil, tlsKeyPath: nil, clientCAPath: nil, + kubeConfig: nil, logger: nil, debug: false, } @@ -90,12 +101,53 @@ func (sc serverConfig) getListenAndServeFunc() (func() error, error) { } mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) profile.RegisterHandlers(mux, profile.WithTLS(tlsEnabled || !sc.debug)) + // Set up authenticated metrics endpoint if kubeConfig is provided + if sc.kubeConfig != nil && tlsEnabled { + sc.logger.Info("Setting up authenticated metrics endpoint") + // Create HTTP client with proper TLS configuration from kubeConfig + // This is necessary for TokenReview/SubjectAccessReview API calls to verify API server certificates + httpClient, err := rest.HTTPClientFor(sc.kubeConfig) + if err != nil { + return nil, fmt.Errorf("failed to create http client for authentication: %w", err) + } + // Create authentication filter using controller-runtime + filter, err := filters.WithAuthenticationAndAuthorization(sc.kubeConfig, httpClient) + if err != nil { + return nil, fmt.Errorf("failed to create authentication filter: %w", err) + } + // Create authenticated metrics handler + logger := log.FromContext(context.Background()) + authenticatedMetricsHandler, err := filter(logger, promhttp.Handler()) + if err != nil { + return nil, fmt.Errorf("failed to wrap metrics handler with authentication: %w", err) + } + // Add request logging for debugging if debug mode is enabled + if sc.debug { + debugAuthHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + sc.logger.Infof("Metrics request from %s, Auth header present: %v, User-Agent: %s", + r.RemoteAddr, r.Header.Get("Authorization") != "", r.Header.Get("User-Agent")) + authenticatedMetricsHandler.ServeHTTP(w, r) + }) + mux.Handle("/metrics", debugAuthHandler) + } else { + mux.Handle("/metrics", authenticatedMetricsHandler) + } + sc.logger.Info("Metrics endpoint configured with authentication and authorization") + } else { + // Fallback to unprotected metrics (for development/testing) + mux.Handle("/metrics", promhttp.Handler()) + if sc.kubeConfig == nil { + sc.logger.Warn("No Kubernetes config provided - metrics endpoint will be unprotected") + } else if !tlsEnabled { + sc.logger.Warn("TLS not enabled - metrics endpoint will be unprotected") + } + } + s := http.Server{ Handler: mux, Addr: sc.getAddress(tlsEnabled), @@ -141,6 +193,7 @@ func (sc serverConfig) getListenAndServeFunc() (func() error, error) { ClientAuth: tls.VerifyClientCertIfGiven, }, nil }, + NextProtos: []string{"http/1.1"}, // Disable HTTP/2 for security } return func() error { return s.ListenAndServeTLS("", "") diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go b/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go index 3569367ef2..ee2afeb419 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go @@ -22,6 +22,7 @@ const ( ConsoleLinkKind = "ConsoleLink" ConsolePlugin = "ConsolePlugin" NetworkPolicyKind = "NetworkPolicy" + PodMonitorKind = "PodMonitor" ) // Namespaced indicates whether the resource is namespace scoped (true) or cluster-scoped (false). @@ -51,6 +52,7 @@ var supportedResources = map[string]Namespaced{ ConsoleLinkKind: false, ConsolePlugin: false, NetworkPolicyKind: true, + PodMonitorKind: true, } // IsSupported checks if the object kind is OLM-supported and if it is namespaced diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index 7b762370e2..8f8dc65d38 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -220,7 +220,7 @@ func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) return extractSummary(o, f), nil case dto.MetricType_UNTYPED: return extractUntyped(o, f), nil - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: return extractHistogram(o, f), nil } return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) @@ -403,9 +403,13 @@ func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { infSeen = true } + v := q.GetCumulativeCountFloat() + if v <= 0 { + v = float64(q.GetCumulativeCount()) + } samples = append(samples, &model.Sample{ Metric: model.Metric(lset), - Value: model.SampleValue(q.GetCumulativeCount()), + Value: model.SampleValue(v), Timestamp: timestamp, }) } @@ -428,9 +432,13 @@ func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { } lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + v := m.Histogram.GetSampleCountFloat() + if v <= 0 { + v = float64(m.Histogram.GetSampleCount()) + } count := &model.Sample{ Metric: model.Metric(lset), - Value: model.SampleValue(m.Histogram.GetSampleCount()), + Value: model.SampleValue(v), Timestamp: timestamp, } samples = append(samples, count) diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 8dbf6d04ed..8c8bbaa624 100644 --- a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -208,6 +208,8 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E n, err = w.WriteString(" unknown\n") case dto.MetricType_HISTOGRAM: n, err = w.WriteString(" histogram\n") + case dto.MetricType_GAUGE_HISTOGRAM: + n, err = w.WriteString(" gaugehistogram\n") default: return written, fmt.Errorf("unknown metric type %s", metricType.String()) } @@ -325,7 +327,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E createdTsBytesWritten, err = writeOpenMetricsCreated(w, compliantName, "", metric, "", 0, metric.Summary.GetCreatedTimestamp()) n += createdTsBytesWritten } - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: if metric.Histogram == nil { return written, fmt.Errorf( "expected histogram in metric %s %s", compliantName, metric, @@ -333,6 +335,12 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E } infSeen := false for _, b := range metric.Histogram.Bucket { + if b.GetCumulativeCountFloat() > 0 { + return written, fmt.Errorf( + "OpenMetrics v1.0 does not support float histogram %s %s", + compliantName, metric, + ) + } n, err = writeOpenMetricsSample( w, compliantName, "_bucket", metric, model.BucketLabel, b.GetUpperBound(), @@ -354,6 +362,9 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E 0, metric.Histogram.GetSampleCount(), true, nil, ) + // We do not check for a float sample count here + // because we will check for it below (and error + // out if needed). written += n if err != nil { return @@ -368,6 +379,12 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...E if err != nil { return } + if metric.Histogram.GetSampleCountFloat() > 0 { + return written, fmt.Errorf( + "OpenMetrics v1.0 does not support float histogram %s %s", + compliantName, metric, + ) + } n, err = writeOpenMetricsSample( w, compliantName, "_count", metric, "", 0, 0, metric.Histogram.GetSampleCount(), true, diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go index c4e9c1bbc3..7e1d23cabc 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -151,7 +151,10 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e n, err = w.WriteString(" summary\n") case dto.MetricType_UNTYPED: n, err = w.WriteString(" untyped\n") - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: + // The classic Prometheus text format has no notion of a gauge + // histogram. We render a gauge histogram in the same way as a + // regular histogram. n, err = w.WriteString(" histogram\n") default: return written, fmt.Errorf("unknown metric type %s", metricType.String()) @@ -223,7 +226,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e w, name, "_count", metric, "", 0, float64(metric.Summary.GetSampleCount()), ) - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: if metric.Histogram == nil { return written, fmt.Errorf( "expected histogram in metric %s %s", name, metric, @@ -231,10 +234,14 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e } infSeen := false for _, b := range metric.Histogram.Bucket { + v := b.GetCumulativeCountFloat() + if v == 0 { + v = float64(b.GetCumulativeCount()) + } n, err = writeSample( w, name, "_bucket", metric, model.BucketLabel, b.GetUpperBound(), - float64(b.GetCumulativeCount()), + v, ) written += n if err != nil { @@ -245,10 +252,14 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e } } if !infSeen { + v := metric.Histogram.GetSampleCountFloat() + if v == 0 { + v = float64(metric.Histogram.GetSampleCount()) + } n, err = writeSample( w, name, "_bucket", metric, model.BucketLabel, math.Inf(+1), - float64(metric.Histogram.GetSampleCount()), + v, ) written += n if err != nil { @@ -263,10 +274,11 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e if err != nil { return } - n, err = writeSample( - w, name, "_count", metric, "", 0, - float64(metric.Histogram.GetSampleCount()), - ) + v := metric.Histogram.GetSampleCountFloat() + if v == 0 { + v = float64(metric.Histogram.GetSampleCount()) + } + n, err = writeSample(w, name, "_count", metric, "", 0, v) default: return written, fmt.Errorf( "unexpected type in metric %s %s", name, metric, diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go index 8f2edde324..00c8841a10 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -48,8 +48,10 @@ func (e ParseError) Error() string { return fmt.Sprintf("text format parsing error in line %d: %s", e.Line, e.Msg) } -// TextParser is used to parse the simple and flat text-based exchange format. Its -// zero value is ready to use. +// TextParser is used to parse the simple and flat text-based exchange format. +// +// TextParser instances must be created with NewTextParser, the zero value of +// TextParser is invalid. type TextParser struct { metricFamiliesByName map[string]*dto.MetricFamily buf *bufio.Reader // Where the parsed input is read through. @@ -129,9 +131,44 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF if p.err != nil && errors.Is(p.err, io.EOF) { p.parseError("unexpected end of input stream") } + for _, histogramMetric := range p.histograms { + normalizeHistogram(histogramMetric.GetHistogram()) + } return p.metricFamiliesByName, p.err } +// normalizeHistogram makes sure that all the buckets and the count in each +// histogram is either completely float or completely integer. +func normalizeHistogram(histogram *dto.Histogram) { + if histogram == nil { + return + } + anyFloats := false + if histogram.GetSampleCountFloat() != 0 { + anyFloats = true + } else { + for _, b := range histogram.GetBucket() { + if b.GetCumulativeCountFloat() != 0 { + anyFloats = true + break + } + } + } + if !anyFloats { + return + } + if histogram.GetSampleCountFloat() == 0 { + histogram.SampleCountFloat = proto.Float64(float64(histogram.GetSampleCount())) + histogram.SampleCount = nil + } + for _, b := range histogram.GetBucket() { + if b.GetCumulativeCountFloat() == 0 { + b.CumulativeCountFloat = proto.Float64(float64(b.GetCumulativeCount())) + b.CumulativeCount = nil + } + } +} + func (p *TextParser) reset(in io.Reader) { p.metricFamiliesByName = map[string]*dto.MetricFamily{} p.currentLabelPairs = nil @@ -281,7 +318,9 @@ func (p *TextParser) readingLabels() stateFn { // Summaries/histograms are special. We have to reset the // currentLabels map, currentQuantile and currentBucket before starting to // read labels. - if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentMF.GetType() == dto.MetricType_SUMMARY || + p.currentMF.GetType() == dto.MetricType_HISTOGRAM || + p.currentMF.GetType() == dto.MetricType_GAUGE_HISTOGRAM { p.currentLabels = map[string]string{} p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() p.currentQuantile = math.NaN() @@ -374,7 +413,9 @@ func (p *TextParser) startLabelName() stateFn { // Special summary/histogram treatment. Don't add 'quantile' and 'le' // labels to 'real' labels. if (p.currentMF.GetType() != dto.MetricType_SUMMARY || p.currentLabelPair.GetName() != model.QuantileLabel) && - (p.currentMF.GetType() != dto.MetricType_HISTOGRAM || p.currentLabelPair.GetName() != model.BucketLabel) { + ((p.currentMF.GetType() != dto.MetricType_HISTOGRAM && + p.currentMF.GetType() != dto.MetricType_GAUGE_HISTOGRAM) || + p.currentLabelPair.GetName() != model.BucketLabel) { p.currentLabelPairs = append(p.currentLabelPairs, p.currentLabelPair) } // Check for duplicate label names. @@ -425,7 +466,7 @@ func (p *TextParser) startLabelValue() stateFn { } } // Similar special treatment of histograms. - if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM || p.currentMF.GetType() == dto.MetricType_GAUGE_HISTOGRAM { if p.currentLabelPair.GetName() == model.BucketLabel { if p.currentBucket, p.err = parseFloat(p.currentLabelPair.GetValue()); p.err != nil { // Create a more helpful error message. @@ -476,7 +517,7 @@ func (p *TextParser) readingValue() stateFn { p.summaries[signature] = p.currentMetric p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) } - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: signature := model.LabelsToSignature(p.currentLabels) if histogram := p.histograms[signature]; histogram != nil { p.currentMetric = histogram @@ -522,24 +563,38 @@ func (p *TextParser) readingValue() stateFn { }, ) } - case dto.MetricType_HISTOGRAM: + case dto.MetricType_HISTOGRAM, dto.MetricType_GAUGE_HISTOGRAM: // *sigh* if p.currentMetric.Histogram == nil { p.currentMetric.Histogram = &dto.Histogram{} } switch { case p.currentIsHistogramCount: - p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + if uintValue := uint64(value); value == float64(uintValue) { + p.currentMetric.Histogram.SampleCount = proto.Uint64(uintValue) + } else { + if value < 0 { + p.parseError(fmt.Sprintf("negative count for histogram %q", p.currentMF.GetName())) + return nil + } + p.currentMetric.Histogram.SampleCountFloat = proto.Float64(value) + } case p.currentIsHistogramSum: p.currentMetric.Histogram.SampleSum = proto.Float64(value) case !math.IsNaN(p.currentBucket): - p.currentMetric.Histogram.Bucket = append( - p.currentMetric.Histogram.Bucket, - &dto.Bucket{ - UpperBound: proto.Float64(p.currentBucket), - CumulativeCount: proto.Uint64(uint64(value)), - }, - ) + b := &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + } + if uintValue := uint64(value); value == float64(uintValue) { + b.CumulativeCount = proto.Uint64(uintValue) + } else { + if value < 0 { + p.parseError(fmt.Sprintf("negative bucket population for histogram %q", p.currentMF.GetName())) + return nil + } + b.CumulativeCountFloat = proto.Float64(value) + } + p.currentMetric.Histogram.Bucket = append(p.currentMetric.Histogram.Bucket, b) } default: p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) @@ -602,10 +657,18 @@ func (p *TextParser) readingType() stateFn { if p.readTokenUntilNewline(false); p.err != nil { return nil // Unexpected end of input. } - metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + typ := strings.ToUpper(p.currentToken.String()) // Tolerate any combination of upper and lower case. + metricType, ok := dto.MetricType_value[typ] // Tolerate "gauge_histogram" (not originally part of the text format). if !ok { - p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) - return nil + // We also want to tolerate "gaugehistogram" to mark a gauge + // histogram, because that string is used in OpenMetrics. Note, + // however, that gauge histograms do not officially exist in the + // classic text format. + if typ != "GAUGEHISTOGRAM" { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + metricType = int32(dto.MetricType_GAUGE_HISTOGRAM) } p.currentMF.Type = dto.MetricType(metricType).Enum() return p.startOfLine @@ -855,7 +918,8 @@ func (p *TextParser) setOrCreateCurrentMF() { } histogramName := histogramMetricName(name) if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { - if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM || + p.currentMF.GetType() == dto.MetricType_GAUGE_HISTOGRAM { if isCount(name) { p.currentIsHistogramCount = true } diff --git a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go index 16affcd62c..37374c5a71 100644 --- a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go @@ -232,29 +232,30 @@ func init() { func init() { proto.RegisterFile("auth.proto", fileDescriptor_8bbd6f3875b0e874) } var fileDescriptor_8bbd6f3875b0e874 = []byte{ - // 338 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4e, 0xea, 0x40, - 0x14, 0xc6, 0x3b, 0xb4, 0x70, 0xdb, 0xc3, 0x85, 0x90, 0x13, 0x72, 0x6f, 0x83, 0x49, 0x6d, 0xba, - 0x6a, 0x5c, 0x54, 0x85, 0x8d, 0x5b, 0x8c, 0x2c, 0x5c, 0x49, 0x26, 0x18, 0x97, 0xa4, 0xa4, 0x13, - 0x24, 0xc0, 0x4c, 0x33, 0x83, 0x31, 0x6c, 0x7c, 0x0e, 0x17, 0x3e, 0x10, 0x4b, 0x1e, 0x41, 0xf0, - 0x45, 0x4c, 0x67, 0xf8, 0x13, 0xa2, 0xbb, 0xef, 0x7c, 0xe7, 0xfb, 0x66, 0x7e, 0x99, 0x01, 0x48, - 0x5f, 0x16, 0xcf, 0x49, 0x2e, 0xc5, 0x42, 0x60, 0xa5, 0xd0, 0xf9, 0xa8, 0xd5, 0x1c, 0x8b, 0xb1, - 0xd0, 0xd6, 0x65, 0xa1, 0xcc, 0x36, 0xba, 0x86, 0xfa, 0xa3, 0x62, 0xb2, 0x9b, 0x65, 0x0f, 0xf9, - 0x62, 0x22, 0xb8, 0xc2, 0x73, 0xa8, 0x72, 0x31, 0xcc, 0x53, 0xa5, 0x5e, 0x85, 0xcc, 0x7c, 0x12, - 0x92, 0xd8, 0xa5, 0xc0, 0x45, 0x7f, 0xe7, 0x44, 0x6f, 0xe0, 0x14, 0x15, 0x44, 0x70, 0x78, 0x3a, - 0x67, 0x3a, 0xf1, 0x97, 0x6a, 0x8d, 0x2d, 0x70, 0x0f, 0xcd, 0x92, 0xf6, 0x0f, 0x33, 0x36, 0xa1, - 0x2c, 0xc5, 0x8c, 0x29, 0xdf, 0x0e, 0xed, 0xd8, 0xa3, 0x66, 0xc0, 0x2b, 0xf8, 0x23, 0xcc, 0xcd, - 0xbe, 0x13, 0x92, 0xb8, 0xda, 0xfe, 0x97, 0x18, 0xe0, 0xe4, 0x94, 0x8b, 0xee, 0x63, 0xd1, 0x07, - 0x01, 0xe8, 0x33, 0x39, 0x9f, 0x28, 0x35, 0x11, 0x1c, 0x3b, 0xe0, 0xe6, 0x4c, 0xce, 0x07, 0xcb, - 0xdc, 0xa0, 0xd4, 0xdb, 0xff, 0xf7, 0x27, 0x1c, 0x53, 0x49, 0xb1, 0xa6, 0x87, 0x20, 0x36, 0xc0, - 0x9e, 0xb2, 0xe5, 0x0e, 0xb1, 0x90, 0x78, 0x06, 0x9e, 0x4c, 0xf9, 0x98, 0x0d, 0x19, 0xcf, 0x7c, - 0xdb, 0xa0, 0x6b, 0xa3, 0xc7, 0xb3, 0xe8, 0x02, 0x1c, 0x5d, 0x73, 0xc1, 0xa1, 0xbd, 0xee, 0x5d, - 0xc3, 0x42, 0x0f, 0xca, 0x4f, 0xf4, 0x7e, 0xd0, 0x6b, 0x10, 0xac, 0x81, 0x57, 0x98, 0x66, 0x2c, - 0x45, 0x03, 0x70, 0xa8, 0x98, 0xb1, 0x5f, 0x9f, 0xe7, 0x06, 0x6a, 0x53, 0xb6, 0x3c, 0x62, 0xf9, - 0xa5, 0xd0, 0x8e, 0xab, 0x6d, 0xfc, 0x09, 0x4c, 0x4f, 0x83, 0xb7, 0xfe, 0x6a, 0x13, 0x58, 0xeb, - 0x4d, 0x60, 0xad, 0xb6, 0x01, 0x59, 0x6f, 0x03, 0xf2, 0xb9, 0x0d, 0xc8, 0xfb, 0x57, 0x60, 0x8d, - 0x2a, 0xfa, 0x23, 0x3b, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x61, 0x66, 0xc6, 0x9d, 0xf4, 0x01, - 0x00, 0x00, + // 359 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4e, 0xc2, 0x40, + 0x10, 0xc6, 0xbb, 0xb4, 0x60, 0x3b, 0x08, 0x21, 0x1b, 0xa2, 0x0d, 0xc6, 0xda, 0xf4, 0xd4, 0x78, + 0x68, 0x15, 0x0e, 0x7a, 0xc5, 0xc8, 0xc1, 0x93, 0x64, 0x83, 0x31, 0xf1, 0x42, 0x8a, 0xdd, 0xd4, + 0x06, 0xd8, 0x6d, 0xda, 0xaa, 0xe1, 0xe2, 0x73, 0x78, 0xf0, 0x81, 0x38, 0xf2, 0x08, 0x82, 0x2f, + 0x62, 0xba, 0xcb, 0x9f, 0x10, 0x3d, 0xed, 0x37, 0xdf, 0x7c, 0x33, 0xfb, 0xcb, 0x2e, 0x40, 0xf0, + 0x9a, 0xbf, 0x78, 0x49, 0xca, 0x73, 0x8e, 0x2b, 0x85, 0x4e, 0x46, 0xad, 0x66, 0xc4, 0x23, 0x2e, + 0x2c, 0xbf, 0x50, 0xb2, 0xeb, 0x5c, 0x42, 0xfd, 0x21, 0xa3, 0x69, 0x37, 0x0c, 0xef, 0x93, 0x3c, + 0xe6, 0x2c, 0xc3, 0x67, 0x50, 0x65, 0x7c, 0x98, 0x04, 0x59, 0xf6, 0xce, 0xd3, 0xd0, 0x44, 0x36, + 0x72, 0x75, 0x02, 0x8c, 0xf7, 0xd7, 0x8e, 0xf3, 0x01, 0x5a, 0x31, 0x82, 0x31, 0x68, 0x2c, 0x98, + 0x52, 0x91, 0x38, 0x24, 0x42, 0xe3, 0x16, 0xe8, 0xdb, 0xc9, 0x92, 0xf0, 0xb7, 0x35, 0x6e, 0x42, + 0x39, 0xe5, 0x13, 0x9a, 0x99, 0xaa, 0xad, 0xba, 0x06, 0x91, 0x05, 0xbe, 0x80, 0x03, 0x2e, 0x6f, + 0x36, 0x35, 0x1b, 0xb9, 0xd5, 0xf6, 0x91, 0x27, 0x81, 0xbd, 0x7d, 0x2e, 0xb2, 0x89, 0x39, 0x5f, + 0x08, 0xa0, 0x4f, 0xd3, 0x69, 0x9c, 0x65, 0x31, 0x67, 0xb8, 0x03, 0x7a, 0x42, 0xd3, 0xe9, 0x60, + 0x96, 0x48, 0x94, 0x7a, 0xfb, 0x78, 0xb3, 0x61, 0x97, 0xf2, 0x8a, 0x36, 0xd9, 0x06, 0x71, 0x03, + 0xd4, 0x31, 0x9d, 0xad, 0x11, 0x0b, 0x89, 0x4f, 0xc0, 0x48, 0x03, 0x16, 0xd1, 0x21, 0x65, 0xa1, + 0xa9, 0x4a, 0x74, 0x61, 0xf4, 0x58, 0xe8, 0x9c, 0x83, 0x26, 0xc6, 0x74, 0xd0, 0x48, 0xaf, 0x7b, + 0xdb, 0x50, 0xb0, 0x01, 0xe5, 0x47, 0x72, 0x37, 0xe8, 0x35, 0x10, 0xae, 0x81, 0x51, 0x98, 0xb2, + 0x2c, 0x39, 0x03, 0xd0, 0x08, 0x9f, 0xd0, 0x7f, 0x9f, 0xe7, 0x1a, 0x6a, 0x63, 0x3a, 0xdb, 0x61, + 0x99, 0x25, 0x5b, 0x75, 0xab, 0x6d, 0xfc, 0x17, 0x98, 0xec, 0x07, 0x6f, 0xae, 0xe6, 0x4b, 0x4b, + 0x59, 0x2c, 0x2d, 0x65, 0xbe, 0xb2, 0xd0, 0x62, 0x65, 0xa1, 0xef, 0x95, 0x85, 0x3e, 0x7f, 0x2c, + 0xe5, 0xe9, 0x34, 0xe2, 0x1e, 0xcd, 0x9f, 0x43, 0x2f, 0xe6, 0x7e, 0x71, 0xfa, 0x41, 0x12, 0xfb, + 0x6f, 0x1d, 0x5f, 0xae, 0x1c, 0x55, 0xc4, 0x3f, 0x77, 0x7e, 0x03, 0x00, 0x00, 0xff, 0xff, 0x61, + 0x5a, 0xfe, 0x48, 0x13, 0x02, 0x00, 0x00, } func (m *UserAddOptions) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto index 8f82b7cf1e..5a7856bb73 100644 --- a/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto +++ b/vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto @@ -3,6 +3,8 @@ package authpb; import "gogoproto/gogo.proto"; +option go_package = "go.etcd.io/etcd/api/v3/authpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go index 38434d09c5..eaefa2d208 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go @@ -129,31 +129,33 @@ func init() { func init() { proto.RegisterFile("etcdserver.proto", fileDescriptor_09ffbeb3bebbce7e) } var fileDescriptor_09ffbeb3bebbce7e = []byte{ - // 380 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd2, 0xdd, 0x6e, 0xda, 0x30, - 0x14, 0x07, 0x70, 0x0c, 0xe1, 0xcb, 0x63, 0x1b, 0xb3, 0xd0, 0x74, 0x84, 0xa6, 0x2c, 0x42, 0xbb, - 0xc8, 0xd5, 0xf6, 0x0e, 0x2c, 0x5c, 0x44, 0x2a, 0x15, 0x0d, 0x15, 0xbd, 0x76, 0xc9, 0x29, 0x58, - 0x02, 0x4c, 0x1d, 0x07, 0xf1, 0x06, 0x7d, 0x85, 0x3e, 0x12, 0x97, 0x7d, 0x82, 0xaa, 0xa5, 0x2f, - 0x52, 0x39, 0x24, 0xc4, 0xed, 0x5d, 0xf4, 0xfb, 0x9f, 0x1c, 0x1f, 0x7f, 0xd0, 0x2e, 0xea, 0x79, - 0x9c, 0xa0, 0xda, 0xa1, 0xfa, 0xbb, 0x55, 0x52, 0x4b, 0xd6, 0x29, 0x65, 0x7b, 0xdb, 0xef, 0x2d, - 0xe4, 0x42, 0x66, 0xc1, 0x3f, 0xf3, 0x75, 0xaa, 0x19, 0x3c, 0x38, 0xb4, 0x19, 0xe1, 0x7d, 0x8a, - 0x89, 0x66, 0x3d, 0x5a, 0x0d, 0x03, 0x20, 0x1e, 0xf1, 0x9d, 0xa1, 0x73, 0x78, 0xfe, 0x5d, 0x89, - 0xaa, 0x61, 0xc0, 0x7e, 0xd1, 0xc6, 0x18, 0xf5, 0x52, 0xc6, 0x50, 0xf5, 0x88, 0xdf, 0xce, 0x93, - 0xdc, 0x18, 0x50, 0x67, 0xc2, 0xf5, 0x12, 0x6a, 0x56, 0x96, 0x09, 0xfb, 0x49, 0x6b, 0x33, 0xbe, - 0x02, 0xc7, 0x0a, 0x0c, 0x18, 0x0f, 0x84, 0x82, 0xba, 0x47, 0xfc, 0x56, 0xe1, 0x81, 0x50, 0x6c, - 0x40, 0xdb, 0x13, 0x85, 0xbb, 0x19, 0x5f, 0xa5, 0x08, 0x0d, 0xeb, 0xaf, 0x92, 0x8b, 0x9a, 0x70, - 0x13, 0xe3, 0x1e, 0x9a, 0xd6, 0xa0, 0x25, 0x17, 0x35, 0xa3, 0xbd, 0x48, 0x34, 0xb4, 0xce, 0xab, - 0x90, 0xa8, 0x64, 0xf6, 0x87, 0xd2, 0xd1, 0x7e, 0x2b, 0x14, 0xd7, 0x42, 0x6e, 0xa0, 0xed, 0x11, - 0xbf, 0x96, 0x37, 0xb2, 0xdc, 0xec, 0xed, 0x86, 0x0b, 0x0d, 0xd4, 0x1a, 0x35, 0x13, 0xd6, 0xa7, - 0xf5, 0xa9, 0xd8, 0xcc, 0x11, 0xbe, 0x58, 0x33, 0x9c, 0xc8, 0xac, 0x1f, 0xe1, 0x3c, 0x55, 0x89, - 0xd8, 0x21, 0x74, 0xac, 0x5f, 0x4b, 0x36, 0x67, 0x3a, 0x95, 0x4a, 0x63, 0x0c, 0x5f, 0xad, 0x82, - 0xdc, 0x4c, 0x7a, 0x95, 0x4a, 0x95, 0xae, 0xe1, 0x9b, 0x9d, 0x9e, 0xcc, 0x4c, 0x75, 0x2d, 0xd6, - 0x08, 0xdf, 0xad, 0xa9, 0x33, 0xc9, 0xba, 0x6a, 0x85, 0x7c, 0x0d, 0xdd, 0x0f, 0x5d, 0x33, 0x63, - 0xae, 0xb9, 0xe8, 0x3b, 0x85, 0xc9, 0x12, 0x7e, 0x58, 0xa7, 0x52, 0xe0, 0xe0, 0x82, 0xb6, 0xc6, - 0xa8, 0x79, 0xcc, 0x35, 0x37, 0x9d, 0x2e, 0x65, 0x8c, 0x9f, 0x5e, 0x43, 0x6e, 0x66, 0x87, 0xff, - 0x57, 0x69, 0xa2, 0x51, 0x85, 0x41, 0xf6, 0x28, 0xce, 0xb7, 0x70, 0xe6, 0x61, 0xef, 0xf0, 0xea, - 0x56, 0x0e, 0x47, 0x97, 0x3c, 0x1d, 0x5d, 0xf2, 0x72, 0x74, 0xc9, 0xe3, 0x9b, 0x5b, 0x79, 0x0f, - 0x00, 0x00, 0xff, 0xff, 0xee, 0x40, 0xba, 0xd6, 0xa4, 0x02, 0x00, 0x00, + // 402 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd2, 0x41, 0xef, 0xd2, 0x30, + 0x14, 0x00, 0x70, 0x0a, 0xfb, 0xff, 0x81, 0x8a, 0x8a, 0x0d, 0x31, 0x2f, 0xc4, 0xcc, 0x05, 0x3d, + 0xec, 0xc4, 0x0e, 0x9e, 0xbc, 0xe2, 0x38, 0x2c, 0x11, 0x83, 0xc3, 0x60, 0xe2, 0xad, 0xb2, 0x27, + 0x34, 0x01, 0x3a, 0xbb, 0x6e, 0xe1, 0x1b, 0xf8, 0x15, 0xfc, 0x48, 0x1c, 0xfd, 0x04, 0x46, 0xf1, + 0x8b, 0x98, 0x8e, 0x8d, 0x55, 0x4f, 0x5b, 0x7e, 0xef, 0xf5, 0xf5, 0xb5, 0x7d, 0x74, 0x88, 0x7a, + 0x93, 0x64, 0xa8, 0x0a, 0x54, 0xd3, 0x54, 0x49, 0x2d, 0xd9, 0xa0, 0x91, 0xf4, 0xf3, 0x78, 0xb4, + 0x95, 0x5b, 0x59, 0x06, 0x02, 0xf3, 0x77, 0xcd, 0x99, 0x7c, 0x73, 0x68, 0x37, 0xc6, 0xaf, 0x39, + 0x66, 0x9a, 0x8d, 0x68, 0x3b, 0x0a, 0x81, 0x78, 0xc4, 0x77, 0x66, 0xce, 0xf9, 0xe7, 0xf3, 0x56, + 0xdc, 0x8e, 0x42, 0xf6, 0x8c, 0xde, 0x2f, 0x50, 0xef, 0x64, 0x02, 0x6d, 0x8f, 0xf8, 0xfd, 0x2a, + 0x52, 0x19, 0x03, 0xea, 0x2c, 0xb9, 0xde, 0x41, 0xc7, 0x8a, 0x95, 0xc2, 0x9e, 0xd2, 0xce, 0x9a, + 0xef, 0xc1, 0xb1, 0x02, 0x06, 0x8c, 0x87, 0x42, 0xc1, 0x9d, 0x47, 0xfc, 0x5e, 0xed, 0xa1, 0x50, + 0x6c, 0x42, 0xfb, 0x4b, 0x85, 0xc5, 0x9a, 0xef, 0x73, 0x84, 0x7b, 0x6b, 0x55, 0xc3, 0x75, 0x4e, + 0x74, 0x4c, 0xf0, 0x04, 0x5d, 0xab, 0xd1, 0x86, 0xeb, 0x9c, 0xf9, 0x49, 0x64, 0x1a, 0x7a, 0xb7, + 0x5d, 0x48, 0xdc, 0x30, 0x7b, 0x49, 0xe9, 0xfc, 0x94, 0x0a, 0xc5, 0xb5, 0x90, 0x47, 0xe8, 0x7b, + 0xc4, 0xef, 0x54, 0x85, 0x2c, 0x37, 0x67, 0xfb, 0xc8, 0x85, 0x06, 0x6a, 0xb5, 0x5a, 0x0a, 0x1b, + 0xd3, 0xbb, 0x95, 0x38, 0x6e, 0x10, 0x1e, 0x58, 0x3d, 0x5c, 0xc9, 0xec, 0x1f, 0xe3, 0x26, 0x57, + 0x99, 0x28, 0x10, 0x06, 0xd6, 0xd2, 0x86, 0xcd, 0x9d, 0xae, 0xa4, 0xd2, 0x98, 0xc0, 0x43, 0x2b, + 0xa1, 0x32, 0x13, 0x7d, 0x9f, 0x4b, 0x95, 0x1f, 0xe0, 0x91, 0x1d, 0xbd, 0x9a, 0xe9, 0xea, 0x83, + 0x38, 0x20, 0x3c, 0xb6, 0xba, 0x2e, 0xa5, 0xac, 0xaa, 0x15, 0xf2, 0x03, 0x0c, 0xff, 0xa9, 0x5a, + 0x1a, 0x73, 0xcd, 0x43, 0x7f, 0x51, 0x98, 0xed, 0xe0, 0x89, 0x75, 0x2b, 0x35, 0x4e, 0xde, 0xd2, + 0xde, 0x02, 0x35, 0x4f, 0xb8, 0xe6, 0xa6, 0xd2, 0x3b, 0x99, 0xe0, 0x7f, 0xd3, 0x50, 0x99, 0x39, + 0xe1, 0x9b, 0x7d, 0x9e, 0x69, 0x54, 0x51, 0x58, 0x0e, 0xc5, 0xed, 0x15, 0x6e, 0x3c, 0x7b, 0x7d, + 0xfe, 0xed, 0xb6, 0xce, 0x17, 0x97, 0xfc, 0xb8, 0xb8, 0xe4, 0xd7, 0xc5, 0x25, 0xdf, 0xff, 0xb8, + 0xad, 0x4f, 0x2f, 0xb6, 0x72, 0x6a, 0x86, 0x72, 0x2a, 0x64, 0x60, 0xbe, 0x01, 0x4f, 0x45, 0x50, + 0xbc, 0x0a, 0xec, 0x41, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x79, 0xf9, 0xf5, 0xc9, 0x02, + 0x00, 0x00, } func (m *Request) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto index 25e0aca5d9..ff639b9c96 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto @@ -3,6 +3,8 @@ package etcdserverpb; import "gogoproto/gogo.proto"; +option go_package = "go.etcd.io/etcd/api/v3/etcdserverpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go index b94a7bfd9d..e1cd9ebecd 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go @@ -12,6 +12,7 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/golang/protobuf/proto" membershippb "go.etcd.io/etcd/api/v3/membershippb" + _ "go.etcd.io/etcd/api/v3/versionpb" ) // Reference imports to suppress errors if they are not otherwise used. @@ -104,6 +105,7 @@ type InternalRaftRequest struct { ClusterVersionSet *membershippb.ClusterVersionSetRequest `protobuf:"bytes,1300,opt,name=cluster_version_set,json=clusterVersionSet,proto3" json:"cluster_version_set,omitempty"` ClusterMemberAttrSet *membershippb.ClusterMemberAttrSetRequest `protobuf:"bytes,1301,opt,name=cluster_member_attr_set,json=clusterMemberAttrSet,proto3" json:"cluster_member_attr_set,omitempty"` DowngradeInfoSet *membershippb.DowngradeInfoSetRequest `protobuf:"bytes,1302,opt,name=downgrade_info_set,json=downgradeInfoSet,proto3" json:"downgrade_info_set,omitempty"` + DowngradeVersionTest *DowngradeVersionTestRequest `protobuf:"bytes,9900,opt,name=downgrade_version_test,json=downgradeVersionTest,proto3" json:"downgrade_version_test,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -237,70 +239,76 @@ func init() { func init() { proto.RegisterFile("raft_internal.proto", fileDescriptor_b4c9a9be0cfca103) } var fileDescriptor_b4c9a9be0cfca103 = []byte{ - // 1003 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xd9, 0x72, 0x1b, 0x45, - 0x14, 0x86, 0x23, 0xc5, 0x71, 0xac, 0x96, 0xed, 0x38, 0x6d, 0x87, 0x34, 0x72, 0x95, 0x70, 0x1c, - 0x12, 0xcc, 0x66, 0x53, 0xca, 0x03, 0x80, 0x90, 0x5c, 0x8e, 0xab, 0x42, 0x70, 0x4d, 0xcc, 0x52, - 0xc5, 0xc5, 0xd0, 0x9a, 0x39, 0x96, 0x06, 0xcf, 0x46, 0x77, 0x4b, 0x31, 0xef, 0x11, 0x28, 0x1e, - 0x83, 0xed, 0x21, 0x72, 0xc1, 0x62, 0xe0, 0x05, 0xc0, 0xdc, 0x70, 0x0f, 0xdc, 0x53, 0xbd, 0xcc, - 0x26, 0xb5, 0x7c, 0xa7, 0xf9, 0xcf, 0x7f, 0xbe, 0x73, 0xba, 0xe7, 0xf4, 0xa8, 0xd1, 0x3a, 0xa3, - 0x27, 0xc2, 0x0d, 0x62, 0x01, 0x2c, 0xa6, 0xe1, 0x6e, 0xca, 0x12, 0x91, 0xe0, 0x65, 0x10, 0x9e, - 0xcf, 0x81, 0x4d, 0x80, 0xa5, 0x83, 0xd6, 0xc6, 0x30, 0x19, 0x26, 0x2a, 0xb0, 0x27, 0x7f, 0x69, - 0x4f, 0x6b, 0xad, 0xf0, 0x18, 0xa5, 0xc1, 0x52, 0xcf, 0xfc, 0xbc, 0x2f, 0x83, 0x7b, 0x34, 0x0d, - 0xf6, 0x22, 0x88, 0x06, 0xc0, 0xf8, 0x28, 0x48, 0xd3, 0x41, 0xe9, 0x41, 0xfb, 0xb6, 0x3f, 0x45, - 0x2b, 0x0e, 0x7c, 0x3e, 0x06, 0x2e, 0x1e, 0x02, 0xf5, 0x81, 0xe1, 0x55, 0x54, 0x3f, 0xec, 0x93, - 0xda, 0x56, 0x6d, 0x67, 0xc1, 0xa9, 0x1f, 0xf6, 0x71, 0x0b, 0x2d, 0x8d, 0xb9, 0x6c, 0x2d, 0x02, - 0x52, 0xdf, 0xaa, 0xed, 0x34, 0x9c, 0xfc, 0x19, 0xdf, 0x45, 0x2b, 0x74, 0x2c, 0x46, 0x2e, 0x83, - 0x49, 0xc0, 0x83, 0x24, 0x26, 0x57, 0x55, 0xda, 0xb2, 0x14, 0x1d, 0xa3, 0x6d, 0x3f, 0xc3, 0x68, - 0xfd, 0xd0, 0xac, 0xce, 0xa1, 0x27, 0xc2, 0x94, 0xc3, 0x0f, 0xd0, 0xe2, 0x48, 0x95, 0x24, 0xfe, - 0x56, 0x6d, 0xa7, 0xd9, 0xd9, 0xdc, 0x2d, 0xaf, 0x79, 0xb7, 0xd2, 0x95, 0x63, 0xac, 0x33, 0xdd, - 0xdd, 0x43, 0xf5, 0x49, 0x47, 0xf5, 0xd5, 0xec, 0xdc, 0xb2, 0x02, 0x9c, 0xfa, 0xa4, 0x83, 0xdf, - 0x42, 0xd7, 0x18, 0x8d, 0x87, 0xa0, 0x1a, 0x6c, 0x76, 0x5a, 0x53, 0x4e, 0x19, 0xca, 0xec, 0xda, - 0x88, 0x5f, 0x43, 0x57, 0xd3, 0xb1, 0x20, 0x0b, 0xca, 0x4f, 0xaa, 0xfe, 0xa3, 0x71, 0xb6, 0x08, - 0x47, 0x9a, 0x70, 0x0f, 0x2d, 0xfb, 0x10, 0x82, 0x00, 0x57, 0x17, 0xb9, 0xa6, 0x92, 0xb6, 0xaa, - 0x49, 0x7d, 0xe5, 0xa8, 0x94, 0x6a, 0xfa, 0x85, 0x26, 0x0b, 0x8a, 0xb3, 0x98, 0x2c, 0xda, 0x0a, - 0x1e, 0x9f, 0xc5, 0x79, 0x41, 0x71, 0x16, 0xe3, 0xb7, 0x11, 0xf2, 0x92, 0x28, 0xa5, 0x9e, 0x90, - 0x9b, 0x7e, 0x5d, 0xa5, 0xbc, 0x54, 0x4d, 0xe9, 0xe5, 0xf1, 0x2c, 0xb3, 0x94, 0x82, 0xdf, 0x41, - 0xcd, 0x10, 0x28, 0x07, 0x77, 0xc8, 0x68, 0x2c, 0xc8, 0x92, 0x8d, 0xf0, 0x48, 0x1a, 0x0e, 0x64, - 0x3c, 0x27, 0x84, 0xb9, 0x24, 0xd7, 0xac, 0x09, 0x0c, 0x26, 0xc9, 0x29, 0x90, 0x86, 0x6d, 0xcd, - 0x0a, 0xe1, 0x28, 0x43, 0xbe, 0xe6, 0xb0, 0xd0, 0xe4, 0x6b, 0xa1, 0x21, 0x65, 0x11, 0x41, 0xb6, - 0xd7, 0xd2, 0x95, 0xa1, 0xfc, 0xb5, 0x28, 0x23, 0x7e, 0x1f, 0xad, 0xe9, 0xb2, 0xde, 0x08, 0xbc, - 0xd3, 0x34, 0x09, 0x62, 0x41, 0x9a, 0x2a, 0xf9, 0x65, 0x4b, 0xe9, 0x5e, 0x6e, 0xca, 0x30, 0x37, - 0xc2, 0xaa, 0x8e, 0xbb, 0xa8, 0xa9, 0x46, 0x18, 0x62, 0x3a, 0x08, 0x81, 0xfc, 0x6d, 0xdd, 0xcc, - 0xee, 0x58, 0x8c, 0xf6, 0x95, 0x21, 0xdf, 0x0a, 0x9a, 0x4b, 0xb8, 0x8f, 0xd4, 0xc0, 0xbb, 0x7e, - 0xc0, 0x15, 0xe3, 0x9f, 0xeb, 0xb6, 0xbd, 0x90, 0x8c, 0xbe, 0x76, 0xe4, 0x7b, 0x41, 0x0b, 0x2d, - 0x6f, 0x84, 0x0b, 0x2a, 0xc6, 0x9c, 0xfc, 0x37, 0xb7, 0x91, 0x27, 0xca, 0x50, 0x69, 0x44, 0x4b, - 0xf8, 0xb1, 0x6e, 0x04, 0x62, 0x11, 0x78, 0x54, 0x00, 0xf9, 0x57, 0x33, 0x5e, 0xad, 0x32, 0xb2, - 0xb3, 0xd8, 0x2d, 0x59, 0x33, 0x5a, 0x25, 0x1f, 0xef, 0x9b, 0xe3, 0x2d, 0xcf, 0xbb, 0x4b, 0x7d, - 0x9f, 0xfc, 0xb8, 0x34, 0x6f, 0x65, 0x1f, 0x70, 0x60, 0x5d, 0xdf, 0xaf, 0xac, 0xcc, 0x68, 0xf8, - 0x31, 0x5a, 0x2b, 0x30, 0x7a, 0xe4, 0xc9, 0x4f, 0x9a, 0x74, 0xd7, 0x4e, 0x32, 0x67, 0xc5, 0xc0, - 0x56, 0x69, 0x45, 0xae, 0xb6, 0x35, 0x04, 0x41, 0x7e, 0xbe, 0xb4, 0xad, 0x03, 0x10, 0x33, 0x6d, - 0x1d, 0x80, 0xc0, 0x43, 0xf4, 0x62, 0x81, 0xf1, 0x46, 0xf2, 0x10, 0xba, 0x29, 0xe5, 0xfc, 0x69, - 0xc2, 0x7c, 0xf2, 0x8b, 0x46, 0xbe, 0x6e, 0x47, 0xf6, 0x94, 0xfb, 0xc8, 0x98, 0x33, 0xfa, 0x0b, - 0xd4, 0x1a, 0xc6, 0x1f, 0xa3, 0x8d, 0x52, 0xbf, 0xf2, 0xf4, 0xb8, 0x2c, 0x09, 0x81, 0x9c, 0xeb, - 0x1a, 0xf7, 0xe7, 0xb4, 0xad, 0x4e, 0x5e, 0x52, 0x4c, 0xcb, 0x4d, 0x3a, 0x1d, 0xc1, 0x9f, 0xa0, - 0x5b, 0x05, 0x59, 0x1f, 0x44, 0x8d, 0xfe, 0x55, 0xa3, 0x5f, 0xb1, 0xa3, 0xcd, 0x89, 0x2c, 0xb1, - 0x31, 0x9d, 0x09, 0xe1, 0x87, 0x68, 0xb5, 0x80, 0x87, 0x01, 0x17, 0xe4, 0x37, 0x4d, 0xbd, 0x63, - 0xa7, 0x3e, 0x0a, 0xb8, 0xa8, 0xcc, 0x51, 0x26, 0xe6, 0x24, 0xd9, 0x9a, 0x26, 0xfd, 0x3e, 0x97, - 0x24, 0x4b, 0xcf, 0x90, 0x32, 0x31, 0x7f, 0xf5, 0x8a, 0x24, 0x27, 0xf2, 0x9b, 0xc6, 0xbc, 0x57, - 0x2f, 0x73, 0xa6, 0x27, 0xd2, 0x68, 0xf9, 0x44, 0x2a, 0x8c, 0x99, 0xc8, 0x6f, 0x1b, 0xf3, 0x26, - 0x52, 0x66, 0x59, 0x26, 0xb2, 0x90, 0xab, 0x6d, 0xc9, 0x89, 0xfc, 0xee, 0xd2, 0xb6, 0xa6, 0x27, - 0xd2, 0x68, 0xf8, 0x33, 0xd4, 0x2a, 0x61, 0xd4, 0xa0, 0xa4, 0xc0, 0xa2, 0x80, 0xab, 0xff, 0xd6, - 0xef, 0x35, 0xf3, 0x8d, 0x39, 0x4c, 0x69, 0x3f, 0xca, 0xdd, 0x19, 0xff, 0x36, 0xb5, 0xc7, 0x71, - 0x84, 0x36, 0x8b, 0x5a, 0x66, 0x74, 0x4a, 0xc5, 0x7e, 0xd0, 0xc5, 0xde, 0xb4, 0x17, 0xd3, 0x53, - 0x32, 0x5b, 0x8d, 0xd0, 0x39, 0x06, 0xfc, 0x11, 0x5a, 0xf7, 0xc2, 0x31, 0x17, 0xc0, 0xdc, 0x09, - 0x30, 0x29, 0xb9, 0x1c, 0x04, 0x79, 0x86, 0xcc, 0x11, 0x28, 0x5f, 0x52, 0x76, 0x7b, 0xda, 0xf9, - 0xa1, 0x36, 0x3e, 0x29, 0x76, 0xeb, 0xa6, 0x37, 0x1d, 0xc1, 0x14, 0xdd, 0xce, 0xc0, 0x9a, 0xe1, - 0x52, 0x21, 0x98, 0x82, 0x7f, 0x89, 0xcc, 0xe7, 0xcf, 0x06, 0x7f, 0x4f, 0x69, 0x5d, 0x21, 0x58, - 0x89, 0xbf, 0xe1, 0x59, 0x82, 0xf8, 0x18, 0x61, 0x3f, 0x79, 0x1a, 0x0f, 0x19, 0xf5, 0xc1, 0x0d, - 0xe2, 0x93, 0x44, 0xd1, 0xbf, 0xd2, 0xf4, 0x7b, 0x55, 0x7a, 0x3f, 0x33, 0x1e, 0xc6, 0x27, 0x49, - 0x89, 0xbc, 0xe6, 0x4f, 0x05, 0xb6, 0x6f, 0xa0, 0x95, 0xfd, 0x28, 0x15, 0x5f, 0x38, 0xc0, 0xd3, - 0x24, 0xe6, 0xb0, 0x9d, 0xa2, 0xcd, 0x4b, 0x3e, 0xcd, 0x18, 0xa3, 0x05, 0x75, 0x07, 0xab, 0xa9, - 0x3b, 0x98, 0xfa, 0x2d, 0xef, 0x66, 0xf9, 0x17, 0xcb, 0xdc, 0xcd, 0xb2, 0x67, 0x7c, 0x07, 0x2d, - 0xf3, 0x20, 0x4a, 0x43, 0x70, 0x45, 0x72, 0x0a, 0xfa, 0x6a, 0xd6, 0x70, 0x9a, 0x5a, 0x3b, 0x96, - 0xd2, 0xbb, 0x1b, 0xcf, 0xff, 0x6c, 0x5f, 0x79, 0x7e, 0xd1, 0xae, 0x9d, 0x5f, 0xb4, 0x6b, 0x7f, - 0x5c, 0xb4, 0x6b, 0x5f, 0xff, 0xd5, 0xbe, 0x32, 0x58, 0x54, 0x17, 0xc3, 0x07, 0xff, 0x07, 0x00, - 0x00, 0xff, 0xff, 0x94, 0x6f, 0x64, 0x0a, 0x98, 0x0a, 0x00, 0x00, + // 1101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x56, 0xcb, 0x72, 0x1b, 0x45, + 0x14, 0x8d, 0x6c, 0xc7, 0xb6, 0x5a, 0xb6, 0xe3, 0xb4, 0x9d, 0xa4, 0xb1, 0xab, 0x8c, 0xe3, 0x90, + 0x60, 0x20, 0xc8, 0xc1, 0x06, 0xaa, 0x60, 0x03, 0x8a, 0xe5, 0x72, 0x4c, 0x25, 0x29, 0xd7, 0xc4, + 0x50, 0x29, 0x28, 0x6a, 0x68, 0xcd, 0x5c, 0x4b, 0x13, 0x8f, 0x66, 0x86, 0xee, 0x96, 0xe2, 0x6c, + 0x59, 0xb2, 0x06, 0x8a, 0x8f, 0x60, 0xc1, 0x2b, 0xff, 0x90, 0x05, 0x8f, 0x00, 0x3f, 0x00, 0x66, + 0xc3, 0x1e, 0xd8, 0xa7, 0xfa, 0x31, 0x2f, 0xa9, 0xe5, 0xdd, 0xe8, 0xde, 0x73, 0xcf, 0x39, 0xdd, + 0x7d, 0xbb, 0x75, 0xd1, 0x02, 0xa3, 0x87, 0xc2, 0x0d, 0x22, 0x01, 0x2c, 0xa2, 0x61, 0x3d, 0x61, + 0xb1, 0x88, 0xf1, 0x0c, 0x08, 0xcf, 0xe7, 0xc0, 0xfa, 0xc0, 0x92, 0xd6, 0xd2, 0x62, 0x3b, 0x6e, + 0xc7, 0x2a, 0xb1, 0x21, 0xbf, 0x34, 0x66, 0x69, 0x3e, 0xc7, 0x98, 0x48, 0x95, 0x25, 0x9e, 0xf9, + 0x5c, 0x95, 0xc9, 0x0d, 0x9a, 0x04, 0x1b, 0x7d, 0x60, 0x3c, 0x88, 0xa3, 0xa4, 0x95, 0x7e, 0x19, + 0xc4, 0xb5, 0x0c, 0xd1, 0x85, 0x6e, 0x0b, 0x18, 0xef, 0x04, 0x49, 0xd2, 0x2a, 0xfc, 0xd0, 0xb8, + 0x35, 0x86, 0x66, 0x1d, 0xf8, 0xb4, 0x07, 0x5c, 0xdc, 0x02, 0xea, 0x03, 0xc3, 0x73, 0x68, 0x6c, + 0xaf, 0x49, 0x2a, 0xab, 0x95, 0xf5, 0x09, 0x67, 0x6c, 0xaf, 0x89, 0x97, 0xd0, 0x74, 0x8f, 0x4b, + 0xf3, 0x5d, 0x20, 0x63, 0xab, 0x95, 0xf5, 0xaa, 0x93, 0xfd, 0xc6, 0xd7, 0xd1, 0x2c, 0xed, 0x89, + 0x8e, 0xcb, 0xa0, 0x1f, 0x48, 0x6d, 0x32, 0x2e, 0xcb, 0x6e, 0x4e, 0x7d, 0xfe, 0x98, 0x8c, 0x6f, + 0xd5, 0x5f, 0x73, 0x66, 0x64, 0xd6, 0x31, 0xc9, 0xb7, 0xa7, 0x3e, 0x53, 0xe1, 0x1b, 0x6b, 0x8f, + 0x17, 0xd0, 0xc2, 0x9e, 0xd9, 0x11, 0x87, 0x1e, 0x0a, 0x63, 0x00, 0x6f, 0xa1, 0xc9, 0x8e, 0x32, + 0x41, 0xfc, 0xd5, 0xca, 0x7a, 0x6d, 0x73, 0xb9, 0x5e, 0xdc, 0xa7, 0x7a, 0xc9, 0xa7, 0x63, 0xa0, + 0x43, 0x7e, 0xaf, 0xa2, 0xb1, 0xfe, 0xa6, 0x72, 0x5a, 0xdb, 0xbc, 0x60, 0x25, 0x70, 0xc6, 0xfa, + 0x9b, 0xf8, 0x06, 0x3a, 0xcb, 0x68, 0xd4, 0x06, 0x65, 0xb9, 0xb6, 0xb9, 0x34, 0x80, 0x94, 0xa9, + 0x14, 0xae, 0x81, 0xf8, 0x65, 0x34, 0x9e, 0xf4, 0x04, 0x99, 0x50, 0x78, 0x52, 0xc6, 0xef, 0xf7, + 0xd2, 0x45, 0x38, 0x12, 0x84, 0xb7, 0xd1, 0x8c, 0x0f, 0x21, 0x08, 0x70, 0xb5, 0xc8, 0x59, 0x55, + 0xb4, 0x5a, 0x2e, 0x6a, 0x2a, 0x44, 0x49, 0xaa, 0xe6, 0xe7, 0x31, 0x29, 0x28, 0x8e, 0x23, 0x32, + 0x69, 0x13, 0x3c, 0x38, 0x8e, 0x32, 0x41, 0x71, 0x1c, 0xe1, 0x77, 0x10, 0xf2, 0xe2, 0x6e, 0x42, + 0x3d, 0x21, 0x8f, 0x61, 0x4a, 0x95, 0x3c, 0x5f, 0x2e, 0xd9, 0xce, 0xf2, 0x69, 0x65, 0xa1, 0x04, + 0xbf, 0x8b, 0x6a, 0x21, 0x50, 0x0e, 0x6e, 0x9b, 0xd1, 0x48, 0x90, 0x69, 0x1b, 0xc3, 0x6d, 0x09, + 0xd8, 0x95, 0xf9, 0x8c, 0x21, 0xcc, 0x42, 0x72, 0xcd, 0x9a, 0x81, 0x41, 0x3f, 0x3e, 0x02, 0x52, + 0xb5, 0xad, 0x59, 0x51, 0x38, 0x0a, 0x90, 0xad, 0x39, 0xcc, 0x63, 0xf2, 0x58, 0x68, 0x48, 0x59, + 0x97, 0x20, 0xdb, 0xb1, 0x34, 0x64, 0x2a, 0x3b, 0x16, 0x05, 0xc4, 0xf7, 0xd1, 0xbc, 0x96, 0xf5, + 0x3a, 0xe0, 0x1d, 0x25, 0x71, 0x10, 0x09, 0x52, 0x53, 0xc5, 0x2f, 0x58, 0xa4, 0xb7, 0x33, 0x90, + 0xa1, 0x49, 0x9b, 0xf5, 0x75, 0xe7, 0x5c, 0x58, 0x06, 0xe0, 0x06, 0xaa, 0xa9, 0xee, 0x86, 0x88, + 0xb6, 0x42, 0x20, 0xff, 0x58, 0x77, 0xb5, 0xd1, 0x13, 0x9d, 0x1d, 0x05, 0xc8, 0xf6, 0x84, 0x66, + 0x21, 0xdc, 0x44, 0xea, 0x0a, 0xb8, 0x7e, 0xc0, 0x15, 0xc7, 0xbf, 0x53, 0xb6, 0x4d, 0x91, 0x1c, + 0x4d, 0x8d, 0xc8, 0x36, 0x85, 0xe6, 0x31, 0xfc, 0x9e, 0x31, 0xc2, 0x05, 0x15, 0x3d, 0x4e, 0xfe, + 0x1f, 0x69, 0xe4, 0x9e, 0x02, 0x0c, 0xac, 0xec, 0x0d, 0xed, 0x48, 0xe7, 0xf0, 0x5d, 0xed, 0x08, + 0x22, 0x11, 0x78, 0x54, 0x00, 0xf9, 0x4f, 0x93, 0xbd, 0x54, 0x26, 0x4b, 0x6f, 0x67, 0xa3, 0x00, + 0x4d, 0xad, 0x95, 0xea, 0xf1, 0x8e, 0x79, 0x02, 0xe4, 0x9b, 0xe0, 0x52, 0xdf, 0x27, 0x3f, 0x4d, + 0x8f, 0x5a, 0xe2, 0xfb, 0x1c, 0x58, 0xc3, 0xf7, 0x4b, 0x4b, 0x34, 0x31, 0x7c, 0x17, 0xcd, 0xe7, + 0x34, 0xfa, 0x12, 0x90, 0x9f, 0x35, 0xd3, 0x15, 0x3b, 0x93, 0xb9, 0x3d, 0x86, 0x6c, 0x8e, 0x96, + 0xc2, 0x65, 0x5b, 0x6d, 0x10, 0xe4, 0x97, 0x53, 0x6d, 0xed, 0x82, 0x18, 0xb2, 0xb5, 0x0b, 0x02, + 0xb7, 0xd1, 0x73, 0x39, 0x8d, 0xd7, 0x91, 0xd7, 0xd2, 0x4d, 0x28, 0xe7, 0x0f, 0x63, 0xe6, 0x93, + 0x5f, 0x35, 0xe5, 0x2b, 0x76, 0xca, 0x6d, 0x85, 0xde, 0x37, 0xe0, 0x94, 0xfd, 0x22, 0xb5, 0xa6, + 0xf1, 0x7d, 0xb4, 0x58, 0xf0, 0x2b, 0xef, 0x93, 0xcb, 0xe2, 0x10, 0xc8, 0x53, 0xad, 0x71, 0x6d, + 0x84, 0x6d, 0x75, 0x17, 0xe3, 0xbc, 0x6d, 0xce, 0xd3, 0xc1, 0x0c, 0xfe, 0x08, 0x5d, 0xc8, 0x99, + 0xf5, 0xd5, 0xd4, 0xd4, 0xbf, 0x69, 0xea, 0x17, 0xed, 0xd4, 0xe6, 0x8e, 0x16, 0xb8, 0x31, 0x1d, + 0x4a, 0xe1, 0x5b, 0x68, 0x2e, 0x27, 0x0f, 0x03, 0x2e, 0xc8, 0xef, 0x9a, 0xf5, 0xb2, 0x9d, 0xf5, + 0x76, 0xc0, 0x45, 0xa9, 0x8f, 0xd2, 0x60, 0xc6, 0x24, 0xad, 0x69, 0xa6, 0x3f, 0x46, 0x32, 0x49, + 0xe9, 0x21, 0xa6, 0x34, 0x98, 0x1d, 0xbd, 0x62, 0x92, 0x1d, 0xf9, 0x6d, 0x75, 0xd4, 0xd1, 0xcb, + 0x9a, 0xc1, 0x8e, 0x34, 0xb1, 0xac, 0x23, 0x15, 0x8d, 0xe9, 0xc8, 0xef, 0xaa, 0xa3, 0x3a, 0x52, + 0x56, 0x59, 0x3a, 0x32, 0x0f, 0x97, 0x6d, 0xc9, 0x8e, 0xfc, 0xfe, 0x54, 0x5b, 0x83, 0x1d, 0x69, + 0x62, 0xf8, 0x01, 0x5a, 0x2a, 0xd0, 0xa8, 0x46, 0x49, 0x80, 0x75, 0x03, 0xae, 0xfe, 0x7f, 0x7f, + 0xd0, 0x9c, 0xd7, 0x47, 0x70, 0x4a, 0xf8, 0x7e, 0x86, 0x4e, 0xf9, 0x2f, 0x51, 0x7b, 0x1e, 0x77, + 0xd1, 0x72, 0xae, 0x65, 0x5a, 0xa7, 0x20, 0xf6, 0xa3, 0x16, 0x7b, 0xd5, 0x2e, 0xa6, 0xbb, 0x64, + 0x58, 0x8d, 0xd0, 0x11, 0x00, 0xfc, 0x09, 0x5a, 0xf0, 0xc2, 0x1e, 0x17, 0xc0, 0x5c, 0x33, 0xcb, + 0xb8, 0x1c, 0x04, 0xf9, 0x02, 0x99, 0x2b, 0x50, 0x1c, 0x64, 0xea, 0xdb, 0x1a, 0xf9, 0x81, 0x06, + 0xde, 0x03, 0x31, 0xf4, 0xea, 0x9d, 0xf7, 0x06, 0x21, 0xf8, 0x01, 0xba, 0x94, 0x2a, 0x68, 0x32, + 0x97, 0x0a, 0xc1, 0x94, 0xca, 0x97, 0xc8, 0xbc, 0x83, 0x36, 0x95, 0x3b, 0x2a, 0xd6, 0x10, 0x82, + 0xd9, 0x84, 0x16, 0x3d, 0x0b, 0x0a, 0x7f, 0x8c, 0xb0, 0x1f, 0x3f, 0x8c, 0xda, 0x8c, 0xfa, 0xe0, + 0x06, 0xd1, 0x61, 0xac, 0x64, 0xbe, 0xd2, 0x32, 0x57, 0xcb, 0x32, 0xcd, 0x14, 0xb8, 0x17, 0x1d, + 0xc6, 0x36, 0x89, 0x79, 0x7f, 0x00, 0x81, 0x03, 0x74, 0x31, 0xa7, 0x4f, 0xb7, 0x4b, 0x00, 0x17, + 0xe4, 0x9b, 0x3b, 0xb6, 0x17, 0x3d, 0x93, 0x30, 0xdb, 0x71, 0x00, 0x7c, 0x50, 0xe6, 0x4d, 0x67, + 0xd1, 0xb7, 0xa0, 0xf2, 0xb9, 0xed, 0x1c, 0x9a, 0xdd, 0xe9, 0x26, 0xe2, 0x91, 0x03, 0x3c, 0x89, + 0x23, 0x0e, 0x6b, 0x8f, 0xd0, 0xf2, 0x29, 0xff, 0x14, 0x18, 0xa3, 0x09, 0x35, 0x36, 0x56, 0xd4, + 0xd8, 0xa8, 0xbe, 0xe5, 0x38, 0x99, 0x3d, 0xa0, 0x66, 0x9c, 0x4c, 0x7f, 0xe3, 0xcb, 0x68, 0x86, + 0x07, 0xdd, 0x24, 0x04, 0x57, 0xc4, 0x47, 0xa0, 0xa7, 0xc9, 0xaa, 0x53, 0xd3, 0xb1, 0x03, 0x19, + 0xca, 0xbc, 0xdc, 0x7c, 0xeb, 0xc9, 0x5f, 0x2b, 0x67, 0x9e, 0x9c, 0xac, 0x54, 0x9e, 0x9e, 0xac, + 0x54, 0xfe, 0x3c, 0x59, 0xa9, 0x7c, 0xfd, 0xf7, 0xca, 0x99, 0x0f, 0xaf, 0xb4, 0x63, 0xb5, 0xec, + 0x7a, 0x10, 0x6f, 0xe4, 0x23, 0xf2, 0xd6, 0x46, 0x71, 0x2b, 0x5a, 0x93, 0x6a, 0xf2, 0xdd, 0x7a, + 0x16, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xa0, 0x15, 0x1f, 0x9b, 0x0b, 0x00, 0x00, } func (m *RequestHeader) Marshal() (dAtA []byte, err error) { @@ -371,6 +379,22 @@ func (m *InternalRaftRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.DowngradeVersionTest != nil { + { + size, err := m.DowngradeVersionTest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRaftInternal(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4 + i-- + dAtA[i] = 0xea + i-- + dAtA[i] = 0xe2 + } if m.DowngradeInfoSet != nil { { size, err := m.DowngradeInfoSet.MarshalToSizedBuffer(dAtA[:i]) @@ -1034,6 +1058,10 @@ func (m *InternalRaftRequest) Size() (n int) { l = m.DowngradeInfoSet.Size() n += 2 + l + sovRaftInternal(uint64(l)) } + if m.DowngradeVersionTest != nil { + l = m.DowngradeVersionTest.Size() + n += 3 + l + sovRaftInternal(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2367,6 +2395,42 @@ func (m *InternalRaftRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9900: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DowngradeVersionTest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRaftInternal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DowngradeVersionTest == nil { + m.DowngradeVersionTest = &DowngradeVersionTestRequest{} + } + if err := m.DowngradeVersionTest.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRaftInternal(dAtA[iNdEx:]) diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto index 68926e59f6..88b8ab5279 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto @@ -4,24 +4,31 @@ package etcdserverpb; import "gogoproto/gogo.proto"; import "etcdserver.proto"; import "rpc.proto"; +import "etcd/api/versionpb/version.proto"; import "etcd/api/membershippb/membership.proto"; +option go_package = "go.etcd.io/etcd/api/v3/etcdserverpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; option (gogoproto.goproto_getters_all) = false; message RequestHeader { + option (versionpb.etcd_version_msg) = "3.0"; + uint64 ID = 1; // username is a username that is associated with an auth token of gRPC connection string username = 2; // auth_revision is a revision number of auth.authStore. It is not related to mvcc - uint64 auth_revision = 3; + uint64 auth_revision = 3 [(versionpb.etcd_version_field) = "3.1"]; } // An InternalRaftRequest is the union of all requests which can be // sent via raft. message InternalRaftRequest { + option (versionpb.etcd_version_msg) = "3.0"; + RequestHeader header = 100; uint64 ID = 1; @@ -38,11 +45,11 @@ message InternalRaftRequest { AlarmRequest alarm = 10; - LeaseCheckpointRequest lease_checkpoint = 11; + LeaseCheckpointRequest lease_checkpoint = 11 [(versionpb.etcd_version_field) = "3.4"]; AuthEnableRequest auth_enable = 1000; AuthDisableRequest auth_disable = 1011; - AuthStatusRequest auth_status = 1013; + AuthStatusRequest auth_status = 1013 [(versionpb.etcd_version_field) = "3.5"]; InternalAuthenticateRequest authenticate = 1012; @@ -61,9 +68,11 @@ message InternalRaftRequest { AuthRoleGrantPermissionRequest auth_role_grant_permission = 1203; AuthRoleRevokePermissionRequest auth_role_revoke_permission = 1204; - membershippb.ClusterVersionSetRequest cluster_version_set = 1300; - membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301; - membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302; + membershippb.ClusterVersionSetRequest cluster_version_set = 1300 [(versionpb.etcd_version_field) = "3.5"]; + membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301 [(versionpb.etcd_version_field) = "3.5"]; + membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302 [(versionpb.etcd_version_field) = "3.5"]; + + DowngradeVersionTestRequest downgrade_version_test = 9900 [(versionpb.etcd_version_field) = "3.6"]; } message EmptyResponse { @@ -73,6 +82,7 @@ message EmptyResponse { // InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing. // For avoiding misusage the field, we have an internal version of AuthenticateRequest. message InternalAuthenticateRequest { + option (versionpb.etcd_version_msg) = "3.0"; string name = 1; string password = 2; diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go index 31e121ee0a..a9431d5254 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go @@ -72,13 +72,13 @@ func (as *InternalRaftStringer) String() string { return as.Request.String() } -// txnRequestStringer implements a custom proto String to replace value bytes fields with value size -// fields in any nested txn and put operations. +// txnRequestStringer implements fmt.Stringer, a custom proto String to replace value bytes +// fields with value size fields in any nested txn and put operations. type txnRequestStringer struct { Request *TxnRequest } -func NewLoggableTxnRequest(request *TxnRequest) *txnRequestStringer { +func NewLoggableTxnRequest(request *TxnRequest) fmt.Stringer { return &txnRequestStringer{request} } @@ -155,8 +155,8 @@ func (m *loggableValueCompare) Reset() { *m = loggableValueCompare{} } func (m *loggableValueCompare) String() string { return proto.CompactTextString(m) } func (*loggableValueCompare) ProtoMessage() {} -// loggablePutRequest implements a custom proto String to replace value bytes field with a value -// size field. +// loggablePutRequest implements proto.Message, a custom proto String to replace value bytes +// field with a value size field. // To preserve proto encoding of the key bytes, a faked out proto type is used here. type loggablePutRequest struct { Key []byte `protobuf:"bytes,1,opt,name=key,proto3"` @@ -167,7 +167,7 @@ type loggablePutRequest struct { IgnoreLease bool `protobuf:"varint,6,opt,name=ignore_lease,proto3"` } -func NewLoggablePutRequest(request *PutRequest) *loggablePutRequest { +func NewLoggablePutRequest(request *PutRequest) proto.Message { return &loggablePutRequest{ request.Key, int64(len(request.Value)), diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go index 8120907d91..42bf641db6 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go @@ -12,8 +12,10 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/golang/protobuf/proto" + _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" authpb "go.etcd.io/etcd/api/v3/authpb" mvccpb "go.etcd.io/etcd/api/v3/mvccpb" + _ "go.etcd.io/etcd/api/v3/versionpb" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -274,9 +276,10 @@ type ResponseHeader struct { ClusterId uint64 `protobuf:"varint,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // member_id is the ID of the member which sent the response. MemberId uint64 `protobuf:"varint,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` - // revision is the key-value store revision when the request was applied. + // revision is the key-value store revision when the request was applied, and it's + // unset (so 0) in case of calls not interacting with key-value store. // For watch progress responses, the header.revision indicates progress. All future events - // recieved in this stream are guaranteed to have a higher revision number than the + // received in this stream are guaranteed to have a higher revision number than the // header.revision number. Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` // raft_term is the raft term when the request was applied. @@ -526,7 +529,9 @@ type RangeResponse struct { Kvs []*mvccpb.KeyValue `protobuf:"bytes,2,rep,name=kvs,proto3" json:"kvs,omitempty"` // more indicates if there are more keys to return in the requested range. More bool `protobuf:"varint,3,opt,name=more,proto3" json:"more,omitempty"` - // count is set to the number of keys within the range when requested. + // count is set to the actual number of keys within the range when requested. + // Unlike Kvs, it is unaffected by limits and filters (e.g., Min/Max, Create/Modify, Revisions) + // and reflects the full count within the specified range. Count int64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1630,7 +1635,9 @@ type HashKVResponse struct { // hash is the hash value computed from the responding member's MVCC keys up to a given revision. Hash uint32 `protobuf:"varint,2,opt,name=hash,proto3" json:"hash,omitempty"` // compact_revision is the compacted revision of key-value store when hash begins. - CompactRevision int64 `protobuf:"varint,3,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"` + CompactRevision int64 `protobuf:"varint,3,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"` + // hash_revision is the revision up to which the hash is calculated. + HashRevision int64 `protobuf:"varint,4,opt,name=hash_revision,json=hashRevision,proto3" json:"hash_revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1690,6 +1697,13 @@ func (m *HashKVResponse) GetCompactRevision() int64 { return 0 } +func (m *HashKVResponse) GetHashRevision() int64 { + if m != nil { + return m.HashRevision + } + return 0 +} + type HashResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` // hash is the hash value computed from the responding member's KV's backend. @@ -1792,7 +1806,11 @@ type SnapshotResponse struct { // remaining_bytes is the number of blob bytes to be sent after this message RemainingBytes uint64 `protobuf:"varint,2,opt,name=remaining_bytes,json=remainingBytes,proto3" json:"remaining_bytes,omitempty"` // blob contains the next chunk of the snapshot in the snapshot stream. - Blob []byte `protobuf:"bytes,3,opt,name=blob,proto3" json:"blob,omitempty"` + Blob []byte `protobuf:"bytes,3,opt,name=blob,proto3" json:"blob,omitempty"` + // local version of server that created the snapshot. + // In cluster with binaries with different version, each cluster can return different result. + // Informs which etcd server version should be used when restoring the snapshot. + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1852,6 +1870,13 @@ func (m *SnapshotResponse) GetBlob() []byte { return nil } +func (m *SnapshotResponse) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + type WatchRequest struct { // request_union is a request to either create a new watcher or cancel an existing watcher. // @@ -2176,7 +2201,8 @@ type WatchResponse struct { // the created watcher from the same stream. // All events sent to the created watcher will attach with the same watch_id. Created bool `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"` - // canceled is set to true if the response is for a cancel watch request. + // canceled is set to true if the response is for a cancel watch request + // or if the start_revision has already been compacted. // No further events will be sent to the canceled watcher. Canceled bool `protobuf:"varint,4,opt,name=canceled,proto3" json:"canceled,omitempty"` // compact_revision is set to the minimum index if a watcher tries to watch @@ -4165,6 +4191,57 @@ func (m *DowngradeResponse) GetVersion() string { return "" } +// DowngradeVersionTestRequest is used for test only. The version in +// this request will be read as the WAL record version.If the downgrade +// target version is less than this version, then the downgrade(online) +// or migration(offline) isn't safe, so shouldn't be allowed. +type DowngradeVersionTestRequest struct { + Ver string `protobuf:"bytes,1,opt,name=ver,proto3" json:"ver,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DowngradeVersionTestRequest) Reset() { *m = DowngradeVersionTestRequest{} } +func (m *DowngradeVersionTestRequest) String() string { return proto.CompactTextString(m) } +func (*DowngradeVersionTestRequest) ProtoMessage() {} +func (*DowngradeVersionTestRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{59} +} +func (m *DowngradeVersionTestRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DowngradeVersionTestRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DowngradeVersionTestRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DowngradeVersionTestRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DowngradeVersionTestRequest.Merge(m, src) +} +func (m *DowngradeVersionTestRequest) XXX_Size() int { + return m.Size() +} +func (m *DowngradeVersionTestRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DowngradeVersionTestRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DowngradeVersionTestRequest proto.InternalMessageInfo + +func (m *DowngradeVersionTestRequest) GetVer() string { + if m != nil { + return m.Ver + } + return "" +} + type StatusRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -4175,7 +4252,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{59} + return fileDescriptor_77a6da22d6a3feb1, []int{60} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4223,17 +4300,23 @@ type StatusResponse struct { // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. DbSizeInUse int64 `protobuf:"varint,9,opt,name=dbSizeInUse,proto3" json:"dbSizeInUse,omitempty"` // isLearner indicates if the member is raft learner. - IsLearner bool `protobuf:"varint,10,opt,name=isLearner,proto3" json:"isLearner,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + IsLearner bool `protobuf:"varint,10,opt,name=isLearner,proto3" json:"isLearner,omitempty"` + // storageVersion is the version of the db file. It might be updated with delay in relationship to the target cluster version. + StorageVersion string `protobuf:"bytes,11,opt,name=storageVersion,proto3" json:"storageVersion,omitempty"` + // dbSizeQuota is the configured etcd storage quota in bytes (the value passed to etcd instance by flag --quota-backend-bytes) + DbSizeQuota int64 `protobuf:"varint,12,opt,name=dbSizeQuota,proto3" json:"dbSizeQuota,omitempty"` + // downgradeInfo indicates if there is downgrade process. + DowngradeInfo *DowngradeInfo `protobuf:"bytes,13,opt,name=downgradeInfo,proto3" json:"downgradeInfo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (*StatusResponse) ProtoMessage() {} func (*StatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{60} + return fileDescriptor_77a6da22d6a3feb1, []int{61} } func (m *StatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4332,6 +4415,84 @@ func (m *StatusResponse) GetIsLearner() bool { return false } +func (m *StatusResponse) GetStorageVersion() string { + if m != nil { + return m.StorageVersion + } + return "" +} + +func (m *StatusResponse) GetDbSizeQuota() int64 { + if m != nil { + return m.DbSizeQuota + } + return 0 +} + +func (m *StatusResponse) GetDowngradeInfo() *DowngradeInfo { + if m != nil { + return m.DowngradeInfo + } + return nil +} + +type DowngradeInfo struct { + // enabled indicates whether the cluster is enabled to downgrade. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // targetVersion is the target downgrade version. + TargetVersion string `protobuf:"bytes,2,opt,name=targetVersion,proto3" json:"targetVersion,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DowngradeInfo) Reset() { *m = DowngradeInfo{} } +func (m *DowngradeInfo) String() string { return proto.CompactTextString(m) } +func (*DowngradeInfo) ProtoMessage() {} +func (*DowngradeInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{62} +} +func (m *DowngradeInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DowngradeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DowngradeInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DowngradeInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_DowngradeInfo.Merge(m, src) +} +func (m *DowngradeInfo) XXX_Size() int { + return m.Size() +} +func (m *DowngradeInfo) XXX_DiscardUnknown() { + xxx_messageInfo_DowngradeInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_DowngradeInfo proto.InternalMessageInfo + +func (m *DowngradeInfo) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + +func (m *DowngradeInfo) GetTargetVersion() string { + if m != nil { + return m.TargetVersion + } + return "" +} + type AuthEnableRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -4342,7 +4503,7 @@ func (m *AuthEnableRequest) Reset() { *m = AuthEnableRequest{} } func (m *AuthEnableRequest) String() string { return proto.CompactTextString(m) } func (*AuthEnableRequest) ProtoMessage() {} func (*AuthEnableRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{61} + return fileDescriptor_77a6da22d6a3feb1, []int{63} } func (m *AuthEnableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4381,7 +4542,7 @@ func (m *AuthDisableRequest) Reset() { *m = AuthDisableRequest{} } func (m *AuthDisableRequest) String() string { return proto.CompactTextString(m) } func (*AuthDisableRequest) ProtoMessage() {} func (*AuthDisableRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{62} + return fileDescriptor_77a6da22d6a3feb1, []int{64} } func (m *AuthDisableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4420,7 +4581,7 @@ func (m *AuthStatusRequest) Reset() { *m = AuthStatusRequest{} } func (m *AuthStatusRequest) String() string { return proto.CompactTextString(m) } func (*AuthStatusRequest) ProtoMessage() {} func (*AuthStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{63} + return fileDescriptor_77a6da22d6a3feb1, []int{65} } func (m *AuthStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4461,7 +4622,7 @@ func (m *AuthenticateRequest) Reset() { *m = AuthenticateRequest{} } func (m *AuthenticateRequest) String() string { return proto.CompactTextString(m) } func (*AuthenticateRequest) ProtoMessage() {} func (*AuthenticateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{64} + return fileDescriptor_77a6da22d6a3feb1, []int{66} } func (m *AuthenticateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4518,7 +4679,7 @@ func (m *AuthUserAddRequest) Reset() { *m = AuthUserAddRequest{} } func (m *AuthUserAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserAddRequest) ProtoMessage() {} func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{65} + return fileDescriptor_77a6da22d6a3feb1, []int{67} } func (m *AuthUserAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4586,7 +4747,7 @@ func (m *AuthUserGetRequest) Reset() { *m = AuthUserGetRequest{} } func (m *AuthUserGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGetRequest) ProtoMessage() {} func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{66} + return fileDescriptor_77a6da22d6a3feb1, []int{68} } func (m *AuthUserGetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4634,7 +4795,7 @@ func (m *AuthUserDeleteRequest) Reset() { *m = AuthUserDeleteRequest{} } func (m *AuthUserDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteRequest) ProtoMessage() {} func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{67} + return fileDescriptor_77a6da22d6a3feb1, []int{69} } func (m *AuthUserDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4686,7 +4847,7 @@ func (m *AuthUserChangePasswordRequest) Reset() { *m = AuthUserChangePas func (m *AuthUserChangePasswordRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordRequest) ProtoMessage() {} func (*AuthUserChangePasswordRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{68} + return fileDescriptor_77a6da22d6a3feb1, []int{70} } func (m *AuthUserChangePasswordRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4750,7 +4911,7 @@ func (m *AuthUserGrantRoleRequest) Reset() { *m = AuthUserGrantRoleReque func (m *AuthUserGrantRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleRequest) ProtoMessage() {} func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{69} + return fileDescriptor_77a6da22d6a3feb1, []int{71} } func (m *AuthUserGrantRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4805,7 +4966,7 @@ func (m *AuthUserRevokeRoleRequest) Reset() { *m = AuthUserRevokeRoleReq func (m *AuthUserRevokeRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleRequest) ProtoMessage() {} func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{70} + return fileDescriptor_77a6da22d6a3feb1, []int{72} } func (m *AuthUserRevokeRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4860,7 +5021,7 @@ func (m *AuthRoleAddRequest) Reset() { *m = AuthRoleAddRequest{} } func (m *AuthRoleAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddRequest) ProtoMessage() {} func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{71} + return fileDescriptor_77a6da22d6a3feb1, []int{73} } func (m *AuthRoleAddRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4907,7 +5068,7 @@ func (m *AuthRoleGetRequest) Reset() { *m = AuthRoleGetRequest{} } func (m *AuthRoleGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetRequest) ProtoMessage() {} func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{72} + return fileDescriptor_77a6da22d6a3feb1, []int{74} } func (m *AuthRoleGetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4953,7 +5114,7 @@ func (m *AuthUserListRequest) Reset() { *m = AuthUserListRequest{} } func (m *AuthUserListRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserListRequest) ProtoMessage() {} func (*AuthUserListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{73} + return fileDescriptor_77a6da22d6a3feb1, []int{75} } func (m *AuthUserListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4992,7 +5153,7 @@ func (m *AuthRoleListRequest) Reset() { *m = AuthRoleListRequest{} } func (m *AuthRoleListRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleListRequest) ProtoMessage() {} func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{74} + return fileDescriptor_77a6da22d6a3feb1, []int{76} } func (m *AuthRoleListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5032,7 +5193,7 @@ func (m *AuthRoleDeleteRequest) Reset() { *m = AuthRoleDeleteRequest{} } func (m *AuthRoleDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteRequest) ProtoMessage() {} func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{75} + return fileDescriptor_77a6da22d6a3feb1, []int{77} } func (m *AuthRoleDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5082,7 +5243,7 @@ func (m *AuthRoleGrantPermissionRequest) Reset() { *m = AuthRoleGrantPer func (m *AuthRoleGrantPermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionRequest) ProtoMessage() {} func (*AuthRoleGrantPermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{76} + return fileDescriptor_77a6da22d6a3feb1, []int{78} } func (m *AuthRoleGrantPermissionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5138,7 +5299,7 @@ func (m *AuthRoleRevokePermissionRequest) Reset() { *m = AuthRoleRevokeP func (m *AuthRoleRevokePermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionRequest) ProtoMessage() {} func (*AuthRoleRevokePermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{77} + return fileDescriptor_77a6da22d6a3feb1, []int{79} } func (m *AuthRoleRevokePermissionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5199,7 +5360,7 @@ func (m *AuthEnableResponse) Reset() { *m = AuthEnableResponse{} } func (m *AuthEnableResponse) String() string { return proto.CompactTextString(m) } func (*AuthEnableResponse) ProtoMessage() {} func (*AuthEnableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{78} + return fileDescriptor_77a6da22d6a3feb1, []int{80} } func (m *AuthEnableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5246,7 +5407,7 @@ func (m *AuthDisableResponse) Reset() { *m = AuthDisableResponse{} } func (m *AuthDisableResponse) String() string { return proto.CompactTextString(m) } func (*AuthDisableResponse) ProtoMessage() {} func (*AuthDisableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{79} + return fileDescriptor_77a6da22d6a3feb1, []int{81} } func (m *AuthDisableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5296,7 +5457,7 @@ func (m *AuthStatusResponse) Reset() { *m = AuthStatusResponse{} } func (m *AuthStatusResponse) String() string { return proto.CompactTextString(m) } func (*AuthStatusResponse) ProtoMessage() {} func (*AuthStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{80} + return fileDescriptor_77a6da22d6a3feb1, []int{82} } func (m *AuthStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5359,7 +5520,7 @@ func (m *AuthenticateResponse) Reset() { *m = AuthenticateResponse{} } func (m *AuthenticateResponse) String() string { return proto.CompactTextString(m) } func (*AuthenticateResponse) ProtoMessage() {} func (*AuthenticateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{81} + return fileDescriptor_77a6da22d6a3feb1, []int{83} } func (m *AuthenticateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5413,7 +5574,7 @@ func (m *AuthUserAddResponse) Reset() { *m = AuthUserAddResponse{} } func (m *AuthUserAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserAddResponse) ProtoMessage() {} func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{82} + return fileDescriptor_77a6da22d6a3feb1, []int{84} } func (m *AuthUserAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5461,7 +5622,7 @@ func (m *AuthUserGetResponse) Reset() { *m = AuthUserGetResponse{} } func (m *AuthUserGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGetResponse) ProtoMessage() {} func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{83} + return fileDescriptor_77a6da22d6a3feb1, []int{85} } func (m *AuthUserGetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5515,7 +5676,7 @@ func (m *AuthUserDeleteResponse) Reset() { *m = AuthUserDeleteResponse{} func (m *AuthUserDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteResponse) ProtoMessage() {} func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{84} + return fileDescriptor_77a6da22d6a3feb1, []int{86} } func (m *AuthUserDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5562,7 +5723,7 @@ func (m *AuthUserChangePasswordResponse) Reset() { *m = AuthUserChangePa func (m *AuthUserChangePasswordResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordResponse) ProtoMessage() {} func (*AuthUserChangePasswordResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{85} + return fileDescriptor_77a6da22d6a3feb1, []int{87} } func (m *AuthUserChangePasswordResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5609,7 +5770,7 @@ func (m *AuthUserGrantRoleResponse) Reset() { *m = AuthUserGrantRoleResp func (m *AuthUserGrantRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleResponse) ProtoMessage() {} func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{86} + return fileDescriptor_77a6da22d6a3feb1, []int{88} } func (m *AuthUserGrantRoleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5656,7 +5817,7 @@ func (m *AuthUserRevokeRoleResponse) Reset() { *m = AuthUserRevokeRoleRe func (m *AuthUserRevokeRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleResponse) ProtoMessage() {} func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{87} + return fileDescriptor_77a6da22d6a3feb1, []int{89} } func (m *AuthUserRevokeRoleResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5703,7 +5864,7 @@ func (m *AuthRoleAddResponse) Reset() { *m = AuthRoleAddResponse{} } func (m *AuthRoleAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddResponse) ProtoMessage() {} func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{88} + return fileDescriptor_77a6da22d6a3feb1, []int{90} } func (m *AuthRoleAddResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5751,7 +5912,7 @@ func (m *AuthRoleGetResponse) Reset() { *m = AuthRoleGetResponse{} } func (m *AuthRoleGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetResponse) ProtoMessage() {} func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{89} + return fileDescriptor_77a6da22d6a3feb1, []int{91} } func (m *AuthRoleGetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5806,7 +5967,7 @@ func (m *AuthRoleListResponse) Reset() { *m = AuthRoleListResponse{} } func (m *AuthRoleListResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleListResponse) ProtoMessage() {} func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{90} + return fileDescriptor_77a6da22d6a3feb1, []int{92} } func (m *AuthRoleListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5861,7 +6022,7 @@ func (m *AuthUserListResponse) Reset() { *m = AuthUserListResponse{} } func (m *AuthUserListResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserListResponse) ProtoMessage() {} func (*AuthUserListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{91} + return fileDescriptor_77a6da22d6a3feb1, []int{93} } func (m *AuthUserListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5915,7 +6076,7 @@ func (m *AuthRoleDeleteResponse) Reset() { *m = AuthRoleDeleteResponse{} func (m *AuthRoleDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteResponse) ProtoMessage() {} func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{92} + return fileDescriptor_77a6da22d6a3feb1, []int{94} } func (m *AuthRoleDeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5962,7 +6123,7 @@ func (m *AuthRoleGrantPermissionResponse) Reset() { *m = AuthRoleGrantPe func (m *AuthRoleGrantPermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionResponse) ProtoMessage() {} func (*AuthRoleGrantPermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{93} + return fileDescriptor_77a6da22d6a3feb1, []int{95} } func (m *AuthRoleGrantPermissionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6009,7 +6170,7 @@ func (m *AuthRoleRevokePermissionResponse) Reset() { *m = AuthRoleRevoke func (m *AuthRoleRevokePermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionResponse) ProtoMessage() {} func (*AuthRoleRevokePermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{94} + return fileDescriptor_77a6da22d6a3feb1, []int{96} } func (m *AuthRoleRevokePermissionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6113,8 +6274,10 @@ func init() { proto.RegisterType((*AlarmResponse)(nil), "etcdserverpb.AlarmResponse") proto.RegisterType((*DowngradeRequest)(nil), "etcdserverpb.DowngradeRequest") proto.RegisterType((*DowngradeResponse)(nil), "etcdserverpb.DowngradeResponse") + proto.RegisterType((*DowngradeVersionTestRequest)(nil), "etcdserverpb.DowngradeVersionTestRequest") proto.RegisterType((*StatusRequest)(nil), "etcdserverpb.StatusRequest") proto.RegisterType((*StatusResponse)(nil), "etcdserverpb.StatusResponse") + proto.RegisterType((*DowngradeInfo)(nil), "etcdserverpb.DowngradeInfo") proto.RegisterType((*AuthEnableRequest)(nil), "etcdserverpb.AuthEnableRequest") proto.RegisterType((*AuthDisableRequest)(nil), "etcdserverpb.AuthDisableRequest") proto.RegisterType((*AuthStatusRequest)(nil), "etcdserverpb.AuthStatusRequest") @@ -6154,264 +6317,293 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 4110 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x73, 0x1b, 0xc9, - 0x71, 0xe7, 0x02, 0x24, 0x01, 0x34, 0x3e, 0x08, 0x0e, 0x29, 0x0a, 0xc2, 0x49, 0x14, 0x6f, 0x74, - 0xd2, 0xf1, 0xa4, 0x3b, 0xe2, 0x4c, 0xdb, 0xb9, 0x2a, 0x25, 0x71, 0x0c, 0x91, 0x38, 0x89, 0x47, - 0x8a, 0xe4, 0x2d, 0x21, 0xdd, 0x47, 0xb9, 0xc2, 0x5a, 0x02, 0x23, 0x72, 0x43, 0x60, 0x17, 0xde, - 0x5d, 0x40, 0xe4, 0xe5, 0xc3, 0x2e, 0x97, 0xe3, 0x4a, 0x5e, 0xed, 0xaa, 0x54, 0xf2, 0x90, 0xbc, - 0xa4, 0x52, 0x2e, 0x3f, 0xf8, 0x39, 0xff, 0x42, 0x9e, 0xf2, 0x51, 0xf9, 0x07, 0x52, 0x17, 0xbf, - 0x24, 0x7f, 0x85, 0x6b, 0xbe, 0x76, 0x67, 0xf6, 0x83, 0x92, 0x8d, 0xbb, 0x7b, 0x11, 0x31, 0x3d, - 0x3d, 0xfd, 0xeb, 0xe9, 0x99, 0xe9, 0xee, 0xe9, 0x59, 0x41, 0xc9, 0x1b, 0xf5, 0x36, 0x46, 0x9e, - 0x1b, 0xb8, 0xa8, 0x42, 0x82, 0x5e, 0xdf, 0x27, 0xde, 0x84, 0x78, 0xa3, 0x93, 0xe6, 0xf2, 0xa9, - 0x7b, 0xea, 0xb2, 0x8e, 0x16, 0xfd, 0xc5, 0x79, 0x9a, 0x0d, 0xca, 0xd3, 0xb2, 0x46, 0x76, 0x6b, - 0x38, 0xe9, 0xf5, 0x46, 0x27, 0xad, 0xf3, 0x89, 0xe8, 0x69, 0x86, 0x3d, 0xd6, 0x38, 0x38, 0x1b, - 0x9d, 0xb0, 0x3f, 0xa2, 0xef, 0xe6, 0xa9, 0xeb, 0x9e, 0x0e, 0x08, 0xef, 0x75, 0x1c, 0x37, 0xb0, - 0x02, 0xdb, 0x75, 0x7c, 0xde, 0x8b, 0xff, 0xda, 0x80, 0x9a, 0x49, 0xfc, 0x91, 0xeb, 0xf8, 0xe4, - 0x09, 0xb1, 0xfa, 0xc4, 0x43, 0xb7, 0x00, 0x7a, 0x83, 0xb1, 0x1f, 0x10, 0xef, 0xd8, 0xee, 0x37, - 0x8c, 0x35, 0x63, 0x7d, 0xd6, 0x2c, 0x09, 0xca, 0x4e, 0x1f, 0xbd, 0x01, 0xa5, 0x21, 0x19, 0x9e, - 0xf0, 0xde, 0x1c, 0xeb, 0x2d, 0x72, 0xc2, 0x4e, 0x1f, 0x35, 0xa1, 0xe8, 0x91, 0x89, 0xed, 0xdb, - 0xae, 0xd3, 0xc8, 0xaf, 0x19, 0xeb, 0x79, 0x33, 0x6c, 0xd3, 0x81, 0x9e, 0xf5, 0x22, 0x38, 0x0e, - 0x88, 0x37, 0x6c, 0xcc, 0xf2, 0x81, 0x94, 0xd0, 0x25, 0xde, 0x10, 0xff, 0x74, 0x0e, 0x2a, 0xa6, - 0xe5, 0x9c, 0x12, 0x93, 0xfc, 0x70, 0x4c, 0xfc, 0x00, 0xd5, 0x21, 0x7f, 0x4e, 0x2e, 0x19, 0x7c, - 0xc5, 0xa4, 0x3f, 0xf9, 0x78, 0xe7, 0x94, 0x1c, 0x13, 0x87, 0x03, 0x57, 0xe8, 0x78, 0xe7, 0x94, - 0x74, 0x9c, 0x3e, 0x5a, 0x86, 0xb9, 0x81, 0x3d, 0xb4, 0x03, 0x81, 0xca, 0x1b, 0x9a, 0x3a, 0xb3, - 0x31, 0x75, 0xb6, 0x00, 0x7c, 0xd7, 0x0b, 0x8e, 0x5d, 0xaf, 0x4f, 0xbc, 0xc6, 0xdc, 0x9a, 0xb1, - 0x5e, 0xdb, 0x7c, 0x6b, 0x43, 0x5d, 0x86, 0x0d, 0x55, 0xa1, 0x8d, 0x23, 0xd7, 0x0b, 0x0e, 0x28, - 0xaf, 0x59, 0xf2, 0xe5, 0x4f, 0xf4, 0x21, 0x94, 0x99, 0x90, 0xc0, 0xf2, 0x4e, 0x49, 0xd0, 0x98, - 0x67, 0x52, 0xee, 0xbe, 0x42, 0x4a, 0x97, 0x31, 0x9b, 0x0c, 0x9e, 0xff, 0x46, 0x18, 0x2a, 0x3e, - 0xf1, 0x6c, 0x6b, 0x60, 0x7f, 0x61, 0x9d, 0x0c, 0x48, 0xa3, 0xb0, 0x66, 0xac, 0x17, 0x4d, 0x8d, - 0x46, 0xe7, 0x7f, 0x4e, 0x2e, 0xfd, 0x63, 0xd7, 0x19, 0x5c, 0x36, 0x8a, 0x8c, 0xa1, 0x48, 0x09, - 0x07, 0xce, 0xe0, 0x92, 0x2d, 0x9a, 0x3b, 0x76, 0x02, 0xde, 0x5b, 0x62, 0xbd, 0x25, 0x46, 0x61, - 0xdd, 0xeb, 0x50, 0x1f, 0xda, 0xce, 0xf1, 0xd0, 0xed, 0x1f, 0x87, 0x06, 0x01, 0x66, 0x90, 0xda, - 0xd0, 0x76, 0x9e, 0xba, 0x7d, 0x53, 0x9a, 0x85, 0x72, 0x5a, 0x17, 0x3a, 0x67, 0x59, 0x70, 0x5a, - 0x17, 0x2a, 0xe7, 0x06, 0x2c, 0x51, 0x99, 0x3d, 0x8f, 0x58, 0x01, 0x89, 0x98, 0x2b, 0x8c, 0x79, - 0x71, 0x68, 0x3b, 0x5b, 0xac, 0x47, 0xe3, 0xb7, 0x2e, 0x12, 0xfc, 0x55, 0xc1, 0x6f, 0x5d, 0xe8, - 0xfc, 0x78, 0x03, 0x4a, 0xa1, 0xcd, 0x51, 0x11, 0x66, 0xf7, 0x0f, 0xf6, 0x3b, 0xf5, 0x19, 0x04, - 0x30, 0xdf, 0x3e, 0xda, 0xea, 0xec, 0x6f, 0xd7, 0x0d, 0x54, 0x86, 0xc2, 0x76, 0x87, 0x37, 0x72, - 0xf8, 0x11, 0x40, 0x64, 0x5d, 0x54, 0x80, 0xfc, 0x6e, 0xe7, 0xb3, 0xfa, 0x0c, 0xe5, 0x79, 0xde, - 0x31, 0x8f, 0x76, 0x0e, 0xf6, 0xeb, 0x06, 0x1d, 0xbc, 0x65, 0x76, 0xda, 0xdd, 0x4e, 0x3d, 0x47, - 0x39, 0x9e, 0x1e, 0x6c, 0xd7, 0xf3, 0xa8, 0x04, 0x73, 0xcf, 0xdb, 0x7b, 0xcf, 0x3a, 0xf5, 0x59, - 0xfc, 0x0b, 0x03, 0xaa, 0x62, 0xbd, 0xf8, 0x99, 0x40, 0xdf, 0x81, 0xf9, 0x33, 0x76, 0x2e, 0xd8, - 0x56, 0x2c, 0x6f, 0xde, 0x8c, 0x2d, 0xae, 0x76, 0x76, 0x4c, 0xc1, 0x8b, 0x30, 0xe4, 0xcf, 0x27, - 0x7e, 0x23, 0xb7, 0x96, 0x5f, 0x2f, 0x6f, 0xd6, 0x37, 0xf8, 0x79, 0xdd, 0xd8, 0x25, 0x97, 0xcf, - 0xad, 0xc1, 0x98, 0x98, 0xb4, 0x13, 0x21, 0x98, 0x1d, 0xba, 0x1e, 0x61, 0x3b, 0xb6, 0x68, 0xb2, - 0xdf, 0x74, 0x1b, 0xb3, 0x45, 0x13, 0xbb, 0x95, 0x37, 0xf0, 0xaf, 0x0c, 0x80, 0xc3, 0x71, 0x90, - 0x7d, 0x34, 0x96, 0x61, 0x6e, 0x42, 0x05, 0x8b, 0x63, 0xc1, 0x1b, 0xec, 0x4c, 0x10, 0xcb, 0x27, - 0xe1, 0x99, 0xa0, 0x0d, 0x74, 0x1d, 0x0a, 0x23, 0x8f, 0x4c, 0x8e, 0xcf, 0x27, 0x0c, 0xa4, 0x68, - 0xce, 0xd3, 0xe6, 0xee, 0x04, 0xbd, 0x09, 0x15, 0xfb, 0xd4, 0x71, 0x3d, 0x72, 0xcc, 0x65, 0xcd, - 0xb1, 0xde, 0x32, 0xa7, 0x31, 0xbd, 0x15, 0x16, 0x2e, 0x78, 0x5e, 0x65, 0xd9, 0xa3, 0x24, 0xec, - 0x40, 0x99, 0xa9, 0x3a, 0x95, 0xf9, 0xde, 0x89, 0x74, 0xcc, 0xb1, 0x61, 0x49, 0x13, 0x0a, 0xad, - 0xf1, 0x0f, 0x00, 0x6d, 0x93, 0x01, 0x09, 0xc8, 0x34, 0xde, 0x43, 0xb1, 0x49, 0x5e, 0xb5, 0x09, - 0xfe, 0xb9, 0x01, 0x4b, 0x9a, 0xf8, 0xa9, 0xa6, 0xd5, 0x80, 0x42, 0x9f, 0x09, 0xe3, 0x1a, 0xe4, - 0x4d, 0xd9, 0x44, 0x0f, 0xa0, 0x28, 0x14, 0xf0, 0x1b, 0xf9, 0x8c, 0x4d, 0x53, 0xe0, 0x3a, 0xf9, - 0xf8, 0x57, 0x39, 0x28, 0x89, 0x89, 0x1e, 0x8c, 0x50, 0x1b, 0xaa, 0x1e, 0x6f, 0x1c, 0xb3, 0xf9, - 0x08, 0x8d, 0x9a, 0xd9, 0x4e, 0xe8, 0xc9, 0x8c, 0x59, 0x11, 0x43, 0x18, 0x19, 0xfd, 0x21, 0x94, - 0xa5, 0x88, 0xd1, 0x38, 0x10, 0x26, 0x6f, 0xe8, 0x02, 0xa2, 0xfd, 0xf7, 0x64, 0xc6, 0x04, 0xc1, - 0x7e, 0x38, 0x0e, 0x50, 0x17, 0x96, 0xe5, 0x60, 0x3e, 0x1b, 0xa1, 0x46, 0x9e, 0x49, 0x59, 0xd3, - 0xa5, 0x24, 0x97, 0xea, 0xc9, 0x8c, 0x89, 0xc4, 0x78, 0xa5, 0x53, 0x55, 0x29, 0xb8, 0xe0, 0xce, - 0x3b, 0xa1, 0x52, 0xf7, 0xc2, 0x49, 0xaa, 0xd4, 0xbd, 0x70, 0x1e, 0x95, 0xa0, 0x20, 0x5a, 0xf8, - 0x5f, 0x73, 0x00, 0x72, 0x35, 0x0e, 0x46, 0x68, 0x1b, 0x6a, 0x9e, 0x68, 0x69, 0xd6, 0x7a, 0x23, - 0xd5, 0x5a, 0x62, 0x11, 0x67, 0xcc, 0xaa, 0x1c, 0xc4, 0x95, 0xfb, 0x1e, 0x54, 0x42, 0x29, 0x91, - 0xc1, 0x6e, 0xa4, 0x18, 0x2c, 0x94, 0x50, 0x96, 0x03, 0xa8, 0xc9, 0x3e, 0x81, 0x6b, 0xe1, 0xf8, - 0x14, 0x9b, 0xbd, 0x79, 0x85, 0xcd, 0x42, 0x81, 0x4b, 0x52, 0x82, 0x6a, 0x35, 0x55, 0xb1, 0xc8, - 0x6c, 0x37, 0x52, 0xcc, 0x96, 0x54, 0x8c, 0x1a, 0x0e, 0x68, 0xbc, 0xe4, 0x4d, 0xfc, 0x7f, 0x79, - 0x28, 0x6c, 0xb9, 0xc3, 0x91, 0xe5, 0xd1, 0xd5, 0x98, 0xf7, 0x88, 0x3f, 0x1e, 0x04, 0xcc, 0x5c, - 0xb5, 0xcd, 0x3b, 0xba, 0x44, 0xc1, 0x26, 0xff, 0x9a, 0x8c, 0xd5, 0x14, 0x43, 0xe8, 0x60, 0x11, - 0x1e, 0x73, 0xaf, 0x31, 0x58, 0x04, 0x47, 0x31, 0x44, 0x1e, 0xe4, 0x7c, 0x74, 0x90, 0x9b, 0x50, - 0x98, 0x10, 0x2f, 0x0a, 0xe9, 0x4f, 0x66, 0x4c, 0x49, 0x40, 0xef, 0xc0, 0x42, 0x3c, 0xbc, 0xcc, - 0x09, 0x9e, 0x5a, 0x4f, 0x8f, 0x46, 0x77, 0xa0, 0xa2, 0xc5, 0xb8, 0x79, 0xc1, 0x57, 0x1e, 0x2a, - 0x21, 0x6e, 0x45, 0xfa, 0x55, 0x1a, 0x8f, 0x2b, 0x4f, 0x66, 0xa4, 0x67, 0x5d, 0x91, 0x9e, 0xb5, - 0x28, 0x46, 0x09, 0xdf, 0xaa, 0x39, 0x99, 0xef, 0xeb, 0x4e, 0x06, 0x7f, 0x1f, 0xaa, 0x9a, 0x81, - 0x68, 0xdc, 0xe9, 0x7c, 0xfc, 0xac, 0xbd, 0xc7, 0x83, 0xd4, 0x63, 0x16, 0x97, 0xcc, 0xba, 0x41, - 0x63, 0xdd, 0x5e, 0xe7, 0xe8, 0xa8, 0x9e, 0x43, 0x55, 0x28, 0xed, 0x1f, 0x74, 0x8f, 0x39, 0x57, - 0x1e, 0x3f, 0x0e, 0x25, 0x88, 0x20, 0xa7, 0xc4, 0xb6, 0x19, 0x25, 0xb6, 0x19, 0x32, 0xb6, 0xe5, - 0xa2, 0xd8, 0xc6, 0xc2, 0xdc, 0x5e, 0xa7, 0x7d, 0xd4, 0xa9, 0xcf, 0x3e, 0xaa, 0x41, 0x85, 0xdb, - 0xf7, 0x78, 0xec, 0xd0, 0x50, 0xfb, 0xcf, 0x06, 0x40, 0x74, 0x9a, 0x50, 0x0b, 0x0a, 0x3d, 0x8e, - 0xd3, 0x30, 0x98, 0x33, 0xba, 0x96, 0xba, 0x64, 0xa6, 0xe4, 0x42, 0xdf, 0x82, 0x82, 0x3f, 0xee, - 0xf5, 0x88, 0x2f, 0x43, 0xde, 0xf5, 0xb8, 0x3f, 0x14, 0xde, 0xca, 0x94, 0x7c, 0x74, 0xc8, 0x0b, - 0xcb, 0x1e, 0x8c, 0x59, 0x00, 0xbc, 0x7a, 0x88, 0xe0, 0xc3, 0xff, 0x60, 0x40, 0x59, 0xd9, 0xbc, - 0xbf, 0xa7, 0x13, 0xbe, 0x09, 0x25, 0xa6, 0x03, 0xe9, 0x0b, 0x37, 0x5c, 0x34, 0x23, 0x02, 0xfa, - 0x03, 0x28, 0xc9, 0x13, 0x20, 0x3d, 0x71, 0x23, 0x5d, 0xec, 0xc1, 0xc8, 0x8c, 0x58, 0xf1, 0x2e, - 0x2c, 0x32, 0xab, 0xf4, 0x68, 0x72, 0x2d, 0xed, 0xa8, 0xa6, 0x9f, 0x46, 0x2c, 0xfd, 0x6c, 0x42, - 0x71, 0x74, 0x76, 0xe9, 0xdb, 0x3d, 0x6b, 0x20, 0xb4, 0x08, 0xdb, 0xf8, 0x23, 0x40, 0xaa, 0xb0, - 0x69, 0xa6, 0x8b, 0xab, 0x50, 0x7e, 0x62, 0xf9, 0x67, 0x42, 0x25, 0xfc, 0x00, 0xaa, 0xb4, 0xb9, - 0xfb, 0xfc, 0x35, 0x74, 0x64, 0x97, 0x03, 0xc9, 0x3d, 0x95, 0xcd, 0x11, 0xcc, 0x9e, 0x59, 0xfe, - 0x19, 0x9b, 0x68, 0xd5, 0x64, 0xbf, 0xd1, 0x3b, 0x50, 0xef, 0xf1, 0x49, 0x1e, 0xc7, 0xae, 0x0c, - 0x0b, 0x82, 0x1e, 0x66, 0x82, 0x9f, 0x42, 0x85, 0xcf, 0xe1, 0xab, 0x56, 0x02, 0x2f, 0xc2, 0xc2, - 0x91, 0x63, 0x8d, 0xfc, 0x33, 0x57, 0x46, 0x37, 0x3a, 0xe9, 0x7a, 0x44, 0x9b, 0x0a, 0xf1, 0x6d, - 0x58, 0xf0, 0xc8, 0xd0, 0xb2, 0x1d, 0xdb, 0x39, 0x3d, 0x3e, 0xb9, 0x0c, 0x88, 0x2f, 0x2e, 0x4c, - 0xb5, 0x90, 0xfc, 0x88, 0x52, 0xa9, 0x6a, 0x27, 0x03, 0xf7, 0x44, 0xb8, 0x39, 0xf6, 0x1b, 0xff, - 0x2c, 0x07, 0x95, 0x4f, 0xac, 0xa0, 0x27, 0x97, 0x0e, 0xed, 0x40, 0x2d, 0x74, 0x6e, 0x8c, 0x22, - 0x74, 0x89, 0x85, 0x58, 0x36, 0x46, 0xa6, 0xd2, 0x32, 0x3a, 0x56, 0x7b, 0x2a, 0x81, 0x89, 0xb2, - 0x9c, 0x1e, 0x19, 0x84, 0xa2, 0x72, 0xd9, 0xa2, 0x18, 0xa3, 0x2a, 0x4a, 0x25, 0xa0, 0x03, 0xa8, - 0x8f, 0x3c, 0xf7, 0xd4, 0x23, 0xbe, 0x1f, 0x0a, 0xe3, 0x61, 0x0c, 0xa7, 0x08, 0x3b, 0x14, 0xac, - 0x91, 0xb8, 0x85, 0x91, 0x4e, 0x7a, 0xb4, 0x10, 0xe5, 0x33, 0xdc, 0x39, 0xfd, 0x57, 0x0e, 0x50, - 0x72, 0x52, 0xbf, 0x6b, 0x8a, 0x77, 0x17, 0x6a, 0x7e, 0x60, 0x79, 0x89, 0xcd, 0x56, 0x65, 0xd4, - 0xd0, 0xe3, 0xbf, 0x0d, 0xa1, 0x42, 0xc7, 0x8e, 0x1b, 0xd8, 0x2f, 0x2e, 0x45, 0x96, 0x5c, 0x93, - 0xe4, 0x7d, 0x46, 0x45, 0x1d, 0x28, 0xbc, 0xb0, 0x07, 0x01, 0xf1, 0xfc, 0xc6, 0xdc, 0x5a, 0x7e, - 0xbd, 0xb6, 0xf9, 0xe0, 0x55, 0xcb, 0xb0, 0xf1, 0x21, 0xe3, 0xef, 0x5e, 0x8e, 0x88, 0x29, 0xc7, - 0xaa, 0x99, 0xe7, 0xbc, 0x96, 0x8d, 0xdf, 0x80, 0xe2, 0x4b, 0x2a, 0x82, 0xde, 0xb2, 0x0b, 0x3c, - 0x59, 0x64, 0x6d, 0x7e, 0xc9, 0x7e, 0xe1, 0x59, 0xa7, 0x43, 0xe2, 0x04, 0xf2, 0x1e, 0x28, 0xdb, - 0xf8, 0x2e, 0x40, 0x04, 0x43, 0x5d, 0xfe, 0xfe, 0xc1, 0xe1, 0xb3, 0x6e, 0x7d, 0x06, 0x55, 0xa0, - 0xb8, 0x7f, 0xb0, 0xdd, 0xd9, 0xeb, 0xd0, 0xf8, 0x80, 0x5b, 0xd2, 0xa4, 0xda, 0x5a, 0xaa, 0x98, - 0x86, 0x86, 0x89, 0x57, 0x60, 0x39, 0x6d, 0x01, 0x69, 0x2e, 0x5a, 0x15, 0xbb, 0x74, 0xaa, 0xa3, - 0xa2, 0x42, 0xe7, 0xf4, 0xe9, 0x36, 0xa0, 0xc0, 0x77, 0x6f, 0x5f, 0x24, 0xe7, 0xb2, 0x49, 0x0d, - 0xc1, 0x37, 0x23, 0xe9, 0x8b, 0x55, 0x0a, 0xdb, 0xa9, 0xee, 0x65, 0x2e, 0xd5, 0xbd, 0xa0, 0x3b, - 0x50, 0x0d, 0x4f, 0x83, 0xe5, 0x8b, 0x5c, 0xa0, 0x64, 0x56, 0xe4, 0x46, 0xa7, 0x34, 0xcd, 0xe8, - 0x05, 0xdd, 0xe8, 0xe8, 0x2e, 0xcc, 0x93, 0x09, 0x71, 0x02, 0xbf, 0x51, 0x66, 0x11, 0xa3, 0x2a, - 0x73, 0xf7, 0x0e, 0xa5, 0x9a, 0xa2, 0x13, 0x7f, 0x17, 0x16, 0xd9, 0x1d, 0xe9, 0xb1, 0x67, 0x39, - 0xea, 0x65, 0xae, 0xdb, 0xdd, 0x13, 0xe6, 0xa6, 0x3f, 0x51, 0x0d, 0x72, 0x3b, 0xdb, 0xc2, 0x08, - 0xb9, 0x9d, 0x6d, 0xfc, 0x13, 0x03, 0x90, 0x3a, 0x6e, 0x2a, 0x3b, 0xc7, 0x84, 0x4b, 0xf8, 0x7c, - 0x04, 0xbf, 0x0c, 0x73, 0xc4, 0xf3, 0x5c, 0x8f, 0x59, 0xb4, 0x64, 0xf2, 0x06, 0x7e, 0x4b, 0xe8, - 0x60, 0x92, 0x89, 0x7b, 0x1e, 0x9e, 0x41, 0x2e, 0xcd, 0x08, 0x55, 0xdd, 0x85, 0x25, 0x8d, 0x6b, - 0xaa, 0xc8, 0xf5, 0x21, 0x2c, 0x30, 0x61, 0x5b, 0x67, 0xa4, 0x77, 0x3e, 0x72, 0x6d, 0x27, 0x81, - 0x47, 0x57, 0x2e, 0x72, 0xb0, 0x74, 0x1e, 0x7c, 0x62, 0x95, 0x90, 0xd8, 0xed, 0xee, 0xe1, 0xcf, - 0x60, 0x25, 0x26, 0x47, 0xaa, 0xff, 0x27, 0x50, 0xee, 0x85, 0x44, 0x5f, 0xe4, 0x3a, 0xb7, 0x74, - 0xe5, 0xe2, 0x43, 0xd5, 0x11, 0xf8, 0x00, 0xae, 0x27, 0x44, 0x4f, 0x35, 0xe7, 0xb7, 0xe1, 0x1a, - 0x13, 0xb8, 0x4b, 0xc8, 0xa8, 0x3d, 0xb0, 0x27, 0x99, 0x96, 0x1e, 0x89, 0x49, 0x29, 0x8c, 0x5f, - 0xef, 0xbe, 0xc0, 0x7f, 0x24, 0x10, 0xbb, 0xf6, 0x90, 0x74, 0xdd, 0xbd, 0x6c, 0xdd, 0x68, 0x34, - 0x3b, 0x27, 0x97, 0xbe, 0x48, 0x6b, 0xd8, 0x6f, 0xfc, 0x2f, 0x86, 0x30, 0x95, 0x3a, 0xfc, 0x6b, - 0xde, 0xc9, 0xab, 0x00, 0xa7, 0xf4, 0xc8, 0x90, 0x3e, 0xed, 0xe0, 0x15, 0x15, 0x85, 0x12, 0xea, - 0x49, 0xfd, 0x77, 0x45, 0xe8, 0xb9, 0x2c, 0xf6, 0x39, 0xfb, 0x27, 0xf4, 0x72, 0xb7, 0xa0, 0xcc, - 0x08, 0x47, 0x81, 0x15, 0x8c, 0xfd, 0xc4, 0x62, 0xfc, 0x95, 0xd8, 0xf6, 0x72, 0xd0, 0x54, 0xf3, - 0xfa, 0x16, 0xcc, 0xb3, 0xcb, 0x84, 0x4c, 0xa5, 0x6f, 0xa4, 0xec, 0x47, 0xae, 0x87, 0x29, 0x18, - 0xf1, 0xcf, 0x0c, 0x98, 0x7f, 0xca, 0x4a, 0xb0, 0x8a, 0x6a, 0xb3, 0x72, 0x2d, 0x1c, 0x6b, 0xc8, - 0x0b, 0x43, 0x25, 0x93, 0xfd, 0x66, 0xa9, 0x27, 0x21, 0xde, 0x33, 0x73, 0x8f, 0xa7, 0xb8, 0x25, - 0x33, 0x6c, 0x53, 0x9b, 0xf5, 0x06, 0x36, 0x71, 0x02, 0xd6, 0x3b, 0xcb, 0x7a, 0x15, 0x0a, 0xcd, - 0x9e, 0x6d, 0x7f, 0x8f, 0x58, 0x9e, 0x23, 0x8a, 0xa6, 0x45, 0x33, 0x22, 0xe0, 0x3d, 0xa8, 0x73, - 0x3d, 0xda, 0xfd, 0xbe, 0x92, 0x60, 0x86, 0x68, 0x46, 0x0c, 0x4d, 0x93, 0x96, 0x8b, 0x4b, 0xfb, - 0xa5, 0x01, 0x8b, 0x8a, 0xb8, 0xa9, 0xac, 0xfa, 0x2e, 0xcc, 0xf3, 0x22, 0xb5, 0xc8, 0x74, 0x96, - 0xf5, 0x51, 0x1c, 0xc6, 0x14, 0x3c, 0x68, 0x03, 0x0a, 0xfc, 0x97, 0xbc, 0x03, 0xa4, 0xb3, 0x4b, - 0x26, 0x7c, 0x17, 0x96, 0x04, 0x89, 0x0c, 0xdd, 0xb4, 0x83, 0xc1, 0x16, 0x03, 0xff, 0x05, 0x2c, - 0xeb, 0x6c, 0x53, 0x4d, 0x49, 0x51, 0x32, 0xf7, 0x3a, 0x4a, 0xb6, 0xa5, 0x92, 0xcf, 0x46, 0x7d, - 0x25, 0x8f, 0x8a, 0xef, 0x18, 0x75, 0xbd, 0x72, 0xfa, 0x7a, 0x45, 0x13, 0x90, 0x22, 0xbe, 0xd1, - 0x09, 0x7c, 0x20, 0xb7, 0xc3, 0x9e, 0xed, 0x87, 0x3e, 0x1c, 0x43, 0x65, 0x60, 0x3b, 0xc4, 0xf2, - 0x44, 0xe5, 0xdc, 0xe0, 0x95, 0x73, 0x95, 0x86, 0xbf, 0x00, 0xa4, 0x0e, 0xfc, 0x46, 0x95, 0xbe, - 0x27, 0x4d, 0x76, 0xe8, 0xb9, 0x43, 0x37, 0xd3, 0xec, 0xf8, 0x2f, 0xe1, 0x5a, 0x8c, 0xef, 0x1b, - 0x55, 0x73, 0x09, 0x16, 0xb7, 0x89, 0x4c, 0x68, 0xa4, 0xdb, 0xfb, 0x08, 0x90, 0x4a, 0x9c, 0x2a, - 0xb2, 0xb5, 0x60, 0xf1, 0xa9, 0x3b, 0xa1, 0x2e, 0x92, 0x52, 0x23, 0xdf, 0xc0, 0xeb, 0x10, 0xa1, - 0x29, 0xc2, 0x36, 0x05, 0x57, 0x07, 0x4c, 0x05, 0xfe, 0x1f, 0x06, 0x54, 0xda, 0x03, 0xcb, 0x1b, - 0x4a, 0xe0, 0xef, 0xc1, 0x3c, 0xbf, 0x5d, 0x8b, 0x82, 0xd6, 0x3d, 0x5d, 0x8c, 0xca, 0xcb, 0x1b, - 0x6d, 0x7e, 0x17, 0x17, 0xa3, 0xa8, 0xe2, 0xe2, 0xcd, 0x6b, 0x3b, 0xf6, 0x06, 0xb6, 0x8d, 0xde, - 0x83, 0x39, 0x8b, 0x0e, 0x61, 0xa1, 0xa8, 0x16, 0xaf, 0x6b, 0x30, 0x69, 0xec, 0x0e, 0xc0, 0xb9, - 0xf0, 0x77, 0xa0, 0xac, 0x20, 0xa0, 0x02, 0xe4, 0x1f, 0x77, 0x44, 0xc2, 0xde, 0xde, 0xea, 0xee, - 0x3c, 0xe7, 0x05, 0x9d, 0x1a, 0xc0, 0x76, 0x27, 0x6c, 0xe7, 0xf0, 0xa7, 0x62, 0x94, 0x70, 0xfb, - 0xaa, 0x3e, 0x46, 0x96, 0x3e, 0xb9, 0xd7, 0xd2, 0xe7, 0x02, 0xaa, 0x62, 0xfa, 0xd3, 0x86, 0x31, - 0x26, 0x2f, 0x23, 0x8c, 0x29, 0xca, 0x9b, 0x82, 0x11, 0xff, 0xda, 0x80, 0xfa, 0xb6, 0xfb, 0xd2, - 0x39, 0xf5, 0xac, 0x7e, 0x78, 0x4e, 0x3e, 0x8c, 0xad, 0xd4, 0x46, 0xac, 0x38, 0x1a, 0xe3, 0x8f, - 0x08, 0xb1, 0x15, 0x6b, 0x44, 0x65, 0x43, 0x1e, 0x0b, 0x65, 0x13, 0x7f, 0x00, 0x0b, 0xb1, 0x41, - 0xd4, 0xf6, 0xcf, 0xdb, 0x7b, 0x3b, 0xdb, 0xd4, 0xd6, 0xac, 0xb0, 0xd6, 0xd9, 0x6f, 0x3f, 0xda, - 0xeb, 0x88, 0x07, 0xa4, 0xf6, 0xfe, 0x56, 0x67, 0xaf, 0x9e, 0xc3, 0x3d, 0x58, 0x54, 0xe0, 0xa7, - 0x7d, 0x19, 0xc8, 0xd0, 0x6e, 0x01, 0xaa, 0x22, 0xda, 0x8b, 0x43, 0xf9, 0xef, 0x39, 0xa8, 0x49, - 0xca, 0xd7, 0x83, 0x89, 0x56, 0x60, 0xbe, 0x7f, 0x72, 0x64, 0x7f, 0x21, 0x5f, 0x8e, 0x44, 0x8b, - 0xd2, 0x07, 0x1c, 0x87, 0x3f, 0xdf, 0x8a, 0x16, 0x0d, 0xe3, 0x9e, 0xf5, 0x22, 0xd8, 0x71, 0xfa, - 0xe4, 0x82, 0x25, 0x05, 0xb3, 0x66, 0x44, 0x60, 0x15, 0x26, 0xf1, 0xcc, 0xcb, 0x6e, 0x56, 0xca, - 0xb3, 0x2f, 0xba, 0x0f, 0x75, 0xfa, 0xbb, 0x3d, 0x1a, 0x0d, 0x6c, 0xd2, 0xe7, 0x02, 0x0a, 0x8c, - 0x27, 0x41, 0xa7, 0xe8, 0xec, 0x2e, 0xe2, 0x37, 0x8a, 0x2c, 0x2c, 0x89, 0x16, 0x5a, 0x83, 0x32, - 0xd7, 0x6f, 0xc7, 0x79, 0xe6, 0x13, 0xf6, 0xf6, 0x99, 0x37, 0x55, 0x92, 0x9e, 0x66, 0x40, 0x3c, - 0xcd, 0x58, 0x82, 0xc5, 0xf6, 0x38, 0x38, 0xeb, 0x38, 0x34, 0x56, 0x48, 0x2b, 0x2f, 0x03, 0xa2, - 0xc4, 0x6d, 0xdb, 0x57, 0xa9, 0x82, 0x55, 0x5f, 0x90, 0x0e, 0x2c, 0x51, 0x22, 0x71, 0x02, 0xbb, - 0xa7, 0xc4, 0x55, 0x99, 0x79, 0x19, 0xb1, 0xcc, 0xcb, 0xf2, 0xfd, 0x97, 0xae, 0xd7, 0x17, 0x36, - 0x0f, 0xdb, 0xf8, 0x9f, 0x0c, 0x0e, 0xf9, 0xcc, 0xd7, 0xd2, 0xa7, 0xdf, 0x51, 0x0c, 0x7a, 0x1f, - 0x0a, 0xee, 0x88, 0xbd, 0xf0, 0x8b, 0x32, 0xcc, 0xca, 0x06, 0xff, 0x26, 0x60, 0x43, 0x08, 0x3e, - 0xe0, 0xbd, 0xa6, 0x64, 0x43, 0xf7, 0xa0, 0x76, 0x66, 0xf9, 0x67, 0xa4, 0x7f, 0x28, 0x65, 0xf2, - 0x9b, 0x5f, 0x8c, 0x8a, 0xd7, 0x23, 0xfd, 0x1e, 0x93, 0xe0, 0x0a, 0xfd, 0xf0, 0x03, 0xb8, 0x26, - 0x39, 0xc5, 0xeb, 0xc4, 0x15, 0xcc, 0x2f, 0xe1, 0x96, 0x64, 0xde, 0x3a, 0xb3, 0x9c, 0x53, 0x22, - 0x01, 0x7f, 0x5f, 0x0b, 0x24, 0xe7, 0x93, 0x4f, 0x9d, 0xcf, 0x23, 0x68, 0x84, 0xf3, 0x61, 0x37, - 0x6b, 0x77, 0xa0, 0x2a, 0x3a, 0xf6, 0xc5, 0x79, 0x2a, 0x99, 0xec, 0x37, 0xa5, 0x79, 0xee, 0x20, - 0x4c, 0xa5, 0xe9, 0x6f, 0xbc, 0x05, 0x37, 0xa4, 0x0c, 0x71, 0xe7, 0xd5, 0x85, 0x24, 0x14, 0x4f, - 0x13, 0x22, 0x0c, 0x4b, 0x87, 0x5e, 0xbd, 0xf0, 0x2a, 0xa7, 0xbe, 0x04, 0x4c, 0xa6, 0xa1, 0xc8, - 0xbc, 0xc6, 0x37, 0x25, 0x55, 0x4c, 0xc9, 0x96, 0x24, 0x99, 0x0a, 0x50, 0xc9, 0x62, 0xc1, 0x28, - 0x39, 0xb1, 0x60, 0x09, 0xd1, 0x3f, 0x80, 0xd5, 0x50, 0x09, 0x6a, 0xb7, 0x43, 0xe2, 0x0d, 0x6d, - 0xdf, 0x57, 0xea, 0xde, 0x69, 0x13, 0xbf, 0x07, 0xb3, 0x23, 0x22, 0x82, 0x50, 0x79, 0x13, 0xc9, - 0x4d, 0xa9, 0x0c, 0x66, 0xfd, 0xb8, 0x0f, 0xb7, 0xa5, 0x74, 0x6e, 0xd1, 0x54, 0xf1, 0x71, 0xa5, - 0x64, 0x35, 0x30, 0x97, 0x51, 0x0d, 0xcc, 0xc7, 0xde, 0x62, 0x3e, 0xe2, 0x86, 0x94, 0x67, 0x7e, - 0xaa, 0xe4, 0x62, 0x97, 0xdb, 0x34, 0x74, 0x15, 0x53, 0x09, 0xfb, 0x1b, 0xe1, 0x05, 0xbe, 0x2a, - 0x0f, 0x4f, 0xd8, 0x0c, 0xe5, 0x43, 0x87, 0x6c, 0xd2, 0xac, 0x99, 0x2e, 0x80, 0xa9, 0xd6, 0x42, - 0x67, 0x4d, 0x8d, 0x86, 0x4f, 0x60, 0x59, 0xf7, 0x6b, 0x53, 0xe9, 0xb2, 0x0c, 0x73, 0x81, 0x7b, - 0x4e, 0x64, 0xac, 0xe1, 0x0d, 0x69, 0xbb, 0xd0, 0xe7, 0x4d, 0x65, 0x3b, 0x2b, 0x12, 0xc6, 0x4e, - 0xc7, 0xb4, 0xfa, 0xd2, 0x8d, 0x25, 0xef, 0x40, 0xbc, 0x81, 0xf7, 0x61, 0x25, 0xee, 0xd9, 0xa6, - 0x52, 0xf9, 0x39, 0x3f, 0x4b, 0x69, 0xce, 0x6f, 0x2a, 0xb9, 0x1f, 0x47, 0x7e, 0x49, 0xf1, 0x6d, - 0x53, 0x89, 0x34, 0xa1, 0x99, 0xe6, 0xea, 0xbe, 0x8a, 0xa3, 0x13, 0x7a, 0xbe, 0xa9, 0x84, 0xf9, - 0x91, 0xb0, 0xe9, 0x97, 0x3f, 0x72, 0x57, 0xf9, 0x2b, 0xdd, 0x95, 0x38, 0x24, 0x91, 0x43, 0xfd, - 0x1a, 0x36, 0x9d, 0xc0, 0x88, 0x7c, 0xf9, 0xb4, 0x18, 0x34, 0x9c, 0x85, 0x18, 0xac, 0x21, 0x37, - 0xb6, 0x1a, 0x01, 0xa6, 0x5a, 0x8c, 0x4f, 0x22, 0x37, 0x9e, 0x08, 0x12, 0x53, 0x09, 0xfe, 0x14, - 0xd6, 0xb2, 0xe3, 0xc3, 0x34, 0x92, 0xef, 0xb7, 0xa0, 0x14, 0x5e, 0x86, 0x94, 0xef, 0xcd, 0xca, - 0x50, 0xd8, 0x3f, 0x38, 0x3a, 0x6c, 0x6f, 0x75, 0xf8, 0x07, 0x67, 0x5b, 0x07, 0xa6, 0xf9, 0xec, - 0xb0, 0x5b, 0xcf, 0x6d, 0xfe, 0x26, 0x0f, 0xb9, 0xdd, 0xe7, 0xe8, 0x33, 0x98, 0xe3, 0x5f, 0x5f, - 0x5c, 0xf1, 0xc9, 0x4d, 0xf3, 0xaa, 0x0f, 0x4c, 0xf0, 0xf5, 0x9f, 0xfc, 0xf7, 0x6f, 0x7e, 0x91, - 0x5b, 0xc4, 0x95, 0xd6, 0xe4, 0xdb, 0xad, 0xf3, 0x49, 0x8b, 0x85, 0xa9, 0x87, 0xc6, 0x7d, 0xf4, - 0x31, 0xe4, 0x0f, 0xc7, 0x01, 0xca, 0xfc, 0x14, 0xa7, 0x99, 0xfd, 0xcd, 0x09, 0xbe, 0xc6, 0x84, - 0x2e, 0x60, 0x10, 0x42, 0x47, 0xe3, 0x80, 0x8a, 0xfc, 0x21, 0x94, 0xd5, 0x2f, 0x46, 0x5e, 0xf9, - 0x7d, 0x4e, 0xf3, 0xd5, 0x5f, 0xa3, 0xe0, 0x5b, 0x0c, 0xea, 0x3a, 0x46, 0x02, 0x8a, 0x7f, 0xd3, - 0xa2, 0xce, 0xa2, 0x7b, 0xe1, 0xa0, 0xcc, 0xaf, 0x77, 0x9a, 0xd9, 0x1f, 0xa8, 0x24, 0x66, 0x11, - 0x5c, 0x38, 0x54, 0xe4, 0x9f, 0x89, 0x6f, 0x53, 0x7a, 0x01, 0xba, 0x9d, 0xf2, 0x6d, 0x82, 0xfa, - 0x0a, 0xdf, 0x5c, 0xcb, 0x66, 0x10, 0x20, 0x37, 0x19, 0xc8, 0x0a, 0x5e, 0x14, 0x20, 0xbd, 0x90, - 0xe5, 0xa1, 0x71, 0x7f, 0xb3, 0x07, 0x73, 0xec, 0x85, 0x0b, 0x7d, 0x2e, 0x7f, 0x34, 0x53, 0x9e, - 0xfa, 0x32, 0x16, 0x5a, 0x7b, 0x1b, 0xc3, 0xcb, 0x0c, 0xa8, 0x86, 0x4b, 0x14, 0x88, 0xbd, 0x6f, - 0x3d, 0x34, 0xee, 0xaf, 0x1b, 0xef, 0x1b, 0x9b, 0xbf, 0x9e, 0x83, 0x39, 0x56, 0xda, 0x45, 0xe7, - 0x00, 0xd1, 0x6b, 0x4f, 0x7c, 0x76, 0x89, 0xf7, 0xa3, 0xf8, 0xec, 0x92, 0x0f, 0x45, 0xb8, 0xc9, - 0x40, 0x97, 0xf1, 0x02, 0x05, 0x65, 0x15, 0xe3, 0x16, 0x2b, 0x82, 0x53, 0x3b, 0xfe, 0xad, 0x21, - 0x2a, 0xdb, 0xfc, 0x2c, 0xa1, 0x34, 0x69, 0xda, 0x93, 0x4f, 0x7c, 0x3b, 0xa4, 0x3c, 0xf7, 0xe0, - 0xef, 0x32, 0xc0, 0x16, 0xae, 0x47, 0x80, 0x1e, 0xe3, 0x78, 0x68, 0xdc, 0xff, 0xbc, 0x81, 0x97, - 0x84, 0x95, 0x63, 0x3d, 0xe8, 0x47, 0x50, 0xd3, 0x9f, 0x34, 0xd0, 0x9d, 0x14, 0xac, 0xf8, 0xcb, - 0x48, 0xf3, 0xad, 0xab, 0x99, 0x84, 0x4e, 0xab, 0x4c, 0x27, 0x01, 0xce, 0x91, 0xcf, 0x09, 0x19, - 0x59, 0x94, 0x49, 0xac, 0x01, 0xfa, 0x47, 0x43, 0xbc, 0x38, 0x45, 0x6f, 0x14, 0x28, 0x4d, 0x7a, - 0xe2, 0x05, 0xa4, 0x79, 0xf7, 0x15, 0x5c, 0x42, 0x89, 0x3f, 0x66, 0x4a, 0x7c, 0x80, 0x97, 0x23, - 0x25, 0x02, 0x7b, 0x48, 0x02, 0x57, 0x68, 0xf1, 0xf9, 0x4d, 0x7c, 0x5d, 0x33, 0x8e, 0xd6, 0x1b, - 0x2d, 0x16, 0x7f, 0x67, 0x48, 0x5d, 0x2c, 0xed, 0xdd, 0x22, 0x75, 0xb1, 0xf4, 0x47, 0x8a, 0xb4, - 0xc5, 0xe2, 0xaf, 0x0a, 0x69, 0x8b, 0x15, 0xf6, 0x6c, 0xfe, 0xff, 0x2c, 0x14, 0xb6, 0xf8, 0x37, - 0xe1, 0xc8, 0x85, 0x52, 0x58, 0xa6, 0x47, 0xab, 0x69, 0x75, 0xc6, 0xe8, 0x5a, 0xd3, 0xbc, 0x9d, - 0xd9, 0x2f, 0x14, 0x7a, 0x93, 0x29, 0xf4, 0x06, 0x5e, 0xa1, 0xc8, 0xe2, 0xb3, 0xf3, 0x16, 0x2f, - 0x66, 0xb5, 0xac, 0x7e, 0x9f, 0x1a, 0xe2, 0xcf, 0xa1, 0xa2, 0xd6, 0xd1, 0xd1, 0x9b, 0xa9, 0xb5, - 0x4d, 0xb5, 0x14, 0xdf, 0xc4, 0x57, 0xb1, 0x08, 0xe4, 0xb7, 0x18, 0xf2, 0x2a, 0xbe, 0x91, 0x82, - 0xec, 0x31, 0x56, 0x0d, 0x9c, 0xd7, 0xc0, 0xd3, 0xc1, 0xb5, 0x12, 0x7b, 0x3a, 0xb8, 0x5e, 0x42, - 0xbf, 0x12, 0x7c, 0xcc, 0x58, 0x29, 0xb8, 0x0f, 0x10, 0x55, 0xb2, 0x51, 0xaa, 0x2d, 0x95, 0x7b, - 0x5d, 0xdc, 0x39, 0x24, 0x8b, 0xe0, 0x18, 0x33, 0x58, 0xb1, 0xef, 0x62, 0xb0, 0x03, 0xdb, 0x0f, - 0xf8, 0xc1, 0xac, 0x6a, 0xa5, 0x69, 0x94, 0x3a, 0x1f, 0xbd, 0xbe, 0xdd, 0xbc, 0x73, 0x25, 0x8f, - 0x40, 0xbf, 0xcb, 0xd0, 0x6f, 0xe3, 0x66, 0x0a, 0xfa, 0x88, 0xf3, 0xd2, 0xcd, 0xf6, 0xe3, 0x02, - 0x94, 0x9f, 0x5a, 0xb6, 0x13, 0x10, 0xc7, 0x72, 0x7a, 0x04, 0x9d, 0xc0, 0x1c, 0x8b, 0xd4, 0x71, - 0x47, 0xac, 0x96, 0x6d, 0xe3, 0x8e, 0x58, 0xab, 0x69, 0xe2, 0x35, 0x06, 0xdc, 0xc4, 0xd7, 0x28, - 0xf0, 0x30, 0x12, 0xdd, 0x62, 0xa5, 0x48, 0x3a, 0xe9, 0x17, 0x30, 0x2f, 0x5e, 0xfb, 0x62, 0x82, - 0xb4, 0xe2, 0x4f, 0xf3, 0x66, 0x7a, 0x67, 0xda, 0x5e, 0x56, 0x61, 0x7c, 0xc6, 0x47, 0x71, 0x26, - 0x00, 0x51, 0x8d, 0x3d, 0xbe, 0xa2, 0x89, 0x92, 0x7c, 0x73, 0x2d, 0x9b, 0x21, 0xcd, 0xa6, 0x2a, - 0x66, 0x3f, 0xe4, 0xa5, 0xb8, 0x7f, 0x0a, 0xb3, 0x4f, 0x2c, 0xff, 0x0c, 0xc5, 0x62, 0xaf, 0xf2, - 0xad, 0x58, 0xb3, 0x99, 0xd6, 0x25, 0x50, 0x6e, 0x33, 0x94, 0x1b, 0xdc, 0x95, 0xa9, 0x28, 0x67, - 0x96, 0x7f, 0x26, 0xec, 0xc7, 0x3f, 0x1d, 0x8b, 0xdb, 0x4f, 0xfb, 0xfc, 0x2c, 0x6e, 0x3f, 0xfd, - 0x6b, 0xb3, 0x6c, 0xfb, 0x51, 0x94, 0xf3, 0x09, 0xc5, 0x19, 0x41, 0x51, 0x7e, 0xad, 0x85, 0x62, - 0x4f, 0xf7, 0xb1, 0x2f, 0xbb, 0x9a, 0xab, 0x59, 0xdd, 0x02, 0xed, 0x0e, 0x43, 0xbb, 0x85, 0x1b, - 0x89, 0xd5, 0x12, 0x9c, 0x0f, 0x8d, 0xfb, 0xef, 0x1b, 0xe8, 0x47, 0x00, 0xd1, 0xc3, 0x44, 0xe2, - 0x0c, 0xc6, 0xdf, 0x38, 0x12, 0x67, 0x30, 0xf1, 0xa6, 0x81, 0x37, 0x18, 0xee, 0x3a, 0xbe, 0x13, - 0xc7, 0x0d, 0x3c, 0xcb, 0xf1, 0x5f, 0x10, 0xef, 0x3d, 0x5e, 0x67, 0xf5, 0xcf, 0xec, 0x11, 0x9d, - 0xb2, 0x07, 0xa5, 0xb0, 0xee, 0x1c, 0xf7, 0xb7, 0xf1, 0x7a, 0x78, 0xdc, 0xdf, 0x26, 0x0a, 0xd6, - 0xba, 0xe3, 0xd1, 0xf6, 0x8b, 0x64, 0xa5, 0x47, 0xf0, 0x97, 0x75, 0x98, 0xa5, 0x79, 0x37, 0x4d, - 0x4f, 0xa2, 0xca, 0x49, 0x7c, 0xf6, 0x89, 0x3a, 0x6a, 0x7c, 0xf6, 0xc9, 0xa2, 0x8b, 0x9e, 0x9e, - 0xd0, 0x6b, 0x56, 0x8b, 0x17, 0x29, 0xe8, 0x4c, 0x5d, 0x28, 0x2b, 0xa5, 0x15, 0x94, 0x22, 0x4c, - 0x2f, 0xd0, 0xc6, 0x03, 0x5e, 0x4a, 0x5d, 0x06, 0xbf, 0xc1, 0xf0, 0xae, 0xf1, 0x80, 0xc7, 0xf0, - 0xfa, 0x9c, 0x83, 0x02, 0x8a, 0xd9, 0x89, 0x93, 0x9f, 0x32, 0x3b, 0xfd, 0xf4, 0xaf, 0x65, 0x33, - 0x64, 0xce, 0x2e, 0x3a, 0xfa, 0x2f, 0xa1, 0xa2, 0x16, 0x58, 0x50, 0x8a, 0xf2, 0xb1, 0xa2, 0x72, - 0x3c, 0x92, 0xa4, 0xd5, 0x67, 0x74, 0xdf, 0xc6, 0x20, 0x2d, 0x85, 0x8d, 0x02, 0x0f, 0xa0, 0x20, - 0x2a, 0x2e, 0x69, 0x26, 0xd5, 0x0b, 0xd0, 0x69, 0x26, 0x8d, 0x95, 0x6b, 0xf4, 0xfc, 0x99, 0x21, - 0xd2, 0x4b, 0xa5, 0x8c, 0xd6, 0x02, 0xed, 0x31, 0x09, 0xb2, 0xd0, 0xa2, 0x5a, 0x66, 0x16, 0x9a, - 0x72, 0xa1, 0xcf, 0x42, 0x3b, 0x25, 0x81, 0xf0, 0x07, 0xf2, 0xa2, 0x8c, 0x32, 0x84, 0xa9, 0x11, - 0x12, 0x5f, 0xc5, 0x92, 0x76, 0xbd, 0x89, 0x00, 0x65, 0x78, 0xbc, 0x00, 0x88, 0xea, 0x41, 0xf1, - 0x9c, 0x35, 0xb5, 0x0e, 0x1e, 0xcf, 0x59, 0xd3, 0x4b, 0x4a, 0xba, 0x8f, 0x8d, 0x70, 0xf9, 0xed, - 0x8a, 0x22, 0xff, 0xdc, 0x00, 0x94, 0x2c, 0x1d, 0xa1, 0x07, 0xe9, 0xd2, 0x53, 0xab, 0xeb, 0xcd, - 0x77, 0x5f, 0x8f, 0x39, 0xcd, 0x21, 0x47, 0x2a, 0xf5, 0x18, 0xf7, 0xe8, 0x25, 0x55, 0xea, 0xc7, - 0x06, 0x54, 0xb5, 0xba, 0x13, 0xba, 0x97, 0xb1, 0xa6, 0xb1, 0xa2, 0x7b, 0xf3, 0xed, 0x57, 0xf2, - 0xa5, 0x25, 0xf3, 0xca, 0x0e, 0x90, 0xb7, 0x9a, 0x9f, 0x1a, 0x50, 0xd3, 0xeb, 0x54, 0x28, 0x43, - 0x76, 0xa2, 0x68, 0xdf, 0x5c, 0x7f, 0x35, 0xe3, 0xd5, 0xcb, 0x13, 0x5d, 0x68, 0x06, 0x50, 0x10, - 0x95, 0xad, 0xb4, 0x8d, 0xaf, 0x97, 0xfb, 0xd3, 0x36, 0x7e, 0xac, 0x2c, 0x96, 0xb2, 0xf1, 0x3d, - 0x77, 0x40, 0x94, 0x63, 0x26, 0x4a, 0x5f, 0x59, 0x68, 0x57, 0x1f, 0xb3, 0x58, 0xdd, 0x2c, 0x0b, - 0x2d, 0x3a, 0x66, 0xb2, 0xe6, 0x85, 0x32, 0x84, 0xbd, 0xe2, 0x98, 0xc5, 0x4b, 0x66, 0x29, 0xc7, - 0x8c, 0x01, 0x2a, 0xc7, 0x2c, 0xaa, 0x4e, 0xa5, 0x1d, 0xb3, 0xc4, 0xeb, 0x45, 0xda, 0x31, 0x4b, - 0x16, 0xb8, 0x52, 0xd6, 0x91, 0xe1, 0x6a, 0xc7, 0x6c, 0x29, 0xa5, 0x90, 0x85, 0xde, 0xcd, 0x30, - 0x62, 0xea, 0xa3, 0x48, 0xf3, 0xbd, 0xd7, 0xe4, 0xce, 0xdc, 0xe3, 0xdc, 0xfc, 0x72, 0x8f, 0xff, - 0x9d, 0x01, 0xcb, 0x69, 0x45, 0x30, 0x94, 0x81, 0x93, 0xf1, 0x98, 0xd2, 0xdc, 0x78, 0x5d, 0xf6, - 0xab, 0xad, 0x15, 0xee, 0xfa, 0x47, 0xf5, 0x7f, 0xfb, 0x72, 0xd5, 0xf8, 0xcf, 0x2f, 0x57, 0x8d, - 0xff, 0xf9, 0x72, 0xd5, 0xf8, 0xfb, 0xff, 0x5d, 0x9d, 0x39, 0x99, 0x67, 0xff, 0xd5, 0xf8, 0xdb, - 0xbf, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x54, 0x11, 0xdf, 0xef, 0x3c, 0x00, 0x00, + // 4574 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0x5d, 0x6f, 0x1b, 0x57, + 0x76, 0x1a, 0x92, 0x12, 0xc9, 0xc3, 0x0f, 0xd1, 0xd7, 0xb2, 0x4d, 0xd3, 0xb6, 0xac, 0x8c, 0xed, + 0xc4, 0x71, 0x62, 0xd1, 0x96, 0xec, 0x64, 0xeb, 0x22, 0xe9, 0xd2, 0x12, 0x63, 0x6b, 0x2d, 0x4b, + 0xca, 0x88, 0x76, 0x36, 0x2e, 0xb0, 0xea, 0x88, 0xbc, 0xa6, 0x66, 0x45, 0xce, 0x70, 0x67, 0x86, + 0xb4, 0x94, 0x3e, 0x6c, 0xba, 0xed, 0x76, 0xb1, 0x2d, 0xb0, 0x40, 0x53, 0xa0, 0x58, 0x14, 0xed, + 0x4b, 0x5b, 0xa0, 0x7d, 0x68, 0x8b, 0xf6, 0xa1, 0x0f, 0x45, 0x0b, 0xf4, 0xa1, 0x7d, 0x68, 0x1f, + 0x0a, 0x14, 0xe8, 0x1f, 0x68, 0xd3, 0x7d, 0xea, 0xaf, 0x58, 0xdc, 0xaf, 0xb9, 0x77, 0xbe, 0x24, + 0x67, 0xa5, 0x60, 0x5f, 0x62, 0xce, 0x3d, 0x9f, 0xf7, 0x9c, 0x7b, 0xcf, 0xb9, 0xf7, 0x9c, 0x1b, + 0x41, 0xd1, 0x1d, 0x75, 0x17, 0x47, 0xae, 0xe3, 0x3b, 0xa8, 0x8c, 0xfd, 0x6e, 0xcf, 0xc3, 0xee, + 0x04, 0xbb, 0xa3, 0xdd, 0xc6, 0x5c, 0xdf, 0xe9, 0x3b, 0x14, 0xd0, 0x24, 0xbf, 0x18, 0x4e, 0xa3, + 0x4e, 0x70, 0x9a, 0xe6, 0xc8, 0x6a, 0x0e, 0x27, 0xdd, 0xee, 0x68, 0xb7, 0xb9, 0x3f, 0xe1, 0x90, + 0x46, 0x00, 0x31, 0xc7, 0xfe, 0xde, 0x68, 0x97, 0xfe, 0xc3, 0x61, 0x0b, 0x01, 0x6c, 0x82, 0x5d, + 0xcf, 0x72, 0xec, 0xd1, 0xae, 0xf8, 0xc5, 0x31, 0x2e, 0xf7, 0x1d, 0xa7, 0x3f, 0xc0, 0x8c, 0xde, + 0xb6, 0x1d, 0xdf, 0xf4, 0x2d, 0xc7, 0xf6, 0x38, 0x94, 0xfd, 0xd3, 0xbd, 0xdd, 0xc7, 0xf6, 0x6d, + 0x67, 0x84, 0x6d, 0x73, 0x64, 0x4d, 0x96, 0x9a, 0xce, 0x88, 0xe2, 0xc4, 0xf1, 0xf5, 0x9f, 0x68, + 0x50, 0x35, 0xb0, 0x37, 0x72, 0x6c, 0x0f, 0x3f, 0xc6, 0x66, 0x0f, 0xbb, 0xe8, 0x0a, 0x40, 0x77, + 0x30, 0xf6, 0x7c, 0xec, 0xee, 0x58, 0xbd, 0xba, 0xb6, 0xa0, 0xdd, 0xcc, 0x19, 0x45, 0x3e, 0xb2, + 0xd6, 0x43, 0x97, 0xa0, 0x38, 0xc4, 0xc3, 0x5d, 0x06, 0xcd, 0x50, 0x68, 0x81, 0x0d, 0xac, 0xf5, + 0x50, 0x03, 0x0a, 0x2e, 0x9e, 0x58, 0x44, 0xdd, 0x7a, 0x76, 0x41, 0xbb, 0x99, 0x35, 0x82, 0x6f, + 0x42, 0xe8, 0x9a, 0x2f, 0xfd, 0x1d, 0x1f, 0xbb, 0xc3, 0x7a, 0x8e, 0x11, 0x92, 0x81, 0x0e, 0x76, + 0x87, 0x0f, 0xf2, 0x3f, 0xf8, 0x87, 0x7a, 0x76, 0x79, 0xf1, 0x8e, 0xfe, 0xaf, 0xd3, 0x50, 0x36, + 0x4c, 0xbb, 0x8f, 0x0d, 0xfc, 0xbd, 0x31, 0xf6, 0x7c, 0x54, 0x83, 0xec, 0x3e, 0x3e, 0xa4, 0x7a, + 0x94, 0x0d, 0xf2, 0x93, 0x31, 0xb2, 0xfb, 0x78, 0x07, 0xdb, 0x4c, 0x83, 0x32, 0x61, 0x64, 0xf7, + 0x71, 0xdb, 0xee, 0xa1, 0x39, 0x98, 0x1e, 0x58, 0x43, 0xcb, 0xe7, 0xe2, 0xd9, 0x47, 0x48, 0xaf, + 0x5c, 0x44, 0xaf, 0x15, 0x00, 0xcf, 0x71, 0xfd, 0x1d, 0xc7, 0xed, 0x61, 0xb7, 0x3e, 0xbd, 0xa0, + 0xdd, 0xac, 0x2e, 0x5d, 0x5f, 0x54, 0x3d, 0xbc, 0xa8, 0x2a, 0xb4, 0xb8, 0xed, 0xb8, 0xfe, 0x26, + 0xc1, 0x35, 0x8a, 0x9e, 0xf8, 0x89, 0x3e, 0x82, 0x12, 0x65, 0xe2, 0x9b, 0x6e, 0x1f, 0xfb, 0xf5, + 0x19, 0xca, 0xe5, 0xc6, 0x31, 0x5c, 0x3a, 0x14, 0xd9, 0xa0, 0xe2, 0xd9, 0x6f, 0xa4, 0x43, 0xd9, + 0xc3, 0xae, 0x65, 0x0e, 0xac, 0xcf, 0xcc, 0xdd, 0x01, 0xae, 0xe7, 0x17, 0xb4, 0x9b, 0x05, 0x23, + 0x34, 0x46, 0xe6, 0xbf, 0x8f, 0x0f, 0xbd, 0x1d, 0xc7, 0x1e, 0x1c, 0xd6, 0x0b, 0x14, 0xa1, 0x40, + 0x06, 0x36, 0xed, 0xc1, 0x21, 0xf5, 0x9e, 0x33, 0xb6, 0x7d, 0x06, 0x2d, 0x52, 0x68, 0x91, 0x8e, + 0x50, 0xf0, 0x5d, 0xa8, 0x0d, 0x2d, 0x7b, 0x67, 0xe8, 0xf4, 0x76, 0x02, 0x83, 0x00, 0x31, 0xc8, + 0xc3, 0xfc, 0xef, 0x51, 0x0f, 0xdc, 0x35, 0xaa, 0x43, 0xcb, 0x7e, 0xea, 0xf4, 0x0c, 0x61, 0x1f, + 0x42, 0x62, 0x1e, 0x84, 0x49, 0x4a, 0x51, 0x12, 0xf3, 0x40, 0x25, 0x79, 0x1f, 0xce, 0x12, 0x29, + 0x5d, 0x17, 0x9b, 0x3e, 0x96, 0x54, 0xe5, 0x30, 0xd5, 0x99, 0xa1, 0x65, 0xaf, 0x50, 0x94, 0x10, + 0xa1, 0x79, 0x10, 0x23, 0xac, 0x44, 0x09, 0xcd, 0x83, 0x30, 0xa1, 0xfe, 0x3e, 0x14, 0x03, 0xbf, + 0xa0, 0x02, 0xe4, 0x36, 0x36, 0x37, 0xda, 0xb5, 0x29, 0x04, 0x30, 0xd3, 0xda, 0x5e, 0x69, 0x6f, + 0xac, 0xd6, 0x34, 0x54, 0x82, 0xfc, 0x6a, 0x9b, 0x7d, 0x64, 0x1a, 0xf9, 0x2f, 0xf8, 0x7a, 0x7b, + 0x02, 0x20, 0x5d, 0x81, 0xf2, 0x90, 0x7d, 0xd2, 0xfe, 0xb4, 0x36, 0x45, 0x90, 0x9f, 0xb7, 0x8d, + 0xed, 0xb5, 0xcd, 0x8d, 0x9a, 0x46, 0xb8, 0xac, 0x18, 0xed, 0x56, 0xa7, 0x5d, 0xcb, 0x10, 0x8c, + 0xa7, 0x9b, 0xab, 0xb5, 0x2c, 0x2a, 0xc2, 0xf4, 0xf3, 0xd6, 0xfa, 0xb3, 0x76, 0x2d, 0x17, 0x30, + 0x93, 0xab, 0xf8, 0x4f, 0x34, 0xa8, 0x70, 0x77, 0xb3, 0xbd, 0x85, 0xee, 0xc1, 0xcc, 0x1e, 0xdd, + 0x5f, 0x74, 0x25, 0x97, 0x96, 0x2e, 0x47, 0xd6, 0x46, 0x68, 0x0f, 0x1a, 0x1c, 0x17, 0xe9, 0x90, + 0xdd, 0x9f, 0x78, 0xf5, 0xcc, 0x42, 0xf6, 0x66, 0x69, 0xa9, 0xb6, 0xc8, 0x22, 0xc9, 0xe2, 0x13, + 0x7c, 0xf8, 0xdc, 0x1c, 0x8c, 0xb1, 0x41, 0x80, 0x08, 0x41, 0x6e, 0xe8, 0xb8, 0x98, 0x2e, 0xf8, + 0x82, 0x41, 0x7f, 0x93, 0x5d, 0x40, 0x7d, 0xce, 0x17, 0x3b, 0xfb, 0x90, 0xea, 0xfd, 0xa7, 0x06, + 0xb0, 0x35, 0xf6, 0xd3, 0xb7, 0xd8, 0x1c, 0x4c, 0x4f, 0x88, 0x04, 0xbe, 0xbd, 0xd8, 0x07, 0xdd, + 0x5b, 0xd8, 0xf4, 0x70, 0xb0, 0xb7, 0xc8, 0x07, 0x5a, 0x80, 0xfc, 0xc8, 0xc5, 0x93, 0x9d, 0xfd, + 0x09, 0x95, 0x56, 0x90, 0x7e, 0x9a, 0x21, 0xe3, 0x4f, 0x26, 0xe8, 0x16, 0x94, 0xad, 0xbe, 0xed, + 0xb8, 0x78, 0x87, 0x31, 0x9d, 0x56, 0xd1, 0x96, 0x8c, 0x12, 0x03, 0xd2, 0x29, 0x29, 0xb8, 0x4c, + 0xd4, 0x4c, 0x22, 0xee, 0x3a, 0x81, 0xc9, 0xf9, 0x7c, 0xae, 0x41, 0x89, 0xce, 0xe7, 0x44, 0xc6, + 0x5e, 0x92, 0x13, 0xc9, 0x50, 0xb2, 0x98, 0xc1, 0x63, 0x53, 0x93, 0x2a, 0xd8, 0x80, 0x56, 0xf1, + 0x00, 0xfb, 0xf8, 0x24, 0xc1, 0x4b, 0x31, 0x65, 0x36, 0xd1, 0x94, 0x52, 0xde, 0x5f, 0x68, 0x70, + 0x36, 0x24, 0xf0, 0x44, 0x53, 0xaf, 0x43, 0xbe, 0x47, 0x99, 0x31, 0x9d, 0xb2, 0x86, 0xf8, 0x44, + 0xf7, 0xa0, 0xc0, 0x55, 0xf2, 0xea, 0xd9, 0xe4, 0x65, 0x28, 0xb5, 0xcc, 0x33, 0x2d, 0x3d, 0xa9, + 0xe6, 0x3f, 0x65, 0xa0, 0xc8, 0x8d, 0xb1, 0x39, 0x42, 0x2d, 0xa8, 0xb8, 0xec, 0x63, 0x87, 0xce, + 0x99, 0xeb, 0xd8, 0x48, 0x8f, 0x93, 0x8f, 0xa7, 0x8c, 0x32, 0x27, 0xa1, 0xc3, 0xe8, 0x57, 0xa1, + 0x24, 0x58, 0x8c, 0xc6, 0x3e, 0x77, 0x54, 0x3d, 0xcc, 0x40, 0x2e, 0xed, 0xc7, 0x53, 0x06, 0x70, + 0xf4, 0xad, 0xb1, 0x8f, 0x3a, 0x30, 0x27, 0x88, 0xd9, 0xfc, 0xb8, 0x1a, 0x59, 0xca, 0x65, 0x21, + 0xcc, 0x25, 0xee, 0xce, 0xc7, 0x53, 0x06, 0xe2, 0xf4, 0x0a, 0x10, 0xad, 0x4a, 0x95, 0xfc, 0x03, + 0x96, 0x5f, 0x62, 0x2a, 0x75, 0x0e, 0x6c, 0xce, 0x44, 0x58, 0x6b, 0x59, 0xd1, 0xad, 0x73, 0x60, + 0x07, 0x26, 0x7b, 0x58, 0x84, 0x3c, 0x1f, 0xd6, 0xff, 0x23, 0x03, 0x20, 0x3c, 0xb6, 0x39, 0x42, + 0xab, 0x50, 0x75, 0xf9, 0x57, 0xc8, 0x7e, 0x97, 0x12, 0xed, 0xc7, 0x1d, 0x3d, 0x65, 0x54, 0x04, + 0x11, 0x53, 0xf7, 0x43, 0x28, 0x07, 0x5c, 0xa4, 0x09, 0x2f, 0x26, 0x98, 0x30, 0xe0, 0x50, 0x12, + 0x04, 0xc4, 0x88, 0x9f, 0xc0, 0xb9, 0x80, 0x3e, 0xc1, 0x8a, 0x6f, 0x1c, 0x61, 0xc5, 0x80, 0xe1, + 0x59, 0xc1, 0x41, 0xb5, 0xe3, 0x23, 0x45, 0x31, 0x69, 0xc8, 0x8b, 0x09, 0x86, 0x64, 0x48, 0xaa, + 0x25, 0x03, 0x0d, 0x43, 0xa6, 0x04, 0x92, 0xf6, 0xd9, 0xb8, 0xfe, 0x57, 0x39, 0xc8, 0xaf, 0x38, + 0xc3, 0x91, 0xe9, 0x92, 0x45, 0x34, 0xe3, 0x62, 0x6f, 0x3c, 0xf0, 0xa9, 0x01, 0xab, 0x4b, 0xd7, + 0xc2, 0x32, 0x38, 0x9a, 0xf8, 0xd7, 0xa0, 0xa8, 0x06, 0x27, 0x21, 0xc4, 0x3c, 0xcb, 0x67, 0x5e, + 0x83, 0x98, 0xe7, 0x78, 0x4e, 0x22, 0x02, 0x42, 0x56, 0x06, 0x84, 0x06, 0xe4, 0xf9, 0x01, 0x8f, + 0x05, 0xeb, 0xc7, 0x53, 0x86, 0x18, 0x40, 0x6f, 0xc3, 0x6c, 0x34, 0x15, 0x4e, 0x73, 0x9c, 0x6a, + 0x37, 0x9c, 0x39, 0xaf, 0x41, 0x39, 0x94, 0xa1, 0x67, 0x38, 0x5e, 0x69, 0xa8, 0xe4, 0xe5, 0xf3, + 0x22, 0xac, 0x93, 0x63, 0x45, 0xf9, 0xf1, 0x94, 0x08, 0xec, 0x57, 0x45, 0x60, 0x2f, 0xa8, 0x89, + 0x96, 0xd8, 0x95, 0xc7, 0xf8, 0xeb, 0x6a, 0xd4, 0xfa, 0x26, 0x21, 0x0e, 0x90, 0x64, 0xf8, 0xd2, + 0x0d, 0xa8, 0x84, 0x4c, 0x46, 0x72, 0x64, 0xfb, 0xe3, 0x67, 0xad, 0x75, 0x96, 0x50, 0x1f, 0xd1, + 0x1c, 0x6a, 0xd4, 0x34, 0x92, 0xa0, 0xd7, 0xdb, 0xdb, 0xdb, 0xb5, 0x0c, 0x3a, 0x0f, 0xc5, 0x8d, + 0xcd, 0xce, 0x0e, 0xc3, 0xca, 0x36, 0xf2, 0x7f, 0xcc, 0x22, 0x89, 0xcc, 0xcf, 0x9f, 0x06, 0x3c, + 0x79, 0x8a, 0x56, 0x32, 0xf3, 0x94, 0x92, 0x99, 0x35, 0x91, 0x99, 0x33, 0x32, 0x33, 0x67, 0x11, + 0x82, 0xe9, 0xf5, 0x76, 0x6b, 0x9b, 0x26, 0x69, 0xc6, 0x7a, 0x39, 0x9e, 0xad, 0x1f, 0x56, 0xa1, + 0xcc, 0xdc, 0xb3, 0x33, 0xb6, 0xc9, 0x61, 0xe2, 0xaf, 0x35, 0x00, 0xb9, 0x61, 0x51, 0x13, 0xf2, + 0x5d, 0xa6, 0x42, 0x5d, 0xa3, 0x11, 0xf0, 0x5c, 0xa2, 0xc7, 0x0d, 0x81, 0x85, 0xee, 0x42, 0xde, + 0x1b, 0x77, 0xbb, 0xd8, 0x13, 0x99, 0xfb, 0x42, 0x34, 0x08, 0xf3, 0x80, 0x68, 0x08, 0x3c, 0x42, + 0xf2, 0xd2, 0xb4, 0x06, 0x63, 0x9a, 0xc7, 0x8f, 0x26, 0xe1, 0x78, 0x32, 0xc6, 0xfe, 0x99, 0x06, + 0x25, 0x65, 0x5b, 0xfc, 0x82, 0x29, 0xe0, 0x32, 0x14, 0xa9, 0x32, 0xb8, 0xc7, 0x93, 0x40, 0xc1, + 0x90, 0x03, 0xe8, 0x3d, 0x28, 0x8a, 0x9d, 0x24, 0xf2, 0x40, 0x3d, 0x99, 0xed, 0xe6, 0xc8, 0x90, + 0xa8, 0x52, 0xc9, 0x0e, 0x9c, 0xa1, 0x76, 0xea, 0x92, 0xdb, 0x87, 0xb0, 0xac, 0x7a, 0x2c, 0xd7, + 0x22, 0xc7, 0xf2, 0x06, 0x14, 0x46, 0x7b, 0x87, 0x9e, 0xd5, 0x35, 0x07, 0x5c, 0x9d, 0xe0, 0x5b, + 0x72, 0xdd, 0x06, 0xa4, 0x72, 0x3d, 0x89, 0x01, 0x24, 0xd3, 0xf3, 0x50, 0x7a, 0x6c, 0x7a, 0x7b, + 0x5c, 0x49, 0x39, 0x7e, 0x0f, 0x2a, 0x64, 0xfc, 0xc9, 0xf3, 0xd7, 0x50, 0x5f, 0x50, 0x2d, 0xeb, + 0xff, 0xac, 0x41, 0x55, 0x90, 0x9d, 0xc8, 0x41, 0x08, 0x72, 0x7b, 0xa6, 0xb7, 0x47, 0x8d, 0x51, + 0x31, 0xe8, 0x6f, 0xf4, 0x36, 0xd4, 0xba, 0x6c, 0xfe, 0x3b, 0x91, 0x7b, 0xd7, 0x2c, 0x1f, 0x0f, + 0xf6, 0xfe, 0xbb, 0x50, 0x21, 0x24, 0x3b, 0xe1, 0x7b, 0x90, 0xd8, 0xc6, 0xef, 0x19, 0xe5, 0x3d, + 0x3a, 0xe7, 0xa8, 0xfa, 0x26, 0x94, 0x99, 0x31, 0x4e, 0x5b, 0x77, 0x69, 0xd7, 0x06, 0xcc, 0x6e, + 0xdb, 0xe6, 0xc8, 0xdb, 0x73, 0xfc, 0x88, 0xcd, 0x97, 0xf5, 0xbf, 0xd7, 0xa0, 0x26, 0x81, 0x27, + 0xd2, 0xe1, 0x2d, 0x98, 0x75, 0xf1, 0xd0, 0xb4, 0x6c, 0xcb, 0xee, 0xef, 0xec, 0x1e, 0xfa, 0xd8, + 0xe3, 0xd7, 0xd7, 0x6a, 0x30, 0xfc, 0x90, 0x8c, 0x12, 0x65, 0x77, 0x07, 0xce, 0x2e, 0x0f, 0xd2, + 0xf4, 0x37, 0x7a, 0x23, 0x1c, 0xa5, 0x8b, 0xd2, 0x6e, 0x62, 0x5c, 0xea, 0xfc, 0xd3, 0x0c, 0x94, + 0x3f, 0x31, 0xfd, 0xae, 0x58, 0x41, 0x68, 0x0d, 0xaa, 0x41, 0x18, 0xa7, 0x23, 0x5c, 0xef, 0xc8, + 0x81, 0x83, 0xd2, 0x88, 0x7b, 0x8d, 0x38, 0x70, 0x54, 0xba, 0xea, 0x00, 0x65, 0x65, 0xda, 0x5d, + 0x3c, 0x08, 0x58, 0x65, 0xd2, 0x59, 0x51, 0x44, 0x95, 0x95, 0x3a, 0x80, 0xbe, 0x0d, 0xb5, 0x91, + 0xeb, 0xf4, 0x5d, 0xec, 0x79, 0x01, 0x33, 0x96, 0xc2, 0xf5, 0x04, 0x66, 0x5b, 0x1c, 0x35, 0x72, + 0x8a, 0xb9, 0xf7, 0x78, 0xca, 0x98, 0x1d, 0x85, 0x61, 0x32, 0xb0, 0xce, 0xca, 0xf3, 0x1e, 0x8b, + 0xac, 0x3f, 0xca, 0x02, 0x8a, 0x4f, 0xf3, 0xab, 0x1e, 0x93, 0x6f, 0x40, 0xd5, 0xf3, 0x4d, 0x37, + 0xb6, 0xe6, 0x2b, 0x74, 0x34, 0x58, 0xf1, 0x6f, 0x41, 0xa0, 0xd9, 0x8e, 0xed, 0xf8, 0xd6, 0xcb, + 0x43, 0x76, 0x41, 0x31, 0xaa, 0x62, 0x78, 0x83, 0x8e, 0xa2, 0x0d, 0xc8, 0xbf, 0xb4, 0x06, 0x3e, + 0x76, 0xbd, 0xfa, 0xf4, 0x42, 0xf6, 0x66, 0x75, 0xe9, 0x9d, 0xe3, 0x1c, 0xb3, 0xf8, 0x11, 0xc5, + 0xef, 0x1c, 0x8e, 0xd4, 0xd3, 0x2f, 0x67, 0xa2, 0x1e, 0xe3, 0x67, 0x92, 0x6f, 0x44, 0x3a, 0x14, + 0x5e, 0x11, 0xa6, 0x3b, 0x56, 0x8f, 0xe6, 0xe2, 0x60, 0x1f, 0xde, 0x33, 0xf2, 0x14, 0xb0, 0xd6, + 0x43, 0xd7, 0xa0, 0xf0, 0xd2, 0x35, 0xfb, 0x43, 0x6c, 0xfb, 0xec, 0x96, 0x2f, 0x71, 0x02, 0x80, + 0xbe, 0x08, 0x20, 0x55, 0x21, 0x99, 0x6f, 0x63, 0x73, 0xeb, 0x59, 0xa7, 0x36, 0x85, 0xca, 0x50, + 0xd8, 0xd8, 0x5c, 0x6d, 0xaf, 0xb7, 0x49, 0x6e, 0x14, 0x39, 0xef, 0xae, 0xdc, 0x74, 0x2d, 0xe1, + 0x88, 0xd0, 0x9a, 0x50, 0xf5, 0xd2, 0xc2, 0x97, 0x6e, 0xa1, 0x97, 0x60, 0x71, 0x57, 0xbf, 0x0a, + 0x73, 0x49, 0x4b, 0x43, 0x20, 0xdc, 0xd3, 0xff, 0x2d, 0x03, 0x15, 0xbe, 0x11, 0x4e, 0xb4, 0x73, + 0x2f, 0x2a, 0x5a, 0xf1, 0xeb, 0x89, 0x30, 0x52, 0x1d, 0xf2, 0x6c, 0x83, 0xf4, 0xf8, 0xfd, 0x57, + 0x7c, 0x92, 0xe0, 0xcc, 0xd6, 0x3b, 0xee, 0x71, 0xb7, 0x07, 0xdf, 0x89, 0x61, 0x73, 0x3a, 0x35, + 0x6c, 0x06, 0x1b, 0xce, 0xf4, 0xf8, 0xc1, 0xaa, 0x28, 0x5d, 0x51, 0x16, 0x9b, 0x8a, 0x00, 0x43, + 0x3e, 0xcb, 0xa7, 0xf8, 0x0c, 0xdd, 0x80, 0x19, 0x3c, 0xc1, 0xb6, 0xef, 0xd5, 0x4b, 0x34, 0x91, + 0x56, 0xc4, 0x85, 0xaa, 0x4d, 0x46, 0x0d, 0x0e, 0x94, 0xae, 0xfa, 0x10, 0xce, 0xd0, 0xfb, 0xee, + 0x23, 0xd7, 0xb4, 0xd5, 0x3b, 0x7b, 0xa7, 0xb3, 0xce, 0xd3, 0x0e, 0xf9, 0x89, 0xaa, 0x90, 0x59, + 0x5b, 0xe5, 0xf6, 0xc9, 0xac, 0xad, 0x4a, 0xfa, 0xdf, 0xd7, 0x00, 0xa9, 0x0c, 0x4e, 0xe4, 0x8b, + 0x88, 0x14, 0xa1, 0x47, 0x56, 0xea, 0x31, 0x07, 0xd3, 0xd8, 0x75, 0x1d, 0x97, 0x05, 0x4a, 0x83, + 0x7d, 0x48, 0x6d, 0x6e, 0x73, 0x65, 0x0c, 0x3c, 0x71, 0xf6, 0x83, 0x08, 0xc0, 0xd8, 0x6a, 0x71, + 0xe5, 0x3b, 0x70, 0x36, 0x84, 0x7e, 0x3a, 0x29, 0x7e, 0x13, 0x66, 0x29, 0xd7, 0x95, 0x3d, 0xdc, + 0xdd, 0x1f, 0x39, 0x96, 0x1d, 0xd3, 0x00, 0x5d, 0x23, 0xb1, 0x4b, 0xa4, 0x0b, 0x32, 0x45, 0x36, + 0xe7, 0x72, 0x30, 0xd8, 0xe9, 0xac, 0xcb, 0xa5, 0xbe, 0x0b, 0xe7, 0x23, 0x0c, 0xc5, 0xcc, 0x7e, + 0x0d, 0x4a, 0xdd, 0x60, 0xd0, 0xe3, 0x27, 0xc8, 0x2b, 0x61, 0x75, 0xa3, 0xa4, 0x2a, 0x85, 0x94, + 0xf1, 0x6d, 0xb8, 0x10, 0x93, 0x71, 0x1a, 0xe6, 0xb8, 0xa7, 0xdf, 0x81, 0x73, 0x94, 0xf3, 0x13, + 0x8c, 0x47, 0xad, 0x81, 0x35, 0x39, 0xde, 0x2d, 0x87, 0x7c, 0xbe, 0x0a, 0xc5, 0xd7, 0xbb, 0xac, + 0xa4, 0xe8, 0x36, 0x17, 0xdd, 0xb1, 0x86, 0xb8, 0xe3, 0xac, 0xa7, 0x6b, 0x4b, 0x12, 0xf9, 0x3e, + 0x3e, 0xf4, 0xf8, 0xf1, 0x91, 0xfe, 0x96, 0xd1, 0xeb, 0x6f, 0x35, 0x6e, 0x4e, 0x95, 0xcf, 0xd7, + 0xbc, 0x35, 0xe6, 0x01, 0xfa, 0x64, 0x0f, 0xe2, 0x1e, 0x01, 0xb0, 0xda, 0x9c, 0x32, 0x12, 0x28, + 0x4c, 0xb2, 0x50, 0x39, 0xaa, 0xf0, 0x15, 0xbe, 0x71, 0xe8, 0x7f, 0xbc, 0xd8, 0x49, 0xe9, 0x4d, + 0x28, 0x51, 0xc8, 0xb6, 0x6f, 0xfa, 0x63, 0x2f, 0xcd, 0x73, 0xcb, 0xfa, 0x8f, 0x34, 0xbe, 0xa3, + 0x04, 0x9f, 0x13, 0xcd, 0xf9, 0x2e, 0xcc, 0xd0, 0x1b, 0xa2, 0xb8, 0xe9, 0x5c, 0x4c, 0x58, 0xd8, + 0x4c, 0x23, 0x83, 0x23, 0x2a, 0xe7, 0x24, 0x0d, 0x66, 0x9e, 0xd2, 0xce, 0x81, 0xa2, 0x6d, 0x4e, + 0x78, 0xce, 0x36, 0x87, 0xac, 0xfc, 0x58, 0x34, 0xe8, 0x6f, 0x7a, 0x21, 0xc0, 0xd8, 0x7d, 0x66, + 0xac, 0xb3, 0x1b, 0x48, 0xd1, 0x08, 0xbe, 0x89, 0x61, 0xbb, 0x03, 0x0b, 0xdb, 0x3e, 0x85, 0xe6, + 0x28, 0x54, 0x19, 0x41, 0x37, 0xa0, 0x68, 0x79, 0xeb, 0xd8, 0x74, 0x6d, 0x5e, 0xe2, 0x57, 0x02, + 0xb3, 0x84, 0xc8, 0x35, 0xf6, 0x1d, 0xa8, 0x31, 0xcd, 0x5a, 0xbd, 0x9e, 0x72, 0xda, 0x0f, 0xe4, + 0x6b, 0x11, 0xf9, 0x21, 0xfe, 0x99, 0xe3, 0xf9, 0xff, 0x9d, 0x06, 0x67, 0x14, 0x01, 0x27, 0x72, + 0xc1, 0xbb, 0x30, 0xc3, 0xfa, 0x2f, 0xfc, 0x28, 0x38, 0x17, 0xa6, 0x62, 0x62, 0x0c, 0x8e, 0x83, + 0x16, 0x21, 0xcf, 0x7e, 0x89, 0x6b, 0x5c, 0x32, 0xba, 0x40, 0x92, 0x2a, 0x2f, 0xc2, 0x59, 0x0e, + 0xc3, 0x43, 0x27, 0x69, 0xcf, 0xe5, 0xc2, 0x11, 0xe2, 0x87, 0x1a, 0xcc, 0x85, 0x09, 0x4e, 0x34, + 0x4b, 0x45, 0xef, 0xcc, 0x57, 0xd2, 0xfb, 0x5b, 0x42, 0xef, 0x67, 0xa3, 0x9e, 0x72, 0xe4, 0x8c, + 0xae, 0x38, 0xd5, 0xbb, 0x99, 0xb0, 0x77, 0x25, 0xaf, 0x9f, 0x04, 0x73, 0x12, 0xcc, 0x4e, 0x34, + 0xa7, 0xf7, 0x5f, 0x6b, 0x4e, 0xca, 0x11, 0x2c, 0x36, 0xb9, 0x35, 0xb1, 0x8c, 0xd6, 0x2d, 0x2f, + 0xc8, 0x38, 0xef, 0x40, 0x79, 0x60, 0xd9, 0xd8, 0x74, 0x79, 0x0f, 0x49, 0x53, 0xd7, 0xe3, 0x7d, + 0x23, 0x04, 0x94, 0xac, 0x7e, 0x5b, 0x03, 0xa4, 0xf2, 0xfa, 0xe5, 0x78, 0xab, 0x29, 0x0c, 0xbc, + 0xe5, 0x3a, 0x43, 0xc7, 0x3f, 0x6e, 0x99, 0xdd, 0xd3, 0x7f, 0x57, 0x83, 0x73, 0x11, 0x8a, 0x5f, + 0x86, 0xe6, 0xf7, 0xf4, 0xcb, 0x70, 0x66, 0x15, 0x8b, 0x33, 0x5e, 0xac, 0x76, 0xb0, 0x0d, 0x48, + 0x85, 0x9e, 0xce, 0x29, 0xe6, 0x1b, 0x70, 0xe6, 0xa9, 0x33, 0x21, 0x81, 0x9c, 0x80, 0x65, 0x98, + 0x62, 0xc5, 0xac, 0xc0, 0x5e, 0xc1, 0xb7, 0x0c, 0xbd, 0xdb, 0x80, 0x54, 0xca, 0xd3, 0x50, 0x67, + 0x59, 0xff, 0x5f, 0x0d, 0xca, 0xad, 0x81, 0xe9, 0x0e, 0x85, 0x2a, 0x1f, 0xc2, 0x0c, 0xab, 0xcc, + 0xf0, 0x32, 0xeb, 0x9b, 0x61, 0x7e, 0x2a, 0x2e, 0xfb, 0x68, 0xb1, 0x3a, 0x0e, 0xa7, 0x22, 0x53, + 0xe1, 0x9d, 0xe5, 0xd5, 0x48, 0xa7, 0x79, 0x15, 0xdd, 0x86, 0x69, 0x93, 0x90, 0xd0, 0xf4, 0x5a, + 0x8d, 0x96, 0xcb, 0x28, 0x37, 0x72, 0x25, 0x32, 0x18, 0x96, 0xfe, 0x01, 0x94, 0x14, 0x09, 0x28, + 0x0f, 0xd9, 0x47, 0x6d, 0x7e, 0x4d, 0x6a, 0xad, 0x74, 0xd6, 0x9e, 0xb3, 0x12, 0x62, 0x15, 0x60, + 0xb5, 0x1d, 0x7c, 0x67, 0x12, 0x1a, 0x7b, 0x26, 0xe7, 0xc3, 0xf3, 0x96, 0xaa, 0xa1, 0x96, 0xa6, + 0x61, 0xe6, 0x75, 0x34, 0x94, 0x22, 0x7e, 0x4b, 0x83, 0x0a, 0x37, 0xcd, 0x49, 0x53, 0x33, 0xe5, + 0x9c, 0x92, 0x9a, 0x95, 0x69, 0x18, 0x1c, 0x51, 0xea, 0xf0, 0x2f, 0x1a, 0xd4, 0x56, 0x9d, 0x57, + 0x76, 0xdf, 0x35, 0x7b, 0xc1, 0x1e, 0xfc, 0x28, 0xe2, 0xce, 0xc5, 0x48, 0xa5, 0x3f, 0x82, 0x2f, + 0x07, 0x22, 0x6e, 0xad, 0xcb, 0x5a, 0x0a, 0xcb, 0xef, 0xe2, 0x53, 0xff, 0x26, 0xcc, 0x46, 0x88, + 0x88, 0x83, 0x9e, 0xb7, 0xd6, 0xd7, 0x56, 0x89, 0x43, 0x68, 0xbd, 0xb7, 0xbd, 0xd1, 0x7a, 0xb8, + 0xde, 0xe6, 0x5d, 0xd9, 0xd6, 0xc6, 0x4a, 0x7b, 0x5d, 0x3a, 0xea, 0xbe, 0x98, 0xc1, 0x7d, 0x7d, + 0x00, 0x67, 0x14, 0x85, 0x4e, 0xda, 0x1c, 0x4b, 0xd6, 0x57, 0x4a, 0xfb, 0x06, 0x5c, 0x0a, 0xa4, + 0x3d, 0x67, 0xc0, 0x0e, 0xf6, 0xd4, 0xcb, 0xda, 0x84, 0x0b, 0x2d, 0x1a, 0xe4, 0xa7, 0xa0, 0x7c, + 0x4f, 0xaf, 0x43, 0x85, 0x9f, 0x8f, 0xa2, 0x21, 0xe3, 0xcf, 0x73, 0x50, 0x15, 0xa0, 0xaf, 0x47, + 0x7f, 0x74, 0x1e, 0x66, 0x7a, 0xbb, 0xdb, 0xd6, 0x67, 0xa2, 0xa3, 0xcb, 0xbf, 0xc8, 0xf8, 0x80, + 0xc9, 0x61, 0xef, 0x34, 0xf8, 0x17, 0xba, 0xcc, 0x9e, 0x70, 0xac, 0xd9, 0x3d, 0x7c, 0x40, 0x8f, + 0x51, 0x39, 0x43, 0x0e, 0xd0, 0x72, 0x28, 0x7f, 0xcf, 0x41, 0x6f, 0xc9, 0xca, 0xfb, 0x0e, 0xb4, + 0x0c, 0x35, 0xf2, 0xbb, 0x35, 0x1a, 0x0d, 0x2c, 0xdc, 0x63, 0x0c, 0xc8, 0x05, 0x39, 0x27, 0xcf, + 0x49, 0x31, 0x04, 0x74, 0x15, 0x66, 0xe8, 0xe5, 0xd1, 0xab, 0x17, 0x48, 0x46, 0x96, 0xa8, 0x7c, + 0x18, 0xbd, 0x0d, 0x25, 0xa6, 0xf1, 0x9a, 0xfd, 0xcc, 0xc3, 0xf4, 0xb5, 0x83, 0x52, 0x49, 0x51, + 0x61, 0xe1, 0x13, 0x1a, 0xa4, 0x9d, 0xd0, 0x50, 0x13, 0xaa, 0x9e, 0xef, 0xb8, 0x66, 0x5f, 0xb8, + 0x91, 0x3e, 0x75, 0x50, 0xca, 0x7d, 0x11, 0xb0, 0x54, 0xe1, 0xe3, 0xb1, 0xe3, 0x9b, 0xe1, 0x27, + 0x0e, 0xef, 0x19, 0x2a, 0x0c, 0x7d, 0x0b, 0x2a, 0x3d, 0xb1, 0x48, 0xd6, 0xec, 0x97, 0x0e, 0x7d, + 0xd6, 0x10, 0xeb, 0xde, 0xad, 0xaa, 0x28, 0x92, 0x53, 0x98, 0x54, 0xbd, 0xc9, 0x56, 0x42, 0x14, + 0xc4, 0xdb, 0xd8, 0x26, 0xa9, 0x9d, 0x55, 0x70, 0x0a, 0x86, 0xf8, 0x44, 0xd7, 0xa1, 0xc2, 0x32, + 0xc1, 0xf3, 0xd0, 0x6a, 0x08, 0x0f, 0x92, 0x3c, 0xd6, 0x1a, 0xfb, 0x7b, 0x6d, 0x4a, 0x14, 0x5b, + 0x94, 0x57, 0x00, 0x11, 0xe8, 0xaa, 0xe5, 0x25, 0x82, 0x39, 0x71, 0xe2, 0x8a, 0xbe, 0xaf, 0x6f, + 0xc0, 0x59, 0x02, 0xc5, 0xb6, 0x6f, 0x75, 0x95, 0xa3, 0x98, 0x38, 0xec, 0x6b, 0x91, 0xc3, 0xbe, + 0xe9, 0x79, 0xaf, 0x1c, 0xb7, 0xc7, 0xd5, 0x0c, 0xbe, 0xa5, 0xb4, 0x7f, 0xd4, 0x98, 0x36, 0xcf, + 0xbc, 0xd0, 0x41, 0xfd, 0x2b, 0xf2, 0x43, 0xbf, 0x02, 0x79, 0xfe, 0x40, 0x8a, 0xd7, 0x3f, 0xcf, + 0x2f, 0xb2, 0x87, 0x59, 0x8b, 0x9c, 0xf1, 0x26, 0x83, 0x2a, 0x35, 0x3a, 0x8e, 0x4f, 0x96, 0xcb, + 0x9e, 0xe9, 0xed, 0xe1, 0xde, 0x96, 0x60, 0x1e, 0xaa, 0x0e, 0xdf, 0x37, 0x22, 0x60, 0xa9, 0xfb, + 0x5d, 0xa9, 0xfa, 0x23, 0xec, 0x1f, 0xa1, 0xba, 0xda, 0x7f, 0x38, 0x27, 0x48, 0x78, 0xdb, 0xf4, + 0x75, 0xa8, 0x7e, 0xac, 0xc1, 0x15, 0x41, 0xb6, 0xb2, 0x67, 0xda, 0x7d, 0x2c, 0x94, 0xf9, 0x45, + 0xed, 0x15, 0x9f, 0x74, 0xf6, 0x35, 0x27, 0xfd, 0x04, 0xea, 0xc1, 0xa4, 0x69, 0x2d, 0xca, 0x19, + 0xa8, 0x93, 0x18, 0x7b, 0x41, 0x90, 0xa4, 0xbf, 0xc9, 0x98, 0xeb, 0x0c, 0x82, 0x6b, 0x20, 0xf9, + 0x2d, 0x99, 0xad, 0xc3, 0x45, 0xc1, 0x8c, 0x17, 0x87, 0xc2, 0xdc, 0x62, 0x73, 0x3a, 0x92, 0x1b, + 0xf7, 0x07, 0xe1, 0x71, 0xf4, 0x52, 0x4a, 0x24, 0x09, 0xbb, 0x90, 0x4a, 0xd1, 0x92, 0xa4, 0xcc, + 0xb3, 0x1d, 0x40, 0x74, 0x56, 0x4e, 0xec, 0x31, 0x38, 0x61, 0x99, 0x08, 0xe7, 0x4b, 0x80, 0xc0, + 0x63, 0x4b, 0x20, 0x5d, 0x2a, 0x86, 0xf9, 0x40, 0x51, 0x62, 0xf6, 0x2d, 0xec, 0x0e, 0x2d, 0xcf, + 0x53, 0x1a, 0x71, 0x49, 0xe6, 0x7a, 0x13, 0x72, 0x23, 0xcc, 0x8f, 0x2f, 0xa5, 0x25, 0x24, 0xf6, + 0x84, 0x42, 0x4c, 0xe1, 0x52, 0xcc, 0x10, 0xae, 0x0a, 0x31, 0xcc, 0x21, 0x89, 0x72, 0xa2, 0x6a, + 0x8a, 0xe2, 0x7f, 0x26, 0xa5, 0xf8, 0x9f, 0x0d, 0x17, 0xff, 0x43, 0x47, 0x6a, 0x35, 0x50, 0x9d, + 0xce, 0x91, 0xba, 0xc3, 0x1c, 0x10, 0xc4, 0xb7, 0xd3, 0xe1, 0xfa, 0x07, 0x3c, 0x50, 0x9d, 0x56, + 0x3a, 0x17, 0x01, 0x3e, 0x13, 0x0e, 0xf0, 0x3a, 0x94, 0x89, 0x93, 0x0c, 0xb5, 0x2b, 0x92, 0x33, + 0x42, 0x63, 0x32, 0x18, 0xef, 0xc3, 0x5c, 0x38, 0x18, 0x9f, 0x48, 0xa9, 0x39, 0x98, 0xf6, 0x9d, + 0x7d, 0x2c, 0x72, 0x0a, 0xfb, 0x88, 0x99, 0x35, 0x08, 0xd4, 0xa7, 0x63, 0xd6, 0xef, 0x4a, 0xae, + 0x74, 0x03, 0x9e, 0x74, 0x06, 0x64, 0x39, 0x8a, 0xdb, 0x3f, 0xfb, 0x90, 0xb2, 0x3e, 0x81, 0xf3, + 0xd1, 0xe0, 0x7b, 0x3a, 0x93, 0xd8, 0x61, 0x9b, 0x33, 0x29, 0x3c, 0x9f, 0x8e, 0x80, 0x17, 0x32, + 0x4e, 0x2a, 0x41, 0xf7, 0x74, 0x78, 0xff, 0x3a, 0x34, 0x92, 0x62, 0xf0, 0xa9, 0xee, 0xc5, 0x20, + 0x24, 0x9f, 0x0e, 0xd7, 0x1f, 0x6a, 0x92, 0xad, 0xba, 0x6a, 0x3e, 0xf8, 0x2a, 0x6c, 0x45, 0xae, + 0xbb, 0x13, 0x2c, 0x9f, 0x66, 0x10, 0x2d, 0xb3, 0xc9, 0xd1, 0x52, 0x92, 0x50, 0x44, 0xb1, 0xff, + 0x64, 0xa8, 0xff, 0x3a, 0x57, 0x2f, 0x17, 0x26, 0xf3, 0xce, 0x49, 0x85, 0x91, 0xf4, 0x1c, 0x08, + 0xa3, 0x1f, 0xb1, 0xad, 0xa2, 0x26, 0xa9, 0xd3, 0x71, 0xdd, 0x6f, 0xc8, 0x04, 0x13, 0xcb, 0x63, + 0xa7, 0x23, 0xc1, 0x84, 0x85, 0xf4, 0x14, 0x76, 0x2a, 0x22, 0x6e, 0xb5, 0xa0, 0x18, 0xdc, 0xfd, + 0x95, 0x97, 0xca, 0x25, 0xc8, 0x6f, 0x6c, 0x6e, 0x6f, 0xb5, 0x56, 0xc8, 0xd5, 0x76, 0x0e, 0xf2, + 0x2b, 0x9b, 0x86, 0xf1, 0x6c, 0xab, 0x43, 0xee, 0xb6, 0xd1, 0x87, 0x4b, 0x4b, 0x3f, 0xcb, 0x42, + 0xe6, 0xc9, 0x73, 0xf4, 0x29, 0x4c, 0xb3, 0x87, 0x73, 0x47, 0xbc, 0x9f, 0x6c, 0x1c, 0xf5, 0x36, + 0x50, 0xbf, 0xf0, 0x83, 0xff, 0xfe, 0xd9, 0x1f, 0x66, 0xce, 0xe8, 0xe5, 0xe6, 0x64, 0xb9, 0xb9, + 0x3f, 0x69, 0xd2, 0x24, 0xfb, 0x40, 0xbb, 0x85, 0x3e, 0x86, 0xec, 0xd6, 0xd8, 0x47, 0xa9, 0xef, + 0x2a, 0x1b, 0xe9, 0xcf, 0x05, 0xf5, 0x73, 0x94, 0xe9, 0xac, 0x0e, 0x9c, 0xe9, 0x68, 0xec, 0x13, + 0x96, 0xdf, 0x83, 0x92, 0xfa, 0xd8, 0xef, 0xd8, 0xc7, 0x96, 0x8d, 0xe3, 0x1f, 0x12, 0xea, 0x57, + 0xa8, 0xa8, 0x0b, 0x3a, 0xe2, 0xa2, 0xd8, 0x73, 0x44, 0x75, 0x16, 0x9d, 0x03, 0x1b, 0xa5, 0x3e, + 0xc5, 0x6c, 0xa4, 0xbf, 0x2d, 0x8c, 0xcd, 0xc2, 0x3f, 0xb0, 0x09, 0xcb, 0xef, 0xf2, 0x47, 0x84, + 0x5d, 0x1f, 0x5d, 0x4d, 0x78, 0x05, 0xa6, 0xbe, 0x6e, 0x6a, 0x2c, 0xa4, 0x23, 0x70, 0x21, 0x97, + 0xa9, 0x90, 0xf3, 0xfa, 0x19, 0x2e, 0xa4, 0x1b, 0xa0, 0x3c, 0xd0, 0x6e, 0x2d, 0x75, 0x61, 0x9a, + 0x76, 0xcf, 0xd1, 0x0b, 0xf1, 0xa3, 0x91, 0xf0, 0x2e, 0x21, 0xc5, 0xd1, 0xa1, 0xbe, 0xbb, 0x3e, + 0x47, 0x05, 0x55, 0xf5, 0x22, 0x11, 0x44, 0x7b, 0xe7, 0x0f, 0xb4, 0x5b, 0x37, 0xb5, 0x3b, 0xda, + 0xd2, 0xdf, 0x4c, 0xc3, 0x34, 0xed, 0xd2, 0xa0, 0x7d, 0x00, 0xd9, 0x25, 0x8e, 0xce, 0x2e, 0xd6, + 0x80, 0x8e, 0xce, 0x2e, 0xde, 0x60, 0xd6, 0x1b, 0x54, 0xe8, 0x9c, 0x3e, 0x4b, 0x84, 0xd2, 0xe6, + 0x4f, 0x93, 0xf6, 0xba, 0x88, 0x1d, 0x7f, 0xac, 0xf1, 0x76, 0x15, 0xdb, 0x66, 0x28, 0x89, 0x5b, + 0xa8, 0x43, 0x1c, 0x5d, 0x0e, 0x09, 0x4d, 0x61, 0xfd, 0x3e, 0x15, 0xd8, 0xd4, 0x6b, 0x52, 0xa0, + 0x4b, 0x31, 0x1e, 0x68, 0xb7, 0x5e, 0xd4, 0xf5, 0xb3, 0xdc, 0xca, 0x11, 0x08, 0xfa, 0x3e, 0x54, + 0xc3, 0xbd, 0x4c, 0x74, 0x2d, 0x41, 0x56, 0xb4, 0x37, 0xda, 0xb8, 0x7e, 0x34, 0x12, 0xd7, 0x69, + 0x9e, 0xea, 0xc4, 0x85, 0x33, 0xc9, 0xfb, 0x18, 0x8f, 0x4c, 0x82, 0xc4, 0x7d, 0x80, 0xfe, 0x54, + 0xe3, 0xed, 0x68, 0xd9, 0x8a, 0x44, 0x49, 0xdc, 0x63, 0x1d, 0xcf, 0xc6, 0x8d, 0x63, 0xb0, 0xb8, + 0x12, 0x1f, 0x50, 0x25, 0xde, 0xd7, 0xe7, 0xa4, 0x12, 0xbe, 0x35, 0xc4, 0xbe, 0xc3, 0xb5, 0x78, + 0x71, 0x59, 0xbf, 0x10, 0x32, 0x4e, 0x08, 0x2a, 0x9d, 0xc5, 0x5a, 0x86, 0x89, 0xce, 0x0a, 0x75, + 0x25, 0x13, 0x9d, 0x15, 0xee, 0x37, 0x26, 0x39, 0x8b, 0x37, 0x08, 0x13, 0x9c, 0x15, 0x40, 0x96, + 0xfe, 0x3f, 0x07, 0xf9, 0x15, 0xf6, 0x3f, 0x23, 0x21, 0x07, 0x8a, 0x41, 0x13, 0x0d, 0xcd, 0x27, + 0xd5, 0xe9, 0xe5, 0x55, 0xae, 0x71, 0x35, 0x15, 0xce, 0x15, 0x7a, 0x83, 0x2a, 0x74, 0x49, 0x3f, + 0x4f, 0x24, 0xf3, 0xff, 0xdf, 0xa9, 0xc9, 0xaa, 0xb9, 0x4d, 0xb3, 0xd7, 0x23, 0x86, 0xf8, 0x4d, + 0x28, 0xab, 0x2d, 0x2d, 0xf4, 0x46, 0x62, 0x6f, 0x40, 0xed, 0x8f, 0x35, 0xf4, 0xa3, 0x50, 0xb8, + 0xe4, 0xeb, 0x54, 0xf2, 0xbc, 0x7e, 0x31, 0x41, 0xb2, 0x4b, 0x51, 0x43, 0xc2, 0x59, 0xef, 0x29, + 0x59, 0x78, 0xa8, 0xc9, 0x95, 0x2c, 0x3c, 0xdc, 0xba, 0x3a, 0x52, 0xf8, 0x98, 0xa2, 0x12, 0xe1, + 0x1e, 0x80, 0x6c, 0x0e, 0xa1, 0x44, 0x5b, 0x2a, 0x17, 0xd6, 0x68, 0x70, 0x88, 0xf7, 0x95, 0x74, + 0x9d, 0x8a, 0xe5, 0xeb, 0x2e, 0x22, 0x76, 0x60, 0x79, 0x3e, 0xdb, 0x98, 0x95, 0x50, 0x6b, 0x07, + 0x25, 0xce, 0x27, 0xdc, 0x29, 0x6a, 0x5c, 0x3b, 0x12, 0x87, 0x4b, 0xbf, 0x41, 0xa5, 0x5f, 0xd5, + 0x1b, 0x09, 0xd2, 0x47, 0x0c, 0x97, 0x2c, 0xb6, 0xcf, 0xf3, 0x50, 0x7a, 0x6a, 0x5a, 0xb6, 0x8f, + 0x6d, 0xd3, 0xee, 0x62, 0xb4, 0x0b, 0xd3, 0x34, 0x77, 0x47, 0x03, 0xb1, 0xda, 0xc9, 0x88, 0x06, + 0xe2, 0x50, 0x29, 0x5f, 0x5f, 0xa0, 0x82, 0x1b, 0xfa, 0x39, 0x22, 0x78, 0x28, 0x59, 0x37, 0x59, + 0x13, 0x40, 0xbb, 0x85, 0x5e, 0xc2, 0x0c, 0x6f, 0xe1, 0x47, 0x18, 0x85, 0x8a, 0x6a, 0x8d, 0xcb, + 0xc9, 0xc0, 0xa4, 0xb5, 0xac, 0x8a, 0xf1, 0x28, 0x1e, 0x91, 0x33, 0x01, 0x90, 0x1d, 0xa9, 0xa8, + 0x47, 0x63, 0x9d, 0xac, 0xc6, 0x42, 0x3a, 0x42, 0x92, 0x4d, 0x55, 0x99, 0xbd, 0x00, 0x97, 0xc8, + 0xfd, 0x0e, 0xe4, 0x1e, 0x9b, 0xde, 0x1e, 0x8a, 0xe4, 0x5e, 0xe5, 0xc5, 0x6d, 0xa3, 0x91, 0x04, + 0xe2, 0x52, 0xae, 0x52, 0x29, 0x17, 0x59, 0x28, 0x53, 0xa5, 0xd0, 0x37, 0xa5, 0xcc, 0x7e, 0xec, + 0xb9, 0x6d, 0xd4, 0x7e, 0xa1, 0xb7, 0xbb, 0x51, 0xfb, 0x85, 0x5f, 0xe8, 0xa6, 0xdb, 0x8f, 0x48, + 0xd9, 0x9f, 0x10, 0x39, 0x23, 0x28, 0x88, 0x87, 0xa9, 0x28, 0xf2, 0x9c, 0x27, 0xf2, 0x9a, 0xb5, + 0x31, 0x9f, 0x06, 0xe6, 0xd2, 0xae, 0x51, 0x69, 0x57, 0xf4, 0x7a, 0xcc, 0x5b, 0x1c, 0xf3, 0x81, + 0x76, 0xeb, 0x8e, 0x86, 0xbe, 0x0f, 0x20, 0x9b, 0x76, 0xb1, 0x3d, 0x18, 0x6d, 0x04, 0xc6, 0xf6, + 0x60, 0xac, 0xdf, 0xa7, 0x2f, 0x52, 0xb9, 0x37, 0xf5, 0x6b, 0x51, 0xb9, 0xbe, 0x6b, 0xda, 0xde, + 0x4b, 0xec, 0xde, 0x66, 0x75, 0x7f, 0x6f, 0xcf, 0x1a, 0x91, 0x29, 0xbb, 0x50, 0x0c, 0x6a, 0xcd, + 0xd1, 0x78, 0x1b, 0xed, 0xfe, 0x44, 0xe3, 0x6d, 0xac, 0x19, 0x13, 0x0e, 0x3c, 0xa1, 0xf5, 0x22, + 0x50, 0xc9, 0x16, 0xfc, 0xcb, 0x1a, 0xe4, 0xc8, 0x91, 0x9c, 0x1c, 0x4f, 0x64, 0xb9, 0x27, 0x3a, + 0xfb, 0x58, 0xc5, 0x3a, 0x3a, 0xfb, 0x78, 0xa5, 0x28, 0x7c, 0x3c, 0x21, 0xd7, 0xb5, 0x26, 0xab, + 0xa3, 0x90, 0x99, 0x3a, 0x50, 0x52, 0xca, 0x40, 0x28, 0x81, 0x59, 0xb8, 0x02, 0x1e, 0x4d, 0x78, + 0x09, 0x35, 0x24, 0xfd, 0x12, 0x95, 0x77, 0x8e, 0x25, 0x3c, 0x2a, 0xaf, 0xc7, 0x30, 0x88, 0x40, + 0x3e, 0x3b, 0xbe, 0xf3, 0x13, 0x66, 0x17, 0xde, 0xfd, 0x0b, 0xe9, 0x08, 0xa9, 0xb3, 0x93, 0x5b, + 0xff, 0x15, 0x94, 0xd5, 0xd2, 0x0f, 0x4a, 0x50, 0x3e, 0x52, 0xa3, 0x8f, 0x66, 0x92, 0xa4, 0xca, + 0x51, 0x38, 0xb6, 0x51, 0x91, 0xa6, 0x82, 0x46, 0x04, 0x0f, 0x20, 0xcf, 0x4b, 0x40, 0x49, 0x26, + 0x0d, 0x97, 0xf1, 0x93, 0x4c, 0x1a, 0xa9, 0x1f, 0x85, 0xcf, 0xcf, 0x54, 0x22, 0xb9, 0x8a, 0x8a, + 0x6c, 0xcd, 0xa5, 0x3d, 0xc2, 0x7e, 0x9a, 0x34, 0x59, 0xb6, 0x4d, 0x93, 0xa6, 0x54, 0x08, 0xd2, + 0xa4, 0xf5, 0xb1, 0xcf, 0xe3, 0x81, 0xb8, 0x5e, 0xa3, 0x14, 0x66, 0x6a, 0x86, 0xd4, 0x8f, 0x42, + 0x49, 0xba, 0xde, 0x48, 0x81, 0x22, 0x3d, 0x1e, 0x00, 0xc8, 0x72, 0x54, 0xf4, 0xcc, 0x9a, 0xd8, + 0x29, 0x88, 0x9e, 0x59, 0x93, 0x2b, 0x5a, 0xe1, 0x18, 0x2b, 0xe5, 0xb2, 0xdb, 0x15, 0x91, 0xfc, + 0x85, 0x06, 0x28, 0x5e, 0xb0, 0x42, 0xef, 0x24, 0x73, 0x4f, 0xec, 0x3a, 0x34, 0xde, 0x7d, 0x3d, + 0xe4, 0xa4, 0x80, 0x2c, 0x55, 0xea, 0x52, 0xec, 0xd1, 0x2b, 0xa2, 0xd4, 0xe7, 0x1a, 0x54, 0x42, + 0x45, 0x2e, 0xf4, 0x66, 0x8a, 0x4f, 0x23, 0xad, 0x87, 0xc6, 0x5b, 0xc7, 0xe2, 0x25, 0x1d, 0xe6, + 0x95, 0x15, 0x20, 0x6e, 0x35, 0xbf, 0xa3, 0x41, 0x35, 0x5c, 0x0b, 0x43, 0x29, 0xbc, 0x63, 0x1d, + 0x8b, 0xc6, 0xcd, 0xe3, 0x11, 0x8f, 0x76, 0x8f, 0xbc, 0xd0, 0x0c, 0x20, 0xcf, 0x8b, 0x66, 0x49, + 0x0b, 0x3f, 0xdc, 0xe2, 0x48, 0x5a, 0xf8, 0x91, 0x8a, 0x5b, 0xc2, 0xc2, 0x77, 0x9d, 0x01, 0x56, + 0xb6, 0x19, 0xaf, 0xa5, 0xa5, 0x49, 0x3b, 0x7a, 0x9b, 0x45, 0x0a, 0x71, 0x69, 0xd2, 0xe4, 0x36, + 0x13, 0x25, 0x33, 0x94, 0xc2, 0xec, 0x98, 0x6d, 0x16, 0xad, 0xb8, 0x25, 0x6c, 0x33, 0x2a, 0x50, + 0xd9, 0x66, 0xb2, 0x94, 0x95, 0xb4, 0xcd, 0x62, 0xdd, 0x98, 0xa4, 0x6d, 0x16, 0xaf, 0x86, 0x25, + 0xf8, 0x91, 0xca, 0x0d, 0x6d, 0xb3, 0xb3, 0x09, 0xc5, 0x2e, 0xf4, 0x6e, 0x8a, 0x11, 0x13, 0x7b, + 0x3b, 0x8d, 0xdb, 0xaf, 0x89, 0x9d, 0xba, 0xc6, 0x99, 0xf9, 0xc5, 0x1a, 0xff, 0x23, 0x0d, 0xe6, + 0x92, 0xea, 0x63, 0x28, 0x45, 0x4e, 0x4a, 0x2b, 0xa8, 0xb1, 0xf8, 0xba, 0xe8, 0x47, 0x5b, 0x2b, + 0x58, 0xf5, 0x0f, 0xfb, 0x5f, 0xb4, 0x9a, 0x2f, 0xae, 0xc2, 0x15, 0x98, 0x69, 0x8d, 0xac, 0x27, + 0xf8, 0x10, 0x9d, 0x2d, 0x64, 0x1a, 0x15, 0xc2, 0xd7, 0x71, 0xad, 0xcf, 0xe8, 0x5f, 0xbd, 0x58, + 0xc8, 0xec, 0x96, 0x01, 0x02, 0x84, 0xa9, 0x7f, 0xff, 0x72, 0x5e, 0xfb, 0xaf, 0x2f, 0xe7, 0xb5, + 0xff, 0xf9, 0x72, 0x5e, 0xfb, 0xe9, 0xff, 0xcd, 0x4f, 0xbd, 0xb8, 0xd6, 0x77, 0xa8, 0x5a, 0x8b, + 0x96, 0xd3, 0x94, 0x7f, 0x89, 0x63, 0xb9, 0xa9, 0xaa, 0xba, 0x3b, 0x43, 0xff, 0x74, 0xc6, 0xf2, + 0xcf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x9b, 0xab, 0xde, 0x11, 0x44, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -9461,6 +9653,11 @@ func (m *HashKVResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.HashRevision != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.HashRevision)) + i-- + dAtA[i] = 0x20 + } if m.CompactRevision != 0 { i = encodeVarintRpc(dAtA, i, uint64(m.CompactRevision)) i-- @@ -9581,6 +9778,13 @@ func (m *SnapshotResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = encodeVarintRpc(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x22 + } if len(m.Blob) > 0 { i -= len(m.Blob) copy(dAtA[i:], m.Blob) @@ -11430,6 +11634,40 @@ func (m *DowngradeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *DowngradeVersionTestRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DowngradeVersionTestRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DowngradeVersionTestRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Ver) > 0 { + i -= len(m.Ver) + copy(dAtA[i:], m.Ver) + i = encodeVarintRpc(dAtA, i, uint64(len(m.Ver))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11481,6 +11719,30 @@ func (m *StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.DowngradeInfo != nil { + { + size, err := m.DowngradeInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRpc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + if m.DbSizeQuota != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.DbSizeQuota)) + i-- + dAtA[i] = 0x60 + } + if len(m.StorageVersion) > 0 { + i -= len(m.StorageVersion) + copy(dAtA[i:], m.StorageVersion) + i = encodeVarintRpc(dAtA, i, uint64(len(m.StorageVersion))) + i-- + dAtA[i] = 0x5a + } if m.IsLearner { i-- if m.IsLearner { @@ -11552,6 +11814,50 @@ func (m *StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *DowngradeInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DowngradeInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DowngradeInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.TargetVersion) > 0 { + i -= len(m.TargetVersion) + copy(dAtA[i:], m.TargetVersion) + i = encodeVarintRpc(dAtA, i, uint64(len(m.TargetVersion))) + i-- + dAtA[i] = 0x12 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *AuthEnableRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -13459,6 +13765,9 @@ func (m *HashKVResponse) Size() (n int) { if m.CompactRevision != 0 { n += 1 + sovRpc(uint64(m.CompactRevision)) } + if m.HashRevision != 0 { + n += 1 + sovRpc(uint64(m.HashRevision)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13513,6 +13822,10 @@ func (m *SnapshotResponse) Size() (n int) { if l > 0 { n += 1 + l + sovRpc(uint64(l)) } + l = len(m.Version) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -14336,6 +14649,22 @@ func (m *DowngradeResponse) Size() (n int) { return n } +func (m *DowngradeVersionTestRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Ver) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *StatusRequest) Size() (n int) { if m == nil { return 0 @@ -14389,6 +14718,36 @@ func (m *StatusResponse) Size() (n int) { if m.IsLearner { n += 2 } + l = len(m.StorageVersion) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } + if m.DbSizeQuota != 0 { + n += 1 + sovRpc(uint64(m.DbSizeQuota)) + } + if m.DowngradeInfo != nil { + l = m.DowngradeInfo.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DowngradeInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + l = len(m.TargetVersion) + if l > 0 { + n += 1 + l + sovRpc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -17568,6 +17927,25 @@ func (m *HashKVResponse) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HashRevision", wireType) + } + m.HashRevision = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HashRevision |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -17865,6 +18243,38 @@ func (m *SnapshotResponse) Unmarshal(dAtA []byte) error { m.Blob = []byte{} } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -22145,6 +22555,89 @@ func (m *DowngradeResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *DowngradeVersionTestRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DowngradeVersionTestRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DowngradeVersionTestRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *StatusRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -22459,6 +22952,196 @@ func (m *StatusResponse) Unmarshal(dAtA []byte) error { } } m.IsLearner = bool(v != 0) + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StorageVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StorageVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DbSizeQuota", wireType) + } + m.DbSizeQuota = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DbSizeQuota |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DowngradeInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DowngradeInfo == nil { + m.DowngradeInfo = &DowngradeInfo{} + } + if err := m.DowngradeInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DowngradeInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DowngradeInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DowngradeInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) diff --git a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto index 4ccc234744..983dc01725 100644 --- a/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto +++ b/vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto @@ -4,13 +4,36 @@ package etcdserverpb; import "gogoproto/gogo.proto"; import "etcd/api/mvccpb/kv.proto"; import "etcd/api/authpb/auth.proto"; +import "etcd/api/versionpb/version.proto"; // for grpc-gateway import "google/api/annotations.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; + +option go_package = "go.etcd.io/etcd/api/v3/etcdserverpb"; option (gogoproto.marshaler_all) = true; option (gogoproto.unmarshaler_all) = true; +option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { + security_definitions: { + security: { + key: "ApiKey"; + value: { + type: TYPE_API_KEY; + in: IN_HEADER; + name: "Authorization"; + } + } + } + security: { + security_requirement: { + key: "ApiKey"; + value: {}; + } + } +}; + service KV { // Range gets the keys in the range from the key-value store. rpc Range(RangeRequest) returns (RangeResponse) { @@ -388,13 +411,16 @@ service Auth { } message ResponseHeader { + option (versionpb.etcd_version_msg) = "3.0"; + // cluster_id is the ID of the cluster which sent the response. uint64 cluster_id = 1; // member_id is the ID of the member which sent the response. uint64 member_id = 2; - // revision is the key-value store revision when the request was applied. + // revision is the key-value store revision when the request was applied, and it's + // unset (so 0) in case of calls not interacting with key-value store. // For watch progress responses, the header.revision indicates progress. All future events - // recieved in this stream are guaranteed to have a higher revision number than the + // received in this stream are guaranteed to have a higher revision number than the // header.revision number. int64 revision = 3; // raft_term is the raft term when the request was applied. @@ -402,17 +428,21 @@ message ResponseHeader { } message RangeRequest { + option (versionpb.etcd_version_msg) = "3.0"; + enum SortOrder { - NONE = 0; // default, no sorting - ASCEND = 1; // lowest target value first - DESCEND = 2; // highest target value first + option (versionpb.etcd_version_enum) = "3.0"; + NONE = 0; // default, no sorting + ASCEND = 1; // lowest target value first + DESCEND = 2; // highest target value first } enum SortTarget { - KEY = 0; - VERSION = 1; - CREATE = 2; - MOD = 3; - VALUE = 4; + option (versionpb.etcd_version_enum) = "3.0"; + KEY = 0; + VERSION = 1; + CREATE = 2; + MOD = 3; + VALUE = 4; } // key is the first key for the range. If range_end is not given, the request only looks up key. @@ -453,33 +483,39 @@ message RangeRequest { // min_mod_revision is the lower bound for returned key mod revisions; all keys with // lesser mod revisions will be filtered away. - int64 min_mod_revision = 10; + int64 min_mod_revision = 10 [(versionpb.etcd_version_field)="3.1"]; // max_mod_revision is the upper bound for returned key mod revisions; all keys with // greater mod revisions will be filtered away. - int64 max_mod_revision = 11; + int64 max_mod_revision = 11 [(versionpb.etcd_version_field)="3.1"]; // min_create_revision is the lower bound for returned key create revisions; all keys with // lesser create revisions will be filtered away. - int64 min_create_revision = 12; + int64 min_create_revision = 12 [(versionpb.etcd_version_field)="3.1"]; // max_create_revision is the upper bound for returned key create revisions; all keys with // greater create revisions will be filtered away. - int64 max_create_revision = 13; + int64 max_create_revision = 13 [(versionpb.etcd_version_field)="3.1"]; } message RangeResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // kvs is the list of key-value pairs matched by the range request. // kvs is empty when count is requested. repeated mvccpb.KeyValue kvs = 2; // more indicates if there are more keys to return in the requested range. bool more = 3; - // count is set to the number of keys within the range when requested. + // count is set to the actual number of keys within the range when requested. + // Unlike Kvs, it is unaffected by limits and filters (e.g., Min/Max, Create/Modify, Revisions) + // and reflects the full count within the specified range. int64 count = 4; } message PutRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // key is the key, in bytes, to put into the key-value store. bytes key = 1; // value is the value, in bytes, to associate with the key in the key-value store. @@ -490,24 +526,28 @@ message PutRequest { // If prev_kv is set, etcd gets the previous key-value pair before changing it. // The previous key-value pair will be returned in the put response. - bool prev_kv = 4; + bool prev_kv = 4 [(versionpb.etcd_version_field)="3.1"]; // If ignore_value is set, etcd updates the key using its current value. // Returns an error if the key does not exist. - bool ignore_value = 5; + bool ignore_value = 5 [(versionpb.etcd_version_field)="3.2"]; // If ignore_lease is set, etcd updates the key using its current lease. // Returns an error if the key does not exist. - bool ignore_lease = 6; + bool ignore_lease = 6 [(versionpb.etcd_version_field)="3.2"]; } message PutResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // if prev_kv is set in the request, the previous key-value pair will be returned. - mvccpb.KeyValue prev_kv = 2; + mvccpb.KeyValue prev_kv = 2 [(versionpb.etcd_version_field)="3.1"]; } message DeleteRangeRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // key is the first key to delete in the range. bytes key = 1; // range_end is the key following the last key to delete for the range [key, range_end). @@ -519,50 +559,61 @@ message DeleteRangeRequest { // If prev_kv is set, etcd gets the previous key-value pairs before deleting it. // The previous key-value pairs will be returned in the delete response. - bool prev_kv = 3; + bool prev_kv = 3 [(versionpb.etcd_version_field)="3.1"]; } message DeleteRangeResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // deleted is the number of keys deleted by the delete range request. int64 deleted = 2; // if prev_kv is set in the request, the previous key-value pairs will be returned. - repeated mvccpb.KeyValue prev_kvs = 3; + repeated mvccpb.KeyValue prev_kvs = 3 [(versionpb.etcd_version_field)="3.1"]; } message RequestOp { + option (versionpb.etcd_version_msg) = "3.0"; // request is a union of request types accepted by a transaction. oneof request { RangeRequest request_range = 1; PutRequest request_put = 2; DeleteRangeRequest request_delete_range = 3; - TxnRequest request_txn = 4; + TxnRequest request_txn = 4 [(versionpb.etcd_version_field)="3.3"]; } } message ResponseOp { + option (versionpb.etcd_version_msg) = "3.0"; + // response is a union of response types returned by a transaction. oneof response { RangeResponse response_range = 1; PutResponse response_put = 2; DeleteRangeResponse response_delete_range = 3; - TxnResponse response_txn = 4; + TxnResponse response_txn = 4 [(versionpb.etcd_version_field)="3.3"]; } } message Compare { + option (versionpb.etcd_version_msg) = "3.0"; + enum CompareResult { + option (versionpb.etcd_version_enum) = "3.0"; + EQUAL = 0; GREATER = 1; LESS = 2; - NOT_EQUAL = 3; + NOT_EQUAL = 3 [(versionpb.etcd_version_enum_value)="3.1"]; } enum CompareTarget { + option (versionpb.etcd_version_enum) = "3.0"; + VERSION = 0; CREATE = 1; MOD = 2; VALUE = 3; - LEASE = 4; + LEASE = 4 [(versionpb.etcd_version_enum_value)="3.3"]; } // result is logical comparison operation for this comparison. CompareResult result = 1; @@ -580,13 +631,13 @@ message Compare { // value is the value of the given key, in bytes. bytes value = 7; // lease is the lease id of the given key. - int64 lease = 8; + int64 lease = 8 [(versionpb.etcd_version_field)="3.3"]; // leave room for more target_union field tags, jump to 64 } // range_end compares the given target to all keys in the range [key, range_end). // See RangeRequest for more details on key ranges. - bytes range_end = 64; + bytes range_end = 64 [(versionpb.etcd_version_field)="3.3"]; // TODO: fill out with most of the rest of RangeRequest fields when needed. } @@ -606,6 +657,8 @@ message Compare { // true. // 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false. message TxnRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // compare is a list of predicates representing a conjunction of terms. // If the comparisons succeed, then the success requests will be processed in order, // and the response will contain their respective responses in order. @@ -619,6 +672,8 @@ message TxnRequest { } message TxnResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // succeeded is set to true if the compare evaluated to true or false otherwise. bool succeeded = 2; @@ -630,6 +685,8 @@ message TxnResponse { // CompactionRequest compacts the key-value store up to a given revision. All superseded keys // with a revision less than the compaction revision will be removed. message CompactionRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // revision is the key-value store revision for the compaction operation. int64 revision = 1; // physical is set so the RPC will wait until the compaction is physically @@ -639,35 +696,48 @@ message CompactionRequest { } message CompactionResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message HashRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message HashKVRequest { + option (versionpb.etcd_version_msg) = "3.3"; // revision is the key-value store revision for the hash operation. int64 revision = 1; } message HashKVResponse { + option (versionpb.etcd_version_msg) = "3.3"; + ResponseHeader header = 1; // hash is the hash value computed from the responding member's MVCC keys up to a given revision. uint32 hash = 2; // compact_revision is the compacted revision of key-value store when hash begins. int64 compact_revision = 3; + // hash_revision is the revision up to which the hash is calculated. + int64 hash_revision = 4 [(versionpb.etcd_version_field)="3.6"]; } message HashResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // hash is the hash value computed from the responding member's KV's backend. uint32 hash = 2; } message SnapshotRequest { + option (versionpb.etcd_version_msg) = "3.3"; } message SnapshotResponse { + option (versionpb.etcd_version_msg) = "3.3"; + // header has the current key-value store information. The first header in the snapshot // stream indicates the point in time of the snapshot. ResponseHeader header = 1; @@ -677,18 +747,26 @@ message SnapshotResponse { // blob contains the next chunk of the snapshot in the snapshot stream. bytes blob = 3; + + // local version of server that created the snapshot. + // In cluster with binaries with different version, each cluster can return different result. + // Informs which etcd server version should be used when restoring the snapshot. + string version = 4 [(versionpb.etcd_version_field)="3.6"]; } message WatchRequest { + option (versionpb.etcd_version_msg) = "3.0"; // request_union is a request to either create a new watcher or cancel an existing watcher. oneof request_union { WatchCreateRequest create_request = 1; WatchCancelRequest cancel_request = 2; - WatchProgressRequest progress_request = 3; + WatchProgressRequest progress_request = 3 [(versionpb.etcd_version_field)="3.4"]; } } message WatchCreateRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // key is the key to register for watching. bytes key = 1; @@ -709,6 +787,8 @@ message WatchCreateRequest { bool progress_notify = 4; enum FilterType { + option (versionpb.etcd_version_enum) = "3.1"; + // filter out put event. NOPUT = 0; // filter out delete event. @@ -716,34 +796,38 @@ message WatchCreateRequest { } // filters filter the events at server side before it sends back to the watcher. - repeated FilterType filters = 5; + repeated FilterType filters = 5 [(versionpb.etcd_version_field)="3.1"]; // If prev_kv is set, created watcher gets the previous KV before the event happens. // If the previous KV is already compacted, nothing will be returned. - bool prev_kv = 6; + bool prev_kv = 6 [(versionpb.etcd_version_field)="3.1"]; // If watch_id is provided and non-zero, it will be assigned to this watcher. // Since creating a watcher in etcd is not a synchronous operation, // this can be used ensure that ordering is correct when creating multiple // watchers on the same stream. Creating a watcher with an ID already in // use on the stream will cause an error to be returned. - int64 watch_id = 7; + int64 watch_id = 7 [(versionpb.etcd_version_field)="3.4"]; // fragment enables splitting large revisions into multiple watch responses. - bool fragment = 8; + bool fragment = 8 [(versionpb.etcd_version_field)="3.4"]; } message WatchCancelRequest { + option (versionpb.etcd_version_msg) = "3.1"; // watch_id is the watcher id to cancel so that no more events are transmitted. - int64 watch_id = 1; + int64 watch_id = 1 [(versionpb.etcd_version_field)="3.1"]; } // Requests the a watch stream progress status be sent in the watch response stream as soon as // possible. message WatchProgressRequest { + option (versionpb.etcd_version_msg) = "3.4"; } message WatchResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // watch_id is the ID of the watcher that corresponds to the response. int64 watch_id = 2; @@ -754,7 +838,8 @@ message WatchResponse { // All events sent to the created watcher will attach with the same watch_id. bool created = 3; - // canceled is set to true if the response is for a cancel watch request. + // canceled is set to true if the response is for a cancel watch request + // or if the start_revision has already been compacted. // No further events will be sent to the canceled watcher. bool canceled = 4; @@ -769,15 +854,17 @@ message WatchResponse { int64 compact_revision = 5; // cancel_reason indicates the reason for canceling the watcher. - string cancel_reason = 6; + string cancel_reason = 6 [(versionpb.etcd_version_field)="3.4"]; // framgment is true if large watch response was split over multiple responses. - bool fragment = 7; + bool fragment = 7 [(versionpb.etcd_version_field)="3.4"]; repeated mvccpb.Event events = 11; } message LeaseGrantRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // TTL is the advisory time-to-live in seconds. Expired lease will return -1. int64 TTL = 1; // ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID. @@ -785,6 +872,8 @@ message LeaseGrantRequest { } message LeaseGrantResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // ID is the lease ID for the granted lease. int64 ID = 2; @@ -794,15 +883,21 @@ message LeaseGrantResponse { } message LeaseRevokeRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted. int64 ID = 1; } message LeaseRevokeResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message LeaseCheckpoint { + option (versionpb.etcd_version_msg) = "3.4"; + // ID is the lease ID to checkpoint. int64 ID = 1; @@ -811,19 +906,26 @@ message LeaseCheckpoint { } message LeaseCheckpointRequest { + option (versionpb.etcd_version_msg) = "3.4"; + repeated LeaseCheckpoint checkpoints = 1; } message LeaseCheckpointResponse { + option (versionpb.etcd_version_msg) = "3.4"; + ResponseHeader header = 1; } message LeaseKeepAliveRequest { + option (versionpb.etcd_version_msg) = "3.0"; // ID is the lease ID for the lease to keep alive. int64 ID = 1; } message LeaseKeepAliveResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // ID is the lease ID from the keep alive request. int64 ID = 2; @@ -832,6 +934,7 @@ message LeaseKeepAliveResponse { } message LeaseTimeToLiveRequest { + option (versionpb.etcd_version_msg) = "3.1"; // ID is the lease ID for the lease. int64 ID = 1; // keys is true to query all the keys attached to this lease. @@ -839,6 +942,8 @@ message LeaseTimeToLiveRequest { } message LeaseTimeToLiveResponse { + option (versionpb.etcd_version_msg) = "3.1"; + ResponseHeader header = 1; // ID is the lease ID from the keep alive request. int64 ID = 2; @@ -851,19 +956,26 @@ message LeaseTimeToLiveResponse { } message LeaseLeasesRequest { + option (versionpb.etcd_version_msg) = "3.3"; } message LeaseStatus { + option (versionpb.etcd_version_msg) = "3.3"; + int64 ID = 1; // TODO: int64 TTL = 2; } message LeaseLeasesResponse { + option (versionpb.etcd_version_msg) = "3.3"; + ResponseHeader header = 1; repeated LeaseStatus leases = 2; } message Member { + option (versionpb.etcd_version_msg) = "3.0"; + // ID is the member ID for this member. uint64 ID = 1; // name is the human-readable name of the member. If the member is not started, the name will be an empty string. @@ -873,17 +985,21 @@ message Member { // clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty. repeated string clientURLs = 4; // isLearner indicates if the member is raft learner. - bool isLearner = 5; + bool isLearner = 5 [(versionpb.etcd_version_field)="3.4"]; } message MemberAddRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // peerURLs is the list of URLs the added member will use to communicate with the cluster. repeated string peerURLs = 1; // isLearner indicates if the added member is raft learner. - bool isLearner = 2; + bool isLearner = 2 [(versionpb.etcd_version_field)="3.4"]; } message MemberAddResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // member is the member information for the added member. Member member = 2; @@ -892,17 +1008,22 @@ message MemberAddResponse { } message MemberRemoveRequest { + option (versionpb.etcd_version_msg) = "3.0"; // ID is the member ID of the member to remove. uint64 ID = 1; } message MemberRemoveResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // members is a list of all members after removing the member. repeated Member members = 2; } message MemberUpdateRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // ID is the member ID of the member to update. uint64 ID = 1; // peerURLs is the new list of URLs the member will use to communicate with the cluster. @@ -910,59 +1031,80 @@ message MemberUpdateRequest { } message MemberUpdateResponse{ + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // members is a list of all members after updating the member. - repeated Member members = 2; + repeated Member members = 2 [(versionpb.etcd_version_field)="3.1"]; } message MemberListRequest { - bool linearizable = 1; + option (versionpb.etcd_version_msg) = "3.0"; + + bool linearizable = 1 [(versionpb.etcd_version_field)="3.5"]; } message MemberListResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // members is a list of all members associated with the cluster. repeated Member members = 2; } message MemberPromoteRequest { + option (versionpb.etcd_version_msg) = "3.4"; // ID is the member ID of the member to promote. uint64 ID = 1; } message MemberPromoteResponse { + option (versionpb.etcd_version_msg) = "3.4"; + ResponseHeader header = 1; // members is a list of all members after promoting the member. repeated Member members = 2; } message DefragmentRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message DefragmentResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message MoveLeaderRequest { + option (versionpb.etcd_version_msg) = "3.3"; // targetID is the node ID for the new leader. uint64 targetID = 1; } message MoveLeaderResponse { + option (versionpb.etcd_version_msg) = "3.3"; + ResponseHeader header = 1; } enum AlarmType { + option (versionpb.etcd_version_enum) = "3.0"; + NONE = 0; // default, used to query if any alarm is active NOSPACE = 1; // space quota is exhausted - CORRUPT = 2; // kv store corruption detected + CORRUPT = 2 [(versionpb.etcd_version_enum_value)="3.3"]; // kv store corruption detected } message AlarmRequest { + option (versionpb.etcd_version_msg) = "3.0"; + enum AlarmAction { - GET = 0; - ACTIVATE = 1; - DEACTIVATE = 2; + option (versionpb.etcd_version_enum) = "3.0"; + + GET = 0; + ACTIVATE = 1; + DEACTIVATE = 2; } // action is the kind of alarm request to issue. The action // may GET alarm statuses, ACTIVATE an alarm, or DEACTIVATE a @@ -976,6 +1118,7 @@ message AlarmRequest { } message AlarmMember { + option (versionpb.etcd_version_msg) = "3.0"; // memberID is the ID of the member associated with the raised alarm. uint64 memberID = 1; // alarm is the type of alarm which has been raised. @@ -983,13 +1126,19 @@ message AlarmMember { } message AlarmResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // alarms is a list of alarms associated with the alarm request. repeated AlarmMember alarms = 2; } message DowngradeRequest { + option (versionpb.etcd_version_msg) = "3.5"; + enum DowngradeAction { + option (versionpb.etcd_version_enum) = "3.5"; + VALIDATE = 0; ENABLE = 1; CANCEL = 2; @@ -1004,15 +1153,30 @@ message DowngradeRequest { } message DowngradeResponse { + option (versionpb.etcd_version_msg) = "3.5"; + ResponseHeader header = 1; // version is the current cluster version. string version = 2; } +// DowngradeVersionTestRequest is used for test only. The version in +// this request will be read as the WAL record version.If the downgrade +// target version is less than this version, then the downgrade(online) +// or migration(offline) isn't safe, so shouldn't be allowed. +message DowngradeVersionTestRequest { + option (versionpb.etcd_version_msg) = "3.6"; + + string ver = 1; +} + message StatusRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message StatusResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // version is the cluster protocol version used by the responding member. string version = 2; @@ -1025,55 +1189,82 @@ message StatusResponse { // raftTerm is the current raft term of the responding member. uint64 raftTerm = 6; // raftAppliedIndex is the current raft applied index of the responding member. - uint64 raftAppliedIndex = 7; + uint64 raftAppliedIndex = 7 [(versionpb.etcd_version_field)="3.4"]; // errors contains alarm/health information and status. - repeated string errors = 8; + repeated string errors = 8 [(versionpb.etcd_version_field)="3.4"]; // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. - int64 dbSizeInUse = 9; + int64 dbSizeInUse = 9 [(versionpb.etcd_version_field)="3.4"]; // isLearner indicates if the member is raft learner. - bool isLearner = 10; + bool isLearner = 10 [(versionpb.etcd_version_field)="3.4"]; + // storageVersion is the version of the db file. It might be updated with delay in relationship to the target cluster version. + string storageVersion = 11 [(versionpb.etcd_version_field)="3.6"]; + // dbSizeQuota is the configured etcd storage quota in bytes (the value passed to etcd instance by flag --quota-backend-bytes) + int64 dbSizeQuota = 12 [(versionpb.etcd_version_field)="3.6"]; + // downgradeInfo indicates if there is downgrade process. + DowngradeInfo downgradeInfo = 13 [(versionpb.etcd_version_field)="3.6"]; +} + +message DowngradeInfo { + // enabled indicates whether the cluster is enabled to downgrade. + bool enabled = 1; + // targetVersion is the target downgrade version. + string targetVersion = 2; } message AuthEnableRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthDisableRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthStatusRequest { + option (versionpb.etcd_version_msg) = "3.5"; } message AuthenticateRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; string password = 2; } message AuthUserAddRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; string password = 2; - authpb.UserAddOptions options = 3; - string hashedPassword = 4; + authpb.UserAddOptions options = 3 [(versionpb.etcd_version_field)="3.4"]; + string hashedPassword = 4 [(versionpb.etcd_version_field)="3.5"]; } message AuthUserGetRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; } message AuthUserDeleteRequest { + option (versionpb.etcd_version_msg) = "3.0"; // name is the name of the user to delete. string name = 1; } message AuthUserChangePasswordRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // name is the name of the user whose password is being changed. string name = 1; // password is the new password for the user. Note that this field will be removed in the API layer. string password = 2; // hashedPassword is the new password for the user. Note that this field will be initialized in the API layer. - string hashedPassword = 3; + string hashedPassword = 3 [(versionpb.etcd_version_field)="3.5"]; } message AuthUserGrantRoleRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // user is the name of the user which should be granted a given role. string user = 1; // role is the name of the role to grant to the user. @@ -1081,30 +1272,42 @@ message AuthUserGrantRoleRequest { } message AuthUserRevokeRoleRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string name = 1; string role = 2; } message AuthRoleAddRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // name is the name of the role to add to the authentication system. string name = 1; } message AuthRoleGetRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string role = 1; } message AuthUserListRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthRoleListRequest { + option (versionpb.etcd_version_msg) = "3.0"; } message AuthRoleDeleteRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string role = 1; } message AuthRoleGrantPermissionRequest { + option (versionpb.etcd_version_msg) = "3.0"; + // name is the name of the role which will be granted the permission. string name = 1; // perm is the permission to grant to the role. @@ -1112,20 +1315,28 @@ message AuthRoleGrantPermissionRequest { } message AuthRoleRevokePermissionRequest { + option (versionpb.etcd_version_msg) = "3.0"; + string role = 1; bytes key = 2; bytes range_end = 3; } message AuthEnableResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthDisableResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthStatusResponse { + option (versionpb.etcd_version_msg) = "3.5"; + ResponseHeader header = 1; bool enabled = 2; // authRevision is the current revision of auth store @@ -1133,67 +1344,93 @@ message AuthStatusResponse { } message AuthenticateResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; // token is an authorized token that can be used in succeeding RPCs string token = 2; } message AuthUserAddResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserGetResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; repeated string roles = 2; } message AuthUserDeleteResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserChangePasswordResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserGrantRoleResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthUserRevokeRoleResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleAddResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleGetResponse { - ResponseHeader header = 1; + ResponseHeader header = 1 [(versionpb.etcd_version_field)="3.0"]; - repeated authpb.Permission perm = 2; + repeated authpb.Permission perm = 2 [(versionpb.etcd_version_field)="3.0"]; } message AuthRoleListResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; repeated string roles = 2; } message AuthUserListResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; repeated string users = 2; } message AuthRoleDeleteResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleGrantPermissionResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } message AuthRoleRevokePermissionResponse { + option (versionpb.etcd_version_msg) = "3.0"; + ResponseHeader header = 1; } diff --git a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go index cf0d428180..85a2a741f3 100644 --- a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go @@ -11,6 +11,7 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/golang/protobuf/proto" + _ "go.etcd.io/etcd/api/v3/versionpb" ) // Reference imports to suppress errors if they are not otherwise used. @@ -286,30 +287,34 @@ func init() { func init() { proto.RegisterFile("membership.proto", fileDescriptor_949fe0d019050ef5) } var fileDescriptor_949fe0d019050ef5 = []byte{ - // 367 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xc1, 0x4e, 0xf2, 0x40, - 0x14, 0x85, 0x99, 0x42, 0xf8, 0xdb, 0xcb, 0x1f, 0xc4, 0x09, 0x89, 0x8d, 0x68, 0x25, 0x5d, 0xb1, - 0x30, 0x98, 0xe8, 0x13, 0xa0, 0xb0, 0x20, 0x81, 0xcd, 0x18, 0xdd, 0x92, 0x56, 0x2e, 0xd8, 0xa4, - 0x74, 0xea, 0xcc, 0x54, 0xd7, 0xbe, 0x85, 0x4f, 0xe0, 0xb3, 0xb0, 0xf4, 0x11, 0x14, 0x5f, 0xc4, - 0x74, 0x5a, 0x4a, 0x49, 0xdc, 0xb8, 0xbb, 0x3d, 0xbd, 0xf7, 0x9c, 0xf3, 0x35, 0x85, 0xd6, 0x0a, - 0x57, 0x3e, 0x0a, 0xf9, 0x18, 0xc4, 0xfd, 0x58, 0x70, 0xc5, 0xe9, 0xff, 0x9d, 0x12, 0xfb, 0xc7, - 0xed, 0x25, 0x5f, 0x72, 0xfd, 0xe2, 0x22, 0x9d, 0xb2, 0x1d, 0x77, 0x02, 0x4d, 0xe6, 0x2d, 0xd4, - 0x40, 0x29, 0x11, 0xf8, 0x89, 0x42, 0x49, 0x3b, 0x60, 0xc5, 0x88, 0x62, 0x96, 0x88, 0x50, 0xda, - 0xa4, 0x5b, 0xed, 0x59, 0xcc, 0x4c, 0x85, 0x3b, 0x11, 0x4a, 0x7a, 0x0a, 0x10, 0xc8, 0x59, 0x88, - 0x9e, 0x88, 0x50, 0xd8, 0x46, 0x97, 0xf4, 0x4c, 0x66, 0x05, 0x72, 0x92, 0x09, 0xee, 0x00, 0xa0, - 0xe4, 0x44, 0xa1, 0x16, 0x79, 0x2b, 0xb4, 0x49, 0x97, 0xf4, 0x2c, 0xa6, 0x67, 0x7a, 0x06, 0x8d, - 0x87, 0x30, 0xc0, 0x48, 0x65, 0xfe, 0x86, 0xf6, 0x87, 0x4c, 0x4a, 0x13, 0xdc, 0x77, 0x02, 0xf5, - 0xa9, 0xee, 0x4d, 0x9b, 0x60, 0x8c, 0x87, 0xfa, 0xba, 0xc6, 0x8c, 0xf1, 0x90, 0x8e, 0xe0, 0x40, - 0x78, 0x0b, 0x35, 0xf3, 0x8a, 0x08, 0xdd, 0xa0, 0x71, 0x79, 0xd2, 0x2f, 0x93, 0xf6, 0xf7, 0x81, - 0x58, 0x53, 0xec, 0x03, 0x8e, 0xe0, 0x30, 0x5b, 0x2f, 0x1b, 0x55, 0xb5, 0x91, 0xbd, 0x6f, 0x54, - 0x32, 0xc9, 0xbf, 0xee, 0x4e, 0x71, 0xcf, 0xc1, 0xbe, 0x09, 0x13, 0xa9, 0x50, 0xdc, 0xa3, 0x90, - 0x01, 0x8f, 0x6e, 0x51, 0x31, 0x7c, 0x4a, 0x50, 0x2a, 0xda, 0x82, 0xea, 0x33, 0x8a, 0x1c, 0x3c, - 0x1d, 0xdd, 0x57, 0x02, 0x9d, 0x7c, 0x7d, 0x5a, 0x38, 0x95, 0x2e, 0x3a, 0x60, 0xe5, 0xa5, 0x0a, - 0x64, 0x33, 0x13, 0x34, 0xf8, 0x2f, 0x8d, 0x8d, 0x3f, 0x37, 0x1e, 0xc1, 0xd1, 0x90, 0xbf, 0x44, - 0x4b, 0xe1, 0xcd, 0x71, 0x1c, 0x2d, 0x78, 0x29, 0xde, 0x86, 0x7f, 0x18, 0x79, 0x7e, 0x88, 0x73, - 0x1d, 0x6e, 0xb2, 0xed, 0xe3, 0x16, 0xc5, 0x28, 0x50, 0xae, 0xdb, 0xeb, 0x2f, 0xa7, 0xb2, 0xde, - 0x38, 0xe4, 0x63, 0xe3, 0x90, 0xcf, 0x8d, 0x43, 0xde, 0xbe, 0x9d, 0x8a, 0x5f, 0xd7, 0xff, 0xd3, - 0xd5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x93, 0x7d, 0x0b, 0x87, 0x02, 0x00, 0x00, + // 422 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xed, 0x3a, 0x55, 0x6b, 0x4f, 0x51, 0x28, 0x2b, 0x24, 0xac, 0x06, 0x8c, 0x55, 0x2e, 0x39, + 0xd9, 0x12, 0x51, 0x0f, 0x70, 0x03, 0xd2, 0x43, 0x10, 0xe5, 0xb0, 0xa8, 0x1c, 0xb8, 0x44, 0xeb, + 0x66, 0x62, 0x56, 0x72, 0xbc, 0x66, 0x77, 0x5d, 0xee, 0x1c, 0xf9, 0x02, 0xfe, 0x82, 0x13, 0xff, + 0xd0, 0x23, 0x9f, 0x00, 0xe1, 0x47, 0x90, 0x77, 0x9d, 0xd8, 0x11, 0x9c, 0x7a, 0x1b, 0x3f, 0xcf, + 0xbc, 0x79, 0xef, 0xed, 0xc0, 0xf1, 0x0a, 0x57, 0x19, 0x2a, 0xfd, 0x51, 0x54, 0x49, 0xa5, 0xa4, + 0x91, 0xf4, 0x4e, 0x87, 0x54, 0xd9, 0xc9, 0xfd, 0x5c, 0xe6, 0xd2, 0xfe, 0x48, 0x9b, 0xca, 0xf5, + 0x9c, 0xc4, 0x68, 0xae, 0x16, 0x29, 0xaf, 0x44, 0x7a, 0x8d, 0x4a, 0x0b, 0x59, 0x56, 0xd9, 0xa6, + 0x72, 0x1d, 0xa7, 0x97, 0x30, 0x64, 0x7c, 0x69, 0x5e, 0x18, 0xa3, 0x44, 0x56, 0x1b, 0xd4, 0x74, + 0x04, 0x41, 0x85, 0xa8, 0xe6, 0xb5, 0x2a, 0x74, 0x48, 0xe2, 0xc1, 0x38, 0x60, 0x7e, 0x03, 0x5c, + 0xaa, 0x42, 0xd3, 0x47, 0x00, 0x42, 0xcf, 0x0b, 0xe4, 0xaa, 0x44, 0x15, 0x7a, 0x31, 0x19, 0xfb, + 0x2c, 0x10, 0xfa, 0x8d, 0x03, 0x9e, 0x1f, 0x7e, 0xf9, 0x11, 0x0e, 0x26, 0xc9, 0xd9, 0xe9, 0x6b, + 0x80, 0x1e, 0x25, 0x85, 0xfd, 0x92, 0xaf, 0x30, 0x24, 0x31, 0x19, 0x07, 0xcc, 0xd6, 0xf4, 0x31, + 0x1c, 0x5d, 0x15, 0x02, 0x4b, 0xe3, 0x16, 0x79, 0x76, 0x11, 0x38, 0xa8, 0x59, 0xd5, 0x71, 0x7d, + 0x27, 0x70, 0x70, 0x61, 0xbd, 0xd2, 0x21, 0x78, 0xb3, 0xa9, 0xa5, 0xd9, 0x67, 0xde, 0x6c, 0x4a, + 0xcf, 0xe1, 0xae, 0xe2, 0x4b, 0x33, 0xe7, 0xdb, 0x5d, 0x56, 0xd3, 0xd1, 0xd3, 0x87, 0x49, 0x3f, + 0x9d, 0x64, 0xd7, 0x22, 0x1b, 0xaa, 0x5d, 0xcb, 0xe7, 0x70, 0xcf, 0xb5, 0xf7, 0x89, 0x06, 0x96, + 0x28, 0xdc, 0x25, 0xea, 0x91, 0xb4, 0x2f, 0xd2, 0x21, 0x9d, 0xe2, 0x33, 0x08, 0x5f, 0x15, 0xb5, + 0x36, 0xa8, 0xde, 0xbb, 0xb0, 0xdf, 0xa1, 0x61, 0xf8, 0xa9, 0x46, 0x6d, 0xe8, 0x31, 0x0c, 0xae, + 0x51, 0xb5, 0x51, 0x34, 0x65, 0x37, 0xf6, 0x95, 0xc0, 0xa8, 0x9d, 0xbb, 0xd8, 0x72, 0xf7, 0x46, + 0x47, 0x10, 0xb4, 0x32, 0xb7, 0x21, 0xf8, 0x0e, 0xb0, 0x51, 0xfc, 0xc7, 0x83, 0x77, 0x7b, 0x0f, + 0x6f, 0xe1, 0xc1, 0x54, 0x7e, 0x2e, 0x73, 0xc5, 0x17, 0x38, 0x2b, 0x97, 0xb2, 0xa7, 0x23, 0x84, + 0x43, 0x2c, 0x79, 0x56, 0xe0, 0xc2, 0xaa, 0xf0, 0xd9, 0xe6, 0x73, 0x63, 0xce, 0xfb, 0xd7, 0xdc, + 0xcb, 0x67, 0x37, 0xbf, 0xa3, 0xbd, 0x9b, 0x75, 0x44, 0x7e, 0xae, 0x23, 0xf2, 0x6b, 0x1d, 0x91, + 0x6f, 0x7f, 0xa2, 0xbd, 0x0f, 0x4f, 0x72, 0x99, 0x34, 0x37, 0x9a, 0x08, 0x99, 0x76, 0xb7, 0x3a, + 0x49, 0xfb, 0x82, 0xb3, 0x03, 0x7b, 0xaa, 0x93, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x56, + 0x21, 0x97, 0x04, 0x03, 0x00, 0x00, } func (m *RaftAttributes) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto index e63e9ecc99..cbccfefccf 100644 --- a/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto +++ b/vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto @@ -2,6 +2,9 @@ syntax = "proto3"; package membershippb; import "gogoproto/gogo.proto"; +import "etcd/api/versionpb/version.proto"; + +option go_package = "go.etcd.io/etcd/api/v3/membershippb"; option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; @@ -10,6 +13,8 @@ option (gogoproto.goproto_getters_all) = false; // RaftAttributes represents the raft related attributes of an etcd member. message RaftAttributes { + option (versionpb.etcd_version_msg) = "3.5"; + // peerURLs is the list of peers in the raft cluster. repeated string peer_urls = 1; // isLearner indicates if the member is raft learner. @@ -18,26 +23,36 @@ message RaftAttributes { // Attributes represents all the non-raft related attributes of an etcd member. message Attributes { + option (versionpb.etcd_version_msg) = "3.5"; + string name = 1; repeated string client_urls = 2; } message Member { + option (versionpb.etcd_version_msg) = "3.5"; + uint64 ID = 1; RaftAttributes raft_attributes = 2; Attributes member_attributes = 3; } message ClusterVersionSetRequest { + option (versionpb.etcd_version_msg) = "3.5"; + string ver = 1; } message ClusterMemberAttrSetRequest { + option (versionpb.etcd_version_msg) = "3.5"; + uint64 member_ID = 1; Attributes member_attributes = 2; } message DowngradeInfoSetRequest { + option (versionpb.etcd_version_msg) = "3.5"; + bool enabled = 1; string ver = 2; } \ No newline at end of file diff --git a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go index fc258d6c20..2fed4242cc 100644 --- a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go +++ b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go @@ -164,26 +164,28 @@ func init() { func init() { proto.RegisterFile("kv.proto", fileDescriptor_2216fe83c9c12408) } var fileDescriptor_2216fe83c9c12408 = []byte{ - // 303 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x41, 0x4e, 0xc2, 0x40, - 0x14, 0x86, 0x3b, 0x14, 0x0a, 0x3e, 0x08, 0x36, 0x13, 0x12, 0x27, 0x2e, 0x26, 0x95, 0x8d, 0x18, - 0x13, 0x4c, 0xf0, 0x06, 0xc6, 0xae, 0x70, 0x61, 0x1a, 0x74, 0x4b, 0x4a, 0x79, 0x21, 0xa4, 0x94, - 0x69, 0x4a, 0x9d, 0xa4, 0x37, 0x71, 0xef, 0xde, 0x73, 0xb0, 0xe4, 0x08, 0x52, 0x2f, 0x62, 0xfa, - 0xc6, 0xe2, 0xc6, 0xcd, 0xe4, 0xfd, 0xff, 0xff, 0x65, 0xe6, 0x7f, 0x03, 0x9d, 0x58, 0x8f, 0xd3, - 0x4c, 0xe5, 0x8a, 0x3b, 0x89, 0x8e, 0xa2, 0x74, 0x71, 0x39, 0x58, 0xa9, 0x95, 0x22, 0xeb, 0xae, - 0x9a, 0x4c, 0x3a, 0xfc, 0x64, 0xd0, 0x99, 0x62, 0xf1, 0x1a, 0x6e, 0xde, 0x90, 0xbb, 0x60, 0xc7, - 0x58, 0x08, 0xe6, 0xb1, 0x51, 0x2f, 0xa8, 0x46, 0x7e, 0x0d, 0xe7, 0x51, 0x86, 0x61, 0x8e, 0xf3, - 0x0c, 0xf5, 0x7a, 0xb7, 0x56, 0x5b, 0xd1, 0xf0, 0xd8, 0xc8, 0x0e, 0xfa, 0xc6, 0x0e, 0x7e, 0x5d, - 0x7e, 0x05, 0xbd, 0x44, 0x2d, 0xff, 0x28, 0x9b, 0xa8, 0x6e, 0xa2, 0x96, 0x27, 0x44, 0x40, 0x5b, - 0x63, 0x46, 0x69, 0x93, 0xd2, 0x5a, 0xf2, 0x01, 0xb4, 0x74, 0x55, 0x40, 0xb4, 0xe8, 0x65, 0x23, - 0x2a, 0x77, 0x83, 0xe1, 0x0e, 0x85, 0x43, 0xb4, 0x11, 0xc3, 0x0f, 0x06, 0x2d, 0x5f, 0xe3, 0x36, - 0xe7, 0xb7, 0xd0, 0xcc, 0x8b, 0x14, 0xa9, 0x6e, 0x7f, 0x72, 0x31, 0x36, 0x7b, 0x8e, 0x29, 0x34, - 0xe7, 0xac, 0x48, 0x31, 0x20, 0x88, 0x7b, 0xd0, 0x88, 0x35, 0x75, 0xef, 0x4e, 0xdc, 0x1a, 0xad, - 0x17, 0x0f, 0x1a, 0xb1, 0xe6, 0x37, 0xd0, 0x4e, 0x33, 0xd4, 0xf3, 0x58, 0x53, 0xf9, 0xff, 0x30, - 0xa7, 0x02, 0xa6, 0x7a, 0xe8, 0xc1, 0xd9, 0xe9, 0x7e, 0xde, 0x06, 0xfb, 0xf9, 0x65, 0xe6, 0x5a, - 0x1c, 0xc0, 0x79, 0xf4, 0x9f, 0xfc, 0x99, 0xef, 0xb2, 0x07, 0xb1, 0x3f, 0x4a, 0xeb, 0x70, 0x94, - 0xd6, 0xbe, 0x94, 0xec, 0x50, 0x4a, 0xf6, 0x55, 0x4a, 0xf6, 0xfe, 0x2d, 0xad, 0x85, 0x43, 0xff, - 0x7e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x45, 0x92, 0x5d, 0xa1, 0x01, 0x00, 0x00, + // 327 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xc1, 0x6a, 0xfa, 0x40, + 0x10, 0xc6, 0xb3, 0x46, 0xa3, 0xff, 0x51, 0xfc, 0x87, 0x45, 0x68, 0x28, 0x34, 0xa4, 0x5e, 0x6a, + 0x29, 0x24, 0xa0, 0x87, 0xde, 0x4b, 0x73, 0xb2, 0x87, 0x12, 0x6c, 0x0f, 0xbd, 0x48, 0x8c, 0x83, + 0x84, 0xa8, 0x1b, 0x62, 0xba, 0x90, 0x37, 0xe9, 0xbd, 0xf7, 0x3e, 0x87, 0x47, 0x1f, 0xa1, 0xda, + 0x17, 0x29, 0x3b, 0x5b, 0xed, 0xa5, 0x97, 0xdd, 0x99, 0xef, 0xfb, 0xb1, 0xf3, 0x0d, 0x0b, 0xad, + 0x4c, 0xfa, 0x79, 0x21, 0x4a, 0xc1, 0xad, 0x95, 0x4c, 0x92, 0x7c, 0x76, 0xde, 0x5b, 0x88, 0x85, + 0x20, 0x29, 0x50, 0x95, 0x76, 0xfb, 0x1f, 0x0c, 0x5a, 0x63, 0xac, 0x9e, 0xe3, 0xe5, 0x2b, 0x72, + 0x1b, 0xcc, 0x0c, 0x2b, 0x87, 0x79, 0x6c, 0xd0, 0x89, 0x54, 0xc9, 0xaf, 0xe0, 0x7f, 0x52, 0x60, + 0x5c, 0xe2, 0xb4, 0x40, 0x99, 0x6e, 0x52, 0xb1, 0x76, 0x6a, 0x1e, 0x1b, 0x98, 0x51, 0x57, 0xcb, + 0xd1, 0x8f, 0xca, 0x2f, 0xa1, 0xb3, 0x12, 0xf3, 0x5f, 0xca, 0x24, 0xaa, 0xbd, 0x12, 0xf3, 0x13, + 0xe2, 0x40, 0x53, 0x62, 0x41, 0x6e, 0x9d, 0xdc, 0x63, 0xcb, 0x7b, 0xd0, 0x90, 0x2a, 0x80, 0xd3, + 0xa0, 0xc9, 0xba, 0x51, 0xea, 0x12, 0xe3, 0x0d, 0x3a, 0x16, 0xd1, 0xba, 0xe9, 0xbf, 0x33, 0x68, + 0x84, 0x12, 0xd7, 0x25, 0xbf, 0x81, 0x7a, 0x59, 0xe5, 0x48, 0x71, 0xbb, 0xc3, 0x33, 0x5f, 0xef, + 0xe9, 0x93, 0xa9, 0xcf, 0x49, 0x95, 0x63, 0x44, 0x10, 0xf7, 0xa0, 0x96, 0x49, 0xca, 0xde, 0x1e, + 0xda, 0x47, 0xf4, 0xb8, 0x78, 0x54, 0xcb, 0x24, 0xbf, 0x86, 0x66, 0x5e, 0xa0, 0x9c, 0x66, 0x92, + 0xc2, 0xff, 0x85, 0x59, 0x0a, 0x18, 0xcb, 0xbe, 0x07, 0xff, 0x4e, 0xef, 0xf3, 0x26, 0x98, 0x8f, + 0x4f, 0x13, 0xdb, 0xe0, 0x00, 0xd6, 0x7d, 0xf8, 0x10, 0x4e, 0x42, 0x9b, 0xdd, 0xdd, 0x6e, 0xf7, + 0xae, 0xb1, 0xdb, 0xbb, 0xc6, 0xf6, 0xe0, 0xb2, 0xdd, 0xc1, 0x65, 0x9f, 0x07, 0x97, 0xbd, 0x7d, + 0xb9, 0xc6, 0xcb, 0xc5, 0x42, 0xf8, 0x58, 0x26, 0x73, 0x3f, 0x15, 0x81, 0xba, 0x83, 0x38, 0x4f, + 0x03, 0x39, 0x0a, 0xf4, 0xac, 0x99, 0x45, 0xdf, 0x32, 0xfa, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x78, + 0x06, 0x46, 0xf5, 0xc0, 0x01, 0x00, 0x00, } func (m *KeyValue) Marshal() (dAtA []byte, err error) { diff --git a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto index 23c911b7da..a93479c69f 100644 --- a/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto +++ b/vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto @@ -3,6 +3,8 @@ package mvccpb; import "gogoproto/gogo.proto"; +option go_package = "go.etcd.io/etcd/api/v3/mvccpb"; + option (gogoproto.marshaler_all) = true; option (gogoproto.sizer_all) = true; option (gogoproto.unmarshaler_all) = true; diff --git a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go index 23201302e8..781c73b7bf 100644 --- a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go +++ b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go @@ -21,75 +21,81 @@ import ( // server-side error var ( - ErrGRPCEmptyKey = status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err() - ErrGRPCKeyNotFound = status.New(codes.InvalidArgument, "etcdserver: key not found").Err() - ErrGRPCValueProvided = status.New(codes.InvalidArgument, "etcdserver: value is provided").Err() - ErrGRPCLeaseProvided = status.New(codes.InvalidArgument, "etcdserver: lease is provided").Err() - ErrGRPCTooManyOps = status.New(codes.InvalidArgument, "etcdserver: too many operations in txn request").Err() - ErrGRPCDuplicateKey = status.New(codes.InvalidArgument, "etcdserver: duplicate key given in txn request").Err() - ErrGRPCCompacted = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted").Err() - ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err() - ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err() + ErrGRPCEmptyKey = status.Error(codes.InvalidArgument, "etcdserver: key is not provided") + ErrGRPCKeyNotFound = status.Error(codes.InvalidArgument, "etcdserver: key not found") + ErrGRPCValueProvided = status.Error(codes.InvalidArgument, "etcdserver: value is provided") + ErrGRPCLeaseProvided = status.Error(codes.InvalidArgument, "etcdserver: lease is provided") + ErrGRPCTooManyOps = status.Error(codes.InvalidArgument, "etcdserver: too many operations in txn request") + ErrGRPCDuplicateKey = status.Error(codes.InvalidArgument, "etcdserver: duplicate key given in txn request") + ErrGRPCInvalidClientAPIVersion = status.Error(codes.InvalidArgument, "etcdserver: invalid client api version") + ErrGRPCInvalidSortOption = status.Error(codes.InvalidArgument, "etcdserver: invalid sort option") + ErrGRPCCompacted = status.Error(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted") + ErrGRPCFutureRev = status.Error(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision") + ErrGRPCNoSpace = status.Error(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded") - ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err() - ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err() - ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err() + ErrGRPCLeaseNotFound = status.Error(codes.NotFound, "etcdserver: requested lease not found") + ErrGRPCLeaseExist = status.Error(codes.FailedPrecondition, "etcdserver: lease already exists") + ErrGRPCLeaseTTLTooLarge = status.Error(codes.OutOfRange, "etcdserver: too large lease TTL") - ErrGRPCWatchCanceled = status.New(codes.Canceled, "etcdserver: watch canceled").Err() + ErrGRPCWatchCanceled = status.Error(codes.Canceled, "etcdserver: watch canceled") - ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err() - ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err() - ErrGRPCMemberNotEnoughStarted = status.New(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members").Err() - ErrGRPCMemberBadURLs = status.New(codes.InvalidArgument, "etcdserver: given member URLs are invalid").Err() - ErrGRPCMemberNotFound = status.New(codes.NotFound, "etcdserver: member not found").Err() - ErrGRPCMemberNotLearner = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member").Err() - ErrGRPCLearnerNotReady = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader").Err() - ErrGRPCTooManyLearners = status.New(codes.FailedPrecondition, "etcdserver: too many learner members in cluster").Err() - ErrGRPCClusterIdMismatch = status.New(codes.FailedPrecondition, "etcdserver: cluster ID mismatch").Err() + ErrGRPCMemberExist = status.Error(codes.FailedPrecondition, "etcdserver: member ID already exist") + ErrGRPCPeerURLExist = status.Error(codes.FailedPrecondition, "etcdserver: Peer URLs already exists") + ErrGRPCMemberNotEnoughStarted = status.Error(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members") + ErrGRPCMemberBadURLs = status.Error(codes.InvalidArgument, "etcdserver: given member URLs are invalid") + ErrGRPCMemberNotFound = status.Error(codes.NotFound, "etcdserver: member not found") + ErrGRPCMemberNotLearner = status.Error(codes.FailedPrecondition, "etcdserver: can only promote a learner member") + ErrGRPCLearnerNotReady = status.Error(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader") + ErrGRPCTooManyLearners = status.Error(codes.FailedPrecondition, "etcdserver: too many learner members in cluster") + ErrGRPCClusterIDMismatch = status.Error(codes.FailedPrecondition, "etcdserver: cluster ID mismatch") + //revive:disable:var-naming + // Deprecated: Please use ErrGRPCClusterIDMismatch. + ErrGRPCClusterIdMismatch = ErrGRPCClusterIDMismatch + //revive:enable:var-naming - ErrGRPCRequestTooLarge = status.New(codes.InvalidArgument, "etcdserver: request is too large").Err() - ErrGRPCRequestTooManyRequests = status.New(codes.ResourceExhausted, "etcdserver: too many requests").Err() + ErrGRPCRequestTooLarge = status.Error(codes.InvalidArgument, "etcdserver: request is too large") + ErrGRPCRequestTooManyRequests = status.Error(codes.ResourceExhausted, "etcdserver: too many requests") - ErrGRPCRootUserNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not exist").Err() - ErrGRPCRootRoleNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not have root role").Err() - ErrGRPCUserAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: user name already exists").Err() - ErrGRPCUserEmpty = status.New(codes.InvalidArgument, "etcdserver: user name is empty").Err() - ErrGRPCUserNotFound = status.New(codes.FailedPrecondition, "etcdserver: user name not found").Err() - ErrGRPCRoleAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: role name already exists").Err() - ErrGRPCRoleNotFound = status.New(codes.FailedPrecondition, "etcdserver: role name not found").Err() - ErrGRPCRoleEmpty = status.New(codes.InvalidArgument, "etcdserver: role name is empty").Err() - ErrGRPCAuthFailed = status.New(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password").Err() - ErrGRPCPermissionNotGiven = status.New(codes.InvalidArgument, "etcdserver: permission not given").Err() - ErrGRPCPermissionDenied = status.New(codes.PermissionDenied, "etcdserver: permission denied").Err() - ErrGRPCRoleNotGranted = status.New(codes.FailedPrecondition, "etcdserver: role is not granted to the user").Err() - ErrGRPCPermissionNotGranted = status.New(codes.FailedPrecondition, "etcdserver: permission is not granted to the role").Err() - ErrGRPCAuthNotEnabled = status.New(codes.FailedPrecondition, "etcdserver: authentication is not enabled").Err() - ErrGRPCInvalidAuthToken = status.New(codes.Unauthenticated, "etcdserver: invalid auth token").Err() - ErrGRPCInvalidAuthMgmt = status.New(codes.InvalidArgument, "etcdserver: invalid auth management").Err() - ErrGRPCAuthOldRevision = status.New(codes.InvalidArgument, "etcdserver: revision of auth store is old").Err() + ErrGRPCRootUserNotExist = status.Error(codes.FailedPrecondition, "etcdserver: root user does not exist") + ErrGRPCRootRoleNotExist = status.Error(codes.FailedPrecondition, "etcdserver: root user does not have root role") + ErrGRPCUserAlreadyExist = status.Error(codes.FailedPrecondition, "etcdserver: user name already exists") + ErrGRPCUserEmpty = status.Error(codes.InvalidArgument, "etcdserver: user name is empty") + ErrGRPCUserNotFound = status.Error(codes.FailedPrecondition, "etcdserver: user name not found") + ErrGRPCRoleAlreadyExist = status.Error(codes.FailedPrecondition, "etcdserver: role name already exists") + ErrGRPCRoleNotFound = status.Error(codes.FailedPrecondition, "etcdserver: role name not found") + ErrGRPCRoleEmpty = status.Error(codes.InvalidArgument, "etcdserver: role name is empty") + ErrGRPCAuthFailed = status.Error(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password") + ErrGRPCPermissionNotGiven = status.Error(codes.InvalidArgument, "etcdserver: permission not given") + ErrGRPCPermissionDenied = status.Error(codes.PermissionDenied, "etcdserver: permission denied") + ErrGRPCRoleNotGranted = status.Error(codes.FailedPrecondition, "etcdserver: role is not granted to the user") + ErrGRPCPermissionNotGranted = status.Error(codes.FailedPrecondition, "etcdserver: permission is not granted to the role") + ErrGRPCAuthNotEnabled = status.Error(codes.FailedPrecondition, "etcdserver: authentication is not enabled") + ErrGRPCInvalidAuthToken = status.Error(codes.Unauthenticated, "etcdserver: invalid auth token") + ErrGRPCInvalidAuthMgmt = status.Error(codes.InvalidArgument, "etcdserver: invalid auth management") + ErrGRPCAuthOldRevision = status.Error(codes.InvalidArgument, "etcdserver: revision of auth store is old") - ErrGRPCNoLeader = status.New(codes.Unavailable, "etcdserver: no leader").Err() - ErrGRPCNotLeader = status.New(codes.FailedPrecondition, "etcdserver: not leader").Err() - ErrGRPCLeaderChanged = status.New(codes.Unavailable, "etcdserver: leader changed").Err() - ErrGRPCNotCapable = status.New(codes.Unavailable, "etcdserver: not capable").Err() - ErrGRPCStopped = status.New(codes.Unavailable, "etcdserver: server stopped").Err() - ErrGRPCTimeout = status.New(codes.Unavailable, "etcdserver: request timed out").Err() - ErrGRPCTimeoutDueToLeaderFail = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure").Err() - ErrGRPCTimeoutDueToConnectionLost = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost").Err() - ErrGRPCTimeoutWaitAppliedIndex = status.New(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long").Err() - ErrGRPCUnhealthy = status.New(codes.Unavailable, "etcdserver: unhealthy cluster").Err() - ErrGRPCCorrupt = status.New(codes.DataLoss, "etcdserver: corrupt cluster").Err() - ErrGPRCNotSupportedForLearner = status.New(codes.Unavailable, "etcdserver: rpc not supported for learner").Err() - ErrGRPCBadLeaderTransferee = status.New(codes.FailedPrecondition, "etcdserver: bad leader transferee").Err() + ErrGRPCNoLeader = status.Error(codes.Unavailable, "etcdserver: no leader") + ErrGRPCNotLeader = status.Error(codes.FailedPrecondition, "etcdserver: not leader") + ErrGRPCLeaderChanged = status.Error(codes.Unavailable, "etcdserver: leader changed") + ErrGRPCNotCapable = status.Error(codes.FailedPrecondition, "etcdserver: not capable") + ErrGRPCStopped = status.Error(codes.Unavailable, "etcdserver: server stopped") + ErrGRPCTimeout = status.Error(codes.Unavailable, "etcdserver: request timed out") + ErrGRPCTimeoutDueToLeaderFail = status.Error(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure") + ErrGRPCTimeoutDueToConnectionLost = status.Error(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost") + ErrGRPCTimeoutWaitAppliedIndex = status.Error(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long") + ErrGRPCUnhealthy = status.Error(codes.Unavailable, "etcdserver: unhealthy cluster") + ErrGRPCCorrupt = status.Error(codes.DataLoss, "etcdserver: corrupt cluster") + ErrGRPCNotSupportedForLearner = status.Error(codes.FailedPrecondition, "etcdserver: rpc not supported for learner") + ErrGRPCBadLeaderTransferee = status.Error(codes.FailedPrecondition, "etcdserver: bad leader transferee") - ErrGRPCClusterVersionUnavailable = status.New(codes.Unavailable, "etcdserver: cluster version not found during downgrade").Err() - ErrGRPCWrongDowngradeVersionFormat = status.New(codes.InvalidArgument, "etcdserver: wrong downgrade target version format").Err() - ErrGRPCInvalidDowngradeTargetVersion = status.New(codes.InvalidArgument, "etcdserver: invalid downgrade target version").Err() - ErrGRPCDowngradeInProcess = status.New(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress").Err() - ErrGRPCNoInflightDowngrade = status.New(codes.FailedPrecondition, "etcdserver: no inflight downgrade job").Err() + ErrGRPCWrongDowngradeVersionFormat = status.Error(codes.InvalidArgument, "etcdserver: wrong downgrade target version format") + ErrGRPCInvalidDowngradeTargetVersion = status.Error(codes.InvalidArgument, "etcdserver: invalid downgrade target version") + ErrGRPCClusterVersionUnavailable = status.Error(codes.FailedPrecondition, "etcdserver: cluster version not found during downgrade") + ErrGRPCDowngradeInProcess = status.Error(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress") + ErrGRPCNoInflightDowngrade = status.Error(codes.FailedPrecondition, "etcdserver: no inflight downgrade job") - ErrGRPCCanceled = status.New(codes.Canceled, "etcdserver: request canceled").Err() - ErrGRPCDeadlineExceeded = status.New(codes.DeadlineExceeded, "etcdserver: context deadline exceeded").Err() + ErrGRPCCanceled = status.Error(codes.Canceled, "etcdserver: request canceled") + ErrGRPCDeadlineExceeded = status.Error(codes.DeadlineExceeded, "etcdserver: context deadline exceeded") errStringToError = map[string]error{ ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey, @@ -97,11 +103,12 @@ var ( ErrorDesc(ErrGRPCValueProvided): ErrGRPCValueProvided, ErrorDesc(ErrGRPCLeaseProvided): ErrGRPCLeaseProvided, - ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps, - ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey, - ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted, - ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev, - ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace, + ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps, + ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey, + ErrorDesc(ErrGRPCInvalidSortOption): ErrGRPCInvalidSortOption, + ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted, + ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev, + ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace, ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound, ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist, @@ -115,7 +122,7 @@ var ( ErrorDesc(ErrGRPCMemberNotLearner): ErrGRPCMemberNotLearner, ErrorDesc(ErrGRPCLearnerNotReady): ErrGRPCLearnerNotReady, ErrorDesc(ErrGRPCTooManyLearners): ErrGRPCTooManyLearners, - ErrorDesc(ErrGRPCClusterIdMismatch): ErrGRPCClusterIdMismatch, + ErrorDesc(ErrGRPCClusterIDMismatch): ErrGRPCClusterIDMismatch, ErrorDesc(ErrGRPCRequestTooLarge): ErrGRPCRequestTooLarge, ErrorDesc(ErrGRPCRequestTooManyRequests): ErrGRPCRequestTooManyRequests, @@ -147,7 +154,7 @@ var ( ErrorDesc(ErrGRPCTimeoutDueToConnectionLost): ErrGRPCTimeoutDueToConnectionLost, ErrorDesc(ErrGRPCUnhealthy): ErrGRPCUnhealthy, ErrorDesc(ErrGRPCCorrupt): ErrGRPCCorrupt, - ErrorDesc(ErrGPRCNotSupportedForLearner): ErrGPRCNotSupportedForLearner, + ErrorDesc(ErrGRPCNotSupportedForLearner): ErrGRPCNotSupportedForLearner, ErrorDesc(ErrGRPCBadLeaderTransferee): ErrGRPCBadLeaderTransferee, ErrorDesc(ErrGRPCClusterVersionUnavailable): ErrGRPCClusterVersionUnavailable, @@ -160,15 +167,16 @@ var ( // client-side error var ( - ErrEmptyKey = Error(ErrGRPCEmptyKey) - ErrKeyNotFound = Error(ErrGRPCKeyNotFound) - ErrValueProvided = Error(ErrGRPCValueProvided) - ErrLeaseProvided = Error(ErrGRPCLeaseProvided) - ErrTooManyOps = Error(ErrGRPCTooManyOps) - ErrDuplicateKey = Error(ErrGRPCDuplicateKey) - ErrCompacted = Error(ErrGRPCCompacted) - ErrFutureRev = Error(ErrGRPCFutureRev) - ErrNoSpace = Error(ErrGRPCNoSpace) + ErrEmptyKey = Error(ErrGRPCEmptyKey) + ErrKeyNotFound = Error(ErrGRPCKeyNotFound) + ErrValueProvided = Error(ErrGRPCValueProvided) + ErrLeaseProvided = Error(ErrGRPCLeaseProvided) + ErrTooManyOps = Error(ErrGRPCTooManyOps) + ErrDuplicateKey = Error(ErrGRPCDuplicateKey) + ErrInvalidSortOption = Error(ErrGRPCInvalidSortOption) + ErrCompacted = Error(ErrGRPCCompacted) + ErrFutureRev = Error(ErrGRPCFutureRev) + ErrNoSpace = Error(ErrGRPCNoSpace) ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound) ErrLeaseExist = Error(ErrGRPCLeaseExist) @@ -202,7 +210,11 @@ var ( ErrInvalidAuthToken = Error(ErrGRPCInvalidAuthToken) ErrAuthOldRevision = Error(ErrGRPCAuthOldRevision) ErrInvalidAuthMgmt = Error(ErrGRPCInvalidAuthMgmt) - ErrClusterIdMismatch = Error(ErrGRPCClusterIdMismatch) + ErrClusterIDMismatch = Error(ErrGRPCClusterIDMismatch) + //revive:disable:var-naming + // Deprecated: Please use ErrClusterIDMismatch. + ErrClusterIdMismatch = ErrClusterIDMismatch + //revive:enable:var-naming ErrNoLeader = Error(ErrGRPCNoLeader) ErrNotLeader = Error(ErrGRPCNotLeader) diff --git a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go index 8f8ac60ff2..e5770afb2e 100644 --- a/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go +++ b/vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go @@ -18,3 +18,6 @@ var ( TokenFieldNameGRPC = "token" TokenFieldNameSwagger = "authorization" ) + +// TokenFieldNameGRPCKey is used as a key of context to store token. +type TokenFieldNameGRPCKey struct{} diff --git a/vendor/go.etcd.io/etcd/api/v3/version/version.go b/vendor/go.etcd.io/etcd/api/v3/version/version.go index 03449b523b..d77e31a972 100644 --- a/vendor/go.etcd.io/etcd/api/v3/version/version.go +++ b/vendor/go.etcd.io/etcd/api/v3/version/version.go @@ -26,13 +26,29 @@ import ( var ( // MinClusterVersion is the min cluster version this etcd binary is compatible with. MinClusterVersion = "3.0.0" - Version = "3.5.21" + Version = "3.6.4" APIVersion = "unknown" // Git SHA Value will be set during build GitSHA = "Not provided (use ./build instead of go build)" ) +// Get all constant versions defined in a centralized place. +var ( + V3_0 = semver.Version{Major: 3, Minor: 0} + V3_1 = semver.Version{Major: 3, Minor: 1} + V3_2 = semver.Version{Major: 3, Minor: 2} + V3_3 = semver.Version{Major: 3, Minor: 3} + V3_4 = semver.Version{Major: 3, Minor: 4} + V3_5 = semver.Version{Major: 3, Minor: 5} + V3_6 = semver.Version{Major: 3, Minor: 6} + V3_7 = semver.Version{Major: 3, Minor: 7} + V4_0 = semver.Version{Major: 4, Minor: 0} + + // AllVersions keeps all the versions in ascending order. + AllVersions = []semver.Version{V3_0, V3_1, V3_2, V3_3, V3_4, V3_5, V3_6, V3_7, V4_0} +) + func init() { ver, err := semver.NewVersion(Version) if err == nil { @@ -43,6 +59,7 @@ func init() { type Versions struct { Server string `json:"etcdserver"` Cluster string `json:"etcdcluster"` + Storage string `json:"storage"` // TODO: raft state machine version } @@ -54,3 +71,15 @@ func Cluster(v string) string { } return fmt.Sprintf("%s.%s", vs[0], vs[1]) } + +func Compare(ver1, ver2 semver.Version) int { + return ver1.Compare(ver2) +} + +func LessThan(ver1, ver2 semver.Version) bool { + return ver1.LessThan(ver2) +} + +func Equal(ver1, ver2 semver.Version) bool { + return ver1.Equal(ver2) +} diff --git a/vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go new file mode 100644 index 0000000000..71c74eb719 --- /dev/null +++ b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go @@ -0,0 +1,91 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: version.proto + +package versionpb + +import ( + fmt "fmt" + math "math" + + _ "github.com/gogo/protobuf/gogoproto" + descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +var E_EtcdVersionMsg = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50000, + Name: "versionpb.etcd_version_msg", + Tag: "bytes,50000,opt,name=etcd_version_msg", + Filename: "version.proto", +} + +var E_EtcdVersionField = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50001, + Name: "versionpb.etcd_version_field", + Tag: "bytes,50001,opt,name=etcd_version_field", + Filename: "version.proto", +} + +var E_EtcdVersionEnum = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50002, + Name: "versionpb.etcd_version_enum", + Tag: "bytes,50002,opt,name=etcd_version_enum", + Filename: "version.proto", +} + +var E_EtcdVersionEnumValue = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*string)(nil), + Field: 50003, + Name: "versionpb.etcd_version_enum_value", + Tag: "bytes,50003,opt,name=etcd_version_enum_value", + Filename: "version.proto", +} + +func init() { + proto.RegisterExtension(E_EtcdVersionMsg) + proto.RegisterExtension(E_EtcdVersionField) + proto.RegisterExtension(E_EtcdVersionEnum) + proto.RegisterExtension(E_EtcdVersionEnumValue) +} + +func init() { proto.RegisterFile("version.proto", fileDescriptor_7d2c07d79758f814) } + +var fileDescriptor_7d2c07d79758f814 = []byte{ + // 284 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0xd1, 0xc1, 0x4a, 0xc3, 0x30, + 0x18, 0x07, 0x70, 0x83, 0x20, 0x2c, 0xa0, 0xce, 0x30, 0x50, 0x86, 0xd6, 0x7a, 0xf3, 0x94, 0x80, + 0xbb, 0xed, 0x28, 0xe8, 0xad, 0x2a, 0x1e, 0x76, 0x10, 0xa4, 0xb4, 0x6b, 0x16, 0x02, 0x6d, 0xbf, + 0xd0, 0xb4, 0x7d, 0x04, 0xd9, 0x23, 0xf8, 0x48, 0x1e, 0xa7, 0xbe, 0x80, 0xd4, 0x17, 0x91, 0xa4, + 0xa9, 0xac, 0xd6, 0x53, 0xfb, 0x7d, 0xdf, 0xff, 0xff, 0xeb, 0xa1, 0x78, 0xbf, 0xe6, 0x85, 0x96, + 0x90, 0x53, 0x55, 0x40, 0x09, 0x64, 0xe4, 0x46, 0x15, 0x4f, 0x27, 0x02, 0x04, 0xd8, 0x2d, 0x33, + 0x6f, 0x6d, 0x60, 0xea, 0x0b, 0x00, 0x91, 0x72, 0x66, 0xa7, 0xb8, 0x5a, 0xb1, 0x84, 0xeb, 0x65, + 0x21, 0x55, 0x09, 0x45, 0x9b, 0x98, 0xdf, 0xe1, 0x31, 0x2f, 0x97, 0x49, 0xe8, 0xa4, 0x30, 0xd3, + 0x82, 0x9c, 0xd3, 0xb6, 0x46, 0xbb, 0x1a, 0x0d, 0xb8, 0xd6, 0x91, 0xe0, 0xf7, 0xaa, 0x94, 0x90, + 0xeb, 0x93, 0xcd, 0xcb, 0xae, 0x8f, 0x2e, 0x47, 0x8f, 0x07, 0xa6, 0xba, 0x68, 0x9b, 0x81, 0x16, + 0x6b, 0x84, 0xe6, 0x0f, 0x98, 0xf4, 0xbc, 0x95, 0xe4, 0x69, 0x42, 0xce, 0x06, 0xe2, 0xad, 0xd9, + 0x77, 0xde, 0xbb, 0xf3, 0xc6, 0x5b, 0x9e, 0x0d, 0x18, 0x31, 0xc0, 0x47, 0x3d, 0x91, 0xe7, 0x55, + 0x46, 0x4e, 0x07, 0xe0, 0x4d, 0x5e, 0x65, 0x9d, 0xf7, 0xe1, 0xbc, 0xc3, 0x2d, 0xcf, 0xdc, 0x0d, + 0xf7, 0x8c, 0x8f, 0x07, 0x5c, 0x58, 0x47, 0x69, 0xc5, 0xc9, 0xc5, 0xbf, 0xe8, 0xc2, 0xdc, 0x3a, + 0xf9, 0xd3, 0xc9, 0x93, 0x3f, 0xb2, 0x0d, 0xad, 0x11, 0xba, 0xbe, 0x7a, 0x6b, 0x3c, 0xb4, 0x69, + 0x3c, 0xf4, 0xd5, 0x78, 0xe8, 0xf5, 0xdb, 0xdb, 0x79, 0xf2, 0x05, 0x50, 0x93, 0xa6, 0x12, 0x98, + 0x79, 0xb2, 0x48, 0x49, 0x56, 0xcf, 0xd8, 0xef, 0xbf, 0x8b, 0xf7, 0xec, 0xf7, 0x66, 0x3f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0xe8, 0x02, 0x15, 0xc0, 0xde, 0x01, 0x00, 0x00, +} diff --git a/vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto new file mode 100644 index 0000000000..c81b2f58a4 --- /dev/null +++ b/vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; +package versionpb; + +import "gogoproto/gogo.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "go.etcd.io/etcd/api/v3/versionpb"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.unmarshaler_all) = true; + +// Indicates etcd version that introduced the message, used to determine minimal etcd version required to interpret wal that includes this message. +extend google.protobuf.MessageOptions { + optional string etcd_version_msg = 50000; +} + +// Indicates etcd version that introduced the field, used to determine minimal etcd version required to interpret wal that sets this field. +extend google.protobuf.FieldOptions { + optional string etcd_version_field = 50001; +} + +// Indicates etcd version that introduced the enum, used to determine minimal etcd version required to interpret wal that uses this enum. +extend google.protobuf.EnumOptions { + optional string etcd_version_enum = 50002; +} + +// Indicates etcd version that introduced the enum value, used to determine minimal etcd version required to interpret wal that sets this enum value. +extend google.protobuf.EnumValueOptions { + optional string etcd_version_enum_value = 50003; +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go index ca82f765c9..42221f4b90 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !windows -// +build !windows package fileutil @@ -21,7 +20,7 @@ import "os" const ( // PrivateDirMode grants owner to make/remove files inside the directory. - PrivateDirMode = 0700 + PrivateDirMode = 0o700 ) // OpenDir opens a directory for syncing. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go index 849c63c876..0cb2280cd8 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build windows -// +build windows package fileutil @@ -24,7 +23,7 @@ import ( const ( // PrivateDirMode grants owner to make/remove files inside the directory. - PrivateDirMode = 0777 + PrivateDirMode = 0o777 ) // OpenDir opens a directory in windows with write access for syncing. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go index d31ece3e24..36394a375a 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go @@ -17,16 +17,18 @@ package fileutil import ( "fmt" "io" - "io/ioutil" + "io/fs" "os" "path/filepath" "go.uber.org/zap" + + "go.etcd.io/etcd/client/pkg/v3/verify" ) const ( // PrivateFileMode grants owner to read/write a file. - PrivateFileMode = 0600 + PrivateFileMode = 0o600 ) // IsDirWriteable checks if dir is writable by writing and removing a file @@ -36,7 +38,7 @@ func IsDirWriteable(dir string) error { if err != nil { return err } - if err := ioutil.WriteFile(f, []byte(""), PrivateFileMode); err != nil { + if err := os.WriteFile(f, []byte(""), PrivateFileMode); err != nil { return err } return os.Remove(f) @@ -45,8 +47,9 @@ func IsDirWriteable(dir string) error { // TouchDirAll is similar to os.MkdirAll. It creates directories with 0700 permission if any directory // does not exists. TouchDirAll also ensures the given directory is writable. func TouchDirAll(lg *zap.Logger, dir string) error { + verify.Assert(lg != nil, "nil log isn't allowed") // If path is already a directory, MkdirAll does nothing and returns nil, so, - // first check if dir exist with an expected permission mode. + // first check if dir exists with an expected permission mode. if Exist(dir) { err := CheckDirPermission(dir, PrivateDirMode) if err != nil { @@ -122,7 +125,7 @@ func CheckDirPermission(dir string, perm os.FileMode) error { if !Exist(dir) { return fmt.Errorf("directory %q empty, cannot check permission", dir) } - //check the existing permission on the directory + // check the existing permission on the directory dirInfo, err := os.Stat(dir) if err != nil { return err @@ -157,7 +160,6 @@ func RemoveMatchFile(lg *zap.Logger, dir string, matchFunc func(fileName string) lg.Error("remove file failed", zap.String("file", file), zap.Error(err)) - continue } } } @@ -166,3 +168,16 @@ func RemoveMatchFile(lg *zap.Logger, dir string, matchFunc func(fileName string) } return nil } + +// ListFiles lists files if matchFunc is true on an existing dir +// Returns error if the dir does not exist +func ListFiles(dir string, matchFunc func(fileName string) bool) ([]string, error) { + var files []string + err := filepath.Walk(dir, func(path string, info fs.FileInfo, err error) error { + if matchFunc(path) { + files = append(files, path) + } + return nil + }) + return files, err +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go index 338627f43c..dd2fa545d2 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go @@ -19,8 +19,6 @@ import ( "os" ) -var ( - ErrLocked = errors.New("fileutil: file already locked") -) +var ErrLocked = errors.New("fileutil: file already locked") type LockedFile struct{ *os.File } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go index dcdf226cdb..178c987a4a 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build !windows && !plan9 && !solaris -// +build !windows,!plan9,!solaris package fileutil import ( + "errors" "os" "syscall" ) @@ -29,7 +29,7 @@ func flockTryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, err } if err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil { f.Close() - if err == syscall.EWOULDBLOCK { + if errors.Is(err, syscall.EWOULDBLOCK) { err = ErrLocked } return nil, err diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go index d8952cc481..609ac39784 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build linux -// +build linux package fileutil import ( + "errors" "fmt" "io" "os" @@ -59,13 +59,13 @@ func TryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { func ofdTryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { f, err := os.OpenFile(path, flag, perm) if err != nil { - return nil, fmt.Errorf("ofdTryLockFile failed to open %q (%v)", path, err) + return nil, fmt.Errorf("ofdTryLockFile failed to open %q (%w)", path, err) } flock := wrlck if err = syscall.FcntlFlock(f.Fd(), unix.F_OFD_SETLK, &flock); err != nil { f.Close() - if err == syscall.EWOULDBLOCK { + if errors.Is(err, syscall.EWOULDBLOCK) { err = ErrLocked } return nil, err @@ -80,7 +80,7 @@ func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { func ofdLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { f, err := os.OpenFile(path, flag, perm) if err != nil { - return nil, fmt.Errorf("ofdLockFile failed to open %q (%v)", path, err) + return nil, fmt.Errorf("ofdLockFile failed to open %q (%w)", path, err) } flock := wrlck diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go index 683cc1db9c..2e892fecc6 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build solaris -// +build solaris package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go index d89027e1fa..05db536741 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !windows && !plan9 && !solaris && !linux -// +build !windows,!plan9,!solaris,!linux package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go index 5cbf2bc3d5..51010bdf81 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build windows -// +build windows package fileutil @@ -22,31 +21,18 @@ import ( "fmt" "os" "syscall" - "unsafe" -) - -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - procLockFileEx = modkernel32.NewProc("LockFileEx") - errLocked = errors.New("the process cannot access the file because another process has locked a portion of the file") + "golang.org/x/sys/windows" ) -const ( - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx - LOCKFILE_EXCLUSIVE_LOCK = 2 - LOCKFILE_FAIL_IMMEDIATELY = 1 - - // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx - errLockViolation syscall.Errno = 0x21 -) +var errLocked = errors.New("the process cannot access the file because another process has locked a portion of the file") func TryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { f, err := open(path, flag, perm) if err != nil { return nil, err } - if err := lockFile(syscall.Handle(f.Fd()), LOCKFILE_FAIL_IMMEDIATELY); err != nil { + if err := lockFile(windows.Handle(f.Fd()), windows.LOCKFILE_FAIL_IMMEDIATELY); err != nil { f.Close() return nil, err } @@ -58,7 +44,7 @@ func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { if err != nil { return nil, err } - if err := lockFile(syscall.Handle(f.Fd()), 0); err != nil { + if err := lockFile(windows.Handle(f.Fd()), 0); err != nil { f.Close() return nil, err } @@ -67,7 +53,7 @@ func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) { func open(path string, flag int, perm os.FileMode) (*os.File, error) { if path == "" { - return nil, fmt.Errorf("cannot open empty filename") + return nil, errors.New("cannot open empty filename") } var access uint32 switch flag { @@ -95,32 +81,17 @@ func open(path string, flag int, perm os.FileMode) (*os.File, error) { return os.NewFile(uintptr(fd), path), nil } -func lockFile(fd syscall.Handle, flags uint32) error { - var flag uint32 = LOCKFILE_EXCLUSIVE_LOCK - flag |= flags - if fd == syscall.InvalidHandle { +func lockFile(fd windows.Handle, flags uint32) error { + if fd == windows.InvalidHandle { return nil } - err := lockFileEx(fd, flag, 1, 0, &syscall.Overlapped{}) + err := windows.LockFileEx(fd, flags|windows.LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &windows.Overlapped{}) if err == nil { return nil } else if err.Error() == errLocked.Error() { return ErrLocked - } else if err != errLockViolation { + } else if err != windows.ERROR_LOCK_VIOLATION { return err } return nil } - -func lockFileEx(h syscall.Handle, flags, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { - var reserved uint32 = 0 - r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return err -} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go index c747b7cf81..aadbff7131 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go @@ -19,9 +19,9 @@ import ( "os" ) -// Preallocate tries to allocate the space for given -// file. This operation is only supported on linux by a -// few filesystems (btrfs, ext4, etc.). +// Preallocate tries to allocate the space for given file. This +// operation is only supported on darwin and linux by a few +// filesystems (APFS, btrfs, ext4, etc.). // If the operation is unsupported, no error will be returned. // Otherwise, the error encountered will be returned. func Preallocate(f *os.File, sizeInBytes int64, extendFile bool) error { diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go index caab143dd3..72430ec273 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build darwin -// +build darwin package fileutil import ( + "errors" "os" "syscall" @@ -40,7 +40,7 @@ func preallocFixed(f *os.File, sizeInBytes int64) error { Length: sizeInBytes, } err := unix.FcntlFstore(f.Fd(), unix.F_PREALLOCATE, fstore) - if err == nil || err == unix.ENOTSUP { + if err == nil || errors.Is(err, unix.ENOTSUP) { return nil } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go index ebb8207c34..b0a8166ae1 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go @@ -13,11 +13,11 @@ // limitations under the License. //go:build linux -// +build linux package fileutil import ( + "errors" "os" "syscall" ) @@ -26,10 +26,10 @@ func preallocExtend(f *os.File, sizeInBytes int64) error { // use mode = 0 to change size err := syscall.Fallocate(int(f.Fd()), 0, 0, sizeInBytes) if err != nil { - errno, ok := err.(syscall.Errno) + var errno syscall.Errno // not supported; fallback // fallocate EINTRs frequently in some environments; fallback - if ok && (errno == syscall.ENOTSUP || errno == syscall.EINTR) { + if errors.As(err, &errno) && (errno == syscall.ENOTSUP || errno == syscall.EINTR) { return preallocExtendTrunc(f, sizeInBytes) } } @@ -40,9 +40,9 @@ func preallocFixed(f *os.File, sizeInBytes int64) error { // use mode = 1 to keep size; see FALLOC_FL_KEEP_SIZE err := syscall.Fallocate(int(f.Fd()), 1, 0, sizeInBytes) if err != nil { - errno, ok := err.(syscall.Errno) + var errno syscall.Errno // treat not supported as nil error - if ok && errno == syscall.ENOTSUP { + if errors.As(err, &errno) && errno == syscall.ENOTSUP { return nil } } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go index 2c46dd4907..e7fd937a43 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !linux && !darwin -// +build !linux,!darwin package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go index b314e068fe..026ea03230 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go @@ -17,7 +17,6 @@ package fileutil import ( "os" "path/filepath" - "sort" "strings" "time" @@ -58,21 +57,14 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval defer close(donec) } for { - fnames, err := ReadDir(dirname) + fnamesWithSuffix, err := readDirWithSuffix(dirname, suffix) if err != nil { errC <- err return } - newfnames := make([]string, 0) - for _, fname := range fnames { - if strings.HasSuffix(fname, suffix) { - newfnames = append(newfnames, fname) - } - } - sort.Strings(newfnames) - fnames = newfnames - for len(newfnames) > int(max) { - f := filepath.Join(dirname, newfnames[0]) + nPurged := 0 + for nPurged < len(fnamesWithSuffix)-int(max) { + f := filepath.Join(dirname, fnamesWithSuffix[nPurged]) var l *LockedFile if flock { l, err = TryLockFile(f, os.O_WRONLY, PrivateFileMode) @@ -94,11 +86,12 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval } } lg.Info("purged", zap.String("path", f)) - newfnames = newfnames[1:] + nPurged++ } + if purgec != nil { - for i := 0; i < len(fnames)-len(newfnames); i++ { - purgec <- fnames[i] + for i := 0; i < nPurged; i++ { + purgec <- fnamesWithSuffix[i] } } select { @@ -110,3 +103,18 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval }() return errC } + +func readDirWithSuffix(dirname string, suffix string) ([]string, error) { + fnames, err := ReadDir(dirname) + if err != nil { + return nil, err + } + // filter in place (ref. https://go.dev/wiki/SliceTricks#filtering-without-allocating) + fnamesWithSuffix := fnames[:0] + for _, fname := range fnames { + if strings.HasSuffix(fname, suffix) { + fnamesWithSuffix = append(fnamesWithSuffix, fname) + } + } + return fnamesWithSuffix, nil +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go index 0a0855309e..670d01fadc 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !linux && !darwin -// +build !linux,!darwin package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go index 1923b276ea..7affa78ea6 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build darwin -// +build darwin package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go index b9398c23f9..a3172382e5 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build linux -// +build linux package fileutil diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go new file mode 100644 index 0000000000..286d385ba3 --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go @@ -0,0 +1,42 @@ +// Copyright 2019 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import "fmt" + +const ( + JSONLogFormat = "json" + ConsoleLogFormat = "console" + //revive:disable:var-naming + // Deprecated: Please use JSONLogFormat. + JsonLogFormat = JSONLogFormat + //revive:enable:var-naming +) + +var DefaultLogFormat = JSONLogFormat + +// ConvertToZapFormat converts and validated log format string. +func ConvertToZapFormat(format string) (string, error) { + switch format { + case ConsoleLogFormat: + return ConsoleLogFormat, nil + case JSONLogFormat: + return JSONLogFormat, nil + case "": + return DefaultLogFormat, nil + default: + return "", fmt.Errorf("unknown log format: %s, supported values json, console", format) + } +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go index f0f3739aad..befa575847 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go @@ -15,7 +15,7 @@ package logutil import ( - "sort" + "slices" "time" "go.uber.org/zap" @@ -43,7 +43,7 @@ var DefaultZapLoggerConfig = zap.Config{ Thereafter: 100, }, - Encoding: "json", + Encoding: DefaultLogFormat, // copied from "zap.NewProductionEncoderConfig" with some updates EncoderConfig: zapcore.EncoderConfig{ @@ -72,37 +72,22 @@ var DefaultZapLoggerConfig = zap.Config{ // MergeOutputPaths merges logging output paths, resolving conflicts. func MergeOutputPaths(cfg zap.Config) zap.Config { - outputs := make(map[string]struct{}) - for _, v := range cfg.OutputPaths { - outputs[v] = struct{}{} - } - outputSlice := make([]string, 0) - if _, ok := outputs["/dev/null"]; ok { - // "/dev/null" to discard all - outputSlice = []string{"/dev/null"} - } else { - for k := range outputs { - outputSlice = append(outputSlice, k) - } - } - cfg.OutputPaths = outputSlice - sort.Strings(cfg.OutputPaths) + cfg.OutputPaths = mergePaths(cfg.OutputPaths) + cfg.ErrorOutputPaths = mergePaths(cfg.ErrorOutputPaths) + return cfg +} - errOutputs := make(map[string]struct{}) - for _, v := range cfg.ErrorOutputPaths { - errOutputs[v] = struct{}{} +func mergePaths(old []string) []string { + if len(old) == 0 { + // the original implementation ensures the result is non-nil + return []string{} } - errOutputSlice := make([]string, 0) - if _, ok := errOutputs["/dev/null"]; ok { - // "/dev/null" to discard all - errOutputSlice = []string{"/dev/null"} - } else { - for k := range errOutputs { - errOutputSlice = append(errOutputSlice, k) - } + // use "/dev/null" to discard all + if slices.Contains(old, "/dev/null") { + return []string{"/dev/null"} } - cfg.ErrorOutputPaths = errOutputSlice - sort.Strings(cfg.ErrorOutputPaths) - - return cfg + // clone a new one; don't modify the original, in case it matters. + dup := slices.Clone(old) + slices.Sort(dup) + return slices.Compact(dup) } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go index 9daa3e0aab..06dc40dacd 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build !windows -// +build !windows package logutil @@ -25,10 +24,10 @@ import ( "os" "path/filepath" - "go.etcd.io/etcd/client/pkg/v3/systemd" - "github.com/coreos/go-systemd/v22/journal" "go.uber.org/zap/zapcore" + + "go.etcd.io/etcd/client/pkg/v3/systemd" ) // NewJournalWriter wraps "io.Writer" to redirect log output diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go b/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go index 3a5aef089a..0f79865e80 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go @@ -18,7 +18,7 @@ import ( "crypto/tls" "crypto/x509" "encoding/pem" - "io/ioutil" + "os" ) // NewCertPool creates x509 certPool with provided CA files. @@ -26,7 +26,7 @@ func NewCertPool(CAFiles []string) (*x509.CertPool, error) { certPool := x509.NewCertPool() for _, CAFile := range CAFiles { - pemByte, err := ioutil.ReadFile(CAFile) + pemByte, err := os.ReadFile(CAFile) if err != nil { return nil, err } @@ -51,12 +51,12 @@ func NewCertPool(CAFiles []string) (*x509.CertPool, error) { // NewCert generates TLS cert by using the given cert,key and parse function. func NewCert(certfile, keyfile string, parseFunc func([]byte, []byte) (tls.Certificate, error)) (*tls.Certificate, error) { - cert, err := ioutil.ReadFile(certfile) + cert, err := os.ReadFile(certfile) if err != nil { return nil, err } - key, err := ioutil.ReadFile(keyfile) + key, err := os.ReadFile(keyfile) if err != nil { return nil, err } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go index d00a93dc19..d43ac4f078 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go @@ -16,6 +16,7 @@ package transport import ( "crypto/tls" + "errors" "fmt" "net" "time" @@ -38,7 +39,7 @@ func NewKeepAliveListener(l net.Listener, scheme string, tlscfg *tls.Config) (ne if scheme == "https" { if tlscfg == nil { - return nil, fmt.Errorf("cannot listen on TLS for given listener: KeyFile and CertFile are not presented") + return nil, errors.New("cannot listen on TLS for given listener: KeyFile and CertFile are not presented") } return newTLSKeepaliveListener(kal, tlscfg), nil } @@ -95,16 +96,17 @@ type tlsKeepaliveListener struct { // Accept waits for and returns the next incoming TLS connection. // The returned connection c is a *tls.Conn. -func (l *tlsKeepaliveListener) Accept() (c net.Conn, err error) { - c, err = l.Listener.Accept() +func (l *tlsKeepaliveListener) Accept() (net.Conn, error) { + c, err := l.Listener.Accept() if err != nil { - return + return nil, err } + c = tls.Server(c, l.config) return c, nil } -// NewListener creates a Listener which accepts connections from an inner +// newTLSKeepaliveListener creates a Listener which accepts connections from an inner // Listener and wraps each connection with Server. // The configuration config must be non-nil and must have // at least one certificate. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go index 404722ba76..bf4c4e104a 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go @@ -23,9 +23,7 @@ import ( "time" ) -var ( - ErrNotTCP = errors.New("only tcp connections have keepalive") -) +var ErrNotTCP = errors.New("only tcp connections have keepalive") // LimitListener returns a Listener that accepts at most n simultaneous // connections from the provided Listener. diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go index a7d37688d9..9c2d29ba99 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go @@ -32,10 +32,11 @@ import ( "strings" "time" + "go.uber.org/zap" + "go.etcd.io/etcd/client/pkg/v3/fileutil" "go.etcd.io/etcd/client/pkg/v3/tlsutil" - - "go.uber.org/zap" + "go.etcd.io/etcd/client/pkg/v3/verify" ) // NewListener creates a new listner. @@ -43,7 +44,7 @@ func NewListener(addr, scheme string, tlsinfo *TLSInfo) (l net.Listener, err err return newListener(addr, scheme, WithTLSInfo(tlsinfo)) } -// NewListenerWithOpts creates a new listener which accpets listener options. +// NewListenerWithOpts creates a new listener which accepts listener options. func NewListenerWithOpts(addr, scheme string, opts ...ListenerOption) (net.Listener, error) { return newListener(addr, scheme, opts...) } @@ -59,11 +60,7 @@ func newListener(addr, scheme string, opts ...ListenerOption) (net.Listener, err switch { case lnOpts.IsSocketOpts(): // new ListenConfig with socket options. - config, err := newListenConfig(lnOpts.socketOpts) - if err != nil { - return nil, err - } - lnOpts.ListenConfig = config + lnOpts.ListenConfig = newListenConfig(lnOpts.socketOpts) // check for timeout fallthrough case lnOpts.IsTimeout(), lnOpts.IsSocketOpts(): @@ -102,14 +99,17 @@ func newListener(addr, scheme string, opts ...ListenerOption) (net.Listener, err return wrapTLS(scheme, lnOpts.tlsInfo, lnOpts.Listener) } -func newKeepAliveListener(cfg *net.ListenConfig, addr string) (ln net.Listener, err error) { +func newKeepAliveListener(cfg *net.ListenConfig, addr string) (net.Listener, error) { + var ln net.Listener + var err error + if cfg != nil { ln, err = cfg.Listen(context.TODO(), "tcp", addr) } else { ln, err = net.Listen("tcp", addr) } if err != nil { - return + return nil, err } return NewKeepAliveListener(ln, "tcp", nil) @@ -125,7 +125,7 @@ func wrapTLS(scheme string, tlsinfo *TLSInfo, l net.Listener) (net.Listener, err return newTLSListener(l, tlsinfo, checkSAN) } -func newListenConfig(sopts *SocketOpts) (net.ListenConfig, error) { +func newListenConfig(sopts *SocketOpts) net.ListenConfig { lc := net.ListenConfig{} if sopts != nil { ctls := getControls(sopts) @@ -133,7 +133,7 @@ func newListenConfig(sopts *SocketOpts) (net.ListenConfig, error) { lc.Control = ctls.Control } } - return lc, nil + return lc } type TLSInfo struct { @@ -204,6 +204,9 @@ type TLSInfo struct { // EmptyCN indicates that the cert must have empty CN. // If true, ClientConfig() will return an error for a cert with non empty CN. EmptyCN bool + + // LocalAddr is the local IP address to use when communicating with a peer. + LocalAddr string } func (info TLSInfo) String() string { @@ -214,34 +217,35 @@ func (info TLSInfo) Empty() bool { return info.CertFile == "" && info.KeyFile == "" } -func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertValidity uint, additionalUsages ...x509.ExtKeyUsage) (info TLSInfo, err error) { - info.Logger = lg +func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertValidity uint, additionalUsages ...x509.ExtKeyUsage) (TLSInfo, error) { + verify.Assert(lg != nil, "nil log isn't allowed") + + var err error + info := TLSInfo{Logger: lg} if selfSignedCertValidity == 0 { - err = fmt.Errorf("selfSignedCertValidity is invalid,it should be greater than 0") + err = errors.New("selfSignedCertValidity is invalid,it should be greater than 0") info.Logger.Warn( "cannot generate cert", zap.Error(err), ) - return + return info, err } err = fileutil.TouchDirAll(lg, dirpath) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot create cert directory", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot create cert directory", + zap.Error(err), + ) + return info, err } certPath, err := filepath.Abs(filepath.Join(dirpath, "cert.pem")) if err != nil { - return + return info, err } keyPath, err := filepath.Abs(filepath.Join(dirpath, "key.pem")) if err != nil { - return + return info, err } _, errcert := os.Stat(certPath) _, errkey := os.Stat(keyPath) @@ -251,19 +255,17 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali info.ClientCertFile = certPath info.ClientKeyFile = keyPath info.selfCert = true - return + return info, err } serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot generate random number", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot generate random number", + zap.Error(err), + ) + return info, err } tmpl := x509.Certificate{ @@ -272,17 +274,16 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali NotBefore: time.Now(), NotAfter: time.Now().Add(time.Duration(selfSignedCertValidity) * 365 * (24 * time.Hour)), - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCRLSign, ExtKeyUsage: append([]x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, additionalUsages...), BasicConstraintsValid: true, + IsCA: true, } - if info.Logger != nil { - info.Logger.Warn( - "automatically generate certificates", - zap.Time("certificate-validity-bound-not-after", tmpl.NotAfter), - ) - } + info.Logger.Warn( + "automatically generate certificates", + zap.Time("certificate-validity-bound-not-after", tmpl.NotAfter), + ) for _, host := range hosts { h, _, _ := net.SplitHostPort(host) @@ -295,24 +296,20 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot generate ECDSA key", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot generate ECDSA key", + zap.Error(err), + ) + return info, err } derBytes, err := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, &priv.PublicKey, priv) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot generate x509 certificate", - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot generate x509 certificate", + zap.Error(err), + ) + return info, err } certOut, err := os.Create(certPath) @@ -322,34 +319,29 @@ func SelfCert(lg *zap.Logger, dirpath string, hosts []string, selfSignedCertVali zap.String("path", certPath), zap.Error(err), ) - return + return info, err } pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) certOut.Close() - if info.Logger != nil { - info.Logger.Info("created cert file", zap.String("path", certPath)) - } + + info.Logger.Info("created cert file", zap.String("path", certPath)) b, err := x509.MarshalECPrivateKey(priv) if err != nil { - return + return info, err } - keyOut, err := os.OpenFile(keyPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + keyOut, err := os.OpenFile(keyPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600) if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "cannot key file", - zap.String("path", keyPath), - zap.Error(err), - ) - } - return + info.Logger.Warn( + "cannot key file", + zap.String("path", keyPath), + zap.Error(err), + ) + return info, err } pem.Encode(keyOut, &pem.Block{Type: "EC PRIVATE KEY", Bytes: b}) keyOut.Close() - if info.Logger != nil { - info.Logger.Info("created key file", zap.String("path", keyPath)) - } + info.Logger.Info("created key file", zap.String("path", keyPath)) return SelfCert(lg, dirpath, hosts, selfSignedCertValidity) } @@ -482,23 +474,19 @@ func (info TLSInfo) baseConfig() (*tls.Config, error) { cfg.GetCertificate = func(clientHello *tls.ClientHelloInfo) (cert *tls.Certificate, err error) { cert, err = tlsutil.NewCert(info.CertFile, info.KeyFile, info.parseFunc) if os.IsNotExist(err) { - if info.Logger != nil { - info.Logger.Warn( - "failed to find peer cert files", - zap.String("cert-file", info.CertFile), - zap.String("key-file", info.KeyFile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to find peer cert files", + zap.String("cert-file", info.CertFile), + zap.String("key-file", info.KeyFile), + zap.Error(err), + ) } else if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "failed to create peer certificate", - zap.String("cert-file", info.CertFile), - zap.String("key-file", info.KeyFile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to create peer certificate", + zap.String("cert-file", info.CertFile), + zap.String("key-file", info.KeyFile), + zap.Error(err), + ) } return cert, err } @@ -509,23 +497,19 @@ func (info TLSInfo) baseConfig() (*tls.Config, error) { } cert, err = tlsutil.NewCert(certfile, keyfile, info.parseFunc) if os.IsNotExist(err) { - if info.Logger != nil { - info.Logger.Warn( - "failed to find client cert files", - zap.String("cert-file", certfile), - zap.String("key-file", keyfile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to find client cert files", + zap.String("cert-file", certfile), + zap.String("key-file", keyfile), + zap.Error(err), + ) } else if err != nil { - if info.Logger != nil { - info.Logger.Warn( - "failed to create client certificate", - zap.String("cert-file", certfile), - zap.String("key-file", keyfile), - zap.Error(err), - ) - } + info.Logger.Warn( + "failed to create client certificate", + zap.String("cert-file", certfile), + zap.String("key-file", keyfile), + zap.Error(err), + ) } return cert, err } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go index ad4f6904da..7536f6aff4 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go @@ -1,3 +1,17 @@ +// Copyright 2021 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package transport import ( diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go index 6f1600945c..2c94841625 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go @@ -19,8 +19,8 @@ import ( "crypto/tls" "crypto/x509" "fmt" - "io/ioutil" "net" + "os" "strings" "sync" ) @@ -168,16 +168,16 @@ func (l *tlsListener) acceptLoop() { func checkCRL(crlPath string, cert []*x509.Certificate) error { // TODO: cache - crlBytes, err := ioutil.ReadFile(crlPath) + crlBytes, err := os.ReadFile(crlPath) if err != nil { return err } - certList, err := x509.ParseCRL(crlBytes) + certList, err := x509.ParseRevocationList(crlBytes) if err != nil { return err } revokedSerials := make(map[string]struct{}) - for _, rc := range certList.TBSCertList.RevokedCertificates { + for _, rc := range certList.RevokedCertificateEntries { revokedSerials[string(rc.SerialNumber.Bytes())] = struct{}{} } for _, c := range cert { @@ -222,7 +222,8 @@ func checkCertSAN(ctx context.Context, cert *x509.Certificate, remoteAddr string func isHostInDNS(ctx context.Context, host string, dnsNames []string) (ok bool, err error) { // reverse lookup - wildcards, names := []string{}, []string{} + var names []string + var wildcards []string for _, dns := range dnsNames { if strings.HasPrefix(dns, "*.") { wildcards = append(wildcards, dns[1:]) diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go index fe028c6132..49b48dc876 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go @@ -1,3 +1,17 @@ +// Copyright 2021 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package transport import ( diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go index 495c736365..149ad51024 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go @@ -13,19 +13,18 @@ // limitations under the License. //go:build solaris -// +build solaris package transport import ( - "fmt" + "errors" "syscall" "golang.org/x/sys/unix" ) func setReusePort(network, address string, c syscall.RawConn) error { - return fmt.Errorf("port reuse is not supported on Solaris") + return errors.New("port reuse is not supported on Solaris") } func setReuseAddress(network, address string, conn syscall.RawConn) error { diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go index e2cc6f4828..385eadb007 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go @@ -12,8 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !windows && !solaris -// +build !windows,!solaris +//go:build !windows && !solaris && !wasm && !js package transport diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_wasm.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_wasm.go new file mode 100644 index 0000000000..c6590b1d46 --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_wasm.go @@ -0,0 +1,30 @@ +// Copyright 2023 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build wasm || js + +package transport + +import ( + "errors" + "syscall" +) + +func setReusePort(network, address string, c syscall.RawConn) error { + return errors.New("port reuse is not supported on WASM") +} + +func setReuseAddress(network, addr string, conn syscall.RawConn) error { + return errors.New("address reuse is not supported on WASM") +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go index 4e5af70b11..2670b4dc7b 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go @@ -1,19 +1,32 @@ +// Copyright 2021 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + //go:build windows -// +build windows package transport import ( - "fmt" + "errors" "syscall" ) func setReusePort(network, address string, c syscall.RawConn) error { - return fmt.Errorf("port reuse is not supported on Windows") + return errors.New("port reuse is not supported on Windows") } // Windows supports SO_REUSEADDR, but it may cause undefined behavior, as // there is no protection against port hijacking. func setReuseAddress(network, addr string, conn syscall.RawConn) error { - return fmt.Errorf("address reuse is not supported on Windows") + return errors.New("address reuse is not supported on Windows") } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go index 8c3a35b140..d5375863fd 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go @@ -16,6 +16,7 @@ package transport import ( "context" + "errors" "fmt" "strings" "time" @@ -46,7 +47,7 @@ func ValidateSecureEndpoints(tlsInfo TLSInfo, eps []string) ([]string, error) { endpoints = append(endpoints, ep) } if len(errs) != 0 { - err = fmt.Errorf("%s", strings.Join(errs, ",")) + err = errors.New(strings.Join(errs, ",")) } return endpoints, err } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go index 648512772d..67170d7436 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go @@ -30,10 +30,19 @@ func NewTransport(info TLSInfo, dialtimeoutd time.Duration) (*http.Transport, er return nil, err } + var ipAddr net.Addr + if info.LocalAddr != "" { + ipAddr, err = net.ResolveTCPAddr("tcp", info.LocalAddr+":0") + if err != nil { + return nil, err + } + } + t := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ - Timeout: dialtimeoutd, + Timeout: dialtimeoutd, + LocalAddr: ipAddr, // value taken from http.DefaultTransport KeepAlive: 30 * time.Second, }).DialContext, @@ -57,7 +66,7 @@ func NewTransport(info TLSInfo, dialtimeoutd time.Duration) (*http.Transport, er TLSClientConfig: cfg, // Cost of reopening connection on sockets is low, and they are mostly used in testing. // Long living unix-transport connections were leading to 'leak' test flakes. - // Alternativly the returned Transport (t) should override CloseIdleConnections to + // Alternatively the returned Transport (t) should override CloseIdleConnections to // forward it to 'tu' as well. IdleConnTimeout: time.Microsecond, } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go b/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go index ae00388dde..7a09647b5d 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go @@ -14,7 +14,10 @@ package types -import "strconv" +import ( + "strconv" + "strings" +) // ID represents a generic identifier which is canonically // stored as a uint64 but is typically represented as a @@ -37,3 +40,17 @@ type IDSlice []ID func (p IDSlice) Len() int { return len(p) } func (p IDSlice) Less(i, j int) bool { return uint64(p[i]) < uint64(p[j]) } func (p IDSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +func (p IDSlice) String() string { + var b strings.Builder + if p.Len() > 0 { + b.WriteString(p[0].String()) + } + + for i := 1; i < p.Len(); i++ { + b.WriteString(",") + b.WriteString(p[i].String()) + } + + return b.String() +} diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go b/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go index e7a3cdc9ab..3e69c8d8b9 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go @@ -90,7 +90,7 @@ func (us *unsafeSet) Length() int { // Values returns the values of the Set in an unspecified order. func (us *unsafeSet) Values() (values []string) { - values = make([]string, 0) + values = make([]string, 0, len(us.d)) for val := range us.d { values = append(values, val) } diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.go b/vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.go new file mode 100644 index 0000000000..a7b2097bed --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/verify/verify.go @@ -0,0 +1,80 @@ +// Copyright 2022 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package verify + +import ( + "fmt" + "os" + "strings" +) + +const envVerify = "ETCD_VERIFY" + +type VerificationType string + +const ( + envVerifyValueAll VerificationType = "all" + envVerifyValueAssert VerificationType = "assert" +) + +func getEnvVerify() string { + return strings.ToLower(os.Getenv(envVerify)) +} + +func IsVerificationEnabled(verification VerificationType) bool { + env := getEnvVerify() + return env == string(envVerifyValueAll) || env == strings.ToLower(string(verification)) +} + +// EnableVerifications sets `envVerify` and returns a function that +// can be used to bring the original settings. +func EnableVerifications(verification VerificationType) func() { + previousEnv := getEnvVerify() + os.Setenv(envVerify, string(verification)) + return func() { + os.Setenv(envVerify, previousEnv) + } +} + +// EnableAllVerifications enables verification and returns a function +// that can be used to bring the original settings. +func EnableAllVerifications() func() { + return EnableVerifications(envVerifyValueAll) +} + +// DisableVerifications unsets `envVerify` and returns a function that +// can be used to bring the original settings. +func DisableVerifications() func() { + previousEnv := getEnvVerify() + os.Unsetenv(envVerify) + return func() { + os.Setenv(envVerify, previousEnv) + } +} + +// Verify performs verification if the assertions are enabled. +// In the default setup running in tests and skipped in the production code. +func Verify(f func()) { + if IsVerificationEnabled(envVerifyValueAssert) { + f() + } +} + +// Assert will panic with a given formatted message if the given condition is false. +func Assert(condition bool, msg string, v ...any) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} diff --git a/vendor/go.etcd.io/etcd/client/v3/OWNERS b/vendor/go.etcd.io/etcd/client/v3/OWNERS new file mode 100644 index 0000000000..2b7f28b793 --- /dev/null +++ b/vendor/go.etcd.io/etcd/client/v3/OWNERS @@ -0,0 +1,4 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +labels: + - area/clientv3 diff --git a/vendor/go.etcd.io/etcd/client/v3/README.md b/vendor/go.etcd.io/etcd/client/v3/README.md index 16c0fe888c..af0087ebcc 100644 --- a/vendor/go.etcd.io/etcd/client/v3/README.md +++ b/vendor/go.etcd.io/etcd/client/v3/README.md @@ -1,7 +1,7 @@ -# etcd/clientv3 +# etcd/client/v3 [![Docs](https://img.shields.io/badge/docs-latest-green.svg)](https://etcd.io/docs) -[![Godoc](https://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/go.etcd.io/etcd/clientv3) +[![Godoc](https://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/go.etcd.io/etcd/client/v3) `etcd/clientv3` is the official Go etcd client for v3. @@ -16,14 +16,18 @@ go get go.etcd.io/etcd/client/v3 Create client using `clientv3.New`: ```go -cli, err := clientv3.New(clientv3.Config{ - Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, - DialTimeout: 5 * time.Second, -}) -if err != nil { - // handle error! +import clientv3 "go.etcd.io/etcd/client/v3" + +func main() { + cli, err := clientv3.New(clientv3.Config{ + Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"}, + DialTimeout: 5 * time.Second, + }) + if err != nil { + // handle error! + } + defer cli.Close() } -defer cli.Close() ``` etcd v3 uses [`gRPC`](https://www.grpc.io) for remote procedure calls. And `clientv3` uses diff --git a/vendor/go.etcd.io/etcd/client/v3/auth.go b/vendor/go.etcd.io/etcd/client/v3/auth.go index 110918a4c7..382172b21b 100644 --- a/vendor/go.etcd.io/etcd/client/v3/auth.go +++ b/vendor/go.etcd.io/etcd/client/v3/auth.go @@ -19,9 +19,10 @@ import ( "fmt" "strings" + "google.golang.org/grpc" + "go.etcd.io/etcd/api/v3/authpb" pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "google.golang.org/grpc" ) type ( diff --git a/vendor/go.etcd.io/etcd/client/v3/client.go b/vendor/go.etcd.io/etcd/client/v3/client.go index f7aa65a0a7..24f5988986 100644 --- a/vendor/go.etcd.io/etcd/client/v3/client.go +++ b/vendor/go.etcd.io/etcd/client/v3/client.go @@ -18,22 +18,26 @@ import ( "context" "errors" "fmt" - "strconv" "strings" "sync" "time" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "go.etcd.io/etcd/client/pkg/v3/logutil" - "go.etcd.io/etcd/client/v3/credentials" - "go.etcd.io/etcd/client/v3/internal/endpoint" - "go.etcd.io/etcd/client/v3/internal/resolver" + "github.com/coreos/go-semver/semver" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" grpccredentials "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/status" + + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" + "go.etcd.io/etcd/api/v3/version" + "go.etcd.io/etcd/client/pkg/v3/logutil" + "go.etcd.io/etcd/client/pkg/v3/verify" + "go.etcd.io/etcd/client/v3/credentials" + "go.etcd.io/etcd/client/v3/internal/endpoint" + "go.etcd.io/etcd/client/v3/internal/resolver" ) var ( @@ -55,7 +59,9 @@ type Client struct { cfg Config creds grpccredentials.TransportCredentials resolver *resolver.EtcdManualResolver - mu *sync.RWMutex + + epMu *sync.RWMutex + endpoints []string ctx context.Context cancel context.CancelFunc @@ -64,7 +70,7 @@ type Client struct { Username string // Password is a password for authentication. Password string - authTokenBundle credentials.Bundle + authTokenBundle credentials.PerRPCCredentialsBundle callOpts []grpc.CallOption @@ -86,7 +92,7 @@ func New(cfg Config) (*Client, error) { // service interface implementations and do not need connection management. func NewCtxClient(ctx context.Context, opts ...Option) *Client { cctx, cancel := context.WithCancel(ctx) - c := &Client{ctx: cctx, cancel: cancel, lgMu: new(sync.RWMutex), mu: new(sync.RWMutex)} + c := &Client{ctx: cctx, cancel: cancel, lgMu: new(sync.RWMutex), epMu: new(sync.RWMutex)} for _, opt := range opts { opt(c) } @@ -161,18 +167,18 @@ func (c *Client) Ctx() context.Context { return c.ctx } // Endpoints lists the registered endpoints for the client. func (c *Client) Endpoints() []string { // copy the slice; protect original endpoints from being changed - c.mu.RLock() - defer c.mu.RUnlock() - eps := make([]string, len(c.cfg.Endpoints)) - copy(eps, c.cfg.Endpoints) + c.epMu.RLock() + defer c.epMu.RUnlock() + eps := make([]string, len(c.endpoints)) + copy(eps, c.endpoints) return eps } // SetEndpoints updates client's endpoints. func (c *Client) SetEndpoints(eps ...string) { - c.mu.Lock() - defer c.mu.Unlock() - c.cfg.Endpoints = eps + c.epMu.Lock() + defer c.epMu.Unlock() + c.endpoints = eps c.resolver.SetEndpoints(eps) } @@ -189,7 +195,15 @@ func (c *Client) Sync(ctx context.Context) error { eps = append(eps, m.ClientURLs...) } } + // The linearizable `MemberList` returned successfully, so the + // endpoints shouldn't be empty. + verify.Verify(func() { + if len(eps) == 0 { + panic("empty endpoints returned from etcd cluster") + } + }) c.SetEndpoints(eps...) + c.lg.Debug("set etcd endpoints by autoSync", zap.Strings("endpoints", eps)) return nil } @@ -206,7 +220,7 @@ func (c *Client) autoSync() { ctx, cancel := context.WithTimeout(c.ctx, 5*time.Second) err := c.Sync(ctx) cancel() - if err != nil && err != c.ctx.Err() { + if err != nil && !errors.Is(err, c.ctx.Err()) { c.lg.Info("Auto sync endpoints failed.", zap.Error(err)) } } @@ -214,7 +228,9 @@ func (c *Client) autoSync() { } // dialSetupOpts gives the dial opts prior to any authentication. -func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) (opts []grpc.DialOption, err error) { +func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) []grpc.DialOption { + var opts []grpc.DialOption + if c.cfg.DialKeepAliveTime > 0 { params := keepalive.ClientParameters{ Time: c.cfg.DialKeepAliveTime, @@ -228,7 +244,7 @@ func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts if creds != nil { opts = append(opts, grpc.WithTransportCredentials(creds)) } else { - opts = append(opts, grpc.WithInsecure()) + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) } unaryMaxRetries := defaultUnaryMaxRetries @@ -257,7 +273,7 @@ func (c *Client) dialSetupOpts(creds grpccredentials.TransportCredentials, dopts grpc.WithUnaryInterceptor(c.unaryClientInterceptor(withMax(unaryMaxRetries), rrBackoff)), ) - return opts, nil + return opts } // Dial connects to a single endpoint using the client's config. @@ -278,7 +294,7 @@ func (c *Client) getToken(ctx context.Context) error { resp, err := c.Auth.Authenticate(ctx, c.Username, c.Password) if err != nil { - if err == rpctypes.ErrAuthNotEnabled { + if errors.Is(err, rpctypes.ErrAuthNotEnabled) { c.authTokenBundle.UpdateAuthToken("") return nil } @@ -298,10 +314,8 @@ func (c *Client) dialWithBalancer(dopts ...grpc.DialOption) (*grpc.ClientConn, e // dial configures and dials any grpc balancer target. func (c *Client) dial(creds grpccredentials.TransportCredentials, dopts ...grpc.DialOption) (*grpc.ClientConn, error) { - opts, err := c.dialSetupOpts(creds, dopts...) - if err != nil { - return nil, fmt.Errorf("failed to configure dialer: %v", err) - } + opts := c.dialSetupOpts(creds, dopts...) + if c.authTokenBundle != nil { opts = append(opts, grpc.WithPerRPCCredentials(c.authTokenBundle.PerRPCCredentials())) } @@ -314,7 +328,7 @@ func (c *Client) dial(creds grpccredentials.TransportCredentials, dopts ...grpc. dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout) defer cancel() // TODO: Is this right for cases where grpc.WithBlock() is not set on the dial options? } - target := fmt.Sprintf("%s://%p/%s", resolver.Schema, c, authority(c.Endpoints()[0])) + target := fmt.Sprintf("%s://%p/%s", resolver.Schema, c, authority(c.endpoints[0])) conn, err := grpc.DialContext(dctx, target, opts...) if err != nil { return nil, err @@ -339,15 +353,15 @@ func authority(endpoint string) string { func (c *Client) credentialsForEndpoint(ep string) grpccredentials.TransportCredentials { r := endpoint.RequiresCredentials(ep) switch r { - case endpoint.CREDS_DROP: + case endpoint.CredsDrop: return nil - case endpoint.CREDS_OPTIONAL: + case endpoint.CredsOptional: return c.creds - case endpoint.CREDS_REQUIRE: + case endpoint.CredsRequire: if c.creds != nil { return c.creds } - return credentials.NewBundle(credentials.Config{}).TransportCredentials() + return credentials.NewTransportCredential(nil) default: panic(fmt.Errorf("unsupported CredsRequirement: %v", r)) } @@ -359,7 +373,7 @@ func newClient(cfg *Config) (*Client, error) { } var creds grpccredentials.TransportCredentials if cfg.TLS != nil { - creds = credentials.NewBundle(credentials.Config{TLSConfig: cfg.TLS}).TransportCredentials() + creds = credentials.NewTransportCredential(cfg.TLS) } // use a temporary skeleton client to bootstrap first connection @@ -375,7 +389,7 @@ func newClient(cfg *Config) (*Client, error) { creds: creds, ctx: ctx, cancel: cancel, - mu: new(sync.RWMutex), + epMu: new(sync.RWMutex), callOpts: defaultCallOpts, lgMu: new(sync.RWMutex), } @@ -398,7 +412,7 @@ func newClient(cfg *Config) (*Client, error) { if cfg.Username != "" && cfg.Password != "" { client.Username = cfg.Username client.Password = cfg.Password - client.authTokenBundle = credentials.NewBundle(credentials.Config{}) + client.authTokenBundle = credentials.NewPerRPCCredentialBundle() } if cfg.MaxCallSendMsgSize > 0 || cfg.MaxCallRecvMsgSize > 0 { if cfg.MaxCallRecvMsgSize > 0 && cfg.MaxCallSendMsgSize > cfg.MaxCallRecvMsgSize { @@ -422,8 +436,10 @@ func newClient(cfg *Config) (*Client, error) { if len(cfg.Endpoints) < 1 { client.cancel() - return nil, fmt.Errorf("at least one Endpoint is required in client config") + return nil, errors.New("at least one Endpoint is required in client config") } + client.SetEndpoints(cfg.Endpoints...) + // Use a provided endpoint target so that for https:// without any tls config given, then // grpc will assume the certificate server name is the endpoint host. conn, err := client.dialWithBalancer() @@ -442,7 +458,7 @@ func newClient(cfg *Config) (*Client, error) { client.Auth = NewAuth(client) client.Maintenance = NewMaintenance(client) - //get token with established connection + // get token with established connection ctx, cancel = client.ctx, func() {} if client.cfg.DialTimeout > 0 { ctx, cancel = context.WithTimeout(ctx, client.cfg.DialTimeout) @@ -451,7 +467,7 @@ func newClient(cfg *Config) (*Client, error) { if err != nil { client.Close() cancel() - //TODO: Consider fmt.Errorf("communicating with [%s] failed: %v", strings.Join(cfg.Endpoints, ";"), err) + // TODO: Consider fmt.Errorf("communicating with [%s] failed: %v", strings.Join(cfg.Endpoints, ";"), err) return nil, err } cancel() @@ -483,6 +499,22 @@ func (c *Client) roundRobinQuorumBackoff(waitBetween time.Duration, jitterFracti } } +// minSupportedVersion returns the minimum version supported, which is the previous minor release. +func minSupportedVersion() *semver.Version { + ver := semver.Must(semver.NewVersion(version.Version)) + // consider only major and minor version + ver = &semver.Version{Major: ver.Major, Minor: ver.Minor} + for i := range version.AllVersions { + if version.AllVersions[i].Equal(*ver) { + if i == 0 { + return ver + } + return &version.AllVersions[i-1] + } + } + panic("current version is not in the version list") +} + func (c *Client) checkVersion() (err error) { var wg sync.WaitGroup @@ -504,20 +536,13 @@ func (c *Client) checkVersion() (err error) { errc <- rerr return } - vs := strings.Split(resp.Version, ".") - maj, min := 0, 0 - if len(vs) >= 2 { - var serr error - if maj, serr = strconv.Atoi(vs[0]); serr != nil { - errc <- serr - return - } - if min, serr = strconv.Atoi(vs[1]); serr != nil { - errc <- serr - return - } + vs, serr := semver.NewVersion(resp.Version) + if serr != nil { + errc <- serr + return } - if maj < 3 || (maj == 3 && min < 4) { + + if vs.LessThan(*minSupportedVersion()) { rerr = ErrOldCluster } errc <- rerr @@ -580,7 +605,8 @@ func ContextError(ctx context.Context, err error) error { return nil } err = rpctypes.Error(err) - if _, ok := err.(rpctypes.EtcdError); ok { + var serverErr rpctypes.EtcdError + if errors.As(err, &serverErr) { return err } if ev, ok := status.FromError(err); ok { @@ -602,7 +628,7 @@ func canceledByCaller(stopCtx context.Context, err error) bool { return false } - return err == context.Canceled || err == context.DeadlineExceeded + return errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) } // IsConnCanceled returns true, if error is from a closed gRPC connection. @@ -620,7 +646,7 @@ func IsConnCanceled(err error) bool { } // >= gRPC v1.10.x - if err == context.Canceled { + if errors.Is(err, context.Canceled) { return true } diff --git a/vendor/go.etcd.io/etcd/client/v3/cluster.go b/vendor/go.etcd.io/etcd/client/v3/cluster.go index 1815c1c964..1b7e83375c 100644 --- a/vendor/go.etcd.io/etcd/client/v3/cluster.go +++ b/vendor/go.etcd.io/etcd/client/v3/cluster.go @@ -17,10 +17,10 @@ package clientv3 import ( "context" + "google.golang.org/grpc" + pb "go.etcd.io/etcd/api/v3/etcdserverpb" "go.etcd.io/etcd/client/pkg/v3/types" - - "google.golang.org/grpc" ) type ( @@ -34,7 +34,7 @@ type ( type Cluster interface { // MemberList lists the current cluster membership. - MemberList(ctx context.Context) (*MemberListResponse, error) + MemberList(ctx context.Context, opts ...OpOption) (*MemberListResponse, error) // MemberAdd adds a new member into the cluster. MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) @@ -122,9 +122,9 @@ func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []strin return nil, ContextError(ctx, err) } -func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) { - // it is safe to retry on list. - resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{Linearizable: true}, c.callOpts...) +func (c *cluster) MemberList(ctx context.Context, opts ...OpOption) (*MemberListResponse, error) { + opt := OpGet("", opts...) + resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{Linearizable: !opt.serializable}, c.callOpts...) if err == nil { return (*MemberListResponse)(resp), nil } diff --git a/vendor/go.etcd.io/etcd/client/v3/compare.go b/vendor/go.etcd.io/etcd/client/v3/compare.go index e2967cf38e..663fdb4d20 100644 --- a/vendor/go.etcd.io/etcd/client/v3/compare.go +++ b/vendor/go.etcd.io/etcd/client/v3/compare.go @@ -18,8 +18,10 @@ import ( pb "go.etcd.io/etcd/api/v3/etcdserverpb" ) -type CompareTarget int -type CompareResult int +type ( + CompareTarget int + CompareResult int +) const ( CompareVersion CompareTarget = iota @@ -30,7 +32,7 @@ const ( type Cmp pb.Compare -func Compare(cmp Cmp, result string, v interface{}) Cmp { +func Compare(cmp Cmp, result string, v any) Cmp { var r pb.Compare_CompareResult switch result { @@ -120,7 +122,7 @@ func (cmp Cmp) WithPrefix() Cmp { } // mustInt64 panics if val isn't an int or int64. It returns an int64 otherwise. -func mustInt64(val interface{}) int64 { +func mustInt64(val any) int64 { if v, ok := val.(int64); ok { return v } @@ -132,7 +134,7 @@ func mustInt64(val interface{}) int64 { // mustInt64orLeaseID panics if val isn't a LeaseID, int or int64. It returns an // int64 otherwise. -func mustInt64orLeaseID(val interface{}) int64 { +func mustInt64orLeaseID(val any) int64 { if v, ok := val.(LeaseID); ok { return int64(v) } diff --git a/vendor/go.etcd.io/etcd/client/v3/config.go b/vendor/go.etcd.io/etcd/client/v3/config.go index 6f5b41978d..8351828d2f 100644 --- a/vendor/go.etcd.io/etcd/client/v3/config.go +++ b/vendor/go.etcd.io/etcd/client/v3/config.go @@ -21,6 +21,8 @@ import ( "go.uber.org/zap" "google.golang.org/grpc" + + "go.etcd.io/etcd/client/pkg/v3/transport" ) type Config struct { @@ -52,7 +54,7 @@ type Config struct { // If 0, it defaults to "math.MaxInt32", because range response can // easily exceed request send limits. // Make sure that "MaxCallRecvMsgSize" >= server-side default send/recv limit. - // ("--max-request-bytes" flag to etcd or "embed.Config.MaxRequestBytes"). + // ("--max-recv-bytes" flag to etcd). MaxCallRecvMsgSize int // TLS holds the client secure credentials, if any. @@ -99,3 +101,128 @@ type Config struct { // TODO: support custom balancer picker } + +// ConfigSpec is the configuration from users, which comes from command-line flags, +// environment variables or config file. It is a fully declarative configuration, +// and can be serialized & deserialized to/from JSON. +type ConfigSpec struct { + Endpoints []string `json:"endpoints"` + RequestTimeout time.Duration `json:"request-timeout"` + DialTimeout time.Duration `json:"dial-timeout"` + KeepAliveTime time.Duration `json:"keepalive-time"` + KeepAliveTimeout time.Duration `json:"keepalive-timeout"` + MaxCallSendMsgSize int `json:"max-request-bytes"` + MaxCallRecvMsgSize int `json:"max-recv-bytes"` + Secure *SecureConfig `json:"secure"` + Auth *AuthConfig `json:"auth"` +} + +type SecureConfig struct { + Cert string `json:"cert"` + Key string `json:"key"` + Cacert string `json:"cacert"` + ServerName string `json:"server-name"` + + InsecureTransport bool `json:"insecure-transport"` + InsecureSkipVerify bool `json:"insecure-skip-tls-verify"` +} + +type AuthConfig struct { + Username string `json:"username"` + Password string `json:"password"` +} + +func (cs *ConfigSpec) Clone() *ConfigSpec { + if cs == nil { + return nil + } + + clone := *cs + + if len(cs.Endpoints) > 0 { + clone.Endpoints = make([]string, len(cs.Endpoints)) + copy(clone.Endpoints, cs.Endpoints) + } + + if cs.Secure != nil { + clone.Secure = &SecureConfig{} + *clone.Secure = *cs.Secure + } + if cs.Auth != nil { + clone.Auth = &AuthConfig{} + *clone.Auth = *cs.Auth + } + + return &clone +} + +func (cfg AuthConfig) Empty() bool { + return cfg.Username == "" && cfg.Password == "" +} + +// NewClientConfig creates a Config based on the provided ConfigSpec. +func NewClientConfig(confSpec *ConfigSpec, lg *zap.Logger) (*Config, error) { + tlsCfg, err := newTLSConfig(confSpec.Secure, lg) + if err != nil { + return nil, err + } + + cfg := &Config{ + Endpoints: confSpec.Endpoints, + DialTimeout: confSpec.DialTimeout, + DialKeepAliveTime: confSpec.KeepAliveTime, + DialKeepAliveTimeout: confSpec.KeepAliveTimeout, + MaxCallSendMsgSize: confSpec.MaxCallSendMsgSize, + MaxCallRecvMsgSize: confSpec.MaxCallRecvMsgSize, + TLS: tlsCfg, + } + + if confSpec.Auth != nil { + cfg.Username = confSpec.Auth.Username + cfg.Password = confSpec.Auth.Password + } + + return cfg, nil +} + +func newTLSConfig(scfg *SecureConfig, lg *zap.Logger) (*tls.Config, error) { + var ( + tlsCfg *tls.Config + err error + ) + + if scfg == nil { + return nil, nil + } + + if scfg.Cert != "" || scfg.Key != "" || scfg.Cacert != "" || scfg.ServerName != "" { + cfgtls := &transport.TLSInfo{ + CertFile: scfg.Cert, + KeyFile: scfg.Key, + TrustedCAFile: scfg.Cacert, + ServerName: scfg.ServerName, + Logger: lg, + } + if tlsCfg, err = cfgtls.ClientConfig(); err != nil { + return nil, err + } + } + + // If key/cert is not given but user wants secure connection, we + // should still setup an empty tls configuration for gRPC to setup + // secure connection. + if tlsCfg == nil && !scfg.InsecureTransport { + tlsCfg = &tls.Config{} + } + + // If the user wants to skip TLS verification then we should set + // the InsecureSkipVerify flag in tls configuration. + if scfg.InsecureSkipVerify { + if tlsCfg == nil { + tlsCfg = &tls.Config{} + } + tlsCfg.InsecureSkipVerify = scfg.InsecureSkipVerify + } + + return tlsCfg, nil +} diff --git a/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go b/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go index 42f688eb35..a2d8b45e86 100644 --- a/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go +++ b/vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go @@ -19,92 +19,51 @@ package credentials import ( "context" "crypto/tls" - "net" "sync" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" grpccredentials "google.golang.org/grpc/credentials" + + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) -// Config defines gRPC credential configuration. -type Config struct { - TLSConfig *tls.Config +func NewTransportCredential(cfg *tls.Config) grpccredentials.TransportCredentials { + return grpccredentials.NewTLS(cfg) } -// Bundle defines gRPC credential interface. -type Bundle interface { - grpccredentials.Bundle +// PerRPCCredentialsBundle defines gRPC credential interface. +type PerRPCCredentialsBundle interface { UpdateAuthToken(token string) + PerRPCCredentials() grpccredentials.PerRPCCredentials } -// NewBundle constructs a new gRPC credential bundle. -func NewBundle(cfg Config) Bundle { - return &bundle{ - tc: newTransportCredential(cfg.TLSConfig), - rc: newPerRPCCredential(), +func NewPerRPCCredentialBundle() PerRPCCredentialsBundle { + return &perRPCCredentialBundle{ + rc: &perRPCCredential{}, } } -// bundle implements "grpccredentials.Bundle" interface. -type bundle struct { - tc *transportCredential +// perRPCCredentialBundle implements `PerRPCCredentialsBundle` interface. +type perRPCCredentialBundle struct { rc *perRPCCredential } -func (b *bundle) TransportCredentials() grpccredentials.TransportCredentials { - return b.tc -} - -func (b *bundle) PerRPCCredentials() grpccredentials.PerRPCCredentials { - return b.rc -} - -func (b *bundle) NewWithMode(mode string) (grpccredentials.Bundle, error) { - // no-op - return nil, nil -} - -// transportCredential implements "grpccredentials.TransportCredentials" interface. -type transportCredential struct { - gtc grpccredentials.TransportCredentials -} - -func newTransportCredential(cfg *tls.Config) *transportCredential { - return &transportCredential{ - gtc: grpccredentials.NewTLS(cfg), - } -} - -func (tc *transportCredential) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (net.Conn, grpccredentials.AuthInfo, error) { - return tc.gtc.ClientHandshake(ctx, authority, rawConn) -} - -func (tc *transportCredential) ServerHandshake(rawConn net.Conn) (net.Conn, grpccredentials.AuthInfo, error) { - return tc.gtc.ServerHandshake(rawConn) -} - -func (tc *transportCredential) Info() grpccredentials.ProtocolInfo { - return tc.gtc.Info() -} - -func (tc *transportCredential) Clone() grpccredentials.TransportCredentials { - return &transportCredential{ - gtc: tc.gtc.Clone(), +func (b *perRPCCredentialBundle) UpdateAuthToken(token string) { + if b.rc == nil { + return } + b.rc.UpdateAuthToken(token) } -func (tc *transportCredential) OverrideServerName(serverNameOverride string) error { - return tc.gtc.OverrideServerName(serverNameOverride) +func (b *perRPCCredentialBundle) PerRPCCredentials() grpccredentials.PerRPCCredentials { + return b.rc } -// perRPCCredential implements "grpccredentials.PerRPCCredentials" interface. +// perRPCCredential implements `grpccredentials.PerRPCCredentials` interface. type perRPCCredential struct { authToken string authTokenMu sync.RWMutex } -func newPerRPCCredential() *perRPCCredential { return &perRPCCredential{} } - func (rc *perRPCCredential) RequireTransportSecurity() bool { return false } func (rc *perRPCCredential) GetRequestMetadata(ctx context.Context, s ...string) (map[string]string, error) { @@ -117,13 +76,6 @@ func (rc *perRPCCredential) GetRequestMetadata(ctx context.Context, s ...string) return map[string]string{rpctypes.TokenFieldNameGRPC: authToken}, nil } -func (b *bundle) UpdateAuthToken(token string) { - if b.rc == nil { - return - } - b.rc.UpdateAuthToken(token) -} - func (rc *perRPCCredential) UpdateAuthToken(token string) { rc.authTokenMu.Lock() rc.authToken = token diff --git a/vendor/go.etcd.io/etcd/client/v3/ctx.go b/vendor/go.etcd.io/etcd/client/v3/ctx.go index 56b69cf2ed..38cee6c27e 100644 --- a/vendor/go.etcd.io/etcd/client/v3/ctx.go +++ b/vendor/go.etcd.io/etcd/client/v3/ctx.go @@ -17,9 +17,10 @@ package clientv3 import ( "context" + "google.golang.org/grpc/metadata" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "go.etcd.io/etcd/api/v3/version" - "google.golang.org/grpc/metadata" ) // WithRequireLeader requires client requests to only succeed diff --git a/vendor/go.etcd.io/etcd/client/v3/doc.go b/vendor/go.etcd.io/etcd/client/v3/doc.go index fd61aff117..bd820d3d79 100644 --- a/vendor/go.etcd.io/etcd/client/v3/doc.go +++ b/vendor/go.etcd.io/etcd/client/v3/doc.go @@ -47,8 +47,8 @@ // To specify a client request timeout, wrap the context with context.WithTimeout: // // ctx, cancel := context.WithTimeout(context.Background(), timeout) +// defer cancel() // resp, err := kvc.Put(ctx, "sample_key", "sample_value") -// cancel() // if err != nil { // // handle error! // } @@ -61,8 +61,7 @@ // // 1. context error: canceled or deadline exceeded. // 2. gRPC error: e.g. when clock drifts in server-side before client's context deadline exceeded. -// -// See https://github.com/etcd-io/etcd/blob/main/api/v3rpc/rpctypes/error.go +// See https://github.com/etcd-io/etcd/blob/main/api/v3rpc/rpctypes/error.go // // Here is the example code to handle client errors: // diff --git a/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go b/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go index 35a3fe8c33..2c45b5e306 100644 --- a/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go +++ b/vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go @@ -25,12 +25,12 @@ import ( type CredsRequirement int const ( - // CREDS_REQUIRE - Credentials/certificate required for thi type of connection. - CREDS_REQUIRE CredsRequirement = iota - // CREDS_DROP - Credentials/certificate not needed and should get ignored. - CREDS_DROP - // CREDS_OPTIONAL - Credentials/certificate might be used if supplied - CREDS_OPTIONAL + // CredsRequire - Credentials/certificate required for thi type of connection. + CredsRequire CredsRequirement = iota + // CredsDrop - Credentials/certificate not needed and should get ignored. + CredsDrop + // CredsOptional - Credentials/certificate might be used if supplied + CredsOptional ) func extractHostFromHostPort(ep string) string { @@ -54,20 +54,20 @@ func mustSplit2(s, sep string) (string, string) { func schemeToCredsRequirement(schema string) CredsRequirement { switch schema { case "https", "unixs": - return CREDS_REQUIRE + return CredsRequire case "http": - return CREDS_DROP + return CredsDrop case "unix": // Preserving previous behavior from: // https://github.com/etcd-io/etcd/blob/dae29bb719dd69dc119146fc297a0628fcc1ccf8/client/v3/client.go#L212 // that likely was a bug due to missing 'fallthrough'. // At the same time it seems legit to let the users decide whether they // want credential control or not (and 'unixs' schema is not a standard thing). - return CREDS_OPTIONAL + return CredsOptional case "": - return CREDS_OPTIONAL + return CredsOptional default: - return CREDS_OPTIONAL + return CredsOptional } } @@ -106,7 +106,7 @@ func translateEndpoint(ep string) (addr string, serverName string, requireCreds if strings.Contains(ep, "://") { url, err := url.Parse(ep) if err != nil { - return ep, ep, CREDS_OPTIONAL + return ep, ep, CredsOptional } if url.Scheme == "http" || url.Scheme == "https" { return url.Host, url.Host, schemeToCredsRequirement(url.Scheme) @@ -114,7 +114,7 @@ func translateEndpoint(ep string) (addr string, serverName string, requireCreds return ep, url.Host, schemeToCredsRequirement(url.Scheme) } // Handles plain addresses like 10.0.0.44:437. - return ep, ep, CREDS_OPTIONAL + return ep, ep, CredsOptional } // RequiresCredentials returns whether given endpoint requires diff --git a/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go b/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go index 3ee3cb8e2b..403b745cb7 100644 --- a/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go +++ b/vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go @@ -15,10 +15,11 @@ package resolver import ( - "go.etcd.io/etcd/client/v3/internal/endpoint" "google.golang.org/grpc/resolver" "google.golang.org/grpc/resolver/manual" "google.golang.org/grpc/serviceconfig" + + "go.etcd.io/etcd/client/v3/internal/endpoint" ) const ( @@ -60,13 +61,15 @@ func (r *EtcdManualResolver) SetEndpoints(endpoints []string) { func (r EtcdManualResolver) updateState() { if r.CC != nil { - addresses := make([]resolver.Address, len(r.endpoints)) + eps := make([]resolver.Endpoint, len(r.endpoints)) for i, ep := range r.endpoints { addr, serverName := endpoint.Interpret(ep) - addresses[i] = resolver.Address{Addr: addr, ServerName: serverName} + eps[i] = resolver.Endpoint{Addresses: []resolver.Address{ + {Addr: addr, ServerName: serverName}, + }} } state := resolver.State{ - Addresses: addresses, + Endpoints: eps, ServiceConfig: r.serviceConfig, } r.UpdateState(state) diff --git a/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go b/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go index 19b82a6292..3ffecc86a5 100644 --- a/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go +++ b/vendor/go.etcd.io/etcd/client/v3/kubernetes/interface.go @@ -36,8 +36,9 @@ type Interface interface { // If opts.Revision is non-zero, the key-value pairs are retrieved at the specified revision. // If the required revision has been compacted, the request will fail with ErrCompacted. // If opts.Limit is greater than zero, the number of returned key-value pairs is bounded by the limit. - // If opts.Continue is not empty, the listing will start from the key immediately after the one specified by Continue. - // The Continue value should be the last key returned in a previous paginated ListResponse. + // If opts.Continue is not empty, the listing will start from the key + // specified by it. When paginating, the Continue value should be set + // to the last observed key with "\x00" appended to it. List(ctx context.Context, prefix string, opts ListOptions) (ListResponse, error) // Count returns the number of keys with the specified prefix. @@ -74,8 +75,9 @@ type ListOptions struct { // 0 means no limitation. Limit int64 - // Continue is a key from which to resume the List operation, excluding the given key. - // It should be set to the last key from a previous ListResponse when paginating. + // Continue is a key from which to resume the List operation. + // It should be set to the last key from a previous ListResponse + // with "\x00" appended to it when paginating. Continue string } diff --git a/vendor/go.etcd.io/etcd/client/v3/kv.go b/vendor/go.etcd.io/etcd/client/v3/kv.go index be5b508dd6..8d0c595d1e 100644 --- a/vendor/go.etcd.io/etcd/client/v3/kv.go +++ b/vendor/go.etcd.io/etcd/client/v3/kv.go @@ -17,9 +17,10 @@ package clientv3 import ( "context" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "google.golang.org/grpc" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) type ( @@ -79,12 +80,15 @@ func (op OpResponse) Txn() *TxnResponse { return op.txn } func (resp *PutResponse) OpResponse() OpResponse { return OpResponse{put: resp} } + func (resp *GetResponse) OpResponse() OpResponse { return OpResponse{get: resp} } + func (resp *DeleteResponse) OpResponse() OpResponse { return OpResponse{del: resp} } + func (resp *TxnResponse) OpResponse() OpResponse { return OpResponse{txn: resp} } @@ -145,10 +149,14 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) { var err error switch op.t { case tRange: - var resp *pb.RangeResponse - resp, err = kv.remote.Range(ctx, op.toRangeRequest(), kv.callOpts...) - if err == nil { - return OpResponse{get: (*GetResponse)(resp)}, nil + if op.IsSortOptionValid() { + var resp *pb.RangeResponse + resp, err = kv.remote.Range(ctx, op.toRangeRequest(), kv.callOpts...) + if err == nil { + return OpResponse{get: (*GetResponse)(resp)}, nil + } + } else { + err = rpctypes.ErrInvalidSortOption } case tPut: var resp *pb.PutResponse diff --git a/vendor/go.etcd.io/etcd/client/v3/lease.go b/vendor/go.etcd.io/etcd/client/v3/lease.go index 4877ee9496..11b5834828 100644 --- a/vendor/go.etcd.io/etcd/client/v3/lease.go +++ b/vendor/go.etcd.io/etcd/client/v3/lease.go @@ -16,15 +16,16 @@ package clientv3 import ( "context" + "errors" "sync" "time" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/metadata" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) type ( @@ -198,12 +199,12 @@ func NewLeaseFromLeaseClient(remote pb.LeaseClient, c *Client, keepAliveTimeout keepAlives: make(map[LeaseID]*keepAlive), remote: remote, firstKeepAliveTimeout: keepAliveTimeout, - lg: c.lg, } if l.firstKeepAliveTimeout == time.Second { l.firstKeepAliveTimeout = defaultTTL } if c != nil { + l.lg = c.lg l.callOpts = c.callOpts } reqLeaderCtx := WithRequireLeader(context.Background()) @@ -419,9 +420,9 @@ func (l *lessor) keepAliveOnce(ctx context.Context, id LeaseID) (karesp *LeaseKe } defer func() { - if err := stream.CloseSend(); err != nil { + if cerr := stream.CloseSend(); cerr != nil { if ferr == nil { - ferr = ContextError(ctx, err) + ferr = ContextError(ctx, cerr) } return } @@ -460,6 +461,9 @@ func (l *lessor) recvKeepAliveLoop() (gerr error) { for { stream, err := l.resetRecv() if err != nil { + l.lg.Warn("error occurred during lease keep alive loop", + zap.Error(err), + ) if canceledByCaller(l.stopCtx, err) { return err } @@ -471,7 +475,7 @@ func (l *lessor) recvKeepAliveLoop() (gerr error) { return err } - if ContextError(l.stopCtx, err) == rpctypes.ErrNoLeader { + if errors.Is(ContextError(l.stopCtx, err), rpctypes.ErrNoLeader) { l.closeRequireLeader() } break @@ -556,9 +560,12 @@ func (l *lessor) recvKeepAlive(resp *pb.LeaseKeepAliveResponse) { // deadlineLoop reaps any keep alive channels that have not received a response // within the lease TTL func (l *lessor) deadlineLoop() { + timer := time.NewTimer(time.Second) + defer timer.Stop() for { + timer.Reset(time.Second) select { - case <-time.After(time.Second): + case <-timer.C: case <-l.donec: return } @@ -592,7 +599,9 @@ func (l *lessor) sendKeepAliveLoop(stream pb.Lease_LeaseKeepAliveClient) { for _, id := range tosend { r := &pb.LeaseKeepAliveRequest{ID: int64(id)} if err := stream.Send(r); err != nil { - // TODO do something with this error? + l.lg.Warn("error occurred during lease keep alive request sending", + zap.Error(err), + ) return } } diff --git a/vendor/go.etcd.io/etcd/client/v3/logger.go b/vendor/go.etcd.io/etcd/client/v3/logger.go index eaa35f2d3a..300363cd25 100644 --- a/vendor/go.etcd.io/etcd/client/v3/logger.go +++ b/vendor/go.etcd.io/etcd/client/v3/logger.go @@ -18,10 +18,11 @@ import ( "log" "os" - "go.etcd.io/etcd/client/pkg/v3/logutil" "go.uber.org/zap/zapcore" "go.uber.org/zap/zapgrpc" "google.golang.org/grpc/grpclog" + + "go.etcd.io/etcd/client/pkg/v3/logutil" ) func init() { @@ -52,7 +53,7 @@ func etcdClientDebugLevel() zapcore.Level { } var l zapcore.Level if err := l.Set(envLevel); err != nil { - log.Printf("Invalid value for environment variable 'ETCD_CLIENT_DEBUG'. Using default level: 'info'") + log.Print("Invalid value for environment variable 'ETCD_CLIENT_DEBUG'. Using default level: 'info'") return zapcore.InfoLevel } return l diff --git a/vendor/go.etcd.io/etcd/client/v3/maintenance.go b/vendor/go.etcd.io/etcd/client/v3/maintenance.go index 71b28e6dc3..00aaacd15f 100644 --- a/vendor/go.etcd.io/etcd/client/v3/maintenance.go +++ b/vendor/go.etcd.io/etcd/client/v3/maintenance.go @@ -16,12 +16,14 @@ package clientv3 import ( "context" + "errors" "fmt" "io" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" "go.uber.org/zap" "google.golang.org/grpc" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" ) type ( @@ -31,6 +33,15 @@ type ( StatusResponse pb.StatusResponse HashKVResponse pb.HashKVResponse MoveLeaderResponse pb.MoveLeaderResponse + DowngradeResponse pb.DowngradeResponse + + DowngradeAction pb.DowngradeRequest_DowngradeAction +) + +const ( + DowngradeValidate = DowngradeAction(pb.DowngradeRequest_VALIDATE) + DowngradeEnable = DowngradeAction(pb.DowngradeRequest_ENABLE) + DowngradeCancel = DowngradeAction(pb.DowngradeRequest_CANCEL) ) type Maintenance interface { @@ -57,14 +68,40 @@ type Maintenance interface { // is non-zero, the hash is computed on all keys at or below the given revision. HashKV(ctx context.Context, endpoint string, rev int64) (*HashKVResponse, error) + // SnapshotWithVersion returns a reader for a point-in-time snapshot and version of etcd that created it. + // If the context "ctx" is canceled or timed out, reading from returned + // "io.ReadCloser" would error out (e.g. context.Canceled, context.DeadlineExceeded). + SnapshotWithVersion(ctx context.Context) (*SnapshotResponse, error) + // Snapshot provides a reader for a point-in-time snapshot of etcd. // If the context "ctx" is canceled or timed out, reading from returned // "io.ReadCloser" would error out (e.g. context.Canceled, context.DeadlineExceeded). + // Deprecated: use SnapshotWithVersion instead. Snapshot(ctx context.Context) (io.ReadCloser, error) // MoveLeader requests current leader to transfer its leadership to the transferee. // Request must be made to the leader. MoveLeader(ctx context.Context, transfereeID uint64) (*MoveLeaderResponse, error) + + // Downgrade requests downgrades, verifies feasibility or cancels downgrade + // on the cluster version. + // Supported since etcd 3.5. + Downgrade(ctx context.Context, action DowngradeAction, version string) (*DowngradeResponse, error) +} + +// SnapshotResponse is aggregated response from the snapshot stream. +// Consumer is responsible for closing steam by calling .Snapshot.Close() +type SnapshotResponse struct { + // Header is the first header in the snapshot stream, has the current key-value store information + // and indicates the point in time of the snapshot. + Header *pb.ResponseHeader + // Snapshot exposes ReaderCloser interface for data stored in the Blob field in the snapshot stream. + Snapshot io.ReadCloser + // Version is the local version of server that created the snapshot. + // In cluster with binaries with different version, each cluster can return different result. + // Informs which etcd server version should be used when restoring the snapshot. + // Supported on etcd >= v3.6. + Version string } type maintenance struct { @@ -80,22 +117,10 @@ func NewMaintenance(c *Client) Maintenance { dial: func(endpoint string) (pb.MaintenanceClient, func(), error) { conn, err := c.Dial(endpoint) if err != nil { - return nil, nil, fmt.Errorf("failed to dial endpoint %s with maintenance client: %v", endpoint, err) + return nil, nil, fmt.Errorf("failed to dial endpoint %s with maintenance client: %w", endpoint, err) } - //get token with established connection - dctx := c.ctx - cancel := func() {} - if c.cfg.DialTimeout > 0 { - dctx, cancel = context.WithTimeout(c.ctx, c.cfg.DialTimeout) - } - err = c.getToken(dctx) - cancel() - if err != nil { - conn.Close() - return nil, nil, fmt.Errorf("failed to getToken from endpoint %s with maintenance client: %v", endpoint, err) - } - cancel = func() { conn.Close() } + cancel := func() { conn.Close() } return RetryMaintenanceClient(c, conn), cancel, nil }, remote: RetryMaintenanceClient(c, c.conn), @@ -108,7 +133,6 @@ func NewMaintenance(c *Client) Maintenance { func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient, c *Client) Maintenance { api := &maintenance{ - lg: c.lg, dial: func(string) (pb.MaintenanceClient, func(), error) { return remote, func() {}, nil }, @@ -116,6 +140,7 @@ func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient, c *Client) } if c != nil { api.callOpts = c.callOpts + api.lg = c.lg } return api } @@ -192,7 +217,6 @@ func (m *maintenance) Status(ctx context.Context, endpoint string) (*StatusRespo func (m *maintenance) HashKV(ctx context.Context, endpoint string, rev int64) (*HashKVResponse, error) { remote, cancel, err := m.dial(endpoint) if err != nil { - return nil, ContextError(ctx, err) } defer cancel() @@ -203,7 +227,7 @@ func (m *maintenance) HashKV(ctx context.Context, endpoint string, rev int64) (* return (*HashKVResponse)(resp), nil } -func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { +func (m *maintenance) SnapshotWithVersion(ctx context.Context) (*SnapshotResponse, error) { ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{}, append(m.callOpts, withMax(defaultStreamMaxRetries))...) if err != nil { return nil, ContextError(ctx, err) @@ -211,27 +235,60 @@ func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { m.lg.Info("opened snapshot stream; downloading") pr, pw := io.Pipe() + + resp, err := ss.Recv() + if err != nil { + m.logAndCloseWithError(err, pw) + return nil, err + } go func() { + // Saving response is blocking + err := m.save(resp, pw) + if err != nil { + m.logAndCloseWithError(err, pw) + return + } for { - resp, err := ss.Recv() + sresp, err := ss.Recv() if err != nil { - switch err { - case io.EOF: - m.lg.Info("completed snapshot read; closing") - default: - m.lg.Warn("failed to receive from snapshot stream; closing", zap.Error(err)) - } - pw.CloseWithError(err) + m.logAndCloseWithError(err, pw) return } - // can "resp == nil && err == nil" - // before we receive snapshot SHA digest? - // No, server sends EOF with an empty response - // after it sends SHA digest at the end + err = m.save(sresp, pw) + if err != nil { + m.logAndCloseWithError(err, pw) + return + } + } + }() - if _, werr := pw.Write(resp.Blob); werr != nil { - pw.CloseWithError(werr) + return &SnapshotResponse{ + Header: resp.GetHeader(), + Snapshot: &snapshotReadCloser{ctx: ctx, ReadCloser: pr}, + Version: resp.GetVersion(), + }, nil +} + +func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { + ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{}, append(m.callOpts, withMax(defaultStreamMaxRetries))...) + if err != nil { + return nil, ContextError(ctx, err) + } + + m.lg.Info("opened snapshot stream; downloading") + pr, pw := io.Pipe() + + go func() { + for { + resp, err := ss.Recv() + if err != nil { + m.logAndCloseWithError(err, pw) + return + } + err = m.save(resp, pw) + if err != nil { + m.logAndCloseWithError(err, pw) return } } @@ -239,6 +296,28 @@ func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) { return &snapshotReadCloser{ctx: ctx, ReadCloser: pr}, nil } +func (m *maintenance) logAndCloseWithError(err error, pw *io.PipeWriter) { + switch { + case errors.Is(err, io.EOF): + m.lg.Info("completed snapshot read; closing") + default: + m.lg.Warn("failed to receive from snapshot stream; closing", zap.Error(err)) + } + pw.CloseWithError(err) +} + +func (m *maintenance) save(resp *pb.SnapshotResponse, pw *io.PipeWriter) error { + // can "resp == nil && err == nil" + // before we receive snapshot SHA digest? + // No, server sends EOF with an empty response + // after it sends SHA digest at the end + + if _, werr := pw.Write(resp.Blob); werr != nil { + return werr + } + return nil +} + type snapshotReadCloser struct { ctx context.Context io.ReadCloser @@ -253,3 +332,19 @@ func (m *maintenance) MoveLeader(ctx context.Context, transfereeID uint64) (*Mov resp, err := m.remote.MoveLeader(ctx, &pb.MoveLeaderRequest{TargetID: transfereeID}, m.callOpts...) return (*MoveLeaderResponse)(resp), ContextError(ctx, err) } + +func (m *maintenance) Downgrade(ctx context.Context, action DowngradeAction, version string) (*DowngradeResponse, error) { + var actionType pb.DowngradeRequest_DowngradeAction + switch action { + case DowngradeValidate: + actionType = pb.DowngradeRequest_VALIDATE + case DowngradeEnable: + actionType = pb.DowngradeRequest_ENABLE + case DowngradeCancel: + actionType = pb.DowngradeRequest_CANCEL + default: + return nil, errors.New("etcdclient: unknown downgrade action") + } + resp, err := m.remote.Downgrade(ctx, &pb.DowngradeRequest{Action: actionType, Version: version}, m.callOpts...) + return (*DowngradeResponse)(resp), ContextError(ctx, err) +} diff --git a/vendor/go.etcd.io/etcd/client/v3/op.go b/vendor/go.etcd.io/etcd/client/v3/op.go index 5251906322..20cb34f5c3 100644 --- a/vendor/go.etcd.io/etcd/client/v3/op.go +++ b/vendor/go.etcd.io/etcd/client/v3/op.go @@ -106,6 +106,9 @@ func (op Op) RangeBytes() []byte { return op.end } // Rev returns the requested revision, if any. func (op Op) Rev() int64 { return op.rev } +// Limit returns limit of the result, if any. +func (op Op) Limit() int64 { return op.limit } + // IsPut returns true iff the operation is a Put. func (op Op) IsPut() bool { return op.t == tPut } @@ -124,6 +127,10 @@ func (op Op) IsKeysOnly() bool { return op.keysOnly } // IsCountOnly returns whether countOnly is set. func (op Op) IsCountOnly() bool { return op.countOnly } +func (op Op) IsOptsWithFromKey() bool { return op.isOptsWithFromKey } + +func (op Op) IsOptsWithPrefix() bool { return op.isOptsWithPrefix } + // MinModRev returns the operation's minimum modify revision. func (op Op) MinModRev() int64 { return op.minModRev } @@ -418,9 +425,15 @@ func WithFromKey() OpOption { } } -// WithSerializable makes 'Get' request serializable. By default, -// it's linearizable. Serializable requests are better for lower latency -// requirement. +// WithSerializable makes `Get` and `MemberList` requests serializable. +// By default, they are linearizable. Serializable requests are better +// for lower latency requirement, but users should be aware that they +// could get stale data with serializable requests. +// +// In some situations users may want to use serializable requests. For +// example, when adding a new member to a one-node cluster, it's reasonable +// and safe to use serializable request before the new added member gets +// started. func WithSerializable() OpOption { return func(op *Op) { op.serializable = true } } @@ -581,3 +594,19 @@ func IsOptsWithFromKey(opts []OpOption) bool { return ret.isOptsWithFromKey } + +func (op Op) IsSortOptionValid() bool { + if op.sort != nil { + sortOrder := int32(op.sort.Order) + sortTarget := int32(op.sort.Target) + + if _, ok := pb.RangeRequest_SortOrder_name[sortOrder]; !ok { + return false + } + + if _, ok := pb.RangeRequest_SortTarget_name[sortTarget]; !ok { + return false + } + } + return true +} diff --git a/vendor/go.etcd.io/etcd/client/v3/options.go b/vendor/go.etcd.io/etcd/client/v3/options.go index cdae1b16a2..cc10a03d76 100644 --- a/vendor/go.etcd.io/etcd/client/v3/options.go +++ b/vendor/go.etcd.io/etcd/client/v3/options.go @@ -23,7 +23,7 @@ import ( var ( // client-side handling retrying of request failures where data was not written to the wire or - // where server indicates it did not process the data. gRPC default is default is "WaitForReady(false)" + // where server indicates it did not process the data. gRPC default is "WaitForReady(false)" // but for etcd we default to "WaitForReady(true)" to minimize client request error responses due to // transient failures. defaultWaitForReady = grpc.WaitForReady(true) diff --git a/vendor/go.etcd.io/etcd/client/v3/retry.go b/vendor/go.etcd.io/etcd/client/v3/retry.go index 69ecc63147..9152c53a7d 100644 --- a/vendor/go.etcd.io/etcd/client/v3/retry.go +++ b/vendor/go.etcd.io/etcd/client/v3/retry.go @@ -16,13 +16,14 @@ package clientv3 import ( "context" - - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" + "errors" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) type retryPolicy uint8 @@ -52,7 +53,8 @@ func (rp retryPolicy) String() string { // handle itself even with retries. func isSafeRetryImmutableRPC(err error) bool { eErr := rpctypes.Error(err) - if serverErr, ok := eErr.(rpctypes.EtcdError); ok && serverErr.Code() != codes.Unavailable { + var serverErr rpctypes.EtcdError + if errors.As(eErr, &serverErr) && serverErr.Code() != codes.Unavailable { // interrupted by non-transient server-side or gRPC-side error // client cannot handle itself (e.g. rpctypes.ErrCompacted) return false @@ -101,8 +103,9 @@ func RetryKVClient(c *Client) pb.KVClient { kc: pb.NewKVClient(c.conn), } } + func (rkv *retryKVClient) Range(ctx context.Context, in *pb.RangeRequest, opts ...grpc.CallOption) (resp *pb.RangeResponse, err error) { - return rkv.kc.Range(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rkv.kc.Range(ctx, in, append(opts, withRepeatablePolicy())...) } func (rkv *retryKVClient) Put(ctx context.Context, in *pb.PutRequest, opts ...grpc.CallOption) (resp *pb.PutResponse, err error) { @@ -133,23 +136,23 @@ func RetryLeaseClient(c *Client) pb.LeaseClient { } func (rlc *retryLeaseClient) LeaseTimeToLive(ctx context.Context, in *pb.LeaseTimeToLiveRequest, opts ...grpc.CallOption) (resp *pb.LeaseTimeToLiveResponse, err error) { - return rlc.lc.LeaseTimeToLive(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseTimeToLive(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseLeases(ctx context.Context, in *pb.LeaseLeasesRequest, opts ...grpc.CallOption) (resp *pb.LeaseLeasesResponse, err error) { - return rlc.lc.LeaseLeases(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseLeases(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseGrant(ctx context.Context, in *pb.LeaseGrantRequest, opts ...grpc.CallOption) (resp *pb.LeaseGrantResponse, err error) { - return rlc.lc.LeaseGrant(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseGrant(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseRevoke(ctx context.Context, in *pb.LeaseRevokeRequest, opts ...grpc.CallOption) (resp *pb.LeaseRevokeResponse, err error) { - return rlc.lc.LeaseRevoke(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseRevoke(ctx, in, append(opts, withRepeatablePolicy())...) } func (rlc *retryLeaseClient) LeaseKeepAlive(ctx context.Context, opts ...grpc.CallOption) (stream pb.Lease_LeaseKeepAliveClient, err error) { - return rlc.lc.LeaseKeepAlive(ctx, append(opts, withRetryPolicy(repeatable))...) + return rlc.lc.LeaseKeepAlive(ctx, append(opts, withRepeatablePolicy())...) } type retryClusterClient struct { @@ -164,7 +167,7 @@ func RetryClusterClient(c *Client) pb.ClusterClient { } func (rcc *retryClusterClient) MemberList(ctx context.Context, in *pb.MemberListRequest, opts ...grpc.CallOption) (resp *pb.MemberListResponse, err error) { - return rcc.cc.MemberList(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rcc.cc.MemberList(ctx, in, append(opts, withRepeatablePolicy())...) } func (rcc *retryClusterClient) MemberAdd(ctx context.Context, in *pb.MemberAddRequest, opts ...grpc.CallOption) (resp *pb.MemberAddResponse, err error) { @@ -195,27 +198,27 @@ func RetryMaintenanceClient(c *Client, conn *grpc.ClientConn) pb.MaintenanceClie } func (rmc *retryMaintenanceClient) Alarm(ctx context.Context, in *pb.AlarmRequest, opts ...grpc.CallOption) (resp *pb.AlarmResponse, err error) { - return rmc.mc.Alarm(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Alarm(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Status(ctx context.Context, in *pb.StatusRequest, opts ...grpc.CallOption) (resp *pb.StatusResponse, err error) { - return rmc.mc.Status(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Status(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Hash(ctx context.Context, in *pb.HashRequest, opts ...grpc.CallOption) (resp *pb.HashResponse, err error) { - return rmc.mc.Hash(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Hash(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) HashKV(ctx context.Context, in *pb.HashKVRequest, opts ...grpc.CallOption) (resp *pb.HashKVResponse, err error) { - return rmc.mc.HashKV(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.HashKV(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Snapshot(ctx context.Context, in *pb.SnapshotRequest, opts ...grpc.CallOption) (stream pb.Maintenance_SnapshotClient, err error) { - return rmc.mc.Snapshot(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.Snapshot(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) MoveLeader(ctx context.Context, in *pb.MoveLeaderRequest, opts ...grpc.CallOption) (resp *pb.MoveLeaderResponse, err error) { - return rmc.mc.MoveLeader(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rmc.mc.MoveLeader(ctx, in, append(opts, withRepeatablePolicy())...) } func (rmc *retryMaintenanceClient) Defragment(ctx context.Context, in *pb.DefragmentRequest, opts ...grpc.CallOption) (resp *pb.DefragmentResponse, err error) { @@ -238,19 +241,19 @@ func RetryAuthClient(c *Client) pb.AuthClient { } func (rac *retryAuthClient) UserList(ctx context.Context, in *pb.AuthUserListRequest, opts ...grpc.CallOption) (resp *pb.AuthUserListResponse, err error) { - return rac.ac.UserList(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.UserList(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) UserGet(ctx context.Context, in *pb.AuthUserGetRequest, opts ...grpc.CallOption) (resp *pb.AuthUserGetResponse, err error) { - return rac.ac.UserGet(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.UserGet(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) RoleGet(ctx context.Context, in *pb.AuthRoleGetRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleGetResponse, err error) { - return rac.ac.RoleGet(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.RoleGet(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) RoleList(ctx context.Context, in *pb.AuthRoleListRequest, opts ...grpc.CallOption) (resp *pb.AuthRoleListResponse, err error) { - return rac.ac.RoleList(ctx, in, append(opts, withRetryPolicy(repeatable))...) + return rac.ac.RoleList(ctx, in, append(opts, withRepeatablePolicy())...) } func (rac *retryAuthClient) AuthEnable(ctx context.Context, in *pb.AuthEnableRequest, opts ...grpc.CallOption) (resp *pb.AuthEnableResponse, err error) { diff --git a/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go b/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go index 8c50dcfa93..2b9301a580 100644 --- a/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go +++ b/vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go @@ -24,12 +24,13 @@ import ( "sync" "time" - "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + + "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) // unaryClientInterceptor returns a new retrying unary client interceptor. @@ -38,7 +39,7 @@ import ( // changed through options (e.g. WithMax) on creation of the interceptor or on call (through grpc.CallOptions). func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClientInterceptor { intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs) - return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { ctx = withVersion(ctx) grpcOpts, retryOpts := filterCallOptions(opts) callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts) @@ -54,6 +55,7 @@ func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClien c.GetLogger().Debug( "retrying of unary invoker", zap.String("target", cc.Target()), + zap.String("method", method), zap.Uint("attempt", attempt), ) lastErr = invoker(ctx, method, req, reply, cc, grpcOpts...) @@ -63,6 +65,7 @@ func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClien c.GetLogger().Warn( "retrying of unary invoker failed", zap.String("target", cc.Target()), + zap.String("method", method), zap.Uint("attempt", attempt), zap.Error(lastErr), ) @@ -75,14 +78,14 @@ func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClien continue } if c.shouldRefreshToken(lastErr, callOpts) { - gterr := c.refreshToken(ctx) - if gterr != nil { + gtErr := c.refreshToken(ctx) + if gtErr != nil { c.GetLogger().Warn( "retrying of unary invoker failed to fetch new auth token", zap.String("target", cc.Target()), - zap.Error(gterr), + zap.Error(gtErr), ) - return gterr // lastErr must be invalid auth token + return gtErr // lastErr must be invalid auth token } continue } @@ -106,15 +109,12 @@ func (c *Client) streamClientInterceptor(optFuncs ...retryOption) grpc.StreamCli intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs) return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { ctx = withVersion(ctx) - // getToken automatically - // TODO(cfc4n): keep this code block, remove codes about getToken in client.go after pr #12165 merged. - if c.authTokenBundle != nil { - // equal to c.Username != "" && c.Password != "" - err := c.getToken(ctx) - if err != nil && rpctypes.Error(err) != rpctypes.ErrAuthNotEnabled { - c.GetLogger().Error("clientv3/retry_interceptor: getToken failed", zap.Error(err)) - return nil, err - } + // getToken automatically. Otherwise, auth token may be invalid after watch reconnection because the token has expired + // (see https://github.com/etcd-io/etcd/issues/11954 for more). + err := c.getToken(ctx) + if err != nil { + c.GetLogger().Error("clientv3/retry_interceptor: getToken failed", zap.Error(err)) + return nil, err } grpcOpts, retryOpts := filterCallOptions(opts) callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts) @@ -146,14 +146,14 @@ func (c *Client) streamClientInterceptor(optFuncs ...retryOption) grpc.StreamCli // shouldRefreshToken checks whether there's a need to refresh the token based on the error and callOptions, // and returns a boolean value. func (c *Client) shouldRefreshToken(err error, callOpts *options) bool { - if rpctypes.Error(err) == rpctypes.ErrUserEmpty { + if errors.Is(rpctypes.Error(err), rpctypes.ErrUserEmpty) { // refresh the token when username, password is present but the server returns ErrUserEmpty // which is possible when the client token is cleared somehow return c.authTokenBundle != nil // equal to c.Username != "" && c.Password != "" } return callOpts.retryAuth && - (rpctypes.Error(err) == rpctypes.ErrInvalidAuthToken || rpctypes.Error(err) == rpctypes.ErrAuthOldRevision) + (errors.Is(rpctypes.Error(err), rpctypes.ErrInvalidAuthToken) || errors.Is(rpctypes.Error(err), rpctypes.ErrAuthOldRevision)) } func (c *Client) refreshToken(ctx context.Context) error { @@ -169,8 +169,7 @@ func (c *Client) refreshToken(ctx context.Context) error { // clients just need to retry the operations (e.g. Put, Delete etc). return nil } - // clear auth token before refreshing it. - c.authTokenBundle.UpdateAuthToken("") + return c.getToken(ctx) } @@ -180,9 +179,9 @@ func (c *Client) refreshToken(ctx context.Context) error { type serverStreamingRetryingStream struct { grpc.ClientStream client *Client - bufferedSends []interface{} // single message that the client can sen - receivedGood bool // indicates whether any prior receives were successful - wasClosedSend bool // indicates that CloseSend was closed + bufferedSends []any // single message that the client can sen + receivedGood bool // indicates whether any prior receives were successful + wasClosedSend bool // indicates that CloseSend was closed ctx context.Context callOpts *options streamerCall func(ctx context.Context) (grpc.ClientStream, error) @@ -201,7 +200,7 @@ func (s *serverStreamingRetryingStream) getStream() grpc.ClientStream { return s.ClientStream } -func (s *serverStreamingRetryingStream) SendMsg(m interface{}) error { +func (s *serverStreamingRetryingStream) SendMsg(m any) error { s.mu.Lock() s.bufferedSends = append(s.bufferedSends, m) s.mu.Unlock() @@ -223,7 +222,7 @@ func (s *serverStreamingRetryingStream) Trailer() metadata.MD { return s.getStream().Trailer() } -func (s *serverStreamingRetryingStream) RecvMsg(m interface{}) error { +func (s *serverStreamingRetryingStream) RecvMsg(m any) error { attemptRetry, lastErr := s.receiveMsgAndIndicateRetry(m) if !attemptRetry { return lastErr // success or hard failure @@ -250,12 +249,12 @@ func (s *serverStreamingRetryingStream) RecvMsg(m interface{}) error { return lastErr } -func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m interface{}) (bool, error) { +func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m any) (bool, error) { s.mu.RLock() wasGood := s.receivedGood s.mu.RUnlock() err := s.getStream().RecvMsg(m) - if err == nil || err == io.EOF { + if err == nil || errors.Is(err, io.EOF) { s.mu.Lock() s.receivedGood = true s.mu.Unlock() @@ -272,13 +271,12 @@ func (s *serverStreamingRetryingStream) receiveMsgAndIndicateRetry(m interface{} return true, err } if s.client.shouldRefreshToken(err, s.callOpts) { - gterr := s.client.refreshToken(s.ctx) - if gterr != nil { - s.client.lg.Warn("retry failed to fetch new auth token", zap.Error(gterr)) + gtErr := s.client.refreshToken(s.ctx) + if gtErr != nil { + s.client.lg.Warn("retry failed to fetch new auth token", zap.Error(gtErr)) return false, err // return the original error for simplicity } return true, err - } return isSafeRetry(s.client, err, s.callOpts), err } @@ -312,7 +310,7 @@ func waitRetryBackoff(ctx context.Context, attempt uint, callOpts *options) erro select { case <-ctx.Done(): timer.Stop() - return contextErrToGrpcErr(ctx.Err()) + return contextErrToGRPCErr(ctx.Err()) case <-timer.C: } } @@ -331,7 +329,7 @@ func isSafeRetry(c *Client, err error, callOpts *options) bool { // customer provides mix of learners (not yet voters) and voters with an // expectation to pick voter in the next attempt. // TODO: Ideally client should be 'aware' which endpoint represents: leader/voter/learner with high probability. - if errors.Is(err, rpctypes.ErrGPRCNotSupportedForLearner) && len(c.Endpoints()) > 1 { + if errors.Is(err, rpctypes.ErrGRPCNotSupportedForLearner) && len(c.Endpoints()) > 1 { return true } @@ -350,25 +348,23 @@ func isContextError(err error) bool { return status.Code(err) == codes.DeadlineExceeded || status.Code(err) == codes.Canceled } -func contextErrToGrpcErr(err error) error { - switch err { - case context.DeadlineExceeded: +func contextErrToGRPCErr(err error) error { + switch { + case errors.Is(err, context.DeadlineExceeded): return status.Errorf(codes.DeadlineExceeded, err.Error()) - case context.Canceled: + case errors.Is(err, context.Canceled): return status.Errorf(codes.Canceled, err.Error()) default: return status.Errorf(codes.Unknown, err.Error()) } } -var ( - defaultOptions = &options{ - retryPolicy: nonRepeatable, - max: 0, // disable - backoffFunc: backoffLinearWithJitter(50*time.Millisecond /*jitter*/, 0.10), - retryAuth: true, - } -) +var defaultOptions = &options{ + retryPolicy: nonRepeatable, + max: 0, // disable + backoffFunc: backoffLinearWithJitter(50*time.Millisecond /*jitter*/, 0.10), + retryAuth: true, +} // backoffFunc denotes a family of functions that control the backoff duration between call retries. // @@ -378,10 +374,10 @@ var ( // with the next iteration. type backoffFunc func(attempt uint) time.Duration -// withRetryPolicy sets the retry policy of this call. -func withRetryPolicy(rp retryPolicy) retryOption { +// withRepeatablePolicy sets the repeatable policy of this call. +func withRepeatablePolicy() retryOption { return retryOption{applyFunc: func(o *options) { - o.retryPolicy = rp + o.retryPolicy = repeatable }} } @@ -392,7 +388,7 @@ func withMax(maxRetries uint) retryOption { }} } -// WithBackoff sets the `BackoffFunc `used to control time between retries. +// WithBackoff sets the `BackoffFunc` used to control time between retries. func withBackoff(bf backoffFunc) retryOption { return retryOption{applyFunc: func(o *options) { o.backoffFunc = bf diff --git a/vendor/go.etcd.io/etcd/client/v3/sort.go b/vendor/go.etcd.io/etcd/client/v3/sort.go index 2bb9d9a13b..9918ea927f 100644 --- a/vendor/go.etcd.io/etcd/client/v3/sort.go +++ b/vendor/go.etcd.io/etcd/client/v3/sort.go @@ -14,8 +14,10 @@ package clientv3 -type SortTarget int -type SortOrder int +type ( + SortTarget int + SortOrder int +) const ( SortNone SortOrder = iota diff --git a/vendor/go.etcd.io/etcd/client/v3/txn.go b/vendor/go.etcd.io/etcd/client/v3/txn.go index e31bfe0b94..0a57332ac7 100644 --- a/vendor/go.etcd.io/etcd/client/v3/txn.go +++ b/vendor/go.etcd.io/etcd/client/v3/txn.go @@ -18,9 +18,9 @@ import ( "context" "sync" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "google.golang.org/grpc" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" ) // Txn is the interface that wraps mini-transactions. diff --git a/vendor/go.etcd.io/etcd/client/v3/watch.go b/vendor/go.etcd.io/etcd/client/v3/watch.go index 725e8a869e..a46f98b8e2 100644 --- a/vendor/go.etcd.io/etcd/client/v3/watch.go +++ b/vendor/go.etcd.io/etcd/client/v3/watch.go @@ -21,15 +21,15 @@ import ( "sync" "time" - pb "go.etcd.io/etcd/api/v3/etcdserverpb" - "go.etcd.io/etcd/api/v3/mvccpb" - v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" - "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + + pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/mvccpb" + v3rpc "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" ) const ( @@ -149,12 +149,12 @@ type watcher struct { mu sync.Mutex // streams holds all the active grpc streams keyed by ctx value. - streams map[string]*watchGrpcStream + streams map[string]*watchGRPCStream lg *zap.Logger } -// watchGrpcStream tracks all watch resources attached to a single grpc stream. -type watchGrpcStream struct { +// watchGRPCStream tracks all watch resources attached to a single grpc stream. +type watchGRPCStream struct { owner *watcher remote pb.WatchClient callOpts []grpc.CallOption @@ -221,8 +221,7 @@ type watchRequest struct { } // progressRequest is issued by the subscriber to request watch progress -type progressRequest struct { -} +type progressRequest struct{} // watcherStream represents a registered watcher type watcherStream struct { @@ -251,7 +250,7 @@ func NewWatcher(c *Client) Watcher { func NewWatchFromWatchClient(wc pb.WatchClient, c *Client) Watcher { w := &watcher{ remote: wc, - streams: make(map[string]*watchGrpcStream), + streams: make(map[string]*watchGRPCStream), } if c != nil { w.callOpts = c.callOpts @@ -261,8 +260,10 @@ func NewWatchFromWatchClient(wc pb.WatchClient, c *Client) Watcher { } // never closes -var valCtxCh = make(chan struct{}) -var zeroTime = time.Unix(0, 0) +var ( + valCtxCh = make(chan struct{}) + zeroTime = time.Unix(0, 0) +) // ctx with only the values; never Done type valCtx struct{ context.Context } @@ -271,9 +272,9 @@ func (vc *valCtx) Deadline() (time.Time, bool) { return zeroTime, false } func (vc *valCtx) Done() <-chan struct{} { return valCtxCh } func (vc *valCtx) Err() error { return nil } -func (w *watcher) newWatcherGrpcStream(inctx context.Context) *watchGrpcStream { +func (w *watcher) newWatcherGRPCStream(inctx context.Context) *watchGRPCStream { ctx, cancel := context.WithCancel(&valCtx{inctx}) - wgs := &watchGrpcStream{ + wgs := &watchGRPCStream{ owner: w, remote: w.remote, callOpts: w.callOpts, @@ -334,7 +335,7 @@ func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) Watch } wgs := w.streams[ctxKey] if wgs == nil { - wgs = w.newWatcherGrpcStream(ctx) + wgs = w.newWatcherGRPCStream(ctx) w.streams[ctxKey] = wgs } donec := wgs.donec @@ -395,7 +396,7 @@ func (w *watcher) Close() (err error) { } } // Consider context.Canceled as a successful close - if err == context.Canceled { + if errors.Is(err, context.Canceled) { err = nil } return err @@ -408,11 +409,11 @@ func (w *watcher) RequestProgress(ctx context.Context) (err error) { w.mu.Lock() if w.streams == nil { w.mu.Unlock() - return fmt.Errorf("no stream found for context") + return errors.New("no stream found for context") } wgs := w.streams[ctxKey] if wgs == nil { - wgs = w.newWatcherGrpcStream(ctx) + wgs = w.newWatcherGRPCStream(ctx) w.streams[ctxKey] = wgs } donec := wgs.donec @@ -435,7 +436,7 @@ func (w *watcher) RequestProgress(ctx context.Context) (err error) { } } -func (w *watchGrpcStream) close() (err error) { +func (w *watchGRPCStream) close() (err error) { w.cancel() <-w.donec select { @@ -445,7 +446,7 @@ func (w *watchGrpcStream) close() (err error) { return ContextError(w.ctx, err) } -func (w *watcher) closeStream(wgs *watchGrpcStream) { +func (w *watcher) closeStream(wgs *watchGRPCStream) { w.mu.Lock() close(wgs.donec) wgs.cancel() @@ -455,7 +456,7 @@ func (w *watcher) closeStream(wgs *watchGrpcStream) { w.mu.Unlock() } -func (w *watchGrpcStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream) { +func (w *watchGRPCStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream) { // check watch ID for backward compatibility (<= v3.3) if resp.WatchId == InvalidWatchID || (resp.Canceled && resp.CancelReason != "") { w.closeErr = v3rpc.Error(errors.New(resp.CancelReason)) @@ -467,7 +468,7 @@ func (w *watchGrpcStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream w.substreams[ws.id] = ws } -func (w *watchGrpcStream) sendCloseSubstream(ws *watcherStream, resp *WatchResponse) { +func (w *watchGRPCStream) sendCloseSubstream(ws *watcherStream, resp *WatchResponse) { select { case ws.outc <- *resp: case <-ws.initReq.ctx.Done(): @@ -476,7 +477,7 @@ func (w *watchGrpcStream) sendCloseSubstream(ws *watcherStream, resp *WatchRespo close(ws.outc) } -func (w *watchGrpcStream) closeSubstream(ws *watcherStream) { +func (w *watchGRPCStream) closeSubstream(ws *watcherStream) { // send channel response in case stream was never established select { case ws.initReq.retc <- ws.outc: @@ -501,7 +502,7 @@ func (w *watchGrpcStream) closeSubstream(ws *watcherStream) { } // run is the root of the goroutines for managing a watcher client -func (w *watchGrpcStream) run() { +func (w *watchGRPCStream) run() { var wc pb.Watch_WatchClient var closeErr error @@ -653,7 +654,7 @@ func (w *watchGrpcStream) run() { // watch client failed on Recv; spawn another if possible case err := <-w.errc: - if isHaltErr(w.ctx, err) || ContextError(w.ctx, err) == v3rpc.ErrNoLeader { + if isHaltErr(w.ctx, err) || errors.Is(ContextError(w.ctx, err), v3rpc.ErrNoLeader) { closeErr = err return } @@ -699,7 +700,7 @@ func (w *watchGrpcStream) run() { // nextResume chooses the next resuming to register with the grpc stream. Abandoned // streams are marked as nil in the queue since the head must wait for its inflight registration. -func (w *watchGrpcStream) nextResume() *watcherStream { +func (w *watchGRPCStream) nextResume() *watcherStream { for len(w.resuming) != 0 { if w.resuming[0] != nil { return w.resuming[0] @@ -710,7 +711,7 @@ func (w *watchGrpcStream) nextResume() *watcherStream { } // dispatchEvent sends a WatchResponse to the appropriate watcher stream -func (w *watchGrpcStream) dispatchEvent(pbresp *pb.WatchResponse) bool { +func (w *watchGRPCStream) dispatchEvent(pbresp *pb.WatchResponse) bool { events := make([]*Event, len(pbresp.Events)) for i, ev := range pbresp.Events { events[i] = (*Event)(ev) @@ -732,11 +733,10 @@ func (w *watchGrpcStream) dispatchEvent(pbresp *pb.WatchResponse) bool { } return w.unicastResponse(wr, pbresp.WatchId) - } // broadcastResponse send a watch response to all watch substreams. -func (w *watchGrpcStream) broadcastResponse(wr *WatchResponse) bool { +func (w *watchGRPCStream) broadcastResponse(wr *WatchResponse) bool { for _, ws := range w.substreams { select { case ws.recvc <- wr: @@ -747,8 +747,8 @@ func (w *watchGrpcStream) broadcastResponse(wr *WatchResponse) bool { } // unicastResponse sends a watch response to a specific watch substream. -func (w *watchGrpcStream) unicastResponse(wr *WatchResponse, watchId int64) bool { - ws, ok := w.substreams[watchId] +func (w *watchGRPCStream) unicastResponse(wr *WatchResponse, watchID int64) bool { + ws, ok := w.substreams[watchID] if !ok { return false } @@ -761,7 +761,7 @@ func (w *watchGrpcStream) unicastResponse(wr *WatchResponse, watchId int64) bool } // serveWatchClient forwards messages from the grpc stream to run() -func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) { +func (w *watchGRPCStream) serveWatchClient(wc pb.Watch_WatchClient) { for { resp, err := wc.Recv() if err != nil { @@ -780,7 +780,7 @@ func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) { } // serveSubstream forwards watch responses from run() to the subscriber -func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{}) { +func (w *watchGRPCStream) serveSubstream(ws *watcherStream, resumec chan struct{}) { if ws.closing { panic("created substream goroutine but substream is closing") } @@ -854,6 +854,7 @@ func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{ if len(wr.Events) > 0 { nextRev = wr.Events[len(wr.Events)-1].Kv.ModRevision + 1 } + ws.initReq.rev = nextRev // created event is already sent above, @@ -876,7 +877,7 @@ func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{ // lazily send cancel message if events on missing id } -func (w *watchGrpcStream) newWatchClient() (pb.Watch_WatchClient, error) { +func (w *watchGRPCStream) newWatchClient() (pb.Watch_WatchClient, error) { // mark all substreams as resuming close(w.resumec) w.resumec = make(chan struct{}) @@ -922,7 +923,7 @@ func (w *watchGrpcStream) newWatchClient() (pb.Watch_WatchClient, error) { return wc, nil } -func (w *watchGrpcStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan struct{} { +func (w *watchGRPCStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan struct{} { var wg sync.WaitGroup wg.Add(len(w.resuming)) donec := make(chan struct{}) @@ -959,7 +960,7 @@ func (w *watchGrpcStream) waitCancelSubstreams(stopc <-chan struct{}) <-chan str } // joinSubstreams waits for all substream goroutines to complete. -func (w *watchGrpcStream) joinSubstreams() { +func (w *watchGRPCStream) joinSubstreams() { for _, ws := range w.substreams { <-ws.donec } @@ -972,7 +973,7 @@ func (w *watchGrpcStream) joinSubstreams() { var maxBackoff = 100 * time.Millisecond -func (w *watchGrpcStream) backoffIfUnavailable(backoff time.Duration, err error) time.Duration { +func (w *watchGRPCStream) backoffIfUnavailable(backoff time.Duration, err error) time.Duration { if isUnavailableErr(w.ctx, err) { // retry, but backoff if backoff < maxBackoff { @@ -990,7 +991,7 @@ func (w *watchGrpcStream) backoffIfUnavailable(backoff time.Duration, err error) // openWatchClient retries opening a watch client until success or halt. // manually retry in case "ws==nil && err==nil" // TODO: remove FailFast=false -func (w *watchGrpcStream) openWatchClient() (ws pb.Watch_WatchClient, err error) { +func (w *watchGRPCStream) openWatchClient() (ws pb.Watch_WatchClient, err error) { backoff := time.Millisecond for { select { diff --git a/vendor/go.podman.io/image/v5/copy/compression.go b/vendor/go.podman.io/image/v5/copy/compression.go index 0ecc851866..e3e5230292 100644 --- a/vendor/go.podman.io/image/v5/copy/compression.go +++ b/vendor/go.podman.io/image/v5/copy/compression.go @@ -27,9 +27,10 @@ var ( // expectedBaseCompressionFormats is used to check if a blob with a specified media type is compressed // using the algorithm that the media type says it should be compressed with expectedBaseCompressionFormats = map[string]*compressiontypes.Algorithm{ - imgspecv1.MediaTypeImageLayerGzip: &compression.Gzip, - imgspecv1.MediaTypeImageLayerZstd: &compression.Zstd, - manifest.DockerV2Schema2LayerMediaType: &compression.Gzip, + imgspecv1.MediaTypeImageLayerGzip: &compression.Gzip, + imgspecv1.MediaTypeImageLayerZstd: &compression.Zstd, + manifest.DockerV2Schema2LayerMediaType: &compression.Gzip, + manifest.DockerV2SchemaLayerMediaTypeZstd: &compression.Zstd, } ) diff --git a/vendor/go.podman.io/image/v5/docker/docker_client.go b/vendor/go.podman.io/image/v5/docker/docker_client.go index a83e19a36a..1c0d67105e 100644 --- a/vendor/go.podman.io/image/v5/docker/docker_client.go +++ b/vendor/go.podman.io/image/v5/docker/docker_client.go @@ -1066,6 +1066,8 @@ func (c *dockerClient) getBlob(ctx context.Context, ref dockerReference, info ty cache.RecordKnownLocation(ref.Transport(), bicTransportScope(ref), info.Digest, newBICLocationReference(ref)) blobSize, err := getBlobSize(res) if err != nil { + // See above, we don't guarantee returning a size + logrus.Debugf("failed to get blob size: %v", err) blobSize = -1 } diff --git a/vendor/go.podman.io/image/v5/internal/image/docker_schema2.go b/vendor/go.podman.io/image/v5/internal/image/docker_schema2.go index 9305524a08..1586d67900 100644 --- a/vendor/go.podman.io/image/v5/internal/image/docker_schema2.go +++ b/vendor/go.podman.io/image/v5/internal/image/docker_schema2.go @@ -233,6 +233,8 @@ func (m *manifestSchema2) convertToManifestOCI1(ctx context.Context, _ *types.Ma layers[idx].MediaType = imgspecv1.MediaTypeImageLayer case manifest.DockerV2Schema2LayerMediaType: layers[idx].MediaType = imgspecv1.MediaTypeImageLayerGzip + case manifest.DockerV2SchemaLayerMediaTypeZstd: + layers[idx].MediaType = imgspecv1.MediaTypeImageLayerZstd default: return nil, fmt.Errorf("Unknown media type during manifest conversion: %q", m.m.LayersDescriptors[idx].MediaType) } diff --git a/vendor/go.podman.io/image/v5/internal/image/oci.go b/vendor/go.podman.io/image/v5/internal/image/oci.go index 8b73b91ffa..56a1a6d64e 100644 --- a/vendor/go.podman.io/image/v5/internal/image/oci.go +++ b/vendor/go.podman.io/image/v5/internal/image/oci.go @@ -288,7 +288,7 @@ func (m *manifestOCI1) convertToManifestSchema2(_ context.Context, options *type case imgspecv1.MediaTypeImageLayerGzip: layers[idx].MediaType = manifest.DockerV2Schema2LayerMediaType case imgspecv1.MediaTypeImageLayerZstd: - return nil, fmt.Errorf("Error during manifest conversion: %q: zstd compression is not supported for docker images", layers[idx].MediaType) + return nil, fmt.Errorf("Error during manifest conversion: %q: zstd compression is not officially supported for docker images", layers[idx].MediaType) case ociencspec.MediaTypeLayerEnc, ociencspec.MediaTypeLayerGzipEnc, ociencspec.MediaTypeLayerZstdEnc, ociencspec.MediaTypeLayerNonDistributableEnc, ociencspec.MediaTypeLayerNonDistributableGzipEnc, ociencspec.MediaTypeLayerNonDistributableZstdEnc: return nil, fmt.Errorf("during manifest conversion: encrypted layers (%q) are not supported in docker images", layers[idx].MediaType) diff --git a/vendor/go.podman.io/image/v5/internal/manifest/manifest.go b/vendor/go.podman.io/image/v5/internal/manifest/manifest.go index 7dfe77844e..687b37fb07 100644 --- a/vendor/go.podman.io/image/v5/internal/manifest/manifest.go +++ b/vendor/go.podman.io/image/v5/internal/manifest/manifest.go @@ -26,6 +26,8 @@ const ( DockerV2Schema2LayerMediaType = "application/vnd.docker.image.rootfs.diff.tar.gzip" // DockerV2SchemaLayerMediaTypeUncompressed is the mediaType used for uncompressed layers. DockerV2SchemaLayerMediaTypeUncompressed = "application/vnd.docker.image.rootfs.diff.tar" + // DockerV2Schema2LayerMediaType is the MIME type used for schema 2 layers. + DockerV2SchemaLayerMediaTypeZstd = "application/vnd.docker.image.rootfs.diff.tar.zstd" // DockerV2ListMediaType MIME type represents Docker manifest schema 2 list DockerV2ListMediaType = "application/vnd.docker.distribution.manifest.list.v2+json" // DockerV2Schema2ForeignLayerMediaType is the MIME type used for schema 2 foreign layers. diff --git a/vendor/go.podman.io/image/v5/manifest/manifest.go b/vendor/go.podman.io/image/v5/manifest/manifest.go index 45118fa4e1..ed489a5a6c 100644 --- a/vendor/go.podman.io/image/v5/manifest/manifest.go +++ b/vendor/go.podman.io/image/v5/manifest/manifest.go @@ -26,6 +26,9 @@ const ( DockerV2Schema2LayerMediaType = manifest.DockerV2Schema2LayerMediaType // DockerV2SchemaLayerMediaTypeUncompressed is the mediaType used for uncompressed layers. DockerV2SchemaLayerMediaTypeUncompressed = manifest.DockerV2SchemaLayerMediaTypeUncompressed + // DockerV2SchemaLayerMediaTypeZstd is the mediaType used for zstd layers. + // Warning: This mediaType is not officially supported in https://github.com/distribution/distribution/blob/main/docs/content/spec/manifest-v2-2.md but some images may exhibit it. Support is partial. + DockerV2SchemaLayerMediaTypeZstd = manifest.DockerV2SchemaLayerMediaTypeZstd // DockerV2ListMediaType MIME type represents Docker manifest schema 2 list DockerV2ListMediaType = manifest.DockerV2ListMediaType // DockerV2Schema2ForeignLayerMediaType is the MIME type used for schema 2 foreign layers. @@ -41,7 +44,7 @@ type NonImageArtifactError = manifest.NonImageArtifactError // SupportedSchema2MediaType checks if the specified string is a supported Docker v2s2 media type. func SupportedSchema2MediaType(m string) error { switch m { - case DockerV2ListMediaType, DockerV2Schema1MediaType, DockerV2Schema1SignedMediaType, DockerV2Schema2ConfigMediaType, DockerV2Schema2ForeignLayerMediaType, DockerV2Schema2ForeignLayerMediaTypeGzip, DockerV2Schema2LayerMediaType, DockerV2Schema2MediaType, DockerV2SchemaLayerMediaTypeUncompressed: + case DockerV2ListMediaType, DockerV2Schema1MediaType, DockerV2Schema1SignedMediaType, DockerV2Schema2ConfigMediaType, DockerV2Schema2ForeignLayerMediaType, DockerV2Schema2ForeignLayerMediaTypeGzip, DockerV2Schema2LayerMediaType, DockerV2Schema2MediaType, DockerV2SchemaLayerMediaTypeUncompressed, DockerV2SchemaLayerMediaTypeZstd: return nil default: return fmt.Errorf("unsupported docker v2s2 media type: %q", m) diff --git a/vendor/go.podman.io/image/v5/version/version.go b/vendor/go.podman.io/image/v5/version/version.go index e577735ee1..71a957fc68 100644 --- a/vendor/go.podman.io/image/v5/version/version.go +++ b/vendor/go.podman.io/image/v5/version/version.go @@ -6,7 +6,7 @@ const ( // VersionMajor is for an API incompatible changes VersionMajor = 5 // VersionMinor is for functionality in a backwards-compatible manner - VersionMinor = 37 + VersionMinor = 38 // VersionPatch is for backwards-compatible bug fixes VersionPatch = 0 diff --git a/vendor/go.podman.io/storage/pkg/archive/archive.go b/vendor/go.podman.io/storage/pkg/archive/archive.go index 5f8647af7c..5cdd751307 100644 --- a/vendor/go.podman.io/storage/pkg/archive/archive.go +++ b/vendor/go.podman.io/storage/pkg/archive/archive.go @@ -417,9 +417,7 @@ func FileInfoHeader(name string, fi os.FileInfo, link string) (*tar.Header, erro return nil, fmt.Errorf("tar: cannot canonicalize path: %w", err) } hdr.Name = name - if err := setHeaderForSpecialDevice(hdr, name, fi.Sys()); err != nil { - return nil, err - } + setHeaderForSpecialDevice(hdr, name, fi.Sys()) return hdr, nil } diff --git a/vendor/go.podman.io/storage/pkg/archive/archive_linux.go b/vendor/go.podman.io/storage/pkg/archive/archive_linux.go index fd7123babc..4613ee32f7 100644 --- a/vendor/go.podman.io/storage/pkg/archive/archive_linux.go +++ b/vendor/go.podman.io/storage/pkg/archive/archive_linux.go @@ -30,7 +30,7 @@ type overlayWhiteoutConverter struct { rolayers []string } -func (o overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os.FileInfo) (wo *tar.Header, err error) { +func (o overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os.FileInfo) (*tar.Header, error) { // convert whiteouts to AUFS format if fi.Mode()&os.ModeCharDevice != 0 && hdr.Devmajor == 0 && hdr.Devminor == 0 { // we just rename the file and make it normal @@ -73,7 +73,7 @@ func (o overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi // add a whiteout for this item in this layer. // create a header for the whiteout file // it should inherit some properties from the parent, but be a regular file - wo = &tar.Header{ + wo := &tar.Header{ Typeflag: tar.TypeReg, Mode: hdr.Mode & int64(os.ModePerm), Name: filepath.Join(hdr.Name, WhiteoutOpaqueDir), @@ -85,7 +85,7 @@ func (o overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi AccessTime: hdr.AccessTime, ChangeTime: hdr.ChangeTime, } - break + return wo, nil } for dir := filepath.Dir(hdr.Name); dir != "" && dir != "." && dir != string(os.PathSeparator); dir = filepath.Dir(dir) { // Check for whiteout for a parent directory in a parent layer. @@ -109,7 +109,7 @@ func (o overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi } } - return + return nil, nil } func (overlayWhiteoutConverter) ConvertReadWithHandler(hdr *tar.Header, path string, handler TarWhiteoutHandler) (bool, error) { diff --git a/vendor/go.podman.io/storage/pkg/archive/archive_other.go b/vendor/go.podman.io/storage/pkg/archive/archive_other.go index b342ff75ee..f7c7352fd3 100644 --- a/vendor/go.podman.io/storage/pkg/archive/archive_other.go +++ b/vendor/go.podman.io/storage/pkg/archive/archive_other.go @@ -2,7 +2,7 @@ package archive -func GetWhiteoutConverter(format WhiteoutFormat, data interface{}) TarWhiteoutConverter { +func GetWhiteoutConverter(format WhiteoutFormat, data any) TarWhiteoutConverter { return nil } diff --git a/vendor/go.podman.io/storage/pkg/archive/archive_unix.go b/vendor/go.podman.io/storage/pkg/archive/archive_unix.go index 2d9d68de2c..b09b064435 100644 --- a/vendor/go.podman.io/storage/pkg/archive/archive_unix.go +++ b/vendor/go.podman.io/storage/pkg/archive/archive_unix.go @@ -32,8 +32,10 @@ func statUnix(fi os.FileInfo, hdr *tar.Header) error { if s.Mode&unix.S_IFBLK != 0 || s.Mode&unix.S_IFCHR != 0 { - hdr.Devmajor = int64(unix.Major(uint64(s.Rdev))) //nolint: unconvert - hdr.Devminor = int64(unix.Minor(uint64(s.Rdev))) //nolint: unconvert + // _nolint_: Whether this conversion is required is hardware- and OS-dependent: the value might be uint64 on Linux, int32 on macOS. + // So, this might trigger either "uncovert" (if the conversion is unnecessary) or "nolintlint" (if it is required) + hdr.Devmajor = int64(unix.Major(uint64(s.Rdev))) //nolint:unconvert,nolintlint + hdr.Devminor = int64(unix.Minor(uint64(s.Rdev))) //nolint:unconvert,nolintlint } return nil @@ -67,19 +69,19 @@ func chmodTarEntry(perm os.FileMode) os.FileMode { return perm // noop for unix as golang APIs provide perm bits correctly } -func setHeaderForSpecialDevice(hdr *tar.Header, name string, stat any) (err error) { +func setHeaderForSpecialDevice(hdr *tar.Header, name string, stat any) { s, ok := stat.(*syscall.Stat_t) if ok { // Currently go does not fill in the major/minors if s.Mode&unix.S_IFBLK != 0 || s.Mode&unix.S_IFCHR != 0 { - hdr.Devmajor = int64(major(uint64(s.Rdev))) //nolint: unconvert - hdr.Devminor = int64(minor(uint64(s.Rdev))) //nolint: unconvert + // _nolint_: Whether this conversion is required is hardware- and OS-dependent: the value might be uint64 on Linux, int32 on macOS. + // So, this might trigger either "uncovert" (if the conversion is unnecessary) or "nolintlint" (if it is required) + hdr.Devmajor = int64(major(uint64(s.Rdev))) //nolint: unconvert,nolintlint + hdr.Devminor = int64(minor(uint64(s.Rdev))) //nolint: unconvert,nolintlint } } - - return } func getInodeFromStat(stat any) (inode uint64) { @@ -89,7 +91,7 @@ func getInodeFromStat(stat any) (inode uint64) { inode = s.Ino } - return + return inode } func getFileUIDGID(stat any) (idtools.IDPair, error) { diff --git a/vendor/go.podman.io/storage/pkg/archive/archive_windows.go b/vendor/go.podman.io/storage/pkg/archive/archive_windows.go index 1183f4a282..2c84e9ea54 100644 --- a/vendor/go.podman.io/storage/pkg/archive/archive_windows.go +++ b/vendor/go.podman.io/storage/pkg/archive/archive_windows.go @@ -52,14 +52,13 @@ func chmodTarEntry(perm os.FileMode) os.FileMode { return noPermPart | permPart } -func setHeaderForSpecialDevice(hdr *tar.Header, name string, stat interface{}) (err error) { +func setHeaderForSpecialDevice(hdr *tar.Header, name string, stat interface{}) { // do nothing. no notion of Rdev, Nlink in stat on Windows - return } -func getInodeFromStat(stat interface{}) (inode uint64) { +func getInodeFromStat(stat interface{}) uint64 { // do nothing. no notion of Inode in stat on Windows - return + return 0 } // handleTarTypeBlockCharFifo is an OS-specific helper function used by diff --git a/vendor/go.podman.io/storage/pkg/archive/changes.go b/vendor/go.podman.io/storage/pkg/archive/changes.go index 051ab69528..a60c20dd36 100644 --- a/vendor/go.podman.io/storage/pkg/archive/changes.go +++ b/vendor/go.podman.io/storage/pkg/archive/changes.go @@ -86,12 +86,12 @@ func Changes(layers []string, rw string) ([]Change, error) { return changes(layers, rw, aufsDeletedFile, aufsMetadataSkip, aufsWhiteoutPresent) } -func aufsMetadataSkip(path string) (skip bool, err error) { - skip, err = filepath.Match(string(os.PathSeparator)+WhiteoutMetaPrefix+"*", path) +func aufsMetadataSkip(path string) (bool, error) { + skip, err := filepath.Match(string(os.PathSeparator)+WhiteoutMetaPrefix+"*", path) if err != nil { skip = true } - return + return skip, err } func aufsDeletedFile(root, path string, fi os.FileInfo) (string, error) { @@ -281,8 +281,7 @@ func (info *FileInfo) LookUp(path string) *FileInfo { return info } - pathElements := strings.Split(path, string(os.PathSeparator)) - for _, elem := range pathElements { + for elem := range strings.SplitSeq(path, string(os.PathSeparator)) { if elem != "" { child := parent.children[elem] if child == nil { diff --git a/vendor/go.podman.io/storage/pkg/archive/changes_windows.go b/vendor/go.podman.io/storage/pkg/archive/changes_windows.go index 947ec2d224..997ee574e2 100644 --- a/vendor/go.podman.io/storage/pkg/archive/changes_windows.go +++ b/vendor/go.podman.io/storage/pkg/archive/changes_windows.go @@ -20,8 +20,8 @@ func (info *FileInfo) isDir() bool { return info.parent == nil || info.stat.Mode().IsDir() } -func getIno(fi os.FileInfo) (inode uint64) { - return +func getIno(fi os.FileInfo) uint64 { + return 0 } func hasHardlinks(fi os.FileInfo) bool { diff --git a/vendor/go.podman.io/storage/pkg/archive/copy.go b/vendor/go.podman.io/storage/pkg/archive/copy.go index 308f132d58..3f91c72b99 100644 --- a/vendor/go.podman.io/storage/pkg/archive/copy.go +++ b/vendor/go.podman.io/storage/pkg/archive/copy.go @@ -93,13 +93,13 @@ func TarResource(sourceInfo CopyInfo) (content io.ReadCloser, err error) { // TarResourceRebase is like TarResource but renames the first path element of // items in the resulting tar archive to match the given rebaseName if not "". -func TarResourceRebase(sourcePath, rebaseName string) (content io.ReadCloser, err error) { +func TarResourceRebase(sourcePath, rebaseName string) (io.ReadCloser, error) { sourcePath = normalizePath(sourcePath) - if err = fileutils.Lexists(sourcePath); err != nil { + if err := fileutils.Lexists(sourcePath); err != nil { // Catches the case where the source does not exist or is not a // directory if asserted to be a directory, as this also causes an // error. - return + return nil, err } // Separate the source path between its directory and @@ -411,7 +411,7 @@ func ResolveHostSourcePath(path string, followLink bool) (resolvedPath, rebaseNa if followLink { resolvedPath, err = filepath.EvalSymlinks(path) if err != nil { - return + return "", "", err } resolvedPath, rebaseName = GetRebaseName(path, resolvedPath) @@ -422,7 +422,7 @@ func ResolveHostSourcePath(path string, followLink bool) (resolvedPath, rebaseNa var resolvedDirPath string resolvedDirPath, err = filepath.EvalSymlinks(dirPath) if err != nil { - return + return "", "", err } // resolvedDirPath will have been cleaned (no trailing path separators) so // we can manually join it with the base path element. diff --git a/vendor/go.podman.io/storage/pkg/archive/fflags_bsd.go b/vendor/go.podman.io/storage/pkg/archive/fflags_bsd.go index 829c95ef14..7584b14ce5 100644 --- a/vendor/go.podman.io/storage/pkg/archive/fflags_bsd.go +++ b/vendor/go.podman.io/storage/pkg/archive/fflags_bsd.go @@ -77,7 +77,7 @@ var ( func parseFileFlags(fflags string) (uint32, uint32, error) { var set, clear uint32 = 0, 0 - for _, fflag := range strings.Split(fflags, ",") { + for fflag := range strings.SplitSeq(fflags, ",") { isClear := false if clean, ok := strings.CutPrefix(fflag, "no"); ok { isClear = true diff --git a/vendor/go.podman.io/storage/pkg/archive/time_linux.go b/vendor/go.podman.io/storage/pkg/archive/time_linux.go index 3448569b1e..a5233c09f6 100644 --- a/vendor/go.podman.io/storage/pkg/archive/time_linux.go +++ b/vendor/go.podman.io/storage/pkg/archive/time_linux.go @@ -10,7 +10,7 @@ func timeToTimespec(time time.Time) (ts syscall.Timespec) { // Return UTIME_OMIT special value ts.Sec = 0 ts.Nsec = ((1 << 30) - 2) - return + return ts } return syscall.NsecToTimespec(time.UnixNano()) } diff --git a/vendor/go.podman.io/storage/pkg/archive/wrap.go b/vendor/go.podman.io/storage/pkg/archive/wrap.go index 903befd763..f8a97254ee 100644 --- a/vendor/go.podman.io/storage/pkg/archive/wrap.go +++ b/vendor/go.podman.io/storage/pkg/archive/wrap.go @@ -45,8 +45,8 @@ func Generate(input ...string) (io.Reader, error) { return buf, nil } -func parseStringPairs(input ...string) (output [][2]string) { - output = make([][2]string, 0, len(input)/2+1) +func parseStringPairs(input ...string) [][2]string { + output := make([][2]string, 0, len(input)/2+1) for i := 0; i < len(input); i += 2 { var pair [2]string pair[0] = input[i] @@ -55,5 +55,5 @@ func parseStringPairs(input ...string) (output [][2]string) { } output = append(output, pair) } - return + return output } diff --git a/vendor/go.podman.io/storage/pkg/chunked/compressor/compressor.go b/vendor/go.podman.io/storage/pkg/chunked/compressor/compressor.go index 23bcbda519..ef26a812ba 100644 --- a/vendor/go.podman.io/storage/pkg/chunked/compressor/compressor.go +++ b/vendor/go.podman.io/storage/pkg/chunked/compressor/compressor.go @@ -173,7 +173,7 @@ func (rc *rollingChecksumReader) Read(b []byte) (bool, int, error) { return false, -1, err } if holeLen > 0 { - for j := int64(0); j < holeLen; j++ { + for range holeLen { rc.rollsum.Roll(0) } rc.pendingHole = holeLen diff --git a/vendor/go.podman.io/storage/pkg/chunked/internal/minimal/compression.go b/vendor/go.podman.io/storage/pkg/chunked/internal/minimal/compression.go index 256365759c..c3fcf71a74 100644 --- a/vendor/go.podman.io/storage/pkg/chunked/internal/minimal/compression.go +++ b/vendor/go.podman.io/storage/pkg/chunked/internal/minimal/compression.go @@ -146,7 +146,9 @@ const ( // TarSplitChecksumKey is no longer used and is replaced by the TOC.TarSplitDigest field instead. // The value is retained here as a constant as a historical reference for older zstd:chunked images. - // TarSplitChecksumKey = "io.github.containers.zstd-chunked.tarsplit-checksum" + // + // Deprecated: This field should never be relied on - use the digest in the TOC instead. + TarSplitChecksumKey = "io.github.containers.zstd-chunked.tarsplit-checksum" // ManifestTypeCRFS is a manifest file compatible with the CRFS TOC file. ManifestTypeCRFS = 1 diff --git a/vendor/go.podman.io/storage/pkg/chunked/toc/toc.go b/vendor/go.podman.io/storage/pkg/chunked/toc/toc.go index 7059b5406d..fafa40e607 100644 --- a/vendor/go.podman.io/storage/pkg/chunked/toc/toc.go +++ b/vendor/go.podman.io/storage/pkg/chunked/toc/toc.go @@ -7,6 +7,20 @@ import ( "go.podman.io/storage/pkg/chunked/internal/minimal" ) +// ChunkedAnnotations contains various annotations that might be set or used by the pkg/chunked-supported +// compression formats. +// +// This set does not define their semantics in detail as a public API. +// The _only_ intended use of this set is: code that _changes_ layer compression to a format +// which is not chunked can/should remove these annotations. +var ChunkedAnnotations = map[string]struct{}{ + minimal.ManifestChecksumKey: {}, + minimal.ManifestInfoKey: {}, + minimal.TarSplitInfoKey: {}, + minimal.TarSplitChecksumKey: {}, //nolint:staticcheck // The field is deprecated, so removing it when changing compressionn is all the more desirable. + tocJSONDigestAnnotation: {}, +} + // tocJSONDigestAnnotation is the annotation key for the digest of the estargz // TOC JSON. // It is defined in github.com/containerd/stargz-snapshotter/estargz as TOCJSONDigestAnnotation diff --git a/vendor/go.podman.io/storage/pkg/fileutils/fileutils.go b/vendor/go.podman.io/storage/pkg/fileutils/fileutils.go index 85ce2d5260..434979825c 100644 --- a/vendor/go.podman.io/storage/pkg/fileutils/fileutils.go +++ b/vendor/go.podman.io/storage/pkg/fileutils/fileutils.go @@ -51,7 +51,6 @@ func NewPatternMatcher(patterns []string) (*PatternMatcher, error) { return nil, err } newp.cleanedPattern = p - newp.dirs = strings.Split(p, string(os.PathSeparator)) pm.patterns = append(pm.patterns, newp) } return pm, nil @@ -168,7 +167,6 @@ func (pm *PatternMatcher) Patterns() []*Pattern { // Pattern defines a single regexp used to filter file paths. type Pattern struct { cleanedPattern string - dirs []string regexp *regexp.Regexp exclusion bool } diff --git a/vendor/go.podman.io/storage/pkg/idtools/idtools_unix.go b/vendor/go.podman.io/storage/pkg/idtools/idtools_unix.go index 817b59aed1..e7c2643676 100644 --- a/vendor/go.podman.io/storage/pkg/idtools/idtools_unix.go +++ b/vendor/go.podman.io/storage/pkg/idtools/idtools_unix.go @@ -8,7 +8,6 @@ import ( "io" "os" "path/filepath" - "strings" "sync" "syscall" @@ -112,7 +111,7 @@ func LookupUser(username string) (user.User, error) { return usr, nil } // local files lookup failed; attempt to call `getent` to query configured passwd dbs - usr, err = getentUser(fmt.Sprintf("%s %s", "passwd", username)) + usr, err = getentUser(username) if err != nil { return user.User{}, err } @@ -128,11 +127,11 @@ func LookupUID(uid int) (user.User, error) { return usr, nil } // local files lookup failed; attempt to call `getent` to query configured passwd dbs - return getentUser(fmt.Sprintf("%s %d", "passwd", uid)) + return getentUser(fmt.Sprintf("%d", uid)) } -func getentUser(args string) (user.User, error) { - reader, err := callGetent(args) +func getentUser(key string) (user.User, error) { + reader, err := callGetent("passwd", key) if err != nil { return user.User{}, err } @@ -141,7 +140,7 @@ func getentUser(args string) (user.User, error) { return user.User{}, err } if len(users) == 0 { - return user.User{}, fmt.Errorf("getent failed to find passwd entry for %q", strings.Split(args, " ")[1]) + return user.User{}, fmt.Errorf("getent failed to find passwd entry for %q", key) } return users[0], nil } @@ -155,7 +154,7 @@ func LookupGroup(groupname string) (user.Group, error) { return group, nil } // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %s", "group", groupname)) + return getentGroup(groupname) } // LookupGID uses traditional local system files lookup (from libcontainer/user) on a group ID, @@ -167,11 +166,11 @@ func LookupGID(gid int) (user.Group, error) { return group, nil } // local files lookup failed; attempt to call `getent` to query configured group dbs - return getentGroup(fmt.Sprintf("%s %d", "group", gid)) + return getentGroup(fmt.Sprintf("%d", gid)) } -func getentGroup(args string) (user.Group, error) { - reader, err := callGetent(args) +func getentGroup(key string) (user.Group, error) { + reader, err := callGetent("group", key) if err != nil { return user.Group{}, err } @@ -180,18 +179,18 @@ func getentGroup(args string) (user.Group, error) { return user.Group{}, err } if len(groups) == 0 { - return user.Group{}, fmt.Errorf("getent failed to find groups entry for %q", strings.Split(args, " ")[1]) + return user.Group{}, fmt.Errorf("getent failed to find groups entry for %q", key) } return groups[0], nil } -func callGetent(args string) (io.Reader, error) { +func callGetent(db, key string) (io.Reader, error) { entOnce.Do(func() { getentCmd, _ = resolveBinary("getent") }) // if no `getent` command on host, can't do anything else if getentCmd == "" { return nil, fmt.Errorf("") } - out, err := execCmd(getentCmd, args) + out, err := execCmd(getentCmd, db, key) if err != nil { exitCode, errC := system.GetExitCode(err) if errC != nil { @@ -201,8 +200,7 @@ func callGetent(args string) (io.Reader, error) { case 1: return nil, fmt.Errorf("getent reported invalid parameters/database unknown") case 2: - terms := strings.Split(args, " ") - return nil, fmt.Errorf("getent unable to find entry %q in %s database", terms[1], terms[0]) + return nil, fmt.Errorf("getent unable to find entry %q in %s database", key, db) case 3: return nil, fmt.Errorf("getent database doesn't support enumeration") default: diff --git a/vendor/go.podman.io/storage/pkg/idtools/usergroupadd_linux.go b/vendor/go.podman.io/storage/pkg/idtools/usergroupadd_linux.go index d2ff4466c1..ee80ce6a78 100644 --- a/vendor/go.podman.io/storage/pkg/idtools/usergroupadd_linux.go +++ b/vendor/go.podman.io/storage/pkg/idtools/usergroupadd_linux.go @@ -2,6 +2,7 @@ package idtools import ( "fmt" + "slices" "sort" "strconv" "strings" @@ -17,19 +18,12 @@ import ( var ( once sync.Once - userCommand string - - cmdTemplates = map[string]string{ - "adduser": "--system --shell /bin/false --no-create-home --disabled-login --disabled-password --group %s", - "useradd": "-r -s /bin/false %s", - "usermod": "-%s %d-%d %s", - } + userCommand []string // command, args…, to be finished by adding an user name idOutRegexp = regexp.Delayed(`uid=([0-9]+).*gid=([0-9]+)`) // default length for a UID/GID subordinate range defaultRangeLen = 65536 defaultRangeStart = 100000 - userMod = "usermod" ) // AddNamespaceRangesUser takes a username and uses the standard system @@ -72,16 +66,16 @@ func addUser(userName string) error { once.Do(func() { // set up which commands are used for adding users/groups dependent on distro if _, err := resolveBinary("adduser"); err == nil { - userCommand = "adduser" + userCommand = []string{"adduser", "--system", "--shell", "/bin/false", "--no-create-home", "--disabled-login", "--disabled-password", "--group"} } else if _, err := resolveBinary("useradd"); err == nil { - userCommand = "useradd" + userCommand = []string{"useradd", "-r", "-s", "/bin/false"} } }) - if userCommand == "" { + if userCommand == nil { return fmt.Errorf("cannot add user; no useradd/adduser binary found") } - args := fmt.Sprintf(cmdTemplates[userCommand], userName) - out, err := execCmd(userCommand, args) + args := append(slices.Clone(userCommand), userName) + out, err := execCmd(args[0], args[1:]...) if err != nil { return fmt.Errorf("failed to add user with error: %w; output: %q", err, string(out)) } @@ -101,7 +95,7 @@ func createSubordinateRanges(name string) error { if err != nil { return fmt.Errorf("can't find available subuid range: %w", err) } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "v", startID, startID+defaultRangeLen-1, name)) + out, err := execCmd("usermod", "-v", fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1), name) if err != nil { return fmt.Errorf("unable to add subuid range to user: %q; output: %s, err: %w", name, out, err) } @@ -117,7 +111,7 @@ func createSubordinateRanges(name string) error { if err != nil { return fmt.Errorf("can't find available subgid range: %w", err) } - out, err := execCmd(userMod, fmt.Sprintf(cmdTemplates[userMod], "w", startID, startID+defaultRangeLen-1, name)) + out, err := execCmd("usermod", "-w", fmt.Sprintf("%d-%d", startID, startID+defaultRangeLen-1), name) if err != nil { return fmt.Errorf("unable to add subgid range to user: %q; output: %s, err: %w", name, out, err) } diff --git a/vendor/go.podman.io/storage/pkg/idtools/utils_unix.go b/vendor/go.podman.io/storage/pkg/idtools/utils_unix.go index f34462a23a..10606fba8a 100644 --- a/vendor/go.podman.io/storage/pkg/idtools/utils_unix.go +++ b/vendor/go.podman.io/storage/pkg/idtools/utils_unix.go @@ -6,7 +6,6 @@ import ( "fmt" "os/exec" "path/filepath" - "strings" ) func resolveBinary(binname string) (string, error) { @@ -26,7 +25,7 @@ func resolveBinary(binname string) (string, error) { return "", fmt.Errorf("binary %q does not resolve to a binary of that name in $PATH (%q)", binname, resolvedPath) } -func execCmd(cmd, args string) ([]byte, error) { - execCmd := exec.Command(cmd, strings.Split(args, " ")...) +func execCmd(cmd string, args ...string) ([]byte, error) { + execCmd := exec.Command(cmd, args...) return execCmd.CombinedOutput() } diff --git a/vendor/go.podman.io/storage/pkg/ioutils/bytespipe.go b/vendor/go.podman.io/storage/pkg/ioutils/bytespipe.go index cf60580359..47ab345072 100644 --- a/vendor/go.podman.io/storage/pkg/ioutils/bytespipe.go +++ b/vendor/go.podman.io/storage/pkg/ioutils/bytespipe.go @@ -121,7 +121,8 @@ func (bp *BytesPipe) Close() error { // Read reads bytes from BytesPipe. // Data could be read only once. -func (bp *BytesPipe) Read(p []byte) (n int, err error) { +func (bp *BytesPipe) Read(p []byte) (int, error) { + var n int bp.mu.Lock() if bp.bufLen == 0 { if bp.closeErr != nil { @@ -158,7 +159,7 @@ func (bp *BytesPipe) Read(p []byte) (n int, err error) { bp.wait.Broadcast() bp.mu.Unlock() - return + return n, nil } func returnBuffer(b *fixedBuffer) { diff --git a/vendor/go.podman.io/storage/pkg/ioutils/readers.go b/vendor/go.podman.io/storage/pkg/ioutils/readers.go index 146e1a5ff0..aed1cb0331 100644 --- a/vendor/go.podman.io/storage/pkg/ioutils/readers.go +++ b/vendor/go.podman.io/storage/pkg/ioutils/readers.go @@ -83,7 +83,7 @@ func (r *OnEOFReader) Read(p []byte) (n int, err error) { if err == io.EOF { r.runFunc() } - return + return n, err } // Close closes the file and run the function. diff --git a/vendor/go.podman.io/storage/pkg/ioutils/writers.go b/vendor/go.podman.io/storage/pkg/ioutils/writers.go index 0b6d0a7a6d..2a8007e446 100644 --- a/vendor/go.podman.io/storage/pkg/ioutils/writers.go +++ b/vendor/go.podman.io/storage/pkg/ioutils/writers.go @@ -59,8 +59,8 @@ func NewWriteCounter(w io.Writer) *WriteCounter { } } -func (wc *WriteCounter) Write(p []byte) (count int, err error) { - count, err = wc.Writer.Write(p) +func (wc *WriteCounter) Write(p []byte) (int, error) { + count, err := wc.Writer.Write(p) wc.Count += int64(count) - return + return count, err } diff --git a/vendor/go.podman.io/storage/pkg/mount/flags.go b/vendor/go.podman.io/storage/pkg/mount/flags.go index 40a229932b..9325e25977 100644 --- a/vendor/go.podman.io/storage/pkg/mount/flags.go +++ b/vendor/go.podman.io/storage/pkg/mount/flags.go @@ -119,7 +119,7 @@ func ParseOptions(options string) (int, string) { data []string ) - for _, o := range strings.Split(options, ",") { + for o := range strings.SplitSeq(options, ",") { // If the option does not exist in the flags table or the flag // is not supported on the platform, // then it is a data value for a specific fs type @@ -139,7 +139,7 @@ func ParseOptions(options string) (int, string) { // ParseTmpfsOptions parse fstab type mount options into flags and data func ParseTmpfsOptions(options string) (int, string, error) { flags, data := ParseOptions(options) - for _, o := range strings.Split(data, ",") { + for o := range strings.SplitSeq(data, ",") { opt, _, _ := strings.Cut(o, "=") if !validFlags[opt] { return 0, "", fmt.Errorf("invalid tmpfs option %q", opt) diff --git a/vendor/go.podman.io/storage/pkg/mount/mounter_freebsd.go b/vendor/go.podman.io/storage/pkg/mount/mounter_freebsd.go index 61d6d1c595..1c99ff4618 100644 --- a/vendor/go.podman.io/storage/pkg/mount/mounter_freebsd.go +++ b/vendor/go.podman.io/storage/pkg/mount/mounter_freebsd.go @@ -33,8 +33,7 @@ func mount(device, target, mType string, flag uintptr, data string) error { options := []string{"fspath", target} if data != "" { - xs := strings.Split(data, ",") - for _, x := range xs { + for x := range strings.SplitSeq(data, ",") { if x == "bind" { isNullFS = true continue diff --git a/vendor/go.podman.io/storage/pkg/pools/pools.go b/vendor/go.podman.io/storage/pkg/pools/pools.go index 78b729c2e3..1179d9b933 100644 --- a/vendor/go.podman.io/storage/pkg/pools/pools.go +++ b/vendor/go.podman.io/storage/pkg/pools/pools.go @@ -59,11 +59,11 @@ func (bufPool *BufioReaderPool) Put(b *bufio.Reader) { } // Copy is a convenience wrapper which uses a buffer to avoid allocation in io.Copy. -func Copy(dst io.Writer, src io.Reader) (written int64, err error) { +func Copy(dst io.Writer, src io.Reader) (int64, error) { buf := BufioReader32KPool.Get(src) - written, err = io.Copy(dst, buf) + written, err := io.Copy(dst, buf) BufioReader32KPool.Put(buf) - return + return written, err } // NewReadCloserWrapper returns a wrapper which puts the bufio.Reader back diff --git a/vendor/go.podman.io/storage/pkg/system/exitcode.go b/vendor/go.podman.io/storage/pkg/system/exitcode.go index 60f0514b1d..4d7b5c8805 100644 --- a/vendor/go.podman.io/storage/pkg/system/exitcode.go +++ b/vendor/go.podman.io/storage/pkg/system/exitcode.go @@ -29,5 +29,5 @@ func ProcessExitCode(err error) (exitCode int) { exitCode = 127 } } - return + return exitCode } diff --git a/vendor/go.podman.io/storage/pkg/system/stat_netbsd.go b/vendor/go.podman.io/storage/pkg/system/stat_netbsd.go index 715f05b938..57850a883f 100644 --- a/vendor/go.podman.io/storage/pkg/system/stat_netbsd.go +++ b/vendor/go.podman.io/storage/pkg/system/stat_netbsd.go @@ -4,10 +4,12 @@ import "syscall" // fromStatT converts a syscall.Stat_t type to a system.Stat_t type func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, + return &StatT{ + size: s.Size, mode: uint32(s.Mode), uid: s.Uid, gid: s.Gid, rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil + mtim: s.Mtimespec, + }, nil } diff --git a/vendor/go.podman.io/storage/pkg/system/xattrs_darwin.go b/vendor/go.podman.io/storage/pkg/system/xattrs_darwin.go index 27ada2083e..d574e9e61c 100644 --- a/vendor/go.podman.io/storage/pkg/system/xattrs_darwin.go +++ b/vendor/go.podman.io/storage/pkg/system/xattrs_darwin.go @@ -74,7 +74,7 @@ func Llistxattr(path string) ([]string, error) { } var attrs []string - for _, token := range bytes.Split(dest[:sz], []byte{0}) { + for token := range bytes.SplitSeq(dest[:sz], []byte{0}) { if len(token) > 0 { attrs = append(attrs, string(token)) } diff --git a/vendor/go.podman.io/storage/pkg/system/xattrs_freebsd.go b/vendor/go.podman.io/storage/pkg/system/xattrs_freebsd.go index 5d653976e5..f62f5f7454 100644 --- a/vendor/go.podman.io/storage/pkg/system/xattrs_freebsd.go +++ b/vendor/go.podman.io/storage/pkg/system/xattrs_freebsd.go @@ -17,12 +17,10 @@ const ( EOVERFLOW unix.Errno = unix.EOVERFLOW ) -var ( - namespaceMap = map[string]int{ - "user": EXTATTR_NAMESPACE_USER, - "system": EXTATTR_NAMESPACE_SYSTEM, - } -) +var namespaceMap = map[string]int{ + "user": EXTATTR_NAMESPACE_USER, + "system": EXTATTR_NAMESPACE_SYSTEM, +} func xattrToExtattr(xattr string) (namespace int, extattr string, err error) { namespaceName, extattr, found := strings.Cut(xattr, ".") diff --git a/vendor/go.podman.io/storage/pkg/system/xattrs_linux.go b/vendor/go.podman.io/storage/pkg/system/xattrs_linux.go index 12462cca33..3322707a43 100644 --- a/vendor/go.podman.io/storage/pkg/system/xattrs_linux.go +++ b/vendor/go.podman.io/storage/pkg/system/xattrs_linux.go @@ -77,7 +77,7 @@ func Llistxattr(path string) ([]string, error) { } var attrs []string - for _, token := range bytes.Split(dest[:sz], []byte{0}) { + for token := range bytes.SplitSeq(dest[:sz], []byte{0}) { if len(token) > 0 { attrs = append(attrs, string(token)) } diff --git a/vendor/go.yaml.in/yaml/v3/LICENSE b/vendor/go.yaml.in/yaml/v3/LICENSE new file mode 100644 index 0000000000..2683e4bb1f --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/LICENSE @@ -0,0 +1,50 @@ + +This project is covered by two different licenses: MIT and Apache. + +#### MIT License #### + +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original MIT license, with the additional +copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + +Copyright (c) 2006-2010 Kirill Simonov +Copyright (c) 2006-2011 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. + +### Apache License ### + +All the remaining project files are covered by the Apache license: + +Copyright (c) 2011-2019 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/k8s.io/client-go/listers/networking/v1alpha1/expansion_generated.go b/vendor/go.yaml.in/yaml/v3/NOTICE similarity index 58% rename from vendor/k8s.io/client-go/listers/networking/v1alpha1/expansion_generated.go rename to vendor/go.yaml.in/yaml/v3/NOTICE index fc7316521b..866d74a7ad 100644 --- a/vendor/k8s.io/client-go/listers/networking/v1alpha1/expansion_generated.go +++ b/vendor/go.yaml.in/yaml/v3/NOTICE @@ -1,5 +1,4 @@ -/* -Copyright The Kubernetes Authors. +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. @@ -12,16 +11,3 @@ 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. -*/ - -// Code generated by lister-gen. DO NOT EDIT. - -package v1alpha1 - -// IPAddressListerExpansion allows custom methods to be added to -// IPAddressLister. -type IPAddressListerExpansion interface{} - -// ServiceCIDRListerExpansion allows custom methods to be added to -// ServiceCIDRLister. -type ServiceCIDRListerExpansion interface{} diff --git a/vendor/go.yaml.in/yaml/v3/README.md b/vendor/go.yaml.in/yaml/v3/README.md new file mode 100644 index 0000000000..15a85a6350 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/README.md @@ -0,0 +1,171 @@ +go.yaml.in/yaml +=============== + +YAML Support for the Go Language + + +## Introduction + +The `yaml` package enables [Go](https://go.dev/) programs to comfortably encode +and decode [YAML](https://yaml.org/) values. + +It was originally 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. + + +## Project Status + +This project started as a fork of the extremely popular [go-yaml]( +https://github.com/go-yaml/yaml/) +project, and is being maintained by the official [YAML organization]( +https://github.com/yaml/). + +The YAML team took over ongoing maintenance and development of the project after +discussion with go-yaml's author, @niemeyer, following his decision to +[label the project repository as "unmaintained"]( +https://github.com/go-yaml/yaml/blob/944c86a7d2/README.md) in April 2025. + +We have put together a team of dedicated maintainers including representatives +of go-yaml's most important downstream projects. + +We will strive to earn the trust of the various go-yaml forks to switch back to +this repository as their upstream. + +Please [contact us](https://cloud-native.slack.com/archives/C08PPAT8PS7) if you +would like to contribute or be involved. + + +## Compatibility + +The `yaml` package supports most of YAML 1.2, but preserves some behavior from +1.1 for backwards compatibility. + +Specifically, v3 of the `yaml` package: + +* Supports YAML 1.1 bools (`yes`/`no`, `on`/`off`) as long as they are being + decoded into a typed bool value. + Otherwise they behave as a string. + Booleans in YAML 1.2 are `true`/`false` only. +* Supports octals encoded and decoded as `0777` per YAML 1.1, rather than + `0o777` as specified in YAML 1.2, because most parsers still use the old + format. + Octals in the `0o777` format are supported though, so new files work. +* Does not support base-60 floats. + These are gone from YAML 1.2, and were actually never supported by this + package as it's clearly a poor choice. + + +## Installation and Usage + +The import path for the package is *go.yaml.in/yaml/v3*. + +To install it, run: + +```bash +go get go.yaml.in/yaml/v3 +``` + + +## API Documentation + +See: + + +## API Stability + +The package API for yaml v3 will remain stable as described in [gopkg.in]( +https://gopkg.in). + + +## Example + +```go +package main + +import ( + "fmt" + "log" + + "go.yaml.in/yaml/v3" +) + +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 +``` + + +## License + +The yaml package is licensed under the MIT and Apache License 2.0 licenses. +Please see the LICENSE file for details. diff --git a/vendor/go.yaml.in/yaml/v3/apic.go b/vendor/go.yaml.in/yaml/v3/apic.go new file mode 100644 index 0000000000..05fd305da1 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/apic.go @@ -0,0 +1,747 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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), + best_width: -1, + } +} + +// 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. +func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + anchor: anchor, + } + return true +} + +// 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 compiler 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/go.yaml.in/yaml/v3/decode.go b/vendor/go.yaml.in/yaml/v3/decode.go new file mode 100644 index 0000000000..02e2b17bfe --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/decode.go @@ -0,0 +1,1018 @@ +// +// Copyright (c) 2011-2019 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. + +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "io" + "math" + "reflect" + "strconv" + "time" +) + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *Node + anchors map[string]*Node + doneInit bool + textless 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.anchors = make(map[string]*Node) + 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 + } + // It's curious choice from the underlying API to generally return a + // positive result on success, but on this case return true in an error + // scenario. This was the source of bugs in the past (issue #666). + if !yaml_parser_parse(&p.parser, &p.event) || p.parser.error != yaml_NO_ERROR { + p.fail() + } + return p.event.typ +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + 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 { + n.Anchor = string(anchor) + p.anchors[n.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 + case yaml_TAIL_COMMENT_EVENT: + panic("internal error: unexpected tail comment event (please report)") + default: + panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String()) + } +} + +func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { + var style Style + if tag != "" && tag != "!" { + tag = shortTag(tag) + style = TaggedStyle + } else if defaultTag != "" { + tag = defaultTag + } else if kind == ScalarNode { + tag, _ = resolve("", value) + } + n := &Node{ + Kind: kind, + Tag: tag, + Value: value, + Style: style, + } + if !p.textless { + n.Line = p.event.start_mark.line + 1 + n.Column = p.event.start_mark.column + 1 + n.HeadComment = string(p.event.head_comment) + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + } + return n +} + +func (p *parser) parseChild(parent *Node) *Node { + child := p.parse() + parent.Content = append(parent.Content, child) + return child +} + +func (p *parser) document() *Node { + n := p.node(DocumentNode, "", "", "") + p.doc = n + p.expect(yaml_DOCUMENT_START_EVENT) + p.parseChild(n) + if p.peek() == yaml_DOCUMENT_END_EVENT { + n.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_DOCUMENT_END_EVENT) + return n +} + +func (p *parser) alias() *Node { + n := p.node(AliasNode, "", "", string(p.event.anchor)) + n.Alias = p.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 { + var parsedStyle = p.event.scalar_style() + var nodeStyle Style + switch { + case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = DoubleQuotedStyle + case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = SingleQuotedStyle + case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0: + nodeStyle = LiteralStyle + case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0: + nodeStyle = FoldedStyle + } + var nodeValue = string(p.event.value) + var nodeTag = string(p.event.tag) + var defaultTag string + if nodeStyle == 0 { + if nodeValue == "<<" { + defaultTag = mergeTag + } + } else { + defaultTag = strTag + } + n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue) + n.Style |= nodeStyle + p.anchor(n, p.event.anchor) + p.expect(yaml_SCALAR_EVENT) + return n +} + +func (p *parser) sequence() *Node { + n := p.node(SequenceNode, seqTag, string(p.event.tag), "") + if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 { + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_SEQUENCE_START_EVENT) + for p.peek() != yaml_SEQUENCE_END_EVENT { + p.parseChild(n) + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + p.expect(yaml_SEQUENCE_END_EVENT) + return n +} + +func (p *parser) mapping() *Node { + n := p.node(MappingNode, mapTag, string(p.event.tag), "") + block := true + if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 { + block = false + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_MAPPING_START_EVENT) + for p.peek() != yaml_MAPPING_END_EVENT { + k := p.parseChild(n) + if block && k.FootComment != "" { + // Must be a foot comment for the prior value when being dedented. + if len(n.Content) > 2 { + n.Content[len(n.Content)-3].FootComment = k.FootComment + k.FootComment = "" + } + } + v := p.parseChild(n) + if k.FootComment == "" && v.FootComment != "" { + k.FootComment = v.FootComment + v.FootComment = "" + } + if p.peek() == yaml_TAIL_COMMENT_EVENT { + if k.FootComment == "" { + k.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_TAIL_COMMENT_EVENT) + } + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 { + n.Content[len(n.Content)-2].FootComment = n.FootComment + n.FootComment = "" + } + 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 + terrors []string + + stringMapType reflect.Type + generalMapType reflect.Type + + knownFields bool + uniqueKeys bool + decodeCount int + aliasCount int + aliasDepth int + + mergedFields map[interface{}]bool +} + +var ( + nodeType = reflect.TypeOf(Node{}) + durationType = reflect.TypeOf(time.Duration(0)) + stringMapType = reflect.TypeOf(map[string]interface{}{}) + generalMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = generalMapType.Elem() + timeType = reflect.TypeOf(time.Time{}) + ptrTimeType = reflect.TypeOf(&time.Time{}) +) + +func newDecoder() *decoder { + d := &decoder{ + stringMapType: stringMapType, + generalMapType: generalMapType, + uniqueKeys: true, + } + 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 != seqTag && tag != mapTag { + 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, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) { + err := u.UnmarshalYAML(n) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (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.ShortTag() == nullTag { + 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() { + outi := out.Addr().Interface() + if u, ok := outi.(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + if u, ok := outi.(obsoleteUnmarshaler); ok { + good = d.callObsoleteUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) { + if n.ShortTag() == nullTag { + return reflect.Value{} + } + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +const ( + // 400,000 decode operations is ~500kb of dense object declarations, or + // ~5kb of dense object declarations with 10000% alias expansion + alias_ratio_range_low = 400000 + + // 4,000,000 decode operations is ~5MB of dense object declarations, or + // ~4.5MB of dense object declarations with 10% alias expansion + alias_ratio_range_high = 4000000 + + // alias_ratio_range is the range over which we scale allowed alias ratios + alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) +) + +func allowedAliasRatio(decodeCount int) float64 { + switch { + case decodeCount <= alias_ratio_range_low: + // allow 99% to come from alias expansion for small-to-medium documents + return 0.99 + case decodeCount >= alias_ratio_range_high: + // allow 10% to come from alias expansion for very large documents + return 0.10 + default: + // scale smoothly from 99% down to 10% over the range. + // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. + // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). + return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) + } +} + +func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { + d.decodeCount++ + if d.aliasDepth > 0 { + d.aliasCount++ + } + if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { + failf("document contains excessive aliasing") + } + if out.Type() == nodeType { + out.Set(reflect.ValueOf(n).Elem()) + return true + } + 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) + case 0: + if n.IsZero() { + return d.null(out) + } + fallthrough + default: + failf("cannot decode node with unknown kind %d", n.Kind) + } + return good +} + +func (d *decoder) document(n *Node, out reflect.Value) (good bool) { + if len(n.Content) == 1 { + d.doc = n + d.unmarshal(n.Content[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 + d.aliasDepth++ + good = d.unmarshal(n.Alias, out) + d.aliasDepth-- + 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) null(out reflect.Value) bool { + if out.CanAddr() { + switch out.Kind() { + case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + out.Set(reflect.Zero(out.Type())) + return true + } + } + return false +} + +func (d *decoder) scalar(n *Node, out reflect.Value) bool { + var tag string + var resolved interface{} + if n.indicatedString() { + tag = strTag + resolved = n.Value + } else { + tag, resolved = resolve(n.Tag, n.Value) + if tag == binaryTag { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + return d.null(out) + } + 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 == binaryTag { + 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 == binaryTag { + out.SetString(resolved.(string)) + return true + } + out.SetString(n.Value) + return true + case reflect.Interface: + out.Set(reflect.ValueOf(resolved)) + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + // This used to work in v2, but it's very unfriendly. + isDuration := out.Type() == durationType + + switch resolved := resolved.(type) { + case int: + if !isDuration && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case int64: + if !isDuration && !out.OverflowInt(resolved) { + out.SetInt(resolved) + return true + } + case uint64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case float64: + if !isDuration && 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 string: + // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html). + // It only works if explicitly attempting to unmarshal into a typed bool value. + switch resolved { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON": + out.SetBool(true) + return true + case "n", "N", "no", "No", "NO", "off", "Off", "OFF": + out.SetBool(false) + 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: + panic("yaml internal error: please report the issue") + } + 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.Content) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Array: + if l != out.Len() { + failf("invalid array: want %d elements but got %d", out.Len(), 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, seqTag, 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.Content[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + if out.Kind() != reflect.Array { + 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) { + l := len(n.Content) + if d.uniqueKeys { + nerrs := len(d.terrors) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + for j := i + 2; j < l; j += 2 { + nj := n.Content[j] + if ni.Kind == nj.Kind && ni.Value == nj.Value { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) + } + } + } + if len(d.terrors) > nerrs { + return false + } + } + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Map: + // okay + case reflect.Interface: + iface := out + if isStringMap(n) { + out = reflect.MakeMap(d.stringMapType) + } else { + out = reflect.MakeMap(d.generalMapType) + } + iface.Set(out) + default: + d.terror(n, mapTag, out) + return false + } + + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + stringMapType := d.stringMapType + generalMapType := d.generalMapType + if outt.Elem() == ifaceType { + if outt.Key().Kind() == reflect.String { + d.stringMapType = outt + } else if outt.Key() == ifaceType { + d.generalMapType = outt + } + } + + mergedFields := d.mergedFields + d.mergedFields = nil + + var mergeNode *Node + + mapIsNew := false + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + mapIsNew = true + } + for i := 0; i < l; i += 2 { + if isMerge(n.Content[i]) { + mergeNode = n.Content[i+1] + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.Content[i], k) { + if mergedFields != nil { + ki := k.Interface() + if d.getPossiblyUnhashableKey(mergedFields, ki) { + continue + } + d.setPossiblyUnhashableKey(mergedFields, ki, true) + } + 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.Content[i+1], e) || n.Content[i+1].ShortTag() == nullTag && (mapIsNew || !out.MapIndex(k).IsValid()) { + out.SetMapIndex(k, e) + } + } + } + + d.mergedFields = mergedFields + if mergeNode != nil { + d.merge(n, mergeNode, out) + } + + d.stringMapType = stringMapType + d.generalMapType = generalMapType + return true +} + +func isStringMap(n *Node) bool { + if n.Kind != MappingNode { + return false + } + l := len(n.Content) + for i := 0; i < l; i += 2 { + shortTag := n.Content[i].ShortTag() + if shortTag != strTag && shortTag != mergeTag { + return false + } + } + return true +} + +func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + elemType = inlineMap.Type().Elem() + } + + for _, index := range sinfo.InlineUnmarshalers { + field := d.fieldByIndex(n, out, index) + d.prepare(n, field) + } + + mergedFields := d.mergedFields + d.mergedFields = nil + var mergeNode *Node + var doneFields []bool + if d.uniqueKeys { + doneFields = make([]bool, len(sinfo.FieldsList)) + } + name := settableValueOf("") + l := len(n.Content) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + if isMerge(ni) { + mergeNode = n.Content[i+1] + continue + } + if !d.unmarshal(ni, name) { + continue + } + sname := name.String() + if mergedFields != nil { + if mergedFields[sname] { + continue + } + mergedFields[sname] = true + } + if info, ok := sinfo.FieldsMap[sname]; ok { + if d.uniqueKeys { + if doneFields[info.Id] { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) + continue + } + doneFields[info.Id] = true + } + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = d.fieldByIndex(n, out, info.Inline) + } + d.unmarshal(n.Content[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.Content[i+1], value) + inlineMap.SetMapIndex(name, value) + } else if d.knownFields { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) + } + } + + d.mergedFields = mergedFields + if mergeNode != nil { + d.merge(n, mergeNode, out) + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) setPossiblyUnhashableKey(m map[interface{}]bool, key interface{}, value bool) { + defer func() { + if err := recover(); err != nil { + failf("%v", err) + } + }() + m[key] = value +} + +func (d *decoder) getPossiblyUnhashableKey(m map[interface{}]bool, key interface{}) bool { + defer func() { + if err := recover(); err != nil { + failf("%v", err) + } + }() + return m[key] +} + +func (d *decoder) merge(parent *Node, merge *Node, out reflect.Value) { + mergedFields := d.mergedFields + if mergedFields == nil { + d.mergedFields = make(map[interface{}]bool) + for i := 0; i < len(parent.Content); i += 2 { + k := reflect.New(ifaceType).Elem() + if d.unmarshal(parent.Content[i], k) { + d.setPossiblyUnhashableKey(d.mergedFields, k.Interface(), true) + } + } + } + + switch merge.Kind { + case MappingNode: + d.unmarshal(merge, out) + case AliasNode: + if merge.Alias != nil && merge.Alias.Kind != MappingNode { + failWantMap() + } + d.unmarshal(merge, out) + case SequenceNode: + for i := 0; i < len(merge.Content); i++ { + ni := merge.Content[i] + if ni.Kind == AliasNode { + if ni.Alias != nil && ni.Alias.Kind != MappingNode { + failWantMap() + } + } else if ni.Kind != MappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } + + d.mergedFields = mergedFields +} + +func isMerge(n *Node) bool { + return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag) +} diff --git a/vendor/go.yaml.in/yaml/v3/emitterc.go b/vendor/go.yaml.in/yaml/v3/emitterc.go new file mode 100644 index 0000000000..ab4e03ba72 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/emitterc.go @@ -0,0 +1,2054 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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") + } + if emitter.column == 0 { + emitter.space_above = true + } + emitter.column = 0 + emitter.line++ + // [Go] Do this here and below and drop from everywhere else (see commented lines). + emitter.indention = true + 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 + } + if emitter.column == 0 { + emitter.space_above = true + } + emitter.column = 0 + emitter.line++ + // [Go] Do this here and above and drop from everywhere else (see commented lines). + emitter.indention = true + } + 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_compact(emitter *yaml_emitter_t, flow, indentless bool, compact_seq 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 { + // [Go] This was changed so that indentations are more regular. + if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { + // The first indent inside a sequence will just skip the "- " indicator. + emitter.indent += 2 + } else { + // Everything else aligns to the chosen indentation. + emitter.indent = emitter.best_indent * ((emitter.indent + emitter.best_indent) / emitter.best_indent) + if compact_seq { + // The value compact_seq passed in is almost always set to `false` when this function is called, + // except when we are dealing with sequence nodes. So this gets triggered to subtract 2 only when we + // are increasing the indent to account for sequence nodes, which will be correct because we need to + // subtract 2 to account for the - at the beginning of the sequence node. + emitter.indent = emitter.indent - 2 + } + } + } + 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, false) + + case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) + + case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, 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 + emitter.space_above = true + emitter.foot_indent = -1 + + 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 || true { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if len(emitter.head_comment) > 0 { + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !put_break(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") +} + +// yaml_emitter_increase_indent preserves the original signature and delegates to +// yaml_emitter_increase_indent_compact without compact-sequence indentation +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + return yaml_emitter_increase_indent_compact(emitter, flow, indentless, false) +} + +// yaml_emitter_process_line_comment preserves the original signature and delegates to +// yaml_emitter_process_line_comment_linebreak passing false for linebreak +func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { + return yaml_emitter_process_line_comment_linebreak(emitter, false) +} + +// 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) + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// 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") + } + // [Go] Force document foot separation. + emitter.foot_indent = 0 + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.foot_indent = -1 + 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, trail 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 { + if emitter.canonical && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.column == 0 || emitter.canonical && !first { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail 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 { + if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + 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_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + 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 + } + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// 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 { + // emitter.mapping context tells us if we are currently in a mapping context. + // emiiter.column tells us which column we are in in the yaml output. 0 is the first char of the column. + // emitter.indentation tells us if the last character was an indentation character. + // emitter.compact_sequence_indent tells us if '- ' is considered part of the indentation for sequence elements. + // So, `seq` means that we are in a mapping context, and we are either at the first char of the column or + // the last character was not an indentation character, and we consider '- ' part of the indentation + // for sequence elements. + seq := emitter.mapping_context && (emitter.column == 0 || !emitter.indention) && + emitter.compact_sequence_indent + if !yaml_emitter_increase_indent_compact(emitter, false, false, seq) { + 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_process_head_comment(emitter) { + return false + } + 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) + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// 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 !yaml_emitter_process_head_comment(emitter) { + 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 len(emitter.line_comment) > 0 { + // [Go] A line comment was provided for the key. That's unusual as the + // scanner associates line comments with the value. Either way, + // save the line comment and render it appropriately later. + emitter.key_line_comment = emitter.line_comment + emitter.line_comment = nil + } + 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 + } + } + if len(emitter.key_line_comment) > 0 { + // [Go] Line comments are generally associated with the value, but when there's + // no value on the same line as a mapping key they end up attached to the + // key itself. + if event.typ == yaml_SCALAR_EVENT { + if len(emitter.line_comment) == 0 { + // A scalar is coming and it has no line comments by itself yet, + // so just let it handle the line comment as usual. If it has a + // line comment, we can't have both so the one from the key is lost. + emitter.line_comment = emitter.key_line_comment + emitter.key_line_comment = nil + } + } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { + // An indented block follows, so write the comment right now. + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + if !yaml_emitter_process_line_comment(emitter) { + return false + } + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 +} + +// 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 anchor. +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") +} + +// Write a head comment. +func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { + if len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { + return false + } + emitter.tail_comment = emitter.tail_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + } + + if len(emitter.head_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.head_comment) { + return false + } + emitter.head_comment = emitter.head_comment[:0] + return true +} + +// Write an line comment. +func yaml_emitter_process_line_comment_linebreak(emitter *yaml_emitter_t, linebreak bool) bool { + if len(emitter.line_comment) == 0 { + // The next 3 lines are needed to resolve an issue with leading newlines + // See https://github.com/go-yaml/yaml/issues/755 + // When linebreak is set to true, put_break will be called and will add + // the needed newline. + if linebreak && !put_break(emitter) { + return false + } + return true + } + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !yaml_emitter_write_comment(emitter, emitter.line_comment) { + return false + } + emitter.line_comment = emitter.line_comment[:0] + return true +} + +// Write a foot comment. +func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { + if len(emitter.foot_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { + return false + } + emitter.foot_comment = emitter.foot_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + return true +} + +// 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 + tab_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 value[i] == '\t' { + tab_characters = true + } else 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 || tab_characters || special_characters { + 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.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 + + if len(event.head_comment) > 0 { + emitter.head_comment = event.head_comment + } + if len(event.line_comment) > 0 { + emitter.line_comment = event.line_comment + } + if len(event.foot_comment) > 0 { + emitter.foot_comment = event.foot_comment + } + if len(event.tail_comment) > 0 { + emitter.tail_comment = event.tail_comment + } + + 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 + } + } + if emitter.foot_indent == indent { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + //emitter.indention = true + emitter.space_above = false + emitter.foot_indent = -1 + 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 len(value) > 0 && !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 + } + } + + if len(value) > 0 { + 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 !yaml_emitter_process_line_comment_linebreak(emitter, true) { + 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 !yaml_emitter_process_line_comment_linebreak(emitter, true) { + 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 +} + +func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { + breaks := false + pound := false + for i := 0; i < len(comment); { + if is_break(comment, i) { + if !write_break(emitter, comment, &i) { + return false + } + //emitter.indention = true + breaks = true + pound = false + } else { + if breaks && !yaml_emitter_write_indent(emitter) { + return false + } + if !pound { + if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { + return false + } + pound = true + } + if !write(emitter, comment, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + if !breaks && !put_break(emitter) { + return false + } + + emitter.whitespace = true + //emitter.indention = true + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/encode.go b/vendor/go.yaml.in/yaml/v3/encode.go new file mode 100644 index 0000000000..de9e72a3e6 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/encode.go @@ -0,0 +1,577 @@ +// +// Copyright (c) 2011-2019 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. + +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 + indent int + 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 + } + if e.indent == 0 { + e.indent = 4 + } + e.emitter.best_indent = e.indent + 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() + var node *Node + if in.IsValid() { + node, _ = in.Interface().(*Node) + } + if node != nil && node.Kind == DocumentNode { + e.nodev(in) + } else { + 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) { + tag = shortTag(tag) + if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + e.nilv() + return + } + iface := in.Interface() + switch value := iface.(type) { + case *Node: + e.nodev(in) + return + case Node: + if !in.CanAddr() { + var n = reflect.New(in.Type()).Elem() + n.Set(in) + in = n + } + e.nodev(in.Addr()) + return + case time.Time: + e.timev(tag, in) + return + case *time.Time: + e.timev(tag, in.Elem()) + return + case time.Duration: + e.stringv(tag, reflect.ValueOf(value.String())) + return + case Marshaler: + v, err := value.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + e.marshal(tag, reflect.ValueOf(v)) + return + case encoding.TextMarshaler: + text, err := value.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: + e.marshal(tag, in.Elem()) + case reflect.Struct: + e.structv(tag, in) + case reflect.Slice, reflect.Array: + e.slicev(tag, in) + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + 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) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) { + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + return reflect.Value{} + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +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 = e.fieldByIndex(in, info.Inline) + if !value.IsValid() { + continue + } + } + 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("cannot 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_]*)?$`) + +// isOldBool returns whether s is bool notation as defined in YAML 1.1. +// +// We continue to force strings that YAML 1.1 would interpret as booleans to be +// rendered as quotes strings so that the marshalled output valid for YAML 1.1 +// parsing. +func isOldBool(s string) (result bool) { + switch s { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", + "n", "N", "no", "No", "NO", "off", "Off", "OFF": + return true + default: + return false + } +} + +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 == binaryTag { + 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 = binaryTag + 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 == strTag && !(isBase60Float(s) || isOldBool(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"): + if e.flow { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else { + style = yaml_LITERAL_SCALAR_STYLE + } + case canUsePlain: + style = yaml_PLAIN_SCALAR_STYLE + default: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style, nil, nil, nil, nil) +} + +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, nil, nil, nil, nil) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) timev(tag string, in reflect.Value) { + t := in.Interface().(time.Time) + s := t.Format(time.RFC3339Nano) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // Issue #352: When formatting, use the precision of the underlying value + precision := 64 + if in.Kind() == reflect.Float32 { + precision = 32 + } + + s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) { + // TODO Kill this function. Replace all initialize calls by their underlining Go literals. + implicit := tag == "" + if !implicit { + tag = longTag(tag) + } + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.event.head_comment = head + e.event.line_comment = line + e.event.foot_comment = foot + e.event.tail_comment = tail + e.emit() +} + +func (e *encoder) nodev(in reflect.Value) { + e.node(in.Interface().(*Node), "") +} + +func (e *encoder) node(node *Node, tail string) { + // Zero nodes behave as nil. + if node.Kind == 0 && node.IsZero() { + e.nilv() + return + } + + // If the tag was not explicitly requested, and dropping it won't change the + // implicit tag of the value, don't include it in the presentation. + var tag = node.Tag + var stag = shortTag(tag) + var forceQuoting bool + if tag != "" && node.Style&TaggedStyle == 0 { + if node.Kind == ScalarNode { + if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { + tag = "" + } else { + rtag, _ := resolve("", node.Value) + if rtag == stag { + tag = "" + } else if stag == strTag { + tag = "" + forceQuoting = true + } + } + } else { + var rtag string + switch node.Kind { + case MappingNode: + rtag = mapTag + case SequenceNode: + rtag = seqTag + } + if rtag == stag { + tag = "" + } + } + } + + switch node.Kind { + case DocumentNode: + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + yaml_document_end_event_initialize(&e.event, true) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case SequenceNode: + style := yaml_BLOCK_SEQUENCE_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style)) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case MappingNode: + style := yaml_BLOCK_MAPPING_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style) + e.event.tail_comment = []byte(tail) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + + // The tail logic below moves the foot comment of prior keys to the following key, + // since the value for each key may be a nested structure and the foot needs to be + // processed only the entirety of the value is streamed. The last tail is processed + // with the mapping end event. + var tail string + for i := 0; i+1 < len(node.Content); i += 2 { + k := node.Content[i] + foot := k.FootComment + if foot != "" { + kopy := *k + kopy.FootComment = "" + k = &kopy + } + e.node(k, tail) + tail = foot + + v := node.Content[i+1] + e.node(v, "") + } + + yaml_mapping_end_event_initialize(&e.event) + e.event.tail_comment = []byte(tail) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case AliasNode: + yaml_alias_event_initialize(&e.event, []byte(node.Value)) + e.event.head_comment = []byte(node.HeadComment) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case ScalarNode: + value := node.Value + if !utf8.ValidString(value) { + if stag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if stag != "" { + failf("cannot marshal invalid UTF-8 data as %s", stag) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + value = encodeBase64(value) + } + + style := yaml_PLAIN_SCALAR_STYLE + switch { + case node.Style&DoubleQuotedStyle != 0: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + case node.Style&SingleQuotedStyle != 0: + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + case node.Style&LiteralStyle != 0: + style = yaml_LITERAL_SCALAR_STYLE + case node.Style&FoldedStyle != 0: + style = yaml_FOLDED_SCALAR_STYLE + case strings.Contains(value, "\n"): + style = yaml_LITERAL_SCALAR_STYLE + case forceQuoting: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) + default: + failf("cannot encode node with unknown kind %d", node.Kind) + } +} diff --git a/vendor/go.yaml.in/yaml/v3/parserc.go b/vendor/go.yaml.in/yaml/v3/parserc.go new file mode 100644 index 0000000000..25fe823637 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/parserc.go @@ -0,0 +1,1274 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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) { + token := &parser.tokens[parser.tokens_head] + yaml_parser_unfold_comments(parser, token) + return token + } + return nil +} + +// yaml_parser_unfold_comments walks through the comments queue and joins all +// comments behind the position of the provided token into the respective +// top-level comment slices in the parser. +func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) { + for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index { + comment := &parser.comments[parser.comments_head] + if len(comment.head) > 0 { + if token.typ == yaml_BLOCK_END_TOKEN { + // No heads on ends, so keep comment.head for a follow up token. + break + } + if len(parser.head_comment) > 0 { + parser.head_comment = append(parser.head_comment, '\n') + } + parser.head_comment = append(parser.head_comment, comment.head...) + } + if len(comment.foot) > 0 { + if len(parser.foot_comment) > 0 { + parser.foot_comment = append(parser.foot_comment, '\n') + } + parser.foot_comment = append(parser.foot_comment, comment.foot...) + } + if len(comment.line) > 0 { + if len(parser.line_comment) > 0 { + parser.line_comment = append(parser.line_comment, '\n') + } + parser.line_comment = append(parser.line_comment, comment.line...) + } + *comment = yaml_comment_t{} + parser.comments_head++ + } +} + +// 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 + + var head_comment []byte + if len(parser.head_comment) > 0 { + // [Go] Scan the header comment backwards, and if an empty line is found, break + // the header so the part before the last empty line goes into the + // document header, while the bottom of it goes into a follow up event. + for i := len(parser.head_comment) - 1; i > 0; i-- { + if parser.head_comment[i] == '\n' { + if i == len(parser.head_comment)-1 { + head_comment = parser.head_comment[:i] + parser.head_comment = parser.head_comment[i+1:] + break + } else if parser.head_comment[i-1] == '\n' { + head_comment = parser.head_comment[:i-1] + parser.head_comment = parser.head_comment[i+1:] + break + } + } + } + } + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + + head_comment: head_comment, + } + + } 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, + } + yaml_parser_set_event_comments(parser, event) + if len(event.head_comment) > 0 && len(event.foot_comment) == 0 { + event.foot_comment = event.head_comment + event.head_comment = nil + } + return true +} + +func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) { + event.head_comment = parser.head_comment + event.line_comment = parser.line_comment + event.foot_comment = parser.foot_comment + parser.head_comment = nil + parser.line_comment = nil + parser.foot_comment = nil + parser.tail_comment = nil + parser.stem_comment = nil +} + +// 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, + } + yaml_parser_set_event_comments(parser, event) + 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), + } + yaml_parser_set_event_comments(parser, event) + 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), + } + yaml_parser_set_event_comments(parser, event) + 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), + } + yaml_parser_set_event_comments(parser, event) + 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), + } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } + 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), + } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } + 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) + if token == nil { + return false + } + 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 + prior_head_len := len(parser.head_comment) + skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) + 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 + prior_head_len := len(parser.head_comment) + skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) + 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 +} + +// Split stem comment from head comment. +// +// When a sequence or map is found under a sequence entry, the former head comment +// is assigned to the underlying sequence or map as a whole, not the individual +// sequence or map entry as would be expected otherwise. To handle this case the +// previous head comment is moved aside as the stem comment. +func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { + if stem_len == 0 { + return + } + + token := peek_token(parser) + if token == nil || token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { + return + } + + parser.stem_comment = parser.head_comment[:stem_len] + if len(parser.head_comment) == stem_len { + parser.head_comment = nil + } else { + // Copy suffix to prevent very strange bugs if someone ever appends + // further bytes to the prefix in the stem_comment slice above. + parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...) + } +} + +// 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) + if token == nil { + return false + } + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + // [Go] A tail comment was left from the prior mapping value processed. Emit an event + // as it needs to be processed with that value and not the following key. + if len(parser.tail_comment) > 0 { + *event = yaml_event_t{ + typ: yaml_TAIL_COMMENT_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + foot_comment: parser.tail_comment, + } + parser.tail_comment = nil + return true + } + + 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, + } + yaml_parser_set_event_comments(parser, event) + 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) + if token == nil { + return false + } + 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, + } + yaml_parser_set_event_comments(parser, event) + + 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, + } + yaml_parser_set_event_comments(parser, event) + 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/go.yaml.in/yaml/v3/readerc.go b/vendor/go.yaml.in/yaml/v3/readerc.go new file mode 100644 index 0000000000..56af245366 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/readerc.go @@ -0,0 +1,434 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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") + } + + // [Go] This function was changed to guarantee the requested length size at EOF. + // The fact we need to do this is pretty awful, but the description above implies + // for that to be the case, and there are tests + + // 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) { + // [Go] ACTUALLY! Read the documentation of this function above. + // This is just broken. To return true, we need to have the + // given length in the buffer. Not doing that means every single + // check that calls this function to make sure the buffer has a + // given length is Go) panicking; or C) accessing invalid memory. + //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 + } + } + // [Go] Read the documentation of this function above. To return true, + // we need to have the given length in the buffer. Not doing that means + // every single check that calls this function to make sure the buffer + // has a given length is Go) panicking; or C) accessing invalid memory. + // This happens here due to the EOF above breaking early. + for buffer_len < length { + parser.buffer[buffer_len] = 0 + buffer_len++ + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/resolve.go b/vendor/go.yaml.in/yaml/v3/resolve.go new file mode 100644 index 0000000000..64ae888057 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/resolve.go @@ -0,0 +1,326 @@ +// +// Copyright (c) 2011-2019 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. + +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, boolTag, []string{"true", "True", "TRUE"}}, + {false, boolTag, []string{"false", "False", "FALSE"}}, + {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", mergeTag, []string{"<<"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const ( + nullTag = "!!null" + boolTag = "!!bool" + strTag = "!!str" + intTag = "!!int" + floatTag = "!!float" + timestampTag = "!!timestamp" + seqTag = "!!seq" + mapTag = "!!map" + binaryTag = "!!binary" + mergeTag = "!!merge" +) + +var longTags = make(map[string]string) +var shortTags = make(map[string]string) + +func init() { + for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} { + ltag := longTag(stag) + longTags[stag] = ltag + shortTags[ltag] = stag + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + if strings.HasPrefix(tag, longTagPrefix) { + if stag, ok := shortTags[tag]; ok { + return stag + } + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func longTag(tag string) string { + if strings.HasPrefix(tag, "!!") { + if ltag, ok := longTags[tag]; ok { + return ltag + } + return longTagPrefix + tag[2:] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag: + return true + } + return false +} + +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) + +func resolve(tag string, in string) (rtag string, out interface{}) { + tag = shortTag(tag) + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + switch tag { + case "", rtag, strTag, binaryTag: + return + case floatTag: + if rtag == intTag { + switch v := out.(type) { + case int64: + rtag = floatTag + out = float64(v) + return + case int: + rtag = floatTag + out = float64(v) + 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 != strTag && tag != binaryTag { + // 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 floatTag, 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 == timestampTag { + t, ok := parseTimestamp(in) + if ok { + return timestampTag, t + } + } + + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain, 0, 64) + if err == nil { + return intTag, uintv + } + if yamlStyleFloat.MatchString(plain) { + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return floatTag, floatv + } + } + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 2, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt("-"+plain[3:], 2, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + // Octals as introduced in version 1.2 of the spec. + // Octals from the 1.1 spec, spelled as 0777, are still + // decoded by default in v3 as well for compatibility. + // May be dropped in v4 depending on how usage evolves. + if strings.HasPrefix(plain, "0o") { + intv, err := strconv.ParseInt(plain[2:], 8, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 8, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0o") { + intv, err := strconv.ParseInt("-"+plain[3:], 8, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + default: + panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")") + } + } + return strTag, 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:5.999999999Z07:00", // RCF3339Nano with short date fields. + "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". + "2006-1-2 15:4:5.999999999", // 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/go.yaml.in/yaml/v3/scannerc.go b/vendor/go.yaml.in/yaml/v3/scannerc.go new file mode 100644 index 0000000000..30b1f08920 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/scannerc.go @@ -0,0 +1,3040 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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) { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } + 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 + parser.newlines++ + } 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]) + parser.newlines++ + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } + 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-- + parser.newlines++ + 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 { + // [Go] The comment parsing logic requires a lookahead of two tokens + // so that foot comments may be parsed in time of associating them + // with the tokens that are parsed before them, and also for line + // comments to be transformed into head comments in some edge cases. + if parser.tokens_head < len(parser.tokens)-2 { + // If a potential simple key is at the head position, we need to fetch + // the next token to disambiguate it. + head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] + if !ok { + break + } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { + return false + } else if !valid { + 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) (ok 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) + } + + scan_mark := parser.mark + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // [Go] While unrolling indents, transform the head comments of prior + // indentation levels observed after scan_start into foot comments at + // the respective indexes. + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) { + 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) + } + + comment_mark := parser.mark + if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') { + // Associate any following comments with the prior token. + comment_mark = parser.tokens[len(parser.tokens)-1].start_mark + } + defer func() { + if !ok { + return + } + if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN { + // Sequence indicators alone have no line comments. It becomes + // a head comment for whatever follows. + return + } + if !yaml_parser_scan_line_comment(parser, comment_mark) { + ok = false + return + } + }() + + // 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] TODO 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") +} + +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { + if !simple_key.possible { + return false, true + } + + // The 1.2 specification says: + // + // "If the ? indicator is omitted, parsing needs to see past the + // implicit key to recognize it as such. To limit the amount of + // lookahead required, the “:” indicator must appear at most 1024 + // Unicode characters beyond the start of the key. In addition, the key + // is restricted to a single line." + // + if 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 false, yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + return false, true + } + return true, 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 + + // + // 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), + mark: parser.mark, + } + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 + } + 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 + delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) + } + return true +} + +// max_flow_level limits the flow_level +const max_flow_level = 10000 + +// 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{ + possible: false, + required: false, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + }) + + // Increase the flow level. + parser.flow_level++ + if parser.flow_level > max_flow_level { + return yaml_parser_set_scanner_error(parser, + "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_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-- + last := len(parser.simple_keys) - 1 + delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) + parser.simple_keys = parser.simple_keys[:last] + } + return true +} + +// max_indents limits the indents stack size +const max_indents = 10000 + +// 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 + if len(parser.indents) > max_indents { + return yaml_parser_set_scanner_error(parser, + "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_indents)) + } + + // 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, scan_mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + block_mark := scan_mark + block_mark.index-- + + // Loop through the indentation levels in the stack. + for parser.indent > column { + + // [Go] Reposition the end token before potential following + // foot comments of parent blocks. For that, search + // backwards for recent comments that were at the same + // indent as the block that is ending now. + stop_index := block_mark.index + for i := len(parser.comments) - 1; i >= 0; i-- { + comment := &parser.comments[i] + + if comment.end_mark.index < stop_index { + // Don't go back beyond the start of the comment/whitespace scan, unless column < 0. + // If requested indent column is < 0, then the document is over and everything else + // is a foot anyway. + break + } + if comment.start_mark.column == parser.indent+1 { + // This is a good match. But maybe there's a former comment + // at that same indent level, so keep searching. + block_mark = comment.start_mark + } + + // While the end of the former comment matches with + // the start of the following one, we know there's + // nothing in between and scanning is still safe. + stop_index = comment.scan_mark.index + } + + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: block_mark, + end_mark: block_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{}) + + parser.simple_keys_by_tok = make(map[int]int) + + // 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, parser.mark) { + 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, parser.mark) { + 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, parser.mark) { + 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 valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { + return false + + } else if valid { + + // 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 + delete(parser.simple_keys_by_tok, simple_key.token_number) + + // 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 { + + scan_mark := parser.mark + + // 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 + } + } + + // Check if we just had a line comment under a sequence entry that + // looks more like a header to the following content. Similar to this: + // + // - # The comment + // - Some data + // + // If so, transform the line comment to a head comment and reposition. + if len(parser.comments) > 0 && len(parser.tokens) > 1 { + tokenA := parser.tokens[len(parser.tokens)-2] + tokenB := parser.tokens[len(parser.tokens)-1] + comment := &parser.comments[len(parser.comments)-1] + if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) { + // If it was in the prior line, reposition so it becomes a + // header of the follow up token. Otherwise, keep it in place + // so it becomes a header of the former. + comment.head = comment.line + comment.line = nil + if comment.start_mark.line == parser.mark.line-1 { + comment.token_mark = parser.mark + } + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + if !yaml_parser_scan_comments(parser, scan_mark) { + 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] == '#' { + // [Go] Discard this inline comment for the time being. + //if !yaml_parser_scan_line_comment(parser, start_mark) { + // return false + //} + 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] TODO 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] == '#' { + if !yaml_parser_scan_line_comment(parser, start_mark) { + return false + } + 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 + } + } + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + 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. + 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 characters 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 violates 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 +} + +func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool { + if parser.newlines > 0 { + return true + } + + var start_mark yaml_mark_t + var text []byte + + for peek := 0; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + if parser.buffer[parser.buffer_pos+peek] == '#' { + seen := parser.mark.index + peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + if len(text) == 0 { + start_mark = parser.mark + } + text = read(parser, text) + } else { + skip(parser) + } + } + } + break + } + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + token_mark: token_mark, + start_mark: start_mark, + line: text, + }) + } + return true +} + +func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool { + token := parser.tokens[len(parser.tokens)-1] + + if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 { + token = parser.tokens[len(parser.tokens)-2] + } + + var token_mark = token.start_mark + var start_mark yaml_mark_t + var next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } + + var recent_empty = false + var first_empty = parser.newlines <= 1 + + var line = parser.mark.line + var column = parser.mark.column + + var text []byte + + // The foot line is the place where a comment must start to + // still be considered as a foot of the prior content. + // If there's some content in the currently parsed line, then + // the foot is the line below it. + var foot_line = -1 + if scan_mark.line > 0 { + foot_line = parser.mark.line - parser.newlines + 1 + if parser.newlines == 0 && parser.mark.column > 1 { + foot_line++ + } + } + + var peek = 0 + for ; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + column++ + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + c := parser.buffer[parser.buffer_pos+peek] + var close_flow = parser.flow_level > 0 && (c == ']' || c == '}') + if close_flow || is_breakz(parser.buffer, parser.buffer_pos+peek) { + // Got line break or terminator. + if close_flow || !recent_empty { + if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) { + // This is the first empty line and there were no empty lines before, + // so this initial part of the comment is a foot of the prior token + // instead of being a head for the following one. Split it up. + // Alternatively, this might also be the last comment inside a flow + // scope, so it must be a footer. + if len(text) > 0 { + if start_mark.column-1 < next_indent { + // If dedented it's unrelated to the prior token. + token_mark = start_mark + } + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + } else { + if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 { + text = append(text, '\n') + } + } + } + if !is_break(parser.buffer, parser.buffer_pos+peek) { + break + } + first_empty = false + recent_empty = true + column = 0 + line++ + continue + } + + if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) { + // The comment at the different indentation is a foot of the + // preceding data rather than a head of the upcoming one. + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + + if parser.buffer[parser.buffer_pos+peek] != '#' { + break + } + + if len(text) == 0 { + start_mark = yaml_mark_t{parser.mark.index + peek, line, column} + } else { + text = append(text, '\n') + } + + recent_empty = false + + // Consume until after the consumed comment line. + seen := parser.mark.index + peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + text = read(parser, text) + } else { + skip(parser) + } + } + + peek = 0 + column = 0 + line = parser.mark.line + next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } + } + + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: start_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column}, + head: text, + }) + } + return true +} diff --git a/vendor/go.yaml.in/yaml/v3/sorter.go b/vendor/go.yaml.in/yaml/v3/sorter.go new file mode 100644 index 0000000000..9210ece7e9 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/sorter.go @@ -0,0 +1,134 @@ +// +// Copyright (c) 2011-2019 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. + +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()) + digits := false + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + digits = unicode.IsDigit(ar[i]) + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + if digits { + return al + } else { + return bl + } + } + var ai, bi int + var an, bn int64 + if ar[i] == '0' || br[i] == '0' { + for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- { + if ar[j] != '0' { + an = 1 + bn = 1 + break + } + } + } + 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/go.yaml.in/yaml/v3/writerc.go b/vendor/go.yaml.in/yaml/v3/writerc.go new file mode 100644 index 0000000000..266d0b092c --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/writerc.go @@ -0,0 +1,48 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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/go.yaml.in/yaml/v3/yaml.go b/vendor/go.yaml.in/yaml/v3/yaml.go new file mode 100644 index 0000000000..0b101cd20d --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/yaml.go @@ -0,0 +1,703 @@ +// +// Copyright (c) 2011-2019 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. + +// Package yaml implements YAML support for the Go language. +// +// Source code and other details for the project are available at GitHub: +// +// https://github.com/yaml/go-yaml +package yaml + +import ( + "errors" + "fmt" + "io" + "reflect" + "strings" + "sync" + "unicode/utf8" +) + +// The Unmarshaler interface may be implemented by types to customize their +// behavior when being unmarshaled from a YAML document. +type Unmarshaler interface { + UnmarshalYAML(value *Node) error +} + +type obsoleteUnmarshaler 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) +} + +// A Decoder reads and decodes YAML values from an input stream. +type Decoder struct { + parser *parser + knownFields bool +} + +// 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), + } +} + +// KnownFields ensures that the keys in decoded mappings to +// exist as fields in the struct being decoded into. +func (dec *Decoder) KnownFields(enable bool) { + dec.knownFields = enable +} + +// 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() + d.knownFields = dec.knownFields + 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 +} + +// Decode decodes the node and stores its data into the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (n *Node) Decode(v interface{}) (err error) { + d := newDecoder() + defer handleErr(&err) + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(n, 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() + 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 marshalled if they are exported (have an upper case +// first letter), and are marshalled 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 excluded if IsZero 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 +} + +// Encode encodes value v and stores its representation in n. +// +// See the documentation for Marshal for details about the +// conversion of Go values into YAML. +func (n *Node) Encode(v interface{}) (err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(v)) + e.finish() + p := newParser(e.out) + p.textless = true + defer p.destroy() + doc := p.parse() + *n = *doc.Content[0] + return nil +} + +// SetIndent changes the used indentation used when encoding. +func (e *Encoder) SetIndent(spaces int) { + if spaces < 0 { + panic("yaml: cannot indent to a negative number of spaces") + } + e.encoder.indent = spaces +} + +// CompactSeqIndent makes it so that '- ' is considered part of the indentation. +func (e *Encoder) CompactSeqIndent() { + e.encoder.emitter.compact_sequence_indent = true +} + +// DefaultSeqIndent makes it so that '- ' is not considered part of the indentation. +func (e *Encoder) DefaultSeqIndent() { + e.encoder.emitter.compact_sequence_indent = false +} + +// 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 ")) +} + +type Kind uint32 + +const ( + DocumentNode Kind = 1 << iota + SequenceNode + MappingNode + ScalarNode + AliasNode +) + +type Style uint32 + +const ( + TaggedStyle Style = 1 << iota + DoubleQuotedStyle + SingleQuotedStyle + LiteralStyle + FoldedStyle + FlowStyle +) + +// Node represents an element in the YAML document hierarchy. While documents +// are typically encoded and decoded into higher level types, such as structs +// and maps, Node is an intermediate representation that allows detailed +// control over the content being decoded or encoded. +// +// It's worth noting that although Node offers access into details such as +// line numbers, colums, and comments, the content when re-encoded will not +// have its original textual representation preserved. An effort is made to +// render the data plesantly, and to preserve comments near the data they +// describe, though. +// +// Values that make use of the Node type interact with the yaml package in the +// same way any other type would do, by encoding and decoding yaml data +// directly or indirectly into them. +// +// For example: +// +// var person struct { +// Name string +// Address yaml.Node +// } +// err := yaml.Unmarshal(data, &person) +// +// Or by itself: +// +// var person Node +// err := yaml.Unmarshal(data, &person) +type Node struct { + // Kind defines whether the node is a document, a mapping, a sequence, + // a scalar value, or an alias to another node. The specific data type of + // scalar nodes may be obtained via the ShortTag and LongTag methods. + Kind Kind + + // Style allows customizing the apperance of the node in the tree. + Style Style + + // Tag holds the YAML tag defining the data type for the value. + // When decoding, this field will always be set to the resolved tag, + // even when it wasn't explicitly provided in the YAML content. + // When encoding, if this field is unset the value type will be + // implied from the node properties, and if it is set, it will only + // be serialized into the representation if TaggedStyle is used or + // the implicit tag diverges from the provided one. + Tag string + + // Value holds the unescaped and unquoted represenation of the value. + Value string + + // Anchor holds the anchor name for this node, which allows aliases to point to it. + Anchor string + + // Alias holds the node that this alias points to. Only valid when Kind is AliasNode. + Alias *Node + + // Content holds contained nodes for documents, mappings, and sequences. + Content []*Node + + // HeadComment holds any comments in the lines preceding the node and + // not separated by an empty line. + HeadComment string + + // LineComment holds any comments at the end of the line where the node is in. + LineComment string + + // FootComment holds any comments following the node and before empty lines. + FootComment string + + // Line and Column hold the node position in the decoded YAML text. + // These fields are not respected when encoding the node. + Line int + Column int +} + +// IsZero returns whether the node has all of its fields unset. +func (n *Node) IsZero() bool { + return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil && + n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 +} + +// LongTag returns the long form of the tag that indicates the data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) LongTag() string { + return longTag(n.ShortTag()) +} + +// ShortTag returns the short form of the YAML tag that indicates data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) ShortTag() string { + if n.indicatedString() { + return strTag + } + if n.Tag == "" || n.Tag == "!" { + switch n.Kind { + case MappingNode: + return mapTag + case SequenceNode: + return seqTag + case AliasNode: + if n.Alias != nil { + return n.Alias.ShortTag() + } + case ScalarNode: + tag, _ := resolve("", n.Value) + return tag + case 0: + // Special case to make the zero value convenient. + if n.IsZero() { + return nullTag + } + } + return "" + } + return shortTag(n.Tag) +} + +func (n *Node) indicatedString() bool { + return n.Kind == ScalarNode && + (shortTag(n.Tag) == strTag || + (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0) +} + +// SetString is a convenience function that sets the node to a string value +// and defines its style in a pleasant way depending on its content. +func (n *Node) SetString(s string) { + n.Kind = ScalarNode + if utf8.ValidString(s) { + n.Value = s + n.Tag = strTag + } else { + n.Value = encodeBase64(s) + n.Tag = binaryTag + } + if strings.Contains(n.Value, "\n") { + n.Style = LiteralStyle + } +} + +// -------------------------------------------------------------------------- +// 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 + + // InlineUnmarshalers holds indexes to inlined fields that + // contain unmarshaler values. + InlineUnmarshalers [][]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 +var unmarshalerType reflect.Type + +func init() { + var v Unmarshaler + unmarshalerType = reflect.ValueOf(&v).Elem().Type() +} + +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 + inlineUnmarshalers := [][]int(nil) + 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, reflect.Ptr: + ftype := field.Type + for ftype.Kind() == reflect.Ptr { + ftype = ftype.Elem() + } + if ftype.Kind() != reflect.Struct { + return nil, errors.New("option ,inline may only be used on a struct or map field") + } + if reflect.PtrTo(ftype).Implements(unmarshalerType) { + inlineUnmarshalers = append(inlineUnmarshalers, []int{i}) + } else { + sinfo, err := getStructInfo(ftype) + if err != nil { + return nil, err + } + for _, index := range sinfo.InlineUnmarshalers { + inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...)) + } + 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 may only be used on a struct or map 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, + InlineUnmarshalers: inlineUnmarshalers, + } + + 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/go.yaml.in/yaml/v3/yamlh.go b/vendor/go.yaml.in/yaml/v3/yamlh.go new file mode 100644 index 0000000000..f59aa40f64 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/yamlh.go @@ -0,0 +1,811 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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 = 0 + + yaml_PLAIN_SCALAR_STYLE yaml_scalar_style_t = 1 << iota // 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. + yaml_TAIL_COMMENT_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", + yaml_TAIL_COMMENT_EVENT: "tail comment", +} + +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 comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + // 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. + + newlines int // The number of line breaks since last non-break/non-blank character + + 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. + + // Comments + + head_comment []byte // The current head comments + line_comment []byte // The current line comments + foot_comment []byte // The current foot comments + tail_comment []byte // Foot comment that happens at the end of a block. + stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc) + + comments []yaml_comment_t // The folded comments for all parsed tokens + comments_head int + + // 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. + simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number + + // 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. +} + +type yaml_comment_t struct { + scan_mark yaml_mark_t // Position where scanning for comments started + token_mark yaml_mark_t // Position after which tokens will be associated with this comment + start_mark yaml_mark_t // Position of '#' comment mark + end_mark yaml_mark_t // Position where comment terminated + + head []byte + line []byte + foot []byte +} + +// 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_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out + 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_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out + 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. + + compact_sequence_indent bool // Is '- ' is considered part of the indentation for sequence elements? + + 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? + + space_above bool // Is there's an empty line above? + foot_indent int // The indent used to write the foot comment above, or -1 if none. + + // 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. + } + + // Comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + key_line_comment []byte + + // 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/go.yaml.in/yaml/v3/yamlprivateh.go b/vendor/go.yaml.in/yaml/v3/yamlprivateh.go new file mode 100644 index 0000000000..dea1ba9610 --- /dev/null +++ b/vendor/go.yaml.in/yaml/v3/yamlprivateh.go @@ -0,0 +1,198 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 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. + +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/golang.org/x/crypto/salsa20/salsa/hsalsa20.go b/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go index 3685b34458..75df77406d 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go +++ b/vendor/golang.org/x/crypto/salsa20/salsa/hsalsa20.go @@ -3,6 +3,10 @@ // license that can be found in the LICENSE file. // Package salsa provides low-level access to functions in the Salsa family. +// +// Deprecated: this package exposes unsafe low-level operations. New applications +// should consider using the AEAD construction in golang.org/x/crypto/chacha20poly1305 +// instead. Existing users should migrate to golang.org/x/crypto/salsa20. package salsa import "math/bits" diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go index 04c6bec210..12f2273706 100644 --- a/vendor/golang.org/x/net/html/escape.go +++ b/vendor/golang.org/x/net/html/escape.go @@ -299,7 +299,7 @@ func escape(w writer, s string) error { case '\r': esc = " " default: - panic("unrecognized escape character") + panic("html: unrecognized escape character") } s = s[i+1:] if _, err := w.WriteString(esc); err != nil { diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go index 518ee4c94e..88fc0056a3 100644 --- a/vendor/golang.org/x/net/html/parse.go +++ b/vendor/golang.org/x/net/html/parse.go @@ -136,7 +136,7 @@ func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { return -1 } default: - panic("unreachable") + panic(fmt.Sprintf("html: internal error: indexOfElementInScope unknown scope: %d", s)) } } switch s { @@ -179,7 +179,7 @@ func (p *parser) clearStackToContext(s scope) { return } default: - panic("unreachable") + panic(fmt.Sprintf("html: internal error: clearStackToContext unknown scope: %d", s)) } } } @@ -231,7 +231,14 @@ func (p *parser) addChild(n *Node) { } if n.Type == ElementNode { - p.oe = append(p.oe, n) + p.insertOpenElement(n) + } +} + +func (p *parser) insertOpenElement(n *Node) { + p.oe = append(p.oe, n) + if len(p.oe) > 512 { + panic("html: open stack of elements exceeds 512 nodes") } } @@ -810,7 +817,7 @@ func afterHeadIM(p *parser) bool { p.im = inFramesetIM return true case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Template, a.Title: - p.oe = append(p.oe, p.head) + p.insertOpenElement(p.head) defer p.oe.remove(p.head) return inHeadIM(p) case a.Head: @@ -1678,7 +1685,7 @@ func inTableBodyIM(p *parser) bool { return inTableIM(p) } -// Section 12.2.6.4.14. +// Section 13.2.6.4.14. func inRowIM(p *parser) bool { switch p.tok.Type { case StartTagToken: @@ -1690,7 +1697,9 @@ func inRowIM(p *parser) bool { p.im = inCellIM return true case a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr: - if p.popUntil(tableScope, a.Tr) { + if p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() p.im = inTableBodyIM return false } @@ -1700,22 +1709,28 @@ func inRowIM(p *parser) bool { case EndTagToken: switch p.tok.DataAtom { case a.Tr: - if p.popUntil(tableScope, a.Tr) { + if p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() p.im = inTableBodyIM return true } // Ignore the token. return true case a.Table: - if p.popUntil(tableScope, a.Tr) { + if p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() p.im = inTableBodyIM return false } // Ignore the token. return true case a.Tbody, a.Tfoot, a.Thead: - if p.elementInScope(tableScope, p.tok.DataAtom) { - p.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String()) + if p.elementInScope(tableScope, p.tok.DataAtom) && p.elementInScope(tableScope, a.Tr) { + p.clearStackToContext(tableRowScope) + p.oe.pop() + p.im = inTableBodyIM return false } // Ignore the token. @@ -2222,16 +2237,20 @@ func parseForeignContent(p *parser) bool { p.acknowledgeSelfClosingTag() } case EndTagToken: + if strings.EqualFold(p.oe[len(p.oe)-1].Data, p.tok.Data) { + p.oe = p.oe[:len(p.oe)-1] + return true + } for i := len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].Namespace == "" { - return p.im(p) - } if strings.EqualFold(p.oe[i].Data, p.tok.Data) { p.oe = p.oe[:i] + return true + } + if i > 0 && p.oe[i-1].Namespace == "" { break } } - return true + return p.im(p) default: // Ignore the token. } @@ -2312,9 +2331,13 @@ func (p *parser) parseCurrentToken() { } } -func (p *parser) parse() error { +func (p *parser) parse() (err error) { + defer func() { + if panicErr := recover(); panicErr != nil { + err = fmt.Errorf("%s", panicErr) + } + }() // Iterate until EOF. Any other error will cause an early return. - var err error for err != io.EOF { // CDATA sections are allowed only in foreign content. n := p.oe.top() @@ -2343,6 +2366,8 @@ func (p *parser) parse() error { // s. Conversely, explicit s in r's data can be silently dropped, // with no corresponding node in the resulting tree. // +// Parse will reject HTML that is nested deeper than 512 elements. +// // The input is assumed to be UTF-8 encoded. func Parse(r io.Reader) (*Node, error) { return ParseWithOptions(r) diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go index e8c1233455..0157d89e1f 100644 --- a/vendor/golang.org/x/net/html/render.go +++ b/vendor/golang.org/x/net/html/render.go @@ -184,7 +184,7 @@ func render1(w writer, n *Node) error { return err } - // Add initial newline where there is danger of a newline beging ignored. + // Add initial newline where there is danger of a newline being ignored. if c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, "\n") { switch n.Data { case "pre", "listing", "textarea": diff --git a/vendor/golang.org/x/net/http2/config.go b/vendor/golang.org/x/net/http2/config.go index 02fe0c2d48..8a7a89d016 100644 --- a/vendor/golang.org/x/net/http2/config.go +++ b/vendor/golang.org/x/net/http2/config.go @@ -27,6 +27,7 @@ import ( // - If the resulting value is zero or out of range, use a default. type http2Config struct { MaxConcurrentStreams uint32 + StrictMaxConcurrentRequests bool MaxDecoderHeaderTableSize uint32 MaxEncoderHeaderTableSize uint32 MaxReadFrameSize uint32 @@ -64,12 +65,13 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config { // (the net/http Transport). func configFromTransport(h2 *Transport) http2Config { conf := http2Config{ - MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize, - MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize, - MaxReadFrameSize: h2.MaxReadFrameSize, - SendPingTimeout: h2.ReadIdleTimeout, - PingTimeout: h2.PingTimeout, - WriteByteTimeout: h2.WriteByteTimeout, + StrictMaxConcurrentRequests: h2.StrictMaxConcurrentStreams, + MaxEncoderHeaderTableSize: h2.MaxEncoderHeaderTableSize, + MaxDecoderHeaderTableSize: h2.MaxDecoderHeaderTableSize, + MaxReadFrameSize: h2.MaxReadFrameSize, + SendPingTimeout: h2.ReadIdleTimeout, + PingTimeout: h2.PingTimeout, + WriteByteTimeout: h2.WriteByteTimeout, } // Unlike most config fields, where out-of-range values revert to the default, @@ -128,6 +130,9 @@ func fillNetHTTPConfig(conf *http2Config, h2 *http.HTTP2Config) { if h2.MaxConcurrentStreams != 0 { conf.MaxConcurrentStreams = uint32(h2.MaxConcurrentStreams) } + if http2ConfigStrictMaxConcurrentRequests(h2) { + conf.StrictMaxConcurrentRequests = true + } if h2.MaxEncoderHeaderTableSize != 0 { conf.MaxEncoderHeaderTableSize = uint32(h2.MaxEncoderHeaderTableSize) } diff --git a/vendor/golang.org/x/net/http2/config_go125.go b/vendor/golang.org/x/net/http2/config_go125.go new file mode 100644 index 0000000000..b4373fe33c --- /dev/null +++ b/vendor/golang.org/x/net/http2/config_go125.go @@ -0,0 +1,15 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.26 + +package http2 + +import ( + "net/http" +) + +func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool { + return false +} diff --git a/vendor/golang.org/x/net/http2/config_go126.go b/vendor/golang.org/x/net/http2/config_go126.go new file mode 100644 index 0000000000..6b071c149d --- /dev/null +++ b/vendor/golang.org/x/net/http2/config_go126.go @@ -0,0 +1,15 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.26 + +package http2 + +import ( + "net/http" +) + +func http2ConfigStrictMaxConcurrentRequests(h2 *http.HTTP2Config) bool { + return h2.StrictMaxConcurrentRequests +} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index db3264da8c..93bcaab03a 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -347,7 +347,7 @@ func (fr *Framer) maxHeaderListSize() uint32 { func (f *Framer) startWrite(ftype FrameType, flags Flags, streamID uint32) { // Write the FrameHeader. f.wbuf = append(f.wbuf[:0], - 0, // 3 bytes of length, filled in in endWrite + 0, // 3 bytes of length, filled in endWrite 0, 0, byte(ftype), @@ -1152,6 +1152,15 @@ type PriorityFrame struct { PriorityParam } +var defaultRFC9218Priority = PriorityParam{ + incremental: 0, + urgency: 3, +} + +// Note that HTTP/2 has had two different prioritization schemes, and +// PriorityParam struct below is a superset of both schemes. The exported +// symbols are from RFC 7540 and the non-exported ones are from RFC 9218. + // PriorityParam are the stream prioritzation parameters. type PriorityParam struct { // StreamDep is a 31-bit stream identifier for the @@ -1167,6 +1176,20 @@ type PriorityParam struct { // the spec, "Add one to the value to obtain a weight between // 1 and 256." Weight uint8 + + // "The urgency (u) parameter value is Integer (see Section 3.3.1 of + // [STRUCTURED-FIELDS]), between 0 and 7 inclusive, in descending order of + // priority. The default is 3." + urgency uint8 + + // "The incremental (i) parameter value is Boolean (see Section 3.3.6 of + // [STRUCTURED-FIELDS]). It indicates if an HTTP response can be processed + // incrementally, i.e., provide some meaningful output as chunks of the + // response arrive." + // + // We use uint8 (i.e. 0 is false, 1 is true) instead of bool so we can + // avoid unnecessary type conversions and because either type takes 1 byte. + incremental uint8 } func (p PriorityParam) IsZero() bool { diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index 6878f8ecc9..105fe12fef 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -34,7 +34,6 @@ var ( VerboseLogs bool logFrameWrites bool logFrameReads bool - inTests bool // Enabling extended CONNECT by causes browsers to attempt to use // WebSockets-over-HTTP/2. This results in problems when the server's websocket diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 64085f6e16..bdc5520ebd 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -181,6 +181,10 @@ type Server struct { type serverInternalState struct { mu sync.Mutex activeConns map[*serverConn]struct{} + + // Pool of error channels. This is per-Server rather than global + // because channels can't be reused across synctest bubbles. + errChanPool sync.Pool } func (s *serverInternalState) registerConn(sc *serverConn) { @@ -212,6 +216,27 @@ func (s *serverInternalState) startGracefulShutdown() { s.mu.Unlock() } +// Global error channel pool used for uninitialized Servers. +// We use a per-Server pool when possible to avoid using channels across synctest bubbles. +var errChanPool = sync.Pool{ + New: func() any { return make(chan error, 1) }, +} + +func (s *serverInternalState) getErrChan() chan error { + if s == nil { + return errChanPool.Get().(chan error) // Server used without calling ConfigureServer + } + return s.errChanPool.Get().(chan error) +} + +func (s *serverInternalState) putErrChan(ch chan error) { + if s == nil { + errChanPool.Put(ch) // Server used without calling ConfigureServer + return + } + s.errChanPool.Put(ch) +} + // ConfigureServer adds HTTP/2 support to a net/http Server. // // The configuration conf may be nil. @@ -224,7 +249,10 @@ func ConfigureServer(s *http.Server, conf *Server) error { if conf == nil { conf = new(Server) } - conf.state = &serverInternalState{activeConns: make(map[*serverConn]struct{})} + conf.state = &serverInternalState{ + activeConns: make(map[*serverConn]struct{}), + errChanPool: sync.Pool{New: func() any { return make(chan error, 1) }}, + } if h1, h2 := s, conf; h2.IdleTimeout == 0 { if h1.IdleTimeout != 0 { h2.IdleTimeout = h1.IdleTimeout @@ -1124,25 +1152,6 @@ func (sc *serverConn) readPreface() error { } } -var errChanPool = sync.Pool{ - New: func() interface{} { return make(chan error, 1) }, -} - -func getErrChan() chan error { - if inTests { - // Channels cannot be reused across synctest tests. - return make(chan error, 1) - } else { - return errChanPool.Get().(chan error) - } -} - -func putErrChan(ch chan error) { - if !inTests { - errChanPool.Put(ch) - } -} - var writeDataPool = sync.Pool{ New: func() interface{} { return new(writeData) }, } @@ -1150,7 +1159,7 @@ var writeDataPool = sync.Pool{ // writeDataFromHandler writes DATA response frames from a handler on // the given stream. func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStream bool) error { - ch := getErrChan() + ch := sc.srv.state.getErrChan() writeArg := writeDataPool.Get().(*writeData) *writeArg = writeData{stream.id, data, endStream} err := sc.writeFrameFromHandler(FrameWriteRequest{ @@ -1182,7 +1191,7 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea return errStreamClosed } } - putErrChan(ch) + sc.srv.state.putErrChan(ch) if frameWriteDone { writeDataPool.Put(writeArg) } @@ -2436,7 +2445,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro // waiting for this frame to be written, so an http.Flush mid-handler // writes out the correct value of keys, before a handler later potentially // mutates it. - errc = getErrChan() + errc = sc.srv.state.getErrChan() } if err := sc.writeFrameFromHandler(FrameWriteRequest{ write: headerData, @@ -2448,7 +2457,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro if errc != nil { select { case err := <-errc: - putErrChan(errc) + sc.srv.state.putErrChan(errc) return err case <-sc.doneServing: return errClientDisconnected @@ -3129,7 +3138,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error { method: opts.Method, url: u, header: cloneHeader(opts.Header), - done: getErrChan(), + done: sc.srv.state.getErrChan(), } select { @@ -3146,7 +3155,7 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error { case <-st.cw: return errStreamClosed case err := <-msg.done: - putErrChan(msg.done) + sc.srv.state.putErrChan(msg.done) return err } } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 35e3902519..be759b6065 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -355,6 +355,7 @@ type ClientConn struct { readIdleTimeout time.Duration pingTimeout time.Duration extendedConnectAllowed bool + strictMaxConcurrentStreams bool // rstStreamPingsBlocked works around an unfortunate gRPC behavior. // gRPC strictly limits the number of PING frames that it will receive. @@ -784,7 +785,8 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro initialWindowSize: 65535, // spec default initialStreamRecvWindowSize: conf.MaxUploadBufferPerStream, maxConcurrentStreams: initialMaxConcurrentStreams, // "infinite", per spec. Use a smaller value until we have received server settings. - peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. + strictMaxConcurrentStreams: conf.StrictMaxConcurrentRequests, + peerMaxHeaderListSize: 0xffffffffffffffff, // "infinite", per spec. Use 2^64-1 instead. streams: make(map[uint32]*clientStream), singleUse: singleUse, seenSettingsChan: make(chan struct{}), @@ -1018,7 +1020,7 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { return } var maxConcurrentOkay bool - if cc.t.StrictMaxConcurrentStreams { + if cc.strictMaxConcurrentStreams { // We'll tell the caller we can take a new request to // prevent the caller from dialing a new TCP // connection, but then we'll block later before diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go index cc893adc29..4d3890f99a 100644 --- a/vendor/golang.org/x/net/http2/writesched.go +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -42,6 +42,8 @@ type OpenStreamOptions struct { // PusherID is zero if the stream was initiated by the client. Otherwise, // PusherID names the stream that pushed the newly opened stream. PusherID uint32 + // priority is used to set the priority of the newly opened stream. + priority PriorityParam } // FrameWriteRequest is a request to write a frame. diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go similarity index 78% rename from vendor/golang.org/x/net/http2/writesched_priority.go rename to vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go index f6783339d1..6d24d6a1b9 100644 --- a/vendor/golang.org/x/net/http2/writesched_priority.go +++ b/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go @@ -11,7 +11,7 @@ import ( ) // RFC 7540, Section 5.3.5: the default weight is 16. -const priorityDefaultWeight = 15 // 16 = 15 + 1 +const priorityDefaultWeightRFC7540 = 15 // 16 = 15 + 1 // PriorityWriteSchedulerConfig configures a priorityWriteScheduler. type PriorityWriteSchedulerConfig struct { @@ -66,8 +66,8 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler } } - ws := &priorityWriteScheduler{ - nodes: make(map[uint32]*priorityNode), + ws := &priorityWriteSchedulerRFC7540{ + nodes: make(map[uint32]*priorityNodeRFC7540), maxClosedNodesInTree: cfg.MaxClosedNodesInTree, maxIdleNodesInTree: cfg.MaxIdleNodesInTree, enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, @@ -81,32 +81,32 @@ func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler return ws } -type priorityNodeState int +type priorityNodeStateRFC7540 int const ( - priorityNodeOpen priorityNodeState = iota - priorityNodeClosed - priorityNodeIdle + priorityNodeOpenRFC7540 priorityNodeStateRFC7540 = iota + priorityNodeClosedRFC7540 + priorityNodeIdleRFC7540 ) -// priorityNode is a node in an HTTP/2 priority tree. +// priorityNodeRFC7540 is a node in an HTTP/2 priority tree. // Each node is associated with a single stream ID. // See RFC 7540, Section 5.3. -type priorityNode struct { - q writeQueue // queue of pending frames to write - id uint32 // id of the stream, or 0 for the root of the tree - weight uint8 // the actual weight is weight+1, so the value is in [1,256] - state priorityNodeState // open | closed | idle - bytes int64 // number of bytes written by this node, or 0 if closed - subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree +type priorityNodeRFC7540 struct { + q writeQueue // queue of pending frames to write + id uint32 // id of the stream, or 0 for the root of the tree + weight uint8 // the actual weight is weight+1, so the value is in [1,256] + state priorityNodeStateRFC7540 // open | closed | idle + bytes int64 // number of bytes written by this node, or 0 if closed + subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree // These links form the priority tree. - parent *priorityNode - kids *priorityNode // start of the kids list - prev, next *priorityNode // doubly-linked list of siblings + parent *priorityNodeRFC7540 + kids *priorityNodeRFC7540 // start of the kids list + prev, next *priorityNodeRFC7540 // doubly-linked list of siblings } -func (n *priorityNode) setParent(parent *priorityNode) { +func (n *priorityNodeRFC7540) setParent(parent *priorityNodeRFC7540) { if n == parent { panic("setParent to self") } @@ -141,7 +141,7 @@ func (n *priorityNode) setParent(parent *priorityNode) { } } -func (n *priorityNode) addBytes(b int64) { +func (n *priorityNodeRFC7540) addBytes(b int64) { n.bytes += b for ; n != nil; n = n.parent { n.subtreeBytes += b @@ -154,7 +154,7 @@ func (n *priorityNode) addBytes(b int64) { // // f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true // if any ancestor p of n is still open (ignoring the root node). -func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { +func (n *priorityNodeRFC7540) walkReadyInOrder(openParent bool, tmp *[]*priorityNodeRFC7540, f func(*priorityNodeRFC7540, bool) bool) bool { if !n.q.empty() && f(n, openParent) { return true } @@ -165,7 +165,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f // Don't consider the root "open" when updating openParent since // we can't send data frames on the root stream (only control frames). if n.id != 0 { - openParent = openParent || (n.state == priorityNodeOpen) + openParent = openParent || (n.state == priorityNodeOpenRFC7540) } // Common case: only one kid or all kids have the same weight. @@ -195,7 +195,7 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f *tmp = append(*tmp, n.kids) n.kids.setParent(nil) } - sort.Sort(sortPriorityNodeSiblings(*tmp)) + sort.Sort(sortPriorityNodeSiblingsRFC7540(*tmp)) for i := len(*tmp) - 1; i >= 0; i-- { (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids } @@ -207,11 +207,11 @@ func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f return false } -type sortPriorityNodeSiblings []*priorityNode +type sortPriorityNodeSiblingsRFC7540 []*priorityNodeRFC7540 -func (z sortPriorityNodeSiblings) Len() int { return len(z) } -func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } -func (z sortPriorityNodeSiblings) Less(i, k int) bool { +func (z sortPriorityNodeSiblingsRFC7540) Len() int { return len(z) } +func (z sortPriorityNodeSiblingsRFC7540) Swap(i, k int) { z[i], z[k] = z[k], z[i] } +func (z sortPriorityNodeSiblingsRFC7540) Less(i, k int) bool { // Prefer the subtree that has sent fewer bytes relative to its weight. // See sections 5.3.2 and 5.3.4. wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) @@ -225,13 +225,13 @@ func (z sortPriorityNodeSiblings) Less(i, k int) bool { return bi/bk <= wi/wk } -type priorityWriteScheduler struct { +type priorityWriteSchedulerRFC7540 struct { // root is the root of the priority tree, where root.id = 0. // The root queues control frames that are not associated with any stream. - root priorityNode + root priorityNodeRFC7540 // nodes maps stream ids to priority tree nodes. - nodes map[uint32]*priorityNode + nodes map[uint32]*priorityNodeRFC7540 // maxID is the maximum stream id in nodes. maxID uint32 @@ -239,7 +239,7 @@ type priorityWriteScheduler struct { // lists of nodes that have been closed or are idle, but are kept in // the tree for improved prioritization. When the lengths exceed either // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. - closedNodes, idleNodes []*priorityNode + closedNodes, idleNodes []*priorityNodeRFC7540 // From the config. maxClosedNodesInTree int @@ -248,19 +248,19 @@ type priorityWriteScheduler struct { enableWriteThrottle bool // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. - tmp []*priorityNode + tmp []*priorityNodeRFC7540 // pool of empty queues for reuse. queuePool writeQueuePool } -func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { +func (ws *priorityWriteSchedulerRFC7540) OpenStream(streamID uint32, options OpenStreamOptions) { // The stream may be currently idle but cannot be opened or closed. if curr := ws.nodes[streamID]; curr != nil { - if curr.state != priorityNodeIdle { + if curr.state != priorityNodeIdleRFC7540 { panic(fmt.Sprintf("stream %d already opened", streamID)) } - curr.state = priorityNodeOpen + curr.state = priorityNodeOpenRFC7540 return } @@ -272,11 +272,11 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream if parent == nil { parent = &ws.root } - n := &priorityNode{ + n := &priorityNodeRFC7540{ q: *ws.queuePool.get(), id: streamID, - weight: priorityDefaultWeight, - state: priorityNodeOpen, + weight: priorityDefaultWeightRFC7540, + state: priorityNodeOpenRFC7540, } n.setParent(parent) ws.nodes[streamID] = n @@ -285,19 +285,19 @@ func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStream } } -func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { +func (ws *priorityWriteSchedulerRFC7540) CloseStream(streamID uint32) { if streamID == 0 { panic("violation of WriteScheduler interface: cannot close stream 0") } if ws.nodes[streamID] == nil { panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) } - if ws.nodes[streamID].state != priorityNodeOpen { + if ws.nodes[streamID].state != priorityNodeOpenRFC7540 { panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) } n := ws.nodes[streamID] - n.state = priorityNodeClosed + n.state = priorityNodeClosedRFC7540 n.addBytes(-n.bytes) q := n.q @@ -310,7 +310,7 @@ func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { } } -func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { +func (ws *priorityWriteSchedulerRFC7540) AdjustStream(streamID uint32, priority PriorityParam) { if streamID == 0 { panic("adjustPriority on root") } @@ -324,11 +324,11 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit return } ws.maxID = streamID - n = &priorityNode{ + n = &priorityNodeRFC7540{ q: *ws.queuePool.get(), id: streamID, - weight: priorityDefaultWeight, - state: priorityNodeIdle, + weight: priorityDefaultWeightRFC7540, + state: priorityNodeIdleRFC7540, } n.setParent(&ws.root) ws.nodes[streamID] = n @@ -340,7 +340,7 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit parent := ws.nodes[priority.StreamDep] if parent == nil { n.setParent(&ws.root) - n.weight = priorityDefaultWeight + n.weight = priorityDefaultWeightRFC7540 return } @@ -381,8 +381,8 @@ func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority Priorit n.weight = priority.Weight } -func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { - var n *priorityNode +func (ws *priorityWriteSchedulerRFC7540) Push(wr FrameWriteRequest) { + var n *priorityNodeRFC7540 if wr.isControl() { n = &ws.root } else { @@ -401,8 +401,8 @@ func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { n.q.push(wr) } -func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { - ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { +func (ws *priorityWriteSchedulerRFC7540) Pop() (wr FrameWriteRequest, ok bool) { + ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNodeRFC7540, openParent bool) bool { limit := int32(math.MaxInt32) if openParent { limit = ws.writeThrottleLimit @@ -428,7 +428,7 @@ func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { return wr, ok } -func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { +func (ws *priorityWriteSchedulerRFC7540) addClosedOrIdleNode(list *[]*priorityNodeRFC7540, maxSize int, n *priorityNodeRFC7540) { if maxSize == 0 { return } @@ -442,7 +442,7 @@ func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, max *list = append(*list, n) } -func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { +func (ws *priorityWriteSchedulerRFC7540) removeNode(n *priorityNodeRFC7540) { for n.kids != nil { n.kids.setParent(n.parent) } diff --git a/vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go b/vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go new file mode 100644 index 0000000000..9b5b8808eb --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_priority_rfc9128.go @@ -0,0 +1,209 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package http2 + +import ( + "fmt" + "math" +) + +type streamMetadata struct { + location *writeQueue + priority PriorityParam +} + +type priorityWriteSchedulerRFC9218 struct { + // control contains control frames (SETTINGS, PING, etc.). + control writeQueue + + // heads contain the head of a circular list of streams. + // We put these heads within a nested array that represents urgency and + // incremental, as defined in + // https://www.rfc-editor.org/rfc/rfc9218.html#name-priority-parameters. + // 8 represents u=0 up to u=7, and 2 represents i=false and i=true. + heads [8][2]*writeQueue + + // streams contains a mapping between each stream ID and their metadata, so + // we can quickly locate them when needing to, for example, adjust their + // priority. + streams map[uint32]streamMetadata + + // queuePool are empty queues for reuse. + queuePool writeQueuePool + + // prioritizeIncremental is used to determine whether we should prioritize + // incremental streams or not, when urgency is the same in a given Pop() + // call. + prioritizeIncremental bool +} + +func newPriorityWriteSchedulerRFC9128() WriteScheduler { + ws := &priorityWriteSchedulerRFC9218{ + streams: make(map[uint32]streamMetadata), + } + return ws +} + +func (ws *priorityWriteSchedulerRFC9218) OpenStream(streamID uint32, opt OpenStreamOptions) { + if ws.streams[streamID].location != nil { + panic(fmt.Errorf("stream %d already opened", streamID)) + } + q := ws.queuePool.get() + ws.streams[streamID] = streamMetadata{ + location: q, + priority: opt.priority, + } + + u, i := opt.priority.urgency, opt.priority.incremental + if ws.heads[u][i] == nil { + ws.heads[u][i] = q + q.next = q + q.prev = q + } else { + // Queues are stored in a ring. + // Insert the new stream before ws.head, putting it at the end of the list. + q.prev = ws.heads[u][i].prev + q.next = ws.heads[u][i] + q.prev.next = q + q.next.prev = q + } +} + +func (ws *priorityWriteSchedulerRFC9218) CloseStream(streamID uint32) { + metadata := ws.streams[streamID] + q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental + if q == nil { + return + } + if q.next == q { + // This was the only open stream. + ws.heads[u][i] = nil + } else { + q.prev.next = q.next + q.next.prev = q.prev + if ws.heads[u][i] == q { + ws.heads[u][i] = q.next + } + } + delete(ws.streams, streamID) + ws.queuePool.put(q) +} + +func (ws *priorityWriteSchedulerRFC9218) AdjustStream(streamID uint32, priority PriorityParam) { + metadata := ws.streams[streamID] + q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental + if q == nil { + return + } + + // Remove stream from current location. + if q.next == q { + // This was the only open stream. + ws.heads[u][i] = nil + } else { + q.prev.next = q.next + q.next.prev = q.prev + if ws.heads[u][i] == q { + ws.heads[u][i] = q.next + } + } + + // Insert stream to the new queue. + u, i = priority.urgency, priority.incremental + if ws.heads[u][i] == nil { + ws.heads[u][i] = q + q.next = q + q.prev = q + } else { + // Queues are stored in a ring. + // Insert the new stream before ws.head, putting it at the end of the list. + q.prev = ws.heads[u][i].prev + q.next = ws.heads[u][i] + q.prev.next = q + q.next.prev = q + } + + // Update the metadata. + ws.streams[streamID] = streamMetadata{ + location: q, + priority: priority, + } +} + +func (ws *priorityWriteSchedulerRFC9218) Push(wr FrameWriteRequest) { + if wr.isControl() { + ws.control.push(wr) + return + } + q := ws.streams[wr.StreamID()].location + if q == nil { + // This is a closed stream. + // wr should not be a HEADERS or DATA frame. + // We push the request onto the control queue. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + ws.control.push(wr) + return + } + q.push(wr) +} + +func (ws *priorityWriteSchedulerRFC9218) Pop() (FrameWriteRequest, bool) { + // Control and RST_STREAM frames first. + if !ws.control.empty() { + return ws.control.shift(), true + } + + // On the next Pop(), we want to prioritize incremental if we prioritized + // non-incremental request of the same urgency this time. Vice-versa. + // i.e. when there are incremental and non-incremental requests at the same + // priority, we give 50% of our bandwidth to the incremental ones in + // aggregate and 50% to the first non-incremental one (since + // non-incremental streams do not use round-robin writes). + ws.prioritizeIncremental = !ws.prioritizeIncremental + + // Always prioritize lowest u (i.e. highest urgency level). + for u := range ws.heads { + for i := range ws.heads[u] { + // When we want to prioritize incremental, we try to pop i=true + // first before i=false when u is the same. + if ws.prioritizeIncremental { + i = (i + 1) % 2 + } + q := ws.heads[u][i] + if q == nil { + continue + } + for { + if wr, ok := q.consume(math.MaxInt32); ok { + if i == 1 { + // For incremental streams, we update head to q.next so + // we can round-robin between multiple streams that can + // immediately benefit from partial writes. + ws.heads[u][i] = q.next + } else { + // For non-incremental streams, we try to finish one to + // completion rather than doing round-robin. However, + // we update head here so that if q.consume() is !ok + // (e.g. the stream has no more frame to consume), head + // is updated to the next q that has frames to consume + // on future iterations. This way, we do not prioritize + // writing to unavailable stream on next Pop() calls, + // preventing head-of-line blocking. + ws.heads[u][i] = q + } + return wr, true + } + q = q.next + if q == ws.heads[u][i] { + break + } + } + + } + } + return FrameWriteRequest{}, false +} diff --git a/vendor/golang.org/x/net/http2/writesched_roundrobin.go b/vendor/golang.org/x/net/http2/writesched_roundrobin.go index 54fe86322d..737cff9ecb 100644 --- a/vendor/golang.org/x/net/http2/writesched_roundrobin.go +++ b/vendor/golang.org/x/net/http2/writesched_roundrobin.go @@ -25,7 +25,7 @@ type roundRobinWriteScheduler struct { } // newRoundRobinWriteScheduler constructs a new write scheduler. -// The round robin scheduler priorizes control frames +// The round robin scheduler prioritizes control frames // like SETTINGS and PING over DATA frames. // When there are no control frames to send, it performs a round-robin // selection from the ready streams. diff --git a/vendor/golang.org/x/net/internal/httpcommon/request.go b/vendor/golang.org/x/net/internal/httpcommon/request.go index 4b70553179..1e10f89ebf 100644 --- a/vendor/golang.org/x/net/internal/httpcommon/request.go +++ b/vendor/golang.org/x/net/internal/httpcommon/request.go @@ -51,7 +51,7 @@ type EncodeHeadersParam struct { DefaultUserAgent string } -// EncodeHeadersParam is the result of EncodeHeaders. +// EncodeHeadersResult is the result of EncodeHeaders. type EncodeHeadersResult struct { HasBody bool HasTrailers bool @@ -399,7 +399,7 @@ type ServerRequestResult struct { // If the request should be rejected, this is a short string suitable for passing // to the http2 package's CountError function. - // It might be a bit odd to return errors this way rather than returing an error, + // It might be a bit odd to return errors this way rather than returning an error, // but this ensures we don't forget to include a CountError reason. InvalidReason string } diff --git a/vendor/golang.org/x/net/internal/socks/socks.go b/vendor/golang.org/x/net/internal/socks/socks.go index 84fcc32b63..8eedb84cec 100644 --- a/vendor/golang.org/x/net/internal/socks/socks.go +++ b/vendor/golang.org/x/net/internal/socks/socks.go @@ -297,7 +297,7 @@ func (up *UsernamePassword) Authenticate(ctx context.Context, rw io.ReadWriter, b = append(b, up.Username...) b = append(b, byte(len(up.Password))) b = append(b, up.Password...) - // TODO(mikio): handle IO deadlines and cancelation if + // TODO(mikio): handle IO deadlines and cancellation if // necessary if _, err := rw.Write(b); err != nil { return err diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go index de34feb844..3e3b630695 100644 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ b/vendor/golang.org/x/oauth2/oauth2.go @@ -9,7 +9,6 @@ package oauth2 // import "golang.org/x/oauth2" import ( - "bytes" "context" "errors" "net/http" @@ -158,7 +157,7 @@ func SetAuthURLParam(key, value string) AuthCodeOption { // PKCE), https://www.oauth.com/oauth2-servers/pkce/ and // https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-09.html#name-cross-site-request-forgery (describing both approaches) func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string { - var buf bytes.Buffer + var buf strings.Builder buf.WriteString(c.Endpoint.AuthURL) v := url.Values{ "response_type": {"code"}, diff --git a/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/golang.org/x/sys/unix/affinity_linux.go index 3c7a6d6e2f..3ea470387b 100644 --- a/vendor/golang.org/x/sys/unix/affinity_linux.go +++ b/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -41,6 +41,15 @@ func (s *CPUSet) Zero() { clear(s[:]) } +// Fill adds all possible CPU bits to the set s. On Linux, [SchedSetaffinity] +// will silently ignore any invalid CPU bits in [CPUSet] so this is an +// efficient way of resetting the CPU affinity of a process. +func (s *CPUSet) Fill() { + for i := range s { + s[i] = ^cpuMask(0) + } +} + func cpuBitsIndex(cpu int) int { return cpu / _NCPUBITS } diff --git a/vendor/golang.org/x/sys/unix/fdset.go b/vendor/golang.org/x/sys/unix/fdset.go index 9e83d18cd0..62ed12645f 100644 --- a/vendor/golang.org/x/sys/unix/fdset.go +++ b/vendor/golang.org/x/sys/unix/fdset.go @@ -23,7 +23,5 @@ func (fds *FdSet) IsSet(fd int) bool { // Zero clears the set fds. func (fds *FdSet) Zero() { - for i := range fds.Bits { - fds.Bits[i] = 0 - } + clear(fds.Bits[:]) } diff --git a/vendor/golang.org/x/sys/unix/ifreq_linux.go b/vendor/golang.org/x/sys/unix/ifreq_linux.go index 848840ae4c..309f5a2b0c 100644 --- a/vendor/golang.org/x/sys/unix/ifreq_linux.go +++ b/vendor/golang.org/x/sys/unix/ifreq_linux.go @@ -111,9 +111,7 @@ func (ifr *Ifreq) SetUint32(v uint32) { // clear zeroes the ifreq's union field to prevent trailing garbage data from // being sent to the kernel if an ifreq is reused. func (ifr *Ifreq) clear() { - for i := range ifr.raw.Ifru { - ifr.raw.Ifru[i] = 0 - } + clear(ifr.raw.Ifru[:]) } // TODO(mdlayher): export as IfreqData? For now we can provide helpers such as diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index e6f31d374d..d0ed611912 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -49,6 +49,7 @@ esac if [[ "$GOOS" = "linux" ]]; then # Use the Docker-based build system # Files generated through docker (use $cmd so you can Ctl-C the build or run) + set -e $cmd docker build --tag generate:$GOOS $GOOS $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS exit diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 4958a65708..9439af961d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -801,9 +801,7 @@ func (sa *SockaddrPPPoE) sockaddr() (unsafe.Pointer, _Socklen, error) { // one. The kernel expects SID to be in network byte order. binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID) copy(sa.raw[8:14], sa.Remote) - for i := 14; i < 14+IFNAMSIZ; i++ { - sa.raw[i] = 0 - } + clear(sa.raw[14 : 14+IFNAMSIZ]) copy(sa.raw[14:], sa.Dev) return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 88162099af..34a4676973 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -248,6 +248,23 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { return Statvfs1(path, buf, ST_WAIT) } +func Getvfsstat(buf []Statvfs_t, flags int) (n int, err error) { + var ( + _p0 unsafe.Pointer + bufsize uintptr + ) + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statvfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETVFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + /* * Exposed directly */ diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 640f6b153f..bd51337306 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -321,6 +321,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents +//sys FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer //sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 993a2297db..358be3c7f5 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -65,6 +65,22 @@ var signals = [...]string{ 15: "terminated", } +// File flags for [os.OpenFile]. The O_ prefix is used to indicate +// that these flags are specific to the OpenFile function. +const ( + O_FILE_FLAG_OPEN_NO_RECALL = FILE_FLAG_OPEN_NO_RECALL + O_FILE_FLAG_OPEN_REPARSE_POINT = FILE_FLAG_OPEN_REPARSE_POINT + O_FILE_FLAG_SESSION_AWARE = FILE_FLAG_SESSION_AWARE + O_FILE_FLAG_POSIX_SEMANTICS = FILE_FLAG_POSIX_SEMANTICS + O_FILE_FLAG_BACKUP_SEMANTICS = FILE_FLAG_BACKUP_SEMANTICS + O_FILE_FLAG_DELETE_ON_CLOSE = FILE_FLAG_DELETE_ON_CLOSE + O_FILE_FLAG_SEQUENTIAL_SCAN = FILE_FLAG_SEQUENTIAL_SCAN + O_FILE_FLAG_RANDOM_ACCESS = FILE_FLAG_RANDOM_ACCESS + O_FILE_FLAG_NO_BUFFERING = FILE_FLAG_NO_BUFFERING + O_FILE_FLAG_OVERLAPPED = FILE_FLAG_OVERLAPPED + O_FILE_FLAG_WRITE_THROUGH = FILE_FLAG_WRITE_THROUGH +) + const ( FILE_READ_DATA = 0x00000001 FILE_READ_ATTRIBUTES = 0x00000080 diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 641a5f4b77..426151a019 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -238,6 +238,7 @@ var ( procFindResourceW = modkernel32.NewProc("FindResourceW") procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose") + procFlushConsoleInputBuffer = modkernel32.NewProc("FlushConsoleInputBuffer") procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") procFormatMessageW = modkernel32.NewProc("FormatMessageW") @@ -284,6 +285,7 @@ var ( procGetNamedPipeHandleStateW = modkernel32.NewProc("GetNamedPipeHandleStateW") procGetNamedPipeInfo = modkernel32.NewProc("GetNamedPipeInfo") procGetNamedPipeServerProcessId = modkernel32.NewProc("GetNamedPipeServerProcessId") + procGetNumberOfConsoleInputEvents = modkernel32.NewProc("GetNumberOfConsoleInputEvents") procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") procGetProcAddress = modkernel32.NewProc("GetProcAddress") @@ -2111,6 +2113,14 @@ func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) { return } +func FlushConsoleInputBuffer(console Handle) (err error) { + r1, _, e1 := syscall.SyscallN(procFlushConsoleInputBuffer.Addr(), uintptr(console)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func FlushFileBuffers(handle Handle) (err error) { r1, _, e1 := syscall.SyscallN(procFlushFileBuffers.Addr(), uintptr(handle)) if r1 == 0 { @@ -2481,6 +2491,14 @@ func GetNamedPipeServerProcessId(pipe Handle, serverProcessID *uint32) (err erro return } +func GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) { + r1, _, e1 := syscall.SyscallN(procGetNumberOfConsoleInputEvents.Addr(), uintptr(console), uintptr(unsafe.Pointer(numevents))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) { var _p0 uint32 if wait { diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go index 9d2ae547b5..fb8273236d 100644 --- a/vendor/golang.org/x/text/unicode/bidi/core.go +++ b/vendor/golang.org/x/text/unicode/bidi/core.go @@ -427,13 +427,6 @@ type isolatingRunSequence struct { func (i *isolatingRunSequence) Len() int { return len(i.indexes) } -func maxLevel(a, b level) level { - if a > b { - return a - } - return b -} - // Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, // either L or R, for each isolating run sequence. func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { @@ -474,8 +467,8 @@ func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { indexes: indexes, types: types, level: level, - sos: typeForLevel(maxLevel(prevLevel, level)), - eos: typeForLevel(maxLevel(succLevel, level)), + sos: typeForLevel(max(prevLevel, level)), + eos: typeForLevel(max(succLevel, level)), } } diff --git a/vendor/golang.org/x/time/rate/rate.go b/vendor/golang.org/x/time/rate/rate.go index 794b2e32bf..563270c154 100644 --- a/vendor/golang.org/x/time/rate/rate.go +++ b/vendor/golang.org/x/time/rate/rate.go @@ -195,7 +195,7 @@ func (r *Reservation) CancelAt(t time.Time) { // update state r.lim.last = t r.lim.tokens = tokens - if r.timeToAct == r.lim.lastEvent { + if r.timeToAct.Equal(r.lim.lastEvent) { prevEvent := r.timeToAct.Add(r.limit.durationFromTokens(float64(-r.tokens))) if !prevEvent.Before(t) { r.lim.lastEvent = prevEvent diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go index 5e5601aa46..5bacc0fa49 100644 --- a/vendor/golang.org/x/tools/go/ast/astutil/imports.go +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -209,48 +209,46 @@ func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) // DeleteNamedImport deletes the import with the given name and path from the file f, if present. // If there are duplicate import declarations, all matching ones are deleted. func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) { - var delspecs []*ast.ImportSpec - var delcomments []*ast.CommentGroup + var ( + delspecs = make(map[*ast.ImportSpec]bool) + delcomments = make(map[*ast.CommentGroup]bool) + ) // Find the import nodes that import path, if any. for i := 0; i < len(f.Decls); i++ { - decl := f.Decls[i] - gen, ok := decl.(*ast.GenDecl) + gen, ok := f.Decls[i].(*ast.GenDecl) if !ok || gen.Tok != token.IMPORT { continue } for j := 0; j < len(gen.Specs); j++ { - spec := gen.Specs[j] - impspec := spec.(*ast.ImportSpec) + impspec := gen.Specs[j].(*ast.ImportSpec) if importName(impspec) != name || importPath(impspec) != path { continue } // We found an import spec that imports path. // Delete it. - delspecs = append(delspecs, impspec) + delspecs[impspec] = true deleted = true - copy(gen.Specs[j:], gen.Specs[j+1:]) - gen.Specs = gen.Specs[:len(gen.Specs)-1] + gen.Specs = slices.Delete(gen.Specs, j, j+1) // If this was the last import spec in this decl, // delete the decl, too. if len(gen.Specs) == 0 { - copy(f.Decls[i:], f.Decls[i+1:]) - f.Decls = f.Decls[:len(f.Decls)-1] + f.Decls = slices.Delete(f.Decls, i, i+1) i-- break } else if len(gen.Specs) == 1 { if impspec.Doc != nil { - delcomments = append(delcomments, impspec.Doc) + delcomments[impspec.Doc] = true } if impspec.Comment != nil { - delcomments = append(delcomments, impspec.Comment) + delcomments[impspec.Comment] = true } for _, cg := range f.Comments { // Found comment on the same line as the import spec. if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line { - delcomments = append(delcomments, cg) + delcomments[cg] = true break } } @@ -294,38 +292,21 @@ func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (del } // Delete imports from f.Imports. - for i := 0; i < len(f.Imports); i++ { - imp := f.Imports[i] - for j, del := range delspecs { - if imp == del { - copy(f.Imports[i:], f.Imports[i+1:]) - f.Imports = f.Imports[:len(f.Imports)-1] - copy(delspecs[j:], delspecs[j+1:]) - delspecs = delspecs[:len(delspecs)-1] - i-- - break - } - } + before := len(f.Imports) + f.Imports = slices.DeleteFunc(f.Imports, func(imp *ast.ImportSpec) bool { + _, ok := delspecs[imp] + return ok + }) + if len(f.Imports)+len(delspecs) != before { + // This can happen when the AST is invalid (i.e. imports differ between f.Decls and f.Imports). + panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) } // Delete comments from f.Comments. - for i := 0; i < len(f.Comments); i++ { - cg := f.Comments[i] - for j, del := range delcomments { - if cg == del { - copy(f.Comments[i:], f.Comments[i+1:]) - f.Comments = f.Comments[:len(f.Comments)-1] - copy(delcomments[j:], delcomments[j+1:]) - delcomments = delcomments[:len(delcomments)-1] - i-- - break - } - } - } - - if len(delspecs) > 0 { - panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) - } + f.Comments = slices.DeleteFunc(f.Comments, func(cg *ast.CommentGroup) bool { + _, ok := delcomments[cg] + return ok + }) return } diff --git a/vendor/golang.org/x/tools/go/ast/inspector/cursor.go b/vendor/golang.org/x/tools/go/ast/inspector/cursor.go index 31c8d2f240..7e72d3c284 100644 --- a/vendor/golang.org/x/tools/go/ast/inspector/cursor.go +++ b/vendor/golang.org/x/tools/go/ast/inspector/cursor.go @@ -40,7 +40,7 @@ type Cursor struct { // Root returns a cursor for the virtual root node, // whose children are the files provided to [New]. // -// Its [Cursor.Node] and [Cursor.Stack] methods return nil. +// Its [Cursor.Node] method return nil. func (in *Inspector) Root() Cursor { return Cursor{in, -1} } diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 89f89dd2dc..680a70ca8f 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -364,12 +364,6 @@ type jsonPackage struct { DepsErrors []*packagesinternal.PackageError } -type jsonPackageError struct { - ImportStack []string - Pos string - Err string -} - func otherFiles(p *jsonPackage) [][]string { return [][]string{p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.FFiles, p.SFiles, p.SwigFiles, p.SwigCXXFiles, p.SysoFiles} } diff --git a/vendor/golang.org/x/tools/go/packages/visit.go b/vendor/golang.org/x/tools/go/packages/visit.go index df14ffd94d..af6a60d75f 100644 --- a/vendor/golang.org/x/tools/go/packages/visit.go +++ b/vendor/golang.org/x/tools/go/packages/visit.go @@ -5,9 +5,11 @@ package packages import ( + "cmp" "fmt" + "iter" "os" - "sort" + "slices" ) // Visit visits all the packages in the import graph whose roots are @@ -16,6 +18,20 @@ import ( // package's dependencies have been visited (postorder). // The boolean result of pre(pkg) determines whether // the imports of package pkg are visited. +// +// Example: +// +// pkgs, err := Load(...) +// if err != nil { ... } +// Visit(pkgs, nil, func(pkg *Package) { +// log.Println(pkg) +// }) +// +// In most cases, it is more convenient to use [Postorder]: +// +// for pkg := range Postorder(pkgs) { +// log.Println(pkg) +// } func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { seen := make(map[*Package]bool) var visit func(*Package) @@ -24,13 +40,8 @@ func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { seen[pkg] = true if pre == nil || pre(pkg) { - paths := make([]string, 0, len(pkg.Imports)) - for path := range pkg.Imports { - paths = append(paths, path) - } - sort.Strings(paths) // Imports is a map, this makes visit stable - for _, path := range paths { - visit(pkg.Imports[path]) + for _, imp := range sorted(pkg.Imports) { // for determinism + visit(imp) } } @@ -50,7 +61,7 @@ func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) { func PrintErrors(pkgs []*Package) int { var n int errModules := make(map[*Module]bool) - Visit(pkgs, nil, func(pkg *Package) { + for pkg := range Postorder(pkgs) { for _, err := range pkg.Errors { fmt.Fprintln(os.Stderr, err) n++ @@ -63,6 +74,60 @@ func PrintErrors(pkgs []*Package) int { fmt.Fprintln(os.Stderr, mod.Error.Err) n++ } - }) + } return n } + +// Postorder returns an iterator over the the packages in +// the import graph whose roots are pkg. +// Packages are enumerated in dependencies-first order. +func Postorder(pkgs []*Package) iter.Seq[*Package] { + return func(yield func(*Package) bool) { + seen := make(map[*Package]bool) + var visit func(*Package) bool + visit = func(pkg *Package) bool { + if !seen[pkg] { + seen[pkg] = true + for _, imp := range sorted(pkg.Imports) { // for determinism + if !visit(imp) { + return false + } + } + if !yield(pkg) { + return false + } + } + return true + } + for _, pkg := range pkgs { + if !visit(pkg) { + break + } + } + } +} + +// -- copied from golang.org.x/tools/gopls/internal/util/moremaps -- + +// sorted returns an iterator over the entries of m in key order. +func sorted[M ~map[K]V, K cmp.Ordered, V any](m M) iter.Seq2[K, V] { + // TODO(adonovan): use maps.Sorted if proposal #68598 is accepted. + return func(yield func(K, V) bool) { + keys := keySlice(m) + slices.Sort(keys) + for _, k := range keys { + if !yield(k, m[k]) { + break + } + } + } +} + +// KeySlice returns the keys of the map M, like slices.Collect(maps.Keys(m)). +func keySlice[M ~map[K]V, K comparable, V any](m M) []K { + r := make([]K, 0, len(m)) + for k := range m { + r = append(r, k) + } + return r +} diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go index d3c2913bef..6c0c74968f 100644 --- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -698,7 +698,10 @@ func Object(pkg *types.Package, p Path) (types.Object, error) { } else if false && aliases.Enabled() { // The Enabled check is too expensive, so for now we // simply assume that aliases are not enabled. - // TODO(adonovan): replace with "if true {" when go1.24 is assured. + // + // Now that go1.24 is assured, we should be able to + // replace this with "if true {", but it causes tests + // to fail. TODO(adonovan): investigate. return nil, fmt.Errorf("cannot apply %q to %s (got %T, want alias)", code, t, t) } diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go index b6d542c64e..f035a0b6be 100644 --- a/vendor/golang.org/x/tools/go/types/typeutil/map.go +++ b/vendor/golang.org/x/tools/go/types/typeutil/map.go @@ -11,7 +11,6 @@ import ( "fmt" "go/types" "hash/maphash" - "unsafe" "golang.org/x/tools/internal/typeparams" ) @@ -380,22 +379,8 @@ var theSeed = maphash.MakeSeed() func (hasher) hashTypeName(tname *types.TypeName) uint32 { // Since types.Identical uses == to compare TypeNames, // the Hash function uses maphash.Comparable. - // TODO(adonovan): or will, when it becomes available in go1.24. - // In the meantime we use the pointer's numeric value. - // - // hash := maphash.Comparable(theSeed, tname) - // - // (Another approach would be to hash the name and package - // path, and whether or not it is a package-level typename. It - // is rare for a package to define multiple local types with - // the same name.) - ptr := uintptr(unsafe.Pointer(tname)) - if unsafe.Sizeof(ptr) == 8 { - hash := uint64(ptr) - return uint32(hash ^ (hash >> 32)) - } else { - return uint32(ptr) - } + hash := maphash.Comparable(theSeed, tname) + return uint32(hash ^ (hash >> 32)) } // shallowHash computes a hash of t without looking at any of its diff --git a/vendor/golang.org/x/tools/imports/forward.go b/vendor/golang.org/x/tools/imports/forward.go index cb6db8893f..22ae777726 100644 --- a/vendor/golang.org/x/tools/imports/forward.go +++ b/vendor/golang.org/x/tools/imports/forward.go @@ -69,9 +69,3 @@ func Process(filename string, src []byte, opt *Options) ([]byte, error) { } return intimp.Process(filename, src, intopt) } - -// VendorlessPath returns the devendorized version of the import path ipath. -// For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b". -func VendorlessPath(ipath string) string { - return intimp.VendorlessPath(ipath) -} diff --git a/vendor/golang.org/x/tools/internal/event/core/event.go b/vendor/golang.org/x/tools/internal/event/core/event.go index a6cf0e64a4..ade5d1e799 100644 --- a/vendor/golang.org/x/tools/internal/event/core/event.go +++ b/vendor/golang.org/x/tools/internal/event/core/event.go @@ -28,11 +28,6 @@ type Event struct { dynamic []label.Label // dynamically sized storage for remaining labels } -// eventLabelMap implements label.Map for a the labels of an Event. -type eventLabelMap struct { - event Event -} - func (ev Event) At() time.Time { return ev.at } func (ev Event) Format(f fmt.State, r rune) { diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index 780873e3ae..4a4357d2bd 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -569,7 +569,6 @@ func (p *iexporter) exportName(obj types.Object) (res string) { type iexporter struct { fset *token.FileSet - out *bytes.Buffer version int shallow bool // don't put types from other packages in the index diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go deleted file mode 100644 index 7586bfaca6..0000000000 --- a/vendor/golang.org/x/tools/internal/gcimporter/iimport_go122.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2024 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.22 && !go1.24 - -package gcimporter - -import ( - "go/token" - "go/types" - "unsafe" -) - -// TODO(rfindley): delete this workaround once go1.24 is assured. - -func init() { - // Update markBlack so that it correctly sets the color - // of imported TypeNames. - // - // See the doc comment for markBlack for details. - - type color uint32 - const ( - white color = iota - black - grey - ) - type object struct { - _ *types.Scope - _ token.Pos - _ *types.Package - _ string - _ types.Type - _ uint32 - color_ color - _ token.Pos - } - type typeName struct { - object - } - - // If the size of types.TypeName changes, this will fail to compile. - const delta = int64(unsafe.Sizeof(typeName{})) - int64(unsafe.Sizeof(types.TypeName{})) - var _ [-delta * delta]int - - markBlack = func(obj *types.TypeName) { - type uP = unsafe.Pointer - var ptr *typeName - *(*uP)(uP(&ptr)) = uP(obj) - ptr.color_ = black - } -} diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index 50b6ca51a6..1b4dc0cb5d 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -16,6 +16,7 @@ import ( "go/types" "io/fs" "io/ioutil" + "maps" "os" "path" "path/filepath" @@ -27,8 +28,6 @@ import ( "unicode" "unicode/utf8" - "maps" - "golang.org/x/tools/go/ast/astutil" "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" @@ -43,7 +42,7 @@ var importToGroup = []func(localPrefix, importPath string) (num int, ok bool){ if localPrefix == "" { return } - for _, p := range strings.Split(localPrefix, ",") { + for p := range strings.SplitSeq(localPrefix, ",") { if strings.HasPrefix(importPath, p) || strings.TrimSuffix(p, "/") == importPath { return 3, true } @@ -1251,7 +1250,6 @@ func ImportPathToAssumedName(importPath string) string { // gopathResolver implements resolver for GOPATH workspaces. type gopathResolver struct { env *ProcessEnv - walked bool cache *DirInfoCache scanSema chan struct{} // scanSema prevents concurrent scans. } diff --git a/vendor/golang.org/x/tools/internal/modindex/symbols.go b/vendor/golang.org/x/tools/internal/modindex/symbols.go index fe24db9b13..8e9702d84b 100644 --- a/vendor/golang.org/x/tools/internal/modindex/symbols.go +++ b/vendor/golang.org/x/tools/internal/modindex/symbols.go @@ -206,8 +206,7 @@ func isDeprecated(doc *ast.CommentGroup) bool { // go.dev/wiki/Deprecated Paragraph starting 'Deprecated:' // This code fails for /* Deprecated: */, but it's the code from // gopls/internal/analysis/deprecated - lines := strings.Split(doc.Text(), "\n\n") - for _, line := range lines { + for line := range strings.SplitSeq(doc.Text(), "\n\n") { if strings.HasPrefix(line, "Deprecated:") { return true } diff --git a/vendor/golang.org/x/tools/internal/stdlib/deps.go b/vendor/golang.org/x/tools/internal/stdlib/deps.go index 77cf8d2181..96ad6c5821 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/deps.go +++ b/vendor/golang.org/x/tools/internal/stdlib/deps.go @@ -12,348 +12,354 @@ type pkginfo struct { } var deps = [...]pkginfo{ - {"archive/tar", "\x03j\x03E5\x01\v\x01#\x01\x01\x02\x05\n\x02\x01\x02\x02\v"}, - {"archive/zip", "\x02\x04`\a\x16\x0205\x01+\x05\x01\x11\x03\x02\r\x04"}, - {"bufio", "\x03j}F\x13"}, - {"bytes", "m+R\x03\fH\x02\x02"}, + {"archive/tar", "\x03k\x03E;\x01\n\x01$\x01\x01\x02\x05\b\x02\x01\x02\x02\f"}, + {"archive/zip", "\x02\x04a\a\x03\x12\x021;\x01+\x05\x01\x0f\x03\x02\x0e\x04"}, + {"bufio", "\x03k\x83\x01D\x14"}, + {"bytes", "n*Y\x03\fG\x02\x02"}, {"cmp", ""}, - {"compress/bzip2", "\x02\x02\xe6\x01C"}, - {"compress/flate", "\x02k\x03z\r\x025\x01\x03"}, - {"compress/gzip", "\x02\x04`\a\x03\x15eU"}, - {"compress/lzw", "\x02k\x03z"}, - {"compress/zlib", "\x02\x04`\a\x03\x13\x01f"}, - {"container/heap", "\xae\x02"}, + {"compress/bzip2", "\x02\x02\xed\x01A"}, + {"compress/flate", "\x02l\x03\x80\x01\f\x033\x01\x03"}, + {"compress/gzip", "\x02\x04a\a\x03\x14lT"}, + {"compress/lzw", "\x02l\x03\x80\x01"}, + {"compress/zlib", "\x02\x04a\a\x03\x12\x01m"}, + {"container/heap", "\xb3\x02"}, {"container/list", ""}, {"container/ring", ""}, - {"context", "m\\i\x01\f"}, - {"crypto", "\x83\x01gE"}, - {"crypto/aes", "\x10\n\a\x8e\x02"}, - {"crypto/cipher", "\x03\x1e\x01\x01\x1d\x11\x1c,Q"}, - {"crypto/des", "\x10\x13\x1d-,\x96\x01\x03"}, - {"crypto/dsa", "@\x04)}\x0e"}, - {"crypto/ecdh", "\x03\v\f\x0e\x04\x14\x04\r\x1c}"}, - {"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x0e\x16\x01\x04\f\x01\x1c}\x0e\x04L\x01"}, - {"crypto/ed25519", "\x0e\x1c\x16\n\a\x1c}E"}, - {"crypto/elliptic", "0=}\x0e:"}, - {"crypto/fips140", " \x05\x90\x01"}, - {"crypto/hkdf", "-\x12\x01-\x16"}, - {"crypto/hmac", "\x1a\x14\x11\x01\x112"}, + {"context", "n\\m\x01\r"}, + {"crypto", "\x83\x01nC"}, + {"crypto/aes", "\x10\n\a\x93\x02"}, + {"crypto/cipher", "\x03\x1e\x01\x01\x1e\x11\x1c+X"}, + {"crypto/des", "\x10\x13\x1e-+\x9b\x01\x03"}, + {"crypto/dsa", "A\x04)\x83\x01\r"}, + {"crypto/ecdh", "\x03\v\f\x0e\x04\x15\x04\r\x1c\x83\x01"}, + {"crypto/ecdsa", "\x0e\x05\x03\x04\x01\x0e\a\v\x05\x01\x04\f\x01\x1c\x83\x01\r\x05K\x01"}, + {"crypto/ed25519", "\x0e\x1c\x11\x06\n\a\x1c\x83\x01C"}, + {"crypto/elliptic", "0>\x83\x01\r9"}, + {"crypto/fips140", " \x05"}, + {"crypto/hkdf", "-\x13\x01-\x15"}, + {"crypto/hmac", "\x1a\x14\x12\x01\x111"}, {"crypto/internal/boring", "\x0e\x02\rf"}, - {"crypto/internal/boring/bbig", "\x1a\xde\x01M"}, - {"crypto/internal/boring/bcache", "\xb3\x02\x12"}, + {"crypto/internal/boring/bbig", "\x1a\xe4\x01M"}, + {"crypto/internal/boring/bcache", "\xb8\x02\x13"}, {"crypto/internal/boring/sig", ""}, - {"crypto/internal/cryptotest", "\x03\r\n)\x0e\x19\x06\x13\x12#\a\t\x11\x11\x11\x1b\x01\f\r\x05\n"}, - {"crypto/internal/entropy", "E"}, - {"crypto/internal/fips140", ">/}9\r\x15"}, - {"crypto/internal/fips140/aes", "\x03\x1d\x03\x02\x13\x04\x01\x01\x05*\x8c\x016"}, - {"crypto/internal/fips140/aes/gcm", " \x01\x02\x02\x02\x11\x04\x01\x06*\x8a\x01"}, - {"crypto/internal/fips140/alias", "\xc5\x02"}, - {"crypto/internal/fips140/bigmod", "%\x17\x01\x06*\x8c\x01"}, - {"crypto/internal/fips140/check", " \x0e\x06\b\x02\xac\x01["}, - {"crypto/internal/fips140/check/checktest", "%\xfe\x01\""}, - {"crypto/internal/fips140/drbg", "\x03\x1c\x01\x01\x04\x13\x04\b\x01(}\x0f9"}, - {"crypto/internal/fips140/ecdh", "\x03\x1d\x05\x02\t\f1}\x0f9"}, - {"crypto/internal/fips140/ecdsa", "\x03\x1d\x04\x01\x02\a\x02\x067}H"}, - {"crypto/internal/fips140/ed25519", "\x03\x1d\x05\x02\x04\v7\xc2\x01\x03"}, - {"crypto/internal/fips140/edwards25519", "%\a\f\x041\x8c\x019"}, - {"crypto/internal/fips140/edwards25519/field", "%\x13\x041\x8c\x01"}, - {"crypto/internal/fips140/hkdf", "\x03\x1d\x05\t\x069"}, - {"crypto/internal/fips140/hmac", "\x03\x1d\x14\x01\x017"}, - {"crypto/internal/fips140/mlkem", "\x03\x1d\x05\x02\x0e\x03\x041"}, - {"crypto/internal/fips140/nistec", "%\f\a\x041\x8c\x01*\x0f\x13"}, - {"crypto/internal/fips140/nistec/fiat", "%\x135\x8c\x01"}, - {"crypto/internal/fips140/pbkdf2", "\x03\x1d\x05\t\x069"}, - {"crypto/internal/fips140/rsa", "\x03\x1d\x04\x01\x02\r\x01\x01\x025}H"}, - {"crypto/internal/fips140/sha256", "\x03\x1d\x1c\x01\x06*\x8c\x01"}, - {"crypto/internal/fips140/sha3", "\x03\x1d\x18\x04\x010\x8c\x01L"}, - {"crypto/internal/fips140/sha512", "\x03\x1d\x1c\x01\x06*\x8c\x01"}, - {"crypto/internal/fips140/ssh", " \x05"}, - {"crypto/internal/fips140/subtle", "#"}, - {"crypto/internal/fips140/tls12", "\x03\x1d\x05\t\x06\x027"}, - {"crypto/internal/fips140/tls13", "\x03\x1d\x05\b\a\b1"}, + {"crypto/internal/cryptotest", "\x03\r\n\x06$\x0e\x19\x06\x12\x12 \x04\a\t\x16\x01\x11\x11\x1b\x01\a\x05\b\x03\x05\v"}, + {"crypto/internal/entropy", "F"}, + {"crypto/internal/fips140", "?/\x15\xa7\x01\v\x16"}, + {"crypto/internal/fips140/aes", "\x03\x1d\x03\x02\x13\x05\x01\x01\x05*\x92\x014"}, + {"crypto/internal/fips140/aes/gcm", " \x01\x02\x02\x02\x11\x05\x01\x06*\x8f\x01"}, + {"crypto/internal/fips140/alias", "\xcb\x02"}, + {"crypto/internal/fips140/bigmod", "%\x18\x01\x06*\x92\x01"}, + {"crypto/internal/fips140/check", " \x0e\x06\t\x02\xb2\x01Z"}, + {"crypto/internal/fips140/check/checktest", "%\x85\x02!"}, + {"crypto/internal/fips140/drbg", "\x03\x1c\x01\x01\x04\x13\x05\b\x01(\x83\x01\x0f7"}, + {"crypto/internal/fips140/ecdh", "\x03\x1d\x05\x02\t\r1\x83\x01\x0f7"}, + {"crypto/internal/fips140/ecdsa", "\x03\x1d\x04\x01\x02\a\x02\x068\x15nF"}, + {"crypto/internal/fips140/ed25519", "\x03\x1d\x05\x02\x04\v8\xc6\x01\x03"}, + {"crypto/internal/fips140/edwards25519", "%\a\f\x051\x92\x017"}, + {"crypto/internal/fips140/edwards25519/field", "%\x13\x051\x92\x01"}, + {"crypto/internal/fips140/hkdf", "\x03\x1d\x05\t\x06:\x15"}, + {"crypto/internal/fips140/hmac", "\x03\x1d\x14\x01\x018\x15"}, + {"crypto/internal/fips140/mlkem", "\x03\x1d\x05\x02\x0e\x03\x051"}, + {"crypto/internal/fips140/nistec", "%\f\a\x051\x92\x01*\r\x14"}, + {"crypto/internal/fips140/nistec/fiat", "%\x136\x92\x01"}, + {"crypto/internal/fips140/pbkdf2", "\x03\x1d\x05\t\x06:\x15"}, + {"crypto/internal/fips140/rsa", "\x03\x1d\x04\x01\x02\r\x01\x01\x026\x15nF"}, + {"crypto/internal/fips140/sha256", "\x03\x1d\x1d\x01\x06*\x15}"}, + {"crypto/internal/fips140/sha3", "\x03\x1d\x18\x05\x010\x92\x01K"}, + {"crypto/internal/fips140/sha512", "\x03\x1d\x1d\x01\x06*\x15}"}, + {"crypto/internal/fips140/ssh", "%^"}, + {"crypto/internal/fips140/subtle", "#\x1a\xc3\x01"}, + {"crypto/internal/fips140/tls12", "\x03\x1d\x05\t\x06\x028\x15"}, + {"crypto/internal/fips140/tls13", "\x03\x1d\x05\b\a\t1\x15"}, + {"crypto/internal/fips140cache", "\xaa\x02\r&"}, {"crypto/internal/fips140deps", ""}, {"crypto/internal/fips140deps/byteorder", "\x99\x01"}, - {"crypto/internal/fips140deps/cpu", "\xad\x01\a"}, - {"crypto/internal/fips140deps/godebug", "\xb5\x01"}, - {"crypto/internal/fips140hash", "5\x1a4\xc2\x01"}, - {"crypto/internal/fips140only", "'\r\x01\x01M25"}, + {"crypto/internal/fips140deps/cpu", "\xae\x01\a"}, + {"crypto/internal/fips140deps/godebug", "\xb6\x01"}, + {"crypto/internal/fips140hash", "5\x1b3\xc8\x01"}, + {"crypto/internal/fips140only", "'\r\x01\x01M3;"}, {"crypto/internal/fips140test", ""}, - {"crypto/internal/hpke", "\x0e\x01\x01\x03\x1a\x1d#,`N"}, - {"crypto/internal/impl", "\xb0\x02"}, - {"crypto/internal/randutil", "\xea\x01\x12"}, - {"crypto/internal/sysrand", "mi!\x1f\r\x0f\x01\x01\v\x06"}, - {"crypto/internal/sysrand/internal/seccomp", "m"}, - {"crypto/md5", "\x0e2-\x16\x16`"}, + {"crypto/internal/hpke", "\x0e\x01\x01\x03\x053#+gM"}, + {"crypto/internal/impl", "\xb5\x02"}, + {"crypto/internal/randutil", "\xf1\x01\x12"}, + {"crypto/internal/sysrand", "nn! \r\r\x01\x01\f\x06"}, + {"crypto/internal/sysrand/internal/seccomp", "n"}, + {"crypto/md5", "\x0e3-\x15\x16g"}, {"crypto/mlkem", "/"}, - {"crypto/pbkdf2", "2\r\x01-\x16"}, - {"crypto/rand", "\x1a\x06\a\x19\x04\x01(}\x0eM"}, - {"crypto/rc4", "#\x1d-\xc2\x01"}, - {"crypto/rsa", "\x0e\f\x01\t\x0f\f\x01\x04\x06\a\x1c\x03\x1325\r\x01"}, - {"crypto/sha1", "\x0e\f&-\x16\x16\x14L"}, + {"crypto/pbkdf2", "2\x0e\x01-\x15"}, + {"crypto/rand", "\x1a\x06\a\x1a\x04\x01(\x83\x01\rM"}, + {"crypto/rc4", "#\x1e-\xc6\x01"}, + {"crypto/rsa", "\x0e\f\x01\t\x0f\r\x01\x04\x06\a\x1c\x03\x123;\f\x01"}, + {"crypto/sha1", "\x0e\f'\x03*\x15\x16\x15R"}, {"crypto/sha256", "\x0e\f\x1aO"}, - {"crypto/sha3", "\x0e'N\xc2\x01"}, + {"crypto/sha3", "\x0e'N\xc8\x01"}, {"crypto/sha512", "\x0e\f\x1cM"}, - {"crypto/subtle", "8\x96\x01U"}, - {"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x03\x01\a\x01\v\x02\n\x01\b\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x13\x16\x14\b5\x16\x16\r\n\x01\x01\x01\x02\x01\f\x06\x02\x01"}, - {"crypto/tls/internal/fips140tls", " \x93\x02"}, - {"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x011\x03\x02\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x032\x01\x02\t\x01\x01\x01\a\x10\x05\x01\x06\x02\x05\f\x01\x02\r\x02\x01\x01\x02\x03\x01"}, - {"crypto/x509/pkix", "c\x06\a\x88\x01G"}, - {"database/sql", "\x03\nJ\x16\x03z\f\x06\"\x05\n\x02\x03\x01\f\x02\x02\x02"}, - {"database/sql/driver", "\r`\x03\xae\x01\x11\x10"}, - {"debug/buildinfo", "\x03W\x02\x01\x01\b\a\x03`\x18\x02\x01+\x0f "}, - {"debug/dwarf", "\x03c\a\x03z1\x13\x01\x01"}, - {"debug/elf", "\x03\x06P\r\a\x03`\x19\x01,\x19\x01\x15"}, - {"debug/gosym", "\x03c\n\xbe\x01\x01\x01\x02"}, - {"debug/macho", "\x03\x06P\r\n`\x1a,\x19\x01"}, - {"debug/pe", "\x03\x06P\r\a\x03`\x1a,\x19\x01\x15"}, - {"debug/plan9obj", "f\a\x03`\x1a,"}, - {"embed", "m+:\x18\x01T"}, + {"crypto/subtle", "8\x9b\x01W"}, + {"crypto/tls", "\x03\b\x02\x01\x01\x01\x01\x02\x01\x01\x01\x02\x01\x01\a\x01\r\n\x01\t\x05\x03\x01\x01\x01\x01\x02\x01\x02\x01\x17\x02\x03\x12\x16\x15\b;\x16\x16\r\b\x01\x01\x01\x02\x01\r\x06\x02\x01\x0f"}, + {"crypto/tls/internal/fips140tls", "\x17\xa1\x02"}, + {"crypto/x509", "\x03\v\x01\x01\x01\x01\x01\x01\x01\x012\x05\x01\x01\x02\x05\x0e\x06\x02\x02\x03E\x038\x01\x02\b\x01\x01\x02\a\x10\x05\x01\x06\x02\x05\n\x01\x02\x0e\x02\x01\x01\x02\x03\x01"}, + {"crypto/x509/pkix", "d\x06\a\x8d\x01G"}, + {"database/sql", "\x03\nK\x16\x03\x80\x01\v\a\"\x05\b\x02\x03\x01\r\x02\x02\x02"}, + {"database/sql/driver", "\ra\x03\xb4\x01\x0f\x11"}, + {"debug/buildinfo", "\x03X\x02\x01\x01\b\a\x03e\x19\x02\x01+\x0f\x1f"}, + {"debug/dwarf", "\x03d\a\x03\x80\x011\x11\x01\x01"}, + {"debug/elf", "\x03\x06Q\r\a\x03e\x1a\x01,\x17\x01\x16"}, + {"debug/gosym", "\x03d\n\xc2\x01\x01\x01\x02"}, + {"debug/macho", "\x03\x06Q\r\ne\x1b,\x17\x01"}, + {"debug/pe", "\x03\x06Q\r\a\x03e\x1b,\x17\x01\x16"}, + {"debug/plan9obj", "g\a\x03e\x1b,"}, + {"embed", "n*@\x19\x01S"}, {"embed/internal/embedtest", ""}, {"encoding", ""}, - {"encoding/ascii85", "\xea\x01E"}, - {"encoding/asn1", "\x03j\x03\x87\x01\x01&\x0f\x02\x01\x0f\x03\x01"}, - {"encoding/base32", "\xea\x01C\x02"}, - {"encoding/base64", "\x99\x01QC\x02"}, - {"encoding/binary", "m}\r'\x0f\x05"}, - {"encoding/csv", "\x02\x01j\x03zF\x11\x02"}, - {"encoding/gob", "\x02_\x05\a\x03`\x1a\f\x01\x02\x1d\b\x14\x01\x0e\x02"}, - {"encoding/hex", "m\x03zC\x03"}, - {"encoding/json", "\x03\x01]\x04\b\x03z\r'\x0f\x02\x01\x02\x0f\x01\x01\x02"}, - {"encoding/pem", "\x03b\b}C\x03"}, - {"encoding/xml", "\x02\x01^\f\x03z4\x05\f\x01\x02\x0f\x02"}, - {"errors", "\xc9\x01|"}, - {"expvar", "jK9\t\n\x15\r\n\x02\x03\x01\x10"}, - {"flag", "a\f\x03z,\b\x05\n\x02\x01\x0f"}, - {"fmt", "mE8\r\x1f\b\x0f\x02\x03\x11"}, - {"go/ast", "\x03\x01l\x0f\x01j\x03)\b\x0f\x02\x01"}, - {"go/ast/internal/tests", ""}, - {"go/build", "\x02\x01j\x03\x01\x03\x02\a\x02\x01\x17\x1e\x04\x02\t\x14\x12\x01+\x01\x04\x01\a\n\x02\x01\x11\x02\x02"}, - {"go/build/constraint", "m\xc2\x01\x01\x11\x02"}, - {"go/constant", "p\x10w\x01\x016\x01\x02\x11"}, - {"go/doc", "\x04l\x01\x06\t=-1\x12\x02\x01\x11\x02"}, - {"go/doc/comment", "\x03m\xbd\x01\x01\x01\x01\x11\x02"}, - {"go/format", "\x03m\x01\f\x01\x02jF"}, - {"go/importer", "s\a\x01\x01\x04\x01i9"}, - {"go/internal/gccgoimporter", "\x02\x01W\x13\x03\x05\v\x01g\x02,\x01\x05\x13\x01\v\b"}, - {"go/internal/gcimporter", "\x02n\x10\x01/\x05\x0e',\x17\x03\x02"}, - {"go/internal/srcimporter", "p\x01\x02\n\x03\x01i,\x01\x05\x14\x02\x13"}, - {"go/parser", "\x03j\x03\x01\x03\v\x01j\x01+\x06\x14"}, - {"go/printer", "p\x01\x03\x03\tj\r\x1f\x17\x02\x01\x02\n\x05\x02"}, - {"go/scanner", "\x03m\x10j2\x12\x01\x12\x02"}, - {"go/token", "\x04l\xbd\x01\x02\x03\x01\x0e\x02"}, - {"go/types", "\x03\x01\x06c\x03\x01\x04\b\x03\x02\x15\x1e\x06+\x04\x03\n%\a\n\x01\x01\x01\x02\x01\x0e\x02\x02"}, - {"go/version", "\xba\x01v"}, - {"hash", "\xea\x01"}, - {"hash/adler32", "m\x16\x16"}, - {"hash/crc32", "m\x16\x16\x14\x85\x01\x01\x12"}, - {"hash/crc64", "m\x16\x16\x99\x01"}, - {"hash/fnv", "m\x16\x16`"}, - {"hash/maphash", "\x94\x01\x05\x1b\x03@N"}, - {"html", "\xb0\x02\x02\x11"}, - {"html/template", "\x03g\x06\x19,5\x01\v \x05\x01\x02\x03\x0e\x01\x02\v\x01\x03\x02"}, - {"image", "\x02k\x1f^\x0f6\x03\x01"}, + {"encoding/ascii85", "\xf1\x01C"}, + {"encoding/asn1", "\x03k\x03\x8c\x01\x01'\r\x02\x01\x10\x03\x01"}, + {"encoding/base32", "\xf1\x01A\x02"}, + {"encoding/base64", "\x99\x01XA\x02"}, + {"encoding/binary", "n\x83\x01\f(\r\x05"}, + {"encoding/csv", "\x02\x01k\x03\x80\x01D\x12\x02"}, + {"encoding/gob", "\x02`\x05\a\x03e\x1b\v\x01\x03\x1d\b\x12\x01\x0f\x02"}, + {"encoding/hex", "n\x03\x80\x01A\x03"}, + {"encoding/json", "\x03\x01^\x04\b\x03\x80\x01\f(\r\x02\x01\x02\x10\x01\x01\x02"}, + {"encoding/pem", "\x03c\b\x83\x01A\x03"}, + {"encoding/xml", "\x02\x01_\f\x03\x80\x014\x05\n\x01\x02\x10\x02"}, + {"errors", "\xca\x01\x81\x01"}, + {"expvar", "kK?\b\v\x15\r\b\x02\x03\x01\x11"}, + {"flag", "b\f\x03\x80\x01,\b\x05\b\x02\x01\x10"}, + {"fmt", "nE>\f \b\r\x02\x03\x12"}, + {"go/ast", "\x03\x01m\x0e\x01q\x03)\b\r\x02\x01"}, + {"go/build", "\x02\x01k\x03\x01\x02\x02\a\x02\x01\x17\x1f\x04\x02\t\x19\x13\x01+\x01\x04\x01\a\b\x02\x01\x12\x02\x02"}, + {"go/build/constraint", "n\xc6\x01\x01\x12\x02"}, + {"go/constant", "q\x0f}\x01\x024\x01\x02\x12"}, + {"go/doc", "\x04m\x01\x05\t>31\x10\x02\x01\x12\x02"}, + {"go/doc/comment", "\x03n\xc1\x01\x01\x01\x01\x12\x02"}, + {"go/format", "\x03n\x01\v\x01\x02qD"}, + {"go/importer", "s\a\x01\x01\x04\x01p9"}, + {"go/internal/gccgoimporter", "\x02\x01X\x13\x03\x04\v\x01n\x02,\x01\x05\x11\x01\f\b"}, + {"go/internal/gcimporter", "\x02o\x0f\x010\x05\x0e-,\x15\x03\x02"}, + {"go/internal/srcimporter", "q\x01\x01\n\x03\x01p,\x01\x05\x12\x02\x14"}, + {"go/parser", "\x03k\x03\x01\x02\v\x01q\x01+\x06\x12"}, + {"go/printer", "q\x01\x02\x03\tq\f \x15\x02\x01\x02\v\x05\x02"}, + {"go/scanner", "\x03n\x0fq2\x10\x01\x13\x02"}, + {"go/token", "\x04m\x83\x01>\x02\x03\x01\x0f\x02"}, + {"go/types", "\x03\x01\x06d\x03\x01\x03\b\x03\x02\x15\x1f\x061\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x0f\x02\x02"}, + {"go/version", "\xbb\x01z"}, + {"hash", "\xf1\x01"}, + {"hash/adler32", "n\x15\x16"}, + {"hash/crc32", "n\x15\x16\x15\x89\x01\x01\x13"}, + {"hash/crc64", "n\x15\x16\x9e\x01"}, + {"hash/fnv", "n\x15\x16g"}, + {"hash/maphash", "\x83\x01\x11!\x03\x93\x01"}, + {"html", "\xb5\x02\x02\x12"}, + {"html/template", "\x03h\x06\x18-;\x01\n!\x05\x01\x02\x03\f\x01\x02\f\x01\x03\x02"}, + {"image", "\x02l\x1ee\x0f4\x03\x01"}, {"image/color", ""}, {"image/color/palette", "\x8c\x01"}, {"image/draw", "\x8b\x01\x01\x04"}, - {"image/gif", "\x02\x01\x05e\x03\x1b\x01\x01\x01\vQ"}, + {"image/gif", "\x02\x01\x05f\x03\x1a\x01\x01\x01\vX"}, {"image/internal/imageutil", "\x8b\x01"}, - {"image/jpeg", "\x02k\x1e\x01\x04Z"}, - {"image/png", "\x02\a]\n\x13\x02\x06\x01^E"}, - {"index/suffixarray", "\x03c\a}\r*\f\x01"}, - {"internal/abi", "\xb4\x01\x91\x01"}, - {"internal/asan", "\xc5\x02"}, - {"internal/bisect", "\xa3\x02\x0f\x01"}, - {"internal/buildcfg", "pG_\x06\x02\x05\f\x01"}, - {"internal/bytealg", "\xad\x01\x98\x01"}, + {"image/jpeg", "\x02l\x1d\x01\x04a"}, + {"image/png", "\x02\a^\n\x12\x02\x06\x01eC"}, + {"index/suffixarray", "\x03d\a\x83\x01\f+\n\x01"}, + {"internal/abi", "\xb5\x01\x96\x01"}, + {"internal/asan", "\xcb\x02"}, + {"internal/bisect", "\xaa\x02\r\x01"}, + {"internal/buildcfg", "qGe\x06\x02\x05\n\x01"}, + {"internal/bytealg", "\xae\x01\x9d\x01"}, {"internal/byteorder", ""}, {"internal/cfg", ""}, - {"internal/chacha8rand", "\x99\x01\x1b\x91\x01"}, + {"internal/cgrouptest", "q[Q\x06\x0f\x02\x01\x04\x01"}, + {"internal/chacha8rand", "\x99\x01\x15\a\x96\x01"}, {"internal/copyright", ""}, {"internal/coverage", ""}, {"internal/coverage/calloc", ""}, - {"internal/coverage/cfile", "j\x06\x17\x16\x01\x02\x01\x01\x01\x01\x01\x01\x01#\x01\x1f,\x06\a\f\x01\x03\f\x06"}, - {"internal/coverage/cformat", "\x04l-\x04I\f7\x01\x02\f"}, - {"internal/coverage/cmerge", "p-Z"}, - {"internal/coverage/decodecounter", "f\n-\v\x02@,\x19\x16"}, - {"internal/coverage/decodemeta", "\x02d\n\x17\x16\v\x02@,"}, - {"internal/coverage/encodecounter", "\x02d\n-\f\x01\x02>\f \x17"}, - {"internal/coverage/encodemeta", "\x02\x01c\n\x13\x04\x16\r\x02>,/"}, - {"internal/coverage/pods", "\x04l-y\x06\x05\f\x02\x01"}, - {"internal/coverage/rtcov", "\xc5\x02"}, - {"internal/coverage/slicereader", "f\nz["}, - {"internal/coverage/slicewriter", "pz"}, - {"internal/coverage/stringtab", "p8\x04>"}, + {"internal/coverage/cfile", "k\x06\x16\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01#\x02$,\x06\a\n\x01\x03\r\x06"}, + {"internal/coverage/cformat", "\x04m-\x04O\v6\x01\x02\r"}, + {"internal/coverage/cmerge", "q-_"}, + {"internal/coverage/decodecounter", "g\n-\v\x02F,\x17\x17"}, + {"internal/coverage/decodemeta", "\x02e\n\x16\x17\v\x02F,"}, + {"internal/coverage/encodecounter", "\x02e\n-\f\x01\x02D\v!\x15"}, + {"internal/coverage/encodemeta", "\x02\x01d\n\x12\x04\x17\r\x02D,."}, + {"internal/coverage/pods", "\x04m-\x7f\x06\x05\n\x02\x01"}, + {"internal/coverage/rtcov", "\xcb\x02"}, + {"internal/coverage/slicereader", "g\n\x80\x01Z"}, + {"internal/coverage/slicewriter", "q\x80\x01"}, + {"internal/coverage/stringtab", "q8\x04D"}, {"internal/coverage/test", ""}, {"internal/coverage/uleb128", ""}, - {"internal/cpu", "\xc5\x02"}, - {"internal/dag", "\x04l\xbd\x01\x03"}, - {"internal/diff", "\x03m\xbe\x01\x02"}, - {"internal/exportdata", "\x02\x01j\x03\x03]\x1a,\x01\x05\x13\x01\x02"}, - {"internal/filepathlite", "m+:\x19B"}, - {"internal/fmtsort", "\x04\x9a\x02\x0f"}, - {"internal/fuzz", "\x03\nA\x18\x04\x03\x03\x01\f\x0355\r\x02\x1d\x01\x05\x02\x05\f\x01\x02\x01\x01\v\x04\x02"}, + {"internal/cpu", "\xcb\x02"}, + {"internal/dag", "\x04m\xc1\x01\x03"}, + {"internal/diff", "\x03n\xc2\x01\x02"}, + {"internal/exportdata", "\x02\x01k\x03\x02c\x1b,\x01\x05\x11\x01\x02"}, + {"internal/filepathlite", "n*@\x1a@"}, + {"internal/fmtsort", "\x04\xa1\x02\r"}, + {"internal/fuzz", "\x03\nB\x18\x04\x03\x03\x01\v\x036;\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\f\x04\x02"}, {"internal/goarch", ""}, - {"internal/godebug", "\x96\x01 |\x01\x12"}, + {"internal/godebug", "\x96\x01!\x80\x01\x01\x13"}, {"internal/godebugs", ""}, {"internal/goexperiment", ""}, {"internal/goos", ""}, - {"internal/goroot", "\x96\x02\x01\x05\x14\x02"}, + {"internal/goroot", "\x9d\x02\x01\x05\x12\x02"}, {"internal/gover", "\x04"}, {"internal/goversion", ""}, {"internal/itoa", ""}, - {"internal/lazyregexp", "\x96\x02\v\x0f\x02"}, - {"internal/lazytemplate", "\xea\x01,\x1a\x02\v"}, - {"internal/msan", "\xc5\x02"}, + {"internal/lazyregexp", "\x9d\x02\v\r\x02"}, + {"internal/lazytemplate", "\xf1\x01,\x18\x02\f"}, + {"internal/msan", "\xcb\x02"}, {"internal/nettrace", ""}, - {"internal/obscuretestdata", "e\x85\x01,"}, - {"internal/oserror", "m"}, - {"internal/pkgbits", "\x03K\x18\a\x03\x05\vj\x0e\x1e\r\f\x01"}, + {"internal/obscuretestdata", "f\x8b\x01,"}, + {"internal/oserror", "n"}, + {"internal/pkgbits", "\x03L\x18\a\x03\x04\vq\r\x1f\r\n\x01"}, {"internal/platform", ""}, - {"internal/poll", "mO\x1a\x149\x0f\x01\x01\v\x06"}, - {"internal/profile", "\x03\x04f\x03z7\r\x01\x01\x0f"}, + {"internal/poll", "nO\x1f\x159\r\x01\x01\f\x06"}, + {"internal/profile", "\x03\x04g\x03\x80\x017\v\x01\x01\x10"}, {"internal/profilerecord", ""}, - {"internal/race", "\x94\x01\xb1\x01"}, - {"internal/reflectlite", "\x94\x01 3<\""}, - {"internal/runtime/atomic", "\xc5\x02"}, - {"internal/runtime/exithook", "\xca\x01{"}, - {"internal/runtime/maps", "\x94\x01\x01\x1f\v\t\x05\x01w"}, - {"internal/runtime/math", "\xb4\x01"}, - {"internal/runtime/sys", "\xb4\x01\x04"}, - {"internal/runtime/syscall", "\xc5\x02"}, - {"internal/saferio", "\xea\x01["}, - {"internal/singleflight", "\xb2\x02"}, - {"internal/stringslite", "\x98\x01\xad\x01"}, - {"internal/sync", "\x94\x01 \x14k\x12"}, - {"internal/synctest", "\xc5\x02"}, - {"internal/syscall/execenv", "\xb4\x02"}, - {"internal/syscall/unix", "\xa3\x02\x10\x01\x11"}, - {"internal/sysinfo", "\x02\x01\xaa\x01=,\x1a\x02"}, + {"internal/race", "\x94\x01\xb7\x01"}, + {"internal/reflectlite", "\x94\x01!9\b\x13\x01\a\x03E;\x01\x03\a\x01\x03\x02\x02\x01\x02\x06\x02\x01\x01\n\x01\x01\x05\x01\x02\x05\b\x01\x01\x01\x02\x01\r\x02\x02\x02\b\x01\x01\x01"}, + {"net/http/cgi", "\x02Q\x1b\x03\x80\x01\x04\a\v\x01\x13\x01\x01\x01\x04\x01\x05\x02\b\x02\x01\x10\x0e"}, + {"net/http/cookiejar", "\x04j\x03\x96\x01\x01\b\f\x16\x03\x02\x0e\x04"}, + {"net/http/fcgi", "\x02\x01\nZ\a\x03\x80\x01\x16\x01\x01\x14\x18\x02\x0e"}, + {"net/http/httptest", "\x02\x01\nF\x02\x1b\x01\x80\x01\x04\x12\x01\n\t\x02\x17\x01\x02\x0e\x0e"}, + {"net/http/httptrace", "\rFnF\x14\n "}, + {"net/http/httputil", "\x02\x01\na\x03\x80\x01\x04\x0f\x03\x01\x05\x02\x01\v\x01\x19\x02\x0e\x0e"}, + {"net/http/internal", "\x02\x01k\x03\x80\x01"}, + {"net/http/internal/ascii", "\xb5\x02\x12"}, + {"net/http/internal/httpcommon", "\ra\x03\x9c\x01\x0e\x01\x17\x01\x01\x02\x1c\x02"}, + {"net/http/internal/testcert", "\xb5\x02"}, + {"net/http/pprof", "\x02\x01\nd\x18-\x11*\x04\x13\x14\x01\r\x04\x03\x01\x02\x01\x10"}, {"net/internal/cgotest", ""}, - {"net/internal/socktest", "p\xc2\x01\x02"}, - {"net/mail", "\x02k\x03z\x04\x0f\x03\x14\x1c\x02\r\x04"}, - {"net/netip", "\x04i+\x01#;\x026\x15"}, - {"net/rpc", "\x02f\x05\x03\x10\n`\x04\x12\x01\x1d\x0f\x03\x02"}, - {"net/rpc/jsonrpc", "j\x03\x03z\x16\x11!"}, - {"net/smtp", "\x19.\v\x13\b\x03z\x16\x14\x1c"}, - {"net/textproto", "\x02\x01j\x03z\r\t/\x01\x02\x13"}, - {"net/url", "m\x03\x86\x01%\x12\x02\x01\x15"}, - {"os", "m+\x01\x18\x03\b\t\r\x03\x01\x04\x10\x018\n\x05\x01\x01\v\x06"}, - {"os/exec", "\x03\n`H \x01\x14\x01+\x06\a\f\x01\x04\v"}, - {"os/exec/internal/fdtest", "\xb4\x02"}, - {"os/signal", "\r\x89\x02\x17\x05\x02"}, - {"os/user", "\x02\x01j\x03z,\r\f\x01\x02"}, - {"path", "m+\xab\x01"}, - {"path/filepath", "m+\x19:+\r\n\x03\x04\x0f"}, - {"plugin", "m"}, - {"reflect", "m'\x04\x1c\b\f\x04\x02\x19\x10,\f\x03\x0f\x02\x02"}, + {"net/internal/socktest", "q\xc6\x01\x02"}, + {"net/mail", "\x02l\x03\x80\x01\x04\x0f\x03\x14\x1a\x02\x0e\x04"}, + {"net/netip", "\x04j*\x01$@\x034\x16"}, + {"net/rpc", "\x02g\x05\x03\x0f\ng\x04\x12\x01\x1d\r\x03\x02"}, + {"net/rpc/jsonrpc", "k\x03\x03\x80\x01\x16\x11\x1f"}, + {"net/smtp", "\x19/\v\x13\b\x03\x80\x01\x16\x14\x1a"}, + {"net/textproto", "\x02\x01k\x03\x80\x01\f\n-\x01\x02\x14"}, + {"net/url", "n\x03\x8b\x01&\x10\x02\x01\x16"}, + {"os", "n*\x01\x19\x03\b\t\x12\x03\x01\x05\x10\x018\b\x05\x01\x01\f\x06"}, + {"os/exec", "\x03\naH%\x01\x15\x01+\x06\a\n\x01\x04\f"}, + {"os/exec/internal/fdtest", "\xb9\x02"}, + {"os/signal", "\r\x90\x02\x15\x05\x02"}, + {"os/user", "\x02\x01k\x03\x80\x01,\r\n\x01\x02"}, + {"path", "n*\xb1\x01"}, + {"path/filepath", "n*\x1a@+\r\b\x03\x04\x10"}, + {"plugin", "n"}, + {"reflect", "n&\x04\x1d\b\f\x06\x04\x1b\x06\t-\n\x03\x10\x02\x02"}, {"reflect/internal/example1", ""}, {"reflect/internal/example2", ""}, - {"regexp", "\x03\xe7\x018\v\x02\x01\x02\x0f\x02"}, - {"regexp/syntax", "\xad\x02\x01\x01\x01\x11\x02"}, - {"runtime", "\x94\x01\x04\x01\x02\f\x06\a\x02\x01\x01\x0f\x03\x01\x01\x01\x01\x01\x03\x0fd"}, - {"runtime/coverage", "\x9f\x01K"}, - {"runtime/debug", "pUQ\r\n\x02\x01\x0f\x06"}, - {"runtime/internal/startlinetest", ""}, - {"runtime/internal/wasitest", ""}, - {"runtime/metrics", "\xb6\x01A,\""}, - {"runtime/pprof", "\x02\x01\x01\x03\x06Y\a\x03$3#\r\x1f\r\n\x01\x01\x01\x02\x02\b\x03\x06"}, - {"runtime/race", "\xab\x02"}, + {"regexp", "\x03\xee\x018\t\x02\x01\x02\x10\x02"}, + {"regexp/syntax", "\xb2\x02\x01\x01\x01\x02\x10\x02"}, + {"runtime", "\x94\x01\x04\x01\x03\f\x06\a\x02\x01\x01\x0f\x03\x01\x01\x01\x01\x01\x02\x01\x01\x04\x10c"}, + {"runtime/coverage", "\xa0\x01Q"}, + {"runtime/debug", "qUW\r\b\x02\x01\x10\x06"}, + {"runtime/metrics", "\xb7\x01F-!"}, + {"runtime/pprof", "\x02\x01\x01\x03\x06Z\a\x03#4)\f \r\b\x01\x01\x01\x02\x02\t\x03\x06"}, + {"runtime/race", "\xb0\x02"}, {"runtime/race/internal/amd64v1", ""}, - {"runtime/trace", "\rcz9\x0f\x01\x12"}, - {"slices", "\x04\xe9\x01\fL"}, - {"sort", "\xc9\x0104"}, - {"strconv", "m+:%\x02J"}, - {"strings", "m'\x04:\x18\x03\f9\x0f\x02\x02"}, + {"runtime/trace", "\ra\x03w\t9\b\x05\x01\r\x06"}, + {"slices", "\x04\xf0\x01\fK"}, + {"sort", "\xca\x0162"}, + {"strconv", "n*@%\x03I"}, + {"strings", "n&\x04@\x19\x03\f7\x10\x02\x02"}, {"structs", ""}, - {"sync", "\xc8\x01\vP\x10\x12"}, - {"sync/atomic", "\xc5\x02"}, - {"syscall", "m(\x03\x01\x1b\b\x03\x03\x06\aT\n\x05\x01\x12"}, - {"testing", "\x03\n`\x02\x01X\x0f\x13\r\x04\x1b\x06\x02\x05\x02\a\x01\x02\x01\x02\x01\f\x02\x02\x02"}, - {"testing/fstest", "m\x03z\x01\v%\x12\x03\b\a"}, - {"testing/internal/testdeps", "\x02\v\xa6\x01'\x10,\x03\x05\x03\b\a\x02\r"}, - {"testing/iotest", "\x03j\x03z\x04"}, - {"testing/quick", "o\x01\x87\x01\x04#\x12\x0f"}, - {"testing/slogtest", "\r`\x03\x80\x01.\x05\x12\n"}, - {"text/scanner", "\x03mz,+\x02"}, - {"text/tabwriter", "pzY"}, - {"text/template", "m\x03B8\x01\v\x1f\x01\x05\x01\x02\x05\r\x02\f\x03\x02"}, - {"text/template/parse", "\x03m\xb3\x01\f\x01\x11\x02"}, - {"time", "m+\x1d\x1d'*\x0f\x02\x11"}, - {"time/tzdata", "m\xc7\x01\x11"}, + {"sync", "\xc9\x01\x10\x01P\x0e\x13"}, + {"sync/atomic", "\xcb\x02"}, + {"syscall", "n'\x03\x01\x1c\b\x03\x03\x06\vV\b\x05\x01\x13"}, + {"testing", "\x03\na\x02\x01X\x14\x14\f\x05\x1b\x06\x02\x05\x02\x05\x01\x02\x01\x02\x01\r\x02\x02\x02"}, + {"testing/fstest", "n\x03\x80\x01\x01\n&\x10\x03\b\b"}, + {"testing/internal/testdeps", "\x02\v\xa7\x01-\x10,\x03\x05\x03\x06\a\x02\x0e"}, + {"testing/iotest", "\x03k\x03\x80\x01\x04"}, + {"testing/quick", "p\x01\x8c\x01\x05#\x10\x10"}, + {"testing/slogtest", "\ra\x03\x86\x01.\x05\x10\v"}, + {"testing/synctest", "\xda\x01`\x11"}, + {"text/scanner", "\x03n\x80\x01,*\x02"}, + {"text/tabwriter", "q\x80\x01X"}, + {"text/template", "n\x03B>\x01\n \x01\x05\x01\x02\x05\v\x02\r\x03\x02"}, + {"text/template/parse", "\x03n\xb9\x01\n\x01\x12\x02"}, + {"time", "n*\x1e\"(*\r\x02\x12"}, + {"time/tzdata", "n\xcb\x01\x12"}, {"unicode", ""}, {"unicode/utf16", ""}, {"unicode/utf8", ""}, - {"unique", "\x94\x01>\x01P\x0f\x13\x12"}, + {"unique", "\x94\x01!#\x01Q\r\x01\x13\x12"}, {"unsafe", ""}, - {"vendor/golang.org/x/crypto/chacha20", "\x10V\a\x8c\x01*'"}, - {"vendor/golang.org/x/crypto/chacha20poly1305", "\x10V\a\xd9\x01\x04\x01\a"}, - {"vendor/golang.org/x/crypto/cryptobyte", "c\n\x03\x88\x01&!\n"}, + {"vendor/golang.org/x/crypto/chacha20", "\x10W\a\x92\x01*&"}, + {"vendor/golang.org/x/crypto/chacha20poly1305", "\x10W\a\xde\x01\x04\x01\a"}, + {"vendor/golang.org/x/crypto/cryptobyte", "d\n\x03\x8d\x01' \n"}, {"vendor/golang.org/x/crypto/cryptobyte/asn1", ""}, - {"vendor/golang.org/x/crypto/internal/alias", "\xc5\x02"}, - {"vendor/golang.org/x/crypto/internal/poly1305", "Q\x15\x93\x01"}, - {"vendor/golang.org/x/net/dns/dnsmessage", "m"}, - {"vendor/golang.org/x/net/http/httpguts", "\x80\x02\x14\x1c\x13\r"}, - {"vendor/golang.org/x/net/http/httpproxy", "m\x03\x90\x01\x15\x01\x1a\x13\r"}, - {"vendor/golang.org/x/net/http2/hpack", "\x03j\x03zH"}, - {"vendor/golang.org/x/net/idna", "p\x87\x019\x13\x10\x02\x01"}, - {"vendor/golang.org/x/net/nettest", "\x03c\a\x03z\x11\x05\x16\x01\f\f\x01\x02\x02\x01\n"}, - {"vendor/golang.org/x/sys/cpu", "\x96\x02\r\f\x01\x15"}, - {"vendor/golang.org/x/text/secure/bidirule", "m\xd6\x01\x11\x01"}, - {"vendor/golang.org/x/text/transform", "\x03j}Y"}, - {"vendor/golang.org/x/text/unicode/bidi", "\x03\be~@\x15"}, - {"vendor/golang.org/x/text/unicode/norm", "f\nzH\x11\x11"}, - {"weak", "\x94\x01\x8f\x01\""}, + {"vendor/golang.org/x/crypto/internal/alias", "\xcb\x02"}, + {"vendor/golang.org/x/crypto/internal/poly1305", "R\x15\x99\x01"}, + {"vendor/golang.org/x/net/dns/dnsmessage", "n"}, + {"vendor/golang.org/x/net/http/httpguts", "\x87\x02\x14\x1a\x14\r"}, + {"vendor/golang.org/x/net/http/httpproxy", "n\x03\x96\x01\x10\x05\x01\x18\x14\r"}, + {"vendor/golang.org/x/net/http2/hpack", "\x03k\x03\x80\x01F"}, + {"vendor/golang.org/x/net/idna", "q\x8c\x018\x14\x10\x02\x01"}, + {"vendor/golang.org/x/net/nettest", "\x03d\a\x03\x80\x01\x11\x05\x16\x01\f\n\x01\x02\x02\x01\v"}, + {"vendor/golang.org/x/sys/cpu", "\x9d\x02\r\n\x01\x16"}, + {"vendor/golang.org/x/text/secure/bidirule", "n\xdb\x01\x11\x01"}, + {"vendor/golang.org/x/text/transform", "\x03k\x83\x01X"}, + {"vendor/golang.org/x/text/unicode/bidi", "\x03\bf\x84\x01>\x16"}, + {"vendor/golang.org/x/text/unicode/norm", "g\n\x80\x01F\x12\x11"}, + {"weak", "\x94\x01\x96\x01!"}, } diff --git a/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/vendor/golang.org/x/tools/internal/stdlib/manifest.go index 64f0326b64..c1faa50d36 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/manifest.go +++ b/vendor/golang.org/x/tools/internal/stdlib/manifest.go @@ -502,6 +502,7 @@ var PackageSymbols = map[string][]Symbol{ {"MD4", Const, 0, ""}, {"MD5", Const, 0, ""}, {"MD5SHA1", Const, 0, ""}, + {"MessageSigner", Type, 25, ""}, {"PrivateKey", Type, 0, ""}, {"PublicKey", Type, 2, ""}, {"RIPEMD160", Const, 0, ""}, @@ -517,6 +518,7 @@ var PackageSymbols = map[string][]Symbol{ {"SHA512", Const, 0, ""}, {"SHA512_224", Const, 5, ""}, {"SHA512_256", Const, 5, ""}, + {"SignMessage", Func, 25, "func(signer Signer, rand io.Reader, msg []byte, opts SignerOpts) (signature []byte, err error)"}, {"Signer", Type, 4, ""}, {"SignerOpts", Type, 4, ""}, }, @@ -600,10 +602,12 @@ var PackageSymbols = map[string][]Symbol{ {"X25519", Func, 20, "func() Curve"}, }, "crypto/ecdsa": { + {"(*PrivateKey).Bytes", Method, 25, ""}, {"(*PrivateKey).ECDH", Method, 20, ""}, {"(*PrivateKey).Equal", Method, 15, ""}, {"(*PrivateKey).Public", Method, 4, ""}, {"(*PrivateKey).Sign", Method, 4, ""}, + {"(*PublicKey).Bytes", Method, 25, ""}, {"(*PublicKey).ECDH", Method, 20, ""}, {"(*PublicKey).Equal", Method, 15, ""}, {"(PrivateKey).Add", Method, 0, ""}, @@ -619,6 +623,8 @@ var PackageSymbols = map[string][]Symbol{ {"(PublicKey).ScalarBaseMult", Method, 0, ""}, {"(PublicKey).ScalarMult", Method, 0, ""}, {"GenerateKey", Func, 0, "func(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)"}, + {"ParseRawPrivateKey", Func, 25, "func(curve elliptic.Curve, data []byte) (*PrivateKey, error)"}, + {"ParseUncompressedPublicKey", Func, 25, "func(curve elliptic.Curve, data []byte) (*PublicKey, error)"}, {"PrivateKey", Type, 0, ""}, {"PrivateKey.D", Field, 0, ""}, {"PrivateKey.PublicKey", Field, 0, ""}, @@ -815,6 +821,7 @@ var PackageSymbols = map[string][]Symbol{ "crypto/sha3": { {"(*SHA3).AppendBinary", Method, 24, ""}, {"(*SHA3).BlockSize", Method, 24, ""}, + {"(*SHA3).Clone", Method, 25, ""}, {"(*SHA3).MarshalBinary", Method, 24, ""}, {"(*SHA3).Reset", Method, 24, ""}, {"(*SHA3).Size", Method, 24, ""}, @@ -967,6 +974,7 @@ var PackageSymbols = map[string][]Symbol{ {"Config.GetCertificate", Field, 4, ""}, {"Config.GetClientCertificate", Field, 8, ""}, {"Config.GetConfigForClient", Field, 8, ""}, + {"Config.GetEncryptedClientHelloKeys", Field, 25, ""}, {"Config.InsecureSkipVerify", Field, 0, ""}, {"Config.KeyLogWriter", Field, 8, ""}, {"Config.MaxVersion", Field, 2, ""}, @@ -5463,6 +5471,7 @@ var PackageSymbols = map[string][]Symbol{ {"ParenExpr.X", Field, 0, ""}, {"Pkg", Const, 0, ""}, {"Preorder", Func, 23, "func(root Node) iter.Seq[Node]"}, + {"PreorderStack", Func, 25, "func(root Node, stack []Node, f func(n Node, stack []Node) bool)"}, {"Print", Func, 0, "func(fset *token.FileSet, x any) error"}, {"RECV", Const, 0, ""}, {"RangeStmt", Type, 0, ""}, @@ -5933,6 +5942,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*File).SetLines", Method, 0, ""}, {"(*File).SetLinesForContent", Method, 0, ""}, {"(*File).Size", Method, 0, ""}, + {"(*FileSet).AddExistingFiles", Method, 25, ""}, {"(*FileSet).AddFile", Method, 0, ""}, {"(*FileSet).Base", Method, 0, ""}, {"(*FileSet).File", Method, 0, ""}, @@ -6382,7 +6392,7 @@ var PackageSymbols = map[string][]Symbol{ {"Label", Type, 5, ""}, {"LocalVar", Const, 25, ""}, {"LookupFieldOrMethod", Func, 5, "func(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool)"}, - {"LookupSelection", Func, 25, ""}, + {"LookupSelection", Func, 25, "func(T Type, addressable bool, pkg *Package, name string) (Selection, bool)"}, {"Map", Type, 5, ""}, {"MethodExpr", Const, 5, ""}, {"MethodSet", Type, 5, ""}, @@ -6490,9 +6500,11 @@ var PackageSymbols = map[string][]Symbol{ {"Lang", Func, 22, "func(x string) string"}, }, "hash": { + {"Cloner", Type, 25, ""}, {"Hash", Type, 0, ""}, {"Hash32", Type, 0, ""}, {"Hash64", Type, 0, ""}, + {"XOF", Type, 25, ""}, }, "hash/adler32": { {"Checksum", Func, 0, "func(data []byte) uint32"}, @@ -6533,6 +6545,7 @@ var PackageSymbols = map[string][]Symbol{ }, "hash/maphash": { {"(*Hash).BlockSize", Method, 14, ""}, + {"(*Hash).Clone", Method, 25, ""}, {"(*Hash).Reset", Method, 14, ""}, {"(*Hash).Seed", Method, 14, ""}, {"(*Hash).SetSeed", Method, 14, ""}, @@ -7133,7 +7146,7 @@ var PackageSymbols = map[string][]Symbol{ {"FormatFileInfo", Func, 21, "func(info FileInfo) string"}, {"Glob", Func, 16, "func(fsys FS, pattern string) (matches []string, err error)"}, {"GlobFS", Type, 16, ""}, - {"Lstat", Func, 25, ""}, + {"Lstat", Func, 25, "func(fsys FS, name string) (FileInfo, error)"}, {"ModeAppend", Const, 16, ""}, {"ModeCharDevice", Const, 16, ""}, {"ModeDevice", Const, 16, ""}, @@ -7158,7 +7171,7 @@ var PackageSymbols = map[string][]Symbol{ {"ReadDirFile", Type, 16, ""}, {"ReadFile", Func, 16, "func(fsys FS, name string) ([]byte, error)"}, {"ReadFileFS", Type, 16, ""}, - {"ReadLink", Func, 25, ""}, + {"ReadLink", Func, 25, "func(fsys FS, name string) (string, error)"}, {"ReadLinkFS", Type, 25, ""}, {"SkipAll", Var, 20, ""}, {"SkipDir", Var, 16, ""}, @@ -7275,6 +7288,7 @@ var PackageSymbols = map[string][]Symbol{ {"(Record).Attrs", Method, 21, ""}, {"(Record).Clone", Method, 21, ""}, {"(Record).NumAttrs", Method, 21, ""}, + {"(Record).Source", Method, 25, ""}, {"(Value).Any", Method, 21, ""}, {"(Value).Bool", Method, 21, ""}, {"(Value).Duration", Method, 21, ""}, @@ -7306,6 +7320,7 @@ var PackageSymbols = map[string][]Symbol{ {"Float64", Func, 21, "func(key string, v float64) Attr"}, {"Float64Value", Func, 21, "func(v float64) Value"}, {"Group", Func, 21, "func(key string, args ...any) Attr"}, + {"GroupAttrs", Func, 25, "func(key string, attrs ...Attr) Attr"}, {"GroupValue", Func, 21, "func(as ...Attr) Value"}, {"Handler", Type, 21, ""}, {"HandlerOptions", Type, 21, ""}, @@ -7916,7 +7931,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).WriteField", Method, 0, ""}, {"ErrMessageTooLarge", Var, 9, ""}, {"File", Type, 0, ""}, - {"FileContentDisposition", Func, 25, ""}, + {"FileContentDisposition", Func, 25, "func(fieldname string, filename string) string"}, {"FileHeader", Type, 0, ""}, {"FileHeader.Filename", Field, 0, ""}, {"FileHeader.Header", Field, 0, ""}, @@ -8294,6 +8309,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*Client).PostForm", Method, 0, ""}, {"(*Cookie).String", Method, 0, ""}, {"(*Cookie).Valid", Method, 18, ""}, + {"(*CrossOriginProtection).AddInsecureBypassPattern", Method, 25, ""}, + {"(*CrossOriginProtection).AddTrustedOrigin", Method, 25, ""}, + {"(*CrossOriginProtection).Check", Method, 25, ""}, + {"(*CrossOriginProtection).Handler", Method, 25, ""}, + {"(*CrossOriginProtection).SetDenyHandler", Method, 25, ""}, {"(*MaxBytesError).Error", Method, 19, ""}, {"(*ProtocolError).Error", Method, 0, ""}, {"(*ProtocolError).Is", Method, 21, ""}, @@ -8388,6 +8408,7 @@ var PackageSymbols = map[string][]Symbol{ {"Cookie.Unparsed", Field, 0, ""}, {"Cookie.Value", Field, 0, ""}, {"CookieJar", Type, 0, ""}, + {"CrossOriginProtection", Type, 25, ""}, {"DefaultClient", Var, 0, ""}, {"DefaultMaxHeaderBytes", Const, 0, ""}, {"DefaultMaxIdleConnsPerHost", Const, 0, ""}, @@ -8460,6 +8481,7 @@ var PackageSymbols = map[string][]Symbol{ {"MethodPost", Const, 6, ""}, {"MethodPut", Const, 6, ""}, {"MethodTrace", Const, 6, ""}, + {"NewCrossOriginProtection", Func, 25, "func() *CrossOriginProtection"}, {"NewFileTransport", Func, 0, "func(fs FileSystem) RoundTripper"}, {"NewFileTransportFS", Func, 22, "func(fsys fs.FS) RoundTripper"}, {"NewRequest", Func, 0, "func(method string, url string, body io.Reader) (*Request, error)"}, @@ -9174,15 +9196,19 @@ var PackageSymbols = map[string][]Symbol{ {"(*Root).Link", Method, 25, ""}, {"(*Root).Lstat", Method, 24, ""}, {"(*Root).Mkdir", Method, 24, ""}, + {"(*Root).MkdirAll", Method, 25, ""}, {"(*Root).Name", Method, 24, ""}, {"(*Root).Open", Method, 24, ""}, {"(*Root).OpenFile", Method, 24, ""}, {"(*Root).OpenRoot", Method, 24, ""}, + {"(*Root).ReadFile", Method, 25, ""}, {"(*Root).Readlink", Method, 25, ""}, {"(*Root).Remove", Method, 24, ""}, + {"(*Root).RemoveAll", Method, 25, ""}, {"(*Root).Rename", Method, 25, ""}, {"(*Root).Stat", Method, 24, ""}, {"(*Root).Symlink", Method, 25, ""}, + {"(*Root).WriteFile", Method, 25, ""}, {"(*SyscallError).Error", Method, 0, ""}, {"(*SyscallError).Timeout", Method, 10, ""}, {"(*SyscallError).Unwrap", Method, 13, ""}, @@ -9623,6 +9649,7 @@ var PackageSymbols = map[string][]Symbol{ {"StructTag", Type, 0, ""}, {"Swapper", Func, 8, "func(slice any) func(i int, j int)"}, {"Type", Type, 0, ""}, + {"TypeAssert", Func, 25, "func[T any](v Value) (T, bool)"}, {"TypeFor", Func, 22, "func[T any]() Type"}, {"TypeOf", Func, 0, "func(i any) Type"}, {"Uint", Const, 0, ""}, @@ -9909,6 +9936,7 @@ var PackageSymbols = map[string][]Symbol{ {"SetBlockProfileRate", Func, 1, "func(rate int)"}, {"SetCPUProfileRate", Func, 0, "func(hz int)"}, {"SetCgoTraceback", Func, 7, "func(version int, traceback unsafe.Pointer, context unsafe.Pointer, symbolizer unsafe.Pointer)"}, + {"SetDefaultGOMAXPROCS", Func, 25, "func()"}, {"SetFinalizer", Func, 0, "func(obj any, finalizer any)"}, {"SetMutexProfileFraction", Func, 8, "func(rate int) int"}, {"Stack", Func, 0, "func(buf []byte, all bool) int"}, @@ -10021,11 +10049,20 @@ var PackageSymbols = map[string][]Symbol{ {"WriteHeapProfile", Func, 0, "func(w io.Writer) error"}, }, "runtime/trace": { + {"(*FlightRecorder).Enabled", Method, 25, ""}, + {"(*FlightRecorder).Start", Method, 25, ""}, + {"(*FlightRecorder).Stop", Method, 25, ""}, + {"(*FlightRecorder).WriteTo", Method, 25, ""}, {"(*Region).End", Method, 11, ""}, {"(*Task).End", Method, 11, ""}, + {"FlightRecorder", Type, 25, ""}, + {"FlightRecorderConfig", Type, 25, ""}, + {"FlightRecorderConfig.MaxBytes", Field, 25, ""}, + {"FlightRecorderConfig.MinAge", Field, 25, ""}, {"IsEnabled", Func, 11, "func() bool"}, {"Log", Func, 11, "func(ctx context.Context, category string, message string)"}, {"Logf", Func, 11, "func(ctx context.Context, category string, format string, args ...any)"}, + {"NewFlightRecorder", Func, 25, "func(cfg FlightRecorderConfig) *FlightRecorder"}, {"NewTask", Func, 11, "func(pctx context.Context, taskType string) (ctx context.Context, task *Task)"}, {"Region", Type, 11, ""}, {"Start", Func, 5, "func(w io.Writer) error"}, @@ -16642,6 +16679,7 @@ var PackageSymbols = map[string][]Symbol{ {"ValueOf", Func, 0, ""}, }, "testing": { + {"(*B).Attr", Method, 25, ""}, {"(*B).Chdir", Method, 24, ""}, {"(*B).Cleanup", Method, 14, ""}, {"(*B).Context", Method, 24, ""}, @@ -16658,6 +16696,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*B).Logf", Method, 0, ""}, {"(*B).Loop", Method, 24, ""}, {"(*B).Name", Method, 8, ""}, + {"(*B).Output", Method, 25, ""}, {"(*B).ReportAllocs", Method, 1, ""}, {"(*B).ReportMetric", Method, 13, ""}, {"(*B).ResetTimer", Method, 0, ""}, @@ -16674,6 +16713,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*B).StopTimer", Method, 0, ""}, {"(*B).TempDir", Method, 15, ""}, {"(*F).Add", Method, 18, ""}, + {"(*F).Attr", Method, 25, ""}, {"(*F).Chdir", Method, 24, ""}, {"(*F).Cleanup", Method, 18, ""}, {"(*F).Context", Method, 24, ""}, @@ -16689,6 +16729,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*F).Log", Method, 18, ""}, {"(*F).Logf", Method, 18, ""}, {"(*F).Name", Method, 18, ""}, + {"(*F).Output", Method, 25, ""}, {"(*F).Setenv", Method, 18, ""}, {"(*F).Skip", Method, 18, ""}, {"(*F).SkipNow", Method, 18, ""}, @@ -16697,6 +16738,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*F).TempDir", Method, 18, ""}, {"(*M).Run", Method, 4, ""}, {"(*PB).Next", Method, 3, ""}, + {"(*T).Attr", Method, 25, ""}, {"(*T).Chdir", Method, 24, ""}, {"(*T).Cleanup", Method, 14, ""}, {"(*T).Context", Method, 24, ""}, @@ -16712,6 +16754,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*T).Log", Method, 0, ""}, {"(*T).Logf", Method, 0, ""}, {"(*T).Name", Method, 8, ""}, + {"(*T).Output", Method, 25, ""}, {"(*T).Parallel", Method, 0, ""}, {"(*T).Run", Method, 7, ""}, {"(*T).Setenv", Method, 17, ""}, @@ -16834,6 +16877,10 @@ var PackageSymbols = map[string][]Symbol{ {"Run", Func, 22, "func(t *testing.T, newHandler func(*testing.T) slog.Handler, result func(*testing.T) map[string]any)"}, {"TestHandler", Func, 21, "func(h slog.Handler, results func() []map[string]any) error"}, }, + "testing/synctest": { + {"Test", Func, 25, "func(t *testing.T, f func(*testing.T))"}, + {"Wait", Func, 25, "func()"}, + }, "text/scanner": { {"(*Position).IsValid", Method, 0, ""}, {"(*Scanner).Init", Method, 0, ""}, @@ -17347,6 +17394,7 @@ var PackageSymbols = map[string][]Symbol{ {"CaseRange.Lo", Field, 0, ""}, {"CaseRanges", Var, 0, ""}, {"Categories", Var, 0, ""}, + {"CategoryAliases", Var, 25, ""}, {"Caucasian_Albanian", Var, 4, ""}, {"Cc", Var, 0, ""}, {"Cf", Var, 0, ""}, @@ -17354,6 +17402,7 @@ var PackageSymbols = map[string][]Symbol{ {"Cham", Var, 0, ""}, {"Cherokee", Var, 0, ""}, {"Chorasmian", Var, 16, ""}, + {"Cn", Var, 25, ""}, {"Co", Var, 0, ""}, {"Common", Var, 0, ""}, {"Coptic", Var, 0, ""}, @@ -17432,6 +17481,7 @@ var PackageSymbols = map[string][]Symbol{ {"Khojki", Var, 4, ""}, {"Khudawadi", Var, 4, ""}, {"L", Var, 0, ""}, + {"LC", Var, 25, ""}, {"Lao", Var, 0, ""}, {"Latin", Var, 0, ""}, {"Lepcha", Var, 0, ""}, diff --git a/vendor/golang.org/x/tools/internal/typesinternal/fx.go b/vendor/golang.org/x/tools/internal/typesinternal/fx.go new file mode 100644 index 0000000000..93acff2170 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typesinternal/fx.go @@ -0,0 +1,49 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typesinternal + +import ( + "go/ast" + "go/token" + "go/types" +) + +// NoEffects reports whether the expression has no side effects, i.e., it +// does not modify the memory state. This function is conservative: it may +// return false even when the expression has no effect. +func NoEffects(info *types.Info, expr ast.Expr) bool { + noEffects := true + ast.Inspect(expr, func(n ast.Node) bool { + switch v := n.(type) { + case nil, *ast.Ident, *ast.BasicLit, *ast.BinaryExpr, *ast.ParenExpr, + *ast.SelectorExpr, *ast.IndexExpr, *ast.SliceExpr, *ast.TypeAssertExpr, + *ast.StarExpr, *ast.CompositeLit, *ast.ArrayType, *ast.StructType, + *ast.MapType, *ast.InterfaceType, *ast.KeyValueExpr: + // No effect + case *ast.UnaryExpr: + // Channel send <-ch has effects + if v.Op == token.ARROW { + noEffects = false + } + case *ast.CallExpr: + // Type conversion has no effects + if !info.Types[v.Fun].IsType() { + // TODO(adonovan): Add a case for built-in functions without side + // effects (by using callsPureBuiltin from tools/internal/refactor/inline) + + noEffects = false + } + case *ast.FuncLit: + // A FuncLit has no effects, but do not descend into it. + return false + default: + // All other expressions have effects + noEffects = false + } + + return noEffects + }) + return noEffects +} diff --git a/vendor/golang.org/x/tools/internal/typesinternal/isnamed.go b/vendor/golang.org/x/tools/internal/typesinternal/isnamed.go new file mode 100644 index 0000000000..f2affec4fb --- /dev/null +++ b/vendor/golang.org/x/tools/internal/typesinternal/isnamed.go @@ -0,0 +1,71 @@ +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package typesinternal + +import ( + "go/types" + "slices" +) + +// IsTypeNamed reports whether t is (or is an alias for) a +// package-level defined type with the given package path and one of +// the given names. It returns false if t is nil. +// +// This function avoids allocating the concatenation of "pkg.Name", +// which is important for the performance of syntax matching. +func IsTypeNamed(t types.Type, pkgPath string, names ...string) bool { + if named, ok := types.Unalias(t).(*types.Named); ok { + tname := named.Obj() + return tname != nil && + IsPackageLevel(tname) && + tname.Pkg().Path() == pkgPath && + slices.Contains(names, tname.Name()) + } + return false +} + +// IsPointerToNamed reports whether t is (or is an alias for) a pointer to a +// package-level defined type with the given package path and one of the given +// names. It returns false if t is not a pointer type. +func IsPointerToNamed(t types.Type, pkgPath string, names ...string) bool { + r := Unpointer(t) + if r == t { + return false + } + return IsTypeNamed(r, pkgPath, names...) +} + +// IsFunctionNamed reports whether obj is a package-level function +// defined in the given package and has one of the given names. +// It returns false if obj is nil. +// +// This function avoids allocating the concatenation of "pkg.Name", +// which is important for the performance of syntax matching. +func IsFunctionNamed(obj types.Object, pkgPath string, names ...string) bool { + f, ok := obj.(*types.Func) + return ok && + IsPackageLevel(obj) && + f.Pkg().Path() == pkgPath && + f.Type().(*types.Signature).Recv() == nil && + slices.Contains(names, f.Name()) +} + +// IsMethodNamed reports whether obj is a method defined on a +// package-level type with the given package and type name, and has +// one of the given names. It returns false if obj is nil. +// +// This function avoids allocating the concatenation of "pkg.TypeName.Name", +// which is important for the performance of syntax matching. +func IsMethodNamed(obj types.Object, pkgPath string, typeName string, names ...string) bool { + if fn, ok := obj.(*types.Func); ok { + if recv := fn.Type().(*types.Signature).Recv(); recv != nil { + _, T := ReceiverNamed(recv) + return T != nil && + IsTypeNamed(T, pkgPath, typeName) && + slices.Contains(names, fn.Name()) + } + } + return false +} diff --git a/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go b/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go index b64f714eb3..64f47919f0 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/qualifier.go @@ -15,6 +15,14 @@ import ( // file. // If the same package is imported multiple times, the last appearance is // recorded. +// +// TODO(adonovan): this function ignores the effect of shadowing. It +// should accept a [token.Pos] and a [types.Info] and compute only the +// set of imports that are not shadowed at that point, analogous to +// [analysisinternal.AddImport]. It could also compute (as a side +// effect) the set of additional imports required to ensure that there +// is an accessible import for each necessary package, making it +// converge even more closely with AddImport. func FileQualifier(f *ast.File, pkg *types.Package) types.Qualifier { // Construct mapping of import paths to their defined names. // It is only necessary to look at renaming imports. diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index a5cd7e8dbf..fef74a7856 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -2,8 +2,20 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package typesinternal provides access to internal go/types APIs that are not -// yet exported. +// Package typesinternal provides helpful operators for dealing with +// go/types: +// +// - operators for querying typed syntax trees (e.g. [Imports], [IsFunctionNamed]); +// - functions for converting types to strings or syntax (e.g. [TypeExpr], FileQualifier]); +// - helpers for working with the [go/types] API (e.g. [NewTypesInfo]); +// - access to internal go/types APIs that are not yet +// exported (e.g. [SetUsesCgo], [ErrorCodeStartEnd], [VarKind]); and +// - common algorithms related to types (e.g. [TooNewStdSymbols]). +// +// See also: +// - [golang.org/x/tools/internal/astutil], for operations on untyped syntax; +// - [golang.org/x/tools/internal/analysisinernal], for helpers for analyzers; +// - [golang.org/x/tools/internal/refactor], for operators to compute text edits. package typesinternal import ( @@ -13,6 +25,7 @@ import ( "reflect" "unsafe" + "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/internal/aliases" ) @@ -60,6 +73,9 @@ func ErrorCodeStartEnd(err types.Error) (code ErrorCode, start, end token.Pos, o // which is often excessive.) // // If pkg is nil, it is equivalent to [*types.Package.Name]. +// +// TODO(adonovan): all uses of this with TypeString should be +// eliminated when https://go.dev/issues/75604 is resolved. func NameRelativeTo(pkg *types.Package) types.Qualifier { return func(other *types.Package) string { if pkg != nil && pkg == other { @@ -153,3 +169,31 @@ func NewTypesInfo() *types.Info { FileVersions: map[*ast.File]string{}, } } + +// EnclosingScope returns the innermost block logically enclosing the cursor. +func EnclosingScope(info *types.Info, cur inspector.Cursor) *types.Scope { + for cur := range cur.Enclosing() { + n := cur.Node() + // A function's Scope is associated with its FuncType. + switch f := n.(type) { + case *ast.FuncDecl: + n = f.Type + case *ast.FuncLit: + n = f.Type + } + if b := info.Scopes[n]; b != nil { + return b + } + } + panic("no Scope for *ast.File") +} + +// Imports reports whether path is imported by pkg. +func Imports(pkg *types.Package, path string) bool { + for _, imp := range pkg.Imports() { + if imp.Path() == path { + return true + } + } + return false +} diff --git a/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go b/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go index d272949c17..453bba2ad5 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/zerovalue.go @@ -204,23 +204,12 @@ func ZeroExpr(t types.Type, qual types.Qualifier) (_ ast.Expr, isValid bool) { } } -// IsZeroExpr uses simple syntactic heuristics to report whether expr -// is a obvious zero value, such as 0, "", nil, or false. -// It cannot do better without type information. -func IsZeroExpr(expr ast.Expr) bool { - switch e := expr.(type) { - case *ast.BasicLit: - return e.Value == "0" || e.Value == `""` - case *ast.Ident: - return e.Name == "nil" || e.Name == "false" - default: - return false - } -} - // TypeExpr returns syntax for the specified type. References to named types // are qualified by an appropriate (optional) qualifier function. // It may panic for types such as Tuple or Union. +// +// See also https://go.dev/issues/75604, which will provide a robust +// Type-to-valid-Go-syntax formatter. func TypeExpr(t types.Type, qual types.Qualifier) ast.Expr { switch t := t.(type) { case *types.Basic: diff --git a/vendor/golang.org/x/xerrors/LICENSE b/vendor/golang.org/x/xerrors/LICENSE deleted file mode 100644 index c3c8b7d2b8..0000000000 --- a/vendor/golang.org/x/xerrors/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright 2019 The Go Authors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google LLC nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/xerrors/PATENTS b/vendor/golang.org/x/xerrors/PATENTS deleted file mode 100644 index 733099041f..0000000000 --- a/vendor/golang.org/x/xerrors/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/xerrors/README b/vendor/golang.org/x/xerrors/README deleted file mode 100644 index aac7867a56..0000000000 --- a/vendor/golang.org/x/xerrors/README +++ /dev/null @@ -1,2 +0,0 @@ -This repository holds the transition packages for the new Go 1.13 error values. -See golang.org/design/29934-error-values. diff --git a/vendor/golang.org/x/xerrors/adaptor.go b/vendor/golang.org/x/xerrors/adaptor.go deleted file mode 100644 index 4317f24833..0000000000 --- a/vendor/golang.org/x/xerrors/adaptor.go +++ /dev/null @@ -1,193 +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. - -package xerrors - -import ( - "bytes" - "fmt" - "io" - "reflect" - "strconv" -) - -// FormatError calls the FormatError method of f with an errors.Printer -// configured according to s and verb, and writes the result to s. -func FormatError(f Formatter, s fmt.State, verb rune) { - // Assuming this function is only called from the Format method, and given - // that FormatError takes precedence over Format, it cannot be called from - // any package that supports errors.Formatter. It is therefore safe to - // disregard that State may be a specific printer implementation and use one - // of our choice instead. - - // limitations: does not support printing error as Go struct. - - var ( - sep = " " // separator before next error - p = &state{State: s} - direct = true - ) - - var err error = f - - switch verb { - // Note that this switch must match the preference order - // for ordinary string printing (%#v before %+v, and so on). - - case 'v': - if s.Flag('#') { - if stringer, ok := err.(fmt.GoStringer); ok { - io.WriteString(&p.buf, stringer.GoString()) - goto exit - } - // proceed as if it were %v - } else if s.Flag('+') { - p.printDetail = true - sep = "\n - " - } - case 's': - case 'q', 'x', 'X': - // Use an intermediate buffer in the rare cases that precision, - // truncation, or one of the alternative verbs (q, x, and X) are - // specified. - direct = false - - default: - p.buf.WriteString("%!") - p.buf.WriteRune(verb) - p.buf.WriteByte('(') - switch { - case err != nil: - p.buf.WriteString(reflect.TypeOf(f).String()) - default: - p.buf.WriteString("") - } - p.buf.WriteByte(')') - io.Copy(s, &p.buf) - return - } - -loop: - for { - switch v := err.(type) { - case Formatter: - err = v.FormatError((*printer)(p)) - case fmt.Formatter: - v.Format(p, 'v') - break loop - default: - io.WriteString(&p.buf, v.Error()) - break loop - } - if err == nil { - break - } - if p.needColon || !p.printDetail { - p.buf.WriteByte(':') - p.needColon = false - } - p.buf.WriteString(sep) - p.inDetail = false - p.needNewline = false - } - -exit: - width, okW := s.Width() - prec, okP := s.Precision() - - if !direct || (okW && width > 0) || okP { - // Construct format string from State s. - format := []byte{'%'} - if s.Flag('-') { - format = append(format, '-') - } - if s.Flag('+') { - format = append(format, '+') - } - if s.Flag(' ') { - format = append(format, ' ') - } - if okW { - format = strconv.AppendInt(format, int64(width), 10) - } - if okP { - format = append(format, '.') - format = strconv.AppendInt(format, int64(prec), 10) - } - format = append(format, string(verb)...) - fmt.Fprintf(s, string(format), p.buf.String()) - } else { - io.Copy(s, &p.buf) - } -} - -var detailSep = []byte("\n ") - -// state tracks error printing state. It implements fmt.State. -type state struct { - fmt.State - buf bytes.Buffer - - printDetail bool - inDetail bool - needColon bool - needNewline bool -} - -func (s *state) Write(b []byte) (n int, err error) { - if s.printDetail { - if len(b) == 0 { - return 0, nil - } - if s.inDetail && s.needColon { - s.needNewline = true - if b[0] == '\n' { - b = b[1:] - } - } - k := 0 - for i, c := range b { - if s.needNewline { - if s.inDetail && s.needColon { - s.buf.WriteByte(':') - s.needColon = false - } - s.buf.Write(detailSep) - s.needNewline = false - } - if c == '\n' { - s.buf.Write(b[k:i]) - k = i + 1 - s.needNewline = true - } - } - s.buf.Write(b[k:]) - if !s.inDetail { - s.needColon = true - } - } else if !s.inDetail { - s.buf.Write(b) - } - return len(b), nil -} - -// printer wraps a state to implement an xerrors.Printer. -type printer state - -func (s *printer) Print(args ...interface{}) { - if !s.inDetail || s.printDetail { - fmt.Fprint((*state)(s), args...) - } -} - -func (s *printer) Printf(format string, args ...interface{}) { - if !s.inDetail || s.printDetail { - fmt.Fprintf((*state)(s), format, args...) - } -} - -func (s *printer) Detail() bool { - s.inDetail = true - return s.printDetail -} diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg deleted file mode 100644 index 3f8b14b64e..0000000000 --- a/vendor/golang.org/x/xerrors/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go deleted file mode 100644 index 2ef99f5a87..0000000000 --- a/vendor/golang.org/x/xerrors/doc.go +++ /dev/null @@ -1,23 +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. - -// Package xerrors implements functions to manipulate errors. -// -// This package is based on the Go 2 proposal for error values: -// -// https://golang.org/design/29934-error-values -// -// These functions were incorporated into the standard library's errors package -// in Go 1.13: -// - Is -// - As -// - Unwrap -// -// Also, Errorf's %w verb was incorporated into fmt.Errorf. -// -// Use this package to get equivalent behavior in all supported Go versions. -// -// No other features of this package were included in Go 1.13, and at present -// there are no plans to include any of them. -package xerrors // import "golang.org/x/xerrors" diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go deleted file mode 100644 index e88d3772d8..0000000000 --- a/vendor/golang.org/x/xerrors/errors.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xerrors - -import "fmt" - -// errorString is a trivial implementation of error. -type errorString struct { - s string - frame Frame -} - -// New returns an error that formats as the given text. -// -// The returned error contains a Frame set to the caller's location and -// implements Formatter to show this information when printed with details. -func New(text string) error { - return &errorString{text, Caller(1)} -} - -func (e *errorString) Error() string { - return e.s -} - -func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) } - -func (e *errorString) FormatError(p Printer) (next error) { - p.Print(e.s) - e.frame.Format(p) - return nil -} diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go deleted file mode 100644 index 27a5d70bd6..0000000000 --- a/vendor/golang.org/x/xerrors/fmt.go +++ /dev/null @@ -1,190 +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. - -package xerrors - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/xerrors/internal" -) - -const percentBangString = "%!" - -// Errorf formats according to a format specifier and returns the string as a -// value that satisfies error. -// -// The returned error includes the file and line number of the caller when -// formatted with additional detail enabled. If the last argument is an error -// the returned error's Format method will return it if the format string ends -// with ": %s", ": %v", or ": %w". If the last argument is an error and the -// format string ends with ": %w", the returned error implements an Unwrap -// method returning it. -// -// If the format specifier includes a %w verb with an error operand in a -// position other than at the end, the returned error will still implement an -// Unwrap method returning the operand, but the error's Format method will not -// return the wrapped error. -// -// It is invalid to include more than one %w verb or to supply it with an -// operand that does not implement the error interface. The %w verb is otherwise -// a synonym for %v. -// -// Note that as of Go 1.13, the fmt.Errorf function will do error formatting, -// but it will not capture a stack backtrace. -func Errorf(format string, a ...interface{}) error { - format = formatPlusW(format) - // Support a ": %[wsv]" suffix, which works well with xerrors.Formatter. - wrap := strings.HasSuffix(format, ": %w") - idx, format2, ok := parsePercentW(format) - percentWElsewhere := !wrap && idx >= 0 - if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) { - err := errorAt(a, len(a)-1) - if err == nil { - return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)} - } - // TODO: this is not entirely correct. The error value could be - // printed elsewhere in format if it mixes numbered with unnumbered - // substitutions. With relatively small changes to doPrintf we can - // have it optionally ignore extra arguments and pass the argument - // list in its entirety. - msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) - frame := Frame{} - if internal.EnableTrace { - frame = Caller(1) - } - if wrap { - return &wrapError{msg, err, frame} - } - return &noWrapError{msg, err, frame} - } - // Support %w anywhere. - // TODO: don't repeat the wrapped error's message when %w occurs in the middle. - msg := fmt.Sprintf(format2, a...) - if idx < 0 { - return &noWrapError{msg, nil, Caller(1)} - } - err := errorAt(a, idx) - if !ok || err == nil { - // Too many %ws or argument of %w is not an error. Approximate the Go - // 1.13 fmt.Errorf message. - return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)} - } - frame := Frame{} - if internal.EnableTrace { - frame = Caller(1) - } - return &wrapError{msg, err, frame} -} - -func errorAt(args []interface{}, i int) error { - if i < 0 || i >= len(args) { - return nil - } - err, ok := args[i].(error) - if !ok { - return nil - } - return err -} - -// formatPlusW is used to avoid the vet check that will barf at %w. -func formatPlusW(s string) string { - return s -} - -// Return the index of the only %w in format, or -1 if none. -// Also return a rewritten format string with %w replaced by %v, and -// false if there is more than one %w. -// TODO: handle "%[N]w". -func parsePercentW(format string) (idx int, newFormat string, ok bool) { - // Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go. - idx = -1 - ok = true - n := 0 - sz := 0 - var isW bool - for i := 0; i < len(format); i += sz { - if format[i] != '%' { - sz = 1 - continue - } - // "%%" is not a format directive. - if i+1 < len(format) && format[i+1] == '%' { - sz = 2 - continue - } - sz, isW = parsePrintfVerb(format[i:]) - if isW { - if idx >= 0 { - ok = false - } else { - idx = n - } - // "Replace" the last character, the 'w', with a 'v'. - p := i + sz - 1 - format = format[:p] + "v" + format[p+1:] - } - n++ - } - return idx, format, ok -} - -// Parse the printf verb starting with a % at s[0]. -// Return how many bytes it occupies and whether the verb is 'w'. -func parsePrintfVerb(s string) (int, bool) { - // Assume only that the directive is a sequence of non-letters followed by a single letter. - sz := 0 - var r rune - for i := 1; i < len(s); i += sz { - r, sz = utf8.DecodeRuneInString(s[i:]) - if unicode.IsLetter(r) { - return i + sz, r == 'w' - } - } - return len(s), false -} - -type noWrapError struct { - msg string - err error - frame Frame -} - -func (e *noWrapError) Error() string { - return fmt.Sprint(e) -} - -func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } - -func (e *noWrapError) FormatError(p Printer) (next error) { - p.Print(e.msg) - e.frame.Format(p) - return e.err -} - -type wrapError struct { - msg string - err error - frame Frame -} - -func (e *wrapError) Error() string { - return fmt.Sprint(e) -} - -func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } - -func (e *wrapError) FormatError(p Printer) (next error) { - p.Print(e.msg) - e.frame.Format(p) - return e.err -} - -func (e *wrapError) Unwrap() error { - return e.err -} diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go deleted file mode 100644 index 1bc9c26b97..0000000000 --- a/vendor/golang.org/x/xerrors/format.go +++ /dev/null @@ -1,34 +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. - -package xerrors - -// A Formatter formats error messages. -type Formatter interface { - error - - // FormatError prints the receiver's first error and returns the next error in - // the error chain, if any. - FormatError(p Printer) (next error) -} - -// A Printer formats error messages. -// -// The most common implementation of Printer is the one provided by package fmt -// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message -// typically provide their own implementations. -type Printer interface { - // Print appends args to the message output. - Print(args ...interface{}) - - // Printf writes a formatted string. - Printf(format string, args ...interface{}) - - // Detail reports whether error detail is requested. - // After the first call to Detail, all text written to the Printer - // is formatted as additional detail, or ignored when - // detail has not been requested. - // If Detail returns false, the caller can avoid printing the detail at all. - Detail() bool -} diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go deleted file mode 100644 index 0de628ec50..0000000000 --- a/vendor/golang.org/x/xerrors/frame.go +++ /dev/null @@ -1,56 +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. - -package xerrors - -import ( - "runtime" -) - -// A Frame contains part of a call stack. -type Frame struct { - // Make room for three PCs: the one we were asked for, what it called, - // and possibly a PC for skipPleaseUseCallersFrames. See: - // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 - frames [3]uintptr -} - -// Caller returns a Frame that describes a frame on the caller's stack. -// The argument skip is the number of frames to skip over. -// Caller(0) returns the frame for the caller of Caller. -func Caller(skip int) Frame { - var s Frame - runtime.Callers(skip+1, s.frames[:]) - return s -} - -// location reports the file, line, and function of a frame. -// -// The returned function may be "" even if file and line are not. -func (f Frame) location() (function, file string, line int) { - frames := runtime.CallersFrames(f.frames[:]) - if _, ok := frames.Next(); !ok { - return "", "", 0 - } - fr, ok := frames.Next() - if !ok { - return "", "", 0 - } - return fr.Function, fr.File, fr.Line -} - -// Format prints the stack as error detail. -// It should be called from an error's Format implementation -// after printing any other error detail. -func (f Frame) Format(p Printer) { - if p.Detail() { - function, file, line := f.location() - if function != "" { - p.Printf("%s\n ", function) - } - if file != "" { - p.Printf("%s:%d\n", file, line) - } - } -} diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go deleted file mode 100644 index 89f4eca5df..0000000000 --- a/vendor/golang.org/x/xerrors/internal/internal.go +++ /dev/null @@ -1,8 +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. - -package internal - -// EnableTrace indicates whether stack information should be recorded in errors. -var EnableTrace = true diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go deleted file mode 100644 index 9842758ca7..0000000000 --- a/vendor/golang.org/x/xerrors/wrap.go +++ /dev/null @@ -1,112 +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. - -package xerrors - -import ( - "reflect" -) - -// A Wrapper provides context around another error. -type Wrapper interface { - // Unwrap returns the next error in the error chain. - // If there is no next error, Unwrap returns nil. - Unwrap() error -} - -// Opaque returns an error with the same error formatting as err -// but that does not match err and cannot be unwrapped. -func Opaque(err error) error { - return noWrapper{err} -} - -type noWrapper struct { - error -} - -func (e noWrapper) FormatError(p Printer) (next error) { - if f, ok := e.error.(Formatter); ok { - return f.FormatError(p) - } - p.Print(e.error) - return nil -} - -// Unwrap returns the result of calling the Unwrap method on err, if err implements -// Unwrap. Otherwise, Unwrap returns nil. -// -// Deprecated: As of Go 1.13, use errors.Unwrap instead. -func Unwrap(err error) error { - u, ok := err.(Wrapper) - if !ok { - return nil - } - return u.Unwrap() -} - -// Is reports whether any error in err's chain matches target. -// -// An error is considered to match a target if it is equal to that target or if -// it implements a method Is(error) bool such that Is(target) returns true. -// -// Deprecated: As of Go 1.13, use errors.Is instead. -func Is(err, target error) bool { - if target == nil { - return err == target - } - - isComparable := reflect.TypeOf(target).Comparable() - for { - if isComparable && err == target { - return true - } - if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { - return true - } - // TODO: consider supporing target.Is(err). This would allow - // user-definable predicates, but also may allow for coping with sloppy - // APIs, thereby making it easier to get away with them. - if err = Unwrap(err); err == nil { - return false - } - } -} - -// As finds the first error in err's chain that matches the type to which target -// points, and if so, sets the target to its value and returns true. An error -// matches a type if it is assignable to the target type, or if it has a method -// As(interface{}) bool such that As(target) returns true. As will panic if target -// is not a non-nil pointer to a type which implements error or is of interface type. -// -// The As method should set the target to its value and return true if err -// matches the type to which target points. -// -// Deprecated: As of Go 1.13, use errors.As instead. -func As(err error, target interface{}) bool { - if target == nil { - panic("errors: target cannot be nil") - } - val := reflect.ValueOf(target) - typ := val.Type() - if typ.Kind() != reflect.Ptr || val.IsNil() { - panic("errors: target must be a non-nil pointer") - } - if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { - panic("errors: *target must be interface or implement error") - } - targetType := typ.Elem() - for err != nil { - if reflect.TypeOf(err).AssignableTo(targetType) { - val.Elem().Set(reflect.ValueOf(err)) - return true - } - if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { - return true - } - err = Unwrap(err) - } - return false -} - -var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md index 608aa6e1ac..2079de7b0e 100644 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md @@ -1,73 +1,159 @@ # How to contribute -We definitely welcome your patches and contributions to gRPC! Please read the gRPC -organization's [governance rules](https://github.com/grpc/grpc-community/blob/master/governance.md) -and [contribution guidelines](https://github.com/grpc/grpc-community/blob/master/CONTRIBUTING.md) before proceeding. +We welcome your patches and contributions to gRPC! Please read the gRPC +organization's [governance +rules](https://github.com/grpc/grpc-community/blob/master/governance.md) before +proceeding. -If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) +If you are new to GitHub, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) ## Legal requirements In order to protect both you and ourselves, you will need to sign the -[Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf). +[Contributor License +Agreement](https://identity.linuxfoundation.org/projects/cncf). When you create +your first PR, a link will be added as a comment that contains the steps needed +to complete this process. + +## Getting Started + +A great way to start is by searching through our open issues. [Unassigned issues +labeled as "help +wanted"](https://github.com/grpc/grpc-go/issues?q=sort%3Aupdated-desc%20is%3Aissue%20is%3Aopen%20label%3A%22Status%3A%20Help%20Wanted%22%20no%3Aassignee) +are especially nice for first-time contributors, as they should be well-defined +problems that already have agreed-upon solutions. + +## Code Style + +We follow [Google's published Go style +guide](https://google.github.io/styleguide/go/). Note that there are three +primary documents that make up this style guide; please follow them as closely +as possible. If a reviewer recommends something that contradicts those +guidelines, there may be valid reasons to do so, but it should be rare. ## Guidelines for Pull Requests -How to get your contributions merged smoothly and quickly. + +Please read the following carefully to ensure your contributions can be merged +smoothly and quickly. + +### PR Contents - Create **small PRs** that are narrowly focused on **addressing a single - concern**. We often times receive PRs that are trying to fix several things at - a time, but only one fix is considered acceptable, nothing gets merged and - both author's & review's time is wasted. Create more PRs to address different - concerns and everyone will be happy. + concern**. We often receive PRs that attempt to fix several things at the same + time, and if one part of the PR has a problem, that will hold up the entire + PR. + +- If your change does not address an **open issue** with an **agreed + resolution**, consider opening an issue and discussing it first. If you are + suggesting a behavioral or API change, consider starting with a [gRFC + proposal](https://github.com/grpc/proposal). Many new features that are not + bug fixes will require cross-language agreement. + +- If you want to fix **formatting or style**, consider whether your changes are + an obvious improvement or might be considered a personal preference. If a + style change is based on preference, it likely will not be accepted. If it + corrects widely agreed-upon anti-patterns, then please do create a PR and + explain the benefits of the change. + +- For correcting **misspellings**, please be aware that we use some terms that + are sometimes flagged by spell checkers. As an example, "if an only if" is + often written as "iff". Please do not make spelling correction changes unless + you are certain they are misspellings. + +- **All tests need to be passing** before your change can be merged. We + recommend you run tests locally before creating your PR to catch breakages + early on: -- If you are searching for features to work on, issues labeled [Status: Help - Wanted](https://github.com/grpc/grpc-go/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22Status%3A+Help+Wanted%22) - is a great place to start. These issues are well-documented and usually can be - resolved with a single pull request. + - `./scripts/vet.sh` to catch vet errors. + - `go test -cpu 1,4 -timeout 7m ./...` to run the tests. + - `go test -race -cpu 1,4 -timeout 7m ./...` to run tests in race mode. -- If you are adding a new file, make sure it has the copyright message template - at the top as a comment. You can copy over the message from an existing file - and update the year. + Note that we have a multi-module repo, so `go test` commands may need to be + run from the root of each module in order to cause all tests to run. + + *Alternatively*, you may find it easier to push your changes to your fork on + GitHub, which will trigger a GitHub Actions run that you can use to verify + everything is passing. + +- Note that there are two GitHub actions checks that need not be green: + + 1. We test the freshness of the generated proto code we maintain via the + `vet-proto` check. If the source proto files are updated, but our repo is + not updated, an optional checker will fail. This will be fixed by our team + in a separate PR and will not prevent the merge of your PR. + + 2. We run a checker that will fail if there is any change in dependencies of + an exported package via the `dependencies` check. If new dependencies are + added that are not appropriate, we may not accept your PR (see below). + +- If you are adding a **new file**, make sure it has the **copyright message** + template at the top as a comment. You can copy the message from an existing + file and update the year. - The grpc package should only depend on standard Go packages and a small number - of exceptions. If your contribution introduces new dependencies which are NOT - in the [list](https://godoc.org/google.golang.org/grpc?imports), you need a - discussion with gRPC-Go authors and consultants. + of exceptions. **If your contribution introduces new dependencies**, you will + need a discussion with gRPC-Go maintainers. -- For speculative changes, consider opening an issue and discussing it first. If - you are suggesting a behavioral or API change, consider starting with a [gRFC - proposal](https://github.com/grpc/proposal). +### PR Descriptions -- Provide a good **PR description** as a record of **what** change is being made - and **why** it was made. Link to a github issue if it exists. +- **PR titles** should start with the name of the component being addressed, or + the type of change. Examples: transport, client, server, round_robin, xds, + cleanup, deps. -- If you want to fix formatting or style, consider whether your changes are an - obvious improvement or might be considered a personal preference. If a style - change is based on preference, it likely will not be accepted. If it corrects - widely agreed-upon anti-patterns, then please do create a PR and explain the - benefits of the change. +- Read and follow the **guidelines for PR titles and descriptions** here: + https://google.github.io/eng-practices/review/developer/cl-descriptions.html -- Unless your PR is trivial, you should expect there will be reviewer comments - that you'll need to address before merging. We'll mark it as `Status: Requires - Reporter Clarification` if we expect you to respond to these comments in a - timely manner. If the PR remains inactive for 6 days, it will be marked as - `stale` and automatically close 7 days after that if we don't hear back from - you. + *particularly* the sections "First Line" and "Body is Informative". -- Maintain **clean commit history** and use **meaningful commit messages**. PRs - with messy commit history are difficult to review and won't be merged. Use - `rebase -i upstream/master` to curate your commit history and/or to bring in - latest changes from master (but avoid rebasing in the middle of a code - review). + Note: your PR description will be used as the git commit message in a + squash-and-merge if your PR is approved. We may make changes to this as + necessary. -- Keep your PR up to date with upstream/master (if there are merge conflicts, we - can't really merge your change). +- **Does this PR relate to an open issue?** On the first line, please use the + tag `Fixes #` to ensure the issue is closed when the PR is merged. Or + use `Updates #` if the PR is related to an open issue, but does not fix + it. Consider filing an issue if one does not already exist. -- **All tests need to be passing** before your change can be merged. We - recommend you **run tests locally** before creating your PR to catch breakages - early on. - - `VET_SKIP_PROTO=1 ./vet.sh` to catch vet errors - - `go test -cpu 1,4 -timeout 7m ./...` to run the tests - - `go test -race -cpu 1,4 -timeout 7m ./...` to run tests in race mode +- PR descriptions *must* conclude with **release notes** as follows: + + ``` + RELEASE NOTES: + * :

+ ``` + + This need not match the PR title. + + The summary must: + + * be something that gRPC users will understand. + + * clearly explain the feature being added, the issue being fixed, or the + behavior being changed, etc. If fixing a bug, be clear about how the bug + can be triggered by an end-user. + + * begin with a capital letter and use complete sentences. -- Exceptions to the rules can be made if there's a compelling reason for doing so. + * be as short as possible to describe the change being made. + + If a PR is *not* end-user visible -- e.g. a cleanup, testing change, or + GitHub-related, use `RELEASE NOTES: n/a`. + +### PR Process + +- Please **self-review** your code changes before sending your PR. This will + prevent simple, obvious errors from causing delays. + +- Maintain a **clean commit history** and use **meaningful commit messages**. + PRs with messy commit histories are difficult to review and won't be merged. + Before sending your PR, ensure your changes are based on top of the latest + `upstream/master` commits, and avoid rebasing in the middle of a code review. + You should **never use `git push -f`** unless absolutely necessary during a + review, as it can interfere with GitHub's tracking of comments. + +- Unless your PR is trivial, you should **expect reviewer comments** that you + will need to address before merging. We'll label the PR as `Status: Requires + Reporter Clarification` if we expect you to respond to these comments in a + timely manner. If the PR remains inactive for 6 days, it will be marked as + `stale`, and we will automatically close it after 7 days if we don't hear back + from you. Please feel free to ping issues or bugs if you do not get a response + within a week. diff --git a/vendor/google.golang.org/grpc/MAINTAINERS.md b/vendor/google.golang.org/grpc/MAINTAINERS.md index c6672c0a3e..df35bb9a88 100644 --- a/vendor/google.golang.org/grpc/MAINTAINERS.md +++ b/vendor/google.golang.org/grpc/MAINTAINERS.md @@ -9,20 +9,28 @@ for general contribution guidelines. ## Maintainers (in alphabetical order) -- [cesarghali](https://github.com/cesarghali), Google LLC +- [arjan-bal](https://github.com/arjan-bal), Google LLC +- [arvindbr8](https://github.com/arvindbr8), Google LLC +- [atollena](https://github.com/atollena), Datadog, Inc. - [dfawley](https://github.com/dfawley), Google LLC - [easwars](https://github.com/easwars), Google LLC -- [menghanl](https://github.com/menghanl), Google LLC -- [srini100](https://github.com/srini100), Google LLC +- [gtcooke94](https://github.com/gtcooke94), Google LLC ## Emeritus Maintainers (in alphabetical order) -- [adelez](https://github.com/adelez), Google LLC -- [canguler](https://github.com/canguler), Google LLC -- [iamqizhao](https://github.com/iamqizhao), Google LLC -- [jadekler](https://github.com/jadekler), Google LLC -- [jtattermusch](https://github.com/jtattermusch), Google LLC -- [lyuxuan](https://github.com/lyuxuan), Google LLC -- [makmukhi](https://github.com/makmukhi), Google LLC -- [matt-kwong](https://github.com/matt-kwong), Google LLC -- [nicolasnoble](https://github.com/nicolasnoble), Google LLC -- [yongni](https://github.com/yongni), Google LLC +- [adelez](https://github.com/adelez) +- [aranjans](https://github.com/aranjans) +- [canguler](https://github.com/canguler) +- [cesarghali](https://github.com/cesarghali) +- [erm-g](https://github.com/erm-g) +- [iamqizhao](https://github.com/iamqizhao) +- [jeanbza](https://github.com/jeanbza) +- [jtattermusch](https://github.com/jtattermusch) +- [lyuxuan](https://github.com/lyuxuan) +- [makmukhi](https://github.com/makmukhi) +- [matt-kwong](https://github.com/matt-kwong) +- [menghanl](https://github.com/menghanl) +- [nicolasnoble](https://github.com/nicolasnoble) +- [purnesh42h](https://github.com/purnesh42h) +- [srini100](https://github.com/srini100) +- [yongni](https://github.com/yongni) +- [zasweq](https://github.com/zasweq) diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile index 1f8960922b..be38384ff6 100644 --- a/vendor/google.golang.org/grpc/Makefile +++ b/vendor/google.golang.org/grpc/Makefile @@ -30,17 +30,20 @@ testdeps: GO111MODULE=on go get -d -v -t google.golang.org/grpc/... vet: vetdeps - ./vet.sh + ./scripts/vet.sh vetdeps: - ./vet.sh -install + ./scripts/vet.sh -install .PHONY: \ all \ build \ clean \ + deps \ proto \ test \ + testsubmodule \ testrace \ + testdeps \ vet \ vetdeps diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md index ab0fbb79b8..f9a88d597e 100644 --- a/vendor/google.golang.org/grpc/README.md +++ b/vendor/google.golang.org/grpc/README.md @@ -10,7 +10,7 @@ RPC framework that puts mobile and HTTP/2 first. For more information see the ## Prerequisites -- **[Go][]**: any one of the **three latest major** [releases][go-releases]. +- **[Go][]**: any one of the **two latest major** [releases][go-releases]. ## Installation @@ -32,6 +32,7 @@ import "google.golang.org/grpc" - [Low-level technical docs](Documentation) from this repository - [Performance benchmark][] - [Examples](examples) +- [Contribution guidelines](CONTRIBUTING.md) ## FAQ diff --git a/vendor/google.golang.org/grpc/SECURITY.md b/vendor/google.golang.org/grpc/SECURITY.md index be6e108705..abab279379 100644 --- a/vendor/google.golang.org/grpc/SECURITY.md +++ b/vendor/google.golang.org/grpc/SECURITY.md @@ -1,3 +1,3 @@ # Security Policy -For information on gRPC Security Policy and reporting potentional security issues, please see [gRPC CVE Process](https://github.com/grpc/proposal/blob/master/P4-grpc-cve-process.md). +For information on gRPC Security Policy and reporting potential security issues, please see [gRPC CVE Process](https://github.com/grpc/proposal/blob/master/P4-grpc-cve-process.md). diff --git a/vendor/google.golang.org/grpc/backoff/backoff.go b/vendor/google.golang.org/grpc/backoff/backoff.go index 0787d0b50c..d7b40b7cb6 100644 --- a/vendor/google.golang.org/grpc/backoff/backoff.go +++ b/vendor/google.golang.org/grpc/backoff/backoff.go @@ -39,7 +39,7 @@ type Config struct { MaxDelay time.Duration } -// DefaultConfig is a backoff configuration with the default values specfied +// DefaultConfig is a backoff configuration with the default values specified // at https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md. // // This should be useful for callers who want to configure backoff with diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index f391744f72..b1264017db 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -30,6 +30,7 @@ import ( "google.golang.org/grpc/channelz" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials" + estats "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal" "google.golang.org/grpc/metadata" @@ -74,6 +75,8 @@ func unregisterForTesting(name string) { func init() { internal.BalancerUnregister = unregisterForTesting + internal.ConnectedAddress = connectedAddress + internal.SetConnectedAddress = setConnectedAddress } // Get returns the resolver builder registered with the given name. @@ -92,54 +95,6 @@ func Get(name string) Builder { return nil } -// A SubConn represents a single connection to a gRPC backend service. -// -// Each SubConn contains a list of addresses. -// -// All SubConns start in IDLE, and will not try to connect. To trigger the -// connecting, Balancers must call Connect. If a connection re-enters IDLE, -// Balancers must call Connect again to trigger a new connection attempt. -// -// gRPC will try to connect to the addresses in sequence, and stop trying the -// remainder once the first connection is successful. If an attempt to connect -// to all addresses encounters an error, the SubConn will enter -// TRANSIENT_FAILURE for a backoff period, and then transition to IDLE. -// -// Once established, if a connection is lost, the SubConn will transition -// directly to IDLE. -// -// This interface is to be implemented by gRPC. Users should not need their own -// implementation of this interface. For situations like testing, any -// implementations should embed this interface. This allows gRPC to add new -// methods to this interface. -type SubConn interface { - // UpdateAddresses updates the addresses used in this SubConn. - // gRPC checks if currently-connected address is still in the new list. - // If it's in the list, the connection will be kept. - // If it's not in the list, the connection will gracefully closed, and - // a new connection will be created. - // - // This will trigger a state transition for the SubConn. - // - // Deprecated: this method will be removed. Create new SubConns for new - // addresses instead. - UpdateAddresses([]resolver.Address) - // Connect starts the connecting for this SubConn. - Connect() - // GetOrBuildProducer returns a reference to the existing Producer for this - // ProducerBuilder in this SubConn, or, if one does not currently exist, - // creates a new one and returns it. Returns a close function which must - // be called when the Producer is no longer needed. - GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) - // Shutdown shuts down the SubConn gracefully. Any started RPCs will be - // allowed to complete. No future calls should be made on the SubConn. - // One final state update will be delivered to the StateListener (or - // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to - // indicate the shutdown operation. This may be delivered before - // in-progress RPCs are complete and the actual connection is closed. - Shutdown() -} - // NewSubConnOptions contains options to create new SubConn. type NewSubConnOptions struct { // CredsBundle is the credentials bundle that will be used in the created @@ -174,6 +129,13 @@ type State struct { // brand new implementation of this interface. For the situations like // testing, the new implementation should embed this interface. This allows // gRPC to add new methods to this interface. +// +// NOTICE: This interface is intended to be implemented by gRPC, or intercepted +// by custom load balancing polices. Users should not need their own complete +// implementation of this interface -- they should always delegate to a +// ClientConn passed to Builder.Build() by embedding it in their +// implementations. An embedded ClientConn must never be nil, or runtime panics +// will occur. type ClientConn interface { // NewSubConn is called by balancer to create a new SubConn. // It doesn't block and wait for the connections to be established. @@ -212,6 +174,17 @@ type ClientConn interface { // // Deprecated: Use the Target field in the BuildOptions instead. Target() string + + // MetricsRecorder provides the metrics recorder that balancers can use to + // record metrics. Balancer implementations which do not register metrics on + // metrics registry and record on them can ignore this method. The returned + // MetricsRecorder is guaranteed to never be nil. + MetricsRecorder() estats.MetricsRecorder + + // EnforceClientConnEmbedding is included to force implementers to embed + // another implementation of this interface, allowing gRPC to add methods + // without breaking users. + internal.EnforceClientConnEmbedding } // BuildOptions contains additional information for Build. @@ -387,6 +360,10 @@ type Balancer interface { // call SubConn.Shutdown for its existing SubConns; however, this will be // required in a future release, so it is recommended. Close() + // ExitIdle instructs the LB policy to reconnect to backends / exit the + // IDLE state, if appropriate and possible. Note that SubConns that enter + // the IDLE state will not reconnect until SubConn.Connect is called. + ExitIdle() } // ExitIdler is an optional interface for balancers to implement. If @@ -394,8 +371,8 @@ type Balancer interface { // the ClientConn is idle. If unimplemented, ClientConn.Connect will cause // all SubConns to connect. // -// Notice: it will be required for all balancers to implement this in a future -// release. +// Deprecated: All balancers must implement this interface. This interface will +// be removed in a future release. type ExitIdler interface { // ExitIdle instructs the LB policy to reconnect to backends / exit the // IDLE state, if appropriate and possible. Note that SubConns that enter @@ -403,15 +380,6 @@ type ExitIdler interface { ExitIdle() } -// SubConnState describes the state of a SubConn. -type SubConnState struct { - // ConnectivityState is the connectivity state of the SubConn. - ConnectivityState connectivity.State - // ConnectionError is set if the ConnectivityState is TransientFailure, - // describing the reason the SubConn failed. Otherwise, it is nil. - ConnectionError error -} - // ClientConnState describes the state of a ClientConn relevant to the // balancer. type ClientConnState struct { @@ -424,20 +392,3 @@ type ClientConnState struct { // ErrBadResolverState may be returned by UpdateClientConnState to indicate a // problem with the provided name resolver data. var ErrBadResolverState = errors.New("bad resolver state") - -// A ProducerBuilder is a simple constructor for a Producer. It is used by the -// SubConn to create producers when needed. -type ProducerBuilder interface { - // Build creates a Producer. The first parameter is always a - // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the - // associated SubConn), but is declared as `any` to avoid a dependency - // cycle. Should also return a close function that will be called when all - // references to the Producer have been given up. - Build(grpcClientConnInterface any) (p Producer, close func()) -} - -// A Producer is a type shared among potentially many consumers. It is -// associated with a SubConn, and an implementation will typically contain -// other methods to provide additional functionality, e.g. configuration or -// subscription registration. -type Producer any diff --git a/vendor/google.golang.org/grpc/balancer/base/balancer.go b/vendor/google.golang.org/grpc/balancer/base/balancer.go index a7f1eeec8e..4d576876d8 100644 --- a/vendor/google.golang.org/grpc/balancer/base/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/base/balancer.go @@ -36,12 +36,12 @@ type baseBuilder struct { config Config } -func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { +func (bb *baseBuilder) Build(cc balancer.ClientConn, _ balancer.BuildOptions) balancer.Balancer { bal := &baseBalancer{ cc: cc, pickerBuilder: bb.pickerBuilder, - subConns: resolver.NewAddressMap(), + subConns: resolver.NewAddressMapV2[balancer.SubConn](), scStates: make(map[balancer.SubConn]connectivity.State), csEvltr: &balancer.ConnectivityStateEvaluator{}, config: bb.config, @@ -65,7 +65,7 @@ type baseBalancer struct { csEvltr *balancer.ConnectivityStateEvaluator state connectivity.State - subConns *resolver.AddressMap + subConns *resolver.AddressMapV2[balancer.SubConn] scStates map[balancer.SubConn]connectivity.State picker balancer.Picker config Config @@ -100,7 +100,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { // Successful resolution; clear resolver error and ensure we return nil. b.resolverErr = nil // addrsSet is the set converted from addrs, it's used for quick lookup of an address. - addrsSet := resolver.NewAddressMap() + addrsSet := resolver.NewAddressMapV2[any]() for _, a := range s.ResolverState.Addresses { addrsSet.Set(a, nil) if _, ok := b.subConns.Get(a); !ok { @@ -122,8 +122,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { } } for _, a := range b.subConns.Keys() { - sci, _ := b.subConns.Get(a) - sc := sci.(balancer.SubConn) + sc, _ := b.subConns.Get(a) // a was removed by resolver. if _, ok := addrsSet.Get(a); !ok { sc.Shutdown() @@ -133,7 +132,7 @@ func (b *baseBalancer) UpdateClientConnState(s balancer.ClientConnState) error { } } // If resolver state contains no addresses, return an error so ClientConn - // will trigger re-resolve. Also records this as an resolver error, so when + // will trigger re-resolve. Also records this as a resolver error, so when // the overall state turns transient failure, the error message will have // the zero address information. if len(s.ResolverState.Addresses) == 0 { @@ -173,8 +172,7 @@ func (b *baseBalancer) regeneratePicker() { // Filter out all ready SCs from full subConn map. for _, addr := range b.subConns.Keys() { - sci, _ := b.subConns.Get(addr) - sc := sci.(balancer.SubConn) + sc, _ := b.subConns.Get(addr) if st, ok := b.scStates[sc]; ok && st == connectivity.Ready { readySCs[sc] = SubConnInfo{Address: addr} } @@ -259,6 +257,6 @@ type errPicker struct { err error // Pick() always returns this err. } -func (p *errPicker) Pick(info balancer.PickInfo) (balancer.PickResult, error) { +func (p *errPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { return balancer.PickResult{}, p.err } diff --git a/vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go b/vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go new file mode 100644 index 0000000000..360db08ebc --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/endpointsharding/endpointsharding.go @@ -0,0 +1,389 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package endpointsharding implements a load balancing policy that manages +// homogeneous child policies each owning a single endpoint. +// +// # Experimental +// +// Notice: This package is EXPERIMENTAL and may be changed or removed in a +// later release. +package endpointsharding + +import ( + "errors" + rand "math/rand/v2" + "sync" + "sync/atomic" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/resolver" +) + +var randIntN = rand.IntN + +// ChildState is the balancer state of a child along with the endpoint which +// identifies the child balancer. +type ChildState struct { + Endpoint resolver.Endpoint + State balancer.State + + // Balancer exposes only the ExitIdler interface of the child LB policy. + // Other methods of the child policy are called only by endpointsharding. + Balancer ExitIdler +} + +// ExitIdler provides access to only the ExitIdle method of the child balancer. +type ExitIdler interface { + // ExitIdle instructs the LB policy to reconnect to backends / exit the + // IDLE state, if appropriate and possible. Note that SubConns that enter + // the IDLE state will not reconnect until SubConn.Connect is called. + ExitIdle() +} + +// Options are the options to configure the behaviour of the +// endpointsharding balancer. +type Options struct { + // DisableAutoReconnect allows the balancer to keep child balancer in the + // IDLE state until they are explicitly triggered to exit using the + // ChildState obtained from the endpointsharding picker. When set to false, + // the endpointsharding balancer will automatically call ExitIdle on child + // connections that report IDLE. + DisableAutoReconnect bool +} + +// ChildBuilderFunc creates a new balancer with the ClientConn. It has the same +// type as the balancer.Builder.Build method. +type ChildBuilderFunc func(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer + +// NewBalancer returns a load balancing policy that manages homogeneous child +// policies each owning a single endpoint. The endpointsharding balancer +// forwards the LoadBalancingConfig in ClientConn state updates to its children. +func NewBalancer(cc balancer.ClientConn, opts balancer.BuildOptions, childBuilder ChildBuilderFunc, esOpts Options) balancer.Balancer { + es := &endpointSharding{ + cc: cc, + bOpts: opts, + esOpts: esOpts, + childBuilder: childBuilder, + } + es.children.Store(resolver.NewEndpointMap[*balancerWrapper]()) + return es +} + +// endpointSharding is a balancer that wraps child balancers. It creates a child +// balancer with child config for every unique Endpoint received. It updates the +// child states on any update from parent or child. +type endpointSharding struct { + cc balancer.ClientConn + bOpts balancer.BuildOptions + esOpts Options + childBuilder ChildBuilderFunc + + // childMu synchronizes calls to any single child. It must be held for all + // calls into a child. To avoid deadlocks, do not acquire childMu while + // holding mu. + childMu sync.Mutex + children atomic.Pointer[resolver.EndpointMap[*balancerWrapper]] + + // inhibitChildUpdates is set during UpdateClientConnState/ResolverError + // calls (calls to children will each produce an update, only want one + // update). + inhibitChildUpdates atomic.Bool + + // mu synchronizes access to the state stored in balancerWrappers in the + // children field. mu must not be held during calls into a child since + // synchronous calls back from the child may require taking mu, causing a + // deadlock. To avoid deadlocks, do not acquire childMu while holding mu. + mu sync.Mutex +} + +// rotateEndpoints returns a slice of all the input endpoints rotated a random +// amount. +func rotateEndpoints(es []resolver.Endpoint) []resolver.Endpoint { + les := len(es) + if les == 0 { + return es + } + r := randIntN(les) + // Make a copy to avoid mutating data beyond the end of es. + ret := make([]resolver.Endpoint, les) + copy(ret, es[r:]) + copy(ret[les-r:], es[:r]) + return ret +} + +// UpdateClientConnState creates a child for new endpoints and deletes children +// for endpoints that are no longer present. It also updates all the children, +// and sends a single synchronous update of the childrens' aggregated state at +// the end of the UpdateClientConnState operation. If any endpoint has no +// addresses it will ignore that endpoint. Otherwise, returns first error found +// from a child, but fully processes the new update. +func (es *endpointSharding) UpdateClientConnState(state balancer.ClientConnState) error { + es.childMu.Lock() + defer es.childMu.Unlock() + + es.inhibitChildUpdates.Store(true) + defer func() { + es.inhibitChildUpdates.Store(false) + es.updateState() + }() + var ret error + + children := es.children.Load() + newChildren := resolver.NewEndpointMap[*balancerWrapper]() + + // Update/Create new children. + for _, endpoint := range rotateEndpoints(state.ResolverState.Endpoints) { + if _, ok := newChildren.Get(endpoint); ok { + // Endpoint child was already created, continue to avoid duplicate + // update. + continue + } + childBalancer, ok := children.Get(endpoint) + if ok { + // Endpoint attributes may have changed, update the stored endpoint. + es.mu.Lock() + childBalancer.childState.Endpoint = endpoint + es.mu.Unlock() + } else { + childBalancer = &balancerWrapper{ + childState: ChildState{Endpoint: endpoint}, + ClientConn: es.cc, + es: es, + } + childBalancer.childState.Balancer = childBalancer + childBalancer.child = es.childBuilder(childBalancer, es.bOpts) + } + newChildren.Set(endpoint, childBalancer) + if err := childBalancer.updateClientConnStateLocked(balancer.ClientConnState{ + BalancerConfig: state.BalancerConfig, + ResolverState: resolver.State{ + Endpoints: []resolver.Endpoint{endpoint}, + Attributes: state.ResolverState.Attributes, + }, + }); err != nil && ret == nil { + // Return first error found, and always commit full processing of + // updating children. If desired to process more specific errors + // across all endpoints, caller should make these specific + // validations, this is a current limitation for simplicity sake. + ret = err + } + } + // Delete old children that are no longer present. + for _, e := range children.Keys() { + child, _ := children.Get(e) + if _, ok := newChildren.Get(e); !ok { + child.closeLocked() + } + } + es.children.Store(newChildren) + if newChildren.Len() == 0 { + return balancer.ErrBadResolverState + } + return ret +} + +// ResolverError forwards the resolver error to all of the endpointSharding's +// children and sends a single synchronous update of the childStates at the end +// of the ResolverError operation. +func (es *endpointSharding) ResolverError(err error) { + es.childMu.Lock() + defer es.childMu.Unlock() + es.inhibitChildUpdates.Store(true) + defer func() { + es.inhibitChildUpdates.Store(false) + es.updateState() + }() + children := es.children.Load() + for _, child := range children.Values() { + child.resolverErrorLocked(err) + } +} + +func (es *endpointSharding) UpdateSubConnState(balancer.SubConn, balancer.SubConnState) { + // UpdateSubConnState is deprecated. +} + +func (es *endpointSharding) Close() { + es.childMu.Lock() + defer es.childMu.Unlock() + children := es.children.Load() + for _, child := range children.Values() { + child.closeLocked() + } +} + +func (es *endpointSharding) ExitIdle() { + es.childMu.Lock() + defer es.childMu.Unlock() + for _, bw := range es.children.Load().Values() { + if !bw.isClosed { + bw.child.ExitIdle() + } + } +} + +// updateState updates this component's state. It sends the aggregated state, +// and a picker with round robin behavior with all the child states present if +// needed. +func (es *endpointSharding) updateState() { + if es.inhibitChildUpdates.Load() { + return + } + var readyPickers, connectingPickers, idlePickers, transientFailurePickers []balancer.Picker + + es.mu.Lock() + defer es.mu.Unlock() + + children := es.children.Load() + childStates := make([]ChildState, 0, children.Len()) + + for _, child := range children.Values() { + childState := child.childState + childStates = append(childStates, childState) + childPicker := childState.State.Picker + switch childState.State.ConnectivityState { + case connectivity.Ready: + readyPickers = append(readyPickers, childPicker) + case connectivity.Connecting: + connectingPickers = append(connectingPickers, childPicker) + case connectivity.Idle: + idlePickers = append(idlePickers, childPicker) + case connectivity.TransientFailure: + transientFailurePickers = append(transientFailurePickers, childPicker) + // connectivity.Shutdown shouldn't appear. + } + } + + // Construct the round robin picker based off the aggregated state. Whatever + // the aggregated state, use the pickers present that are currently in that + // state only. + var aggState connectivity.State + var pickers []balancer.Picker + if len(readyPickers) >= 1 { + aggState = connectivity.Ready + pickers = readyPickers + } else if len(connectingPickers) >= 1 { + aggState = connectivity.Connecting + pickers = connectingPickers + } else if len(idlePickers) >= 1 { + aggState = connectivity.Idle + pickers = idlePickers + } else if len(transientFailurePickers) >= 1 { + aggState = connectivity.TransientFailure + pickers = transientFailurePickers + } else { + aggState = connectivity.TransientFailure + pickers = []balancer.Picker{base.NewErrPicker(errors.New("no children to pick from"))} + } // No children (resolver error before valid update). + p := &pickerWithChildStates{ + pickers: pickers, + childStates: childStates, + next: uint32(randIntN(len(pickers))), + } + es.cc.UpdateState(balancer.State{ + ConnectivityState: aggState, + Picker: p, + }) +} + +// pickerWithChildStates delegates to the pickers it holds in a round robin +// fashion. It also contains the childStates of all the endpointSharding's +// children. +type pickerWithChildStates struct { + pickers []balancer.Picker + childStates []ChildState + next uint32 +} + +func (p *pickerWithChildStates) Pick(info balancer.PickInfo) (balancer.PickResult, error) { + nextIndex := atomic.AddUint32(&p.next, 1) + picker := p.pickers[nextIndex%uint32(len(p.pickers))] + return picker.Pick(info) +} + +// ChildStatesFromPicker returns the state of all the children managed by the +// endpoint sharding balancer that created this picker. +func ChildStatesFromPicker(picker balancer.Picker) []ChildState { + p, ok := picker.(*pickerWithChildStates) + if !ok { + return nil + } + return p.childStates +} + +// balancerWrapper is a wrapper of a balancer. It ID's a child balancer by +// endpoint, and persists recent child balancer state. +type balancerWrapper struct { + // The following fields are initialized at build time and read-only after + // that and therefore do not need to be guarded by a mutex. + + // child contains the wrapped balancer. Access its methods only through + // methods on balancerWrapper to ensure proper synchronization + child balancer.Balancer + balancer.ClientConn // embed to intercept UpdateState, doesn't deal with SubConns + + es *endpointSharding + + // Access to the following fields is guarded by es.mu. + + childState ChildState + isClosed bool +} + +func (bw *balancerWrapper) UpdateState(state balancer.State) { + bw.es.mu.Lock() + bw.childState.State = state + bw.es.mu.Unlock() + if state.ConnectivityState == connectivity.Idle && !bw.es.esOpts.DisableAutoReconnect { + bw.ExitIdle() + } + bw.es.updateState() +} + +// ExitIdle pings an IDLE child balancer to exit idle in a new goroutine to +// avoid deadlocks due to synchronous balancer state updates. +func (bw *balancerWrapper) ExitIdle() { + go func() { + bw.es.childMu.Lock() + if !bw.isClosed { + bw.child.ExitIdle() + } + bw.es.childMu.Unlock() + }() +} + +// updateClientConnStateLocked delivers the ClientConnState to the child +// balancer. Callers must hold the child mutex of the parent endpointsharding +// balancer. +func (bw *balancerWrapper) updateClientConnStateLocked(ccs balancer.ClientConnState) error { + return bw.child.UpdateClientConnState(ccs) +} + +// closeLocked closes the child balancer. Callers must hold the child mutext of +// the parent endpointsharding balancer. +func (bw *balancerWrapper) closeLocked() { + bw.child.Close() + bw.isClosed = true +} + +func (bw *balancerWrapper) resolverErrorLocked(err error) { + bw.child.ResolverError(err) +} diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go new file mode 100644 index 0000000000..7d66cb491c --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go @@ -0,0 +1,35 @@ +/* + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains code internal to the pickfirst package. +package internal + +import ( + rand "math/rand/v2" + "time" +) + +var ( + // RandShuffle pseudo-randomizes the order of addresses. + RandShuffle = rand.Shuffle + // TimeAfterFunc allows mocking the timer for testing connection delay + // related functionality. + TimeAfterFunc = func(d time.Duration, f func()) func() { + timer := time.AfterFunc(d, f) + return func() { timer.Stop() } + } +) diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go similarity index 70% rename from vendor/google.golang.org/grpc/pickfirst.go rename to vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go index e3ea42ba96..b15c10e46b 100644 --- a/vendor/google.golang.org/grpc/pickfirst.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go @@ -16,45 +16,60 @@ * */ -package grpc +// Package pickfirst contains the pick_first load balancing policy. +package pickfirst import ( "encoding/json" "errors" "fmt" + rand "math/rand/v2" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst/internal" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/envconfig" internalgrpclog "google.golang.org/grpc/internal/grpclog" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/pretty" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" + + _ "google.golang.org/grpc/balancer/pickfirst/pickfirstleaf" // For automatically registering the new pickfirst if required. ) +func init() { + if envconfig.NewPickFirstEnabled { + return + } + balancer.Register(pickfirstBuilder{}) +} + +var logger = grpclog.Component("pick-first-lb") + const ( - // PickFirstBalancerName is the name of the pick_first balancer. - PickFirstBalancerName = "pick_first" - logPrefix = "[pick-first-lb %p] " + // Name is the name of the pick_first balancer. + Name = "pick_first" + logPrefix = "[pick-first-lb %p] " ) type pickfirstBuilder struct{} -func (pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { +func (pickfirstBuilder) Build(cc balancer.ClientConn, _ balancer.BuildOptions) balancer.Balancer { b := &pickfirstBalancer{cc: cc} b.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf(logPrefix, b)) return b } func (pickfirstBuilder) Name() string { - return PickFirstBalancerName + return Name } type pfConfig struct { serviceconfig.LoadBalancingConfig `json:"-"` // If set to true, instructs the LB policy to shuffle the order of the list - // of addresses received from the name resolver before attempting to + // of endpoints received from the name resolver before attempting to // connect to them. ShuffleAddressList bool `json:"shuffleAddressList"` } @@ -93,9 +108,17 @@ func (b *pickfirstBalancer) ResolverError(err error) { }) } +// Shuffler is an interface for shuffling an address list. +type Shuffler interface { + ShuffleAddressListForTesting(n int, swap func(i, j int)) +} + +// ShuffleAddressListForTesting pseudo-randomizes the order of addresses. n +// is the number of elements. swap swaps the elements with indexes i and j. +func ShuffleAddressListForTesting(n int, swap func(i, j int)) { rand.Shuffle(n, swap) } + func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { - addrs := state.ResolverState.Addresses - if len(addrs) == 0 { + if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { // The resolver reported an empty address list. Treat it like an error by // calling b.ResolverError. if b.subConn != nil { @@ -107,22 +130,49 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState b.ResolverError(errors.New("produced zero addresses")) return balancer.ErrBadResolverState } - // We don't have to guard this block with the env var because ParseConfig // already does so. cfg, ok := state.BalancerConfig.(pfConfig) if state.BalancerConfig != nil && !ok { return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v", state.BalancerConfig, state.BalancerConfig) } - if cfg.ShuffleAddressList { - addrs = append([]resolver.Address{}, addrs...) - grpcrand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) - } if b.logger.V(2) { b.logger.Infof("Received new config %s, resolver state %s", pretty.ToJSON(cfg), pretty.ToJSON(state.ResolverState)) } + var addrs []resolver.Address + if endpoints := state.ResolverState.Endpoints; len(endpoints) != 0 { + // Perform the optional shuffling described in gRFC A62. The shuffling will + // change the order of endpoints but not touch the order of the addresses + // within each endpoint. - A61 + if cfg.ShuffleAddressList { + endpoints = append([]resolver.Endpoint{}, endpoints...) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + + // "Flatten the list by concatenating the ordered list of addresses for each + // of the endpoints, in order." - A61 + for _, endpoint := range endpoints { + // "In the flattened list, interleave addresses from the two address + // families, as per RFC-8304 section 4." - A61 + // TODO: support the above language. + addrs = append(addrs, endpoint.Addresses...) + } + } else { + // Endpoints not set, process addresses until we migrate resolver + // emissions fully to Endpoints. The top channel does wrap emitted + // addresses with endpoints, however some balancers such as weighted + // target do not forward the corresponding correct endpoints down/split + // endpoints properly. Once all balancers correctly forward endpoints + // down, can delete this else conditional. + addrs = state.ResolverState.Addresses + if cfg.ShuffleAddressList { + addrs = append([]resolver.Address{}, addrs...) + internal.RandShuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] }) + } + } + if b.subConn != nil { b.cc.UpdateAddresses(b.subConn, addrs) return nil diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go new file mode 100644 index 0000000000..9ffdd28a01 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go @@ -0,0 +1,913 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package pickfirstleaf contains the pick_first load balancing policy which +// will be the universal leaf policy after dualstack changes are implemented. +// +// # Experimental +// +// Notice: This package is EXPERIMENTAL and may be changed or removed in a +// later release. +package pickfirstleaf + +import ( + "encoding/json" + "errors" + "fmt" + "net" + "net/netip" + "sync" + "time" + + "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst/internal" + "google.golang.org/grpc/connectivity" + expstats "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/envconfig" + internalgrpclog "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/internal/pretty" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +func init() { + if envconfig.NewPickFirstEnabled { + // Register as the default pick_first balancer. + Name = "pick_first" + } + balancer.Register(pickfirstBuilder{}) +} + +// enableHealthListenerKeyType is a unique key type used in resolver +// attributes to indicate whether the health listener usage is enabled. +type enableHealthListenerKeyType struct{} + +var ( + logger = grpclog.Component("pick-first-leaf-lb") + // Name is the name of the pick_first_leaf balancer. + // It is changed to "pick_first" in init() if this balancer is to be + // registered as the default pickfirst. + Name = "pick_first_leaf" + disconnectionsMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.disconnections", + Description: "EXPERIMENTAL. Number of times the selected subchannel becomes disconnected.", + Unit: "{disconnection}", + Labels: []string{"grpc.target"}, + Default: false, + }) + connectionAttemptsSucceededMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.connection_attempts_succeeded", + Description: "EXPERIMENTAL. Number of successful connection attempts.", + Unit: "{attempt}", + Labels: []string{"grpc.target"}, + Default: false, + }) + connectionAttemptsFailedMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.connection_attempts_failed", + Description: "EXPERIMENTAL. Number of failed connection attempts.", + Unit: "{attempt}", + Labels: []string{"grpc.target"}, + Default: false, + }) +) + +const ( + // TODO: change to pick-first when this becomes the default pick_first policy. + logPrefix = "[pick-first-leaf-lb %p] " + // connectionDelayInterval is the time to wait for during the happy eyeballs + // pass before starting the next connection attempt. + connectionDelayInterval = 250 * time.Millisecond +) + +type ipAddrFamily int + +const ( + // ipAddrFamilyUnknown represents strings that can't be parsed as an IP + // address. + ipAddrFamilyUnknown ipAddrFamily = iota + ipAddrFamilyV4 + ipAddrFamilyV6 +) + +type pickfirstBuilder struct{} + +func (pickfirstBuilder) Build(cc balancer.ClientConn, bo balancer.BuildOptions) balancer.Balancer { + b := &pickfirstBalancer{ + cc: cc, + target: bo.Target.String(), + metricsRecorder: cc.MetricsRecorder(), + + subConns: resolver.NewAddressMapV2[*scData](), + state: connectivity.Connecting, + cancelConnectionTimer: func() {}, + } + b.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf(logPrefix, b)) + return b +} + +func (b pickfirstBuilder) Name() string { + return Name +} + +func (pickfirstBuilder) ParseConfig(js json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { + var cfg pfConfig + if err := json.Unmarshal(js, &cfg); err != nil { + return nil, fmt.Errorf("pickfirst: unable to unmarshal LB policy config: %s, error: %v", string(js), err) + } + return cfg, nil +} + +// EnableHealthListener updates the state to configure pickfirst for using a +// generic health listener. +func EnableHealthListener(state resolver.State) resolver.State { + state.Attributes = state.Attributes.WithValue(enableHealthListenerKeyType{}, true) + return state +} + +type pfConfig struct { + serviceconfig.LoadBalancingConfig `json:"-"` + + // If set to true, instructs the LB policy to shuffle the order of the list + // of endpoints received from the name resolver before attempting to + // connect to them. + ShuffleAddressList bool `json:"shuffleAddressList"` +} + +// scData keeps track of the current state of the subConn. +// It is not safe for concurrent access. +type scData struct { + // The following fields are initialized at build time and read-only after + // that. + subConn balancer.SubConn + addr resolver.Address + + rawConnectivityState connectivity.State + // The effective connectivity state based on raw connectivity, health state + // and after following sticky TransientFailure behaviour defined in A62. + effectiveState connectivity.State + lastErr error + connectionFailedInFirstPass bool +} + +func (b *pickfirstBalancer) newSCData(addr resolver.Address) (*scData, error) { + sd := &scData{ + rawConnectivityState: connectivity.Idle, + effectiveState: connectivity.Idle, + addr: addr, + } + sc, err := b.cc.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{ + StateListener: func(state balancer.SubConnState) { + b.updateSubConnState(sd, state) + }, + }) + if err != nil { + return nil, err + } + sd.subConn = sc + return sd, nil +} + +type pickfirstBalancer struct { + // The following fields are initialized at build time and read-only after + // that and therefore do not need to be guarded by a mutex. + logger *internalgrpclog.PrefixLogger + cc balancer.ClientConn + target string + metricsRecorder expstats.MetricsRecorder // guaranteed to be non nil + + // The mutex is used to ensure synchronization of updates triggered + // from the idle picker and the already serialized resolver, + // SubConn state updates. + mu sync.Mutex + // State reported to the channel based on SubConn states and resolver + // updates. + state connectivity.State + // scData for active subonns mapped by address. + subConns *resolver.AddressMapV2[*scData] + addressList addressList + firstPass bool + numTF int + cancelConnectionTimer func() + healthCheckingEnabled bool +} + +// ResolverError is called by the ClientConn when the name resolver produces +// an error or when pickfirst determined the resolver update to be invalid. +func (b *pickfirstBalancer) ResolverError(err error) { + b.mu.Lock() + defer b.mu.Unlock() + b.resolverErrorLocked(err) +} + +func (b *pickfirstBalancer) resolverErrorLocked(err error) { + if b.logger.V(2) { + b.logger.Infof("Received error from the name resolver: %v", err) + } + + // The picker will not change since the balancer does not currently + // report an error. If the balancer hasn't received a single good resolver + // update yet, transition to TRANSIENT_FAILURE. + if b.state != connectivity.TransientFailure && b.addressList.size() > 0 { + if b.logger.V(2) { + b.logger.Infof("Ignoring resolver error because balancer is using a previous good update.") + } + return + } + + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)}, + }) +} + +func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { + b.mu.Lock() + defer b.mu.Unlock() + b.cancelConnectionTimer() + if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { + // Cleanup state pertaining to the previous resolver state. + // Treat an empty address list like an error by calling b.ResolverError. + b.closeSubConnsLocked() + b.addressList.updateAddrs(nil) + b.resolverErrorLocked(errors.New("produced zero addresses")) + return balancer.ErrBadResolverState + } + b.healthCheckingEnabled = state.ResolverState.Attributes.Value(enableHealthListenerKeyType{}) != nil + cfg, ok := state.BalancerConfig.(pfConfig) + if state.BalancerConfig != nil && !ok { + return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v: %w", state.BalancerConfig, state.BalancerConfig, balancer.ErrBadResolverState) + } + + if b.logger.V(2) { + b.logger.Infof("Received new config %s, resolver state %s", pretty.ToJSON(cfg), pretty.ToJSON(state.ResolverState)) + } + + var newAddrs []resolver.Address + if endpoints := state.ResolverState.Endpoints; len(endpoints) != 0 { + // Perform the optional shuffling described in gRFC A62. The shuffling + // will change the order of endpoints but not touch the order of the + // addresses within each endpoint. - A61 + if cfg.ShuffleAddressList { + endpoints = append([]resolver.Endpoint{}, endpoints...) + internal.RandShuffle(len(endpoints), func(i, j int) { endpoints[i], endpoints[j] = endpoints[j], endpoints[i] }) + } + + // "Flatten the list by concatenating the ordered list of addresses for + // each of the endpoints, in order." - A61 + for _, endpoint := range endpoints { + newAddrs = append(newAddrs, endpoint.Addresses...) + } + } else { + // Endpoints not set, process addresses until we migrate resolver + // emissions fully to Endpoints. The top channel does wrap emitted + // addresses with endpoints, however some balancers such as weighted + // target do not forward the corresponding correct endpoints down/split + // endpoints properly. Once all balancers correctly forward endpoints + // down, can delete this else conditional. + newAddrs = state.ResolverState.Addresses + if cfg.ShuffleAddressList { + newAddrs = append([]resolver.Address{}, newAddrs...) + internal.RandShuffle(len(newAddrs), func(i, j int) { newAddrs[i], newAddrs[j] = newAddrs[j], newAddrs[i] }) + } + } + + // If an address appears in multiple endpoints or in the same endpoint + // multiple times, we keep it only once. We will create only one SubConn + // for the address because an AddressMap is used to store SubConns. + // Not de-duplicating would result in attempting to connect to the same + // SubConn multiple times in the same pass. We don't want this. + newAddrs = deDupAddresses(newAddrs) + newAddrs = interleaveAddresses(newAddrs) + + prevAddr := b.addressList.currentAddress() + prevSCData, found := b.subConns.Get(prevAddr) + prevAddrsCount := b.addressList.size() + isPrevRawConnectivityStateReady := found && prevSCData.rawConnectivityState == connectivity.Ready + b.addressList.updateAddrs(newAddrs) + + // If the previous ready SubConn exists in new address list, + // keep this connection and don't create new SubConns. + if isPrevRawConnectivityStateReady && b.addressList.seekTo(prevAddr) { + return nil + } + + b.reconcileSubConnsLocked(newAddrs) + // If it's the first resolver update or the balancer was already READY + // (but the new address list does not contain the ready SubConn) or + // CONNECTING, enter CONNECTING. + // We may be in TRANSIENT_FAILURE due to a previous empty address list, + // we should still enter CONNECTING because the sticky TF behaviour + // mentioned in A62 applies only when the TRANSIENT_FAILURE is reported + // due to connectivity failures. + if isPrevRawConnectivityStateReady || b.state == connectivity.Connecting || prevAddrsCount == 0 { + // Start connection attempt at first address. + b.forceUpdateConcludedStateLocked(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + b.startFirstPassLocked() + } else if b.state == connectivity.TransientFailure { + // If we're in TRANSIENT_FAILURE, we stay in TRANSIENT_FAILURE until + // we're READY. See A62. + b.startFirstPassLocked() + } + return nil +} + +// UpdateSubConnState is unused as a StateListener is always registered when +// creating SubConns. +func (b *pickfirstBalancer) UpdateSubConnState(subConn balancer.SubConn, state balancer.SubConnState) { + b.logger.Errorf("UpdateSubConnState(%v, %+v) called unexpectedly", subConn, state) +} + +func (b *pickfirstBalancer) Close() { + b.mu.Lock() + defer b.mu.Unlock() + b.closeSubConnsLocked() + b.cancelConnectionTimer() + b.state = connectivity.Shutdown +} + +// ExitIdle moves the balancer out of idle state. It can be called concurrently +// by the idlePicker and clientConn so access to variables should be +// synchronized. +func (b *pickfirstBalancer) ExitIdle() { + b.mu.Lock() + defer b.mu.Unlock() + if b.state == connectivity.Idle { + // Move the balancer into CONNECTING state immediately. This is done to + // avoid staying in IDLE if a resolver update arrives before the first + // SubConn reports CONNECTING. + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + b.startFirstPassLocked() + } +} + +func (b *pickfirstBalancer) startFirstPassLocked() { + b.firstPass = true + b.numTF = 0 + // Reset the connection attempt record for existing SubConns. + for _, sd := range b.subConns.Values() { + sd.connectionFailedInFirstPass = false + } + b.requestConnectionLocked() +} + +func (b *pickfirstBalancer) closeSubConnsLocked() { + for _, sd := range b.subConns.Values() { + sd.subConn.Shutdown() + } + b.subConns = resolver.NewAddressMapV2[*scData]() +} + +// deDupAddresses ensures that each address appears only once in the slice. +func deDupAddresses(addrs []resolver.Address) []resolver.Address { + seenAddrs := resolver.NewAddressMapV2[*scData]() + retAddrs := []resolver.Address{} + + for _, addr := range addrs { + if _, ok := seenAddrs.Get(addr); ok { + continue + } + retAddrs = append(retAddrs, addr) + } + return retAddrs +} + +// interleaveAddresses interleaves addresses of both families (IPv4 and IPv6) +// as per RFC-8305 section 4. +// Whichever address family is first in the list is followed by an address of +// the other address family; that is, if the first address in the list is IPv6, +// then the first IPv4 address should be moved up in the list to be second in +// the list. It doesn't support configuring "First Address Family Count", i.e. +// there will always be a single member of the first address family at the +// beginning of the interleaved list. +// Addresses that are neither IPv4 nor IPv6 are treated as part of a third +// "unknown" family for interleaving. +// See: https://datatracker.ietf.org/doc/html/rfc8305#autoid-6 +func interleaveAddresses(addrs []resolver.Address) []resolver.Address { + familyAddrsMap := map[ipAddrFamily][]resolver.Address{} + interleavingOrder := []ipAddrFamily{} + for _, addr := range addrs { + family := addressFamily(addr.Addr) + if _, found := familyAddrsMap[family]; !found { + interleavingOrder = append(interleavingOrder, family) + } + familyAddrsMap[family] = append(familyAddrsMap[family], addr) + } + + interleavedAddrs := make([]resolver.Address, 0, len(addrs)) + + for curFamilyIdx := 0; len(interleavedAddrs) < len(addrs); curFamilyIdx = (curFamilyIdx + 1) % len(interleavingOrder) { + // Some IP types may have fewer addresses than others, so we look for + // the next type that has a remaining member to add to the interleaved + // list. + family := interleavingOrder[curFamilyIdx] + remainingMembers := familyAddrsMap[family] + if len(remainingMembers) > 0 { + interleavedAddrs = append(interleavedAddrs, remainingMembers[0]) + familyAddrsMap[family] = remainingMembers[1:] + } + } + + return interleavedAddrs +} + +// addressFamily returns the ipAddrFamily after parsing the address string. +// If the address isn't of the format "ip-address:port", it returns +// ipAddrFamilyUnknown. The address may be valid even if it's not an IP when +// using a resolver like passthrough where the address may be a hostname in +// some format that the dialer can resolve. +func addressFamily(address string) ipAddrFamily { + // Parse the IP after removing the port. + host, _, err := net.SplitHostPort(address) + if err != nil { + return ipAddrFamilyUnknown + } + ip, err := netip.ParseAddr(host) + if err != nil { + return ipAddrFamilyUnknown + } + switch { + case ip.Is4() || ip.Is4In6(): + return ipAddrFamilyV4 + case ip.Is6(): + return ipAddrFamilyV6 + default: + return ipAddrFamilyUnknown + } +} + +// reconcileSubConnsLocked updates the active subchannels based on a new address +// list from the resolver. It does this by: +// - closing subchannels: any existing subchannels associated with addresses +// that are no longer in the updated list are shut down. +// - removing subchannels: entries for these closed subchannels are removed +// from the subchannel map. +// +// This ensures that the subchannel map accurately reflects the current set of +// addresses received from the name resolver. +func (b *pickfirstBalancer) reconcileSubConnsLocked(newAddrs []resolver.Address) { + newAddrsMap := resolver.NewAddressMapV2[bool]() + for _, addr := range newAddrs { + newAddrsMap.Set(addr, true) + } + + for _, oldAddr := range b.subConns.Keys() { + if _, ok := newAddrsMap.Get(oldAddr); ok { + continue + } + val, _ := b.subConns.Get(oldAddr) + val.subConn.Shutdown() + b.subConns.Delete(oldAddr) + } +} + +// shutdownRemainingLocked shuts down remaining subConns. Called when a subConn +// becomes ready, which means that all other subConn must be shutdown. +func (b *pickfirstBalancer) shutdownRemainingLocked(selected *scData) { + b.cancelConnectionTimer() + for _, sd := range b.subConns.Values() { + if sd.subConn != selected.subConn { + sd.subConn.Shutdown() + } + } + b.subConns = resolver.NewAddressMapV2[*scData]() + b.subConns.Set(selected.addr, selected) +} + +// requestConnectionLocked starts connecting on the subchannel corresponding to +// the current address. If no subchannel exists, one is created. If the current +// subchannel is in TransientFailure, a connection to the next address is +// attempted until a subchannel is found. +func (b *pickfirstBalancer) requestConnectionLocked() { + if !b.addressList.isValid() { + return + } + var lastErr error + for valid := true; valid; valid = b.addressList.increment() { + curAddr := b.addressList.currentAddress() + sd, ok := b.subConns.Get(curAddr) + if !ok { + var err error + // We want to assign the new scData to sd from the outer scope, + // hence we can't use := below. + sd, err = b.newSCData(curAddr) + if err != nil { + // This should never happen, unless the clientConn is being shut + // down. + if b.logger.V(2) { + b.logger.Infof("Failed to create a subConn for address %v: %v", curAddr.String(), err) + } + // Do nothing, the LB policy will be closed soon. + return + } + b.subConns.Set(curAddr, sd) + } + + switch sd.rawConnectivityState { + case connectivity.Idle: + sd.subConn.Connect() + b.scheduleNextConnectionLocked() + return + case connectivity.TransientFailure: + // The SubConn is being re-used and failed during a previous pass + // over the addressList. It has not completed backoff yet. + // Mark it as having failed and try the next address. + sd.connectionFailedInFirstPass = true + lastErr = sd.lastErr + continue + case connectivity.Connecting: + // Wait for the connection attempt to complete or the timer to fire + // before attempting the next address. + b.scheduleNextConnectionLocked() + return + default: + b.logger.Errorf("SubConn with unexpected state %v present in SubConns map.", sd.rawConnectivityState) + return + + } + } + + // All the remaining addresses in the list are in TRANSIENT_FAILURE, end the + // first pass if possible. + b.endFirstPassIfPossibleLocked(lastErr) +} + +func (b *pickfirstBalancer) scheduleNextConnectionLocked() { + b.cancelConnectionTimer() + if !b.addressList.hasNext() { + return + } + curAddr := b.addressList.currentAddress() + cancelled := false // Access to this is protected by the balancer's mutex. + closeFn := internal.TimeAfterFunc(connectionDelayInterval, func() { + b.mu.Lock() + defer b.mu.Unlock() + // If the scheduled task is cancelled while acquiring the mutex, return. + if cancelled { + return + } + if b.logger.V(2) { + b.logger.Infof("Happy Eyeballs timer expired while waiting for connection to %q.", curAddr.Addr) + } + if b.addressList.increment() { + b.requestConnectionLocked() + } + }) + // Access to the cancellation callback held by the balancer is guarded by + // the balancer's mutex, so it's safe to set the boolean from the callback. + b.cancelConnectionTimer = sync.OnceFunc(func() { + cancelled = true + closeFn() + }) +} + +func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.SubConnState) { + b.mu.Lock() + defer b.mu.Unlock() + oldState := sd.rawConnectivityState + sd.rawConnectivityState = newState.ConnectivityState + // Previously relevant SubConns can still callback with state updates. + // To prevent pickers from returning these obsolete SubConns, this logic + // is included to check if the current list of active SubConns includes this + // SubConn. + if !b.isActiveSCData(sd) { + return + } + if newState.ConnectivityState == connectivity.Shutdown { + sd.effectiveState = connectivity.Shutdown + return + } + + // Record a connection attempt when exiting CONNECTING. + if newState.ConnectivityState == connectivity.TransientFailure { + sd.connectionFailedInFirstPass = true + connectionAttemptsFailedMetric.Record(b.metricsRecorder, 1, b.target) + } + + if newState.ConnectivityState == connectivity.Ready { + connectionAttemptsSucceededMetric.Record(b.metricsRecorder, 1, b.target) + b.shutdownRemainingLocked(sd) + if !b.addressList.seekTo(sd.addr) { + // This should not fail as we should have only one SubConn after + // entering READY. The SubConn should be present in the addressList. + b.logger.Errorf("Address %q not found address list in %v", sd.addr, b.addressList.addresses) + return + } + if !b.healthCheckingEnabled { + if b.logger.V(2) { + b.logger.Infof("SubConn %p reported connectivity state READY and the health listener is disabled. Transitioning SubConn to READY.", sd.subConn) + } + + sd.effectiveState = connectivity.Ready + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + return + } + if b.logger.V(2) { + b.logger.Infof("SubConn %p reported connectivity state READY. Registering health listener.", sd.subConn) + } + // Send a CONNECTING update to take the SubConn out of sticky-TF if + // required. + sd.effectiveState = connectivity.Connecting + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + sd.subConn.RegisterHealthListener(func(scs balancer.SubConnState) { + b.updateSubConnHealthState(sd, scs) + }) + return + } + + // If the LB policy is READY, and it receives a subchannel state change, + // it means that the READY subchannel has failed. + // A SubConn can also transition from CONNECTING directly to IDLE when + // a transport is successfully created, but the connection fails + // before the SubConn can send the notification for READY. We treat + // this as a successful connection and transition to IDLE. + // TODO: https://github.com/grpc/grpc-go/issues/7862 - Remove the second + // part of the if condition below once the issue is fixed. + if oldState == connectivity.Ready || (oldState == connectivity.Connecting && newState.ConnectivityState == connectivity.Idle) { + // Once a transport fails, the balancer enters IDLE and starts from + // the first address when the picker is used. + b.shutdownRemainingLocked(sd) + sd.effectiveState = newState.ConnectivityState + // READY SubConn interspliced in between CONNECTING and IDLE, need to + // account for that. + if oldState == connectivity.Connecting { + // A known issue (https://github.com/grpc/grpc-go/issues/7862) + // causes a race that prevents the READY state change notification. + // This works around it. + connectionAttemptsSucceededMetric.Record(b.metricsRecorder, 1, b.target) + } + disconnectionsMetric.Record(b.metricsRecorder, 1, b.target) + b.addressList.reset() + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Idle, + Picker: &idlePicker{exitIdle: sync.OnceFunc(b.ExitIdle)}, + }) + return + } + + if b.firstPass { + switch newState.ConnectivityState { + case connectivity.Connecting: + // The effective state can be in either IDLE, CONNECTING or + // TRANSIENT_FAILURE. If it's TRANSIENT_FAILURE, stay in + // TRANSIENT_FAILURE until it's READY. See A62. + if sd.effectiveState != connectivity.TransientFailure { + sd.effectiveState = connectivity.Connecting + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + } + case connectivity.TransientFailure: + sd.lastErr = newState.ConnectionError + sd.effectiveState = connectivity.TransientFailure + // Since we're re-using common SubConns while handling resolver + // updates, we could receive an out of turn TRANSIENT_FAILURE from + // a pass over the previous address list. Happy Eyeballs will also + // cause out of order updates to arrive. + + if curAddr := b.addressList.currentAddress(); equalAddressIgnoringBalAttributes(&curAddr, &sd.addr) { + b.cancelConnectionTimer() + if b.addressList.increment() { + b.requestConnectionLocked() + return + } + } + + // End the first pass if we've seen a TRANSIENT_FAILURE from all + // SubConns once. + b.endFirstPassIfPossibleLocked(newState.ConnectionError) + } + return + } + + // We have finished the first pass, keep re-connecting failing SubConns. + switch newState.ConnectivityState { + case connectivity.TransientFailure: + b.numTF = (b.numTF + 1) % b.subConns.Len() + sd.lastErr = newState.ConnectionError + if b.numTF%b.subConns.Len() == 0 { + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: newState.ConnectionError}, + }) + } + // We don't need to request re-resolution since the SubConn already + // does that before reporting TRANSIENT_FAILURE. + // TODO: #7534 - Move re-resolution requests from SubConn into + // pick_first. + case connectivity.Idle: + sd.subConn.Connect() + } +} + +// endFirstPassIfPossibleLocked ends the first happy-eyeballs pass if all the +// addresses are tried and their SubConns have reported a failure. +func (b *pickfirstBalancer) endFirstPassIfPossibleLocked(lastErr error) { + // An optimization to avoid iterating over the entire SubConn map. + if b.addressList.isValid() { + return + } + // Connect() has been called on all the SubConns. The first pass can be + // ended if all the SubConns have reported a failure. + for _, sd := range b.subConns.Values() { + if !sd.connectionFailedInFirstPass { + return + } + } + b.firstPass = false + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: lastErr}, + }) + // Start re-connecting all the SubConns that are already in IDLE. + for _, sd := range b.subConns.Values() { + if sd.rawConnectivityState == connectivity.Idle { + sd.subConn.Connect() + } + } +} + +func (b *pickfirstBalancer) isActiveSCData(sd *scData) bool { + activeSD, found := b.subConns.Get(sd.addr) + return found && activeSD == sd +} + +func (b *pickfirstBalancer) updateSubConnHealthState(sd *scData, state balancer.SubConnState) { + b.mu.Lock() + defer b.mu.Unlock() + // Previously relevant SubConns can still callback with state updates. + // To prevent pickers from returning these obsolete SubConns, this logic + // is included to check if the current list of active SubConns includes + // this SubConn. + if !b.isActiveSCData(sd) { + return + } + sd.effectiveState = state.ConnectivityState + switch state.ConnectivityState { + case connectivity.Ready: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + case connectivity.TransientFailure: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: fmt.Errorf("pickfirst: health check failure: %v", state.ConnectionError)}, + }) + case connectivity.Connecting: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + default: + b.logger.Errorf("Got unexpected health update for SubConn %p: %v", state) + } +} + +// updateBalancerState stores the state reported to the channel and calls +// ClientConn.UpdateState(). As an optimization, it avoids sending duplicate +// updates to the channel. +func (b *pickfirstBalancer) updateBalancerState(newState balancer.State) { + // In case of TransientFailures allow the picker to be updated to update + // the connectivity error, in all other cases don't send duplicate state + // updates. + if newState.ConnectivityState == b.state && b.state != connectivity.TransientFailure { + return + } + b.forceUpdateConcludedStateLocked(newState) +} + +// forceUpdateConcludedStateLocked stores the state reported to the channel and +// calls ClientConn.UpdateState(). +// A separate function is defined to force update the ClientConn state since the +// channel doesn't correctly assume that LB policies start in CONNECTING and +// relies on LB policy to send an initial CONNECTING update. +func (b *pickfirstBalancer) forceUpdateConcludedStateLocked(newState balancer.State) { + b.state = newState.ConnectivityState + b.cc.UpdateState(newState) +} + +type picker struct { + result balancer.PickResult + err error +} + +func (p *picker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + return p.result, p.err +} + +// idlePicker is used when the SubConn is IDLE and kicks the SubConn into +// CONNECTING when Pick is called. +type idlePicker struct { + exitIdle func() +} + +func (i *idlePicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { + i.exitIdle() + return balancer.PickResult{}, balancer.ErrNoSubConnAvailable +} + +// addressList manages sequentially iterating over addresses present in a list +// of endpoints. It provides a 1 dimensional view of the addresses present in +// the endpoints. +// This type is not safe for concurrent access. +type addressList struct { + addresses []resolver.Address + idx int +} + +func (al *addressList) isValid() bool { + return al.idx < len(al.addresses) +} + +func (al *addressList) size() int { + return len(al.addresses) +} + +// increment moves to the next index in the address list. +// This method returns false if it went off the list, true otherwise. +func (al *addressList) increment() bool { + if !al.isValid() { + return false + } + al.idx++ + return al.idx < len(al.addresses) +} + +// currentAddress returns the current address pointed to in the addressList. +// If the list is in an invalid state, it returns an empty address instead. +func (al *addressList) currentAddress() resolver.Address { + if !al.isValid() { + return resolver.Address{} + } + return al.addresses[al.idx] +} + +func (al *addressList) reset() { + al.idx = 0 +} + +func (al *addressList) updateAddrs(addrs []resolver.Address) { + al.addresses = addrs + al.reset() +} + +// seekTo returns false if the needle was not found and the current index was +// left unchanged. +func (al *addressList) seekTo(needle resolver.Address) bool { + for ai, addr := range al.addresses { + if !equalAddressIgnoringBalAttributes(&addr, &needle) { + continue + } + al.idx = ai + return true + } + return false +} + +// hasNext returns whether incrementing the addressList will result in moving +// past the end of the list. If the list has already moved past the end, it +// returns false. +func (al *addressList) hasNext() bool { + if !al.isValid() { + return false + } + return al.idx+1 < len(al.addresses) +} + +// equalAddressIgnoringBalAttributes returns true is a and b are considered +// equal. This is different from the Equal method on the resolver.Address type +// which considers all fields to determine equality. Here, we only consider +// fields that are meaningful to the SubConn. +func equalAddressIgnoringBalAttributes(a, b *resolver.Address) bool { + return a.Addr == b.Addr && a.ServerName == b.ServerName && + a.Attributes.Equal(b.Attributes) +} diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go index f7031ad225..22045bf394 100644 --- a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go +++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go @@ -22,12 +22,13 @@ package roundrobin import ( - "sync/atomic" + "fmt" "google.golang.org/grpc/balancer" - "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/balancer/endpointsharding" + "google.golang.org/grpc/balancer/pickfirst/pickfirstleaf" "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal/grpcrand" + internalgrpclog "google.golang.org/grpc/internal/grpclog" ) // Name is the name of round_robin balancer. @@ -35,47 +36,37 @@ const Name = "round_robin" var logger = grpclog.Component("roundrobin") -// newBuilder creates a new roundrobin balancer builder. -func newBuilder() balancer.Builder { - return base.NewBalancerBuilder(Name, &rrPickerBuilder{}, base.Config{HealthCheck: true}) -} - func init() { - balancer.Register(newBuilder()) + balancer.Register(builder{}) } -type rrPickerBuilder struct{} +type builder struct{} -func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker { - logger.Infof("roundrobinPicker: Build called with info: %v", info) - if len(info.ReadySCs) == 0 { - return base.NewErrPicker(balancer.ErrNoSubConnAvailable) - } - scs := make([]balancer.SubConn, 0, len(info.ReadySCs)) - for sc := range info.ReadySCs { - scs = append(scs, sc) - } - return &rrPicker{ - subConns: scs, - // Start at a random index, as the same RR balancer rebuilds a new - // picker when SubConn states change, and we don't want to apply excess - // load to the first server in the list. - next: uint32(grpcrand.Intn(len(scs))), - } +func (bb builder) Name() string { + return Name } -type rrPicker struct { - // subConns is the snapshot of the roundrobin balancer when this picker was - // created. The slice is immutable. Each Get() will do a round robin - // selection from it and return the selected SubConn. - subConns []balancer.SubConn - next uint32 +func (bb builder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer { + childBuilder := balancer.Get(pickfirstleaf.Name).Build + bal := &rrBalancer{ + cc: cc, + Balancer: endpointsharding.NewBalancer(cc, opts, childBuilder, endpointsharding.Options{}), + } + bal.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[%p] ", bal)) + bal.logger.Infof("Created") + return bal } -func (p *rrPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { - subConnsLen := uint32(len(p.subConns)) - nextIndex := atomic.AddUint32(&p.next, 1) +type rrBalancer struct { + balancer.Balancer + cc balancer.ClientConn + logger *internalgrpclog.PrefixLogger +} - sc := p.subConns[nextIndex%subConnsLen] - return balancer.PickResult{SubConn: sc}, nil +func (b *rrBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error { + return b.Balancer.UpdateClientConnState(balancer.ClientConnState{ + // Enable the health listener in pickfirst children for client side health + // checks and outlier detection, if configured. + ResolverState: pickfirstleaf.EnableHealthListener(ccs.ResolverState), + }) } diff --git a/vendor/google.golang.org/grpc/balancer/subconn.go b/vendor/google.golang.org/grpc/balancer/subconn.go new file mode 100644 index 0000000000..9ee44d4af0 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/subconn.go @@ -0,0 +1,134 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package balancer + +import ( + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/resolver" +) + +// A SubConn represents a single connection to a gRPC backend service. +// +// All SubConns start in IDLE, and will not try to connect. To trigger a +// connection attempt, Balancers must call Connect. +// +// If the connection attempt fails, the SubConn will transition to +// TRANSIENT_FAILURE for a backoff period, and then return to IDLE. If the +// connection attempt succeeds, it will transition to READY. +// +// If a READY SubConn becomes disconnected, the SubConn will transition to IDLE. +// +// If a connection re-enters IDLE, Balancers must call Connect again to trigger +// a new connection attempt. +// +// Each SubConn contains a list of addresses. gRPC will try to connect to the +// addresses in sequence, and stop trying the remainder once the first +// connection is successful. However, this behavior is deprecated. SubConns +// should only use a single address. +// +// NOTICE: This interface is intended to be implemented by gRPC, or intercepted +// by custom load balancing polices. Users should not need their own complete +// implementation of this interface -- they should always delegate to a SubConn +// returned by ClientConn.NewSubConn() by embedding it in their implementations. +// An embedded SubConn must never be nil, or runtime panics will occur. +type SubConn interface { + // UpdateAddresses updates the addresses used in this SubConn. + // gRPC checks if currently-connected address is still in the new list. + // If it's in the list, the connection will be kept. + // If it's not in the list, the connection will gracefully close, and + // a new connection will be created. + // + // This will trigger a state transition for the SubConn. + // + // Deprecated: this method will be removed. Create new SubConns for new + // addresses instead. + UpdateAddresses([]resolver.Address) + // Connect starts the connecting for this SubConn. + Connect() + // GetOrBuildProducer returns a reference to the existing Producer for this + // ProducerBuilder in this SubConn, or, if one does not currently exist, + // creates a new one and returns it. Returns a close function which may be + // called when the Producer is no longer needed. Otherwise the producer + // will automatically be closed upon connection loss or subchannel close. + // Should only be called on a SubConn in state Ready. Otherwise the + // producer will be unable to create streams. + GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) + // Shutdown shuts down the SubConn gracefully. Any started RPCs will be + // allowed to complete. No future calls should be made on the SubConn. + // One final state update will be delivered to the StateListener (or + // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to + // indicate the shutdown operation. This may be delivered before + // in-progress RPCs are complete and the actual connection is closed. + Shutdown() + // RegisterHealthListener registers a health listener that receives health + // updates for a Ready SubConn. Only one health listener can be registered + // at a time. A health listener should be registered each time the SubConn's + // connectivity state changes to READY. Registering a health listener when + // the connectivity state is not READY may result in undefined behaviour. + // This method must not be called synchronously while handling an update + // from a previously registered health listener. + RegisterHealthListener(func(SubConnState)) + // EnforceSubConnEmbedding is included to force implementers to embed + // another implementation of this interface, allowing gRPC to add methods + // without breaking users. + internal.EnforceSubConnEmbedding +} + +// A ProducerBuilder is a simple constructor for a Producer. It is used by the +// SubConn to create producers when needed. +type ProducerBuilder interface { + // Build creates a Producer. The first parameter is always a + // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the + // associated SubConn), but is declared as `any` to avoid a dependency + // cycle. Build also returns a close function that will be called when all + // references to the Producer have been given up for a SubConn, or when a + // connectivity state change occurs on the SubConn. The close function + // should always block until all asynchronous cleanup work is completed. + Build(grpcClientConnInterface any) (p Producer, close func()) +} + +// SubConnState describes the state of a SubConn. +type SubConnState struct { + // ConnectivityState is the connectivity state of the SubConn. + ConnectivityState connectivity.State + // ConnectionError is set if the ConnectivityState is TransientFailure, + // describing the reason the SubConn failed. Otherwise, it is nil. + ConnectionError error + // connectedAddr contains the connected address when ConnectivityState is + // Ready. Otherwise, it is indeterminate. + connectedAddress resolver.Address +} + +// connectedAddress returns the connected address for a SubConnState. The +// address is only valid if the state is READY. +func connectedAddress(scs SubConnState) resolver.Address { + return scs.connectedAddress +} + +// setConnectedAddress sets the connected address for a SubConnState. +func setConnectedAddress(scs *SubConnState, addr resolver.Address) { + scs.connectedAddress = addr +} + +// A Producer is a type shared among potentially many consumers. It is +// associated with a SubConn, and an implementation will typically contain +// other methods to provide additional functionality, e.g. configuration or +// subscription registration. +type Producer any diff --git a/vendor/google.golang.org/grpc/balancer_wrapper.go b/vendor/google.golang.org/grpc/balancer_wrapper.go index af39b8a4c7..948a21ef68 100644 --- a/vendor/google.golang.org/grpc/balancer_wrapper.go +++ b/vendor/google.golang.org/grpc/balancer_wrapper.go @@ -24,11 +24,25 @@ import ( "sync" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/balancer/gracefulswitch" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/resolver" + "google.golang.org/grpc/status" +) + +var ( + setConnectedAddress = internal.SetConnectedAddress.(func(*balancer.SubConnState, resolver.Address)) + // noOpRegisterHealthListenerFn is used when client side health checking is + // disabled. It sends a single READY update on the registered listener. + noOpRegisterHealthListenerFn = func(_ context.Context, listener func(balancer.SubConnState)) func() { + listener(balancer.SubConnState{ConnectivityState: connectivity.Ready}) + return func() {} + } ) // ccBalancerWrapper sits between the ClientConn and the Balancer. @@ -46,6 +60,7 @@ import ( // It uses the gracefulswitch.Balancer internally to ensure that balancer // switches happen in a graceful manner. type ccBalancerWrapper struct { + internal.EnforceClientConnEmbedding // The following fields are initialized when the wrapper is created and are // read-only afterwards, and therefore can be accessed without a mutex. cc *ClientConn @@ -87,12 +102,16 @@ func newCCBalancerWrapper(cc *ClientConn) *ccBalancerWrapper { return ccb } +func (ccb *ccBalancerWrapper) MetricsRecorder() stats.MetricsRecorder { + return ccb.cc.metricsRecorderList +} + // updateClientConnState is invoked by grpc to push a ClientConnState update to // the underlying balancer. This is always executed from the serializer, so // it is safe to call into the balancer here. func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) error { errCh := make(chan error) - ok := ccb.serializer.Schedule(func(ctx context.Context) { + uccs := func(ctx context.Context) { defer close(errCh) if ctx.Err() != nil || ccb.balancer == nil { return @@ -107,17 +126,23 @@ func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnStat logger.Infof("error from balancer.UpdateClientConnState: %v", err) } errCh <- err - }) - if !ok { - return nil } + onFailure := func() { close(errCh) } + + // UpdateClientConnState can race with Close, and when the latter wins, the + // serializer is closed, and the attempt to schedule the callback will fail. + // It is acceptable to ignore this failure. But since we want to handle the + // state update in a blocking fashion (when we successfully schedule the + // callback), we have to use the ScheduleOr method and not the MaybeSchedule + // method on the serializer. + ccb.serializer.ScheduleOr(uccs, onFailure) return <-errCh } // resolverError is invoked by grpc to push a resolver error to the underlying // balancer. The call to the balancer is executed from the serializer. func (ccb *ccBalancerWrapper) resolverError(err error) { - ccb.serializer.Schedule(func(ctx context.Context) { + ccb.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || ccb.balancer == nil { return } @@ -133,7 +158,7 @@ func (ccb *ccBalancerWrapper) close() { ccb.closed = true ccb.mu.Unlock() channelz.Info(logger, ccb.cc.channelz, "ccBalancerWrapper: closing") - ccb.serializer.Schedule(func(context.Context) { + ccb.serializer.TrySchedule(func(context.Context) { if ccb.balancer == nil { return } @@ -145,7 +170,7 @@ func (ccb *ccBalancerWrapper) close() { // exitIdle invokes the balancer's exitIdle method in the serializer. func (ccb *ccBalancerWrapper) exitIdle() { - ccb.serializer.Schedule(func(ctx context.Context) { + ccb.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || ccb.balancer == nil { return } @@ -177,12 +202,13 @@ func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer ac: ac, producers: make(map[balancer.ProducerBuilder]*refCountedProducer), stateListener: opts.StateListener, + healthData: newHealthData(connectivity.Idle), } ac.acbw = acbw return acbw, nil } -func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) { +func (ccb *ccBalancerWrapper) RemoveSubConn(balancer.SubConn) { // The graceful switch balancer will never call this. logger.Errorf("ccb RemoveSubConn(%v) called unexpectedly, sc") } @@ -198,6 +224,10 @@ func (ccb *ccBalancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resol func (ccb *ccBalancerWrapper) UpdateState(s balancer.State) { ccb.cc.mu.Lock() defer ccb.cc.mu.Unlock() + if ccb.cc.conns == nil { + // The CC has been closed; ignore this update. + return + } ccb.mu.Lock() if ccb.closed { @@ -238,25 +268,77 @@ func (ccb *ccBalancerWrapper) Target() string { // acBalancerWrapper is a wrapper on top of ac for balancers. // It implements balancer.SubConn interface. type acBalancerWrapper struct { + internal.EnforceSubConnEmbedding ac *addrConn // read-only ccb *ccBalancerWrapper // read-only stateListener func(balancer.SubConnState) - mu sync.Mutex - producers map[balancer.ProducerBuilder]*refCountedProducer + producersMu sync.Mutex + producers map[balancer.ProducerBuilder]*refCountedProducer + + // Access to healthData is protected by healthMu. + healthMu sync.Mutex + // healthData is stored as a pointer to detect when the health listener is + // dropped or updated. This is required as closures can't be compared for + // equality. + healthData *healthData +} + +// healthData holds data related to health state reporting. +type healthData struct { + // connectivityState stores the most recent connectivity state delivered + // to the LB policy. This is stored to avoid sending updates when the + // SubConn has already exited connectivity state READY. + connectivityState connectivity.State + // closeHealthProducer stores function to close the ref counted health + // producer. The health producer is automatically closed when the SubConn + // state changes. + closeHealthProducer func() +} + +func newHealthData(s connectivity.State) *healthData { + return &healthData{ + connectivityState: s, + closeHealthProducer: func() {}, + } } // updateState is invoked by grpc to push a subConn state update to the // underlying balancer. -func (acbw *acBalancerWrapper) updateState(s connectivity.State, err error) { - acbw.ccb.serializer.Schedule(func(ctx context.Context) { +func (acbw *acBalancerWrapper) updateState(s connectivity.State, curAddr resolver.Address, err error) { + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || acbw.ccb.balancer == nil { return } + // Invalidate all producers on any state change. + acbw.closeProducers() + // Even though it is optional for balancers, gracefulswitch ensures // opts.StateListener is set, so this cannot ever be nil. // TODO: delete this comment when UpdateSubConnState is removed. - acbw.stateListener(balancer.SubConnState{ConnectivityState: s, ConnectionError: err}) + scs := balancer.SubConnState{ConnectivityState: s, ConnectionError: err} + if s == connectivity.Ready { + setConnectedAddress(&scs, curAddr) + } + // Invalidate the health listener by updating the healthData. + acbw.healthMu.Lock() + // A race may occur if a health listener is registered soon after the + // connectivity state is set but before the stateListener is called. + // Two cases may arise: + // 1. The new state is not READY: RegisterHealthListener has checks to + // ensure no updates are sent when the connectivity state is not + // READY. + // 2. The new state is READY: This means that the old state wasn't Ready. + // The RegisterHealthListener API mentions that a health listener + // must not be registered when a SubConn is not ready to avoid such + // races. When this happens, the LB policy would get health updates + // on the old listener. When the LB policy registers a new listener + // on receiving the connectivity update, the health updates will be + // sent to the new health listener. + acbw.healthData = newHealthData(scs.ConnectivityState) + acbw.healthMu.Unlock() + + acbw.stateListener(scs) }) } @@ -273,6 +355,7 @@ func (acbw *acBalancerWrapper) Connect() { } func (acbw *acBalancerWrapper) Shutdown() { + acbw.closeProducers() acbw.ccb.cc.removeAddrConn(acbw.ac, errConnDrain) } @@ -280,9 +363,10 @@ func (acbw *acBalancerWrapper) Shutdown() { // ready, blocks until it is or ctx expires. Returns an error when the context // expires or the addrConn is shut down. func (acbw *acBalancerWrapper) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) { - transport, err := acbw.ac.getTransport(ctx) - if err != nil { - return nil, err + transport := acbw.ac.getReadyTransport() + if transport == nil { + return nil, status.Errorf(codes.Unavailable, "SubConn state is not Ready") + } return newNonRetryClientStream(ctx, desc, method, transport, acbw.ac, opts...) } @@ -307,15 +391,15 @@ type refCountedProducer struct { } func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) (balancer.Producer, func()) { - acbw.mu.Lock() - defer acbw.mu.Unlock() + acbw.producersMu.Lock() + defer acbw.producersMu.Unlock() // Look up existing producer from this builder. pData := acbw.producers[pb] if pData == nil { // Not found; create a new one and add it to the producers map. - p, close := pb.Build(acbw) - pData = &refCountedProducer{producer: p, close: close} + p, closeFn := pb.Build(acbw) + pData = &refCountedProducer{producer: p, close: closeFn} acbw.producers[pb] = pData } // Account for this new reference. @@ -325,13 +409,112 @@ func (acbw *acBalancerWrapper) GetOrBuildProducer(pb balancer.ProducerBuilder) ( // and delete the refCountedProducer from the map if the total reference // count goes to zero. unref := func() { - acbw.mu.Lock() + acbw.producersMu.Lock() + // If closeProducers has already closed this producer instance, refs is + // set to 0, so the check after decrementing will never pass, and the + // producer will not be double-closed. pData.refs-- if pData.refs == 0 { defer pData.close() // Run outside the acbw mutex delete(acbw.producers, pb) } - acbw.mu.Unlock() + acbw.producersMu.Unlock() + } + return pData.producer, sync.OnceFunc(unref) +} + +func (acbw *acBalancerWrapper) closeProducers() { + acbw.producersMu.Lock() + defer acbw.producersMu.Unlock() + for pb, pData := range acbw.producers { + pData.refs = 0 + pData.close() + delete(acbw.producers, pb) } - return pData.producer, grpcsync.OnceFunc(unref) +} + +// healthProducerRegisterFn is a type alias for the health producer's function +// for registering listeners. +type healthProducerRegisterFn = func(context.Context, balancer.SubConn, string, func(balancer.SubConnState)) func() + +// healthListenerRegFn returns a function to register a listener for health +// updates. If client side health checks are disabled, the registered listener +// will get a single READY (raw connectivity state) update. +// +// Client side health checking is enabled when all the following +// conditions are satisfied: +// 1. Health checking is not disabled using the dial option. +// 2. The health package is imported. +// 3. The health check config is present in the service config. +func (acbw *acBalancerWrapper) healthListenerRegFn() func(context.Context, func(balancer.SubConnState)) func() { + if acbw.ccb.cc.dopts.disableHealthCheck { + return noOpRegisterHealthListenerFn + } + regHealthLisFn := internal.RegisterClientHealthCheckListener + if regHealthLisFn == nil { + // The health package is not imported. + return noOpRegisterHealthListenerFn + } + cfg := acbw.ac.cc.healthCheckConfig() + if cfg == nil { + return noOpRegisterHealthListenerFn + } + return func(ctx context.Context, listener func(balancer.SubConnState)) func() { + return regHealthLisFn.(healthProducerRegisterFn)(ctx, acbw, cfg.ServiceName, listener) + } +} + +// RegisterHealthListener accepts a health listener from the LB policy. It sends +// updates to the health listener as long as the SubConn's connectivity state +// doesn't change and a new health listener is not registered. To invalidate +// the currently registered health listener, acbw updates the healthData. If a +// nil listener is registered, the active health listener is dropped. +func (acbw *acBalancerWrapper) RegisterHealthListener(listener func(balancer.SubConnState)) { + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + acbw.healthData.closeHealthProducer() + // listeners should not be registered when the connectivity state + // isn't Ready. This may happen when the balancer registers a listener + // after the connectivityState is updated, but before it is notified + // of the update. + if acbw.healthData.connectivityState != connectivity.Ready { + return + } + // Replace the health data to stop sending updates to any previously + // registered health listeners. + hd := newHealthData(connectivity.Ready) + acbw.healthData = hd + if listener == nil { + return + } + + registerFn := acbw.healthListenerRegFn() + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { + if ctx.Err() != nil || acbw.ccb.balancer == nil { + return + } + // Don't send updates if a new listener is registered. + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + if acbw.healthData != hd { + return + } + // Serialize the health updates from the health producer with + // other calls into the LB policy. + listenerWrapper := func(scs balancer.SubConnState) { + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { + if ctx.Err() != nil || acbw.ccb.balancer == nil { + return + } + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + if acbw.healthData != hd { + return + } + listener(scs) + }) + } + + hd.closeHealthProducer = registerFn(ctx, listenerWrapper) + }) } diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go index 856c75dd4e..b1364a0325 100644 --- a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go +++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/binlog/v1/binarylog.proto package grpc_binarylog_v1 @@ -31,6 +31,7 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -233,10 +234,7 @@ func (Address_Type) EnumDescriptor() ([]byte, []int) { // Log entry we store in binary logs type GrpcLogEntry struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The timestamp of the binary log message Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Uniquely identifies a call. The value must not be 0 in order to disambiguate @@ -255,7 +253,7 @@ type GrpcLogEntry struct { // The logger uses one of the following fields to record the payload, // according to the type of the log entry. // - // Types that are assignable to Payload: + // Types that are valid to be assigned to Payload: // // *GrpcLogEntry_ClientHeader // *GrpcLogEntry_ServerHeader @@ -269,16 +267,16 @@ type GrpcLogEntry struct { // EVENT_TYPE_SERVER_HEADER normally or EVENT_TYPE_SERVER_TRAILER in // the case of trailers-only. On server side, peer is always // logged on EVENT_TYPE_CLIENT_HEADER. - Peer *Address `protobuf:"bytes,11,opt,name=peer,proto3" json:"peer,omitempty"` + Peer *Address `protobuf:"bytes,11,opt,name=peer,proto3" json:"peer,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GrpcLogEntry) Reset() { *x = GrpcLogEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GrpcLogEntry) String() string { @@ -289,7 +287,7 @@ func (*GrpcLogEntry) ProtoMessage() {} func (x *GrpcLogEntry) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -339,37 +337,45 @@ func (x *GrpcLogEntry) GetLogger() GrpcLogEntry_Logger { return GrpcLogEntry_LOGGER_UNKNOWN } -func (m *GrpcLogEntry) GetPayload() isGrpcLogEntry_Payload { - if m != nil { - return m.Payload +func (x *GrpcLogEntry) GetPayload() isGrpcLogEntry_Payload { + if x != nil { + return x.Payload } return nil } func (x *GrpcLogEntry) GetClientHeader() *ClientHeader { - if x, ok := x.GetPayload().(*GrpcLogEntry_ClientHeader); ok { - return x.ClientHeader + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_ClientHeader); ok { + return x.ClientHeader + } } return nil } func (x *GrpcLogEntry) GetServerHeader() *ServerHeader { - if x, ok := x.GetPayload().(*GrpcLogEntry_ServerHeader); ok { - return x.ServerHeader + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_ServerHeader); ok { + return x.ServerHeader + } } return nil } func (x *GrpcLogEntry) GetMessage() *Message { - if x, ok := x.GetPayload().(*GrpcLogEntry_Message); ok { - return x.Message + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_Message); ok { + return x.Message + } } return nil } func (x *GrpcLogEntry) GetTrailer() *Trailer { - if x, ok := x.GetPayload().(*GrpcLogEntry_Trailer); ok { - return x.Trailer + if x != nil { + if x, ok := x.Payload.(*GrpcLogEntry_Trailer); ok { + return x.Trailer + } } return nil } @@ -418,10 +424,7 @@ func (*GrpcLogEntry_Message) isGrpcLogEntry_Payload() {} func (*GrpcLogEntry_Trailer) isGrpcLogEntry_Payload() {} type ClientHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This contains only the metadata from the application. Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` // The name of the RPC method, which looks something like: @@ -435,16 +438,16 @@ type ClientHeader struct { // or : . Authority string `protobuf:"bytes,3,opt,name=authority,proto3" json:"authority,omitempty"` // the RPC timeout - Timeout *durationpb.Duration `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` + Timeout *durationpb.Duration `protobuf:"bytes,4,opt,name=timeout,proto3" json:"timeout,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ClientHeader) Reset() { *x = ClientHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ClientHeader) String() string { @@ -455,7 +458,7 @@ func (*ClientHeader) ProtoMessage() {} func (x *ClientHeader) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -499,21 +502,18 @@ func (x *ClientHeader) GetTimeout() *durationpb.Duration { } type ServerHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This contains only the metadata from the application. - Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerHeader) Reset() { *x = ServerHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerHeader) String() string { @@ -524,7 +524,7 @@ func (*ServerHeader) ProtoMessage() {} func (x *ServerHeader) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -547,10 +547,7 @@ func (x *ServerHeader) GetMetadata() *Metadata { } type Trailer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This contains only the metadata from the application. Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` // The gRPC status code. @@ -561,15 +558,15 @@ type Trailer struct { // The value of the 'grpc-status-details-bin' metadata key. If // present, this is always an encoded 'google.rpc.Status' message. StatusDetails []byte `protobuf:"bytes,4,opt,name=status_details,json=statusDetails,proto3" json:"status_details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Trailer) Reset() { *x = Trailer{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Trailer) String() string { @@ -580,7 +577,7 @@ func (*Trailer) ProtoMessage() {} func (x *Trailer) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -625,24 +622,21 @@ func (x *Trailer) GetStatusDetails() []byte { // Message payload, used by CLIENT_MESSAGE and SERVER_MESSAGE type Message struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Length of the message. It may not be the same as the length of the // data field, as the logging payload can be truncated or omitted. Length uint32 `protobuf:"varint,1,opt,name=length,proto3" json:"length,omitempty"` // May be truncated or omitted. - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Message) Reset() { *x = Message{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Message) String() string { @@ -653,7 +647,7 @@ func (*Message) ProtoMessage() {} func (x *Message) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -704,20 +698,17 @@ func (x *Message) GetData() []byte { // header is just a normal metadata key. // The pair will not count towards the size limit. type Metadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Entry []*MetadataEntry `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` unknownFields protoimpl.UnknownFields - - Entry []*MetadataEntry `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Metadata) Reset() { *x = Metadata{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata) String() string { @@ -728,7 +719,7 @@ func (*Metadata) ProtoMessage() {} func (x *Metadata) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -752,21 +743,18 @@ func (x *Metadata) GetEntry() []*MetadataEntry { // A metadata key value pair type MetadataEntry struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MetadataEntry) Reset() { *x = MetadataEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MetadataEntry) String() string { @@ -777,7 +765,7 @@ func (*MetadataEntry) ProtoMessage() {} func (x *MetadataEntry) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -808,23 +796,20 @@ func (x *MetadataEntry) GetValue() []byte { // Address information type Address struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type Address_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.binarylog.v1.Address_Type" json:"type,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Type Address_Type `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.binarylog.v1.Address_Type" json:"type,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // only for TYPE_IPV4 and TYPE_IPV6 - IpPort uint32 `protobuf:"varint,3,opt,name=ip_port,json=ipPort,proto3" json:"ip_port,omitempty"` + IpPort uint32 `protobuf:"varint,3,opt,name=ip_port,json=ipPort,proto3" json:"ip_port,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Address) Reset() { *x = Address{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Address) String() string { @@ -835,7 +820,7 @@ func (*Address) ProtoMessage() {} func (x *Address) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -873,149 +858,84 @@ func (x *Address) GetIpPort() uint32 { var File_grpc_binlog_v1_binarylog_proto protoreflect.FileDescriptor -var file_grpc_binlog_v1_binarylog_proto_rawDesc = []byte{ - 0x0a, 0x1e, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x2f, 0x76, 0x31, - 0x2f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x11, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x07, 0x0a, 0x0c, 0x47, 0x72, 0x70, 0x63, 0x4c, 0x6f, 0x67, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x17, 0x0a, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x12, - 0x3d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3e, - 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x2e, - 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x06, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x46, - 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x36, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, - 0x6c, 0x65, 0x72, 0x48, 0x00, 0x52, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x2b, - 0x0a, 0x11, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x70, - 0x65, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0xf5, 0x01, 0x0a, 0x09, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, - 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x45, - 0x4e, 0x54, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, - 0x5f, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x05, 0x12, 0x1d, 0x0a, - 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, - 0x45, 0x52, 0x5f, 0x54, 0x52, 0x41, 0x49, 0x4c, 0x45, 0x52, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x10, 0x07, 0x22, 0x42, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, - 0x0e, 0x4c, 0x4f, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x4f, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x43, 0x4c, 0x49, 0x45, - 0x4e, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x4f, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0xbb, 0x01, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x22, 0x47, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, - 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb1, 0x01, 0x0a, 0x07, 0x54, 0x72, - 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x35, 0x0a, - 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x42, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x36, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x37, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x33, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, - 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x69, - 0x70, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x45, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, - 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x50, 0x56, 0x34, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x50, 0x56, 0x36, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x03, 0x42, 0x5c, 0x0a, 0x14, - 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x32, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, - 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x62, 0x69, - 0x6e, 0x61, 0x72, 0x79, 0x6c, 0x6f, 0x67, 0x5f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} +const file_grpc_binlog_v1_binarylog_proto_rawDesc = "" + + "\n" + + "\x1egrpc/binlog/v1/binarylog.proto\x12\x11grpc.binarylog.v1\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xbb\a\n" + + "\fGrpcLogEntry\x128\n" + + "\ttimestamp\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x17\n" + + "\acall_id\x18\x02 \x01(\x04R\x06callId\x125\n" + + "\x17sequence_id_within_call\x18\x03 \x01(\x04R\x14sequenceIdWithinCall\x12=\n" + + "\x04type\x18\x04 \x01(\x0e2).grpc.binarylog.v1.GrpcLogEntry.EventTypeR\x04type\x12>\n" + + "\x06logger\x18\x05 \x01(\x0e2&.grpc.binarylog.v1.GrpcLogEntry.LoggerR\x06logger\x12F\n" + + "\rclient_header\x18\x06 \x01(\v2\x1f.grpc.binarylog.v1.ClientHeaderH\x00R\fclientHeader\x12F\n" + + "\rserver_header\x18\a \x01(\v2\x1f.grpc.binarylog.v1.ServerHeaderH\x00R\fserverHeader\x126\n" + + "\amessage\x18\b \x01(\v2\x1a.grpc.binarylog.v1.MessageH\x00R\amessage\x126\n" + + "\atrailer\x18\t \x01(\v2\x1a.grpc.binarylog.v1.TrailerH\x00R\atrailer\x12+\n" + + "\x11payload_truncated\x18\n" + + " \x01(\bR\x10payloadTruncated\x12.\n" + + "\x04peer\x18\v \x01(\v2\x1a.grpc.binarylog.v1.AddressR\x04peer\"\xf5\x01\n" + + "\tEventType\x12\x16\n" + + "\x12EVENT_TYPE_UNKNOWN\x10\x00\x12\x1c\n" + + "\x18EVENT_TYPE_CLIENT_HEADER\x10\x01\x12\x1c\n" + + "\x18EVENT_TYPE_SERVER_HEADER\x10\x02\x12\x1d\n" + + "\x19EVENT_TYPE_CLIENT_MESSAGE\x10\x03\x12\x1d\n" + + "\x19EVENT_TYPE_SERVER_MESSAGE\x10\x04\x12 \n" + + "\x1cEVENT_TYPE_CLIENT_HALF_CLOSE\x10\x05\x12\x1d\n" + + "\x19EVENT_TYPE_SERVER_TRAILER\x10\x06\x12\x15\n" + + "\x11EVENT_TYPE_CANCEL\x10\a\"B\n" + + "\x06Logger\x12\x12\n" + + "\x0eLOGGER_UNKNOWN\x10\x00\x12\x11\n" + + "\rLOGGER_CLIENT\x10\x01\x12\x11\n" + + "\rLOGGER_SERVER\x10\x02B\t\n" + + "\apayload\"\xbb\x01\n" + + "\fClientHeader\x127\n" + + "\bmetadata\x18\x01 \x01(\v2\x1b.grpc.binarylog.v1.MetadataR\bmetadata\x12\x1f\n" + + "\vmethod_name\x18\x02 \x01(\tR\n" + + "methodName\x12\x1c\n" + + "\tauthority\x18\x03 \x01(\tR\tauthority\x123\n" + + "\atimeout\x18\x04 \x01(\v2\x19.google.protobuf.DurationR\atimeout\"G\n" + + "\fServerHeader\x127\n" + + "\bmetadata\x18\x01 \x01(\v2\x1b.grpc.binarylog.v1.MetadataR\bmetadata\"\xb1\x01\n" + + "\aTrailer\x127\n" + + "\bmetadata\x18\x01 \x01(\v2\x1b.grpc.binarylog.v1.MetadataR\bmetadata\x12\x1f\n" + + "\vstatus_code\x18\x02 \x01(\rR\n" + + "statusCode\x12%\n" + + "\x0estatus_message\x18\x03 \x01(\tR\rstatusMessage\x12%\n" + + "\x0estatus_details\x18\x04 \x01(\fR\rstatusDetails\"5\n" + + "\aMessage\x12\x16\n" + + "\x06length\x18\x01 \x01(\rR\x06length\x12\x12\n" + + "\x04data\x18\x02 \x01(\fR\x04data\"B\n" + + "\bMetadata\x126\n" + + "\x05entry\x18\x01 \x03(\v2 .grpc.binarylog.v1.MetadataEntryR\x05entry\"7\n" + + "\rMetadataEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\fR\x05value\"\xb8\x01\n" + + "\aAddress\x123\n" + + "\x04type\x18\x01 \x01(\x0e2\x1f.grpc.binarylog.v1.Address.TypeR\x04type\x12\x18\n" + + "\aaddress\x18\x02 \x01(\tR\aaddress\x12\x17\n" + + "\aip_port\x18\x03 \x01(\rR\x06ipPort\"E\n" + + "\x04Type\x12\x10\n" + + "\fTYPE_UNKNOWN\x10\x00\x12\r\n" + + "\tTYPE_IPV4\x10\x01\x12\r\n" + + "\tTYPE_IPV6\x10\x02\x12\r\n" + + "\tTYPE_UNIX\x10\x03B\\\n" + + "\x14io.grpc.binarylog.v1B\x0eBinaryLogProtoP\x01Z2google.golang.org/grpc/binarylog/grpc_binarylog_v1b\x06proto3" var ( file_grpc_binlog_v1_binarylog_proto_rawDescOnce sync.Once - file_grpc_binlog_v1_binarylog_proto_rawDescData = file_grpc_binlog_v1_binarylog_proto_rawDesc + file_grpc_binlog_v1_binarylog_proto_rawDescData []byte ) func file_grpc_binlog_v1_binarylog_proto_rawDescGZIP() []byte { file_grpc_binlog_v1_binarylog_proto_rawDescOnce.Do(func() { - file_grpc_binlog_v1_binarylog_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_binlog_v1_binarylog_proto_rawDescData) + file_grpc_binlog_v1_binarylog_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_binlog_v1_binarylog_proto_rawDesc), len(file_grpc_binlog_v1_binarylog_proto_rawDesc))) }) return file_grpc_binlog_v1_binarylog_proto_rawDescData } var file_grpc_binlog_v1_binarylog_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_grpc_binlog_v1_binarylog_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_grpc_binlog_v1_binarylog_proto_goTypes = []interface{}{ +var file_grpc_binlog_v1_binarylog_proto_goTypes = []any{ (GrpcLogEntry_EventType)(0), // 0: grpc.binarylog.v1.GrpcLogEntry.EventType (GrpcLogEntry_Logger)(0), // 1: grpc.binarylog.v1.GrpcLogEntry.Logger (Address_Type)(0), // 2: grpc.binarylog.v1.Address.Type @@ -1057,105 +977,7 @@ func file_grpc_binlog_v1_binarylog_proto_init() { if File_grpc_binlog_v1_binarylog_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_binlog_v1_binarylog_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GrpcLogEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Trailer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Message); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetadataEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Address); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_grpc_binlog_v1_binarylog_proto_msgTypes[0].OneofWrappers = []any{ (*GrpcLogEntry_ClientHeader)(nil), (*GrpcLogEntry_ServerHeader)(nil), (*GrpcLogEntry_Message)(nil), @@ -1165,7 +987,7 @@ func file_grpc_binlog_v1_binarylog_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_binlog_v1_binarylog_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_binlog_v1_binarylog_proto_rawDesc), len(file_grpc_binlog_v1_binarylog_proto_rawDesc)), NumEnums: 3, NumMessages: 8, NumExtensions: 0, @@ -1177,7 +999,6 @@ func file_grpc_binlog_v1_binarylog_proto_init() { MessageInfos: file_grpc_binlog_v1_binarylog_proto_msgTypes, }.Build() File_grpc_binlog_v1_binarylog_proto = out.File - file_grpc_binlog_v1_binarylog_proto_rawDesc = nil file_grpc_binlog_v1_binarylog_proto_goTypes = nil file_grpc_binlog_v1_binarylog_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index c7f2607114..a3c315f2d7 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -24,6 +24,7 @@ import ( "fmt" "math" "net/url" + "slices" "strings" "sync" "sync/atomic" @@ -31,14 +32,15 @@ import ( "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" + "google.golang.org/grpc/balancer/pickfirst" "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/idle" - "google.golang.org/grpc/internal/pretty" iresolver "google.golang.org/grpc/internal/resolver" + "google.golang.org/grpc/internal/stats" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/resolver" @@ -73,6 +75,8 @@ var ( // invalidDefaultServiceConfigErrPrefix is used to prefix the json parsing error for the default // service config. invalidDefaultServiceConfigErrPrefix = "grpc: the provided default service config is invalid" + // PickFirstBalancerName is the name of the pick_first balancer. + PickFirstBalancerName = pickfirst.Name ) // The following errors are returned from Dial and DialContext @@ -114,15 +118,30 @@ func (dcs *defaultConfigSelector) SelectConfig(rpcInfo iresolver.RPCInfo) (*ires // NewClient creates a new gRPC "channel" for the target URI provided. No I/O // is performed. Use of the ClientConn for RPCs will automatically cause it to -// connect. Connect may be used to manually create a connection, but for most -// users this is unnecessary. +// connect. The Connect method may be called to manually create a connection, +// but for most users this should be unnecessary. // // The target name syntax is defined in -// https://github.com/grpc/grpc/blob/master/doc/naming.md. e.g. to use dns -// resolver, a "dns:///" prefix should be applied to the target. +// https://github.com/grpc/grpc/blob/master/doc/naming.md. E.g. to use the dns +// name resolver, a "dns:///" prefix may be applied to the target. The default +// name resolver will be used if no scheme is detected, or if the parsed scheme +// is not a registered name resolver. The default resolver is "dns" but can be +// overridden using the resolver package's SetDefaultScheme. // -// The DialOptions returned by WithBlock, WithTimeout, and -// WithReturnConnectionError are ignored by this function. +// Examples: +// +// - "foo.googleapis.com:8080" +// - "dns:///foo.googleapis.com:8080" +// - "dns:///foo.googleapis.com" +// - "dns:///10.0.0.213:8080" +// - "dns:///%5B2001:db8:85a3:8d3:1319:8a2e:370:7348%5D:443" +// - "dns://8.8.8.8/foo.googleapis.com:8080" +// - "dns://8.8.8.8/foo.googleapis.com" +// - "zookeeper://zk.example.com:9900/example_service" +// +// The DialOptions returned by WithBlock, WithTimeout, +// WithReturnConnectionError, and FailOnNonTempDialError are ignored by this +// function. func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) { cc := &ClientConn{ target: target, @@ -152,6 +171,16 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) for _, opt := range opts { opt.apply(&cc.dopts) } + + // Determine the resolver to use. + if err := cc.initParsedTargetAndResolverBuilder(); err != nil { + return nil, err + } + + for _, opt := range globalPerTargetDialOptions { + opt.DialOptionForTarget(cc.parsedTarget.URL).apply(&cc.dopts) + } + chainUnaryClientInterceptors(cc) chainStreamClientInterceptors(cc) @@ -160,42 +189,38 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error) } if cc.dopts.defaultServiceConfigRawJSON != nil { - scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON) + scpr := parseServiceConfig(*cc.dopts.defaultServiceConfigRawJSON, cc.dopts.maxCallAttempts) if scpr.Err != nil { return nil, fmt.Errorf("%s: %v", invalidDefaultServiceConfigErrPrefix, scpr.Err) } cc.dopts.defaultServiceConfig, _ = scpr.Config.(*ServiceConfig) } - cc.mkp = cc.dopts.copts.KeepaliveParams + cc.keepaliveParams = cc.dopts.copts.KeepaliveParams - // Register ClientConn with channelz. - cc.channelzRegistration(target) - - // TODO: Ideally it should be impossible to error from this function after - // channelz registration. This will require removing some channelz logs - // from the following functions that can error. Errors can be returned to - // the user, and successful logs can be emitted here, after the checks have - // passed and channelz is subsequently registered. - - // Determine the resolver to use. - if err := cc.parseTargetAndFindResolver(); err != nil { - channelz.RemoveEntry(cc.channelz.ID) - return nil, err - } - if err = cc.determineAuthority(); err != nil { - channelz.RemoveEntry(cc.channelz.ID) + if err = cc.initAuthority(); err != nil { return nil, err } + // Register ClientConn with channelz. Note that this is only done after + // channel creation cannot fail. + cc.channelzRegistration(target) + channelz.Infof(logger, cc.channelz, "parsed dial target is: %#v", cc.parsedTarget) + channelz.Infof(logger, cc.channelz, "Channel authority set to %q", cc.authority) + cc.csMgr = newConnectivityStateManager(cc.ctx, cc.channelz) - cc.pickerWrapper = newPickerWrapper(cc.dopts.copts.StatsHandlers) + cc.pickerWrapper = newPickerWrapper() + + cc.metricsRecorderList = stats.NewMetricsRecorderList(cc.dopts.copts.StatsHandlers) cc.initIdleStateLocked() // Safe to call without the lock, since nothing else has a reference to cc. cc.idlenessMgr = idle.NewManager((*idler)(cc), cc.dopts.idleTimeout) + return cc, nil } // Dial calls DialContext(context.Background(), target, opts...). +// +// Deprecated: use NewClient instead. Will be supported throughout 1.x. func Dial(target string, opts ...DialOption) (*ClientConn, error) { return DialContext(context.Background(), target, opts...) } @@ -209,10 +234,17 @@ func Dial(target string, opts ...DialOption) (*ClientConn, error) { // "passthrough" for backward compatibility. This distinction should not matter // to most users, but could matter to legacy users that specify a custom dialer // and expect it to receive the target string directly. +// +// Deprecated: use NewClient instead. Will be supported throughout 1.x. func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) { // At the end of this method, we kick the channel out of idle, rather than // waiting for the first rpc. - opts = append([]DialOption{withDefaultScheme("passthrough")}, opts...) + // + // WithLocalDNSResolution dial option in `grpc.Dial` ensures that it + // preserves behavior: when default scheme passthrough is used, skip + // hostname resolution, when "dns" is used for resolution, perform + // resolution on the client. + opts = append([]DialOption{withDefaultScheme("passthrough"), WithLocalDNSResolution()}, opts...) cc, err := NewClient(target, opts...) if err != nil { return nil, err @@ -424,7 +456,7 @@ func (cc *ClientConn) validateTransportCredentials() error { func (cc *ClientConn) channelzRegistration(target string) { parentChannel, _ := cc.dopts.channelzParent.(*channelz.Channel) cc.channelz = channelz.RegisterChannel(parentChannel, target) - cc.addTraceEvent("created") + cc.addTraceEvent(fmt.Sprintf("created for target %q", target)) } // chainUnaryClientInterceptors chains all unary client interceptors into one. @@ -582,13 +614,14 @@ type ClientConn struct { cancel context.CancelFunc // Cancelled on close. // The following are initialized at dial time, and are read-only after that. - target string // User's dial target. - parsedTarget resolver.Target // See parseTargetAndFindResolver(). - authority string // See determineAuthority(). - dopts dialOptions // Default and user specified dial options. - channelz *channelz.Channel // Channelz object. - resolverBuilder resolver.Builder // See parseTargetAndFindResolver(). - idlenessMgr *idle.Manager + target string // User's dial target. + parsedTarget resolver.Target // See initParsedTargetAndResolverBuilder(). + authority string // See initAuthority(). + dopts dialOptions // Default and user specified dial options. + channelz *channelz.Channel // Channelz object. + resolverBuilder resolver.Builder // See initParsedTargetAndResolverBuilder(). + idlenessMgr *idle.Manager + metricsRecorderList *stats.MetricsRecorderList // The following provide their own synchronization, and therefore don't // require cc.mu to be held to access them. @@ -604,7 +637,7 @@ type ClientConn struct { balancerWrapper *ccBalancerWrapper // Always recreated whenever entering idle to simplify Close. sc *ServiceConfig // Latest service config received from the resolver. conns map[*addrConn]struct{} // Set to nil on close. - mkp keepalive.ClientParameters // May be updated upon receipt of a GoAway. + keepaliveParams keepalive.ClientParameters // May be updated upon receipt of a GoAway. // firstResolveEvent is used to track whether the name resolver sent us at // least one update. RPCs block on this event. May be accessed without mu // if we know we cannot be asked to enter idle mode while accessing it (e.g. @@ -618,11 +651,6 @@ type ClientConn struct { // WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or // ctx expires. A true value is returned in former case and false in latter. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connectivity.State) bool { ch := cc.csMgr.getNotifyChan() if cc.csMgr.getState() != sourceState { @@ -637,11 +665,6 @@ func (cc *ClientConn) WaitForStateChange(ctx context.Context, sourceState connec } // GetState returns the connectivity.State of ClientConn. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a later -// release. func (cc *ClientConn) GetState() connectivity.State { return cc.csMgr.getState() } @@ -666,30 +689,38 @@ func (cc *ClientConn) Connect() { cc.mu.Unlock() } -// waitForResolvedAddrs blocks until the resolver has provided addresses or the -// context expires. Returns nil unless the context expires first; otherwise -// returns a status error based on the context. -func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) error { +// waitForResolvedAddrs blocks until the resolver provides addresses or the +// context expires, whichever happens first. +// +// Error is nil unless the context expires first; otherwise returns a status +// error based on the context. +// +// The returned boolean indicates whether it did block or not. If the +// resolution has already happened once before, it returns false without +// blocking. Otherwise, it wait for the resolution and return true if +// resolution has succeeded or return false along with error if resolution has +// failed. +func (cc *ClientConn) waitForResolvedAddrs(ctx context.Context) (bool, error) { // This is on the RPC path, so we use a fast path to avoid the // more-expensive "select" below after the resolver has returned once. if cc.firstResolveEvent.HasFired() { - return nil + return false, nil } + internal.NewStreamWaitingForResolver() select { case <-cc.firstResolveEvent.Done(): - return nil + return true, nil case <-ctx.Done(): - return status.FromContextError(ctx.Err()).Err() + return false, status.FromContextError(ctx.Err()).Err() case <-cc.ctx.Done(): - return ErrClientConnClosing + return false, ErrClientConnClosing } } var emptyServiceConfig *ServiceConfig func init() { - balancer.Register(pickfirstBuilder{}) - cfg := parseServiceConfig("{}") + cfg := parseServiceConfig("{}", defaultMaxCallAttempts) if cfg.Err != nil { panic(fmt.Sprintf("impossible error parsing empty service config: %v", cfg.Err)) } @@ -772,10 +803,7 @@ func (cc *ClientConn) updateResolverStateAndUnlock(s resolver.State, err error) } } - var balCfg serviceconfig.LoadBalancingConfig - if cc.sc != nil && cc.sc.lbConfig != nil { - balCfg = cc.sc.lbConfig - } + balCfg := cc.sc.lbConfig bw := cc.balancerWrapper cc.mu.Unlock() @@ -805,17 +833,11 @@ func (cc *ClientConn) applyFailingLBLocked(sc *serviceconfig.ParseResult) { cc.csMgr.updateState(connectivity.TransientFailure) } -// Makes a copy of the input addresses slice and clears out the balancer -// attributes field. Addresses are passed during subconn creation and address -// update operations. In both cases, we will clear the balancer attributes by -// calling this function, and therefore we will be able to use the Equal method -// provided by the resolver.Address type for comparison. -func copyAddressesWithoutBalancerAttributes(in []resolver.Address) []resolver.Address { +// Makes a copy of the input addresses slice. Addresses are passed during +// subconn creation and address update operations. +func copyAddresses(in []resolver.Address) []resolver.Address { out := make([]resolver.Address, len(in)) - for i := range in { - out[i] = in[i] - out[i].BalancerAttributes = nil - } + copy(out, in) return out } @@ -830,14 +852,16 @@ func (cc *ClientConn) newAddrConnLocked(addrs []resolver.Address, opts balancer. ac := &addrConn{ state: connectivity.Idle, cc: cc, - addrs: copyAddressesWithoutBalancerAttributes(addrs), + addrs: copyAddresses(addrs), scopts: opts, dopts: cc.dopts, channelz: channelz.RegisterSubChannel(cc.channelz, ""), resetBackoff: make(chan struct{}), - stateChan: make(chan struct{}), } ac.ctx, ac.cancel = context.WithCancel(cc.ctx) + // Start with our address set to the first address; this may be updated if + // we connect to different addresses. + ac.channelz.ChannelMetrics.Target.Store(&addrs[0].Addr) channelz.AddTraceEvent(logger, ac.channelz, 0, &channelz.TraceEvent{ Desc: "Subchannel created", @@ -871,7 +895,13 @@ func (cc *ClientConn) Target() string { return cc.target } -// CanonicalTarget returns the canonical target string of the ClientConn. +// CanonicalTarget returns the canonical target string used when creating cc. +// +// This always has the form "://[authority]/". For example: +// +// - "dns:///example.com:42" +// - "dns://8.8.8.8/example.com:42" +// - "unix:///path/to/socket" func (cc *ClientConn) CanonicalTarget() string { return cc.parsedTarget.String() } @@ -908,32 +938,37 @@ func (ac *addrConn) connect() error { ac.mu.Unlock() return nil } - ac.mu.Unlock() - ac.resetTransport() + ac.resetTransportAndUnlock() return nil } -func equalAddresses(a, b []resolver.Address) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if !v.Equal(b[i]) { - return false - } - } - return true +// equalAddressIgnoringBalAttributes returns true is a and b are considered equal. +// This is different from the Equal method on the resolver.Address type which +// considers all fields to determine equality. Here, we only consider fields +// that are meaningful to the subConn. +func equalAddressIgnoringBalAttributes(a, b *resolver.Address) bool { + return a.Addr == b.Addr && a.ServerName == b.ServerName && + a.Attributes.Equal(b.Attributes) && + a.Metadata == b.Metadata +} + +func equalAddressesIgnoringBalAttributes(a, b []resolver.Address) bool { + return slices.EqualFunc(a, b, func(a, b resolver.Address) bool { return equalAddressIgnoringBalAttributes(&a, &b) }) } // updateAddrs updates ac.addrs with the new addresses list and handles active // connections or connection attempts. func (ac *addrConn) updateAddrs(addrs []resolver.Address) { - ac.mu.Lock() - channelz.Infof(logger, ac.channelz, "addrConn: updateAddrs curAddr: %v, addrs: %v", pretty.ToJSON(ac.curAddr), pretty.ToJSON(addrs)) + addrs = copyAddresses(addrs) + limit := len(addrs) + if limit > 5 { + limit = 5 + } + channelz.Infof(logger, ac.channelz, "addrConn: updateAddrs addrs (%d of %d): %v", limit, len(addrs), addrs[:limit]) - addrs = copyAddressesWithoutBalancerAttributes(addrs) - if equalAddresses(ac.addrs, addrs) { + ac.mu.Lock() + if equalAddressesIgnoringBalAttributes(ac.addrs, addrs) { ac.mu.Unlock() return } @@ -952,7 +987,7 @@ func (ac *addrConn) updateAddrs(addrs []resolver.Address) { // Try to find the connected address. for _, a := range addrs { a.ServerName = ac.cc.getServerName(a) - if a.Equal(ac.curAddr) { + if equalAddressIgnoringBalAttributes(&a, &ac.curAddr) { // We are connected to a valid address, so do nothing but // update the addresses. ac.mu.Unlock() @@ -978,11 +1013,9 @@ func (ac *addrConn) updateAddrs(addrs []resolver.Address) { ac.updateConnectivityState(connectivity.Idle, nil) } - ac.mu.Unlock() - // Since we were connecting/connected, we should start a new connection // attempt. - go ac.resetTransport() + go ac.resetTransportAndUnlock() } // getServerName determines the serverName to be used in the connection @@ -1043,13 +1076,6 @@ func (cc *ClientConn) healthCheckConfig() *healthCheckConfig { return cc.sc.healthCheckConfig } -func (cc *ClientConn) getTransport(ctx context.Context, failfast bool, method string) (transport.ClientTransport, balancer.PickResult, error) { - return cc.pickerWrapper.pick(ctx, failfast, balancer.PickInfo{ - Ctx: ctx, - FullMethodName: method, - }) -} - func (cc *ClientConn) applyServiceConfigAndBalancer(sc *ServiceConfig, configSelector iresolver.ConfigSelector) { if sc == nil { // should never reach here. @@ -1138,10 +1164,15 @@ func (cc *ClientConn) Close() error { <-cc.resolverWrapper.serializer.Done() <-cc.balancerWrapper.serializer.Done() - + var wg sync.WaitGroup for ac := range conns { - ac.tearDown(ErrClientConnClosing) + wg.Add(1) + go func(ac *addrConn) { + defer wg.Done() + ac.tearDown(ErrClientConnClosing) + }(ac) } + wg.Wait() cc.addTraceEvent("deleted") // TraceEvent needs to be called before RemoveEntry, as TraceEvent may add // trace reference to the entity being deleted, and thus prevent it from being @@ -1167,13 +1198,16 @@ type addrConn struct { // is received, transport is closed, ac has been torn down). transport transport.ClientTransport // The current transport. + // This mutex is used on the RPC path, so its usage should be minimized as + // much as possible. + // TODO: Find a lock-free way to retrieve the transport and state from the + // addrConn. mu sync.Mutex curAddr resolver.Address // The current address. addrs []resolver.Address // All addresses that the resolver resolved to. // Use updateConnectivityState for updating addrConn's connectivity state. - state connectivity.State - stateChan chan struct{} // closed and recreated on every state change. + state connectivity.State backoffIdx int // Needs to be stateful for resetConnectBackoff. resetBackoff chan struct{} @@ -1186,9 +1220,6 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) if ac.state == s { return } - // When changing states, reset the state change channel. - close(ac.stateChan) - ac.stateChan = make(chan struct{}) ac.state = s ac.channelz.ChannelMetrics.State.Store(&s) if lastErr == nil { @@ -1196,25 +1227,26 @@ func (ac *addrConn) updateConnectivityState(s connectivity.State, lastErr error) } else { channelz.Infof(logger, ac.channelz, "Subchannel Connectivity change to %v, last error: %s", s, lastErr) } - ac.acbw.updateState(s, lastErr) + ac.acbw.updateState(s, ac.curAddr, lastErr) } // adjustParams updates parameters used to create transports upon // receiving a GoAway. func (ac *addrConn) adjustParams(r transport.GoAwayReason) { - switch r { - case transport.GoAwayTooManyPings: + if r == transport.GoAwayTooManyPings { v := 2 * ac.dopts.copts.KeepaliveParams.Time ac.cc.mu.Lock() - if v > ac.cc.mkp.Time { - ac.cc.mkp.Time = v + if v > ac.cc.keepaliveParams.Time { + ac.cc.keepaliveParams.Time = v } ac.cc.mu.Unlock() } } -func (ac *addrConn) resetTransport() { - ac.mu.Lock() +// resetTransportAndUnlock unconditionally connects the addrConn. +// +// ac.mu must be held by the caller, and this function will guarantee it is released. +func (ac *addrConn) resetTransportAndUnlock() { acCtx := ac.ctx if acCtx.Err() != nil { ac.mu.Unlock() @@ -1245,6 +1277,8 @@ func (ac *addrConn) resetTransport() { ac.mu.Unlock() if err := ac.tryAllAddrs(acCtx, addrs, connectDeadline); err != nil { + // TODO: #7534 - Move re-resolution requests into the pick_first LB policy + // to ensure one resolution request per pass instead of per subconn failure. ac.cc.resolveNow(resolver.ResolveNowOptions{}) ac.mu.Lock() if acCtx.Err() != nil { @@ -1286,19 +1320,20 @@ func (ac *addrConn) resetTransport() { ac.mu.Unlock() } -// tryAllAddrs tries to creates a connection to the addresses, and stop when at +// tryAllAddrs tries to create a connection to the addresses, and stop when at // the first successful one. It returns an error if no address was successfully // connected, or updates ac appropriately with the new transport. func (ac *addrConn) tryAllAddrs(ctx context.Context, addrs []resolver.Address, connectDeadline time.Time) error { var firstConnErr error for _, addr := range addrs { + ac.channelz.ChannelMetrics.Target.Store(&addr.Addr) if ctx.Err() != nil { return errConnClosing } ac.mu.Lock() ac.cc.mu.RLock() - ac.dopts.copts.KeepaliveParams = ac.cc.mkp + ac.dopts.copts.KeepaliveParams = ac.cc.keepaliveParams ac.cc.mu.RUnlock() copts := ac.dopts.copts @@ -1362,7 +1397,7 @@ func (ac *addrConn) createTransport(ctx context.Context, addr resolver.Address, defer cancel() copts.ChannelzParent = ac.channelz - newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onClose) + newTr, err := transport.NewHTTP2Client(connectCtx, ac.cc.ctx, addr, copts, onClose) if err != nil { if logger.V(2) { logger.Infof("Creating new client transport to %q: %v", addr, err) @@ -1436,7 +1471,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { if !ac.scopts.HealthCheckEnabled { return } - healthCheckFunc := ac.cc.dopts.healthCheckFunc + healthCheckFunc := internal.HealthCheckFunc if healthCheckFunc == nil { // The health package is not imported to set health check function. // @@ -1468,7 +1503,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { } // Start the health checking stream. go func() { - err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) + err := healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) if err != nil { if status.Code(err) == codes.Unimplemented { channelz.Error(logger, ac.channelz, "Subchannel health check is unimplemented at server side, thus health check is disabled") @@ -1497,29 +1532,6 @@ func (ac *addrConn) getReadyTransport() transport.ClientTransport { return nil } -// getTransport waits until the addrconn is ready and returns the transport. -// If the context expires first, returns an appropriate status. If the -// addrConn is stopped first, returns an Unavailable status error. -func (ac *addrConn) getTransport(ctx context.Context) (transport.ClientTransport, error) { - for ctx.Err() == nil { - ac.mu.Lock() - t, state, sc := ac.transport, ac.state, ac.stateChan - ac.mu.Unlock() - if state == connectivity.Ready { - return t, nil - } - if state == connectivity.Shutdown { - return nil, status.Errorf(codes.Unavailable, "SubConn shutting down") - } - - select { - case <-ctx.Done(): - case <-sc: - } - } - return nil, status.FromContextError(ctx.Err()).Err() -} - // tearDown starts to tear down the addrConn. // // Note that tearDown doesn't remove ac from ac.cc.conns, so the addrConn struct @@ -1566,7 +1578,7 @@ func (ac *addrConn) tearDown(err error) { } else { // Hard close the transport when the channel is entering idle or is // being shutdown. In the case where the channel is being shutdown, - // closing of transports is also taken care of by cancelation of cc.ctx. + // closing of transports is also taken care of by cancellation of cc.ctx. // But in the case where the channel is entering idle, we need to // explicitly close the transports here. Instead of distinguishing // between these two cases, it is simpler to close the transport @@ -1657,22 +1669,19 @@ func (cc *ClientConn) connectionError() error { return cc.lastConnectionError } -// parseTargetAndFindResolver parses the user's dial target and stores the -// parsed target in `cc.parsedTarget`. +// initParsedTargetAndResolverBuilder parses the user's dial target and stores +// the parsed target in `cc.parsedTarget`. // // The resolver to use is determined based on the scheme in the parsed target // and the same is stored in `cc.resolverBuilder`. // // Doesn't grab cc.mu as this method is expected to be called only at Dial time. -func (cc *ClientConn) parseTargetAndFindResolver() error { - channelz.Infof(logger, cc.channelz, "original dial target is: %q", cc.target) +func (cc *ClientConn) initParsedTargetAndResolverBuilder() error { + logger.Infof("original dial target is: %q", cc.target) var rb resolver.Builder parsedTarget, err := parseTarget(cc.target) - if err != nil { - channelz.Infof(logger, cc.channelz, "dial target %q parse failed: %v", cc.target, err) - } else { - channelz.Infof(logger, cc.channelz, "parsed dial target is: %#v", parsedTarget) + if err == nil { rb = cc.getResolver(parsedTarget.URL.Scheme) if rb != nil { cc.parsedTarget = parsedTarget @@ -1691,15 +1700,12 @@ func (cc *ClientConn) parseTargetAndFindResolver() error { defScheme = resolver.GetDefaultScheme() } - channelz.Infof(logger, cc.channelz, "fallback to scheme %q", defScheme) canonicalTarget := defScheme + ":///" + cc.target parsedTarget, err = parseTarget(canonicalTarget) if err != nil { - channelz.Infof(logger, cc.channelz, "dial target %q parse failed: %v", canonicalTarget, err) return err } - channelz.Infof(logger, cc.channelz, "parsed dial target is: %+v", parsedTarget) rb = cc.getResolver(parsedTarget.URL.Scheme) if rb == nil { return fmt.Errorf("could not get resolver for default scheme: %q", parsedTarget.URL.Scheme) @@ -1739,7 +1745,7 @@ func encodeAuthority(authority string) string { return false case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // Subdelim characters return false - case ':', '[', ']', '@': // Authority related delimeters + case ':', '[', ']', '@': // Authority related delimiters return false } // Everything else must be escaped. @@ -1789,7 +1795,7 @@ func encodeAuthority(authority string) string { // credentials do not match the authority configured through the dial option. // // Doesn't grab cc.mu as this method is expected to be called only at Dial time. -func (cc *ClientConn) determineAuthority() error { +func (cc *ClientConn) initAuthority() error { dopts := cc.dopts // Historically, we had two options for users to specify the serverName or // authority for a channel. One was through the transport credentials @@ -1818,10 +1824,9 @@ func (cc *ClientConn) determineAuthority() error { } else if auth, ok := cc.resolverBuilder.(resolver.AuthorityOverrider); ok { cc.authority = auth.OverrideAuthority(cc.parsedTarget) } else if strings.HasPrefix(endpoint, ":") { - cc.authority = "localhost" + endpoint + cc.authority = "localhost" + encodeAuthority(endpoint) } else { cc.authority = encodeAuthority(endpoint) } - channelz.Infof(logger, cc.channelz, "Channel authority set to %q", cc.authority) return nil } diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go index 411e3dfd47..959c2f99d4 100644 --- a/vendor/google.golang.org/grpc/codec.go +++ b/vendor/google.golang.org/grpc/codec.go @@ -21,18 +21,73 @@ package grpc import ( "google.golang.org/grpc/encoding" _ "google.golang.org/grpc/encoding/proto" // to register the Codec for "proto" + "google.golang.org/grpc/mem" ) -// baseCodec contains the functionality of both Codec and encoding.Codec, but -// omits the name/string, which vary between the two and are not needed for -// anything besides the registry in the encoding package. +// baseCodec captures the new encoding.CodecV2 interface without the Name +// function, allowing it to be implemented by older Codec and encoding.Codec +// implementations. The omitted Name function is only needed for the register in +// the encoding package and is not part of the core functionality. type baseCodec interface { - Marshal(v any) ([]byte, error) - Unmarshal(data []byte, v any) error + Marshal(v any) (mem.BufferSlice, error) + Unmarshal(data mem.BufferSlice, v any) error +} + +// getCodec returns an encoding.CodecV2 for the codec of the given name (if +// registered). Initially checks the V2 registry with encoding.GetCodecV2 and +// returns the V2 codec if it is registered. Otherwise, it checks the V1 registry +// with encoding.GetCodec and if it is registered wraps it with newCodecV1Bridge +// to turn it into an encoding.CodecV2. Returns nil otherwise. +func getCodec(name string) encoding.CodecV2 { + if codecV1 := encoding.GetCodec(name); codecV1 != nil { + return newCodecV1Bridge(codecV1) + } + + return encoding.GetCodecV2(name) +} + +func newCodecV0Bridge(c Codec) baseCodec { + return codecV0Bridge{codec: c} +} + +func newCodecV1Bridge(c encoding.Codec) encoding.CodecV2 { + return codecV1Bridge{ + codecV0Bridge: codecV0Bridge{codec: c}, + name: c.Name(), + } +} + +var _ baseCodec = codecV0Bridge{} + +type codecV0Bridge struct { + codec interface { + Marshal(v any) ([]byte, error) + Unmarshal(data []byte, v any) error + } +} + +func (c codecV0Bridge) Marshal(v any) (mem.BufferSlice, error) { + data, err := c.codec.Marshal(v) + if err != nil { + return nil, err + } + return mem.BufferSlice{mem.SliceBuffer(data)}, nil +} + +func (c codecV0Bridge) Unmarshal(data mem.BufferSlice, v any) (err error) { + return c.codec.Unmarshal(data.Materialize(), v) } -var _ baseCodec = Codec(nil) -var _ baseCodec = encoding.Codec(nil) +var _ encoding.CodecV2 = codecV1Bridge{} + +type codecV1Bridge struct { + codecV0Bridge + name string +} + +func (c codecV1Bridge) Name() string { + return c.name +} // Codec defines the interface gRPC uses to encode and decode messages. // Note that implementations of this interface must be thread safe; diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh deleted file mode 100644 index 4cdc6ba7c0..0000000000 --- a/vendor/google.golang.org/grpc/codegen.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# This script serves as an example to demonstrate how to generate the gRPC-Go -# interface and the related messages from .proto file. -# -# It assumes the installation of i) Google proto buffer compiler at -# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen -# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have -# not, please install them first. -# -# We recommend running this script at $GOPATH/src. -# -# If this is not what you need, feel free to make your own scripts. Again, this -# script is for demonstration purpose. -# -proto=$1 -protoc --go_out=plugins=grpc:. $proto diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go index 08476ad1fe..0b42c302b2 100644 --- a/vendor/google.golang.org/grpc/codes/codes.go +++ b/vendor/google.golang.org/grpc/codes/codes.go @@ -235,7 +235,7 @@ func (c *Code) UnmarshalJSON(b []byte) error { if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil { if ci >= _maxCode { - return fmt.Errorf("invalid code: %q", ci) + return fmt.Errorf("invalid code: %d", ci) } *c = Code(ci) diff --git a/vendor/google.golang.org/grpc/credentials/alts/alts.go b/vendor/google.golang.org/grpc/credentials/alts/alts.go index afcdb8a0db..35539eb1ad 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/alts.go +++ b/vendor/google.golang.org/grpc/credentials/alts/alts.go @@ -133,10 +133,11 @@ func DefaultServerOptions() *ServerOptions { // altsTC is the credentials required for authenticating a connection using ALTS. // It implements credentials.TransportCredentials interface. type altsTC struct { - info *credentials.ProtocolInfo - side core.Side - accounts []string - hsAddress string + info *credentials.ProtocolInfo + side core.Side + accounts []string + hsAddress string + boundAccessToken string } // NewClientCreds constructs a client-side ALTS TransportCredentials object. @@ -198,6 +199,7 @@ func (g *altsTC) ClientHandshake(ctx context.Context, addr string, rawConn net.C MaxRpcVersion: maxRPCVersion, MinRpcVersion: minRPCVersion, } + opts.BoundAccessToken = g.boundAccessToken chs, err := handshaker.NewClientHandshaker(ctx, hsConn, rawConn, opts) if err != nil { return nil, nil, err diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go index 43726e877b..7e4bfee888 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go @@ -49,7 +49,7 @@ func (k KeySizeError) Error() string { // newRekeyAEAD creates a new instance of aes128gcm with rekeying. // The key argument should be 44 bytes, the first 32 bytes are used as a key -// for HKDF-expand and the remainining 12 bytes are used as a random mask for +// for HKDF-expand and the remaining 12 bytes are used as a random mask for // the counter. func newRekeyAEAD(key []byte) (*rekeyAEAD, error) { k := len(key) diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go index 6a9035ea25..b5bbb5497a 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go @@ -51,7 +51,7 @@ type aes128gcmRekey struct { // NewAES128GCMRekey creates an instance that uses aes128gcm with rekeying // for ALTS record. The key argument should be 44 bytes, the first 32 bytes -// are used as a key for HKDF-expand and the remainining 12 bytes are used +// are used as a key for HKDF-expand and the remaining 12 bytes are used // as a random mask for the counter. func NewAES128GCMRekey(side core.Side, key []byte) (ALTSRecordCrypto, error) { inCounter := NewInCounter(side, overflowLenAES128GCMRekey) diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go index 1795d0c9e3..46617132a4 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go @@ -54,11 +54,10 @@ func SliceForAppend(in []byte, n int) (head, tail []byte) { func ParseFramedMsg(b []byte, maxLen uint32) ([]byte, []byte, error) { // If the size field is not complete, return the provided buffer as // remaining buffer. - if len(b) < MsgLenFieldSize { + length, sufficientBytes := parseMessageLength(b) + if !sufficientBytes { return nil, b, nil } - msgLenField := b[:MsgLenFieldSize] - length := binary.LittleEndian.Uint32(msgLenField) if length > maxLen { return nil, nil, fmt.Errorf("received the frame length %d larger than the limit %d", length, maxLen) } @@ -68,3 +67,14 @@ func ParseFramedMsg(b []byte, maxLen uint32) ([]byte, []byte, error) { } return b[:MsgLenFieldSize+length], b[MsgLenFieldSize+length:], nil } + +// parseMessageLength returns the message length based on frame header. It also +// returns a boolean indicating if the buffer contains sufficient bytes to parse +// the length header. If there are insufficient bytes, (0, false) is returned. +func parseMessageLength(b []byte) (uint32, bool) { + if len(b) < MsgLenFieldSize { + return 0, false + } + msgLenField := b[:MsgLenFieldSize] + return binary.LittleEndian.Uint32(msgLenField), true +} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go index 0d64fb37a1..f9d2646d4b 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go @@ -31,14 +31,18 @@ import ( // ALTSRecordCrypto is the interface for gRPC ALTS record protocol. type ALTSRecordCrypto interface { - // Encrypt encrypts the plaintext and computes the tag (if any) of dst - // and plaintext. dst and plaintext may fully overlap or not at all. + // Encrypt encrypts the plaintext, computes the tag (if any) of dst and + // plaintext, and appends the result to dst, returning the updated slice. + // dst and plaintext may fully overlap or not at all. Encrypt(dst, plaintext []byte) ([]byte, error) // EncryptionOverhead returns the tag size (if any) in bytes. EncryptionOverhead() int - // Decrypt decrypts ciphertext and verify the tag (if any). dst and - // ciphertext may alias exactly or not at all. To reuse ciphertext's - // storage for the decrypted output, use ciphertext[:0] as dst. + // Decrypt decrypts ciphertext and verifies the tag (if any). If successful, + // this function appends the resulting plaintext to dst, returning the + // updated slice. dst and ciphertext may alias exactly or not at all. To + // reuse ciphertext's storage for the decrypted output, use ciphertext[:0] + // as dst. Even if the function fails, the contents of dst, up to its + // capacity, may be overwritten. Decrypt(dst, ciphertext []byte) ([]byte, error) } @@ -63,6 +67,8 @@ const ( // The maximum write buffer size. This *must* be multiple of // altsRecordDefaultLength. altsWriteBufferMaxSize = 512 * 1024 // 512KiB + // The initial buffer used to read from the network. + altsReadBufferInitialSize = 32 * 1024 // 32KiB ) var ( @@ -83,7 +89,7 @@ type conn struct { net.Conn crypto ALTSRecordCrypto // buf holds data that has been read from the connection and decrypted, - // but has not yet been returned by Read. + // but has not yet been returned by Read. It is a sub-slice of protected. buf []byte payloadLengthLimit int // protected holds data read from the network but have not yet been @@ -111,21 +117,13 @@ func NewConn(c net.Conn, side core.Side, recordProtocol string, key []byte, prot } overhead := MsgLenFieldSize + msgTypeFieldSize + crypto.EncryptionOverhead() payloadLengthLimit := altsRecordDefaultLength - overhead - var protectedBuf []byte - if protected == nil { - // We pre-allocate protected to be of size - // 2*altsRecordDefaultLength-1 during initialization. We only - // read from the network into protected when protected does not - // contain a complete frame, which is at most - // altsRecordDefaultLength-1 (bytes). And we read at most - // altsRecordDefaultLength (bytes) data into protected at one - // time. Therefore, 2*altsRecordDefaultLength-1 is large enough - // to buffer data read from the network. - protectedBuf = make([]byte, 0, 2*altsRecordDefaultLength-1) - } else { - protectedBuf = make([]byte, len(protected)) - copy(protectedBuf, protected) - } + // We pre-allocate protected to be of size 32KB during initialization. + // We increase the size of the buffer by the required amount if it can't + // hold a complete encrypted record. + protectedBuf := make([]byte, max(altsReadBufferInitialSize, len(protected))) + // Copy additional data from hanshaker service. + copy(protectedBuf, protected) + protectedBuf = protectedBuf[:len(protected)] altsConn := &conn{ Conn: c, @@ -162,11 +160,26 @@ func (p *conn) Read(b []byte) (n int, err error) { // Check whether a complete frame has been received yet. for len(framedMsg) == 0 { if len(p.protected) == cap(p.protected) { - tmp := make([]byte, len(p.protected), cap(p.protected)+altsRecordDefaultLength) - copy(tmp, p.protected) - p.protected = tmp + // We can parse the length header to know exactly how large + // the buffer needs to be to hold the entire frame. + length, didParse := parseMessageLength(p.protected) + if !didParse { + // The protected buffer is initialized with a capacity of + // larger than 4B. It should always hold the message length + // header. + panic(fmt.Sprintf("protected buffer length shorter than expected: %d vs %d", len(p.protected), MsgLenFieldSize)) + } + oldProtectedBuf := p.protected + // The new buffer must be able to hold the message length header + // and the entire message. + requiredCapacity := int(length) + MsgLenFieldSize + p.protected = make([]byte, requiredCapacity) + // Copy the contents of the old buffer and set the length of the + // new buffer to the number of bytes already read. + copy(p.protected, oldProtectedBuf) + p.protected = p.protected[:len(oldProtectedBuf)] } - n, err = p.Conn.Read(p.protected[len(p.protected):min(cap(p.protected), len(p.protected)+altsRecordDefaultLength)]) + n, err = p.Conn.Read(p.protected[len(p.protected):cap(p.protected)]) if err != nil { return 0, err } @@ -185,6 +198,15 @@ func (p *conn) Read(b []byte) (n int, err error) { } ciphertext := msg[msgTypeFieldSize:] + // Decrypt directly into the buffer, avoiding a copy from p.buf if + // possible. + if len(b) >= len(ciphertext) { + dec, err := p.crypto.Decrypt(b[:0], ciphertext) + if err != nil { + return 0, err + } + return len(dec), nil + } // Decrypt requires that if the dst and ciphertext alias, they // must alias exactly. Code here used to use msg[:0], but msg // starts MsgLenFieldSize+msgTypeFieldSize bytes earlier than @@ -266,10 +288,3 @@ func (p *conn) Write(b []byte) (n int, err error) { } return n, nil } - -func min(a, b int) int { - if a < b { - return a - } - return b -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go index 6c867dd850..f4974b504b 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go @@ -88,6 +88,8 @@ type ClientHandshakerOptions struct { TargetServiceAccounts []string // RPCVersions specifies the gRPC versions accepted by the client. RPCVersions *altspb.RpcProtocolVersions + // BoundAccessToken is a bound access token to be sent to the server for authentication. + BoundAccessToken string } // ServerHandshakerOptions contains the server handshaker options that can @@ -128,7 +130,7 @@ type altsHandshaker struct { // NewClientHandshaker creates a core.Handshaker that performs a client-side // ALTS handshake by acting as a proxy between the peer and the ALTS handshaker // service in the metadata server. -func NewClientHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, opts *ClientHandshakerOptions) (core.Handshaker, error) { +func NewClientHandshaker(_ context.Context, conn *grpc.ClientConn, c net.Conn, opts *ClientHandshakerOptions) (core.Handshaker, error) { return &altsHandshaker{ stream: nil, conn: c, @@ -141,7 +143,7 @@ func NewClientHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, // NewServerHandshaker creates a core.Handshaker that performs a server-side // ALTS handshake by acting as a proxy between the peer and the ALTS handshaker // service in the metadata server. -func NewServerHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, opts *ServerHandshakerOptions) (core.Handshaker, error) { +func NewServerHandshaker(_ context.Context, conn *grpc.ClientConn, c net.Conn, opts *ServerHandshakerOptions) (core.Handshaker, error) { return &altsHandshaker{ stream: nil, conn: c, @@ -195,7 +197,9 @@ func (h *altsHandshaker) ClientHandshake(ctx context.Context) (net.Conn, credent }, }, } - + if h.clientOpts.BoundAccessToken != "" { + req.GetClientStart().AccessToken = h.clientOpts.BoundAccessToken + } conn, result, err := h.doHandshake(req) if err != nil { return nil, nil, err @@ -294,11 +298,11 @@ func (h *altsHandshaker) doHandshake(req *altspb.HandshakerReq) (net.Conn, *alts func (h *altsHandshaker) accessHandshakerService(req *altspb.HandshakerReq) (*altspb.HandshakerResp, error) { if err := h.stream.Send(req); err != nil { - return nil, err + return nil, fmt.Errorf("failed to send ALTS handshaker request: %w", err) } resp, err := h.stream.Recv() if err != nil { - return nil, err + return nil, fmt.Errorf("failed to receive ALTS handshaker response: %w", err) } return resp, nil } @@ -308,6 +312,7 @@ func (h *altsHandshaker) accessHandshakerService(req *altspb.HandshakerReq) (*al // whatever received from the network and send it to the handshaker service. func (h *altsHandshaker) processUntilDone(resp *altspb.HandshakerResp, extra []byte) (*altspb.HandshakerResult, []byte, error) { var lastWriteTime time.Time + buf := make([]byte, frameLimit) for { if len(resp.OutFrames) > 0 { lastWriteTime = time.Now() @@ -318,7 +323,6 @@ func (h *altsHandshaker) processUntilDone(resp *altspb.HandshakerResp, extra []b if resp.Result != nil { return resp.Result, extra, nil } - buf := make([]byte, frameLimit) n, err := h.conn.Read(buf) if err != nil && err != io.EOF { return nil, nil, err diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go index e1cdafb980..2580995d99 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go @@ -22,9 +22,12 @@ package service import ( "sync" + "time" grpc "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/internal/envconfig" + "google.golang.org/grpc/keepalive" ) var ( @@ -34,8 +37,6 @@ var ( // to a corresponding connection to a hypervisor handshaker service // instance. hsConnMap = make(map[string]*grpc.ClientConn) - // hsDialer will be reassigned in tests. - hsDialer = grpc.Dial ) // Dial dials the handshake service in the hypervisor. If a connection has @@ -49,8 +50,20 @@ func Dial(hsAddress string) (*grpc.ClientConn, error) { if !ok { // Create a new connection to the handshaker service. Note that // this connection stays open until the application is closed. + // Disable the service config to avoid unnecessary TXT record lookups that + // cause timeouts with some versions of systemd-resolved. var err error - hsConn, err = hsDialer(hsAddress, grpc.WithTransportCredentials(insecure.NewCredentials())) + opts := []grpc.DialOption{ + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithDisableServiceConfig(), + } + if envconfig.ALTSHandshakerKeepaliveParams { + opts = append(opts, grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Timeout: 10 * time.Second, + Time: 10 * time.Minute, + })) + } + hsConn, err = grpc.NewClient(hsAddress, opts...) if err != nil { return nil, err } diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go index ca4d033154..331dd6c846 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/gcp/altscontext.proto package grpc_gcp @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -38,10 +39,7 @@ const ( ) type AltsContext struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The application protocol negotiated for this connection. ApplicationProtocol string `protobuf:"bytes,1,opt,name=application_protocol,json=applicationProtocol,proto3" json:"application_protocol,omitempty"` // The record protocol negotiated for this connection. @@ -55,16 +53,16 @@ type AltsContext struct { // The RPC protocol versions supported by the peer. PeerRpcVersions *RpcProtocolVersions `protobuf:"bytes,6,opt,name=peer_rpc_versions,json=peerRpcVersions,proto3" json:"peer_rpc_versions,omitempty"` // Additional attributes of the peer. - PeerAttributes map[string]string `protobuf:"bytes,7,rep,name=peer_attributes,json=peerAttributes,proto3" json:"peer_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + PeerAttributes map[string]string `protobuf:"bytes,7,rep,name=peer_attributes,json=peerAttributes,proto3" json:"peer_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AltsContext) Reset() { *x = AltsContext{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_altscontext_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_altscontext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AltsContext) String() string { @@ -75,7 +73,7 @@ func (*AltsContext) ProtoMessage() {} func (x *AltsContext) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_altscontext_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -141,67 +139,36 @@ func (x *AltsContext) GetPeerAttributes() map[string]string { var File_grpc_gcp_altscontext_proto protoreflect.FileDescriptor -var file_grpc_gcp_altscontext_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, 0x61, 0x6c, 0x74, 0x73, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x1a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, - 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xf1, 0x03, 0x0a, 0x0b, 0x41, 0x6c, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x31, 0x0a, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x3e, 0x0a, 0x0e, - 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0d, 0x73, - 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x14, - 0x70, 0x65, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x65, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, - 0x0a, 0x15, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x11, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x70, 0x65, - 0x65, 0x72, 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x52, 0x0a, - 0x0f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x41, 0x6c, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x50, 0x65, - 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x70, 0x65, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x42, 0x6c, 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x61, 0x6c, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x10, 0x41, - 0x6c, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x3f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, - 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2f, 0x61, 0x6c, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, - 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_gcp_altscontext_proto_rawDesc = "" + + "\n" + + "\x1agrpc/gcp/altscontext.proto\x12\bgrpc.gcp\x1a(grpc/gcp/transport_security_common.proto\"\xf1\x03\n" + + "\vAltsContext\x121\n" + + "\x14application_protocol\x18\x01 \x01(\tR\x13applicationProtocol\x12'\n" + + "\x0frecord_protocol\x18\x02 \x01(\tR\x0erecordProtocol\x12>\n" + + "\x0esecurity_level\x18\x03 \x01(\x0e2\x17.grpc.gcp.SecurityLevelR\rsecurityLevel\x120\n" + + "\x14peer_service_account\x18\x04 \x01(\tR\x12peerServiceAccount\x122\n" + + "\x15local_service_account\x18\x05 \x01(\tR\x13localServiceAccount\x12I\n" + + "\x11peer_rpc_versions\x18\x06 \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\x0fpeerRpcVersions\x12R\n" + + "\x0fpeer_attributes\x18\a \x03(\v2).grpc.gcp.AltsContext.PeerAttributesEntryR\x0epeerAttributes\x1aA\n" + + "\x13PeerAttributesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01Bl\n" + + "\x15io.grpc.alts.internalB\x10AltsContextProtoP\x01Z?google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcpb\x06proto3" var ( file_grpc_gcp_altscontext_proto_rawDescOnce sync.Once - file_grpc_gcp_altscontext_proto_rawDescData = file_grpc_gcp_altscontext_proto_rawDesc + file_grpc_gcp_altscontext_proto_rawDescData []byte ) func file_grpc_gcp_altscontext_proto_rawDescGZIP() []byte { file_grpc_gcp_altscontext_proto_rawDescOnce.Do(func() { - file_grpc_gcp_altscontext_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_altscontext_proto_rawDescData) + file_grpc_gcp_altscontext_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_gcp_altscontext_proto_rawDesc), len(file_grpc_gcp_altscontext_proto_rawDesc))) }) return file_grpc_gcp_altscontext_proto_rawDescData } var file_grpc_gcp_altscontext_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_grpc_gcp_altscontext_proto_goTypes = []interface{}{ +var file_grpc_gcp_altscontext_proto_goTypes = []any{ (*AltsContext)(nil), // 0: grpc.gcp.AltsContext nil, // 1: grpc.gcp.AltsContext.PeerAttributesEntry (SecurityLevel)(0), // 2: grpc.gcp.SecurityLevel @@ -224,25 +191,11 @@ func file_grpc_gcp_altscontext_proto_init() { return } file_grpc_gcp_transport_security_common_proto_init() - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_altscontext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AltsContext); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_gcp_altscontext_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_gcp_altscontext_proto_rawDesc), len(file_grpc_gcp_altscontext_proto_rawDesc)), NumEnums: 0, NumMessages: 2, NumExtensions: 0, @@ -253,7 +206,6 @@ func file_grpc_gcp_altscontext_proto_init() { MessageInfos: file_grpc_gcp_altscontext_proto_msgTypes, }.Build() File_grpc_gcp_altscontext_proto = out.File - file_grpc_gcp_altscontext_proto_rawDesc = nil file_grpc_gcp_altscontext_proto_goTypes = nil file_grpc_gcp_altscontext_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go index 93ceaeb2f9..6370b2a6d2 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/gcp/handshaker.proto package grpc_gcp @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -139,26 +140,23 @@ func (NetworkProtocol) EnumDescriptor() ([]byte, []int) { } type Endpoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // IP address. It should contain an IPv4 or IPv6 string literal, e.g. // "192.168.0.1" or "2001:db8::1". IpAddress string `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` // Port number. Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // Network protocol (e.g., TCP, UDP) associated with this endpoint. - Protocol NetworkProtocol `protobuf:"varint,3,opt,name=protocol,proto3,enum=grpc.gcp.NetworkProtocol" json:"protocol,omitempty"` + Protocol NetworkProtocol `protobuf:"varint,3,opt,name=protocol,proto3,enum=grpc.gcp.NetworkProtocol" json:"protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Endpoint) Reset() { *x = Endpoint{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Endpoint) String() string { @@ -169,7 +167,7 @@ func (*Endpoint) ProtoMessage() {} func (x *Endpoint) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -206,26 +204,23 @@ func (x *Endpoint) GetProtocol() NetworkProtocol { } type Identity struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to IdentityOneof: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to IdentityOneof: // // *Identity_ServiceAccount // *Identity_Hostname IdentityOneof isIdentity_IdentityOneof `protobuf_oneof:"identity_oneof"` // Additional attributes of the identity. - Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Identity) Reset() { *x = Identity{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Identity) String() string { @@ -236,7 +231,7 @@ func (*Identity) ProtoMessage() {} func (x *Identity) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -251,23 +246,27 @@ func (*Identity) Descriptor() ([]byte, []int) { return file_grpc_gcp_handshaker_proto_rawDescGZIP(), []int{1} } -func (m *Identity) GetIdentityOneof() isIdentity_IdentityOneof { - if m != nil { - return m.IdentityOneof +func (x *Identity) GetIdentityOneof() isIdentity_IdentityOneof { + if x != nil { + return x.IdentityOneof } return nil } func (x *Identity) GetServiceAccount() string { - if x, ok := x.GetIdentityOneof().(*Identity_ServiceAccount); ok { - return x.ServiceAccount + if x != nil { + if x, ok := x.IdentityOneof.(*Identity_ServiceAccount); ok { + return x.ServiceAccount + } } return "" } func (x *Identity) GetHostname() string { - if x, ok := x.GetIdentityOneof().(*Identity_Hostname); ok { - return x.Hostname + if x != nil { + if x, ok := x.IdentityOneof.(*Identity_Hostname); ok { + return x.Hostname + } } return "" } @@ -298,10 +297,7 @@ func (*Identity_ServiceAccount) isIdentity_IdentityOneof() {} func (*Identity_Hostname) isIdentity_IdentityOneof() {} type StartClientHandshakeReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Handshake security protocol requested by the client. HandshakeSecurityProtocol HandshakeProtocol `protobuf:"varint,1,opt,name=handshake_security_protocol,json=handshakeSecurityProtocol,proto3,enum=grpc.gcp.HandshakeProtocol" json:"handshake_security_protocol,omitempty"` // The application protocols supported by the client, e.g., "h2" (for http2), @@ -336,15 +332,17 @@ type StartClientHandshakeReq struct { // the peer. The access token MUST be strongly bound to the ALTS credentials // used to establish the connection that the token is sent over. AccessToken string `protobuf:"bytes,11,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // (Optional) Ordered transport protocol preferences supported by the client. + TransportProtocolPreferences *TransportProtocolPreferences `protobuf:"bytes,12,opt,name=transport_protocol_preferences,json=transportProtocolPreferences,proto3" json:"transport_protocol_preferences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StartClientHandshakeReq) Reset() { *x = StartClientHandshakeReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartClientHandshakeReq) String() string { @@ -355,7 +353,7 @@ func (*StartClientHandshakeReq) ProtoMessage() {} func (x *StartClientHandshakeReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -447,31 +445,35 @@ func (x *StartClientHandshakeReq) GetAccessToken() string { return "" } -type ServerHandshakeParameters struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *StartClientHandshakeReq) GetTransportProtocolPreferences() *TransportProtocolPreferences { + if x != nil { + return x.TransportProtocolPreferences + } + return nil +} +type ServerHandshakeParameters struct { + state protoimpl.MessageState `protogen:"open.v1"` // The record protocols supported by the server, e.g., // "ALTSRP_GCM_AES128". RecordProtocols []string `protobuf:"bytes,1,rep,name=record_protocols,json=recordProtocols,proto3" json:"record_protocols,omitempty"` // (Optional) A list of local identities supported by the server, if // specified. Otherwise, the handshaker chooses a default local identity. LocalIdentities []*Identity `protobuf:"bytes,2,rep,name=local_identities,json=localIdentities,proto3" json:"local_identities,omitempty"` - // (Optional) An access token created by the caller only intended for use in - // ALTS connections. The access token that should be used to authenticate to - // the peer. The access token MUST be strongly bound to the ALTS credentials + // A token created by the caller only intended for use in + // ALTS connections. The token should be used to authenticate to + // the peer. The token MUST be strongly bound to the ALTS credentials // used to establish the connection that the token is sent over. - AccessToken *string `protobuf:"bytes,3,opt,name=access_token,json=accessToken,proto3,oneof" json:"access_token,omitempty"` + Token *string `protobuf:"bytes,3,opt,name=token,proto3,oneof" json:"token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerHandshakeParameters) Reset() { *x = ServerHandshakeParameters{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerHandshakeParameters) String() string { @@ -482,7 +484,7 @@ func (*ServerHandshakeParameters) ProtoMessage() {} func (x *ServerHandshakeParameters) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -511,18 +513,15 @@ func (x *ServerHandshakeParameters) GetLocalIdentities() []*Identity { return nil } -func (x *ServerHandshakeParameters) GetAccessToken() string { - if x != nil && x.AccessToken != nil { - return *x.AccessToken +func (x *ServerHandshakeParameters) GetToken() string { + if x != nil && x.Token != nil { + return *x.Token } return "" } type StartServerHandshakeReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The application protocols supported by the server, e.g., "h2" (for http2), // "grpc". ApplicationProtocols []string `protobuf:"bytes,1,rep,name=application_protocols,json=applicationProtocols,proto3" json:"application_protocols,omitempty"` @@ -531,9 +530,9 @@ type StartServerHandshakeReq struct { // protocol (e.g., TLS or ALTS) has its own set of record protocols and local // identities. Since protobuf does not support enum as key to the map, the key // to handshake_parameters is the integer value of HandshakeProtocol enum. - HandshakeParameters map[int32]*ServerHandshakeParameters `protobuf:"bytes,2,rep,name=handshake_parameters,json=handshakeParameters,proto3" json:"handshake_parameters,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + HandshakeParameters map[int32]*ServerHandshakeParameters `protobuf:"bytes,2,rep,name=handshake_parameters,json=handshakeParameters,proto3" json:"handshake_parameters,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Bytes in out_frames returned from the peer's HandshakerResp. It is possible - // that the peer's out_frames are split into multiple HandshakReq messages. + // that the peer's out_frames are split into multiple HandshakeReq messages. InBytes []byte `protobuf:"bytes,3,opt,name=in_bytes,json=inBytes,proto3" json:"in_bytes,omitempty"` // (Optional) Local endpoint information of the connection to the client, // such as local IP address, port number, and network protocol. @@ -545,15 +544,17 @@ type StartServerHandshakeReq struct { RpcVersions *RpcProtocolVersions `protobuf:"bytes,6,opt,name=rpc_versions,json=rpcVersions,proto3" json:"rpc_versions,omitempty"` // (Optional) Maximum frame size supported by the server. MaxFrameSize uint32 `protobuf:"varint,7,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` + // (Optional) Transport protocol preferences supported by the server. + TransportProtocolPreferences *TransportProtocolPreferences `protobuf:"bytes,8,opt,name=transport_protocol_preferences,json=transportProtocolPreferences,proto3" json:"transport_protocol_preferences,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StartServerHandshakeReq) Reset() { *x = StartServerHandshakeReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StartServerHandshakeReq) String() string { @@ -564,7 +565,7 @@ func (*StartServerHandshakeReq) ProtoMessage() {} func (x *StartServerHandshakeReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -628,11 +629,15 @@ func (x *StartServerHandshakeReq) GetMaxFrameSize() uint32 { return 0 } -type NextHandshakeMessageReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *StartServerHandshakeReq) GetTransportProtocolPreferences() *TransportProtocolPreferences { + if x != nil { + return x.TransportProtocolPreferences + } + return nil +} +type NextHandshakeMessageReq struct { + state protoimpl.MessageState `protogen:"open.v1"` // Bytes in out_frames returned from the peer's HandshakerResp. It is possible // that the peer's out_frames are split into multiple NextHandshakerMessageReq // messages. @@ -641,15 +646,15 @@ type NextHandshakeMessageReq struct { // message to the peer and when the application received the current handshake // message (in the in_bytes field) from the peer. NetworkLatencyMs uint32 `protobuf:"varint,2,opt,name=network_latency_ms,json=networkLatencyMs,proto3" json:"network_latency_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NextHandshakeMessageReq) Reset() { *x = NextHandshakeMessageReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *NextHandshakeMessageReq) String() string { @@ -660,7 +665,7 @@ func (*NextHandshakeMessageReq) ProtoMessage() {} func (x *NextHandshakeMessageReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -690,25 +695,22 @@ func (x *NextHandshakeMessageReq) GetNetworkLatencyMs() uint32 { } type HandshakerReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to ReqOneof: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to ReqOneof: // // *HandshakerReq_ClientStart // *HandshakerReq_ServerStart // *HandshakerReq_Next - ReqOneof isHandshakerReq_ReqOneof `protobuf_oneof:"req_oneof"` + ReqOneof isHandshakerReq_ReqOneof `protobuf_oneof:"req_oneof"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerReq) Reset() { *x = HandshakerReq{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerReq) String() string { @@ -719,7 +721,7 @@ func (*HandshakerReq) ProtoMessage() {} func (x *HandshakerReq) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -734,30 +736,36 @@ func (*HandshakerReq) Descriptor() ([]byte, []int) { return file_grpc_gcp_handshaker_proto_rawDescGZIP(), []int{6} } -func (m *HandshakerReq) GetReqOneof() isHandshakerReq_ReqOneof { - if m != nil { - return m.ReqOneof +func (x *HandshakerReq) GetReqOneof() isHandshakerReq_ReqOneof { + if x != nil { + return x.ReqOneof } return nil } func (x *HandshakerReq) GetClientStart() *StartClientHandshakeReq { - if x, ok := x.GetReqOneof().(*HandshakerReq_ClientStart); ok { - return x.ClientStart + if x != nil { + if x, ok := x.ReqOneof.(*HandshakerReq_ClientStart); ok { + return x.ClientStart + } } return nil } func (x *HandshakerReq) GetServerStart() *StartServerHandshakeReq { - if x, ok := x.GetReqOneof().(*HandshakerReq_ServerStart); ok { - return x.ServerStart + if x != nil { + if x, ok := x.ReqOneof.(*HandshakerReq_ServerStart); ok { + return x.ServerStart + } } return nil } func (x *HandshakerReq) GetNext() *NextHandshakeMessageReq { - if x, ok := x.GetReqOneof().(*HandshakerReq_Next); ok { - return x.Next + if x != nil { + if x, ok := x.ReqOneof.(*HandshakerReq_Next); ok { + return x.Next + } } return nil } @@ -788,10 +796,7 @@ func (*HandshakerReq_ServerStart) isHandshakerReq_ReqOneof() {} func (*HandshakerReq_Next) isHandshakerReq_ReqOneof() {} type HandshakerResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The application protocol negotiated for this connection. ApplicationProtocol string `protobuf:"bytes,1,opt,name=application_protocol,json=applicationProtocol,proto3" json:"application_protocol,omitempty"` // The record protocol negotiated for this connection. @@ -812,15 +817,17 @@ type HandshakerResult struct { PeerRpcVersions *RpcProtocolVersions `protobuf:"bytes,7,opt,name=peer_rpc_versions,json=peerRpcVersions,proto3" json:"peer_rpc_versions,omitempty"` // The maximum frame size of the peer. MaxFrameSize uint32 `protobuf:"varint,8,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` + // (Optional) The transport protocol negotiated for this connection. + TransportProtocol *NegotiatedTransportProtocol `protobuf:"bytes,9,opt,name=transport_protocol,json=transportProtocol,proto3" json:"transport_protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerResult) Reset() { *x = HandshakerResult{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerResult) String() string { @@ -831,7 +838,7 @@ func (*HandshakerResult) ProtoMessage() {} func (x *HandshakerResult) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -902,24 +909,28 @@ func (x *HandshakerResult) GetMaxFrameSize() uint32 { return 0 } -type HandshakerStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *HandshakerResult) GetTransportProtocol() *NegotiatedTransportProtocol { + if x != nil { + return x.TransportProtocol + } + return nil +} +type HandshakerStatus struct { + state protoimpl.MessageState `protogen:"open.v1"` // The status code. This could be the gRPC status code. Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // The status details. - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerStatus) Reset() { *x = HandshakerStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerStatus) String() string { @@ -930,7 +941,7 @@ func (*HandshakerStatus) ProtoMessage() {} func (x *HandshakerStatus) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -960,10 +971,7 @@ func (x *HandshakerStatus) GetDetails() string { } type HandshakerResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Frames to be given to the peer for the NextHandshakeMessageReq. May be // empty if no out_frames have to be sent to the peer or if in_bytes in the // HandshakerReq are incomplete. All the non-empty out frames must be sent to @@ -978,16 +986,16 @@ type HandshakerResp struct { // to frames that needs to be forwarded to the peer. Result *HandshakerResult `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"` // Status of the handshaker. - Status *HandshakerStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Status *HandshakerStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HandshakerResp) Reset() { *x = HandshakerResp{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_handshaker_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_handshaker_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HandshakerResp) String() string { @@ -998,7 +1006,7 @@ func (*HandshakerResp) ProtoMessage() {} func (x *HandshakerResp) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_handshaker_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1043,238 +1051,127 @@ func (x *HandshakerResp) GetStatus() *HandshakerStatus { var File_grpc_gcp_handshaker_proto protoreflect.FileDescriptor -var file_grpc_gcp_handshaker_proto_rawDesc = []byte{ - 0x0a, 0x19, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x73, - 0x68, 0x61, 0x6b, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x67, 0x63, 0x70, 0x1a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x74, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x35, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0xe8, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x29, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x10, - 0x0a, 0x0e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, - 0x22, 0xf6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x12, 0x5b, 0x0a, 0x1b, - 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x48, 0x61, 0x6e, - 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x19, - 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x29, - 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x11, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x3b, 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, - 0x0a, 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x72, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbe, 0x01, 0x0a, 0x19, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa5, 0x04, 0x0a, 0x17, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x6d, 0x0a, 0x14, 0x68, - 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x2e, 0x48, 0x61, 0x6e, - 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x69, 0x6e, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x3b, 0x0a, 0x0f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x40, 0x0a, - 0x0c, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x52, - 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0b, 0x72, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x6b, 0x0a, 0x18, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x62, 0x0a, 0x17, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x07, 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x48, 0x61, 0x6e, 0x64, 0x73, - 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, - 0x71, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x46, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x61, 0x6e, - 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x65, 0x78, - 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x9a, - 0x03, 0x0a, 0x10, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x19, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x0d, 0x70, 0x65, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x70, 0x65, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2a, - 0x0a, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x6f, - 0x70, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x6e, 0x12, 0x49, 0x0a, 0x11, 0x70, 0x65, - 0x65, 0x72, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, - 0x2e, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x70, 0x65, 0x65, 0x72, 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, - 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x40, 0x0a, 0x10, 0x48, - 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xbe, 0x01, - 0x0a, 0x0e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6f, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x25, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, - 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, - 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x4a, - 0x0a, 0x11, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x41, 0x4e, 0x44, 0x53, 0x48, 0x41, 0x4b, 0x45, - 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x41, 0x4c, 0x54, 0x53, 0x10, 0x02, 0x2a, 0x45, 0x0a, 0x0f, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x20, 0x0a, - 0x1c, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, - 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, - 0x02, 0x32, 0x5b, 0x0a, 0x11, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x6f, 0x48, 0x61, 0x6e, 0x64, - 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, - 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6b, - 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x61, 0x6c, 0x74, 0x73, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x0f, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, - 0x6b, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3f, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, - 0x70, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2f, 0x61, - 0x6c, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, -} +const file_grpc_gcp_handshaker_proto_rawDesc = "" + + "\n" + + "\x19grpc/gcp/handshaker.proto\x12\bgrpc.gcp\x1a(grpc/gcp/transport_security_common.proto\"t\n" + + "\bEndpoint\x12\x1d\n" + + "\n" + + "ip_address\x18\x01 \x01(\tR\tipAddress\x12\x12\n" + + "\x04port\x18\x02 \x01(\x05R\x04port\x125\n" + + "\bprotocol\x18\x03 \x01(\x0e2\x19.grpc.gcp.NetworkProtocolR\bprotocol\"\xe8\x01\n" + + "\bIdentity\x12)\n" + + "\x0fservice_account\x18\x01 \x01(\tH\x00R\x0eserviceAccount\x12\x1c\n" + + "\bhostname\x18\x02 \x01(\tH\x00R\bhostname\x12B\n" + + "\n" + + "attributes\x18\x03 \x03(\v2\".grpc.gcp.Identity.AttributesEntryR\n" + + "attributes\x1a=\n" + + "\x0fAttributesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x10\n" + + "\x0eidentity_oneof\"\xe9\x05\n" + + "\x17StartClientHandshakeReq\x12[\n" + + "\x1bhandshake_security_protocol\x18\x01 \x01(\x0e2\x1b.grpc.gcp.HandshakeProtocolR\x19handshakeSecurityProtocol\x123\n" + + "\x15application_protocols\x18\x02 \x03(\tR\x14applicationProtocols\x12)\n" + + "\x10record_protocols\x18\x03 \x03(\tR\x0frecordProtocols\x12?\n" + + "\x11target_identities\x18\x04 \x03(\v2\x12.grpc.gcp.IdentityR\x10targetIdentities\x129\n" + + "\x0elocal_identity\x18\x05 \x01(\v2\x12.grpc.gcp.IdentityR\rlocalIdentity\x129\n" + + "\x0elocal_endpoint\x18\x06 \x01(\v2\x12.grpc.gcp.EndpointR\rlocalEndpoint\x12;\n" + + "\x0fremote_endpoint\x18\a \x01(\v2\x12.grpc.gcp.EndpointR\x0eremoteEndpoint\x12\x1f\n" + + "\vtarget_name\x18\b \x01(\tR\n" + + "targetName\x12@\n" + + "\frpc_versions\x18\t \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\vrpcVersions\x12$\n" + + "\x0emax_frame_size\x18\n" + + " \x01(\rR\fmaxFrameSize\x12&\n" + + "\faccess_token\x18\v \x01(\tB\x03\x80\x01\x01R\vaccessToken\x12l\n" + + "\x1etransport_protocol_preferences\x18\f \x01(\v2&.grpc.gcp.TransportProtocolPreferencesR\x1ctransportProtocolPreferences\"\xaf\x01\n" + + "\x19ServerHandshakeParameters\x12)\n" + + "\x10record_protocols\x18\x01 \x03(\tR\x0frecordProtocols\x12=\n" + + "\x10local_identities\x18\x02 \x03(\v2\x12.grpc.gcp.IdentityR\x0flocalIdentities\x12\x1e\n" + + "\x05token\x18\x03 \x01(\tB\x03\x80\x01\x01H\x00R\x05token\x88\x01\x01B\b\n" + + "\x06_token\"\x93\x05\n" + + "\x17StartServerHandshakeReq\x123\n" + + "\x15application_protocols\x18\x01 \x03(\tR\x14applicationProtocols\x12m\n" + + "\x14handshake_parameters\x18\x02 \x03(\v2:.grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntryR\x13handshakeParameters\x12\x19\n" + + "\bin_bytes\x18\x03 \x01(\fR\ainBytes\x129\n" + + "\x0elocal_endpoint\x18\x04 \x01(\v2\x12.grpc.gcp.EndpointR\rlocalEndpoint\x12;\n" + + "\x0fremote_endpoint\x18\x05 \x01(\v2\x12.grpc.gcp.EndpointR\x0eremoteEndpoint\x12@\n" + + "\frpc_versions\x18\x06 \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\vrpcVersions\x12$\n" + + "\x0emax_frame_size\x18\a \x01(\rR\fmaxFrameSize\x12l\n" + + "\x1etransport_protocol_preferences\x18\b \x01(\v2&.grpc.gcp.TransportProtocolPreferencesR\x1ctransportProtocolPreferences\x1ak\n" + + "\x18HandshakeParametersEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\x05R\x03key\x129\n" + + "\x05value\x18\x02 \x01(\v2#.grpc.gcp.ServerHandshakeParametersR\x05value:\x028\x01\"b\n" + + "\x17NextHandshakeMessageReq\x12\x19\n" + + "\bin_bytes\x18\x01 \x01(\fR\ainBytes\x12,\n" + + "\x12network_latency_ms\x18\x02 \x01(\rR\x10networkLatencyMs\"\xe5\x01\n" + + "\rHandshakerReq\x12F\n" + + "\fclient_start\x18\x01 \x01(\v2!.grpc.gcp.StartClientHandshakeReqH\x00R\vclientStart\x12F\n" + + "\fserver_start\x18\x02 \x01(\v2!.grpc.gcp.StartServerHandshakeReqH\x00R\vserverStart\x127\n" + + "\x04next\x18\x03 \x01(\v2!.grpc.gcp.NextHandshakeMessageReqH\x00R\x04nextB\v\n" + + "\treq_oneof\"\xf0\x03\n" + + "\x10HandshakerResult\x121\n" + + "\x14application_protocol\x18\x01 \x01(\tR\x13applicationProtocol\x12'\n" + + "\x0frecord_protocol\x18\x02 \x01(\tR\x0erecordProtocol\x12\x19\n" + + "\bkey_data\x18\x03 \x01(\fR\akeyData\x127\n" + + "\rpeer_identity\x18\x04 \x01(\v2\x12.grpc.gcp.IdentityR\fpeerIdentity\x129\n" + + "\x0elocal_identity\x18\x05 \x01(\v2\x12.grpc.gcp.IdentityR\rlocalIdentity\x12*\n" + + "\x11keep_channel_open\x18\x06 \x01(\bR\x0fkeepChannelOpen\x12I\n" + + "\x11peer_rpc_versions\x18\a \x01(\v2\x1d.grpc.gcp.RpcProtocolVersionsR\x0fpeerRpcVersions\x12$\n" + + "\x0emax_frame_size\x18\b \x01(\rR\fmaxFrameSize\x12T\n" + + "\x12transport_protocol\x18\t \x01(\v2%.grpc.gcp.NegotiatedTransportProtocolR\x11transportProtocol\"@\n" + + "\x10HandshakerStatus\x12\x12\n" + + "\x04code\x18\x01 \x01(\rR\x04code\x12\x18\n" + + "\adetails\x18\x02 \x01(\tR\adetails\"\xbe\x01\n" + + "\x0eHandshakerResp\x12\x1d\n" + + "\n" + + "out_frames\x18\x01 \x01(\fR\toutFrames\x12%\n" + + "\x0ebytes_consumed\x18\x02 \x01(\rR\rbytesConsumed\x122\n" + + "\x06result\x18\x03 \x01(\v2\x1a.grpc.gcp.HandshakerResultR\x06result\x122\n" + + "\x06status\x18\x04 \x01(\v2\x1a.grpc.gcp.HandshakerStatusR\x06status*J\n" + + "\x11HandshakeProtocol\x12\"\n" + + "\x1eHANDSHAKE_PROTOCOL_UNSPECIFIED\x10\x00\x12\a\n" + + "\x03TLS\x10\x01\x12\b\n" + + "\x04ALTS\x10\x02*E\n" + + "\x0fNetworkProtocol\x12 \n" + + "\x1cNETWORK_PROTOCOL_UNSPECIFIED\x10\x00\x12\a\n" + + "\x03TCP\x10\x01\x12\a\n" + + "\x03UDP\x10\x022[\n" + + "\x11HandshakerService\x12F\n" + + "\vDoHandshake\x12\x17.grpc.gcp.HandshakerReq\x1a\x18.grpc.gcp.HandshakerResp\"\x00(\x010\x01Bk\n" + + "\x15io.grpc.alts.internalB\x0fHandshakerProtoP\x01Z?google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcpb\x06proto3" var ( file_grpc_gcp_handshaker_proto_rawDescOnce sync.Once - file_grpc_gcp_handshaker_proto_rawDescData = file_grpc_gcp_handshaker_proto_rawDesc + file_grpc_gcp_handshaker_proto_rawDescData []byte ) func file_grpc_gcp_handshaker_proto_rawDescGZIP() []byte { file_grpc_gcp_handshaker_proto_rawDescOnce.Do(func() { - file_grpc_gcp_handshaker_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_handshaker_proto_rawDescData) + file_grpc_gcp_handshaker_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_gcp_handshaker_proto_rawDesc), len(file_grpc_gcp_handshaker_proto_rawDesc))) }) return file_grpc_gcp_handshaker_proto_rawDescData } var file_grpc_gcp_handshaker_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_grpc_gcp_handshaker_proto_msgTypes = make([]protoimpl.MessageInfo, 12) -var file_grpc_gcp_handshaker_proto_goTypes = []interface{}{ - (HandshakeProtocol)(0), // 0: grpc.gcp.HandshakeProtocol - (NetworkProtocol)(0), // 1: grpc.gcp.NetworkProtocol - (*Endpoint)(nil), // 2: grpc.gcp.Endpoint - (*Identity)(nil), // 3: grpc.gcp.Identity - (*StartClientHandshakeReq)(nil), // 4: grpc.gcp.StartClientHandshakeReq - (*ServerHandshakeParameters)(nil), // 5: grpc.gcp.ServerHandshakeParameters - (*StartServerHandshakeReq)(nil), // 6: grpc.gcp.StartServerHandshakeReq - (*NextHandshakeMessageReq)(nil), // 7: grpc.gcp.NextHandshakeMessageReq - (*HandshakerReq)(nil), // 8: grpc.gcp.HandshakerReq - (*HandshakerResult)(nil), // 9: grpc.gcp.HandshakerResult - (*HandshakerStatus)(nil), // 10: grpc.gcp.HandshakerStatus - (*HandshakerResp)(nil), // 11: grpc.gcp.HandshakerResp - nil, // 12: grpc.gcp.Identity.AttributesEntry - nil, // 13: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry - (*RpcProtocolVersions)(nil), // 14: grpc.gcp.RpcProtocolVersions +var file_grpc_gcp_handshaker_proto_goTypes = []any{ + (HandshakeProtocol)(0), // 0: grpc.gcp.HandshakeProtocol + (NetworkProtocol)(0), // 1: grpc.gcp.NetworkProtocol + (*Endpoint)(nil), // 2: grpc.gcp.Endpoint + (*Identity)(nil), // 3: grpc.gcp.Identity + (*StartClientHandshakeReq)(nil), // 4: grpc.gcp.StartClientHandshakeReq + (*ServerHandshakeParameters)(nil), // 5: grpc.gcp.ServerHandshakeParameters + (*StartServerHandshakeReq)(nil), // 6: grpc.gcp.StartServerHandshakeReq + (*NextHandshakeMessageReq)(nil), // 7: grpc.gcp.NextHandshakeMessageReq + (*HandshakerReq)(nil), // 8: grpc.gcp.HandshakerReq + (*HandshakerResult)(nil), // 9: grpc.gcp.HandshakerResult + (*HandshakerStatus)(nil), // 10: grpc.gcp.HandshakerStatus + (*HandshakerResp)(nil), // 11: grpc.gcp.HandshakerResp + nil, // 12: grpc.gcp.Identity.AttributesEntry + nil, // 13: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry + (*RpcProtocolVersions)(nil), // 14: grpc.gcp.RpcProtocolVersions + (*TransportProtocolPreferences)(nil), // 15: grpc.gcp.TransportProtocolPreferences + (*NegotiatedTransportProtocol)(nil), // 16: grpc.gcp.NegotiatedTransportProtocol } var file_grpc_gcp_handshaker_proto_depIdxs = []int32{ 1, // 0: grpc.gcp.Endpoint.protocol:type_name -> grpc.gcp.NetworkProtocol @@ -1285,27 +1182,30 @@ var file_grpc_gcp_handshaker_proto_depIdxs = []int32{ 2, // 5: grpc.gcp.StartClientHandshakeReq.local_endpoint:type_name -> grpc.gcp.Endpoint 2, // 6: grpc.gcp.StartClientHandshakeReq.remote_endpoint:type_name -> grpc.gcp.Endpoint 14, // 7: grpc.gcp.StartClientHandshakeReq.rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions - 3, // 8: grpc.gcp.ServerHandshakeParameters.local_identities:type_name -> grpc.gcp.Identity - 13, // 9: grpc.gcp.StartServerHandshakeReq.handshake_parameters:type_name -> grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry - 2, // 10: grpc.gcp.StartServerHandshakeReq.local_endpoint:type_name -> grpc.gcp.Endpoint - 2, // 11: grpc.gcp.StartServerHandshakeReq.remote_endpoint:type_name -> grpc.gcp.Endpoint - 14, // 12: grpc.gcp.StartServerHandshakeReq.rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions - 4, // 13: grpc.gcp.HandshakerReq.client_start:type_name -> grpc.gcp.StartClientHandshakeReq - 6, // 14: grpc.gcp.HandshakerReq.server_start:type_name -> grpc.gcp.StartServerHandshakeReq - 7, // 15: grpc.gcp.HandshakerReq.next:type_name -> grpc.gcp.NextHandshakeMessageReq - 3, // 16: grpc.gcp.HandshakerResult.peer_identity:type_name -> grpc.gcp.Identity - 3, // 17: grpc.gcp.HandshakerResult.local_identity:type_name -> grpc.gcp.Identity - 14, // 18: grpc.gcp.HandshakerResult.peer_rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions - 9, // 19: grpc.gcp.HandshakerResp.result:type_name -> grpc.gcp.HandshakerResult - 10, // 20: grpc.gcp.HandshakerResp.status:type_name -> grpc.gcp.HandshakerStatus - 5, // 21: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry.value:type_name -> grpc.gcp.ServerHandshakeParameters - 8, // 22: grpc.gcp.HandshakerService.DoHandshake:input_type -> grpc.gcp.HandshakerReq - 11, // 23: grpc.gcp.HandshakerService.DoHandshake:output_type -> grpc.gcp.HandshakerResp - 23, // [23:24] is the sub-list for method output_type - 22, // [22:23] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 15, // 8: grpc.gcp.StartClientHandshakeReq.transport_protocol_preferences:type_name -> grpc.gcp.TransportProtocolPreferences + 3, // 9: grpc.gcp.ServerHandshakeParameters.local_identities:type_name -> grpc.gcp.Identity + 13, // 10: grpc.gcp.StartServerHandshakeReq.handshake_parameters:type_name -> grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry + 2, // 11: grpc.gcp.StartServerHandshakeReq.local_endpoint:type_name -> grpc.gcp.Endpoint + 2, // 12: grpc.gcp.StartServerHandshakeReq.remote_endpoint:type_name -> grpc.gcp.Endpoint + 14, // 13: grpc.gcp.StartServerHandshakeReq.rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions + 15, // 14: grpc.gcp.StartServerHandshakeReq.transport_protocol_preferences:type_name -> grpc.gcp.TransportProtocolPreferences + 4, // 15: grpc.gcp.HandshakerReq.client_start:type_name -> grpc.gcp.StartClientHandshakeReq + 6, // 16: grpc.gcp.HandshakerReq.server_start:type_name -> grpc.gcp.StartServerHandshakeReq + 7, // 17: grpc.gcp.HandshakerReq.next:type_name -> grpc.gcp.NextHandshakeMessageReq + 3, // 18: grpc.gcp.HandshakerResult.peer_identity:type_name -> grpc.gcp.Identity + 3, // 19: grpc.gcp.HandshakerResult.local_identity:type_name -> grpc.gcp.Identity + 14, // 20: grpc.gcp.HandshakerResult.peer_rpc_versions:type_name -> grpc.gcp.RpcProtocolVersions + 16, // 21: grpc.gcp.HandshakerResult.transport_protocol:type_name -> grpc.gcp.NegotiatedTransportProtocol + 9, // 22: grpc.gcp.HandshakerResp.result:type_name -> grpc.gcp.HandshakerResult + 10, // 23: grpc.gcp.HandshakerResp.status:type_name -> grpc.gcp.HandshakerStatus + 5, // 24: grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry.value:type_name -> grpc.gcp.ServerHandshakeParameters + 8, // 25: grpc.gcp.HandshakerService.DoHandshake:input_type -> grpc.gcp.HandshakerReq + 11, // 26: grpc.gcp.HandshakerService.DoHandshake:output_type -> grpc.gcp.HandshakerResp + 26, // [26:27] is the sub-list for method output_type + 25, // [25:26] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_grpc_gcp_handshaker_proto_init() } @@ -1314,134 +1214,12 @@ func file_grpc_gcp_handshaker_proto_init() { return } file_grpc_gcp_transport_security_common_proto_init() - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_handshaker_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Endpoint); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Identity); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartClientHandshakeReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerHandshakeParameters); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartServerHandshakeReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NextHandshakeMessageReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerResult); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerStatus); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_handshaker_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HandshakerResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_gcp_handshaker_proto_msgTypes[1].OneofWrappers = []interface{}{ + file_grpc_gcp_handshaker_proto_msgTypes[1].OneofWrappers = []any{ (*Identity_ServiceAccount)(nil), (*Identity_Hostname)(nil), } - file_grpc_gcp_handshaker_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_grpc_gcp_handshaker_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_grpc_gcp_handshaker_proto_msgTypes[3].OneofWrappers = []any{} + file_grpc_gcp_handshaker_proto_msgTypes[6].OneofWrappers = []any{ (*HandshakerReq_ClientStart)(nil), (*HandshakerReq_ServerStart)(nil), (*HandshakerReq_Next)(nil), @@ -1450,7 +1228,7 @@ func file_grpc_gcp_handshaker_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_gcp_handshaker_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_gcp_handshaker_proto_rawDesc), len(file_grpc_gcp_handshaker_proto_rawDesc)), NumEnums: 2, NumMessages: 12, NumExtensions: 0, @@ -1462,7 +1240,6 @@ func file_grpc_gcp_handshaker_proto_init() { MessageInfos: file_grpc_gcp_handshaker_proto_msgTypes, }.Build() File_grpc_gcp_handshaker_proto = out.File - file_grpc_gcp_handshaker_proto_rawDesc = nil file_grpc_gcp_handshaker_proto_goTypes = nil file_grpc_gcp_handshaker_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go index ba1c46f64b..21cb01be66 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // source: grpc/gcp/handshaker.proto package grpc_gcp @@ -32,8 +32,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( HandshakerService_DoHandshake_FullMethodName = "/grpc.gcp.HandshakerService/DoHandshake" @@ -49,7 +49,7 @@ type HandshakerServiceClient interface { // messages with next. Each time client sends a request, the handshaker // service expects to respond. Client does not have to wait for service's // response before sending next request. - DoHandshake(ctx context.Context, opts ...grpc.CallOption) (HandshakerService_DoHandshakeClient, error) + DoHandshake(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[HandshakerReq, HandshakerResp], error) } type handshakerServiceClient struct { @@ -60,40 +60,22 @@ func NewHandshakerServiceClient(cc grpc.ClientConnInterface) HandshakerServiceCl return &handshakerServiceClient{cc} } -func (c *handshakerServiceClient) DoHandshake(ctx context.Context, opts ...grpc.CallOption) (HandshakerService_DoHandshakeClient, error) { - stream, err := c.cc.NewStream(ctx, &HandshakerService_ServiceDesc.Streams[0], HandshakerService_DoHandshake_FullMethodName, opts...) +func (c *handshakerServiceClient) DoHandshake(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[HandshakerReq, HandshakerResp], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &HandshakerService_ServiceDesc.Streams[0], HandshakerService_DoHandshake_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &handshakerServiceDoHandshakeClient{stream} + x := &grpc.GenericClientStream[HandshakerReq, HandshakerResp]{ClientStream: stream} return x, nil } -type HandshakerService_DoHandshakeClient interface { - Send(*HandshakerReq) error - Recv() (*HandshakerResp, error) - grpc.ClientStream -} - -type handshakerServiceDoHandshakeClient struct { - grpc.ClientStream -} - -func (x *handshakerServiceDoHandshakeClient) Send(m *HandshakerReq) error { - return x.ClientStream.SendMsg(m) -} - -func (x *handshakerServiceDoHandshakeClient) Recv() (*HandshakerResp, error) { - m := new(HandshakerResp) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type HandshakerService_DoHandshakeClient = grpc.BidiStreamingClient[HandshakerReq, HandshakerResp] // HandshakerServiceServer is the server API for HandshakerService service. // All implementations must embed UnimplementedHandshakerServiceServer -// for forward compatibility +// for forward compatibility. type HandshakerServiceServer interface { // Handshaker service accepts a stream of handshaker request, returning a // stream of handshaker response. Client is expected to send exactly one @@ -101,18 +83,22 @@ type HandshakerServiceServer interface { // messages with next. Each time client sends a request, the handshaker // service expects to respond. Client does not have to wait for service's // response before sending next request. - DoHandshake(HandshakerService_DoHandshakeServer) error + DoHandshake(grpc.BidiStreamingServer[HandshakerReq, HandshakerResp]) error mustEmbedUnimplementedHandshakerServiceServer() } -// UnimplementedHandshakerServiceServer must be embedded to have forward compatible implementations. -type UnimplementedHandshakerServiceServer struct { -} +// UnimplementedHandshakerServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedHandshakerServiceServer struct{} -func (UnimplementedHandshakerServiceServer) DoHandshake(HandshakerService_DoHandshakeServer) error { - return status.Errorf(codes.Unimplemented, "method DoHandshake not implemented") +func (UnimplementedHandshakerServiceServer) DoHandshake(grpc.BidiStreamingServer[HandshakerReq, HandshakerResp]) error { + return status.Error(codes.Unimplemented, "method DoHandshake not implemented") } func (UnimplementedHandshakerServiceServer) mustEmbedUnimplementedHandshakerServiceServer() {} +func (UnimplementedHandshakerServiceServer) testEmbeddedByValue() {} // UnsafeHandshakerServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to HandshakerServiceServer will @@ -122,34 +108,22 @@ type UnsafeHandshakerServiceServer interface { } func RegisterHandshakerServiceServer(s grpc.ServiceRegistrar, srv HandshakerServiceServer) { + // If the following call panics, it indicates UnimplementedHandshakerServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&HandshakerService_ServiceDesc, srv) } func _HandshakerService_DoHandshake_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(HandshakerServiceServer).DoHandshake(&handshakerServiceDoHandshakeServer{stream}) -} - -type HandshakerService_DoHandshakeServer interface { - Send(*HandshakerResp) error - Recv() (*HandshakerReq, error) - grpc.ServerStream -} - -type handshakerServiceDoHandshakeServer struct { - grpc.ServerStream + return srv.(HandshakerServiceServer).DoHandshake(&grpc.GenericServerStream[HandshakerReq, HandshakerResp]{ServerStream: stream}) } -func (x *handshakerServiceDoHandshakeServer) Send(m *HandshakerResp) error { - return x.ServerStream.SendMsg(m) -} - -func (x *handshakerServiceDoHandshakeServer) Recv() (*HandshakerReq, error) { - m := new(HandshakerReq) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type HandshakerService_DoHandshakeServer = grpc.BidiStreamingServer[HandshakerReq, HandshakerResp] // HandshakerService_ServiceDesc is the grpc.ServiceDesc for HandshakerService service. // It's only intended for direct use with grpc.RegisterService, diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go index 3e53b2b13b..cf48193cb2 100644 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go +++ b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/gcp/transport_security_common.proto package grpc_gcp @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -90,23 +91,20 @@ func (SecurityLevel) EnumDescriptor() ([]byte, []int) { // Max and min supported RPC protocol versions. type RpcProtocolVersions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Maximum supported RPC version. MaxRpcVersion *RpcProtocolVersions_Version `protobuf:"bytes,1,opt,name=max_rpc_version,json=maxRpcVersion,proto3" json:"max_rpc_version,omitempty"` // Minimum supported RPC version. MinRpcVersion *RpcProtocolVersions_Version `protobuf:"bytes,2,opt,name=min_rpc_version,json=minRpcVersion,proto3" json:"min_rpc_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RpcProtocolVersions) Reset() { *x = RpcProtocolVersions{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RpcProtocolVersions) String() string { @@ -117,7 +115,7 @@ func (*RpcProtocolVersions) ProtoMessage() {} func (x *RpcProtocolVersions) ProtoReflect() protoreflect.Message { mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -146,23 +144,111 @@ func (x *RpcProtocolVersions) GetMinRpcVersion() *RpcProtocolVersions_Version { return nil } +// The ordered list of protocols that the client wishes to use, or the set +// that the server supports. +type TransportProtocolPreferences struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransportProtocol []string `protobuf:"bytes,1,rep,name=transport_protocol,json=transportProtocol,proto3" json:"transport_protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TransportProtocolPreferences) Reset() { + *x = TransportProtocolPreferences{} + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TransportProtocolPreferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransportProtocolPreferences) ProtoMessage() {} + +func (x *TransportProtocolPreferences) ProtoReflect() protoreflect.Message { + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TransportProtocolPreferences.ProtoReflect.Descriptor instead. +func (*TransportProtocolPreferences) Descriptor() ([]byte, []int) { + return file_grpc_gcp_transport_security_common_proto_rawDescGZIP(), []int{1} +} + +func (x *TransportProtocolPreferences) GetTransportProtocol() []string { + if x != nil { + return x.TransportProtocol + } + return nil +} + +// The negotiated transport protocol. +type NegotiatedTransportProtocol struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransportProtocol string `protobuf:"bytes,1,opt,name=transport_protocol,json=transportProtocol,proto3" json:"transport_protocol,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *NegotiatedTransportProtocol) Reset() { + *x = NegotiatedTransportProtocol{} + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NegotiatedTransportProtocol) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NegotiatedTransportProtocol) ProtoMessage() {} + +func (x *NegotiatedTransportProtocol) ProtoReflect() protoreflect.Message { + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NegotiatedTransportProtocol.ProtoReflect.Descriptor instead. +func (*NegotiatedTransportProtocol) Descriptor() ([]byte, []int) { + return file_grpc_gcp_transport_security_common_proto_rawDescGZIP(), []int{2} +} + +func (x *NegotiatedTransportProtocol) GetTransportProtocol() string { + if x != nil { + return x.TransportProtocol + } + return "" +} + // RPC version contains a major version and a minor version. type RpcProtocolVersions_Version struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` unknownFields protoimpl.UnknownFields - - Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RpcProtocolVersions_Version) Reset() { *x = RpcProtocolVersions_Version{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RpcProtocolVersions_Version) String() string { @@ -172,8 +258,8 @@ func (x *RpcProtocolVersions_Version) String() string { func (*RpcProtocolVersions_Version) ProtoMessage() {} func (x *RpcProtocolVersions_Version) ProtoReflect() protoreflect.Message { - mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_grpc_gcp_transport_security_common_proto_msgTypes[3] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -204,63 +290,49 @@ func (x *RpcProtocolVersions_Version) GetMinor() uint32 { var File_grpc_gcp_transport_security_common_proto protoreflect.FileDescriptor -var file_grpc_gcp_transport_security_common_proto_rawDesc = []byte{ - 0x0a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x63, 0x70, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x67, 0x63, 0x70, 0x22, 0xea, 0x01, 0x0a, 0x13, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0f, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, - 0x2e, 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6d, 0x61, - 0x78, 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0f, 0x6d, - 0x69, 0x6e, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x63, 0x70, 0x2e, - 0x52, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6d, 0x69, 0x6e, - 0x52, 0x70, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x35, 0x0a, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, - 0x72, 0x2a, 0x51, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x49, - 0x54, 0x59, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, - 0x43, 0x59, 0x10, 0x02, 0x42, 0x78, 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x61, 0x6c, 0x74, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x1c, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3f, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, - 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x2f, 0x61, 0x6c, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x67, 0x63, 0x70, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_gcp_transport_security_common_proto_rawDesc = "" + + "\n" + + "(grpc/gcp/transport_security_common.proto\x12\bgrpc.gcp\"\xea\x01\n" + + "\x13RpcProtocolVersions\x12M\n" + + "\x0fmax_rpc_version\x18\x01 \x01(\v2%.grpc.gcp.RpcProtocolVersions.VersionR\rmaxRpcVersion\x12M\n" + + "\x0fmin_rpc_version\x18\x02 \x01(\v2%.grpc.gcp.RpcProtocolVersions.VersionR\rminRpcVersion\x1a5\n" + + "\aVersion\x12\x14\n" + + "\x05major\x18\x01 \x01(\rR\x05major\x12\x14\n" + + "\x05minor\x18\x02 \x01(\rR\x05minor\"M\n" + + "\x1cTransportProtocolPreferences\x12-\n" + + "\x12transport_protocol\x18\x01 \x03(\tR\x11transportProtocol\"L\n" + + "\x1bNegotiatedTransportProtocol\x12-\n" + + "\x12transport_protocol\x18\x01 \x01(\tR\x11transportProtocol*Q\n" + + "\rSecurityLevel\x12\x11\n" + + "\rSECURITY_NONE\x10\x00\x12\x12\n" + + "\x0eINTEGRITY_ONLY\x10\x01\x12\x19\n" + + "\x15INTEGRITY_AND_PRIVACY\x10\x02Bx\n" + + "\x15io.grpc.alts.internalB\x1cTransportSecurityCommonProtoP\x01Z?google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcpb\x06proto3" var ( file_grpc_gcp_transport_security_common_proto_rawDescOnce sync.Once - file_grpc_gcp_transport_security_common_proto_rawDescData = file_grpc_gcp_transport_security_common_proto_rawDesc + file_grpc_gcp_transport_security_common_proto_rawDescData []byte ) func file_grpc_gcp_transport_security_common_proto_rawDescGZIP() []byte { file_grpc_gcp_transport_security_common_proto_rawDescOnce.Do(func() { - file_grpc_gcp_transport_security_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_gcp_transport_security_common_proto_rawDescData) + file_grpc_gcp_transport_security_common_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_gcp_transport_security_common_proto_rawDesc), len(file_grpc_gcp_transport_security_common_proto_rawDesc))) }) return file_grpc_gcp_transport_security_common_proto_rawDescData } var file_grpc_gcp_transport_security_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_grpc_gcp_transport_security_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_grpc_gcp_transport_security_common_proto_goTypes = []interface{}{ - (SecurityLevel)(0), // 0: grpc.gcp.SecurityLevel - (*RpcProtocolVersions)(nil), // 1: grpc.gcp.RpcProtocolVersions - (*RpcProtocolVersions_Version)(nil), // 2: grpc.gcp.RpcProtocolVersions.Version +var file_grpc_gcp_transport_security_common_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_grpc_gcp_transport_security_common_proto_goTypes = []any{ + (SecurityLevel)(0), // 0: grpc.gcp.SecurityLevel + (*RpcProtocolVersions)(nil), // 1: grpc.gcp.RpcProtocolVersions + (*TransportProtocolPreferences)(nil), // 2: grpc.gcp.TransportProtocolPreferences + (*NegotiatedTransportProtocol)(nil), // 3: grpc.gcp.NegotiatedTransportProtocol + (*RpcProtocolVersions_Version)(nil), // 4: grpc.gcp.RpcProtocolVersions.Version } var file_grpc_gcp_transport_security_common_proto_depIdxs = []int32{ - 2, // 0: grpc.gcp.RpcProtocolVersions.max_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version - 2, // 1: grpc.gcp.RpcProtocolVersions.min_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version + 4, // 0: grpc.gcp.RpcProtocolVersions.max_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version + 4, // 1: grpc.gcp.RpcProtocolVersions.min_rpc_version:type_name -> grpc.gcp.RpcProtocolVersions.Version 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name @@ -273,39 +345,13 @@ func file_grpc_gcp_transport_security_common_proto_init() { if File_grpc_gcp_transport_security_common_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_gcp_transport_security_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RpcProtocolVersions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_gcp_transport_security_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RpcProtocolVersions_Version); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_gcp_transport_security_common_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_gcp_transport_security_common_proto_rawDesc), len(file_grpc_gcp_transport_security_common_proto_rawDesc)), NumEnums: 1, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 0, }, @@ -315,7 +361,6 @@ func file_grpc_gcp_transport_security_common_proto_init() { MessageInfos: file_grpc_gcp_transport_security_common_proto_msgTypes, }.Build() File_grpc_gcp_transport_security_common_proto = out.File - file_grpc_gcp_transport_security_common_proto_rawDesc = nil file_grpc_gcp_transport_security_common_proto_goTypes = nil file_grpc_gcp_transport_security_common_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go index f6b55c68b5..c8e337cdda 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -30,7 +30,7 @@ import ( "google.golang.org/grpc/attributes" icredentials "google.golang.org/grpc/internal/credentials" - "google.golang.org/protobuf/protoadapt" + "google.golang.org/protobuf/proto" ) // PerRPCCredentials defines the common interface for the credentials which need to @@ -96,10 +96,11 @@ func (c CommonAuthInfo) GetCommonAuthInfo() CommonAuthInfo { return c } -// ProtocolInfo provides information regarding the gRPC wire protocol version, -// security protocol, security protocol version in use, server name, etc. +// ProtocolInfo provides static information regarding transport credentials. type ProtocolInfo struct { // ProtocolVersion is the gRPC wire protocol version. + // + // Deprecated: this is unused by gRPC. ProtocolVersion string // SecurityProtocol is the security protocol in use. SecurityProtocol string @@ -109,7 +110,16 @@ type ProtocolInfo struct { // // Deprecated: please use Peer.AuthInfo. SecurityVersion string - // ServerName is the user-configured server name. + // ServerName is the user-configured server name. If set, this overrides + // the default :authority header used for all RPCs on the channel using the + // containing credentials, unless grpc.WithAuthority is set on the channel, + // in which case that setting will take precedence. + // + // This must be a valid `:authority` header according to + // [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2). + // + // Deprecated: Users should use grpc.WithAuthority to override the authority + // on a channel instead of configuring the credentials. ServerName string } @@ -120,6 +130,20 @@ type AuthInfo interface { AuthType() string } +// AuthorityValidator validates the authority used to override the `:authority` +// header. This is an optional interface that implementations of AuthInfo can +// implement if they support per-RPC authority overrides. It is invoked when the +// application attempts to override the HTTP/2 `:authority` header using the +// CallAuthority call option. +type AuthorityValidator interface { + // ValidateAuthority checks the authority value used to override the + // `:authority` header. The authority parameter is the override value + // provided by the application via the CallAuthority option. This value + // typically corresponds to the server hostname or endpoint the RPC is + // targeting. It returns non-nil error if the validation fails. + ValidateAuthority(authority string) error +} + // ErrConnDispatched indicates that rawConn has been dispatched out of gRPC // and the caller should not close rawConn. var ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC") @@ -159,12 +183,17 @@ type TransportCredentials interface { // Clone makes a copy of this TransportCredentials. Clone() TransportCredentials // OverrideServerName specifies the value used for the following: + // // - verifying the hostname on the returned certificates // - as SNI in the client's handshake to support virtual hosting // - as the value for `:authority` header at stream creation time // - // Deprecated: use grpc.WithAuthority instead. Will be supported - // throughout 1.x. + // The provided string should be a valid `:authority` header according to + // [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2). + // + // Deprecated: this method is unused by gRPC. Users should use + // grpc.WithAuthority to override the authority on a channel instead of + // configuring the credentials. OverrideServerName(string) error } @@ -207,14 +236,32 @@ type RequestInfo struct { AuthInfo AuthInfo } +// requestInfoKey is a struct to be used as the key to store RequestInfo in a +// context. +type requestInfoKey struct{} + // RequestInfoFromContext extracts the RequestInfo from the context if it exists. // // This API is experimental. func RequestInfoFromContext(ctx context.Context) (ri RequestInfo, ok bool) { - ri, ok = icredentials.RequestInfoFromContext(ctx).(RequestInfo) + ri, ok = ctx.Value(requestInfoKey{}).(RequestInfo) return ri, ok } +// NewContextWithRequestInfo creates a new context from ctx and attaches ri to it. +// +// This RequestInfo will be accessible via RequestInfoFromContext. +// +// Intended to be used from tests for PerRPCCredentials implementations (that +// often need to check connection's SecurityLevel). Should not be used from +// non-test code: the gRPC client already prepares a context with the correct +// RequestInfo attached when calling PerRPCCredentials.GetRequestMetadata. +// +// This API is experimental. +func NewContextWithRequestInfo(ctx context.Context, ri RequestInfo) context.Context { + return context.WithValue(ctx, requestInfoKey{}, ri) +} + // ClientHandshakeInfo holds data to be passed to ClientHandshake. This makes // it possible to pass arbitrary data to the handshaker from gRPC, resolver, // balancer etc. Individual credential implementations control the actual @@ -237,7 +284,7 @@ func ClientHandshakeInfoFromContext(ctx context.Context) ClientHandshakeInfo { } // CheckSecurityLevel checks if a connection's security level is greater than or equal to the specified one. -// It returns success if 1) the condition is satisified or 2) AuthInfo struct does not implement GetCommonAuthInfo() method +// It returns success if 1) the condition is satisfied or 2) AuthInfo struct does not implement GetCommonAuthInfo() method // or 3) CommonAuthInfo.SecurityLevel has an invalid zero value. For 2) and 3), it is for the purpose of backward-compatibility. // // This API is experimental. @@ -287,5 +334,5 @@ type ChannelzSecurityValue interface { type OtherChannelzSecurityValue struct { ChannelzSecurityValue Name string - Value protoadapt.MessageV1 + Value proto.Message } diff --git a/vendor/google.golang.org/grpc/credentials/insecure/insecure.go b/vendor/google.golang.org/grpc/credentials/insecure/insecure.go index 82bee1443b..93156c0f34 100644 --- a/vendor/google.golang.org/grpc/credentials/insecure/insecure.go +++ b/vendor/google.golang.org/grpc/credentials/insecure/insecure.go @@ -30,7 +30,7 @@ import ( // NewCredentials returns a credentials which disables transport security. // // Note that using this credentials with per-RPC credentials which require -// transport security is incompatible and will cause grpc.Dial() to fail. +// transport security is incompatible and will cause RPCs to fail. func NewCredentials() credentials.TransportCredentials { return insecureTC{} } @@ -40,7 +40,7 @@ func NewCredentials() credentials.TransportCredentials { // NoSecurity. type insecureTC struct{} -func (insecureTC) ClientHandshake(ctx context.Context, _ string, conn net.Conn) (net.Conn, credentials.AuthInfo, error) { +func (insecureTC) ClientHandshake(_ context.Context, _ string, conn net.Conn) (net.Conn, credentials.AuthInfo, error) { return conn, info{credentials.CommonAuthInfo{SecurityLevel: credentials.NoSecurity}}, nil } @@ -71,6 +71,12 @@ func (info) AuthType() string { return "insecure" } +// ValidateAuthority allows any value to be overridden for the :authority +// header. +func (info) ValidateAuthority(string) error { + return nil +} + // insecureBundle implements an insecure bundle. // An insecure bundle provides a thin wrapper around insecureTC to support // the credentials.Bundle interface. diff --git a/vendor/google.golang.org/grpc/credentials/tls.go b/vendor/google.golang.org/grpc/credentials/tls.go index 5dafd34edf..8277be7d6f 100644 --- a/vendor/google.golang.org/grpc/credentials/tls.go +++ b/vendor/google.golang.org/grpc/credentials/tls.go @@ -22,14 +22,21 @@ import ( "context" "crypto/tls" "crypto/x509" + "errors" "fmt" "net" "net/url" "os" + "google.golang.org/grpc/grpclog" credinternal "google.golang.org/grpc/internal/credentials" + "google.golang.org/grpc/internal/envconfig" ) +const alpnFailureHelpMessage = "If you upgraded from a grpc-go version earlier than 1.67, your TLS connections may have stopped working due to ALPN enforcement. For more details, see: https://github.com/grpc/grpc-go/issues/434" + +var logger = grpclog.Component("credentials") + // TLSInfo contains the auth information for a TLS authenticated connection. // It implements the AuthInfo interface. type TLSInfo struct { @@ -44,6 +51,21 @@ func (t TLSInfo) AuthType() string { return "tls" } +// ValidateAuthority validates the provided authority being used to override the +// :authority header by verifying it against the peer certificates. It returns a +// non-nil error if the validation fails. +func (t TLSInfo) ValidateAuthority(authority string) error { + var errs []error + for _, cert := range t.State.PeerCertificates { + var err error + if err = cert.VerifyHostname(authority); err == nil { + return nil + } + errs = append(errs, err) + } + return fmt.Errorf("credentials: invalid authority %q: %v", authority, errors.Join(errs...)) +} + // cipherSuiteLookup returns the string version of a TLS cipher suite ID. func cipherSuiteLookup(cipherSuiteID uint16) string { for _, s := range tls.CipherSuites() { @@ -88,14 +110,14 @@ func (c tlsCreds) Info() ProtocolInfo { func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) { // use local cfg to avoid clobbering ServerName if using multiple endpoints cfg := credinternal.CloneTLSConfig(c.config) - if cfg.ServerName == "" { - serverName, _, err := net.SplitHostPort(authority) - if err != nil { - // If the authority had no host port or if the authority cannot be parsed, use it as-is. - serverName = authority - } - cfg.ServerName = serverName + + serverName, _, err := net.SplitHostPort(authority) + if err != nil { + // If the authority had no host port or if the authority cannot be parsed, use it as-is. + serverName = authority } + cfg.ServerName = serverName + conn := tls.Client(rawConn, cfg) errChannel := make(chan error, 1) go func() { @@ -112,6 +134,22 @@ func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawCon conn.Close() return nil, nil, ctx.Err() } + + // The negotiated protocol can be either of the following: + // 1. h2: When the server supports ALPN. Only HTTP/2 can be negotiated since + // it is the only protocol advertised by the client during the handshake. + // The tls library ensures that the server chooses a protocol advertised + // by the client. + // 2. "" (empty string): If the server doesn't support ALPN. ALPN is a requirement + // for using HTTP/2 over TLS. We can terminate the connection immediately. + np := conn.ConnectionState().NegotiatedProtocol + if np == "" { + if envconfig.EnforceALPNEnabled { + conn.Close() + return nil, nil, fmt.Errorf("credentials: cannot check peer: missing selected ALPN property. %s", alpnFailureHelpMessage) + } + logger.Warningf("Allowing TLS connection to server %q with ALPN disabled. TLS connections to servers with ALPN disabled will be disallowed in future grpc-go releases", cfg.ServerName) + } tlsInfo := TLSInfo{ State: conn.ConnectionState(), CommonAuthInfo: CommonAuthInfo{ @@ -131,8 +169,20 @@ func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) conn.Close() return nil, nil, err } + cs := conn.ConnectionState() + // The negotiated application protocol can be empty only if the client doesn't + // support ALPN. In such cases, we can close the connection since ALPN is required + // for using HTTP/2 over TLS. + if cs.NegotiatedProtocol == "" { + if envconfig.EnforceALPNEnabled { + conn.Close() + return nil, nil, fmt.Errorf("credentials: cannot check peer: missing selected ALPN property. %s", alpnFailureHelpMessage) + } else if logger.V(2) { + logger.Info("Allowing TLS connection from client with ALPN disabled. TLS connections with ALPN disabled will be disallowed in future grpc-go releases") + } + } tlsInfo := TLSInfo{ - State: conn.ConnectionState(), + State: cs, CommonAuthInfo: CommonAuthInfo{ SecurityLevel: PrivacyAndIntegrity, }, @@ -168,25 +218,40 @@ var tls12ForbiddenCipherSuites = map[uint16]struct{}{ // NewTLS uses c to construct a TransportCredentials based on TLS. func NewTLS(c *tls.Config) TransportCredentials { - tc := &tlsCreds{credinternal.CloneTLSConfig(c)} - tc.config.NextProtos = credinternal.AppendH2ToNextProtos(tc.config.NextProtos) + config := applyDefaults(c) + if config.GetConfigForClient != nil { + oldFn := config.GetConfigForClient + config.GetConfigForClient = func(hello *tls.ClientHelloInfo) (*tls.Config, error) { + cfgForClient, err := oldFn(hello) + if err != nil || cfgForClient == nil { + return cfgForClient, err + } + return applyDefaults(cfgForClient), nil + } + } + return &tlsCreds{config: config} +} + +func applyDefaults(c *tls.Config) *tls.Config { + config := credinternal.CloneTLSConfig(c) + config.NextProtos = credinternal.AppendH2ToNextProtos(config.NextProtos) // If the user did not configure a MinVersion and did not configure a // MaxVersion < 1.2, use MinVersion=1.2, which is required by // https://datatracker.ietf.org/doc/html/rfc7540#section-9.2 - if tc.config.MinVersion == 0 && (tc.config.MaxVersion == 0 || tc.config.MaxVersion >= tls.VersionTLS12) { - tc.config.MinVersion = tls.VersionTLS12 + if config.MinVersion == 0 && (config.MaxVersion == 0 || config.MaxVersion >= tls.VersionTLS12) { + config.MinVersion = tls.VersionTLS12 } // If the user did not configure CipherSuites, use all "secure" cipher // suites reported by the TLS package, but remove some explicitly forbidden // by https://datatracker.ietf.org/doc/html/rfc7540#appendix-A - if tc.config.CipherSuites == nil { + if config.CipherSuites == nil { for _, cs := range tls.CipherSuites() { if _, ok := tls12ForbiddenCipherSuites[cs.ID]; !ok { - tc.config.CipherSuites = append(tc.config.CipherSuites, cs.ID) + config.CipherSuites = append(config.CipherSuites, cs.ID) } } } - return tc + return config } // NewClientTLSFromCert constructs TLS credentials from the provided root @@ -194,9 +259,11 @@ func NewTLS(c *tls.Config) TransportCredentials { // certificates to establish the identity of the client need to be included in // the credentials (eg: for mTLS), use NewTLS instead, where a complete // tls.Config can be specified. -// serverNameOverride is for testing only. If set to a non empty string, -// it will override the virtual host name of authority (e.g. :authority header -// field) in requests. +// +// serverNameOverride is for testing only. If set to a non empty string, it will +// override the virtual host name of authority (e.g. :authority header field) in +// requests. Users should use grpc.WithAuthority passed to grpc.NewClient to +// override the authority of the client instead. func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials { return NewTLS(&tls.Config{ServerName: serverNameOverride, RootCAs: cp}) } @@ -206,9 +273,11 @@ func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) Transpor // certificates to establish the identity of the client need to be included in // the credentials (eg: for mTLS), use NewTLS instead, where a complete // tls.Config can be specified. -// serverNameOverride is for testing only. If set to a non empty string, -// it will override the virtual host name of authority (e.g. :authority header -// field) in requests. +// +// serverNameOverride is for testing only. If set to a non empty string, it will +// override the virtual host name of authority (e.g. :authority header field) in +// requests. Users should use grpc.WithAuthority passed to grpc.NewClient to +// override the authority of the client instead. func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { b, err := os.ReadFile(certFile) if err != nil { diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 402493224e..7a5ac2e7c4 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -21,6 +21,7 @@ package grpc import ( "context" "net" + "net/url" "time" "google.golang.org/grpc/backoff" @@ -32,10 +33,16 @@ import ( "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/resolver" "google.golang.org/grpc/stats" ) +const ( + // https://github.com/grpc/proposal/blob/master/A6-client-retries.md#limits-on-retries-and-hedges + defaultMaxCallAttempts = 5 +) + func init() { internal.AddGlobalDialOptions = func(opt ...DialOption) { globalDialOptions = append(globalDialOptions, opt...) @@ -43,10 +50,18 @@ func init() { internal.ClearGlobalDialOptions = func() { globalDialOptions = nil } + internal.AddGlobalPerTargetDialOptions = func(opt any) { + if ptdo, ok := opt.(perTargetDialOption); ok { + globalPerTargetDialOptions = append(globalPerTargetDialOptions, ptdo) + } + } + internal.ClearGlobalPerTargetDialOptions = func() { + globalPerTargetDialOptions = nil + } internal.WithBinaryLogger = withBinaryLogger internal.JoinDialOptions = newJoinDialOption internal.DisableGlobalDialOptions = newDisableGlobalDialOptions - internal.WithRecvBufferPool = withRecvBufferPool + internal.WithBufferPool = withBufferPool } // dialOptions configure a Dial call. dialOptions are set by the DialOption @@ -58,7 +73,7 @@ type dialOptions struct { chainUnaryInts []UnaryClientInterceptor chainStreamInts []StreamClientInterceptor - cp Compressor + compressorV0 Compressor dc Decompressor bs internalbackoff.Strategy block bool @@ -72,14 +87,15 @@ type dialOptions struct { disableServiceConfig bool disableRetry bool disableHealthCheck bool - healthCheckFunc internal.HealthChecker minConnectTimeout func() time.Duration defaultServiceConfig *ServiceConfig // defaultServiceConfig is parsed from defaultServiceConfigRawJSON. defaultServiceConfigRawJSON *string resolvers []resolver.Builder idleTimeout time.Duration - recvBufferPool SharedBufferPool defaultScheme string + maxCallAttempts int + enableLocalDNSResolution bool // Specifies if target hostnames should be resolved when proxying is enabled. + useProxy bool // Specifies if a server should be connected via proxy. } // DialOption configures how we set up the connection. @@ -89,6 +105,19 @@ type DialOption interface { var globalDialOptions []DialOption +// perTargetDialOption takes a parsed target and returns a dial option to apply. +// +// This gets called after NewClient() parses the target, and allows per target +// configuration set through a returned DialOption. The DialOption will not take +// effect if specifies a resolver builder, as that Dial Option is factored in +// while parsing target. +type perTargetDialOption interface { + // DialOption returns a Dial Option to apply. + DialOptionForTarget(parsedTarget url.URL) DialOption +} + +var globalPerTargetDialOptions []perTargetDialOption + // EmptyDialOption does not alter the dial configuration. It can be embedded in // another structure to build custom dial options. // @@ -184,6 +213,7 @@ func WithReadBufferSize(s int) DialOption { func WithInitialWindowSize(s int32) DialOption { return newFuncDialOption(func(o *dialOptions) { o.copts.InitialWindowSize = s + o.copts.StaticWindowSize = true }) } @@ -193,6 +223,26 @@ func WithInitialWindowSize(s int32) DialOption { func WithInitialConnWindowSize(s int32) DialOption { return newFuncDialOption(func(o *dialOptions) { o.copts.InitialConnWindowSize = s + o.copts.StaticWindowSize = true + }) +} + +// WithStaticStreamWindowSize returns a DialOption which sets the initial +// stream window size to the value provided and disables dynamic flow control. +func WithStaticStreamWindowSize(s int32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.InitialWindowSize = s + o.copts.StaticWindowSize = true + }) +} + +// WithStaticConnWindowSize returns a DialOption which sets the initial +// connection window size to the value provided and disables dynamic flow +// control. +func WithStaticConnWindowSize(s int32) DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.copts.InitialConnWindowSize = s + o.copts.StaticWindowSize = true }) } @@ -229,7 +279,7 @@ func WithCodec(c Codec) DialOption { // Deprecated: use UseCompressor instead. Will be supported throughout 1.x. func WithCompressor(cp Compressor) DialOption { return newFuncDialOption(func(o *dialOptions) { - o.cp = cp + o.compressorV0 = cp }) } @@ -300,6 +350,9 @@ func withBackoff(bs internalbackoff.Strategy) DialOption { // // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md +// +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithBlock() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -314,10 +367,8 @@ func WithBlock() DialOption { // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md // -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithReturnConnectionError() DialOption { return newFuncDialOption(func(o *dialOptions) { o.block = true @@ -330,7 +381,7 @@ func WithReturnConnectionError() DialOption { // // Note that using this DialOption with per-RPC credentials (through // WithCredentialsBundle or WithPerRPCCredentials) which require transport -// security is incompatible and will cause grpc.Dial() to fail. +// security is incompatible and will cause RPCs to fail. // // Deprecated: use WithTransportCredentials and insecure.NewCredentials() // instead. Will be supported throughout 1.x. @@ -349,7 +400,22 @@ func WithInsecure() DialOption { // later release. func WithNoProxy() DialOption { return newFuncDialOption(func(o *dialOptions) { - o.copts.UseProxy = false + o.useProxy = false + }) +} + +// WithLocalDNSResolution forces local DNS name resolution even when a proxy is +// specified in the environment. By default, the server name is provided +// directly to the proxy as part of the CONNECT handshake. This is ignored if +// WithNoProxy is used. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func WithLocalDNSResolution() DialOption { + return newFuncDialOption(func(o *dialOptions) { + o.enableLocalDNSResolution = true }) } @@ -387,8 +453,8 @@ func WithCredentialsBundle(b credentials.Bundle) DialOption { // WithTimeout returns a DialOption that configures a timeout for dialing a // ClientConn initially. This is valid if and only if WithBlock() is present. // -// Deprecated: use DialContext instead of Dial and context.WithTimeout -// instead. Will be supported throughout 1.x. +// Deprecated: this DialOption is not supported by NewClient. +// Will be supported throughout 1.x. func WithTimeout(d time.Duration) DialOption { return newFuncDialOption(func(o *dialOptions) { o.timeout = d @@ -400,6 +466,11 @@ func WithTimeout(d time.Duration) DialOption { // returned by f, gRPC checks the error's Temporary() method to decide if it // should try to reconnect to the network address. // +// Note that gRPC by default performs name resolution on the target passed to +// NewClient. To bypass name resolution and cause the target string to be +// passed directly to the dialer here instead, use the "passthrough" resolver +// by specifying it in the target string, e.g. "passthrough:target". +// // Note: All supported releases of Go (as of December 2023) override the OS // defaults for TCP keepalive time and interval to 15s. To enable TCP keepalive // with OS defaults for keepalive time and interval, use a net.Dialer that sets @@ -407,7 +478,7 @@ func WithTimeout(d time.Duration) DialOption { // option to true from the Control field. For a concrete example of how to do // this, see internal.NetDialerWithTCPKeepalive(). // -// For more information, please see [issue 23459] in the Go github repo. +// For more information, please see [issue 23459] in the Go GitHub repo. // // [issue 23459]: https://github.com/golang/go/issues/23459 func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOption { @@ -416,10 +487,6 @@ func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOp }) } -func init() { - internal.WithHealthCheckFunc = withHealthCheckFunc -} - // WithDialer returns a DialOption that specifies a function to use for dialing // network addresses. If FailOnNonTempDialError() is set to true, and an error // is returned by f, gRPC checks the error's Temporary() method to decide if it @@ -470,9 +537,8 @@ func withBinaryLogger(bl binarylog.Logger) DialOption { // Use of this feature is not recommended. For more information, please see: // https://github.com/grpc/grpc-go/blob/master/Documentation/anti-patterns.md // -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// Deprecated: this DialOption is not supported by NewClient. +// This API may be changed or removed in a // later release. func FailOnNonTempDialError(f bool) DialOption { return newFuncDialOption(func(o *dialOptions) { @@ -490,6 +556,8 @@ func WithUserAgent(s string) DialOption { // WithKeepaliveParams returns a DialOption that specifies keepalive parameters // for the client transport. +// +// Keepalive is disabled by default. func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption { if kp.Time < internal.KeepaliveMinPingTime { logger.Warningf("Adjusting keepalive ping interval to minimum period of %v", internal.KeepaliveMinPingTime) @@ -540,6 +608,8 @@ func WithChainStreamInterceptor(interceptors ...StreamClientInterceptor) DialOpt // WithAuthority returns a DialOption that specifies the value to be used as the // :authority pseudo-header and as the server name in authentication handshake. +// This overrides all other ways of setting authority on the channel, but can be +// overridden per-call by using grpc.CallAuthority. func WithAuthority(a string) DialOption { return newFuncDialOption(func(o *dialOptions) { o.authority = a @@ -601,12 +671,22 @@ func WithDisableRetry() DialOption { }) } +// MaxHeaderListSizeDialOption is a DialOption that specifies the maximum +// (uncompressed) size of header list that the client is prepared to accept. +type MaxHeaderListSizeDialOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeDialOption) apply(do *dialOptions) { + do.copts.MaxHeaderListSize = &o.MaxHeaderListSize +} + // WithMaxHeaderListSize returns a DialOption that specifies the maximum // (uncompressed) size of header list that the client is prepared to accept. func WithMaxHeaderListSize(s uint32) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.copts.MaxHeaderListSize = &s - }) + return MaxHeaderListSizeDialOption{ + MaxHeaderListSize: s, + } } // WithDisableHealthCheck disables the LB channel health checking for all @@ -622,33 +702,24 @@ func WithDisableHealthCheck() DialOption { }) } -// withHealthCheckFunc replaces the default health check function with the -// provided one. It makes tests easier to change the health check function. -// -// For testing purpose only. -func withHealthCheckFunc(f internal.HealthChecker) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.healthCheckFunc = f - }) -} - func defaultDialOptions() dialOptions { return dialOptions{ copts: transport.ConnectOptions{ ReadBufferSize: defaultReadBufSize, WriteBufferSize: defaultWriteBufSize, - UseProxy: true, UserAgent: grpcUA, + BufferPool: mem.DefaultBufferPool(), }, - bs: internalbackoff.DefaultExponential, - healthCheckFunc: internal.HealthCheckFunc, - idleTimeout: 30 * time.Minute, - recvBufferPool: nopBufferPool{}, - defaultScheme: "dns", + bs: internalbackoff.DefaultExponential, + idleTimeout: 30 * time.Minute, + defaultScheme: "dns", + maxCallAttempts: defaultMaxCallAttempts, + useProxy: true, + enableLocalDNSResolution: false, } } -// withGetMinConnectDeadline specifies the function that clientconn uses to +// withMinConnectDeadline specifies the function that clientconn uses to // get minConnectDeadline. This can be used to make connection attempts happen // faster/slower. // @@ -702,25 +773,25 @@ func WithIdleTimeout(d time.Duration) DialOption { }) } -// WithRecvBufferPool returns a DialOption that configures the ClientConn -// to use the provided shared buffer pool for parsing incoming messages. Depending -// on the application's workload, this could result in reduced memory allocation. -// -// If you are unsure about how to implement a memory pool but want to utilize one, -// begin with grpc.NewSharedBufferPool. -// -// Note: The shared buffer pool feature will not be active if any of the following -// options are used: WithStatsHandler, EnableTracing, or binary logging. In such -// cases, the shared buffer pool will be ignored. +// WithMaxCallAttempts returns a DialOption that configures the maximum number +// of attempts per call (including retries and hedging) using the channel. +// Service owners may specify a higher value for these parameters, but higher +// values will be treated as equal to the maximum value by the client +// implementation. This mitigates security concerns related to the service +// config being transferred to the client via DNS. // -// Deprecated: use experimental.WithRecvBufferPool instead. Will be deleted in -// v1.60.0 or later. -func WithRecvBufferPool(bufferPool SharedBufferPool) DialOption { - return withRecvBufferPool(bufferPool) +// A value of 5 will be used if this dial option is not set or n < 2. +func WithMaxCallAttempts(n int) DialOption { + return newFuncDialOption(func(o *dialOptions) { + if n < 2 { + n = defaultMaxCallAttempts + } + o.maxCallAttempts = n + }) } -func withRecvBufferPool(bufferPool SharedBufferPool) DialOption { +func withBufferPool(bufferPool mem.BufferPool) DialOption { return newFuncDialOption(func(o *dialOptions) { - o.recvBufferPool = bufferPool + o.copts.BufferPool = bufferPool }) } diff --git a/vendor/google.golang.org/grpc/doc.go b/vendor/google.golang.org/grpc/doc.go index 0022859ad7..e7b532b6f8 100644 --- a/vendor/google.golang.org/grpc/doc.go +++ b/vendor/google.golang.org/grpc/doc.go @@ -16,7 +16,7 @@ * */ -//go:generate ./regenerate.sh +//go:generate ./scripts/regenerate.sh /* Package grpc implements an RPC system called gRPC. diff --git a/vendor/google.golang.org/grpc/encoding/encoding.go b/vendor/google.golang.org/grpc/encoding/encoding.go index 5ebf88d714..11d0ae142c 100644 --- a/vendor/google.golang.org/grpc/encoding/encoding.go +++ b/vendor/google.golang.org/grpc/encoding/encoding.go @@ -94,7 +94,7 @@ type Codec interface { Name() string } -var registeredCodecs = make(map[string]Codec) +var registeredCodecs = make(map[string]any) // RegisterCodec registers the provided Codec for use with all gRPC clients and // servers. @@ -126,5 +126,6 @@ func RegisterCodec(codec Codec) { // // The content-subtype is expected to be lowercase. func GetCodec(contentSubtype string) Codec { - return registeredCodecs[contentSubtype] + c, _ := registeredCodecs[contentSubtype].(Codec) + return c } diff --git a/vendor/google.golang.org/grpc/encoding/encoding_v2.go b/vendor/google.golang.org/grpc/encoding/encoding_v2.go new file mode 100644 index 0000000000..074c5e234a --- /dev/null +++ b/vendor/google.golang.org/grpc/encoding/encoding_v2.go @@ -0,0 +1,81 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package encoding + +import ( + "strings" + + "google.golang.org/grpc/mem" +) + +// CodecV2 defines the interface gRPC uses to encode and decode messages. Note +// that implementations of this interface must be thread safe; a CodecV2's +// methods can be called from concurrent goroutines. +type CodecV2 interface { + // Marshal returns the wire format of v. The buffers in the returned + // [mem.BufferSlice] must have at least one reference each, which will be freed + // by gRPC when they are no longer needed. + Marshal(v any) (out mem.BufferSlice, err error) + // Unmarshal parses the wire format into v. Note that data will be freed as soon + // as this function returns. If the codec wishes to guarantee access to the data + // after this function, it must take its own reference that it frees when it is + // no longer needed. + Unmarshal(data mem.BufferSlice, v any) error + // Name returns the name of the Codec implementation. The returned string + // will be used as part of content type in transmission. The result must be + // static; the result cannot change between calls. + Name() string +} + +// RegisterCodecV2 registers the provided CodecV2 for use with all gRPC clients and +// servers. +// +// The CodecV2 will be stored and looked up by result of its Name() method, which +// should match the content-subtype of the encoding handled by the CodecV2. This +// is case-insensitive, and is stored and looked up as lowercase. If the +// result of calling Name() is an empty string, RegisterCodecV2 will panic. See +// Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +// +// If both a Codec and CodecV2 are registered with the same name, the CodecV2 +// will be used. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple Codecs are +// registered with the same name, the one registered last will take effect. +func RegisterCodecV2(codec CodecV2) { + if codec == nil { + panic("cannot register a nil CodecV2") + } + if codec.Name() == "" { + panic("cannot register CodecV2 with empty string result for Name()") + } + contentSubtype := strings.ToLower(codec.Name()) + registeredCodecs[contentSubtype] = codec +} + +// GetCodecV2 gets a registered CodecV2 by content-subtype, or nil if no CodecV2 is +// registered for the content-subtype. +// +// The content-subtype is expected to be lowercase. +func GetCodecV2(contentSubtype string) CodecV2 { + c, _ := registeredCodecs[contentSubtype].(CodecV2) + return c +} diff --git a/vendor/google.golang.org/grpc/encoding/proto/proto.go b/vendor/google.golang.org/grpc/encoding/proto/proto.go index 66d5cdf03e..1ab874c7ad 100644 --- a/vendor/google.golang.org/grpc/encoding/proto/proto.go +++ b/vendor/google.golang.org/grpc/encoding/proto/proto.go @@ -1,6 +1,6 @@ /* * - * Copyright 2018 gRPC authors. + * Copyright 2024 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import ( "fmt" "google.golang.org/grpc/encoding" + "google.golang.org/grpc/mem" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/protoadapt" ) @@ -32,28 +33,67 @@ import ( const Name = "proto" func init() { - encoding.RegisterCodec(codec{}) + encoding.RegisterCodecV2(&codecV2{}) } -// codec is a Codec implementation with protobuf. It is the default codec for gRPC. -type codec struct{} +// codec is a CodecV2 implementation with protobuf. It is the default codec for +// gRPC. +type codecV2 struct{} -func (codec) Marshal(v any) ([]byte, error) { +func (c *codecV2) Marshal(v any) (data mem.BufferSlice, err error) { vv := messageV2Of(v) if vv == nil { - return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) + return nil, fmt.Errorf("proto: failed to marshal, message is %T, want proto.Message", v) } - return proto.Marshal(vv) + // Important: if we remove this Size call then we cannot use + // UseCachedSize in MarshalOptions below. + size := proto.Size(vv) + + // MarshalOptions with UseCachedSize allows reusing the result from the + // previous Size call. This is safe here because: + // + // 1. We just computed the size. + // 2. We assume the message is not being mutated concurrently. + // + // Important: If the proto.Size call above is removed, using UseCachedSize + // becomes unsafe and may lead to incorrect marshaling. + // + // For more details, see the doc of UseCachedSize: + // https://pkg.go.dev/google.golang.org/protobuf/proto#MarshalOptions + marshalOptions := proto.MarshalOptions{UseCachedSize: true} + + if mem.IsBelowBufferPoolingThreshold(size) { + buf, err := marshalOptions.Marshal(vv) + if err != nil { + return nil, err + } + data = append(data, mem.SliceBuffer(buf)) + } else { + pool := mem.DefaultBufferPool() + buf := pool.Get(size) + if _, err := marshalOptions.MarshalAppend((*buf)[:0], vv); err != nil { + pool.Put(buf) + return nil, err + } + data = append(data, mem.NewBuffer(buf, pool)) + } + + return data, nil } -func (codec) Unmarshal(data []byte, v any) error { +func (c *codecV2) Unmarshal(data mem.BufferSlice, v any) (err error) { vv := messageV2Of(v) if vv == nil { return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v) } - return proto.Unmarshal(data, vv) + buf := data.MaterializeToBuffer(mem.DefaultBufferPool()) + defer buf.Free() + // TODO: Upgrade proto.Unmarshal to support mem.BufferSlice. Right now, it's not + // really possible without a major overhaul of the proto package, but the + // vtprotobuf library may be able to support this. + return proto.Unmarshal(buf.ReadOnlyData(), vv) } func messageV2Of(v any) proto.Message { @@ -67,6 +107,6 @@ func messageV2Of(v any) proto.Message { return nil } -func (codec) Name() string { +func (c *codecV2) Name() string { return Name } diff --git a/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go b/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go new file mode 100644 index 0000000000..ad75313a18 --- /dev/null +++ b/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go @@ -0,0 +1,270 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package stats + +import ( + "maps" + + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/stats" +) + +func init() { + internal.SnapshotMetricRegistryForTesting = snapshotMetricsRegistryForTesting +} + +var logger = grpclog.Component("metrics-registry") + +// DefaultMetrics are the default metrics registered through global metrics +// registry. This is written to at initialization time only, and is read only +// after initialization. +var DefaultMetrics = stats.NewMetricSet() + +// MetricDescriptor is the data for a registered metric. +type MetricDescriptor struct { + // The name of this metric. This name must be unique across the whole binary + // (including any per call metrics). See + // https://github.com/grpc/proposal/blob/master/A79-non-per-call-metrics-architecture.md#metric-instrument-naming-conventions + // for metric naming conventions. + Name string + // The description of this metric. + Description string + // The unit (e.g. entries, seconds) of this metric. + Unit string + // The required label keys for this metric. These are intended to + // metrics emitted from a stats handler. + Labels []string + // The optional label keys for this metric. These are intended to attached + // to metrics emitted from a stats handler if configured. + OptionalLabels []string + // Whether this metric is on by default. + Default bool + // The type of metric. This is set by the metric registry, and not intended + // to be set by a component registering a metric. + Type MetricType + // Bounds are the bounds of this metric. This only applies to histogram + // metrics. If unset or set with length 0, stats handlers will fall back to + // default bounds. + Bounds []float64 +} + +// MetricType is the type of metric. +type MetricType int + +// Type of metric supported by this instrument registry. +const ( + MetricTypeIntCount MetricType = iota + MetricTypeFloatCount + MetricTypeIntHisto + MetricTypeFloatHisto + MetricTypeIntGauge +) + +// Int64CountHandle is a typed handle for a int count metric. This handle +// is passed at the recording point in order to know which metric to record +// on. +type Int64CountHandle MetricDescriptor + +// Descriptor returns the int64 count handle typecast to a pointer to a +// MetricDescriptor. +func (h *Int64CountHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the int64 count value on the metrics recorder provided. +func (h *Int64CountHandle) Record(recorder MetricsRecorder, incr int64, labels ...string) { + recorder.RecordInt64Count(h, incr, labels...) +} + +// Float64CountHandle is a typed handle for a float count metric. This handle is +// passed at the recording point in order to know which metric to record on. +type Float64CountHandle MetricDescriptor + +// Descriptor returns the float64 count handle typecast to a pointer to a +// MetricDescriptor. +func (h *Float64CountHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the float64 count value on the metrics recorder provided. +func (h *Float64CountHandle) Record(recorder MetricsRecorder, incr float64, labels ...string) { + recorder.RecordFloat64Count(h, incr, labels...) +} + +// Int64HistoHandle is a typed handle for an int histogram metric. This handle +// is passed at the recording point in order to know which metric to record on. +type Int64HistoHandle MetricDescriptor + +// Descriptor returns the int64 histo handle typecast to a pointer to a +// MetricDescriptor. +func (h *Int64HistoHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the int64 histo value on the metrics recorder provided. +func (h *Int64HistoHandle) Record(recorder MetricsRecorder, incr int64, labels ...string) { + recorder.RecordInt64Histo(h, incr, labels...) +} + +// Float64HistoHandle is a typed handle for a float histogram metric. This +// handle is passed at the recording point in order to know which metric to +// record on. +type Float64HistoHandle MetricDescriptor + +// Descriptor returns the float64 histo handle typecast to a pointer to a +// MetricDescriptor. +func (h *Float64HistoHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the float64 histo value on the metrics recorder provided. +func (h *Float64HistoHandle) Record(recorder MetricsRecorder, incr float64, labels ...string) { + recorder.RecordFloat64Histo(h, incr, labels...) +} + +// Int64GaugeHandle is a typed handle for an int gauge metric. This handle is +// passed at the recording point in order to know which metric to record on. +type Int64GaugeHandle MetricDescriptor + +// Descriptor returns the int64 gauge handle typecast to a pointer to a +// MetricDescriptor. +func (h *Int64GaugeHandle) Descriptor() *MetricDescriptor { + return (*MetricDescriptor)(h) +} + +// Record records the int64 histo value on the metrics recorder provided. +func (h *Int64GaugeHandle) Record(recorder MetricsRecorder, incr int64, labels ...string) { + recorder.RecordInt64Gauge(h, incr, labels...) +} + +// registeredMetrics are the registered metric descriptor names. +var registeredMetrics = make(map[string]bool) + +// metricsRegistry contains all of the registered metrics. +// +// This is written to only at init time, and read only after that. +var metricsRegistry = make(map[string]*MetricDescriptor) + +// DescriptorForMetric returns the MetricDescriptor from the global registry. +// +// Returns nil if MetricDescriptor not present. +func DescriptorForMetric(metricName string) *MetricDescriptor { + return metricsRegistry[metricName] +} + +func registerMetric(metricName string, def bool) { + if registeredMetrics[metricName] { + logger.Fatalf("metric %v already registered", metricName) + } + registeredMetrics[metricName] = true + if def { + DefaultMetrics = DefaultMetrics.Add(metricName) + } +} + +// RegisterInt64Count registers the metric description onto the global registry. +// It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterInt64Count(descriptor MetricDescriptor) *Int64CountHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeIntCount + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Int64CountHandle)(descPtr) +} + +// RegisterFloat64Count registers the metric description onto the global +// registry. It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterFloat64Count(descriptor MetricDescriptor) *Float64CountHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeFloatCount + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Float64CountHandle)(descPtr) +} + +// RegisterInt64Histo registers the metric description onto the global registry. +// It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterInt64Histo(descriptor MetricDescriptor) *Int64HistoHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeIntHisto + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Int64HistoHandle)(descPtr) +} + +// RegisterFloat64Histo registers the metric description onto the global +// registry. It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterFloat64Histo(descriptor MetricDescriptor) *Float64HistoHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeFloatHisto + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Float64HistoHandle)(descPtr) +} + +// RegisterInt64Gauge registers the metric description onto the global registry. +// It returns a typed handle to use to recording data. +// +// NOTE: this function must only be called during initialization time (i.e. in +// an init() function), and is not thread-safe. If multiple metrics are +// registered with the same name, this function will panic. +func RegisterInt64Gauge(descriptor MetricDescriptor) *Int64GaugeHandle { + registerMetric(descriptor.Name, descriptor.Default) + descriptor.Type = MetricTypeIntGauge + descPtr := &descriptor + metricsRegistry[descriptor.Name] = descPtr + return (*Int64GaugeHandle)(descPtr) +} + +// snapshotMetricsRegistryForTesting snapshots the global data of the metrics +// registry. Returns a cleanup function that sets the metrics registry to its +// original state. +func snapshotMetricsRegistryForTesting() func() { + oldDefaultMetrics := DefaultMetrics + oldRegisteredMetrics := registeredMetrics + oldMetricsRegistry := metricsRegistry + + registeredMetrics = make(map[string]bool) + metricsRegistry = make(map[string]*MetricDescriptor) + maps.Copy(registeredMetrics, registeredMetrics) + maps.Copy(metricsRegistry, metricsRegistry) + + return func() { + DefaultMetrics = oldDefaultMetrics + registeredMetrics = oldRegisteredMetrics + metricsRegistry = oldMetricsRegistry + } +} diff --git a/vendor/google.golang.org/grpc/experimental/stats/metrics.go b/vendor/google.golang.org/grpc/experimental/stats/metrics.go new file mode 100644 index 0000000000..ee1423605a --- /dev/null +++ b/vendor/google.golang.org/grpc/experimental/stats/metrics.go @@ -0,0 +1,54 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package stats contains experimental metrics/stats API's. +package stats + +import "google.golang.org/grpc/stats" + +// MetricsRecorder records on metrics derived from metric registry. +type MetricsRecorder interface { + // RecordInt64Count records the measurement alongside labels on the int + // count associated with the provided handle. + RecordInt64Count(handle *Int64CountHandle, incr int64, labels ...string) + // RecordFloat64Count records the measurement alongside labels on the float + // count associated with the provided handle. + RecordFloat64Count(handle *Float64CountHandle, incr float64, labels ...string) + // RecordInt64Histo records the measurement alongside labels on the int + // histo associated with the provided handle. + RecordInt64Histo(handle *Int64HistoHandle, incr int64, labels ...string) + // RecordFloat64Histo records the measurement alongside labels on the float + // histo associated with the provided handle. + RecordFloat64Histo(handle *Float64HistoHandle, incr float64, labels ...string) + // RecordInt64Gauge records the measurement alongside labels on the int + // gauge associated with the provided handle. + RecordInt64Gauge(handle *Int64GaugeHandle, incr int64, labels ...string) +} + +// Metrics is an experimental legacy alias of the now-stable stats.MetricSet. +// Metrics will be deleted in a future release. +type Metrics = stats.MetricSet + +// Metric was replaced by direct usage of strings. +type Metric = string + +// NewMetrics is an experimental legacy alias of the now-stable +// stats.NewMetricSet. NewMetrics will be deleted in a future release. +func NewMetrics(metrics ...Metric) *Metrics { + return stats.NewMetricSet(metrics...) +} diff --git a/vendor/google.golang.org/grpc/grpclog/component.go b/vendor/google.golang.org/grpc/grpclog/component.go index ac73c9ced2..f1ae080dcb 100644 --- a/vendor/google.golang.org/grpc/grpclog/component.go +++ b/vendor/google.golang.org/grpc/grpclog/component.go @@ -20,8 +20,6 @@ package grpclog import ( "fmt" - - "google.golang.org/grpc/internal/grpclog" ) // componentData records the settings for a component. @@ -33,22 +31,22 @@ var cache = map[string]*componentData{} func (c *componentData) InfoDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.InfoDepth(depth+1, args...) + InfoDepth(depth+1, args...) } func (c *componentData) WarningDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.WarningDepth(depth+1, args...) + WarningDepth(depth+1, args...) } func (c *componentData) ErrorDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.ErrorDepth(depth+1, args...) + ErrorDepth(depth+1, args...) } func (c *componentData) FatalDepth(depth int, args ...any) { args = append([]any{"[" + string(c.name) + "]"}, args...) - grpclog.FatalDepth(depth+1, args...) + FatalDepth(depth+1, args...) } func (c *componentData) Info(args ...any) { diff --git a/vendor/google.golang.org/grpc/grpclog/grpclog.go b/vendor/google.golang.org/grpc/grpclog/grpclog.go index 16928c9cb9..db320105e6 100644 --- a/vendor/google.golang.org/grpc/grpclog/grpclog.go +++ b/vendor/google.golang.org/grpc/grpclog/grpclog.go @@ -18,18 +18,15 @@ // Package grpclog defines logging for grpc. // -// All logs in transport and grpclb packages only go to verbose level 2. -// All logs in other packages in grpc are logged in spite of the verbosity level. -// -// In the default logger, -// severity level can be set by environment variable GRPC_GO_LOG_SEVERITY_LEVEL, -// verbosity level can be set by GRPC_GO_LOG_VERBOSITY_LEVEL. -package grpclog // import "google.golang.org/grpc/grpclog" +// In the default logger, severity level can be set by environment variable +// GRPC_GO_LOG_SEVERITY_LEVEL, verbosity level can be set by +// GRPC_GO_LOG_VERBOSITY_LEVEL. +package grpclog import ( "os" - "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/grpclog/internal" ) func init() { @@ -38,58 +35,58 @@ func init() { // V reports whether verbosity level l is at least the requested verbose level. func V(l int) bool { - return grpclog.Logger.V(l) + return internal.LoggerV2Impl.V(l) } // Info logs to the INFO log. func Info(args ...any) { - grpclog.Logger.Info(args...) + internal.LoggerV2Impl.Info(args...) } // Infof logs to the INFO log. Arguments are handled in the manner of fmt.Printf. func Infof(format string, args ...any) { - grpclog.Logger.Infof(format, args...) + internal.LoggerV2Impl.Infof(format, args...) } // Infoln logs to the INFO log. Arguments are handled in the manner of fmt.Println. func Infoln(args ...any) { - grpclog.Logger.Infoln(args...) + internal.LoggerV2Impl.Infoln(args...) } // Warning logs to the WARNING log. func Warning(args ...any) { - grpclog.Logger.Warning(args...) + internal.LoggerV2Impl.Warning(args...) } // Warningf logs to the WARNING log. Arguments are handled in the manner of fmt.Printf. func Warningf(format string, args ...any) { - grpclog.Logger.Warningf(format, args...) + internal.LoggerV2Impl.Warningf(format, args...) } // Warningln logs to the WARNING log. Arguments are handled in the manner of fmt.Println. func Warningln(args ...any) { - grpclog.Logger.Warningln(args...) + internal.LoggerV2Impl.Warningln(args...) } // Error logs to the ERROR log. func Error(args ...any) { - grpclog.Logger.Error(args...) + internal.LoggerV2Impl.Error(args...) } // Errorf logs to the ERROR log. Arguments are handled in the manner of fmt.Printf. func Errorf(format string, args ...any) { - grpclog.Logger.Errorf(format, args...) + internal.LoggerV2Impl.Errorf(format, args...) } // Errorln logs to the ERROR log. Arguments are handled in the manner of fmt.Println. func Errorln(args ...any) { - grpclog.Logger.Errorln(args...) + internal.LoggerV2Impl.Errorln(args...) } // Fatal logs to the FATAL log. Arguments are handled in the manner of fmt.Print. // It calls os.Exit() with exit code 1. func Fatal(args ...any) { - grpclog.Logger.Fatal(args...) + internal.LoggerV2Impl.Fatal(args...) // Make sure fatal logs will exit. os.Exit(1) } @@ -97,15 +94,15 @@ func Fatal(args ...any) { // Fatalf logs to the FATAL log. Arguments are handled in the manner of fmt.Printf. // It calls os.Exit() with exit code 1. func Fatalf(format string, args ...any) { - grpclog.Logger.Fatalf(format, args...) + internal.LoggerV2Impl.Fatalf(format, args...) // Make sure fatal logs will exit. os.Exit(1) } // Fatalln logs to the FATAL log. Arguments are handled in the manner of fmt.Println. -// It calle os.Exit()) with exit code 1. +// It calls os.Exit() with exit code 1. func Fatalln(args ...any) { - grpclog.Logger.Fatalln(args...) + internal.LoggerV2Impl.Fatalln(args...) // Make sure fatal logs will exit. os.Exit(1) } @@ -114,19 +111,76 @@ func Fatalln(args ...any) { // // Deprecated: use Info. func Print(args ...any) { - grpclog.Logger.Info(args...) + internal.LoggerV2Impl.Info(args...) } // Printf prints to the logger. Arguments are handled in the manner of fmt.Printf. // // Deprecated: use Infof. func Printf(format string, args ...any) { - grpclog.Logger.Infof(format, args...) + internal.LoggerV2Impl.Infof(format, args...) } // Println prints to the logger. Arguments are handled in the manner of fmt.Println. // // Deprecated: use Infoln. func Println(args ...any) { - grpclog.Logger.Infoln(args...) + internal.LoggerV2Impl.Infoln(args...) +} + +// InfoDepth logs to the INFO log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func InfoDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.InfoDepth(depth, args...) + } else { + internal.LoggerV2Impl.Infoln(args...) + } +} + +// WarningDepth logs to the WARNING log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func WarningDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.WarningDepth(depth, args...) + } else { + internal.LoggerV2Impl.Warningln(args...) + } +} + +// ErrorDepth logs to the ERROR log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func ErrorDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.ErrorDepth(depth, args...) + } else { + internal.LoggerV2Impl.Errorln(args...) + } +} + +// FatalDepth logs to the FATAL log at the specified depth. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func FatalDepth(depth int, args ...any) { + if internal.DepthLoggerV2Impl != nil { + internal.DepthLoggerV2Impl.FatalDepth(depth, args...) + } else { + internal.LoggerV2Impl.Fatalln(args...) + } + os.Exit(1) } diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go b/vendor/google.golang.org/grpc/grpclog/internal/grpclog.go similarity index 63% rename from vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go rename to vendor/google.golang.org/grpc/grpclog/internal/grpclog.go index 6635f7bca9..59c03bc14c 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/oncefunc.go +++ b/vendor/google.golang.org/grpc/grpclog/internal/grpclog.go @@ -1,6 +1,6 @@ /* * - * Copyright 2022 gRPC authors. + * Copyright 2024 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +16,11 @@ * */ -package grpcsync +// Package internal contains functionality internal to the grpclog package. +package internal -import ( - "sync" -) +// LoggerV2Impl is the logger used for the non-depth log functions. +var LoggerV2Impl LoggerV2 -// OnceFunc returns a function wrapping f which ensures f is only executed -// once even if the returned function is executed multiple times. -func OnceFunc(f func()) func() { - var once sync.Once - return func() { - once.Do(f) - } -} +// DepthLoggerV2Impl is the logger used for the depth log functions. +var DepthLoggerV2Impl DepthLoggerV2 diff --git a/vendor/google.golang.org/grpc/grpclog/internal/logger.go b/vendor/google.golang.org/grpc/grpclog/internal/logger.go new file mode 100644 index 0000000000..e524fdd40b --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/internal/logger.go @@ -0,0 +1,87 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package internal + +// Logger mimics golang's standard Logger as an interface. +// +// Deprecated: use LoggerV2. +type Logger interface { + Fatal(args ...any) + Fatalf(format string, args ...any) + Fatalln(args ...any) + Print(args ...any) + Printf(format string, args ...any) + Println(args ...any) +} + +// LoggerWrapper wraps Logger into a LoggerV2. +type LoggerWrapper struct { + Logger +} + +// Info logs to INFO log. Arguments are handled in the manner of fmt.Print. +func (l *LoggerWrapper) Info(args ...any) { + l.Logger.Print(args...) +} + +// Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. +func (l *LoggerWrapper) Infoln(args ...any) { + l.Logger.Println(args...) +} + +// Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. +func (l *LoggerWrapper) Infof(format string, args ...any) { + l.Logger.Printf(format, args...) +} + +// Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. +func (l *LoggerWrapper) Warning(args ...any) { + l.Logger.Print(args...) +} + +// Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. +func (l *LoggerWrapper) Warningln(args ...any) { + l.Logger.Println(args...) +} + +// Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. +func (l *LoggerWrapper) Warningf(format string, args ...any) { + l.Logger.Printf(format, args...) +} + +// Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. +func (l *LoggerWrapper) Error(args ...any) { + l.Logger.Print(args...) +} + +// Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. +func (l *LoggerWrapper) Errorln(args ...any) { + l.Logger.Println(args...) +} + +// Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. +func (l *LoggerWrapper) Errorf(format string, args ...any) { + l.Logger.Printf(format, args...) +} + +// V reports whether verbosity level l is at least the requested verbose level. +func (*LoggerWrapper) V(int) bool { + // Returns true for all verbose level. + return true +} diff --git a/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go new file mode 100644 index 0000000000..ed90060c3c --- /dev/null +++ b/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go @@ -0,0 +1,267 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package internal + +import ( + "encoding/json" + "fmt" + "io" + "log" + "os" +) + +// LoggerV2 does underlying logging work for grpclog. +type LoggerV2 interface { + // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. + Info(args ...any) + // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. + Infoln(args ...any) + // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. + Infof(format string, args ...any) + // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. + Warning(args ...any) + // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. + Warningln(args ...any) + // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. + Warningf(format string, args ...any) + // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. + Error(args ...any) + // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + Errorln(args ...any) + // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + Errorf(format string, args ...any) + // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatal(args ...any) + // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalln(args ...any) + // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. + // gRPC ensures that all Fatal logs will exit with os.Exit(1). + // Implementations may also call os.Exit() with a non-zero exit code. + Fatalf(format string, args ...any) + // V reports whether verbosity level l is at least the requested verbose level. + V(l int) bool +} + +// DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements +// DepthLoggerV2, the below functions will be called with the appropriate stack +// depth set for trivial functions the logger may ignore. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a +// later release. +type DepthLoggerV2 interface { + LoggerV2 + // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. + InfoDepth(depth int, args ...any) + // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. + WarningDepth(depth int, args ...any) + // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. + ErrorDepth(depth int, args ...any) + // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. + FatalDepth(depth int, args ...any) +} + +const ( + // infoLog indicates Info severity. + infoLog int = iota + // warningLog indicates Warning severity. + warningLog + // errorLog indicates Error severity. + errorLog + // fatalLog indicates Fatal severity. + fatalLog +) + +// severityName contains the string representation of each severity. +var severityName = []string{ + infoLog: "INFO", + warningLog: "WARNING", + errorLog: "ERROR", + fatalLog: "FATAL", +} + +// sprintf is fmt.Sprintf. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprintf = fmt.Sprintf + +// sprint is fmt.Sprint. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprint = fmt.Sprint + +// sprintln is fmt.Sprintln. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprintln = fmt.Sprintln + +// exit is os.Exit. +// This var exists to make it possible to test functions calling os.Exit. +var exit = os.Exit + +// loggerT is the default logger used by grpclog. +type loggerT struct { + m []*log.Logger + v int + jsonFormat bool +} + +func (g *loggerT) output(severity int, s string) { + sevStr := severityName[severity] + if !g.jsonFormat { + g.m[severity].Output(2, sevStr+": "+s) + return + } + // TODO: we can also include the logging component, but that needs more + // (API) changes. + b, _ := json.Marshal(map[string]string{ + "severity": sevStr, + "message": s, + }) + g.m[severity].Output(2, string(b)) +} + +func (g *loggerT) printf(severity int, format string, args ...any) { + // Note the discard check is duplicated in each print func, rather than in + // output, to avoid the expensive Sprint calls. + // De-duplicating this by moving to output would be a significant performance regression! + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprintf(format, args...)) +} + +func (g *loggerT) print(severity int, v ...any) { + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprint(v...)) +} + +func (g *loggerT) println(severity int, v ...any) { + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprintln(v...)) +} + +func (g *loggerT) Info(args ...any) { + g.print(infoLog, args...) +} + +func (g *loggerT) Infoln(args ...any) { + g.println(infoLog, args...) +} + +func (g *loggerT) Infof(format string, args ...any) { + g.printf(infoLog, format, args...) +} + +func (g *loggerT) Warning(args ...any) { + g.print(warningLog, args...) +} + +func (g *loggerT) Warningln(args ...any) { + g.println(warningLog, args...) +} + +func (g *loggerT) Warningf(format string, args ...any) { + g.printf(warningLog, format, args...) +} + +func (g *loggerT) Error(args ...any) { + g.print(errorLog, args...) +} + +func (g *loggerT) Errorln(args ...any) { + g.println(errorLog, args...) +} + +func (g *loggerT) Errorf(format string, args ...any) { + g.printf(errorLog, format, args...) +} + +func (g *loggerT) Fatal(args ...any) { + g.print(fatalLog, args...) + exit(1) +} + +func (g *loggerT) Fatalln(args ...any) { + g.println(fatalLog, args...) + exit(1) +} + +func (g *loggerT) Fatalf(format string, args ...any) { + g.printf(fatalLog, format, args...) + exit(1) +} + +func (g *loggerT) V(l int) bool { + return l <= g.v +} + +// LoggerV2Config configures the LoggerV2 implementation. +type LoggerV2Config struct { + // Verbosity sets the verbosity level of the logger. + Verbosity int + // FormatJSON controls whether the logger should output logs in JSON format. + FormatJSON bool +} + +// combineLoggers returns a combined logger for both higher & lower severity logs, +// or only one if the other is io.Discard. +// +// This uses io.Discard instead of io.MultiWriter when all loggers +// are set to io.Discard. Both this package and the standard log package have +// significant optimizations for io.Discard, which io.MultiWriter lacks (as of +// this writing). +func combineLoggers(lower, higher io.Writer) io.Writer { + if lower == io.Discard { + return higher + } + if higher == io.Discard { + return lower + } + return io.MultiWriter(lower, higher) +} + +// NewLoggerV2 creates a new LoggerV2 instance with the provided configuration. +// The infoW, warningW, and errorW writers are used to write log messages of +// different severity levels. +func NewLoggerV2(infoW, warningW, errorW io.Writer, c LoggerV2Config) LoggerV2 { + flag := log.LstdFlags + if c.FormatJSON { + flag = 0 + } + + warningW = combineLoggers(infoW, warningW) + errorW = combineLoggers(errorW, warningW) + + fatalW := errorW + + m := []*log.Logger{ + log.New(infoW, "", flag), + log.New(warningW, "", flag), + log.New(errorW, "", flag), + log.New(fatalW, "", flag), + } + return &loggerT{m: m, v: c.Verbosity, jsonFormat: c.FormatJSON} +} diff --git a/vendor/google.golang.org/grpc/grpclog/logger.go b/vendor/google.golang.org/grpc/grpclog/logger.go index b1674d8267..4b20358570 100644 --- a/vendor/google.golang.org/grpc/grpclog/logger.go +++ b/vendor/google.golang.org/grpc/grpclog/logger.go @@ -18,70 +18,17 @@ package grpclog -import "google.golang.org/grpc/internal/grpclog" +import "google.golang.org/grpc/grpclog/internal" // Logger mimics golang's standard Logger as an interface. // // Deprecated: use LoggerV2. -type Logger interface { - Fatal(args ...any) - Fatalf(format string, args ...any) - Fatalln(args ...any) - Print(args ...any) - Printf(format string, args ...any) - Println(args ...any) -} +type Logger internal.Logger // SetLogger sets the logger that is used in grpc. Call only from // init() functions. // // Deprecated: use SetLoggerV2. func SetLogger(l Logger) { - grpclog.Logger = &loggerWrapper{Logger: l} -} - -// loggerWrapper wraps Logger into a LoggerV2. -type loggerWrapper struct { - Logger -} - -func (g *loggerWrapper) Info(args ...any) { - g.Logger.Print(args...) -} - -func (g *loggerWrapper) Infoln(args ...any) { - g.Logger.Println(args...) -} - -func (g *loggerWrapper) Infof(format string, args ...any) { - g.Logger.Printf(format, args...) -} - -func (g *loggerWrapper) Warning(args ...any) { - g.Logger.Print(args...) -} - -func (g *loggerWrapper) Warningln(args ...any) { - g.Logger.Println(args...) -} - -func (g *loggerWrapper) Warningf(format string, args ...any) { - g.Logger.Printf(format, args...) -} - -func (g *loggerWrapper) Error(args ...any) { - g.Logger.Print(args...) -} - -func (g *loggerWrapper) Errorln(args ...any) { - g.Logger.Println(args...) -} - -func (g *loggerWrapper) Errorf(format string, args ...any) { - g.Logger.Printf(format, args...) -} - -func (g *loggerWrapper) V(l int) bool { - // Returns true for all verbose level. - return true + internal.LoggerV2Impl = &internal.LoggerWrapper{Logger: l} } diff --git a/vendor/google.golang.org/grpc/grpclog/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/loggerv2.go index ecfd36d713..892dc13d16 100644 --- a/vendor/google.golang.org/grpc/grpclog/loggerv2.go +++ b/vendor/google.golang.org/grpc/grpclog/loggerv2.go @@ -19,52 +19,16 @@ package grpclog import ( - "encoding/json" - "fmt" "io" - "log" "os" "strconv" "strings" - "google.golang.org/grpc/internal/grpclog" + "google.golang.org/grpc/grpclog/internal" ) // LoggerV2 does underlying logging work for grpclog. -type LoggerV2 interface { - // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. - Info(args ...any) - // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. - Infoln(args ...any) - // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. - Infof(format string, args ...any) - // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. - Warning(args ...any) - // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. - Warningln(args ...any) - // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. - Warningf(format string, args ...any) - // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. - Error(args ...any) - // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - Errorln(args ...any) - // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - Errorf(format string, args ...any) - // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatal(args ...any) - // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalln(args ...any) - // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalf(format string, args ...any) - // V reports whether verbosity level l is at least the requested verbose level. - V(l int) bool -} +type LoggerV2 internal.LoggerV2 // SetLoggerV2 sets logger that is used in grpc to a V2 logger. // Not mutex-protected, should be called before any gRPC functions. @@ -72,34 +36,8 @@ func SetLoggerV2(l LoggerV2) { if _, ok := l.(*componentData); ok { panic("cannot use component logger as grpclog logger") } - grpclog.Logger = l - grpclog.DepthLogger, _ = l.(grpclog.DepthLoggerV2) -} - -const ( - // infoLog indicates Info severity. - infoLog int = iota - // warningLog indicates Warning severity. - warningLog - // errorLog indicates Error severity. - errorLog - // fatalLog indicates Fatal severity. - fatalLog -) - -// severityName contains the string representation of each severity. -var severityName = []string{ - infoLog: "INFO", - warningLog: "WARNING", - errorLog: "ERROR", - fatalLog: "FATAL", -} - -// loggerT is the default logger used by grpclog. -type loggerT struct { - m []*log.Logger - v int - jsonFormat bool + internal.LoggerV2Impl = l + internal.DepthLoggerV2Impl, _ = l.(internal.DepthLoggerV2) } // NewLoggerV2 creates a loggerV2 with the provided writers. @@ -108,32 +46,13 @@ type loggerT struct { // Warning logs will be written to warningW and infoW. // Info logs will be written to infoW. func NewLoggerV2(infoW, warningW, errorW io.Writer) LoggerV2 { - return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{}) + return internal.NewLoggerV2(infoW, warningW, errorW, internal.LoggerV2Config{}) } // NewLoggerV2WithVerbosity creates a loggerV2 with the provided writers and // verbosity level. func NewLoggerV2WithVerbosity(infoW, warningW, errorW io.Writer, v int) LoggerV2 { - return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{verbose: v}) -} - -type loggerV2Config struct { - verbose int - jsonFormat bool -} - -func newLoggerV2WithConfig(infoW, warningW, errorW io.Writer, c loggerV2Config) LoggerV2 { - var m []*log.Logger - flag := log.LstdFlags - if c.jsonFormat { - flag = 0 - } - m = append(m, log.New(infoW, "", flag)) - m = append(m, log.New(io.MultiWriter(infoW, warningW), "", flag)) - ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal. - m = append(m, log.New(ew, "", flag)) - m = append(m, log.New(ew, "", flag)) - return &loggerT{m: m, v: c.verbose, jsonFormat: c.jsonFormat} + return internal.NewLoggerV2(infoW, warningW, errorW, internal.LoggerV2Config{Verbosity: v}) } // newLoggerV2 creates a loggerV2 to be used as default logger. @@ -161,80 +80,10 @@ func newLoggerV2() LoggerV2 { jsonFormat := strings.EqualFold(os.Getenv("GRPC_GO_LOG_FORMATTER"), "json") - return newLoggerV2WithConfig(infoW, warningW, errorW, loggerV2Config{ - verbose: v, - jsonFormat: jsonFormat, - }) -} - -func (g *loggerT) output(severity int, s string) { - sevStr := severityName[severity] - if !g.jsonFormat { - g.m[severity].Output(2, fmt.Sprintf("%v: %v", sevStr, s)) - return - } - // TODO: we can also include the logging component, but that needs more - // (API) changes. - b, _ := json.Marshal(map[string]string{ - "severity": sevStr, - "message": s, + return internal.NewLoggerV2(infoW, warningW, errorW, internal.LoggerV2Config{ + Verbosity: v, + FormatJSON: jsonFormat, }) - g.m[severity].Output(2, string(b)) -} - -func (g *loggerT) Info(args ...any) { - g.output(infoLog, fmt.Sprint(args...)) -} - -func (g *loggerT) Infoln(args ...any) { - g.output(infoLog, fmt.Sprintln(args...)) -} - -func (g *loggerT) Infof(format string, args ...any) { - g.output(infoLog, fmt.Sprintf(format, args...)) -} - -func (g *loggerT) Warning(args ...any) { - g.output(warningLog, fmt.Sprint(args...)) -} - -func (g *loggerT) Warningln(args ...any) { - g.output(warningLog, fmt.Sprintln(args...)) -} - -func (g *loggerT) Warningf(format string, args ...any) { - g.output(warningLog, fmt.Sprintf(format, args...)) -} - -func (g *loggerT) Error(args ...any) { - g.output(errorLog, fmt.Sprint(args...)) -} - -func (g *loggerT) Errorln(args ...any) { - g.output(errorLog, fmt.Sprintln(args...)) -} - -func (g *loggerT) Errorf(format string, args ...any) { - g.output(errorLog, fmt.Sprintf(format, args...)) -} - -func (g *loggerT) Fatal(args ...any) { - g.output(fatalLog, fmt.Sprint(args...)) - os.Exit(1) -} - -func (g *loggerT) Fatalln(args ...any) { - g.output(fatalLog, fmt.Sprintln(args...)) - os.Exit(1) -} - -func (g *loggerT) Fatalf(format string, args ...any) { - g.output(fatalLog, fmt.Sprintf(format, args...)) - os.Exit(1) -} - -func (g *loggerT) V(l int) bool { - return l <= g.v } // DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements @@ -245,14 +94,4 @@ func (g *loggerT) V(l int) bool { // // Notice: This type is EXPERIMENTAL and may be changed or removed in a // later release. -type DepthLoggerV2 interface { - LoggerV2 - // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. - InfoDepth(depth int, args ...any) - // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. - WarningDepth(depth int, args ...any) - // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. - ErrorDepth(depth int, args ...any) - // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. - FatalDepth(depth int, args ...any) -} +type DepthLoggerV2 internal.DepthLoggerV2 diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go index 5bf880d419..22d263fb94 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/health/v1/health.proto package grpc_health_v1 @@ -28,6 +28,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -90,20 +91,17 @@ func (HealthCheckResponse_ServingStatus) EnumDescriptor() ([]byte, []int) { } type HealthCheckRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` unknownFields protoimpl.UnknownFields - - Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` + sizeCache protoimpl.SizeCache } func (x *HealthCheckRequest) Reset() { *x = HealthCheckRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_health_v1_health_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_health_v1_health_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HealthCheckRequest) String() string { @@ -114,7 +112,7 @@ func (*HealthCheckRequest) ProtoMessage() {} func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_health_v1_health_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -137,20 +135,17 @@ func (x *HealthCheckRequest) GetService() string { } type HealthCheckResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"` unknownFields protoimpl.UnknownFields - - Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=grpc.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"` + sizeCache protoimpl.SizeCache } func (x *HealthCheckResponse) Reset() { *x = HealthCheckResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_health_v1_health_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_health_v1_health_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HealthCheckResponse) String() string { @@ -161,7 +156,7 @@ func (*HealthCheckResponse) ProtoMessage() {} func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_health_v1_health_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -183,76 +178,150 @@ func (x *HealthCheckResponse) GetStatus() HealthCheckResponse_ServingStatus { return HealthCheckResponse_UNKNOWN } -var File_grpc_health_v1_health_proto protoreflect.FileDescriptor +type HealthListRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HealthListRequest) Reset() { + *x = HealthListRequest{} + mi := &file_grpc_health_v1_health_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HealthListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthListRequest) ProtoMessage() {} + +func (x *HealthListRequest) ProtoReflect() protoreflect.Message { + mi := &file_grpc_health_v1_health_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HealthListRequest.ProtoReflect.Descriptor instead. +func (*HealthListRequest) Descriptor() ([]byte, []int) { + return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{2} +} -var file_grpc_health_v1_health_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x76, 0x31, - 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x22, 0x2e, 0x0a, - 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb1, 0x01, - 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x4f, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x03, 0x32, 0xae, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x50, 0x0a, 0x05, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, - 0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x30, 0x01, 0x42, 0x61, 0x0a, 0x11, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x68, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, - 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x5f, 0x76, 0x31, 0xaa, 0x02, 0x0e, 0x47, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x2e, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +type HealthListResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // statuses contains all the services and their respective status. + Statuses map[string]*HealthCheckResponse `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } +func (x *HealthListResponse) Reset() { + *x = HealthListResponse{} + mi := &file_grpc_health_v1_health_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HealthListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HealthListResponse) ProtoMessage() {} + +func (x *HealthListResponse) ProtoReflect() protoreflect.Message { + mi := &file_grpc_health_v1_health_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HealthListResponse.ProtoReflect.Descriptor instead. +func (*HealthListResponse) Descriptor() ([]byte, []int) { + return file_grpc_health_v1_health_proto_rawDescGZIP(), []int{3} +} + +func (x *HealthListResponse) GetStatuses() map[string]*HealthCheckResponse { + if x != nil { + return x.Statuses + } + return nil +} + +var File_grpc_health_v1_health_proto protoreflect.FileDescriptor + +const file_grpc_health_v1_health_proto_rawDesc = "" + + "\n" + + "\x1bgrpc/health/v1/health.proto\x12\x0egrpc.health.v1\".\n" + + "\x12HealthCheckRequest\x12\x18\n" + + "\aservice\x18\x01 \x01(\tR\aservice\"\xb1\x01\n" + + "\x13HealthCheckResponse\x12I\n" + + "\x06status\x18\x01 \x01(\x0e21.grpc.health.v1.HealthCheckResponse.ServingStatusR\x06status\"O\n" + + "\rServingStatus\x12\v\n" + + "\aUNKNOWN\x10\x00\x12\v\n" + + "\aSERVING\x10\x01\x12\x0f\n" + + "\vNOT_SERVING\x10\x02\x12\x13\n" + + "\x0fSERVICE_UNKNOWN\x10\x03\"\x13\n" + + "\x11HealthListRequest\"\xc4\x01\n" + + "\x12HealthListResponse\x12L\n" + + "\bstatuses\x18\x01 \x03(\v20.grpc.health.v1.HealthListResponse.StatusesEntryR\bstatuses\x1a`\n" + + "\rStatusesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x129\n" + + "\x05value\x18\x02 \x01(\v2#.grpc.health.v1.HealthCheckResponseR\x05value:\x028\x012\xfd\x01\n" + + "\x06Health\x12P\n" + + "\x05Check\x12\".grpc.health.v1.HealthCheckRequest\x1a#.grpc.health.v1.HealthCheckResponse\x12M\n" + + "\x04List\x12!.grpc.health.v1.HealthListRequest\x1a\".grpc.health.v1.HealthListResponse\x12R\n" + + "\x05Watch\x12\".grpc.health.v1.HealthCheckRequest\x1a#.grpc.health.v1.HealthCheckResponse0\x01Bp\n" + + "\x11io.grpc.health.v1B\vHealthProtoP\x01Z,google.golang.org/grpc/health/grpc_health_v1\xa2\x02\fGrpcHealthV1\xaa\x02\x0eGrpc.Health.V1b\x06proto3" + var ( file_grpc_health_v1_health_proto_rawDescOnce sync.Once - file_grpc_health_v1_health_proto_rawDescData = file_grpc_health_v1_health_proto_rawDesc + file_grpc_health_v1_health_proto_rawDescData []byte ) func file_grpc_health_v1_health_proto_rawDescGZIP() []byte { file_grpc_health_v1_health_proto_rawDescOnce.Do(func() { - file_grpc_health_v1_health_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_health_v1_health_proto_rawDescData) + file_grpc_health_v1_health_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_health_v1_health_proto_rawDesc), len(file_grpc_health_v1_health_proto_rawDesc))) }) return file_grpc_health_v1_health_proto_rawDescData } var file_grpc_health_v1_health_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_grpc_health_v1_health_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_grpc_health_v1_health_proto_goTypes = []interface{}{ +var file_grpc_health_v1_health_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_grpc_health_v1_health_proto_goTypes = []any{ (HealthCheckResponse_ServingStatus)(0), // 0: grpc.health.v1.HealthCheckResponse.ServingStatus (*HealthCheckRequest)(nil), // 1: grpc.health.v1.HealthCheckRequest (*HealthCheckResponse)(nil), // 2: grpc.health.v1.HealthCheckResponse + (*HealthListRequest)(nil), // 3: grpc.health.v1.HealthListRequest + (*HealthListResponse)(nil), // 4: grpc.health.v1.HealthListResponse + nil, // 5: grpc.health.v1.HealthListResponse.StatusesEntry } var file_grpc_health_v1_health_proto_depIdxs = []int32{ 0, // 0: grpc.health.v1.HealthCheckResponse.status:type_name -> grpc.health.v1.HealthCheckResponse.ServingStatus - 1, // 1: grpc.health.v1.Health.Check:input_type -> grpc.health.v1.HealthCheckRequest - 1, // 2: grpc.health.v1.Health.Watch:input_type -> grpc.health.v1.HealthCheckRequest - 2, // 3: grpc.health.v1.Health.Check:output_type -> grpc.health.v1.HealthCheckResponse - 2, // 4: grpc.health.v1.Health.Watch:output_type -> grpc.health.v1.HealthCheckResponse - 3, // [3:5] is the sub-list for method output_type - 1, // [1:3] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 5, // 1: grpc.health.v1.HealthListResponse.statuses:type_name -> grpc.health.v1.HealthListResponse.StatusesEntry + 2, // 2: grpc.health.v1.HealthListResponse.StatusesEntry.value:type_name -> grpc.health.v1.HealthCheckResponse + 1, // 3: grpc.health.v1.Health.Check:input_type -> grpc.health.v1.HealthCheckRequest + 3, // 4: grpc.health.v1.Health.List:input_type -> grpc.health.v1.HealthListRequest + 1, // 5: grpc.health.v1.Health.Watch:input_type -> grpc.health.v1.HealthCheckRequest + 2, // 6: grpc.health.v1.Health.Check:output_type -> grpc.health.v1.HealthCheckResponse + 4, // 7: grpc.health.v1.Health.List:output_type -> grpc.health.v1.HealthListResponse + 2, // 8: grpc.health.v1.Health.Watch:output_type -> grpc.health.v1.HealthCheckResponse + 6, // [6:9] is the sub-list for method output_type + 3, // [3:6] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_grpc_health_v1_health_proto_init() } @@ -260,39 +329,13 @@ func file_grpc_health_v1_health_proto_init() { if File_grpc_health_v1_health_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_health_v1_health_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_health_v1_health_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_health_v1_health_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_health_v1_health_proto_rawDesc), len(file_grpc_health_v1_health_proto_rawDesc)), NumEnums: 1, - NumMessages: 2, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, @@ -302,7 +345,6 @@ func file_grpc_health_v1_health_proto_init() { MessageInfos: file_grpc_health_v1_health_proto_msgTypes, }.Build() File_grpc_health_v1_health_proto = out.File - file_grpc_health_v1_health_proto_rawDesc = nil file_grpc_health_v1_health_proto_goTypes = nil file_grpc_health_v1_health_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go index 4c46c098dc..f2c01f296a 100644 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go +++ b/vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // source: grpc/health/v1/health.proto package grpc_health_v1 @@ -32,17 +32,22 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Health_Check_FullMethodName = "/grpc.health.v1.Health/Check" + Health_List_FullMethodName = "/grpc.health.v1.Health/List" Health_Watch_FullMethodName = "/grpc.health.v1.Health/Watch" ) // HealthClient is the client API for Health service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// Health is gRPC's mechanism for checking whether a server is able to handle +// RPCs. Its semantics are documented in +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md. type HealthClient interface { // Check gets the health of the specified service. If the requested service // is unknown, the call will fail with status NOT_FOUND. If the caller does @@ -51,9 +56,19 @@ type HealthClient interface { // // Clients should set a deadline when calling Check, and can declare the // server unhealthy if they do not receive a timely response. - // - // Check implementations should be idempotent and side effect free. Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) + // List provides a non-atomic snapshot of the health of all the available + // services. + // + // The server may respond with a RESOURCE_EXHAUSTED error if too many services + // exist. + // + // Clients should set a deadline when calling List, and can declare the server + // unhealthy if they do not receive a timely response. + // + // Clients should keep in mind that the list of health services exposed by an + // application can change over the lifetime of the process. + List(ctx context.Context, in *HealthListRequest, opts ...grpc.CallOption) (*HealthListResponse, error) // Performs a watch for the serving status of the requested service. // The server will immediately send back a message indicating the current // serving status. It will then subsequently send a new message whenever @@ -69,7 +84,7 @@ type HealthClient interface { // should assume this method is not supported and should not retry the // call. If the call terminates with any other status (including OK), // clients should retry the call with appropriate exponential backoff. - Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) + Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[HealthCheckResponse], error) } type healthClient struct { @@ -81,20 +96,32 @@ func NewHealthClient(cc grpc.ClientConnInterface) HealthClient { } func (c *healthClient) Check(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthCheckResponse) - err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Health_Check_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *healthClient) List(ctx context.Context, in *HealthListRequest, opts ...grpc.CallOption) (*HealthListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(HealthListResponse) + err := c.cc.Invoke(ctx, Health_List_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (Health_WatchClient, error) { - stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, opts...) +func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[HealthCheckResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Health_ServiceDesc.Streams[0], Health_Watch_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &healthWatchClient{stream} + x := &grpc.GenericClientStream[HealthCheckRequest, HealthCheckResponse]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -104,26 +131,16 @@ func (c *healthClient) Watch(ctx context.Context, in *HealthCheckRequest, opts . return x, nil } -type Health_WatchClient interface { - Recv() (*HealthCheckResponse, error) - grpc.ClientStream -} - -type healthWatchClient struct { - grpc.ClientStream -} - -func (x *healthWatchClient) Recv() (*HealthCheckResponse, error) { - m := new(HealthCheckResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Health_WatchClient = grpc.ServerStreamingClient[HealthCheckResponse] // HealthServer is the server API for Health service. // All implementations should embed UnimplementedHealthServer -// for forward compatibility +// for forward compatibility. +// +// Health is gRPC's mechanism for checking whether a server is able to handle +// RPCs. Its semantics are documented in +// https://github.com/grpc/grpc/blob/master/doc/health-checking.md. type HealthServer interface { // Check gets the health of the specified service. If the requested service // is unknown, the call will fail with status NOT_FOUND. If the caller does @@ -132,9 +149,19 @@ type HealthServer interface { // // Clients should set a deadline when calling Check, and can declare the // server unhealthy if they do not receive a timely response. - // - // Check implementations should be idempotent and side effect free. Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) + // List provides a non-atomic snapshot of the health of all the available + // services. + // + // The server may respond with a RESOURCE_EXHAUSTED error if too many services + // exist. + // + // Clients should set a deadline when calling List, and can declare the server + // unhealthy if they do not receive a timely response. + // + // Clients should keep in mind that the list of health services exposed by an + // application can change over the lifetime of the process. + List(context.Context, *HealthListRequest) (*HealthListResponse, error) // Performs a watch for the serving status of the requested service. // The server will immediately send back a message indicating the current // serving status. It will then subsequently send a new message whenever @@ -150,19 +177,26 @@ type HealthServer interface { // should assume this method is not supported and should not retry the // call. If the call terminates with any other status (including OK), // clients should retry the call with appropriate exponential backoff. - Watch(*HealthCheckRequest, Health_WatchServer) error + Watch(*HealthCheckRequest, grpc.ServerStreamingServer[HealthCheckResponse]) error } -// UnimplementedHealthServer should be embedded to have forward compatible implementations. -type UnimplementedHealthServer struct { -} +// UnimplementedHealthServer should be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedHealthServer struct{} func (UnimplementedHealthServer) Check(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Check not implemented") + return nil, status.Error(codes.Unimplemented, "method Check not implemented") +} +func (UnimplementedHealthServer) List(context.Context, *HealthListRequest) (*HealthListResponse, error) { + return nil, status.Error(codes.Unimplemented, "method List not implemented") } -func (UnimplementedHealthServer) Watch(*HealthCheckRequest, Health_WatchServer) error { - return status.Errorf(codes.Unimplemented, "method Watch not implemented") +func (UnimplementedHealthServer) Watch(*HealthCheckRequest, grpc.ServerStreamingServer[HealthCheckResponse]) error { + return status.Error(codes.Unimplemented, "method Watch not implemented") } +func (UnimplementedHealthServer) testEmbeddedByValue() {} // UnsafeHealthServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to HealthServer will @@ -172,6 +206,13 @@ type UnsafeHealthServer interface { } func RegisterHealthServer(s grpc.ServiceRegistrar, srv HealthServer) { + // If the following call panics, it indicates UnimplementedHealthServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Health_ServiceDesc, srv) } @@ -193,26 +234,34 @@ func _Health_Check_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _Health_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HealthListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(HealthServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Health_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(HealthServer).List(ctx, req.(*HealthListRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Health_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(HealthCheckRequest) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(HealthServer).Watch(m, &healthWatchServer{stream}) + return srv.(HealthServer).Watch(m, &grpc.GenericServerStream[HealthCheckRequest, HealthCheckResponse]{ServerStream: stream}) } -type Health_WatchServer interface { - Send(*HealthCheckResponse) error - grpc.ServerStream -} - -type healthWatchServer struct { - grpc.ServerStream -} - -func (x *healthWatchServer) Send(m *HealthCheckResponse) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Health_WatchServer = grpc.ServerStreamingServer[HealthCheckResponse] // Health_ServiceDesc is the grpc.ServiceDesc for Health service. // It's only intended for direct use with grpc.RegisterService, @@ -225,6 +274,10 @@ var Health_ServiceDesc = grpc.ServiceDesc{ MethodName: "Check", Handler: _Health_Check_Handler, }, + { + MethodName: "List", + Handler: _Health_List_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/vendor/google.golang.org/grpc/internal/backoff/backoff.go b/vendor/google.golang.org/grpc/internal/backoff/backoff.go index fed1c011a3..b6ae7f2585 100644 --- a/vendor/google.golang.org/grpc/internal/backoff/backoff.go +++ b/vendor/google.golang.org/grpc/internal/backoff/backoff.go @@ -25,10 +25,10 @@ package backoff import ( "context" "errors" + rand "math/rand/v2" "time" grpcbackoff "google.golang.org/grpc/backoff" - "google.golang.org/grpc/internal/grpcrand" ) // Strategy defines the methodology for backing off after a grpc connection @@ -67,7 +67,7 @@ func (bc Exponential) Backoff(retries int) time.Duration { } // Randomize backoff delays so that if a cluster of requests start at // the same time, they won't operate in lockstep. - backoff *= 1 + bc.Config.Jitter*(grpcrand.Float64()*2-1) + backoff *= 1 + bc.Config.Jitter*(rand.Float64()*2-1) if backoff < 0 { return 0 } diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go index 6bf7f87396..85540f86a7 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/config.go @@ -33,6 +33,8 @@ type lbConfig struct { childConfig serviceconfig.LoadBalancingConfig } +// ChildName returns the name of the child balancer of the gracefulswitch +// Balancer. func ChildName(l serviceconfig.LoadBalancingConfig) string { return l.(*lbConfig).childBuilder.Name() } @@ -75,7 +77,6 @@ func ParseConfig(cfg json.RawMessage) (serviceconfig.LoadBalancingConfig, error) if err != nil { return nil, fmt.Errorf("error parsing config for policy %q: %v", name, err) } - return &lbConfig{childBuilder: builder, childConfig: cfg}, nil } diff --git a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go index 45d5e50ea9..ba25b89887 100644 --- a/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go +++ b/vendor/google.golang.org/grpc/internal/balancer/gracefulswitch/gracefulswitch.go @@ -109,8 +109,9 @@ func (gsb *Balancer) switchTo(builder balancer.Builder) (*balancerWrapper, error return nil, errBalancerClosed } bw := &balancerWrapper{ - builder: builder, - gsb: gsb, + ClientConn: gsb.cc, + builder: builder, + gsb: gsb, lastState: balancer.State{ ConnectivityState: connectivity.Connecting, Picker: base.NewErrPicker(balancer.ErrNoSubConnAvailable), @@ -169,7 +170,6 @@ func (gsb *Balancer) latestBalancer() *balancerWrapper { func (gsb *Balancer) UpdateClientConnState(state balancer.ClientConnState) error { // The resolver data is only relevant to the most recent LB Policy. balToUpdate := gsb.latestBalancer() - gsbCfg, ok := state.BalancerConfig.(*lbConfig) if ok { // Switch to the child in the config unless it is already active. @@ -223,15 +223,7 @@ func (gsb *Balancer) ExitIdle() { // There is no need to protect this read with a mutex, as the write to the // Balancer field happens in SwitchTo, which completes before this can be // called. - if ei, ok := balToUpdate.Balancer.(balancer.ExitIdler); ok { - ei.ExitIdle() - return - } - gsb.mu.Lock() - defer gsb.mu.Unlock() - for sc := range balToUpdate.subconns { - sc.Connect() - } + balToUpdate.ExitIdle() } // updateSubConnState forwards the update to the appropriate child. @@ -294,6 +286,7 @@ func (gsb *Balancer) Close() { // State updates from the wrapped balancer can result in invocation of the // graceful switch logic. type balancerWrapper struct { + balancer.ClientConn balancer.Balancer gsb *Balancer builder balancer.Builder @@ -414,7 +407,3 @@ func (bw *balancerWrapper) UpdateAddresses(sc balancer.SubConn, addrs []resolver bw.gsb.mu.Unlock() bw.gsb.cc.UpdateAddresses(sc, addrs) } - -func (bw *balancerWrapper) Target() string { - return bw.gsb.cc.Target() -} diff --git a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go index e8456a77c2..9669328914 100644 --- a/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go +++ b/vendor/google.golang.org/grpc/internal/binarylog/method_logger.go @@ -65,7 +65,7 @@ type TruncatingMethodLogger struct { callID uint64 idWithinCallGen *callIDGenerator - sink Sink // TODO(blog): make this plugable. + sink Sink // TODO(blog): make this pluggable. } // NewTruncatingMethodLogger returns a new truncating method logger. @@ -80,7 +80,7 @@ func NewTruncatingMethodLogger(h, m uint64) *TruncatingMethodLogger { callID: idGen.next(), idWithinCallGen: &callIDGenerator{}, - sink: DefaultSink, // TODO(blog): make it plugable. + sink: DefaultSink, // TODO(blog): make it pluggable. } } @@ -106,7 +106,7 @@ func (ml *TruncatingMethodLogger) Build(c LogEntryConfig) *binlogpb.GrpcLogEntry } // Log creates a proto binary log entry, and logs it to the sink. -func (ml *TruncatingMethodLogger) Log(ctx context.Context, c LogEntryConfig) { +func (ml *TruncatingMethodLogger) Log(_ context.Context, c LogEntryConfig) { ml.sink.Write(ml.Build(c)) } @@ -397,7 +397,7 @@ func metadataKeyOmit(key string) bool { switch key { case "lb-token", ":path", ":authority", "content-encoding", "content-type", "user-agent", "te": return true - case "grpc-trace-bin": // grpc-trace-bin is special because it's visiable to users. + case "grpc-trace-bin": // grpc-trace-bin is special because it's visible to users. return false } return strings.HasPrefix(key, "grpc-") diff --git a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go index 11f91668ac..467392b8d4 100644 --- a/vendor/google.golang.org/grpc/internal/buffer/unbounded.go +++ b/vendor/google.golang.org/grpc/internal/buffer/unbounded.go @@ -83,6 +83,7 @@ func (b *Unbounded) Load() { default: } } else if b.closing && !b.closed { + b.closed = true close(b.c) } } diff --git a/vendor/google.golang.org/grpc/internal/channelz/channel.go b/vendor/google.golang.org/grpc/internal/channelz/channel.go index d7e9e1d54e..3ec662799a 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/channel.go +++ b/vendor/google.golang.org/grpc/internal/channelz/channel.go @@ -43,6 +43,8 @@ type Channel struct { // Non-zero traceRefCount means the trace of this channel cannot be deleted. traceRefCount int32 + // ChannelMetrics holds connectivity state, target and call metrics for the + // channel within channelz. ChannelMetrics ChannelMetrics } @@ -50,6 +52,8 @@ type Channel struct { // nesting. func (c *Channel) channelzIdentifier() {} +// String returns a string representation of the Channel, including its parent +// entity and ID. func (c *Channel) String() string { if c.Parent == nil { return fmt.Sprintf("Channel #%d", c.ID) @@ -61,24 +65,31 @@ func (c *Channel) id() int64 { return c.ID } +// SubChans returns a copy of the map of sub-channels associated with the +// Channel. func (c *Channel) SubChans() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(c.subChans) } +// NestedChans returns a copy of the map of nested channels associated with the +// Channel. func (c *Channel) NestedChans() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(c.nestedChans) } +// Trace returns a copy of the Channel's trace data. func (c *Channel) Trace() *ChannelTrace { db.mu.RLock() defer db.mu.RUnlock() return c.trace.copy() } +// ChannelMetrics holds connectivity state, target and call metrics for the +// channel within channelz. type ChannelMetrics struct { // The current connectivity state of the channel. State atomic.Pointer[connectivity.State] @@ -136,12 +147,16 @@ func strFromPointer(s *string) string { return *s } +// String returns a string representation of the ChannelMetrics, including its +// state, target, and call metrics. func (c *ChannelMetrics) String() string { return fmt.Sprintf("State: %v, Target: %s, CallsStarted: %v, CallsSucceeded: %v, CallsFailed: %v, LastCallStartedTimestamp: %v", c.State.Load(), strFromPointer(c.Target.Load()), c.CallsStarted.Load(), c.CallsSucceeded.Load(), c.CallsFailed.Load(), c.LastCallStartedTimestamp.Load(), ) } +// NewChannelMetricForTesting creates a new instance of ChannelMetrics with +// specified initial values for testing purposes. func NewChannelMetricForTesting(state connectivity.State, target string, started, succeeded, failed, timestamp int64) *ChannelMetrics { c := &ChannelMetrics{} c.State.Store(&state) diff --git a/vendor/google.golang.org/grpc/internal/channelz/channelmap.go b/vendor/google.golang.org/grpc/internal/channelz/channelmap.go index dfe18b0892..64c791953d 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/channelmap.go +++ b/vendor/google.golang.org/grpc/internal/channelz/channelmap.go @@ -46,7 +46,7 @@ type entry interface { // channelMap is the storage data structure for channelz. // -// Methods of channelMap can be divided in two two categories with respect to +// Methods of channelMap can be divided into two categories with respect to // locking. // // 1. Methods acquire the global lock. @@ -234,13 +234,6 @@ func copyMap(m map[int64]string) map[int64]string { return n } -func min(a, b int) int { - if a < b { - return a - } - return b -} - func (c *channelMap) getTopChannels(id int64, maxResults int) ([]*Channel, bool) { if maxResults <= 0 { maxResults = EntriesPerPage diff --git a/vendor/google.golang.org/grpc/internal/channelz/funcs.go b/vendor/google.golang.org/grpc/internal/channelz/funcs.go index 03e24e1507..078bb81238 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/funcs.go +++ b/vendor/google.golang.org/grpc/internal/channelz/funcs.go @@ -33,7 +33,7 @@ var ( // outside this package except by tests. IDGen IDGenerator - db *channelMap = newChannelMap() + db = newChannelMap() // EntriesPerPage defines the number of channelz entries to be shown on a web page. EntriesPerPage = 50 curState int32 diff --git a/vendor/google.golang.org/grpc/internal/channelz/server.go b/vendor/google.golang.org/grpc/internal/channelz/server.go index cdfc49d6ea..b5a8249929 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/server.go +++ b/vendor/google.golang.org/grpc/internal/channelz/server.go @@ -59,6 +59,8 @@ func NewServerMetricsForTesting(started, succeeded, failed, timestamp int64) *Se return sm } +// CopyFrom copies the metrics data from the provided ServerMetrics +// instance into the current instance. func (sm *ServerMetrics) CopyFrom(o *ServerMetrics) { sm.CallsStarted.Store(o.CallsStarted.Load()) sm.CallsSucceeded.Store(o.CallsSucceeded.Load()) diff --git a/vendor/google.golang.org/grpc/internal/channelz/socket.go b/vendor/google.golang.org/grpc/internal/channelz/socket.go index fa64834b25..90103847c5 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/socket.go +++ b/vendor/google.golang.org/grpc/internal/channelz/socket.go @@ -70,13 +70,18 @@ type EphemeralSocketMetrics struct { RemoteFlowControlWindow int64 } +// SocketType represents the type of socket. type SocketType string +// SocketType can be one of these. const ( SocketTypeNormal = "NormalSocket" SocketTypeListen = "ListenSocket" ) +// Socket represents a socket within channelz which includes socket +// metrics and data related to socket activity and provides methods +// for managing and interacting with sockets. type Socket struct { Entity SocketType SocketType @@ -100,6 +105,8 @@ type Socket struct { Security credentials.ChannelzSecurityValue } +// String returns a string representation of the Socket, including its parent +// entity, socket type, and ID. func (ls *Socket) String() string { return fmt.Sprintf("%s %s #%d", ls.Parent, ls.SocketType, ls.ID) } diff --git a/vendor/google.golang.org/grpc/internal/channelz/subchannel.go b/vendor/google.golang.org/grpc/internal/channelz/subchannel.go index 3b88e4cba8..b20802e6e9 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/subchannel.go +++ b/vendor/google.golang.org/grpc/internal/channelz/subchannel.go @@ -47,12 +47,14 @@ func (sc *SubChannel) id() int64 { return sc.ID } +// Sockets returns a copy of the sockets map associated with the SubChannel. func (sc *SubChannel) Sockets() map[int64]string { db.mu.RLock() defer db.mu.RUnlock() return copyMap(sc.sockets) } +// Trace returns a copy of the ChannelTrace associated with the SubChannel. func (sc *SubChannel) Trace() *ChannelTrace { db.mu.RLock() defer db.mu.RUnlock() diff --git a/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go b/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go index d1ed8df6a5..0e6e18e185 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go +++ b/vendor/google.golang.org/grpc/internal/channelz/syscall_nonlinux.go @@ -35,13 +35,13 @@ type SocketOptionData struct { // Getsockopt defines the function to get socket options requested by channelz. // It is to be passed to syscall.RawConn.Control(). // Windows OS doesn't support Socket Option -func (s *SocketOptionData) Getsockopt(fd uintptr) { +func (s *SocketOptionData) Getsockopt(uintptr) { once.Do(func() { logger.Warning("Channelz: socket options are not supported on non-linux environments") }) } // GetSocketOption gets the socket option info of the conn. -func GetSocketOption(c any) *SocketOptionData { +func GetSocketOption(any) *SocketOptionData { return nil } diff --git a/vendor/google.golang.org/grpc/internal/channelz/trace.go b/vendor/google.golang.org/grpc/internal/channelz/trace.go index 36b8674032..3b7ba59662 100644 --- a/vendor/google.golang.org/grpc/internal/channelz/trace.go +++ b/vendor/google.golang.org/grpc/internal/channelz/trace.go @@ -79,13 +79,21 @@ type TraceEvent struct { Parent *TraceEvent } +// ChannelTrace provides tracing information for a channel. +// It tracks various events and metadata related to the channel's lifecycle +// and operations. type ChannelTrace struct { - cm *channelMap - clearCalled bool + cm *channelMap + clearCalled bool + // The time when the trace was created. CreationTime time.Time - EventNum int64 - mu sync.Mutex - Events []*traceEvent + // A counter for the number of events recorded in the + // trace. + EventNum int64 + mu sync.Mutex + // A slice of traceEvent pointers representing the events recorded for + // this channel. + Events []*traceEvent } func (c *ChannelTrace) copy() *ChannelTrace { @@ -175,6 +183,7 @@ var refChannelTypeToString = map[RefChannelType]string{ RefNormalSocket: "NormalSocket", } +// String returns a string representation of the RefChannelType func (r RefChannelType) String() string { return refChannelTypeToString[r] } @@ -185,7 +194,7 @@ func (r RefChannelType) String() string { // If channelz is not turned ON, this will simply log the event descriptions. func AddTraceEvent(l grpclog.DepthLoggerV2, e Entity, depth int, desc *TraceEvent) { // Log only the trace description associated with the bottom most entity. - d := fmt.Sprintf("[%s]%s", e, desc.Desc) + d := fmt.Sprintf("[%s] %s", e, desc.Desc) switch desc.Severity { case CtUnknown, CtInfo: l.InfoDepth(depth+1, d) diff --git a/vendor/google.golang.org/grpc/internal/credentials/credentials.go b/vendor/google.golang.org/grpc/internal/credentials/credentials.go index 9deee7f651..48b22d9cf0 100644 --- a/vendor/google.golang.org/grpc/internal/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/internal/credentials/credentials.go @@ -20,20 +20,6 @@ import ( "context" ) -// requestInfoKey is a struct to be used as the key to store RequestInfo in a -// context. -type requestInfoKey struct{} - -// NewRequestInfoContext creates a context with ri. -func NewRequestInfoContext(ctx context.Context, ri any) context.Context { - return context.WithValue(ctx, requestInfoKey{}, ri) -} - -// RequestInfoFromContext extracts the RequestInfo from ctx. -func RequestInfoFromContext(ctx context.Context) any { - return ctx.Value(requestInfoKey{}) -} - // clientHandshakeInfoKey is a struct used as the key to store // ClientHandshakeInfo in a context. type clientHandshakeInfoKey struct{} diff --git a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go index 685a3cb41b..7e060f5ed1 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/envconfig.go @@ -26,23 +26,55 @@ import ( ) var ( - // TXTErrIgnore is set if TXT errors should be ignored ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). + // EnableTXTServiceConfig is set if the DNS resolver should perform TXT + // lookups for service config ("GRPC_ENABLE_TXT_SERVICE_CONFIG" is not + // "false"). + EnableTXTServiceConfig = boolFromEnv("GRPC_ENABLE_TXT_SERVICE_CONFIG", true) + + // TXTErrIgnore is set if TXT errors should be ignored + // ("GRPC_GO_IGNORE_TXT_ERRORS" is not "false"). TXTErrIgnore = boolFromEnv("GRPC_GO_IGNORE_TXT_ERRORS", true) - // AdvertiseCompressors is set if registered compressor should be advertised - // ("GRPC_GO_ADVERTISE_COMPRESSORS" is not "false"). - AdvertiseCompressors = boolFromEnv("GRPC_GO_ADVERTISE_COMPRESSORS", true) + // RingHashCap indicates the maximum ring size which defaults to 4096 // entries but may be overridden by setting the environment variable // "GRPC_RING_HASH_CAP". This does not override the default bounds // checking which NACKs configs specifying ring sizes > 8*1024*1024 (~8M). RingHashCap = uint64FromEnv("GRPC_RING_HASH_CAP", 4096, 1, 8*1024*1024) - // LeastRequestLB is set if we should support the least_request_experimental - // LB policy, which can be enabled by setting the environment variable - // "GRPC_EXPERIMENTAL_ENABLE_LEAST_REQUEST" to "true". - LeastRequestLB = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_LEAST_REQUEST", false) + // ALTSMaxConcurrentHandshakes is the maximum number of concurrent ALTS // handshakes that can be performed. ALTSMaxConcurrentHandshakes = uint64FromEnv("GRPC_ALTS_MAX_CONCURRENT_HANDSHAKES", 100, 1, 100) + + // EnforceALPNEnabled is set if TLS connections to servers with ALPN disabled + // should be rejected. The HTTP/2 protocol requires ALPN to be enabled, this + // option is present for backward compatibility. This option may be overridden + // by setting the environment variable "GRPC_ENFORCE_ALPN_ENABLED" to "true" + // or "false". + EnforceALPNEnabled = boolFromEnv("GRPC_ENFORCE_ALPN_ENABLED", true) + + // NewPickFirstEnabled is set if the new pickfirst leaf policy is to be used + // instead of the exiting pickfirst implementation. This can be disabled by + // setting the environment variable "GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST" + // to "false". + NewPickFirstEnabled = boolFromEnv("GRPC_EXPERIMENTAL_ENABLE_NEW_PICK_FIRST", true) + + // XDSEndpointHashKeyBackwardCompat controls the parsing of the endpoint hash + // key from EDS LbEndpoint metadata. Endpoint hash keys can be disabled by + // setting "GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT" to "true". When the + // implementation of A76 is stable, we will flip the default value to false + // in a subsequent release. A final release will remove this environment + // variable, enabling the new behavior unconditionally. + XDSEndpointHashKeyBackwardCompat = boolFromEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT", true) + + // RingHashSetRequestHashKey is set if the ring hash balancer can get the + // request hash header by setting the "requestHashHeader" field, according + // to gRFC A76. It can be enabled by setting the environment variable + // "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY" to "true". + RingHashSetRequestHashKey = boolFromEnv("GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY", false) + + // ALTSHandshakerKeepaliveParams is set if we should add the + // KeepaliveParams when dial the ALTS handshaker service. + ALTSHandshakerKeepaliveParams = boolFromEnv("GRPC_EXPERIMENTAL_ALTS_HANDSHAKER_KEEPALIVE_PARAMS", false) ) func boolFromEnv(envVar string, def bool) bool { diff --git a/vendor/google.golang.org/grpc/internal/envconfig/xds.go b/vendor/google.golang.org/grpc/internal/envconfig/xds.go index 29f234acb1..b1f883bcac 100644 --- a/vendor/google.golang.org/grpc/internal/envconfig/xds.go +++ b/vendor/google.golang.org/grpc/internal/envconfig/xds.go @@ -53,4 +53,25 @@ var ( // C2PResolverTestOnlyTrafficDirectorURI is the TD URI for testing. C2PResolverTestOnlyTrafficDirectorURI = os.Getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI") + + // XDSDualstackEndpointsEnabled is true if gRPC should read the + // "additional addresses" in the xDS endpoint resource. + XDSDualstackEndpointsEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_DUALSTACK_ENDPOINTS", true) + + // XDSSystemRootCertsEnabled is true when xDS enabled gRPC clients can use + // the system's default root certificates for TLS certificate validation. + // For more details, see: + // https://github.com/grpc/proposal/blob/master/A82-xds-system-root-certs.md. + XDSSystemRootCertsEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_SYSTEM_ROOT_CERTS", false) + + // XDSSPIFFEEnabled controls if SPIFFE Bundle Maps can be used as roots of + // trust. For more details, see: + // https://github.com/grpc/proposal/blob/master/A87-mtls-spiffe-support.md + XDSSPIFFEEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_MTLS_SPIFFE", false) + + // XDSHTTPConnectEnabled is true if gRPC should parse custom Metadata + // configuring use of an HTTP CONNECT proxy via xDS from cluster resources. + // For more details, see: + // https://github.com/grpc/proposal/blob/master/A86-xds-http-connect.md + XDSHTTPConnectEnabled = boolFromEnv("GRPC_EXPERIMENTAL_XDS_HTTP_CONNECT", false) ) diff --git a/vendor/google.golang.org/grpc/internal/experimental.go b/vendor/google.golang.org/grpc/internal/experimental.go index 7f7044e173..7617be2158 100644 --- a/vendor/google.golang.org/grpc/internal/experimental.go +++ b/vendor/google.golang.org/grpc/internal/experimental.go @@ -18,11 +18,11 @@ package internal var ( - // WithRecvBufferPool is implemented by the grpc package and returns a dial + // WithBufferPool is implemented by the grpc package and returns a dial // option to configure a shared buffer pool for a grpc.ClientConn. - WithRecvBufferPool any // func (grpc.SharedBufferPool) grpc.DialOption + WithBufferPool any // func (grpc.SharedBufferPool) grpc.DialOption - // RecvBufferPool is implemented by the grpc package and returns a server + // BufferPool is implemented by the grpc package and returns a server // option to configure a shared buffer pool for a grpc.Server. - RecvBufferPool any // func (grpc.SharedBufferPool) grpc.ServerOption + BufferPool any // func (grpc.SharedBufferPool) grpc.ServerOption ) diff --git a/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go b/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go index 6717b757f8..43423d8ad9 100644 --- a/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go +++ b/vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go @@ -62,9 +62,9 @@ func isRunningOnGCE(manufacturer []byte, goos string) bool { name = strings.TrimSpace(name) return name == "Google" || name == "Google Compute Engine" case "windows": - name = strings.Replace(name, " ", "", -1) - name = strings.Replace(name, "\n", "", -1) - name = strings.Replace(name, "\r", "", -1) + name = strings.ReplaceAll(name, " ", "") + name = strings.ReplaceAll(name, "\n", "") + name = strings.ReplaceAll(name, "\r", "") return name == "Google" default: return false diff --git a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go b/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go deleted file mode 100644 index bfc45102ab..0000000000 --- a/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go +++ /dev/null @@ -1,126 +0,0 @@ -/* - * - * Copyright 2020 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package grpclog (internal) defines depth logging for grpc. -package grpclog - -import ( - "os" -) - -// Logger is the logger used for the non-depth log functions. -var Logger LoggerV2 - -// DepthLogger is the logger used for the depth log functions. -var DepthLogger DepthLoggerV2 - -// InfoDepth logs to the INFO log at the specified depth. -func InfoDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.InfoDepth(depth, args...) - } else { - Logger.Infoln(args...) - } -} - -// WarningDepth logs to the WARNING log at the specified depth. -func WarningDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.WarningDepth(depth, args...) - } else { - Logger.Warningln(args...) - } -} - -// ErrorDepth logs to the ERROR log at the specified depth. -func ErrorDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.ErrorDepth(depth, args...) - } else { - Logger.Errorln(args...) - } -} - -// FatalDepth logs to the FATAL log at the specified depth. -func FatalDepth(depth int, args ...any) { - if DepthLogger != nil { - DepthLogger.FatalDepth(depth, args...) - } else { - Logger.Fatalln(args...) - } - os.Exit(1) -} - -// LoggerV2 does underlying logging work for grpclog. -// This is a copy of the LoggerV2 defined in the external grpclog package. It -// is defined here to avoid a circular dependency. -type LoggerV2 interface { - // Info logs to INFO log. Arguments are handled in the manner of fmt.Print. - Info(args ...any) - // Infoln logs to INFO log. Arguments are handled in the manner of fmt.Println. - Infoln(args ...any) - // Infof logs to INFO log. Arguments are handled in the manner of fmt.Printf. - Infof(format string, args ...any) - // Warning logs to WARNING log. Arguments are handled in the manner of fmt.Print. - Warning(args ...any) - // Warningln logs to WARNING log. Arguments are handled in the manner of fmt.Println. - Warningln(args ...any) - // Warningf logs to WARNING log. Arguments are handled in the manner of fmt.Printf. - Warningf(format string, args ...any) - // Error logs to ERROR log. Arguments are handled in the manner of fmt.Print. - Error(args ...any) - // Errorln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - Errorln(args ...any) - // Errorf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - Errorf(format string, args ...any) - // Fatal logs to ERROR log. Arguments are handled in the manner of fmt.Print. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatal(args ...any) - // Fatalln logs to ERROR log. Arguments are handled in the manner of fmt.Println. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalln(args ...any) - // Fatalf logs to ERROR log. Arguments are handled in the manner of fmt.Printf. - // gRPC ensures that all Fatal logs will exit with os.Exit(1). - // Implementations may also call os.Exit() with a non-zero exit code. - Fatalf(format string, args ...any) - // V reports whether verbosity level l is at least the requested verbose level. - V(l int) bool -} - -// DepthLoggerV2 logs at a specified call frame. If a LoggerV2 also implements -// DepthLoggerV2, the below functions will be called with the appropriate stack -// depth set for trivial functions the logger may ignore. -// This is a copy of the DepthLoggerV2 defined in the external grpclog package. -// It is defined here to avoid a circular dependency. -// -// # Experimental -// -// Notice: This type is EXPERIMENTAL and may be changed or removed in a -// later release. -type DepthLoggerV2 interface { - // InfoDepth logs to INFO log at the specified depth. Arguments are handled in the manner of fmt.Println. - InfoDepth(depth int, args ...any) - // WarningDepth logs to WARNING log at the specified depth. Arguments are handled in the manner of fmt.Println. - WarningDepth(depth int, args ...any) - // ErrorDepth logs to ERROR log at the specified depth. Arguments are handled in the manner of fmt.Println. - ErrorDepth(depth int, args ...any) - // FatalDepth logs to FATAL log at the specified depth. Arguments are handled in the manner of fmt.Println. - FatalDepth(depth int, args ...any) -} diff --git a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go b/vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go similarity index 63% rename from vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go rename to vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go index faa998de76..092ad187a2 100644 --- a/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go +++ b/vendor/google.golang.org/grpc/internal/grpclog/prefix_logger.go @@ -16,17 +16,21 @@ * */ +// Package grpclog provides logging functionality for internal gRPC packages, +// outside of the functionality provided by the external `grpclog` package. package grpclog import ( "fmt" + + "google.golang.org/grpc/grpclog" ) // PrefixLogger does logging with a prefix. // // Logging method on a nil logs without any prefix. type PrefixLogger struct { - logger DepthLoggerV2 + logger grpclog.DepthLoggerV2 prefix string } @@ -38,7 +42,7 @@ func (pl *PrefixLogger) Infof(format string, args ...any) { pl.logger.InfoDepth(1, fmt.Sprintf(format, args...)) return } - InfoDepth(1, fmt.Sprintf(format, args...)) + grpclog.InfoDepth(1, fmt.Sprintf(format, args...)) } // Warningf does warning logging. @@ -48,7 +52,7 @@ func (pl *PrefixLogger) Warningf(format string, args ...any) { pl.logger.WarningDepth(1, fmt.Sprintf(format, args...)) return } - WarningDepth(1, fmt.Sprintf(format, args...)) + grpclog.WarningDepth(1, fmt.Sprintf(format, args...)) } // Errorf does error logging. @@ -58,36 +62,18 @@ func (pl *PrefixLogger) Errorf(format string, args ...any) { pl.logger.ErrorDepth(1, fmt.Sprintf(format, args...)) return } - ErrorDepth(1, fmt.Sprintf(format, args...)) -} - -// Debugf does info logging at verbose level 2. -func (pl *PrefixLogger) Debugf(format string, args ...any) { - // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe - // rewrite PrefixLogger a little to ensure that we don't use the global - // `Logger` here, and instead use the `logger` field. - if !Logger.V(2) { - return - } - if pl != nil { - // Handle nil, so the tests can pass in a nil logger. - format = pl.prefix + format - pl.logger.InfoDepth(1, fmt.Sprintf(format, args...)) - return - } - InfoDepth(1, fmt.Sprintf(format, args...)) - + grpclog.ErrorDepth(1, fmt.Sprintf(format, args...)) } // V reports whether verbosity level l is at least the requested verbose level. func (pl *PrefixLogger) V(l int) bool { - // TODO(6044): Refactor interfaces LoggerV2 and DepthLogger, and maybe - // rewrite PrefixLogger a little to ensure that we don't use the global - // `Logger` here, and instead use the `logger` field. - return Logger.V(l) + if pl != nil { + return pl.logger.V(l) + } + return true } // NewPrefixLogger creates a prefix logger with the given prefix. -func NewPrefixLogger(logger DepthLoggerV2, prefix string) *PrefixLogger { +func NewPrefixLogger(logger grpclog.DepthLoggerV2, prefix string) *PrefixLogger { return &PrefixLogger{logger: logger, prefix: prefix} } diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go deleted file mode 100644 index 0126d6b510..0000000000 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand.go +++ /dev/null @@ -1,100 +0,0 @@ -//go:build !go1.21 - -// TODO: when this file is deleted (after Go 1.20 support is dropped), delete -// all of grpcrand and call the rand package directly. - -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package grpcrand implements math/rand functions in a concurrent-safe way -// with a global random source, independent of math/rand's global source. -package grpcrand - -import ( - "math/rand" - "sync" - "time" -) - -var ( - r = rand.New(rand.NewSource(time.Now().UnixNano())) - mu sync.Mutex -) - -// Int implements rand.Int on the grpcrand global source. -func Int() int { - mu.Lock() - defer mu.Unlock() - return r.Int() -} - -// Int63n implements rand.Int63n on the grpcrand global source. -func Int63n(n int64) int64 { - mu.Lock() - defer mu.Unlock() - return r.Int63n(n) -} - -// Intn implements rand.Intn on the grpcrand global source. -func Intn(n int) int { - mu.Lock() - defer mu.Unlock() - return r.Intn(n) -} - -// Int31n implements rand.Int31n on the grpcrand global source. -func Int31n(n int32) int32 { - mu.Lock() - defer mu.Unlock() - return r.Int31n(n) -} - -// Float64 implements rand.Float64 on the grpcrand global source. -func Float64() float64 { - mu.Lock() - defer mu.Unlock() - return r.Float64() -} - -// Uint64 implements rand.Uint64 on the grpcrand global source. -func Uint64() uint64 { - mu.Lock() - defer mu.Unlock() - return r.Uint64() -} - -// Uint32 implements rand.Uint32 on the grpcrand global source. -func Uint32() uint32 { - mu.Lock() - defer mu.Unlock() - return r.Uint32() -} - -// ExpFloat64 implements rand.ExpFloat64 on the grpcrand global source. -func ExpFloat64() float64 { - mu.Lock() - defer mu.Unlock() - return r.ExpFloat64() -} - -// Shuffle implements rand.Shuffle on the grpcrand global source. -var Shuffle = func(n int, f func(int, int)) { - mu.Lock() - defer mu.Unlock() - r.Shuffle(n, f) -} diff --git a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go b/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go deleted file mode 100644 index c37299af1e..0000000000 --- a/vendor/google.golang.org/grpc/internal/grpcrand/grpcrand_go1.21.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:build go1.21 - -/* - * - * Copyright 2024 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package grpcrand implements math/rand functions in a concurrent-safe way -// with a global random source, independent of math/rand's global source. -package grpcrand - -import "math/rand" - -// This implementation will be used for Go version 1.21 or newer. -// For older versions, the original implementation with mutex will be used. - -// Int implements rand.Int on the grpcrand global source. -func Int() int { - return rand.Int() -} - -// Int63n implements rand.Int63n on the grpcrand global source. -func Int63n(n int64) int64 { - return rand.Int63n(n) -} - -// Intn implements rand.Intn on the grpcrand global source. -func Intn(n int) int { - return rand.Intn(n) -} - -// Int31n implements rand.Int31n on the grpcrand global source. -func Int31n(n int32) int32 { - return rand.Int31n(n) -} - -// Float64 implements rand.Float64 on the grpcrand global source. -func Float64() float64 { - return rand.Float64() -} - -// Uint64 implements rand.Uint64 on the grpcrand global source. -func Uint64() uint64 { - return rand.Uint64() -} - -// Uint32 implements rand.Uint32 on the grpcrand global source. -func Uint32() uint32 { - return rand.Uint32() -} - -// ExpFloat64 implements rand.ExpFloat64 on the grpcrand global source. -func ExpFloat64() float64 { - return rand.ExpFloat64() -} - -// Shuffle implements rand.Shuffle on the grpcrand global source. -var Shuffle = func(n int, f func(int, int)) { - rand.Shuffle(n, f) -} diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go index f7f40a16ac..9b6d8a1fa3 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go @@ -53,40 +53,38 @@ func NewCallbackSerializer(ctx context.Context) *CallbackSerializer { return cs } -// Schedule adds a callback to be scheduled after existing callbacks are run. +// TrySchedule tries to schedule the provided callback function f to be +// executed in the order it was added. This is a best-effort operation. If the +// context passed to NewCallbackSerializer was canceled before this method is +// called, the callback will not be scheduled. // // Callbacks are expected to honor the context when performing any blocking // operations, and should return early when the context is canceled. +func (cs *CallbackSerializer) TrySchedule(f func(ctx context.Context)) { + cs.callbacks.Put(f) +} + +// ScheduleOr schedules the provided callback function f to be executed in the +// order it was added. If the context passed to NewCallbackSerializer has been +// canceled before this method is called, the onFailure callback will be +// executed inline instead. // -// Return value indicates if the callback was successfully added to the list of -// callbacks to be executed by the serializer. It is not possible to add -// callbacks once the context passed to NewCallbackSerializer is cancelled. -func (cs *CallbackSerializer) Schedule(f func(ctx context.Context)) bool { - return cs.callbacks.Put(f) == nil +// Callbacks are expected to honor the context when performing any blocking +// operations, and should return early when the context is canceled. +func (cs *CallbackSerializer) ScheduleOr(f func(ctx context.Context), onFailure func()) { + if cs.callbacks.Put(f) != nil { + onFailure() + } } func (cs *CallbackSerializer) run(ctx context.Context) { defer close(cs.done) - // TODO: when Go 1.21 is the oldest supported version, this loop and Close - // can be replaced with: - // - // context.AfterFunc(ctx, cs.callbacks.Close) - for ctx.Err() == nil { - select { - case <-ctx.Done(): - // Do nothing here. Next iteration of the for loop will not happen, - // since ctx.Err() would be non-nil. - case cb := <-cs.callbacks.Get(): - cs.callbacks.Load() - cb.(func(context.Context))(ctx) - } - } - - // Close the buffer to prevent new callbacks from being added. - cs.callbacks.Close() + // Close the buffer when the context is canceled + // to prevent new callbacks from being added. + context.AfterFunc(ctx, cs.callbacks.Close) - // Run all pending callbacks. + // Run all callbacks. for cb := range cs.callbacks.Get() { cs.callbacks.Load() cb.(func(context.Context))(ctx) diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/event.go b/vendor/google.golang.org/grpc/internal/grpcsync/event.go index fbe697c376..d788c24930 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/event.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/event.go @@ -21,28 +21,25 @@ package grpcsync import ( - "sync" "sync/atomic" ) // Event represents a one-time event that may occur in the future. type Event struct { - fired int32 + fired atomic.Bool c chan struct{} - o sync.Once } // Fire causes e to complete. It is safe to call multiple times, and // concurrently. It returns true iff this call to Fire caused the signaling -// channel returned by Done to close. +// channel returned by Done to close. If Fire returns false, it is possible +// the Done channel has not been closed yet. func (e *Event) Fire() bool { - ret := false - e.o.Do(func() { - atomic.StoreInt32(&e.fired, 1) + if e.fired.CompareAndSwap(false, true) { close(e.c) - ret = true - }) - return ret + return true + } + return false } // Done returns a channel that will be closed when Fire is called. @@ -52,7 +49,7 @@ func (e *Event) Done() <-chan struct{} { // HasFired returns true if Fire has been called. func (e *Event) HasFired() bool { - return atomic.LoadInt32(&e.fired) == 1 + return e.fired.Load() } // NewEvent returns a new, ready-to-use Event. diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go b/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go index aef8cec1ab..6d8c2f518d 100644 --- a/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go +++ b/vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go @@ -77,7 +77,7 @@ func (ps *PubSub) Subscribe(sub Subscriber) (cancel func()) { if ps.msg != nil { msg := ps.msg - ps.cs.Schedule(func(context.Context) { + ps.cs.TrySchedule(func(context.Context) { ps.mu.Lock() defer ps.mu.Unlock() if !ps.subscribers[sub] { @@ -103,7 +103,7 @@ func (ps *PubSub) Publish(msg any) { ps.msg = msg for sub := range ps.subscribers { s := sub - ps.cs.Schedule(func(context.Context) { + ps.cs.TrySchedule(func(context.Context) { ps.mu.Lock() defer ps.mu.Unlock() if !ps.subscribers[s] { diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go index 9f40909679..e8d866984b 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/compressor.go @@ -20,8 +20,6 @@ package grpcutil import ( "strings" - - "google.golang.org/grpc/internal/envconfig" ) // RegisteredCompressorNames holds names of the registered compressors. @@ -40,8 +38,5 @@ func IsCompressorNameRegistered(name string) bool { // RegisteredCompressors returns a string of registered compressor names // separated by comma. func RegisteredCompressors() string { - if !envconfig.AdvertiseCompressors { - return "" - } return strings.Join(RegisteredCompressorNames, ",") } diff --git a/vendor/google.golang.org/grpc/internal/grpcutil/method.go b/vendor/google.golang.org/grpc/internal/grpcutil/method.go index ec62b4775e..683d1955c6 100644 --- a/vendor/google.golang.org/grpc/internal/grpcutil/method.go +++ b/vendor/google.golang.org/grpc/internal/grpcutil/method.go @@ -39,7 +39,7 @@ func ParseMethod(methodName string) (service, method string, _ error) { } // baseContentType is the base content-type for gRPC. This is a valid -// content-type on it's own, but can also include a content-subtype such as +// content-type on its own, but can also include a content-subtype such as // "proto" as a suffix after "+" or ";". See // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests // for more details. diff --git a/vendor/google.golang.org/grpc/internal/idle/idle.go b/vendor/google.golang.org/grpc/internal/idle/idle.go index fe49cb74c5..2c13ee9dac 100644 --- a/vendor/google.golang.org/grpc/internal/idle/idle.go +++ b/vendor/google.golang.org/grpc/internal/idle/idle.go @@ -182,6 +182,7 @@ func (m *Manager) tryEnterIdleMode() bool { return true } +// EnterIdleModeForTesting instructs the channel to enter idle mode. func (m *Manager) EnterIdleModeForTesting() { m.tryEnterIdleMode() } @@ -225,7 +226,7 @@ func (m *Manager) ExitIdleMode() error { // came in and OnCallBegin() noticed that the calls count is negative. // - Channel is in idle mode, and multiple new RPCs come in at the same // time, all of them notice a negative calls count in OnCallBegin and get - // here. The first one to get the lock would got the channel to exit idle. + // here. The first one to get the lock would get the channel to exit idle. // - Channel is not in idle mode, and the user calls Connect which calls // m.ExitIdleMode. // @@ -266,6 +267,7 @@ func (m *Manager) isClosed() bool { return atomic.LoadInt32(&m.closed) == 1 } +// Close stops the timer associated with the Manager, if it exists. func (m *Manager) Close() { atomic.StoreInt32(&m.closed, 1) diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index 48d24bdb4e..2699223a27 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -29,10 +29,12 @@ import ( ) var ( - // WithHealthCheckFunc is set by dialoptions.go - WithHealthCheckFunc any // func (HealthChecker) DialOption // HealthCheckFunc is used to provide client-side LB channel health checking HealthCheckFunc HealthChecker + // RegisterClientHealthCheckListener is used to provide a listener for + // updates from the client-side health checking service. It returns a + // function that can be called to stop the health producer. + RegisterClientHealthCheckListener any // func(ctx context.Context, sc balancer.SubConn, serviceName string, listener func(balancer.SubConnState)) func() // BalancerUnregister is exported by package balancer to unregister a balancer. BalancerUnregister func(name string) // KeepaliveMinPingTime is the minimum ping interval. This must be 10s by @@ -62,6 +64,9 @@ var ( // gRPC server. An xDS-enabled server needs to know what type of credentials // is configured on the underlying gRPC server. This is set by server.go. GetServerCredentials any // func (*grpc.Server) credentials.TransportCredentials + // MetricsRecorderForServer returns the MetricsRecorderList derived from a + // server's stats handlers. + MetricsRecorderForServer any // func (*grpc.Server) estats.MetricsRecorder // CanonicalString returns the canonical string of the code defined here: // https://github.com/grpc/grpc/blob/master/doc/statuscodes.md. // @@ -106,6 +111,14 @@ var ( // This is used in the 1.0 release of gcp/observability, and thus must not be // deleted or changed. ClearGlobalDialOptions func() + + // AddGlobalPerTargetDialOptions adds a PerTargetDialOption that will be + // configured for newly created ClientConns. + AddGlobalPerTargetDialOptions any // func (opt any) + // ClearGlobalPerTargetDialOptions clears the slice of global late apply + // dial options. + ClearGlobalPerTargetDialOptions func() + // JoinDialOptions combines the dial options passed as arguments into a // single dial option. JoinDialOptions any // func(...grpc.DialOption) grpc.DialOption @@ -126,7 +139,8 @@ var ( // deleted or changed. BinaryLogger any // func(binarylog.Logger) grpc.ServerOption - // SubscribeToConnectivityStateChanges adds a grpcsync.Subscriber to a provided grpc.ClientConn + // SubscribeToConnectivityStateChanges adds a grpcsync.Subscriber to a + // provided grpc.ClientConn. SubscribeToConnectivityStateChanges any // func(*grpc.ClientConn, grpcsync.Subscriber) // NewXDSResolverWithConfigForTesting creates a new xds resolver builder using @@ -140,41 +154,40 @@ var ( // other features, including the CSDS service. NewXDSResolverWithConfigForTesting any // func([]byte) (resolver.Builder, error) - // RegisterRLSClusterSpecifierPluginForTesting registers the RLS Cluster - // Specifier Plugin for testing purposes, regardless of the XDSRLS environment - // variable. + // NewXDSResolverWithPoolForTesting creates a new xDS resolver builder + // using the provided xDS pool instead of creating a new one using the + // bootstrap configuration specified by the supported environment variables. + // The resolver.Builder is meant to be used in conjunction with the + // grpc.WithResolvers DialOption. The resolver.Builder does not take + // ownership of the provided xDS client and it is the responsibility of the + // caller to close the client when no longer required. // - // TODO: Remove this function once the RLS env var is removed. - RegisterRLSClusterSpecifierPluginForTesting func() - - // UnregisterRLSClusterSpecifierPluginForTesting unregisters the RLS Cluster - // Specifier Plugin for testing purposes. This is needed because there is no way - // to unregister the RLS Cluster Specifier Plugin after registering it solely - // for testing purposes using RegisterRLSClusterSpecifierPluginForTesting(). + // Testing Only // - // TODO: Remove this function once the RLS env var is removed. - UnregisterRLSClusterSpecifierPluginForTesting func() + // This function should ONLY be used for testing and may not work with some + // other features, including the CSDS service. + NewXDSResolverWithPoolForTesting any // func(*xdsclient.Pool) (resolver.Builder, error) - // RegisterRBACHTTPFilterForTesting registers the RBAC HTTP Filter for testing - // purposes, regardless of the RBAC environment variable. + // NewXDSResolverWithClientForTesting creates a new xDS resolver builder + // using the provided xDS client instead of creating a new one using the + // bootstrap configuration specified by the supported environment variables. + // The resolver.Builder is meant to be used in conjunction with the + // grpc.WithResolvers DialOption. The resolver.Builder does not take + // ownership of the provided xDS client and it is the responsibility of the + // caller to close the client when no longer required. // - // TODO: Remove this function once the RBAC env var is removed. - RegisterRBACHTTPFilterForTesting func() - - // UnregisterRBACHTTPFilterForTesting unregisters the RBAC HTTP Filter for - // testing purposes. This is needed because there is no way to unregister the - // HTTP Filter after registering it solely for testing purposes using - // RegisterRBACHTTPFilterForTesting(). + // Testing Only // - // TODO: Remove this function once the RBAC env var is removed. - UnregisterRBACHTTPFilterForTesting func() + // This function should ONLY be used for testing and may not work with some + // other features, including the CSDS service. + NewXDSResolverWithClientForTesting any // func(xdsclient.XDSClient) (resolver.Builder, error) // ORCAAllowAnyMinReportingInterval is for examples/orca use ONLY. ORCAAllowAnyMinReportingInterval any // func(so *orca.ServiceOptions) // GRPCResolverSchemeExtraMetadata determines when gRPC will add extra // metadata to RPCs. - GRPCResolverSchemeExtraMetadata string = "xds" + GRPCResolverSchemeExtraMetadata = "xds" // EnterIdleModeForTesting gets the ClientConn to enter IDLE mode. EnterIdleModeForTesting any // func(*grpc.ClientConn) @@ -182,31 +195,63 @@ var ( // ExitIdleModeForTesting gets the ClientConn to exit IDLE mode. ExitIdleModeForTesting any // func(*grpc.ClientConn) error + // ChannelzTurnOffForTesting disables the Channelz service for testing + // purposes. ChannelzTurnOffForTesting func() - // TriggerXDSResourceNameNotFoundForTesting triggers the resource-not-found - // error for a given resource type and name. This is usually triggered when - // the associated watch timer fires. For testing purposes, having this - // function makes events more predictable than relying on timer events. - TriggerXDSResourceNameNotFoundForTesting any // func(func(xdsresource.Type, string), string, string) error - - // TriggerXDSResourceNameNotFoundClient invokes the testing xDS Client - // singleton to invoke resource not found for a resource type name and - // resource name. - TriggerXDSResourceNameNotFoundClient any // func(string, string) error + // TriggerXDSResourceNotFoundForTesting causes the provided xDS Client to + // invoke resource-not-found error for the given resource type and name. + TriggerXDSResourceNotFoundForTesting any // func(xdsclient.XDSClient, xdsresource.Type, string) error - // FromOutgoingContextRaw returns the un-merged, intermediary contents of metadata.rawMD. + // FromOutgoingContextRaw returns the un-merged, intermediary contents of + // metadata.rawMD. FromOutgoingContextRaw any // func(context.Context) (metadata.MD, [][]string, bool) - // UserSetDefaultScheme is set to true if the user has overridden the default resolver scheme. - UserSetDefaultScheme bool = false + // UserSetDefaultScheme is set to true if the user has overridden the + // default resolver scheme. + UserSetDefaultScheme = false + + // ConnectedAddress returns the connected address for a SubConnState. The + // address is only valid if the state is READY. + ConnectedAddress any // func (scs SubConnState) resolver.Address + + // SetConnectedAddress sets the connected address for a SubConnState. + SetConnectedAddress any // func(scs *SubConnState, addr resolver.Address) + + // SnapshotMetricRegistryForTesting snapshots the global data of the metric + // registry. Returns a cleanup function that sets the metric registry to its + // original state. Only called in testing functions. + SnapshotMetricRegistryForTesting func() func() + + // SetDefaultBufferPoolForTesting updates the default buffer pool, for + // testing purposes. + SetDefaultBufferPoolForTesting any // func(mem.BufferPool) + + // SetBufferPoolingThresholdForTesting updates the buffer pooling threshold, for + // testing purposes. + SetBufferPoolingThresholdForTesting any // func(int) + + // TimeAfterFunc is used to create timers. During tests the function is + // replaced to track allocated timers and fail the test if a timer isn't + // cancelled. + TimeAfterFunc = func(d time.Duration, f func()) Timer { + return time.AfterFunc(d, f) + } + + // NewStreamWaitingForResolver is a test hook that is triggered when a + // new stream blocks while waiting for name resolution. This can be + // used in tests to synchronize resolver updates and avoid race conditions. + // When set, the function will be called before the stream enters + // the blocking state. + NewStreamWaitingForResolver = func() {} ) -// HealthChecker defines the signature of the client-side LB channel health checking function. +// HealthChecker defines the signature of the client-side LB channel health +// checking function. // // The implementation is expected to create a health checking RPC stream by // calling newStream(), watch for the health status of serviceName, and report -// it's health back by calling setConnectivityState(). +// its health back by calling setConnectivityState(). // // The health checking protocol is defined at: // https://github.com/grpc/grpc/blob/master/doc/health-checking.md @@ -228,3 +273,21 @@ const ( // It currently has an experimental suffix which would be removed once // end-to-end testing of the policy is completed. const RLSLoadBalancingPolicyName = "rls_experimental" + +// EnforceSubConnEmbedding is used to enforce proper SubConn implementation +// embedding. +type EnforceSubConnEmbedding interface { + enforceSubConnEmbedding() +} + +// EnforceClientConnEmbedding is used to enforce proper ClientConn implementation +// embedding. +type EnforceClientConnEmbedding interface { + enforceClientConnEmbedding() +} + +// Timer is an interface to allow injecting different time.Timer implementations +// during tests. +type Timer interface { + Stop() bool +} diff --git a/vendor/google.golang.org/grpc/internal/metadata/metadata.go b/vendor/google.golang.org/grpc/internal/metadata/metadata.go index 900bfb7160..c4055bc00e 100644 --- a/vendor/google.golang.org/grpc/internal/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/internal/metadata/metadata.go @@ -97,13 +97,11 @@ func hasNotPrintable(msg string) bool { return false } -// ValidatePair validate a key-value pair with the following rules (the pseudo-header will be skipped) : -// -// - key must contain one or more characters. -// - the characters in the key must be contained in [0-9 a-z _ - .]. -// - if the key ends with a "-bin" suffix, no validation of the corresponding value is performed. -// - the characters in the every value must be printable (in [%x20-%x7E]). -func ValidatePair(key string, vals ...string) error { +// ValidateKey validates a key with the following rules (pseudo-headers are +// skipped): +// - the key must contain one or more characters. +// - the characters in the key must be in [0-9 a-z _ - .]. +func ValidateKey(key string) error { // key should not be empty if key == "" { return fmt.Errorf("there is an empty key in the header") @@ -119,6 +117,20 @@ func ValidatePair(key string, vals ...string) error { return fmt.Errorf("header key %q contains illegal characters not in [0-9a-z-_.]", key) } } + return nil +} + +// ValidatePair validates a key-value pair with the following rules +// (pseudo-header are skipped): +// - the key must contain one or more characters. +// - the characters in the key must be in [0-9 a-z _ - .]. +// - if the key ends with a "-bin" suffix, no validation of the corresponding +// value is performed. +// - the characters in every value must be printable (in [%x20-%x7E]). +func ValidatePair(key string, vals ...string) error { + if err := ValidateKey(key); err != nil { + return err + } if strings.HasSuffix(key, "-bin") { return nil } diff --git a/vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go b/vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go new file mode 100644 index 0000000000..1f61f1a49d --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/proxyattributes/proxyattributes.go @@ -0,0 +1,54 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package proxyattributes contains functions for getting and setting proxy +// attributes like the CONNECT address and user info. +package proxyattributes + +import ( + "net/url" + + "google.golang.org/grpc/resolver" +) + +type keyType string + +const proxyOptionsKey = keyType("grpc.resolver.delegatingresolver.proxyOptions") + +// Options holds the proxy connection details needed during the CONNECT +// handshake. +type Options struct { + User *url.Userinfo + ConnectAddr string +} + +// Set returns a copy of addr with opts set in its attributes. +func Set(addr resolver.Address, opts Options) resolver.Address { + addr.Attributes = addr.Attributes.WithValue(proxyOptionsKey, opts) + return addr +} + +// Get returns the Options for the proxy [resolver.Address] and a boolean +// value representing if the attribute is present or not. The returned data +// should not be mutated. +func Get(addr resolver.Address) (Options, bool) { + if a := addr.Attributes.Value(proxyOptionsKey); a != nil { + return a.(Options), true + } + return Options{}, false +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go b/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go new file mode 100644 index 0000000000..20b8fb098a --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/resolver/delegatingresolver/delegatingresolver.go @@ -0,0 +1,427 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package delegatingresolver implements a resolver capable of resolving both +// target URIs and proxy addresses. +package delegatingresolver + +import ( + "fmt" + "net/http" + "net/url" + "sync" + + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/internal/proxyattributes" + "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/internal/transport/networktype" + "google.golang.org/grpc/resolver" + "google.golang.org/grpc/serviceconfig" +) + +var ( + logger = grpclog.Component("delegating-resolver") + // HTTPSProxyFromEnvironment will be overwritten in the tests + HTTPSProxyFromEnvironment = http.ProxyFromEnvironment +) + +// delegatingResolver manages both target URI and proxy address resolution by +// delegating these tasks to separate child resolvers. Essentially, it acts as +// an intermediary between the gRPC ClientConn and the child resolvers. +// +// It implements the [resolver.Resolver] interface. +type delegatingResolver struct { + target resolver.Target // parsed target URI to be resolved + cc resolver.ClientConn // gRPC ClientConn + proxyURL *url.URL // proxy URL, derived from proxy environment and target + + // We do not hold both mu and childMu in the same goroutine. Avoid holding + // both locks when calling into the child, as the child resolver may + // synchronously callback into the channel. + mu sync.Mutex // protects all the fields below + targetResolverState *resolver.State // state of the target resolver + proxyAddrs []resolver.Address // resolved proxy addresses; empty if no proxy is configured + + // childMu serializes calls into child resolvers. It also protects access to + // the following fields. + childMu sync.Mutex + targetResolver resolver.Resolver // resolver for the target URI, based on its scheme + proxyResolver resolver.Resolver // resolver for the proxy URI; nil if no proxy is configured +} + +// nopResolver is a resolver that does nothing. +type nopResolver struct{} + +func (nopResolver) ResolveNow(resolver.ResolveNowOptions) {} + +func (nopResolver) Close() {} + +// proxyURLForTarget determines the proxy URL for the given address based on the +// environment. It can return the following: +// - nil URL, nil error: No proxy is configured or the address is excluded +// using the `NO_PROXY` environment variable or if req.URL.Host is +// "localhost" (with or without // a port number) +// - nil URL, non-nil error: An error occurred while retrieving the proxy URL. +// - non-nil URL, nil error: A proxy is configured, and the proxy URL was +// retrieved successfully without any errors. +func proxyURLForTarget(address string) (*url.URL, error) { + req := &http.Request{URL: &url.URL{ + Scheme: "https", + Host: address, + }} + return HTTPSProxyFromEnvironment(req) +} + +// New creates a new delegating resolver that can create up to two child +// resolvers: +// - one to resolve the proxy address specified using the supported +// environment variables. This uses the registered resolver for the "dns" +// scheme. It is lazily built when a target resolver update contains at least +// one TCP address. +// - one to resolve the target URI using the resolver specified by the scheme +// in the target URI or specified by the user using the WithResolvers dial +// option. As a special case, if the target URI's scheme is "dns" and a +// proxy is specified using the supported environment variables, the target +// URI's path portion is used as the resolved address unless target +// resolution is enabled using the dial option. +func New(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions, targetResolverBuilder resolver.Builder, targetResolutionEnabled bool) (resolver.Resolver, error) { + r := &delegatingResolver{ + target: target, + cc: cc, + proxyResolver: nopResolver{}, + targetResolver: nopResolver{}, + } + + var err error + r.proxyURL, err = proxyURLForTarget(target.Endpoint()) + if err != nil { + return nil, fmt.Errorf("delegating_resolver: failed to determine proxy URL for target %s: %v", target, err) + } + + // proxy is not configured or proxy address excluded using `NO_PROXY` env + // var, so only target resolver is used. + if r.proxyURL == nil { + return targetResolverBuilder.Build(target, cc, opts) + } + + if logger.V(2) { + logger.Infof("Proxy URL detected : %s", r.proxyURL) + } + + // Resolver updates from one child may trigger calls into the other. Block + // updates until the children are initialized. + r.childMu.Lock() + defer r.childMu.Unlock() + // When the scheme is 'dns' and target resolution on client is not enabled, + // resolution should be handled by the proxy, not the client. Therefore, we + // bypass the target resolver and store the unresolved target address. + if target.URL.Scheme == "dns" && !targetResolutionEnabled { + r.targetResolverState = &resolver.State{ + Addresses: []resolver.Address{{Addr: target.Endpoint()}}, + Endpoints: []resolver.Endpoint{{Addresses: []resolver.Address{{Addr: target.Endpoint()}}}}, + } + r.updateTargetResolverState(*r.targetResolverState) + return r, nil + } + wcc := &wrappingClientConn{ + stateListener: r.updateTargetResolverState, + parent: r, + } + if r.targetResolver, err = targetResolverBuilder.Build(target, wcc, opts); err != nil { + return nil, fmt.Errorf("delegating_resolver: unable to build the resolver for target %s: %v", target, err) + } + return r, nil +} + +// proxyURIResolver creates a resolver for resolving proxy URIs using the "dns" +// scheme. It adjusts the proxyURL to conform to the "dns:///" format and builds +// a resolver with a wrappingClientConn to capture resolved addresses. +func (r *delegatingResolver) proxyURIResolver(opts resolver.BuildOptions) (resolver.Resolver, error) { + proxyBuilder := resolver.Get("dns") + if proxyBuilder == nil { + panic("delegating_resolver: resolver for proxy not found for scheme dns") + } + url := *r.proxyURL + url.Scheme = "dns" + url.Path = "/" + r.proxyURL.Host + url.Host = "" // Clear the Host field to conform to the "dns:///" format + + proxyTarget := resolver.Target{URL: url} + wcc := &wrappingClientConn{ + stateListener: r.updateProxyResolverState, + parent: r, + } + return proxyBuilder.Build(proxyTarget, wcc, opts) +} + +func (r *delegatingResolver) ResolveNow(o resolver.ResolveNowOptions) { + r.childMu.Lock() + defer r.childMu.Unlock() + r.targetResolver.ResolveNow(o) + r.proxyResolver.ResolveNow(o) +} + +func (r *delegatingResolver) Close() { + r.childMu.Lock() + defer r.childMu.Unlock() + r.targetResolver.Close() + r.targetResolver = nil + + r.proxyResolver.Close() + r.proxyResolver = nil +} + +func needsProxyResolver(state *resolver.State) bool { + for _, addr := range state.Addresses { + if !skipProxy(addr) { + return true + } + } + for _, endpoint := range state.Endpoints { + for _, addr := range endpoint.Addresses { + if !skipProxy(addr) { + return true + } + } + } + return false +} + +func skipProxy(address resolver.Address) bool { + // Avoid proxy when network is not tcp. + networkType, ok := networktype.Get(address) + if !ok { + networkType, _ = transport.ParseDialTarget(address.Addr) + } + if networkType != "tcp" { + return true + } + + req := &http.Request{URL: &url.URL{ + Scheme: "https", + Host: address.Addr, + }} + // Avoid proxy when address included in `NO_PROXY` environment variable or + // fails to get the proxy address. + url, err := HTTPSProxyFromEnvironment(req) + if err != nil || url == nil { + return true + } + return false +} + +// updateClientConnStateLocked constructs a combined list of addresses by +// pairing each proxy address with every target address of type TCP. For each +// pair, it creates a new [resolver.Address] using the proxy address and +// attaches the corresponding target address and user info as attributes. Target +// addresses that are not of type TCP are appended to the list as-is. The +// function returns nil if either resolver has not yet provided an update, and +// returns the result of ClientConn.UpdateState once both resolvers have +// provided at least one update. +func (r *delegatingResolver) updateClientConnStateLocked() error { + if r.targetResolverState == nil || r.proxyAddrs == nil { + return nil + } + + // If multiple resolved proxy addresses are present, we send only the + // unresolved proxy host and let net.Dial handle the proxy host name + // resolution when creating the transport. Sending all resolved addresses + // would increase the number of addresses passed to the ClientConn and + // subsequently to load balancing (LB) policies like Round Robin, leading + // to additional TCP connections. However, if there's only one resolved + // proxy address, we send it directly, as it doesn't affect the address + // count returned by the target resolver and the address count sent to the + // ClientConn. + var proxyAddr resolver.Address + if len(r.proxyAddrs) == 1 { + proxyAddr = r.proxyAddrs[0] + } else { + proxyAddr = resolver.Address{Addr: r.proxyURL.Host} + } + var addresses []resolver.Address + for _, targetAddr := range (*r.targetResolverState).Addresses { + if skipProxy(targetAddr) { + addresses = append(addresses, targetAddr) + continue + } + addresses = append(addresses, proxyattributes.Set(proxyAddr, proxyattributes.Options{ + User: r.proxyURL.User, + ConnectAddr: targetAddr.Addr, + })) + } + + // For each target endpoint, construct a new [resolver.Endpoint] that + // includes all addresses from all proxy endpoints and the addresses from + // that target endpoint, preserving the number of target endpoints. + var endpoints []resolver.Endpoint + for _, endpt := range (*r.targetResolverState).Endpoints { + var addrs []resolver.Address + for _, targetAddr := range endpt.Addresses { + // Avoid proxy when network is not tcp. + if skipProxy(targetAddr) { + addrs = append(addrs, targetAddr) + continue + } + for _, proxyAddr := range r.proxyAddrs { + addrs = append(addrs, proxyattributes.Set(proxyAddr, proxyattributes.Options{ + User: r.proxyURL.User, + ConnectAddr: targetAddr.Addr, + })) + } + } + endpoints = append(endpoints, resolver.Endpoint{Addresses: addrs}) + } + // Use the targetResolverState for its service config and attributes + // contents. The state update is only sent after both the target and proxy + // resolvers have sent their updates, and curState has been updated with the + // combined addresses. + curState := *r.targetResolverState + curState.Addresses = addresses + curState.Endpoints = endpoints + return r.cc.UpdateState(curState) +} + +// updateProxyResolverState updates the proxy resolver state by storing proxy +// addresses and endpoints, marking the resolver as ready, and triggering a +// state update if both proxy and target resolvers are ready. If the ClientConn +// returns a non-nil error, it calls `ResolveNow()` on the target resolver. It +// is a StateListener function of wrappingClientConn passed to the proxy +// resolver. +func (r *delegatingResolver) updateProxyResolverState(state resolver.State) error { + r.mu.Lock() + defer r.mu.Unlock() + if logger.V(2) { + logger.Infof("Addresses received from proxy resolver: %s", state.Addresses) + } + if len(state.Endpoints) > 0 { + // We expect exactly one address per endpoint because the proxy resolver + // uses "dns" resolution. + r.proxyAddrs = make([]resolver.Address, 0, len(state.Endpoints)) + for _, endpoint := range state.Endpoints { + r.proxyAddrs = append(r.proxyAddrs, endpoint.Addresses...) + } + } else if state.Addresses != nil { + r.proxyAddrs = state.Addresses + } else { + r.proxyAddrs = []resolver.Address{} // ensure proxyAddrs is non-nil to indicate an update has been received + } + err := r.updateClientConnStateLocked() + // Another possible approach was to block until updates are received from + // both resolvers. But this is not used because calling `New()` triggers + // `Build()` for the first resolver, which calls `UpdateState()`. And the + // second resolver hasn't sent an update yet, so it would cause `New()` to + // block indefinitely. + if err != nil { + go func() { + r.childMu.Lock() + defer r.childMu.Unlock() + if r.targetResolver != nil { + r.targetResolver.ResolveNow(resolver.ResolveNowOptions{}) + } + }() + } + return err +} + +// updateTargetResolverState is the StateListener function provided to the +// target resolver via wrappingClientConn. It updates the resolver state and +// marks the target resolver as ready. If the update includes at least one TCP +// address and the proxy resolver has not yet been constructed, it initializes +// the proxy resolver. A combined state update is triggered once both resolvers +// are ready. If all addresses are non-TCP, it proceeds without waiting for the +// proxy resolver. If ClientConn.UpdateState returns a non-nil error, +// ResolveNow() is called on the proxy resolver. +func (r *delegatingResolver) updateTargetResolverState(state resolver.State) error { + r.mu.Lock() + defer r.mu.Unlock() + + if logger.V(2) { + logger.Infof("Addresses received from target resolver: %v", state.Addresses) + } + r.targetResolverState = &state + // If all addresses returned by the target resolver have a non-TCP network + // type, or are listed in the `NO_PROXY` environment variable, do not wait + // for proxy update. + if !needsProxyResolver(r.targetResolverState) { + return r.cc.UpdateState(*r.targetResolverState) + } + + // The proxy resolver may be rebuilt multiple times, specifically each time + // the target resolver sends an update, even if the target resolver is built + // successfully but building the proxy resolver fails. + if len(r.proxyAddrs) == 0 { + go func() { + r.childMu.Lock() + defer r.childMu.Unlock() + if _, ok := r.proxyResolver.(nopResolver); !ok { + return + } + proxyResolver, err := r.proxyURIResolver(resolver.BuildOptions{}) + if err != nil { + r.cc.ReportError(fmt.Errorf("delegating_resolver: unable to build the proxy resolver: %v", err)) + return + } + r.proxyResolver = proxyResolver + }() + } + + err := r.updateClientConnStateLocked() + if err != nil { + go func() { + r.childMu.Lock() + defer r.childMu.Unlock() + if r.proxyResolver != nil { + r.proxyResolver.ResolveNow(resolver.ResolveNowOptions{}) + } + }() + } + return nil +} + +// wrappingClientConn serves as an intermediary between the parent ClientConn +// and the child resolvers created here. It implements the resolver.ClientConn +// interface and is passed in that capacity to the child resolvers. +type wrappingClientConn struct { + // Callback to deliver resolver state updates + stateListener func(state resolver.State) error + parent *delegatingResolver +} + +// UpdateState receives resolver state updates and forwards them to the +// appropriate listener function (either for the proxy or target resolver). +func (wcc *wrappingClientConn) UpdateState(state resolver.State) error { + return wcc.stateListener(state) +} + +// ReportError intercepts errors from the child resolvers and passes them to +// ClientConn. +func (wcc *wrappingClientConn) ReportError(err error) { + wcc.parent.cc.ReportError(err) +} + +// NewAddress intercepts the new resolved address from the child resolvers and +// passes them to ClientConn. +func (wcc *wrappingClientConn) NewAddress(addrs []resolver.Address) { + wcc.UpdateState(resolver.State{Addresses: addrs}) +} + +// ParseServiceConfig parses the provided service config and returns an object +// that provides the parsed config. +func (wcc *wrappingClientConn) ParseServiceConfig(serviceConfigJSON string) *serviceconfig.ParseResult { + return wcc.parent.cc.ParseServiceConfig(serviceConfigJSON) +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index abab35e250..ada5251cff 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -24,7 +24,9 @@ import ( "context" "encoding/json" "fmt" + rand "math/rand/v2" "net" + "net/netip" "os" "strconv" "strings" @@ -35,28 +37,35 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/backoff" "google.golang.org/grpc/internal/envconfig" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/resolver/dns/internal" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" ) -// EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB -// addresses from SRV records. Must not be changed after init time. -var EnableSRVLookups = false +var ( + // EnableSRVLookups controls whether the DNS resolver attempts to fetch gRPCLB + // addresses from SRV records. Must not be changed after init time. + EnableSRVLookups = false -// ResolvingTimeout specifies the maximum duration for a DNS resolution request. -// If the timeout expires before a response is received, the request will be canceled. -// -// It is recommended to set this value at application startup. Avoid modifying this variable -// after initialization as it's not thread-safe for concurrent modification. -var ResolvingTimeout = 30 * time.Second + // MinResolutionInterval is the minimum interval at which re-resolutions are + // allowed. This helps to prevent excessive re-resolution. + MinResolutionInterval = 30 * time.Second -var logger = grpclog.Component("dns") + // ResolvingTimeout specifies the maximum duration for a DNS resolution request. + // If the timeout expires before a response is received, the request will be canceled. + // + // It is recommended to set this value at application startup. Avoid modifying this variable + // after initialization as it's not thread-safe for concurrent modification. + ResolvingTimeout = 30 * time.Second + + logger = grpclog.Component("dns") +) func init() { resolver.Register(NewBuilder()) internal.TimeAfterFunc = time.After + internal.TimeNowFunc = time.Now + internal.TimeUntilFunc = time.Until internal.NewNetResolver = newNetResolver internal.AddressDialer = addressDialer } @@ -114,7 +123,7 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts } // IP address. - if ipAddr, ok := formatIP(host); ok { + if ipAddr, err := formatIP(host); err == nil { addr := []resolver.Address{{Addr: ipAddr + ":" + port}} cc.UpdateState(resolver.State{Addresses: addr}) return deadResolver{}, nil @@ -123,13 +132,13 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts // DNS address (non-IP). ctx, cancel := context.WithCancel(context.Background()) d := &dnsResolver{ - host: host, - port: port, - ctx: ctx, - cancel: cancel, - cc: cc, - rn: make(chan struct{}, 1), - disableServiceConfig: opts.DisableServiceConfig, + host: host, + port: port, + ctx: ctx, + cancel: cancel, + cc: cc, + rn: make(chan struct{}, 1), + enableServiceConfig: envconfig.EnableTXTServiceConfig && !opts.DisableServiceConfig, } d.resolver, err = internal.NewNetResolver(target.URL.Host) @@ -169,11 +178,11 @@ type dnsResolver struct { // finished. Otherwise, data race will be possible. [Race Example] in // dns_resolver_test we replace the real lookup functions with mocked ones to // facilitate testing. If Close() doesn't wait for watcher() goroutine - // finishes, race detector sometimes will warns lookup (READ the lookup + // finishes, race detector sometimes will warn lookup (READ the lookup // function pointers) inside watcher() goroutine has data race with // replaceNetFunc (WRITE the lookup function pointers). - wg sync.WaitGroup - disableServiceConfig bool + wg sync.WaitGroup + enableServiceConfig bool } // ResolveNow invoke an immediate resolution of the target that this @@ -203,12 +212,12 @@ func (d *dnsResolver) watcher() { err = d.cc.UpdateState(*state) } - var waitTime time.Duration + var nextResolutionTime time.Time if err == nil { // Success resolving, wait for the next ResolveNow. However, also wait 30 // seconds at the very least to prevent constantly re-resolving. backoffIndex = 1 - waitTime = internal.MinResolutionRate + nextResolutionTime = internal.TimeNowFunc().Add(MinResolutionInterval) select { case <-d.ctx.Done(): return @@ -217,19 +226,21 @@ func (d *dnsResolver) watcher() { } else { // Poll on an error found in DNS Resolver or an error received from // ClientConn. - waitTime = backoff.DefaultExponential.Backoff(backoffIndex) + nextResolutionTime = internal.TimeNowFunc().Add(backoff.DefaultExponential.Backoff(backoffIndex)) backoffIndex++ } select { case <-d.ctx.Done(): return - case <-internal.TimeAfterFunc(waitTime): + case <-internal.TimeAfterFunc(internal.TimeUntilFunc(nextResolutionTime)): } } } func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error) { - if !EnableSRVLookups { + // Skip this particular host to avoid timeouts with some versions of + // systemd-resolved. + if !EnableSRVLookups || d.host == "metadata.google.internal." { return nil, nil } var newAddrs []resolver.Address @@ -250,9 +261,9 @@ func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error) return nil, err } for _, a := range lbAddrs { - ip, ok := formatIP(a) - if !ok { - return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + ip, err := formatIP(a) + if err != nil { + return nil, fmt.Errorf("dns: error parsing A record IP address %v: %v", a, err) } addr := ip + ":" + strconv.Itoa(int(s.Port)) newAddrs = append(newAddrs, resolver.Address{Addr: addr, ServerName: s.Target}) @@ -312,9 +323,9 @@ func (d *dnsResolver) lookupHost(ctx context.Context) ([]resolver.Address, error } newAddrs := make([]resolver.Address, 0, len(addrs)) for _, a := range addrs { - ip, ok := formatIP(a) - if !ok { - return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + ip, err := formatIP(a) + if err != nil { + return nil, fmt.Errorf("dns: error parsing A record IP address %v: %v", a, err) } addr := ip + ":" + d.port newAddrs = append(newAddrs, resolver.Address{Addr: addr}) @@ -335,25 +346,25 @@ func (d *dnsResolver) lookup() (*resolver.State, error) { if len(srv) > 0 { state = grpclbstate.Set(state, &grpclbstate.State{BalancerAddresses: srv}) } - if !d.disableServiceConfig { + if d.enableServiceConfig { state.ServiceConfig = d.lookupTXT(ctx) } return &state, nil } -// formatIP returns ok = false if addr is not a valid textual representation of -// an IP address. If addr is an IPv4 address, return the addr and ok = true. +// formatIP returns an error if addr is not a valid textual representation of +// an IP address. If addr is an IPv4 address, return the addr and error = nil. // If addr is an IPv6 address, return the addr enclosed in square brackets and -// ok = true. -func formatIP(addr string) (addrIP string, ok bool) { - ip := net.ParseIP(addr) - if ip == nil { - return "", false +// error = nil. +func formatIP(addr string) (string, error) { + ip, err := netip.ParseAddr(addr) + if err != nil { + return "", err } - if ip.To4() != nil { - return addr, true + if ip.Is4() { + return addr, nil } - return "[" + addr + "]", true + return "[" + addr + "]", nil } // parseTarget takes the user input target string and default port, returns @@ -369,7 +380,7 @@ func parseTarget(target, defaultPort string) (host, port string, err error) { if target == "" { return "", "", internal.ErrMissingAddr } - if ip := net.ParseIP(target); ip != nil { + if _, err := netip.ParseAddr(target); err == nil { // target is an IPv4 or IPv6(without brackets) address return target, defaultPort, nil } @@ -417,7 +428,7 @@ func chosenByPercentage(a *int) bool { if a == nil { return true } - return grpcrand.Intn(100)+1 <= *a + return rand.IntN(100)+1 <= *a } func canaryingSC(js string) string { diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go b/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go index c7fc557d00..c0eae4f5f8 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/internal/internal.go @@ -28,7 +28,7 @@ import ( // NetResolver groups the methods on net.Resolver that are used by the DNS // resolver implementation. This allows the default net.Resolver instance to be -// overidden from tests. +// overridden from tests. type NetResolver interface { LookupHost(ctx context.Context, host string) (addrs []string, err error) LookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*net.SRV, err error) @@ -50,16 +50,23 @@ var ( // The following vars are overridden from tests. var ( - // MinResolutionRate is the minimum rate at which re-resolutions are - // allowed. This helps to prevent excessive re-resolution. - MinResolutionRate = 30 * time.Second - // TimeAfterFunc is used by the DNS resolver to wait for the given duration - // to elapse. In non-test code, this is implemented by time.After. In test + // to elapse. In non-test code, this is implemented by time.After. In test // code, this can be used to control the amount of time the resolver is // blocked waiting for the duration to elapse. TimeAfterFunc func(time.Duration) <-chan time.Time + // TimeNowFunc is used by the DNS resolver to get the current time. + // In non-test code, this is implemented by time.Now. In test code, + // this can be used to control the current time for the resolver. + TimeNowFunc func() time.Time + + // TimeUntilFunc is used by the DNS resolver to calculate the remaining + // wait time for re-resolution. In non-test code, this is implemented by + // time.Until. In test code, this can be used to control the remaining + // time for resolver to wait for re-resolution. + TimeUntilFunc func(time.Time) time.Duration + // NewNetResolver returns the net.Resolver instance for the given target. NewNetResolver func(string) (NetResolver, error) diff --git a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go index afac56572a..b901c7bace 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go +++ b/vendor/google.golang.org/grpc/internal/resolver/passthrough/passthrough.go @@ -55,7 +55,7 @@ func (r *passthroughResolver) start() { r.cc.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: r.target.Endpoint()}}}) } -func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOptions) {} +func (*passthroughResolver) ResolveNow(resolver.ResolveNowOptions) {} func (*passthroughResolver) Close() {} diff --git a/vendor/google.golang.org/grpc/internal/stats/labels.go b/vendor/google.golang.org/grpc/internal/stats/labels.go new file mode 100644 index 0000000000..fd33af51ae --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/stats/labels.go @@ -0,0 +1,42 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package stats provides internal stats related functionality. +package stats + +import "context" + +// Labels are the labels for metrics. +type Labels struct { + // TelemetryLabels are the telemetry labels to record. + TelemetryLabels map[string]string +} + +type labelsKey struct{} + +// GetLabels returns the Labels stored in the context, or nil if there is one. +func GetLabels(ctx context.Context) *Labels { + labels, _ := ctx.Value(labelsKey{}).(*Labels) + return labels +} + +// SetLabels sets the Labels in the context. +func SetLabels(ctx context.Context, labels *Labels) context.Context { + // could also append + return context.WithValue(ctx, labelsKey{}, labels) +} diff --git a/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go b/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go new file mode 100644 index 0000000000..79044657be --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/stats/metrics_recorder_list.go @@ -0,0 +1,105 @@ +/* + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package stats + +import ( + "fmt" + + estats "google.golang.org/grpc/experimental/stats" + "google.golang.org/grpc/stats" +) + +// MetricsRecorderList forwards Record calls to all of its metricsRecorders. +// +// It eats any record calls where the label values provided do not match the +// number of label keys. +type MetricsRecorderList struct { + // metricsRecorders are the metrics recorders this list will forward to. + metricsRecorders []estats.MetricsRecorder +} + +// NewMetricsRecorderList creates a new metric recorder list with all the stats +// handlers provided which implement the MetricsRecorder interface. +// If no stats handlers provided implement the MetricsRecorder interface, +// the MetricsRecorder list returned is a no-op. +func NewMetricsRecorderList(shs []stats.Handler) *MetricsRecorderList { + var mrs []estats.MetricsRecorder + for _, sh := range shs { + if mr, ok := sh.(estats.MetricsRecorder); ok { + mrs = append(mrs, mr) + } + } + return &MetricsRecorderList{ + metricsRecorders: mrs, + } +} + +func verifyLabels(desc *estats.MetricDescriptor, labelsRecv ...string) { + if got, want := len(labelsRecv), len(desc.Labels)+len(desc.OptionalLabels); got != want { + panic(fmt.Sprintf("Received %d labels in call to record metric %q, but expected %d.", got, desc.Name, want)) + } +} + +// RecordInt64Count records the measurement alongside labels on the int +// count associated with the provided handle. +func (l *MetricsRecorderList) RecordInt64Count(handle *estats.Int64CountHandle, incr int64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordInt64Count(handle, incr, labels...) + } +} + +// RecordFloat64Count records the measurement alongside labels on the float +// count associated with the provided handle. +func (l *MetricsRecorderList) RecordFloat64Count(handle *estats.Float64CountHandle, incr float64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordFloat64Count(handle, incr, labels...) + } +} + +// RecordInt64Histo records the measurement alongside labels on the int +// histo associated with the provided handle. +func (l *MetricsRecorderList) RecordInt64Histo(handle *estats.Int64HistoHandle, incr int64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordInt64Histo(handle, incr, labels...) + } +} + +// RecordFloat64Histo records the measurement alongside labels on the float +// histo associated with the provided handle. +func (l *MetricsRecorderList) RecordFloat64Histo(handle *estats.Float64HistoHandle, incr float64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordFloat64Histo(handle, incr, labels...) + } +} + +// RecordInt64Gauge records the measurement alongside labels on the int +// gauge associated with the provided handle. +func (l *MetricsRecorderList) RecordInt64Gauge(handle *estats.Int64GaugeHandle, incr int64, labels ...string) { + verifyLabels(handle.Descriptor(), labels...) + + for _, metricRecorder := range l.metricsRecorders { + metricRecorder.RecordInt64Gauge(handle, incr, labels...) + } +} diff --git a/vendor/google.golang.org/grpc/internal/status/status.go b/vendor/google.golang.org/grpc/internal/status/status.go index c7dbc82059..aad171cd02 100644 --- a/vendor/google.golang.org/grpc/internal/status/status.go +++ b/vendor/google.golang.org/grpc/internal/status/status.go @@ -138,17 +138,19 @@ func (s *Status) WithDetails(details ...protoadapt.MessageV1) (*Status, error) { // s.Code() != OK implies that s.Proto() != nil. p := s.Proto() for _, detail := range details { - any, err := anypb.New(protoadapt.MessageV2Of(detail)) + m, err := anypb.New(protoadapt.MessageV2Of(detail)) if err != nil { return nil, err } - p.Details = append(p.Details, any) + p.Details = append(p.Details, m) } return &Status{s: p}, nil } // Details returns a slice of details messages attached to the status. // If a detail cannot be decoded, the error is returned in place of the detail. +// If the detail can be decoded, the proto message returned is of the same +// type that was given to WithDetails(). func (s *Status) Details() []any { if s == nil || s.s == nil { return nil @@ -160,7 +162,38 @@ func (s *Status) Details() []any { details = append(details, err) continue } - details = append(details, detail) + // The call to MessageV1Of is required to unwrap the proto message if + // it implemented only the MessageV1 API. The proto message would have + // been wrapped in a V2 wrapper in Status.WithDetails. V2 messages are + // added to a global registry used by any.UnmarshalNew(). + // MessageV1Of has the following behaviour: + // 1. If the given message is a wrapped MessageV1, it returns the + // unwrapped value. + // 2. If the given message already implements MessageV1, it returns it + // as is. + // 3. Else, it wraps the MessageV2 in a MessageV1 wrapper. + // + // Since the Status.WithDetails() API only accepts MessageV1, calling + // MessageV1Of ensures we return the same type that was given to + // WithDetails: + // * If the give type implemented only MessageV1, the unwrapping from + // point 1 above will restore the type. + // * If the given type implemented both MessageV1 and MessageV2, point 2 + // above will ensure no wrapping is performed. + // * If the given type implemented only MessageV2 and was wrapped using + // MessageV1Of before passing to WithDetails(), it would be unwrapped + // in WithDetails by calling MessageV2Of(). Point 3 above will ensure + // that the type is wrapped in a MessageV1 wrapper again before + // returning. Note that protoc-gen-go doesn't generate code which + // implements ONLY MessageV2 at the time of writing. + // + // NOTE: Status details can also be added using the FromProto method. + // This could theoretically allow passing a Detail message that only + // implements the V2 API. In such a case the message will be wrapped in + // a MessageV1 wrapper when fetched using Details(). + // Since protoc-gen-go generates only code that implements both V1 and + // V2 APIs for backward compatibility, this is not a concern. + details = append(details, protoadapt.MessageV1Of(detail)) } return details } @@ -203,3 +236,11 @@ func IsRestrictedControlPlaneCode(s *Status) bool { } return false } + +// RawStatusProto returns the internal protobuf message for use by gRPC itself. +func RawStatusProto(s *Status) *spb.Status { + if s == nil { + return nil + } + return s.s +} diff --git a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go index 999f52cd75..54c24c2ff3 100644 --- a/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go +++ b/vendor/google.golang.org/grpc/internal/syscall/syscall_nonlinux.go @@ -58,20 +58,20 @@ func GetRusage() *Rusage { // CPUTimeDiff returns the differences of user CPU time and system CPU time used // between two Rusage structs. It a no-op function for non-linux environments. -func CPUTimeDiff(first *Rusage, latest *Rusage) (float64, float64) { +func CPUTimeDiff(*Rusage, *Rusage) (float64, float64) { log() return 0, 0 } // SetTCPUserTimeout is a no-op function under non-linux environments. -func SetTCPUserTimeout(conn net.Conn, timeout time.Duration) error { +func SetTCPUserTimeout(net.Conn, time.Duration) error { log() return nil } // GetTCPUserTimeout is a no-op function under non-linux environments. // A negative return value indicates the operation is not supported -func GetTCPUserTimeout(conn net.Conn) (int, error) { +func GetTCPUserTimeout(net.Conn) (int, error) { log() return -1, nil } diff --git a/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go b/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go index 078137b7fd..7e7aaa5463 100644 --- a/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go +++ b/vendor/google.golang.org/grpc/internal/tcp_keepalive_unix.go @@ -44,7 +44,7 @@ func NetDialerWithTCPKeepalive() *net.Dialer { // combination of unconditionally enabling TCP keepalives here, and // disabling the overriding of TCP keepalive parameters by setting the // KeepAlive field to a negative value above, results in OS defaults for - // the TCP keealive interval and time parameters. + // the TCP keepalive interval and time parameters. Control: func(_, _ string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_KEEPALIVE, 1) diff --git a/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go b/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go index fd7d43a890..d5c1085eea 100644 --- a/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go +++ b/vendor/google.golang.org/grpc/internal/tcp_keepalive_windows.go @@ -44,7 +44,7 @@ func NetDialerWithTCPKeepalive() *net.Dialer { // combination of unconditionally enabling TCP keepalives here, and // disabling the overriding of TCP keepalive parameters by setting the // KeepAlive field to a negative value above, results in OS defaults for - // the TCP keealive interval and time parameters. + // the TCP keepalive interval and time parameters. Control: func(_, _ string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_KEEPALIVE, 1) diff --git a/vendor/google.golang.org/grpc/internal/transport/client_stream.go b/vendor/google.golang.org/grpc/internal/transport/client_stream.go new file mode 100644 index 0000000000..ccc0e017e5 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/client_stream.go @@ -0,0 +1,144 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "sync/atomic" + + "golang.org/x/net/http2" + "google.golang.org/grpc/mem" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// ClientStream implements streaming functionality for a gRPC client. +type ClientStream struct { + *Stream // Embed for common stream functionality. + + ct *http2Client + done chan struct{} // closed at the end of stream to unblock writers. + doneFunc func() // invoked at the end of stream. + + headerChan chan struct{} // closed to indicate the end of header metadata. + headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. + // headerValid indicates whether a valid header was received. Only + // meaningful after headerChan is closed (always call waitOnHeader() before + // reading its value). + headerValid bool + header metadata.MD // the received header metadata + noHeaders bool // set if the client never received headers (set only after the stream is done). + + bytesReceived atomic.Bool // indicates whether any bytes have been received on this stream + unprocessed atomic.Bool // set if the server sends a refused stream or GOAWAY including this stream + + status *status.Status // the status error received from the server +} + +// Read reads an n byte message from the input stream. +func (s *ClientStream) Read(n int) (mem.BufferSlice, error) { + b, err := s.Stream.read(n) + if err == nil { + s.ct.incrMsgRecv() + } + return b, err +} + +// Close closes the stream and propagates err to any readers. +func (s *ClientStream) Close(err error) { + var ( + rst bool + rstCode http2.ErrCode + ) + if err != nil { + rst = true + rstCode = http2.ErrCodeCancel + } + s.ct.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) +} + +// Write writes the hdr and data bytes to the output stream. +func (s *ClientStream) Write(hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { + return s.ct.write(s, hdr, data, opts) +} + +// BytesReceived indicates whether any bytes have been received on this stream. +func (s *ClientStream) BytesReceived() bool { + return s.bytesReceived.Load() +} + +// Unprocessed indicates whether the server did not process this stream -- +// i.e. it sent a refused stream or GOAWAY including this stream ID. +func (s *ClientStream) Unprocessed() bool { + return s.unprocessed.Load() +} + +func (s *ClientStream) waitOnHeader() { + select { + case <-s.ctx.Done(): + // Close the stream to prevent headers/trailers from changing after + // this function returns. + s.Close(ContextErr(s.ctx.Err())) + // headerChan could possibly not be closed yet if closeStream raced + // with operateHeaders; wait until it is closed explicitly here. + <-s.headerChan + case <-s.headerChan: + } +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *ClientStream) RecvCompress() string { + s.waitOnHeader() + return s.recvCompress +} + +// Done returns a channel which is closed when it receives the final status +// from the server. +func (s *ClientStream) Done() <-chan struct{} { + return s.done +} + +// Header returns the header metadata of the stream. Acquires the key-value +// pairs of header metadata once it is available. It blocks until i) the +// metadata is ready or ii) there is no header metadata or iii) the stream is +// canceled/expired. +func (s *ClientStream) Header() (metadata.MD, error) { + s.waitOnHeader() + + if !s.headerValid || s.noHeaders { + return nil, s.status.Err() + } + + return s.header.Copy(), nil +} + +// TrailersOnly blocks until a header or trailers-only frame is received and +// then returns true if the stream was trailers-only. If the stream ends +// before headers are received, returns true, nil. +func (s *ClientStream) TrailersOnly() bool { + s.waitOnHeader() + return s.noHeaders +} + +// Status returns the status received from the server. +// Status can be read safely only after the stream has ended, +// that is, after Done() is closed. +func (s *ClientStream) Status() *status.Status { + return s.status +} diff --git a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go index 83c3829826..a2831e5d01 100644 --- a/vendor/google.golang.org/grpc/internal/transport/controlbuf.go +++ b/vendor/google.golang.org/grpc/internal/transport/controlbuf.go @@ -32,6 +32,7 @@ import ( "golang.org/x/net/http2/hpack" "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" + "google.golang.org/grpc/mem" "google.golang.org/grpc/status" ) @@ -39,6 +40,13 @@ var updateHeaderTblSize = func(e *hpack.Encoder, v uint32) { e.SetMaxDynamicTableSizeLimit(v) } +// itemNodePool is used to reduce heap allocations. +var itemNodePool = sync.Pool{ + New: func() any { + return &itemNode{} + }, +} + type itemNode struct { it any next *itemNode @@ -50,7 +58,9 @@ type itemList struct { } func (il *itemList) enqueue(i any) { - n := &itemNode{it: i} + n := itemNodePool.Get().(*itemNode) + n.next = nil + n.it = i if il.tail == nil { il.head, il.tail = n, n return @@ -70,7 +80,9 @@ func (il *itemList) dequeue() any { return nil } i := il.head.it + temp := il.head il.head = il.head.next + itemNodePool.Put(temp) if il.head == nil { il.tail = nil } @@ -145,12 +157,13 @@ type earlyAbortStream struct { func (*earlyAbortStream) isTransportResponseFrame() bool { return false } type dataFrame struct { - streamID uint32 - endStream bool - h []byte - d []byte + streamID uint32 + endStream bool + h []byte + data mem.BufferSlice + processing bool // onEachWrite is called every time - // a part of d is written out. + // a part of data is written out. onEachWrite func() } @@ -193,7 +206,7 @@ type goAway struct { code http2.ErrCode debugData []byte headsUp bool - closeConn error // if set, loopyWriter will exit, resulting in conn closure + closeConn error // if set, loopyWriter will exit with this error } func (*goAway) isTransportResponseFrame() bool { return false } @@ -233,6 +246,7 @@ type outStream struct { itl *itemList bytesOutStanding int wq *writeQuota + reader mem.Reader next *outStream prev *outStream @@ -289,18 +303,22 @@ func (l *outStreamList) dequeue() *outStream { } // controlBuffer is a way to pass information to loopy. -// Information is passed as specific struct types called control frames. -// A control frame not only represents data, messages or headers to be sent out -// but can also be used to instruct loopy to update its internal state. -// It shouldn't be confused with an HTTP2 frame, although some of the control frames -// like dataFrame and headerFrame do go out on wire as HTTP2 frames. +// +// Information is passed as specific struct types called control frames. A +// control frame not only represents data, messages or headers to be sent out +// but can also be used to instruct loopy to update its internal state. It +// shouldn't be confused with an HTTP2 frame, although some of the control +// frames like dataFrame and headerFrame do go out on wire as HTTP2 frames. type controlBuffer struct { - ch chan struct{} - done <-chan struct{} + wakeupCh chan struct{} // Unblocks readers waiting for something to read. + done <-chan struct{} // Closed when the transport is done. + + // Mutex guards all the fields below, except trfChan which can be read + // atomically without holding mu. mu sync.Mutex - consumerWaiting bool - list *itemList - err error + consumerWaiting bool // True when readers are blocked waiting for new data. + closed bool // True when the controlbuf is finished. + list *itemList // List of queued control frames. // transportResponseFrames counts the number of queued items that represent // the response of an action initiated by the peer. trfChan is created @@ -308,47 +326,59 @@ type controlBuffer struct { // closed and nilled when transportResponseFrames drops below the // threshold. Both fields are protected by mu. transportResponseFrames int - trfChan atomic.Value // chan struct{} + trfChan atomic.Pointer[chan struct{}] } func newControlBuffer(done <-chan struct{}) *controlBuffer { return &controlBuffer{ - ch: make(chan struct{}, 1), - list: &itemList{}, - done: done, + wakeupCh: make(chan struct{}, 1), + list: &itemList{}, + done: done, } } -// throttle blocks if there are too many incomingSettings/cleanupStreams in the -// controlbuf. +// throttle blocks if there are too many frames in the control buf that +// represent the response of an action initiated by the peer, like +// incomingSettings cleanupStreams etc. func (c *controlBuffer) throttle() { - ch, _ := c.trfChan.Load().(chan struct{}) - if ch != nil { + if ch := c.trfChan.Load(); ch != nil { select { - case <-ch: + case <-(*ch): case <-c.done: } } } +// put adds an item to the controlbuf. func (c *controlBuffer) put(it cbItem) error { _, err := c.executeAndPut(nil, it) return err } -func (c *controlBuffer) executeAndPut(f func(it any) bool, it cbItem) (bool, error) { - var wakeUp bool +// executeAndPut runs f, and if the return value is true, adds the given item to +// the controlbuf. The item could be nil, in which case, this method simply +// executes f and does not add the item to the controlbuf. +// +// The first return value indicates whether the item was successfully added to +// the control buffer. A non-nil error, specifically ErrConnClosing, is returned +// if the control buffer is already closed. +func (c *controlBuffer) executeAndPut(f func() bool, it cbItem) (bool, error) { c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return false, c.err + defer c.mu.Unlock() + + if c.closed { + return false, ErrConnClosing } if f != nil { - if !f(it) { // f wasn't successful - c.mu.Unlock() + if !f() { // f wasn't successful return false, nil } } + if it == nil { + return true, nil + } + + var wakeUp bool if c.consumerWaiting { wakeUp = true c.consumerWaiting = false @@ -359,98 +389,104 @@ func (c *controlBuffer) executeAndPut(f func(it any) bool, it cbItem) (bool, err if c.transportResponseFrames == maxQueuedTransportResponseFrames { // We are adding the frame that puts us over the threshold; create // a throttling channel. - c.trfChan.Store(make(chan struct{})) + ch := make(chan struct{}) + c.trfChan.Store(&ch) } } - c.mu.Unlock() if wakeUp { select { - case c.ch <- struct{}{}: + case c.wakeupCh <- struct{}{}: default: } } return true, nil } -// Note argument f should never be nil. -func (c *controlBuffer) execute(f func(it any) bool, it any) (bool, error) { - c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return false, c.err - } - if !f(it) { // f wasn't successful - c.mu.Unlock() - return false, nil - } - c.mu.Unlock() - return true, nil -} - +// get returns the next control frame from the control buffer. If block is true +// **and** there are no control frames in the control buffer, the call blocks +// until one of the conditions is met: there is a frame to return or the +// transport is closed. func (c *controlBuffer) get(block bool) (any, error) { for { c.mu.Lock() - if c.err != nil { + frame, err := c.getOnceLocked() + if frame != nil || err != nil || !block { + // If we read a frame or an error, we can return to the caller. The + // call to getOnceLocked() returns a nil frame and a nil error if + // there is nothing to read, and in that case, if the caller asked + // us not to block, we can return now as well. c.mu.Unlock() - return nil, c.err - } - if !c.list.isEmpty() { - h := c.list.dequeue().(cbItem) - if h.isTransportResponseFrame() { - if c.transportResponseFrames == maxQueuedTransportResponseFrames { - // We are removing the frame that put us over the - // threshold; close and clear the throttling channel. - ch := c.trfChan.Load().(chan struct{}) - close(ch) - c.trfChan.Store((chan struct{})(nil)) - } - c.transportResponseFrames-- - } - c.mu.Unlock() - return h, nil - } - if !block { - c.mu.Unlock() - return nil, nil + return frame, err } c.consumerWaiting = true c.mu.Unlock() + + // Release the lock above and wait to be woken up. select { - case <-c.ch: + case <-c.wakeupCh: case <-c.done: return nil, errors.New("transport closed by client") } } } +// Callers must not use this method, but should instead use get(). +// +// Caller must hold c.mu. +func (c *controlBuffer) getOnceLocked() (any, error) { + if c.closed { + return false, ErrConnClosing + } + if c.list.isEmpty() { + return nil, nil + } + h := c.list.dequeue().(cbItem) + if h.isTransportResponseFrame() { + if c.transportResponseFrames == maxQueuedTransportResponseFrames { + // We are removing the frame that put us over the + // threshold; close and clear the throttling channel. + ch := c.trfChan.Swap(nil) + close(*ch) + } + c.transportResponseFrames-- + } + return h, nil +} + +// finish closes the control buffer, cleaning up any streams that have queued +// header frames. Once this method returns, no more frames can be added to the +// control buffer, and attempts to do so will return ErrConnClosing. func (c *controlBuffer) finish() { c.mu.Lock() - if c.err != nil { - c.mu.Unlock() + defer c.mu.Unlock() + + if c.closed { return } - c.err = ErrConnClosing + c.closed = true // There may be headers for streams in the control buffer. // These streams need to be cleaned out since the transport // is still not aware of these yet. for head := c.list.dequeueAll(); head != nil; head = head.next { - hdr, ok := head.it.(*headerFrame) - if !ok { - continue - } - if hdr.onOrphaned != nil { // It will be nil on the server-side. - hdr.onOrphaned(ErrConnClosing) + switch v := head.it.(type) { + case *headerFrame: + if v.onOrphaned != nil { // It will be nil on the server-side. + v.onOrphaned(ErrConnClosing) + } + case *dataFrame: + if !v.processing { + v.data.Free() + } } } + // In case throttle() is currently in flight, it needs to be unblocked. // Otherwise, the transport may not close, since the transport is closed by // the reader encountering the connection error. - ch, _ := c.trfChan.Load().(chan struct{}) + ch := c.trfChan.Swap(nil) if ch != nil { - close(ch) + close(*ch) } - c.trfChan.Store((chan struct{})(nil)) - c.mu.Unlock() } type side int @@ -466,7 +502,7 @@ const ( // stream maintains a queue of data frames; as loopy receives data frames // it gets added to the queue of the relevant stream. // Loopy goes over this list of active streams by processing one node every iteration, -// thereby closely resemebling to a round-robin scheduling over all streams. While +// thereby closely resembling a round-robin scheduling over all streams. While // processing a stream, loopy writes out data bytes from this stream capped by the min // of http2MaxFrameLen, connection-level flow control and stream-level flow control. type loopyWriter struct { @@ -490,26 +526,29 @@ type loopyWriter struct { draining bool conn net.Conn logger *grpclog.PrefixLogger + bufferPool mem.BufferPool // Side-specific handlers ssGoAwayHandler func(*goAway) (bool, error) } -func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger) *loopyWriter { +func newLoopyWriter(s side, fr *framer, cbuf *controlBuffer, bdpEst *bdpEstimator, conn net.Conn, logger *grpclog.PrefixLogger, goAwayHandler func(*goAway) (bool, error), bufferPool mem.BufferPool) *loopyWriter { var buf bytes.Buffer l := &loopyWriter{ - side: s, - cbuf: cbuf, - sendQuota: defaultWindowSize, - oiws: defaultWindowSize, - estdStreams: make(map[uint32]*outStream), - activeStreams: newOutStreamList(), - framer: fr, - hBuf: &buf, - hEnc: hpack.NewEncoder(&buf), - bdpEst: bdpEst, - conn: conn, - logger: logger, + side: s, + cbuf: cbuf, + sendQuota: defaultWindowSize, + oiws: defaultWindowSize, + estdStreams: make(map[uint32]*outStream), + activeStreams: newOutStreamList(), + framer: fr, + hBuf: &buf, + hEnc: hpack.NewEncoder(&buf), + bdpEst: bdpEst, + conn: conn, + logger: logger, + ssGoAwayHandler: goAwayHandler, + bufferPool: bufferPool, } return l } @@ -626,10 +665,11 @@ func (l *loopyWriter) incomingSettingsHandler(s *incomingSettings) error { func (l *loopyWriter) registerStreamHandler(h *registerStream) { str := &outStream{ - id: h.streamID, - state: empty, - itl: &itemList{}, - wq: h.wq, + id: h.streamID, + state: empty, + itl: &itemList{}, + wq: h.wq, + reader: mem.BufferSlice{}.Reader(), } l.estdStreams[h.streamID] = str } @@ -661,10 +701,11 @@ func (l *loopyWriter) headerHandler(h *headerFrame) error { } // Case 2: Client wants to originate stream. str := &outStream{ - id: h.streamID, - state: empty, - itl: &itemList{}, - wq: h.wq, + id: h.streamID, + state: empty, + itl: &itemList{}, + wq: h.wq, + reader: mem.BufferSlice{}.Reader(), } return l.originateStream(str, h) } @@ -766,7 +807,15 @@ func (l *loopyWriter) cleanupStreamHandler(c *cleanupStream) error { // a RST_STREAM before stream initialization thus the stream might // not be established yet. delete(l.estdStreams, c.streamID) + str.reader.Close() str.deleteSelf() + for head := str.itl.dequeueAll(); head != nil; head = head.next { + if df, ok := head.it.(*dataFrame); ok { + if !df.processing { + df.data.Free() + } + } + } } if c.rst { // If RST_STREAM needs to be sent. if err := l.framer.fr.WriteRSTStream(c.streamID, c.rstCode); err != nil { @@ -899,19 +948,27 @@ func (l *loopyWriter) processData() (bool, error) { if str == nil { return true, nil } + reader := str.reader dataItem := str.itl.peek().(*dataFrame) // Peek at the first data item this stream. + if !dataItem.processing { + dataItem.processing = true + str.reader.Reset(dataItem.data) + dataItem.data.Free() + } // A data item is represented by a dataFrame, since it later translates into // multiple HTTP2 data frames. - // Every dataFrame has two buffers; h that keeps grpc-message header and d that is actual data. - // As an optimization to keep wire traffic low, data from d is copied to h to make as big as the - // maximum possible HTTP2 frame size. + // Every dataFrame has two buffers; h that keeps grpc-message header and data + // that is the actual message. As an optimization to keep wire traffic low, data + // from data is copied to h to make as big as the maximum possible HTTP2 frame + // size. - if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // Empty data frame + if len(dataItem.h) == 0 && reader.Remaining() == 0 { // Empty data frame // Client sends out empty data frame with endStream = true if err := l.framer.fr.WriteData(dataItem.streamID, dataItem.endStream, nil); err != nil { return false, err } str.itl.dequeue() // remove the empty data item from stream + _ = reader.Close() if str.itl.isEmpty() { str.state = empty } else if trailer, ok := str.itl.peek().(*headerFrame); ok { // the next item is trailers. @@ -926,9 +983,7 @@ func (l *loopyWriter) processData() (bool, error) { } return false, nil } - var ( - buf []byte - ) + // Figure out the maximum size we can send maxSize := http2MaxFrameLen if strQuota := int(l.oiws) - str.bytesOutStanding; strQuota <= 0 { // stream-level flow control. @@ -942,43 +997,50 @@ func (l *loopyWriter) processData() (bool, error) { } // Compute how much of the header and data we can send within quota and max frame length hSize := min(maxSize, len(dataItem.h)) - dSize := min(maxSize-hSize, len(dataItem.d)) - if hSize != 0 { - if dSize == 0 { - buf = dataItem.h - } else { - // We can add some data to grpc message header to distribute bytes more equally across frames. - // Copy on the stack to avoid generating garbage - var localBuf [http2MaxFrameLen]byte - copy(localBuf[:hSize], dataItem.h) - copy(localBuf[hSize:], dataItem.d[:dSize]) - buf = localBuf[:hSize+dSize] - } + dSize := min(maxSize-hSize, reader.Remaining()) + remainingBytes := len(dataItem.h) + reader.Remaining() - hSize - dSize + size := hSize + dSize + + var buf *[]byte + + if hSize != 0 && dSize == 0 { + buf = &dataItem.h } else { - buf = dataItem.d - } + // Note: this is only necessary because the http2.Framer does not support + // partially writing a frame, so the sequence must be materialized into a buffer. + // TODO: Revisit once https://github.com/golang/go/issues/66655 is addressed. + pool := l.bufferPool + if pool == nil { + // Note that this is only supposed to be nil in tests. Otherwise, stream is + // always initialized with a BufferPool. + pool = mem.DefaultBufferPool() + } + buf = pool.Get(size) + defer pool.Put(buf) - size := hSize + dSize + copy((*buf)[:hSize], dataItem.h) + _, _ = reader.Read((*buf)[hSize:]) + } // Now that outgoing flow controls are checked we can replenish str's write quota str.wq.replenish(size) var endStream bool // If this is the last data message on this stream and all of it can be written in this iteration. - if dataItem.endStream && len(dataItem.h)+len(dataItem.d) <= size { + if dataItem.endStream && remainingBytes == 0 { endStream = true } if dataItem.onEachWrite != nil { dataItem.onEachWrite() } - if err := l.framer.fr.WriteData(dataItem.streamID, endStream, buf[:size]); err != nil { + if err := l.framer.fr.WriteData(dataItem.streamID, endStream, (*buf)[:size]); err != nil { return false, err } str.bytesOutStanding += size l.sendQuota -= uint32(size) dataItem.h = dataItem.h[hSize:] - dataItem.d = dataItem.d[dSize:] - if len(dataItem.h) == 0 && len(dataItem.d) == 0 { // All the data from that message was written out. + if remainingBytes == 0 { // All the data from that message was written out. + _ = reader.Close() str.itl.dequeue() } if str.itl.isEmpty() { @@ -997,10 +1059,3 @@ func (l *loopyWriter) processData() (bool, error) { } return false, nil } - -func min(a, b int) int { - if a < b { - return a - } - return b -} diff --git a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go index 97198c5158..dfc0f224ec 100644 --- a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go +++ b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go @@ -92,14 +92,11 @@ func (f *trInFlow) newLimit(n uint32) uint32 { func (f *trInFlow) onData(n uint32) uint32 { f.unacked += n - if f.unacked >= f.limit/4 { - w := f.unacked - f.unacked = 0 + if f.unacked < f.limit/4 { f.updateEffectiveWindowSize() - return w + return 0 } - f.updateEffectiveWindowSize() - return 0 + return f.reset() } func (f *trInFlow) reset() uint32 { diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go index 4a3ddce29a..d954a64c38 100644 --- a/vendor/google.golang.org/grpc/internal/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -24,7 +24,6 @@ package transport import ( - "bytes" "context" "errors" "fmt" @@ -40,6 +39,7 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -50,7 +50,7 @@ import ( // NewServerHandlerTransport returns a ServerTransport handling gRPC from // inside an http.Handler, or writes an HTTP error to w and returns an error. // It requires that the http Server supports HTTP/2. -func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []stats.Handler) (ServerTransport, error) { +func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []stats.Handler, bufferPool mem.BufferPool) (ServerTransport, error) { if r.Method != http.MethodPost { w.Header().Set("Allow", http.MethodPost) msg := fmt.Sprintf("invalid gRPC request method %q", r.Method) @@ -98,6 +98,7 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s contentType: contentType, contentSubtype: contentSubtype, stats: stats, + bufferPool: bufferPool, } st.logger = prefixLoggerForServerHandlerTransport(st) @@ -171,6 +172,8 @@ type serverHandlerTransport struct { stats []stats.Handler logger *grpclog.PrefixLogger + + bufferPool mem.BufferPool } func (ht *serverHandlerTransport) Close(err error) { @@ -222,7 +225,7 @@ func (ht *serverHandlerTransport) do(fn func()) error { } } -func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error { +func (ht *serverHandlerTransport) writeStatus(s *ServerStream, st *status.Status) error { ht.writeStatusMu.Lock() defer ht.writeStatusMu.Unlock() @@ -244,6 +247,7 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro } s.hdrMu.Lock() + defer s.hdrMu.Unlock() if p := st.Proto(); p != nil && len(p.Details) > 0 { delete(s.trailer, grpcStatusDetailsBinHeader) stBytes, err := proto.Marshal(p) @@ -268,17 +272,18 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro } } } - s.hdrMu.Unlock() }) if err == nil { // transport has not been closed // Note: The trailer fields are compressed with hpack after this call returns. // No WireLength field is set here. + s.hdrMu.Lock() for _, sh := range ht.stats { sh.HandleRPC(s.Context(), &stats.OutTrailer{ Trailer: s.trailer.Copy(), }) } + s.hdrMu.Unlock() } ht.Close(errors.New("finished writing status")) return err @@ -286,14 +291,14 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro // writePendingHeaders sets common and custom headers on the first // write call (Write, WriteHeader, or WriteStatus) -func (ht *serverHandlerTransport) writePendingHeaders(s *Stream) { +func (ht *serverHandlerTransport) writePendingHeaders(s *ServerStream) { ht.writeCommonHeaders(s) ht.writeCustomHeaders(s) } // writeCommonHeaders sets common headers on the first write // call (Write, WriteHeader, or WriteStatus). -func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { +func (ht *serverHandlerTransport) writeCommonHeaders(s *ServerStream) { h := ht.rw.Header() h["Date"] = nil // suppress Date to make tests happy; TODO: restore h.Set("Content-Type", ht.contentType) @@ -314,7 +319,7 @@ func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { // writeCustomHeaders sets custom headers set on the stream via SetHeader // on the first write call (Write, WriteHeader, or WriteStatus) -func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { +func (ht *serverHandlerTransport) writeCustomHeaders(s *ServerStream) { h := ht.rw.Header() s.hdrMu.Lock() @@ -330,19 +335,31 @@ func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { s.hdrMu.Unlock() } -func (ht *serverHandlerTransport) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { +func (ht *serverHandlerTransport) write(s *ServerStream, hdr []byte, data mem.BufferSlice, _ *WriteOptions) error { + // Always take a reference because otherwise there is no guarantee the data will + // be available after this function returns. This is what callers to Write + // expect. + data.Ref() headersWritten := s.updateHeaderSent() - return ht.do(func() { + err := ht.do(func() { + defer data.Free() if !headersWritten { ht.writePendingHeaders(s) } ht.rw.Write(hdr) - ht.rw.Write(data) + for _, b := range data { + _, _ = ht.rw.Write(b.ReadOnlyData()) + } ht.rw.(http.Flusher).Flush() }) + if err != nil { + data.Free() + return err + } + return nil } -func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { +func (ht *serverHandlerTransport) writeHeader(s *ServerStream, md metadata.MD) error { if err := s.SetHeader(md); err != nil { return err } @@ -370,7 +387,7 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { return err } -func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream func(*Stream)) { +func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream func(*ServerStream)) { // With this transport type there will be exactly 1 stream: this HTTP request. var cancel context.CancelFunc if ht.timeoutSet { @@ -393,20 +410,22 @@ func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream ctx = metadata.NewIncomingContext(ctx, ht.headerMD) req := ht.req - s := &Stream{ - id: 0, // irrelevant - ctx: ctx, - requestRead: func(int) {}, + s := &ServerStream{ + Stream: &Stream{ + id: 0, // irrelevant + ctx: ctx, + requestRead: func(int) {}, + buf: newRecvBuffer(), + method: req.URL.Path, + recvCompress: req.Header.Get("grpc-encoding"), + contentSubtype: ht.contentSubtype, + }, cancel: cancel, - buf: newRecvBuffer(), st: ht, - method: req.URL.Path, - recvCompress: req.Header.Get("grpc-encoding"), - contentSubtype: ht.contentSubtype, headerWireLength: 0, // won't have access to header wire length until golang/go#18997. } s.trReader = &transportReader{ - reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf, freeBuffer: func(*bytes.Buffer) {}}, + reader: &recvBufferReader{ctx: s.ctx, ctxDone: s.ctx.Done(), recv: s.buf}, windowHandler: func(int) {}, } @@ -415,21 +434,19 @@ func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream go func() { defer close(readerDone) - // TODO: minimize garbage, optimize recvBuffer code/ownership - const readSize = 8196 - for buf := make([]byte, readSize); ; { - n, err := req.Body.Read(buf) + for { + buf := ht.bufferPool.Get(http2MaxFrameLen) + n, err := req.Body.Read(*buf) if n > 0 { - s.buf.put(recvMsg{buffer: bytes.NewBuffer(buf[:n:n])}) - buf = buf[n:] + *buf = (*buf)[:n] + s.buf.put(recvMsg{buffer: mem.NewBuffer(buf, ht.bufferPool)}) + } else { + ht.bufferPool.Put(buf) } if err != nil { s.buf.put(recvMsg{err: mapRecvMsgError(err)}) return } - if len(buf) == 0 { - buf = make([]byte, readSize) - } } }() @@ -458,11 +475,9 @@ func (ht *serverHandlerTransport) runStream() { } } -func (ht *serverHandlerTransport) IncrMsgSent() {} - -func (ht *serverHandlerTransport) IncrMsgRecv() {} +func (ht *serverHandlerTransport) incrMsgRecv() {} -func (ht *serverHandlerTransport) Drain(debugData string) { +func (ht *serverHandlerTransport) Drain(string) { panic("Drain() is not implemented") } @@ -485,5 +500,5 @@ func mapRecvMsgError(err error) error { if strings.Contains(err.Error(), "body closed by handler") { return status.Error(codes.Canceled, err.Error()) } - return connectionErrorf(true, err, err.Error()) + return connectionErrorf(true, err, "%s", err.Error()) } diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index deba0c4d9e..7cb238794f 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -43,10 +43,12 @@ import ( "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/grpcutil" imetadata "google.golang.org/grpc/internal/metadata" + "google.golang.org/grpc/internal/proxyattributes" istatus "google.golang.org/grpc/internal/status" isyscall "google.golang.org/grpc/internal/syscall" "google.golang.org/grpc/internal/transport/networktype" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/resolver" @@ -59,6 +61,8 @@ import ( // atomically. var clientConnectionCounter uint64 +var goAwayLoopyWriterTimeout = 5 * time.Second + var metadataFromOutgoingContextRaw = internal.FromOutgoingContextRaw.(func(context.Context) (metadata.MD, [][]string, bool)) // http2Client implements the ClientTransport interface with HTTP2. @@ -83,9 +87,9 @@ type http2Client struct { writerDone chan struct{} // sync point to enable testing. // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) // that the server sent GoAway on this transport. - goAway chan struct{} - - framer *framer + goAway chan struct{} + keepaliveDone chan struct{} // Closed when the keepalive goroutine exits. + framer *framer // controlBuf delivers all the control related tasks (e.g., window // updates, reset streams, and various settings) to the controller. // Do not access controlBuf with mu held. @@ -114,13 +118,13 @@ type http2Client struct { streamQuota int64 streamsQuotaAvailable chan struct{} waitingStreams uint32 - nextID uint32 registeredCompressors string // Do not access controlBuf with mu held. mu sync.Mutex // guard the following variables + nextID uint32 state transportState - activeStreams map[uint32]*Stream + activeStreams map[uint32]*ClientStream // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. prevGoAwayID uint32 // goAwayReason records the http2.ErrCode and debug data received with the @@ -144,13 +148,13 @@ type http2Client struct { onClose func(GoAwayReason) - bufferPool *bufferPool + bufferPool mem.BufferPool connectionID uint64 logger *grpclog.PrefixLogger } -func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr resolver.Address, useProxy bool, grpcUA string) (net.Conn, error) { +func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error), addr resolver.Address, grpcUA string) (net.Conn, error) { address := addr.Addr networkType, ok := networktype.Get(addr) if fn != nil { @@ -172,10 +176,10 @@ func dial(ctx context.Context, fn func(context.Context, string) (net.Conn, error return fn(ctx, address) } if !ok { - networkType, address = parseDialTarget(address) + networkType, address = ParseDialTarget(address) } - if networkType == "tcp" && useProxy { - return proxyDial(ctx, address, grpcUA) + if opts, present := proxyattributes.Get(addr); present { + return proxyDial(ctx, addr, grpcUA, opts) } return internal.NetDialerWithTCPKeepalive().DialContext(ctx, networkType, address) } @@ -196,10 +200,10 @@ func isTemporary(err error) bool { return true } -// newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 +// NewHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 // and starts to receive messages on it. Non-nil error returns if construction // fails. -func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ *http2Client, err error) { +func NewHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ ClientTransport, err error) { scheme := "http" ctx, cancel := context.WithCancel(ctx) defer func() { @@ -214,7 +218,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts // address specific arbitrary data to reach custom dialers and credential handshakers. connectCtx = icredentials.NewClientHandshakeInfoContext(connectCtx, credentials.ClientHandshakeInfo{Attributes: addr.Attributes}) - conn, err := dial(connectCtx, opts.Dialer, addr, opts.UseProxy, opts.UserAgent) + conn, err := dial(connectCtx, opts.Dialer, addr, opts.UserAgent) if err != nil { if opts.FailOnNonTempDialError { return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err) @@ -229,7 +233,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts } }(conn) - // The following defer and goroutine monitor the connectCtx for cancelation + // The following defer and goroutine monitor the connectCtx for cancellation // and deadline. On context expiration, the connection is hard closed and // this function will naturally fail as a result. Otherwise, the defer // waits for the goroutine to exit to prevent the context from being @@ -305,11 +309,9 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts scheme = "https" } } - dynamicWindow := true icwz := int32(initialWindowSize) if opts.InitialConnWindowSize >= defaultWindowSize { icwz = opts.InitialConnWindowSize - dynamicWindow = false } writeBufSize := opts.WriteBufferSize readBufSize := opts.ReadBufferSize @@ -332,10 +334,11 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts readerDone: make(chan struct{}), writerDone: make(chan struct{}), goAway: make(chan struct{}), + keepaliveDone: make(chan struct{}), framer: newFramer(conn, writeBufSize, readBufSize, opts.SharedWriteBuffer, maxHeaderListSize), fc: &trInFlow{limit: uint32(icwz)}, scheme: scheme, - activeStreams: make(map[uint32]*Stream), + activeStreams: make(map[uint32]*ClientStream), isSecure: isSecure, perRPCCreds: perRPCCreds, kp: kp, @@ -346,7 +349,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts streamQuota: defaultMaxStreamsClient, streamsQuotaAvailable: make(chan struct{}, 1), keepaliveEnabled: keepaliveEnabled, - bufferPool: newBufferPool(), + bufferPool: opts.BufferPool, onClose: onClose, } var czSecurity credentials.ChannelzSecurityValue @@ -376,9 +379,8 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts t.controlBuf = newControlBuffer(t.ctxDone) if opts.InitialWindowSize >= defaultWindowSize { t.initialWindowSize = opts.InitialWindowSize - dynamicWindow = false } - if dynamicWindow { + if !opts.StaticWindowSize { t.bdpEst = &bdpEstimator{ bdp: initialWindowSize, updateFlowControl: t.updateFlowControl, @@ -408,10 +410,10 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts readerErrCh := make(chan error, 1) go t.reader(readerErrCh) defer func() { - if err == nil { - err = <-readerErrCh - } if err != nil { + // writerDone should be closed since the loopy goroutine + // wouldn't have started in the case this function returns an error. + close(t.writerDone) t.Close(err) } }() @@ -458,8 +460,12 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts if err := t.framer.writer.Flush(); err != nil { return nil, err } + // Block until the server preface is received successfully or an error occurs. + if err = <-readerErrCh; err != nil { + return nil, err + } go func() { - t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) + t.loopy = newLoopyWriter(clientSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger, t.outgoingGoAwayHandler, t.bufferPool) if err := t.loopy.run(); !isIOError(err) { // Immediately close the connection, as the loopy writer returns // when there are no more active streams and we were draining (the @@ -472,17 +478,19 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts return t, nil } -func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { +func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *ClientStream { // TODO(zhaoq): Handle uint32 overflow of Stream.id. - s := &Stream{ - ct: t, - done: make(chan struct{}), - method: callHdr.Method, - sendCompress: callHdr.SendCompress, - buf: newRecvBuffer(), - headerChan: make(chan struct{}), - contentSubtype: callHdr.ContentSubtype, - doneFunc: callHdr.DoneFunc, + s := &ClientStream{ + Stream: &Stream{ + method: callHdr.Method, + sendCompress: callHdr.SendCompress, + buf: newRecvBuffer(), + contentSubtype: callHdr.ContentSubtype, + }, + ct: t, + done: make(chan struct{}), + headerChan: make(chan struct{}), + doneFunc: callHdr.DoneFunc, } s.wq = newWriteQuota(defaultWriteQuota, s.done) s.requestRead = func(n int) { @@ -498,9 +506,8 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { ctxDone: s.ctx.Done(), recv: s.buf, closeStream: func(err error) { - t.CloseStream(s, err) + s.Close(err) }, - freeBuffer: t.bufferPool.put, }, windowHandler: func(n int) { t.updateWindow(s, uint32(n)) @@ -517,13 +524,25 @@ func (t *http2Client) getPeer() *peer.Peer { } } +// OutgoingGoAwayHandler writes a GOAWAY to the connection. Always returns (false, err) as we want the GoAway +// to be the last frame loopy writes to the transport. +func (t *http2Client) outgoingGoAwayHandler(g *goAway) (bool, error) { + t.mu.Lock() + maxStreamID := t.nextID - 2 + t.mu.Unlock() + if err := t.framer.fr.WriteGoAway(maxStreamID, http2.ErrCodeNo, g.debugData); err != nil { + return false, err + } + return false, g.closeConn +} + func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) ([]hpack.HeaderField, error) { aud := t.createAudience(callHdr) ri := credentials.RequestInfo{ Method: callHdr.Method, AuthInfo: t.authInfo, } - ctxWithRequestInfo := icredentials.NewRequestInfoContext(ctx, ri) + ctxWithRequestInfo := credentials.NewContextWithRequestInfo(ctx, ri) authData, err := t.getTrAuthData(ctxWithRequestInfo, aud) if err != nil { return nil, err @@ -537,6 +556,19 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) // Make the slice of certain predictable size to reduce allocations made by append. hfLen := 7 // :method, :scheme, :path, :authority, content-type, user-agent, te hfLen += len(authData) + len(callAuthData) + registeredCompressors := t.registeredCompressors + if callHdr.PreviousAttempts > 0 { + hfLen++ + } + if callHdr.SendCompress != "" { + hfLen++ + } + if registeredCompressors != "" { + hfLen++ + } + if _, ok := ctx.Deadline(); ok { + hfLen++ + } headerFields := make([]hpack.HeaderField, 0, hfLen) headerFields = append(headerFields, hpack.HeaderField{Name: ":method", Value: "POST"}) headerFields = append(headerFields, hpack.HeaderField{Name: ":scheme", Value: t.scheme}) @@ -549,7 +581,6 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-previous-rpc-attempts", Value: strconv.Itoa(callHdr.PreviousAttempts)}) } - registeredCompressors := t.registeredCompressors if callHdr.SendCompress != "" { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress}) // Include the outgoing compressor name when compressor is not registered @@ -570,6 +601,9 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) // Send out timeout regardless its value. The server can detect timeout context by itself. // TODO(mmukhi): Perhaps this field should be updated when actually writing out to the wire. timeout := time.Until(dl) + if timeout <= 0 { + return nil, status.Error(codes.DeadlineExceeded, context.DeadlineExceeded.Error()) + } headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-timeout", Value: grpcutil.EncodeDuration(timeout)}) } for k, v := range authData { @@ -578,12 +612,6 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) for k, v := range callAuthData { headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } - if b := stats.OutgoingTags(ctx); b != nil { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-tags-bin", Value: encodeBinHeader(b)}) - } - if b := stats.OutgoingTrace(ctx); b != nil { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-trace-bin", Value: encodeBinHeader(b)}) - } if md, added, ok := metadataFromOutgoingContextRaw(ctx); ok { var k string @@ -719,7 +747,7 @@ func (e NewStreamError) Error() string { // NewStream creates a stream and registers it into the transport as "active" // streams. All non-nil errors returned will be *NewStreamError. -func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) { +func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*ClientStream, error) { ctx = peer.NewContext(ctx, t.getPeer()) // ServerName field of the resolver returned address takes precedence over @@ -733,6 +761,25 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, callHdr = &newCallHdr } + // The authority specified via the `CallAuthority` CallOption takes the + // highest precedence when determining the `:authority` header. It overrides + // any value present in the Host field of CallHdr. Before applying this + // override, the authority string is validated. If the credentials do not + // implement the AuthorityValidator interface, or if validation fails, the + // RPC is failed with a status code of `UNAVAILABLE`. + if callHdr.Authority != "" { + auth, ok := t.authInfo.(credentials.AuthorityValidator) + if !ok { + return nil, &NewStreamError{Err: status.Errorf(codes.Unavailable, "credentials type %q does not implement the AuthorityValidator interface, but authority override specified with CallAuthority call option", t.authInfo.AuthType())} + } + if err := auth.ValidateAuthority(callHdr.Authority); err != nil { + return nil, &NewStreamError{Err: status.Errorf(codes.Unavailable, "failed to validate authority %q : %v", callHdr.Authority, err)} + } + newCallHdr := *callHdr + newCallHdr.Host = callHdr.Authority + callHdr = &newCallHdr + } + headerFields, err := t.createHeaderFields(ctx, callHdr) if err != nil { return nil, &NewStreamError{Err: err, AllowTransparentRetry: false} @@ -744,7 +791,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return } // The stream was unprocessed by the server. - atomic.StoreUint32(&s.unprocessed, 1) + s.unprocessed.Store(true) s.write(recvMsg{err: err}) close(s.done) // If headerChan isn't closed, then close it. @@ -755,7 +802,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, hdr := &headerFrame{ hf: headerFields, endStream: false, - initStream: func(id uint32) error { + initStream: func(uint32) error { t.mu.Lock() // TODO: handle transport closure in loopy instead and remove this // initStream is never called when transport is draining. @@ -781,7 +828,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, firstTry := true var ch chan struct{} transportDrainRequired := false - checkForStreamQuota := func(it any) bool { + checkForStreamQuota := func() bool { if t.streamQuota <= 0 { // Can go negative if server decreases it. if firstTry { t.waitingStreams++ @@ -793,23 +840,24 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, t.waitingStreams-- } t.streamQuota-- - h := it.(*headerFrame) - h.streamID = t.nextID - t.nextID += 2 - // Drain client transport if nextID > MaxStreamID which signals gRPC that - // the connection is closed and a new one must be created for subsequent RPCs. - transportDrainRequired = t.nextID > MaxStreamID - - s.id = h.streamID - s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.mu.Lock() if t.state == draining || t.activeStreams == nil { // Can be niled from Close(). t.mu.Unlock() return false // Don't create a stream if the transport is already closed. } + + hdr.streamID = t.nextID + t.nextID += 2 + // Drain client transport if nextID > MaxStreamID which signals gRPC that + // the connection is closed and a new one must be created for subsequent RPCs. + transportDrainRequired = t.nextID > MaxStreamID + + s.id = hdr.streamID + s.fc = &inFlow{limit: uint32(t.initialWindowSize)} t.activeStreams[s.id] = s t.mu.Unlock() + if t.streamQuota > 0 && t.waitingStreams > 0 { select { case t.streamsQuotaAvailable <- struct{}{}: @@ -819,13 +867,12 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return true } var hdrListSizeErr error - checkForHeaderListSize := func(it any) bool { + checkForHeaderListSize := func() bool { if t.maxSendHeaderListSize == nil { return true } - hdrFrame := it.(*headerFrame) var sz int64 - for _, f := range hdrFrame.hf { + for _, f := range hdr.hf { if sz += int64(f.Size()); sz > int64(*t.maxSendHeaderListSize) { hdrListSizeErr = status.Errorf(codes.Internal, "header list size to send violates the maximum size (%d bytes) set by server", *t.maxSendHeaderListSize) return false @@ -834,8 +881,8 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return true } for { - success, err := t.controlBuf.executeAndPut(func(it any) bool { - return checkForHeaderListSize(it) && checkForStreamQuota(it) + success, err := t.controlBuf.executeAndPut(func() bool { + return checkForHeaderListSize() && checkForStreamQuota() }, hdr) if err != nil { // Connection closed. @@ -889,21 +936,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return s, nil } -// CloseStream clears the footprint of a stream when the stream is not needed any more. -// This must not be executed in reader's goroutine. -func (t *http2Client) CloseStream(s *Stream, err error) { - var ( - rst bool - rstCode http2.ErrCode - ) - if err != nil { - rst = true - rstCode = http2.ErrCodeCancel - } - t.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) -} - -func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { +func (t *http2Client) closeStream(s *ClientStream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { // Set stream status to done. if s.swapState(streamDone) == streamDone { // If it was already done, return. If multiple closeStream calls @@ -946,7 +979,7 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. rst: rst, rstCode: rstCode, } - addBackStreamQuota := func(any) bool { + addBackStreamQuota := func() bool { t.streamQuota++ if t.streamQuota > 0 && t.waitingStreams > 0 { select { @@ -966,8 +999,9 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2. // Close kicks off the shutdown process of the transport. This should be called // only once on a transport. Once it is called, the transport should not be -// accessed any more. +// accessed anymore. func (t *http2Client) Close(err error) { + t.conn.SetWriteDeadline(time.Now().Add(time.Second * 10)) t.mu.Lock() // Make sure we only close once. if t.state == closing { @@ -990,15 +1024,33 @@ func (t *http2Client) Close(err error) { // should unblock it so that the goroutine eventually exits. t.kpDormancyCond.Signal() } + // Append info about previous goaways if there were any, since this may be important + // for understanding the root cause for this connection to be closed. + goAwayDebugMessage := t.goAwayDebugMessage t.mu.Unlock() - t.controlBuf.finish() + + // Per HTTP/2 spec, a GOAWAY frame must be sent before closing the + // connection. See https://httpwg.org/specs/rfc7540.html#GOAWAY. It + // also waits for loopyWriter to be closed with a timer to avoid the + // long blocking in case the connection is blackholed, i.e. TCP is + // just stuck. + t.controlBuf.put(&goAway{code: http2.ErrCodeNo, debugData: []byte("client transport shutdown"), closeConn: err}) + timer := time.NewTimer(goAwayLoopyWriterTimeout) + defer timer.Stop() + select { + case <-t.writerDone: // success + case <-timer.C: + t.logger.Infof("Failed to write a GOAWAY frame as part of connection close after %s. Giving up and closing the transport.", goAwayLoopyWriterTimeout) + } t.cancel() t.conn.Close() + // Waits for the reader and keepalive goroutines to exit before returning to + // ensure all resources are cleaned up before Close can return. + <-t.readerDone + if t.keepaliveEnabled { + <-t.keepaliveDone + } channelz.RemoveEntry(t.channelz.ID) - // Append info about previous goaways if there were any, since this may be important - // for understanding the root cause for this connection to be closed. - _, goAwayDebugMessage := t.GetGoAwayReason() - var st *status.Status if len(goAwayDebugMessage) > 0 { st = status.Newf(codes.Unavailable, "closing transport due to: %v, received prior goaway: %v", err, goAwayDebugMessage) @@ -1047,7 +1099,7 @@ func (t *http2Client) GracefulClose() { // Write formats the data into HTTP2 data frame(s) and sends it out. The caller // should proceed only if Write returns nil. -func (t *http2Client) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { +func (t *http2Client) write(s *ClientStream, hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { if opts.Last { // If it's the last message, update stream state. if !s.compareAndSwapState(streamActive, streamWriteDone) { @@ -1060,17 +1112,24 @@ func (t *http2Client) Write(s *Stream, hdr []byte, data []byte, opts *Options) e streamID: s.id, endStream: opts.Last, h: hdr, - d: data, + data: data, } - if hdr != nil || data != nil { // If it's not an empty data frame, check quota. - if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { + dataLen := data.Len() + if hdr != nil || dataLen != 0 { // If it's not an empty data frame, check quota. + if err := s.wq.get(int32(len(hdr) + dataLen)); err != nil { return err } } - return t.controlBuf.put(df) + data.Ref() + if err := t.controlBuf.put(df); err != nil { + data.Free() + return err + } + t.incrMsgSent() + return nil } -func (t *http2Client) getStream(f http2.Frame) *Stream { +func (t *http2Client) getStream(f http2.Frame) *ClientStream { t.mu.Lock() s := t.activeStreams[f.Header().StreamID] t.mu.Unlock() @@ -1080,7 +1139,7 @@ func (t *http2Client) getStream(f http2.Frame) *Stream { // adjustWindow sends out extra window update over the initial window size // of stream if the application is requesting data larger in size than // the window. -func (t *http2Client) adjustWindow(s *Stream, n uint32) { +func (t *http2Client) adjustWindow(s *ClientStream, n uint32) { if w := s.fc.maybeAdjust(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -1089,7 +1148,7 @@ func (t *http2Client) adjustWindow(s *Stream, n uint32) { // updateWindow adjusts the inbound quota for the stream. // Window updates will be sent out when the cumulative quota // exceeds the corresponding threshold. -func (t *http2Client) updateWindow(s *Stream, n uint32) { +func (t *http2Client) updateWindow(s *ClientStream, n uint32) { if w := s.fc.onRead(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -1099,7 +1158,7 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { // for the transport and the stream based on the current bdp // estimation. func (t *http2Client) updateFlowControl(n uint32) { - updateIWS := func(any) bool { + updateIWS := func() bool { t.initialWindowSize = int32(n) t.mu.Lock() for _, s := range t.activeStreams { @@ -1172,10 +1231,13 @@ func (t *http2Client) handleData(f *http2.DataFrame) { // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? if len(f.Data()) > 0 { - buffer := t.bufferPool.get() - buffer.Reset() - buffer.Write(f.Data()) - s.write(recvMsg{buffer: buffer}) + pool := t.bufferPool + if pool == nil { + // Note that this is only supposed to be nil in tests. Otherwise, stream is + // always initialized with a BufferPool. + pool = mem.DefaultBufferPool() + } + s.write(recvMsg{buffer: mem.Copy(f.Data(), pool)}) } } // The server has closed the stream without sending trailers. Record that @@ -1192,7 +1254,7 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { } if f.ErrCode == http2.ErrCodeRefusedStream { // The stream was unprocessed by the server. - atomic.StoreUint32(&s.unprocessed, 1) + s.unprocessed.Store(true) } statusCode, ok := http2ErrConvTab[f.ErrCode] if !ok { @@ -1204,11 +1266,12 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { if statusCode == codes.Canceled { if d, ok := s.ctx.Deadline(); ok && !d.After(time.Now()) { // Our deadline was already exceeded, and that was likely the cause - // of this cancelation. Alter the status code accordingly. + // of this cancellation. Alter the status code accordingly. statusCode = codes.DeadlineExceeded } } - t.closeStream(s, io.EOF, false, http2.ErrCodeNo, status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %v", f.ErrCode), nil, false) + st := status.Newf(statusCode, "stream terminated by RST_STREAM with error code: %v", f.ErrCode) + t.closeStream(s, st.Err(), false, http2.ErrCodeNo, st, nil, false) } func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) { @@ -1252,7 +1315,7 @@ func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) { } updateFuncs = append(updateFuncs, updateStreamQuota) } - t.controlBuf.executeAndPut(func(any) bool { + t.controlBuf.executeAndPut(func() bool { for _, f := range updateFuncs { f() } @@ -1273,11 +1336,11 @@ func (t *http2Client) handlePing(f *http2.PingFrame) { t.controlBuf.put(pingAck) } -func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { +func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) error { t.mu.Lock() if t.state == closing { t.mu.Unlock() - return + return nil } if f.ErrCode == http2.ErrCodeEnhanceYourCalm && string(f.DebugData()) == "too_many_pings" { // When a client receives a GOAWAY with error code ENHANCE_YOUR_CALM and debug @@ -1289,8 +1352,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { id := f.LastStreamID if id > 0 && id%2 == 0 { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway with non-zero even-numbered numbered stream id: %v", id)) - return + return connectionErrorf(true, nil, "received goaway with non-zero even-numbered stream id: %v", id) } // A client can receive multiple GoAways from the server (see // https://github.com/grpc/grpc-go/issues/1387). The idea is that the first @@ -1307,8 +1369,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // If there are multiple GoAways the first one should always have an ID greater than the following ones. if id > t.prevGoAwayID { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway with stream id: %v, which exceeds stream id of previous goaway: %v", id, t.prevGoAwayID)) - return + return connectionErrorf(true, nil, "received goaway with stream id: %v, which exceeds stream id of previous goaway: %v", id, t.prevGoAwayID) } default: t.setGoAwayReason(f) @@ -1332,15 +1393,14 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { t.prevGoAwayID = id if len(t.activeStreams) == 0 { t.mu.Unlock() - t.Close(connectionErrorf(true, nil, "received goaway and there are no active streams")) - return + return connectionErrorf(true, nil, "received goaway and there are no active streams") } - streamsToClose := make([]*Stream, 0) + streamsToClose := make([]*ClientStream, 0) for streamID, stream := range t.activeStreams { if streamID > id && streamID <= upperLimit { // The stream was unprocessed by the server. - atomic.StoreUint32(&stream.unprocessed, 1) + stream.unprocessed.Store(true) streamsToClose = append(streamsToClose, stream) } } @@ -1350,6 +1410,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { for _, stream := range streamsToClose { t.closeStream(stream, errStreamDrain, false, http2.ErrCodeNo, statusGoAway, nil, false) } + return nil } // setGoAwayReason sets the value of t.goAwayReason based @@ -1358,8 +1419,7 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { // the caller. func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) { t.goAwayReason = GoAwayNoReason - switch f.ErrCode { - case http2.ErrCodeEnhanceYourCalm: + if f.ErrCode == http2.ErrCodeEnhanceYourCalm { if string(f.DebugData()) == "too_many_pings" { t.goAwayReason = GoAwayTooManyPings } @@ -1391,7 +1451,7 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { return } endStream := frame.StreamEnded() - atomic.StoreUint32(&s.bytesReceived, 1) + s.bytesReceived.Store(true) initialHeader := atomic.LoadUint32(&s.headerChanClosed) == 0 if !initialHeader && !endStream { @@ -1451,13 +1511,6 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { case "grpc-message": grpcMessage = decodeGrpcMessage(hf.Value) case ":status": - if hf.Value == "200" { - httpStatusErr = "" - statusCode := 200 - httpStatusCode = &statusCode - break - } - c, err := strconv.ParseInt(hf.Value, 10, 32) if err != nil { se := status.New(codes.Internal, fmt.Sprintf("transport: malformed http-status: %v", err)) @@ -1465,7 +1518,19 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { return } statusCode := int(c) + if statusCode >= 100 && statusCode < 200 { + if endStream { + se := status.New(codes.Internal, fmt.Sprintf( + "protocol error: informational header with status code %d must not have END_STREAM set", statusCode)) + t.closeStream(s, se.Err(), true, http2.ErrCodeProtocol, se, nil, endStream) + } + return + } httpStatusCode = &statusCode + if statusCode == 200 { + httpStatusErr = "" + break + } httpStatusErr = fmt.Sprintf( "unexpected HTTP status code received from server: %d (%s)", @@ -1585,7 +1650,13 @@ func (t *http2Client) readServerPreface() error { // network connection. If the server preface is not read successfully, an // error is pushed to errCh; otherwise errCh is closed with no error. func (t *http2Client) reader(errCh chan<- error) { - defer close(t.readerDone) + var errClose error + defer func() { + close(t.readerDone) + if errClose != nil { + t.Close(errClose) + } + }() if err := t.readServerPreface(); err != nil { errCh <- err @@ -1624,11 +1695,10 @@ func (t *http2Client) reader(errCh chan<- error) { t.closeStream(s, status.Error(code, msg), true, http2.ErrCodeProtocol, status.New(code, msg), nil, false) } continue - } else { - // Transport error. - t.Close(connectionErrorf(true, err, "error reading from server: %v", err)) - return } + // Transport error. + errClose = connectionErrorf(true, err, "error reading from server: %v", err) + return } switch frame := frame.(type) { case *http2.MetaHeadersFrame: @@ -1642,7 +1712,7 @@ func (t *http2Client) reader(errCh chan<- error) { case *http2.PingFrame: t.handlePing(frame) case *http2.GoAwayFrame: - t.handleGoAway(frame) + errClose = t.handleGoAway(frame) case *http2.WindowUpdateFrame: t.handleWindowUpdate(frame) default: @@ -1653,15 +1723,15 @@ func (t *http2Client) reader(errCh chan<- error) { } } -func minTime(a, b time.Duration) time.Duration { - if a < b { - return a - } - return b -} - // keepalive running in a separate goroutine makes sure the connection is alive by sending pings. func (t *http2Client) keepalive() { + var err error + defer func() { + close(t.keepaliveDone) + if err != nil { + t.Close(err) + } + }() p := &ping{data: [8]byte{}} // True iff a ping has been sent, and no data has been received since then. outstandingPing := false @@ -1685,7 +1755,7 @@ func (t *http2Client) keepalive() { continue } if outstandingPing && timeoutLeft <= 0 { - t.Close(connectionErrorf(true, nil, "keepalive ping failed to receive ACK within timeout")) + err = connectionErrorf(true, nil, "keepalive ping failed to receive ACK within timeout") return } t.mu.Lock() @@ -1727,7 +1797,7 @@ func (t *http2Client) keepalive() { // timeoutLeft. This will ensure that we wait only for kp.Time // before sending out the next ping (for cases where the ping is // acked). - sleepDuration := minTime(t.kp.Time, timeoutLeft) + sleepDuration := min(t.kp.Time, timeoutLeft) timeoutLeft -= sleepDuration timer.Reset(sleepDuration) case <-t.ctx.Done(): @@ -1756,14 +1826,18 @@ func (t *http2Client) socketMetrics() *channelz.EphemeralSocketMetrics { func (t *http2Client) RemoteAddr() net.Addr { return t.remoteAddr } -func (t *http2Client) IncrMsgSent() { - t.channelz.SocketMetrics.MessagesSent.Add(1) - t.channelz.SocketMetrics.LastMessageSentTimestamp.Store(time.Now().UnixNano()) +func (t *http2Client) incrMsgSent() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesSent.Add(1) + t.channelz.SocketMetrics.LastMessageSentTimestamp.Store(time.Now().UnixNano()) + } } -func (t *http2Client) IncrMsgRecv() { - t.channelz.SocketMetrics.MessagesReceived.Add(1) - t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Store(time.Now().UnixNano()) +func (t *http2Client) incrMsgRecv() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesReceived.Add(1) + t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Store(time.Now().UnixNano()) + } } func (t *http2Client) getOutFlowWindow() int64 { diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index d582e04710..83cee314c8 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -25,6 +25,7 @@ import ( "fmt" "io" "math" + rand "math/rand/v2" "net" "net/http" "strconv" @@ -34,16 +35,18 @@ import ( "golang.org/x/net/http2" "golang.org/x/net/http2/hpack" + "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/grpclog" "google.golang.org/grpc/internal/grpcutil" "google.golang.org/grpc/internal/pretty" + istatus "google.golang.org/grpc/internal/status" "google.golang.org/grpc/internal/syscall" + "google.golang.org/grpc/mem" "google.golang.org/protobuf/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/metadata" @@ -110,7 +113,7 @@ type http2Server struct { // already initialized since draining is already underway. drainEvent *grpcsync.Event state transportState - activeStreams map[uint32]*Stream + activeStreams map[uint32]*ServerStream // idle is the time instant when the connection went idle. // This is either the beginning of the connection or when the number of // RPCs go down to 0. @@ -119,7 +122,7 @@ type http2Server struct { // Fields below are for channelz metric collection. channelz *channelz.Socket - bufferPool *bufferPool + bufferPool mem.BufferPool connectionID uint64 @@ -129,6 +132,10 @@ type http2Server struct { maxStreamID uint32 // max stream ID ever seen logger *grpclog.PrefixLogger + // setResetPingStrikes is stored as a closure instead of making this a + // method on http2Server to avoid a heap allocation when converting a method + // to a closure for passing to frames objects. + setResetPingStrikes func() } // NewServerTransport creates a http2 transport with conn and configuration @@ -173,16 +180,13 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, Val: config.MaxStreams, }) } - dynamicWindow := true iwz := int32(initialWindowSize) if config.InitialWindowSize >= defaultWindowSize { iwz = config.InitialWindowSize - dynamicWindow = false } icwz := int32(initialWindowSize) if config.InitialConnWindowSize >= defaultWindowSize { icwz = config.InitialConnWindowSize - dynamicWindow = false } if iwz != defaultWindowSize { isettings = append(isettings, http2.Setting{ @@ -255,13 +259,16 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, inTapHandle: config.InTapHandle, fc: &trInFlow{limit: uint32(icwz)}, state: reachable, - activeStreams: make(map[uint32]*Stream), + activeStreams: make(map[uint32]*ServerStream), stats: config.StatsHandlers, kp: kp, idle: time.Now(), kep: kep, initialWindowSize: iwz, - bufferPool: newBufferPool(), + bufferPool: config.BufferPool, + } + t.setResetPingStrikes = func() { + atomic.StoreUint32(&t.resetPingStrikes, 1) } var czSecurity credentials.ChannelzSecurityValue if au, ok := authInfo.(credentials.ChannelzSecurityInfo); ok { @@ -282,7 +289,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, t.logger = prefixLoggerForServerTransport(t) t.controlBuf = newControlBuffer(t.done) - if dynamicWindow { + if !config.StaticWindowSize { t.bdpEst = &bdpEstimator{ bdp: initialWindowSize, updateFlowControl: t.updateFlowControl, @@ -330,8 +337,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, t.handleSettings(sf) go func() { - t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger) - t.loopy.ssGoAwayHandler = t.outgoingGoAwayHandler + t.loopy = newLoopyWriter(serverSide, t.framer, t.controlBuf, t.bdpEst, t.conn, t.logger, t.outgoingGoAwayHandler, t.bufferPool) err := t.loopy.run() close(t.loopyWriterDone) if !isIOError(err) { @@ -359,7 +365,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, // operateHeaders takes action on the decoded headers. Returns an error if fatal // error encountered and transport needs to close, otherwise returns nil. -func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*Stream)) error { +func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*ServerStream)) error { // Acquire max stream ID lock for entire duration t.maxStreamMu.Lock() defer t.maxStreamMu.Unlock() @@ -385,11 +391,13 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade t.maxStreamID = streamID buf := newRecvBuffer() - s := &Stream{ - id: streamID, + s := &ServerStream{ + Stream: &Stream{ + id: streamID, + buf: buf, + fc: &inFlow{limit: uint32(t.initialWindowSize)}, + }, st: t, - buf: buf, - fc: &inFlow{limit: uint32(t.initialWindowSize)}, headerWireLength: int(frame.Header().Length), } var ( @@ -537,12 +545,6 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade // Attach the received metadata to the context. if len(mdata) > 0 { s.ctx = metadata.NewIncomingContext(s.ctx, mdata) - if statsTags := mdata["grpc-tags-bin"]; len(statsTags) > 0 { - s.ctx = stats.SetIncomingTags(s.ctx, []byte(statsTags[len(statsTags)-1])) - } - if statsTrace := mdata["grpc-trace-bin"]; len(statsTrace) > 0 { - s.ctx = stats.SetIncomingTrace(s.ctx, []byte(statsTrace[len(statsTrace)-1])) - } } t.mu.Lock() if t.state != reachable { @@ -568,7 +570,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade t.logger.Infof("Aborting the stream early: %v", errMsg) } t.controlBuf.put(&earlyAbortStream{ - httpStatus: 405, + httpStatus: http.StatusMethodNotAllowed, streamID: streamID, contentSubtype: s.contentSubtype, status: status.New(codes.Internal, errMsg), @@ -589,7 +591,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade stat = status.New(codes.PermissionDenied, err.Error()) } t.controlBuf.put(&earlyAbortStream{ - httpStatus: 200, + httpStatus: http.StatusOK, streamID: s.id, contentSubtype: s.contentSubtype, status: stat, @@ -598,10 +600,41 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade return nil } } + + if s.ctx.Err() != nil { + t.mu.Unlock() + // Early abort in case the timeout was zero or so low it already fired. + t.controlBuf.put(&earlyAbortStream{ + httpStatus: http.StatusOK, + streamID: s.id, + contentSubtype: s.contentSubtype, + status: status.New(codes.DeadlineExceeded, context.DeadlineExceeded.Error()), + rst: !frame.StreamEnded(), + }) + return nil + } + t.activeStreams[streamID] = s if len(t.activeStreams) == 1 { t.idle = time.Time{} } + + // Start a timer to close the stream on reaching the deadline. + if timeoutSet { + // We need to wait for s.cancel to be updated before calling + // t.closeStream to avoid data races. + cancelUpdated := make(chan struct{}) + timer := internal.TimeAfterFunc(timeout, func() { + <-cancelUpdated + t.closeStream(s, true, http2.ErrCodeCancel, false) + }) + oldCancel := s.cancel + s.cancel = func() { + oldCancel() + timer.Stop() + } + close(cancelUpdated) + } t.mu.Unlock() if channelz.IsOn() { t.channelz.SocketMetrics.StreamsStarted.Add(1) @@ -614,10 +647,9 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade s.wq = newWriteQuota(defaultWriteQuota, s.ctxDone) s.trReader = &transportReader{ reader: &recvBufferReader{ - ctx: s.ctx, - ctxDone: s.ctxDone, - recv: s.buf, - freeBuffer: t.bufferPool.put, + ctx: s.ctx, + ctxDone: s.ctxDone, + recv: s.buf, }, windowHandler: func(n int) { t.updateWindow(s, uint32(n)) @@ -635,7 +667,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade // HandleStreams receives incoming streams using the given handler. This is // typically run in a separate goroutine. // traceCtx attaches trace to ctx and returns the new context. -func (t *http2Server) HandleStreams(ctx context.Context, handle func(*Stream)) { +func (t *http2Server) HandleStreams(ctx context.Context, handle func(*ServerStream)) { defer func() { close(t.readerDone) <-t.loopyWriterDone @@ -699,7 +731,7 @@ func (t *http2Server) HandleStreams(ctx context.Context, handle func(*Stream)) { } } -func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { +func (t *http2Server) getStream(f http2.Frame) (*ServerStream, bool) { t.mu.Lock() defer t.mu.Unlock() if t.activeStreams == nil { @@ -717,7 +749,7 @@ func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { // adjustWindow sends out extra window update over the initial window size // of stream if the application is requesting data larger in size than // the window. -func (t *http2Server) adjustWindow(s *Stream, n uint32) { +func (t *http2Server) adjustWindow(s *ServerStream, n uint32) { if w := s.fc.maybeAdjust(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -727,7 +759,7 @@ func (t *http2Server) adjustWindow(s *Stream, n uint32) { // updateWindow adjusts the inbound quota for the stream and the transport. // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. -func (t *http2Server) updateWindow(s *Stream, n uint32) { +func (t *http2Server) updateWindow(s *ServerStream, n uint32) { if w := s.fc.onRead(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w, @@ -814,10 +846,13 @@ func (t *http2Server) handleData(f *http2.DataFrame) { // guarantee f.Data() is consumed before the arrival of next frame. // Can this copy be eliminated? if len(f.Data()) > 0 { - buffer := t.bufferPool.get() - buffer.Reset() - buffer.Write(f.Data()) - s.write(recvMsg{buffer: buffer}) + pool := t.bufferPool + if pool == nil { + // Note that this is only supposed to be nil in tests. Otherwise, stream is + // always initialized with a BufferPool. + pool = mem.DefaultBufferPool() + } + s.write(recvMsg{buffer: mem.Copy(f.Data(), pool)}) } } if f.StreamEnded() { @@ -860,7 +895,7 @@ func (t *http2Server) handleSettings(f *http2.SettingsFrame) { } return nil }) - t.controlBuf.executeAndPut(func(any) bool { + t.controlBuf.executeAndPut(func() bool { for _, f := range updateFuncs { f() } @@ -961,7 +996,7 @@ func (t *http2Server) checkForHeaderListSize(it any) bool { return true } -func (t *http2Server) streamContextErr(s *Stream) error { +func (t *http2Server) streamContextErr(s *ServerStream) error { select { case <-t.done: return ErrConnClosing @@ -971,7 +1006,7 @@ func (t *http2Server) streamContextErr(s *Stream) error { } // WriteHeader sends the header metadata md back to the client. -func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { +func (t *http2Server) writeHeader(s *ServerStream, md metadata.MD) error { s.hdrMu.Lock() defer s.hdrMu.Unlock() if s.getState() == streamDone { @@ -1000,11 +1035,7 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { return nil } -func (t *http2Server) setResetPingStrikes() { - atomic.StoreUint32(&t.resetPingStrikes, 1) -} - -func (t *http2Server) writeHeaderLocked(s *Stream) error { +func (t *http2Server) writeHeaderLocked(s *ServerStream) error { // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields // first and create a slice of that exact size. headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else. @@ -1014,12 +1045,13 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress}) } headerFields = appendHeaderFieldsFromMD(headerFields, s.header) - success, err := t.controlBuf.executeAndPut(t.checkForHeaderListSize, &headerFrame{ + hf := &headerFrame{ streamID: s.id, hf: headerFields, endStream: false, onWrite: t.setResetPingStrikes, - }) + } + success, err := t.controlBuf.executeAndPut(func() bool { return t.checkForHeaderListSize(hf) }, hf) if !success { if err != nil { return err @@ -1039,11 +1071,11 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { return nil } -// WriteStatus sends stream status to the client and terminates the stream. +// writeStatus sends stream status to the client and terminates the stream. // There is no further I/O operations being able to perform on this stream. // TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early // OK is adopted. -func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { +func (t *http2Server) writeStatus(s *ServerStream, st *status.Status) error { s.hdrMu.Lock() defer s.hdrMu.Unlock() @@ -1067,7 +1099,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))}) headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())}) - if p := st.Proto(); p != nil && len(p.Details) > 0 { + if p := istatus.RawStatusProto(st); len(p.GetDetails()) > 0 { // Do not use the user's grpc-status-details-bin (if present) if we are // even attempting to set our own. delete(s.trailer, grpcStatusDetailsBinHeader) @@ -1089,7 +1121,9 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { onWrite: t.setResetPingStrikes, } - success, err := t.controlBuf.execute(t.checkForHeaderListSize, trailingHeader) + success, err := t.controlBuf.executeAndPut(func() bool { + return t.checkForHeaderListSize(trailingHeader) + }, nil) if !success { if err != nil { return err @@ -1112,9 +1146,9 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { // Write converts the data into HTTP2 data frame and sends it out. Non-nil error // is returns if it fails (e.g., framing error, transport error). -func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) error { +func (t *http2Server) write(s *ServerStream, hdr []byte, data mem.BufferSlice, _ *WriteOptions) error { if !s.isHeaderSent() { // Headers haven't been written yet. - if err := t.WriteHeader(s, nil); err != nil { + if err := t.writeHeader(s, nil); err != nil { return err } } else { @@ -1123,16 +1157,24 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) e return t.streamContextErr(s) } } + df := &dataFrame{ streamID: s.id, h: hdr, - d: data, + data: data, onEachWrite: t.setResetPingStrikes, } - if err := s.wq.get(int32(len(hdr) + len(data))); err != nil { + dataLen := data.Len() + if err := s.wq.get(int32(len(hdr) + dataLen)); err != nil { return t.streamContextErr(s) } - return t.controlBuf.put(df) + data.Ref() + if err := t.controlBuf.put(df); err != nil { + data.Free() + return err + } + t.incrMsgSent() + return nil } // keepalive running in a separate goroutine does the following: @@ -1208,7 +1250,7 @@ func (t *http2Server) keepalive() { continue } if outstandingPing && kpTimeoutLeft <= 0 { - t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Time)) + t.Close(fmt.Errorf("keepalive ping not acked within timeout %s", t.kp.Timeout)) return } if !outstandingPing { @@ -1223,7 +1265,7 @@ func (t *http2Server) keepalive() { // timeoutLeft. This will ensure that we wait only for kp.Time // before sending out the next ping (for cases where the ping is // acked). - sleepDuration := minTime(t.kp.Time, kpTimeoutLeft) + sleepDuration := min(t.kp.Time, kpTimeoutLeft) kpTimeoutLeft -= sleepDuration kpTimer.Reset(sleepDuration) case <-t.done: @@ -1261,8 +1303,7 @@ func (t *http2Server) Close(err error) { } // deleteStream deletes the stream s from transport's active streams. -func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { - +func (t *http2Server) deleteStream(s *ServerStream, eosReceived bool) { t.mu.Lock() if _, ok := t.activeStreams[s.id]; ok { delete(t.activeStreams, s.id) @@ -1282,7 +1323,7 @@ func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { } // finishStream closes the stream and puts the trailing headerFrame into controlbuf. -func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { +func (t *http2Server) finishStream(s *ServerStream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. @@ -1306,12 +1347,15 @@ func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, h } // closeStream clears the footprint of a stream when the stream is not needed any more. -func (t *http2Server) closeStream(s *Stream, rst bool, rstCode http2.ErrCode, eosReceived bool) { +func (t *http2Server) closeStream(s *ServerStream, rst bool, rstCode http2.ErrCode, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. s.cancel() + // We can't return early even if the stream's state is "done" as the state + // might have been set by the `finishStream` method. Deleting the stream via + // `finishStream` can get blocked on flow control. s.swapState(streamDone) t.deleteStream(s, eosReceived) @@ -1400,14 +1444,18 @@ func (t *http2Server) socketMetrics() *channelz.EphemeralSocketMetrics { } } -func (t *http2Server) IncrMsgSent() { - t.channelz.SocketMetrics.MessagesSent.Add(1) - t.channelz.SocketMetrics.LastMessageSentTimestamp.Add(1) +func (t *http2Server) incrMsgSent() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesSent.Add(1) + t.channelz.SocketMetrics.LastMessageSentTimestamp.Add(1) + } } -func (t *http2Server) IncrMsgRecv() { - t.channelz.SocketMetrics.MessagesReceived.Add(1) - t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Add(1) +func (t *http2Server) incrMsgRecv() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesReceived.Add(1) + t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Add(1) + } } func (t *http2Server) getOutFlowWindow() int64 { @@ -1440,7 +1488,7 @@ func getJitter(v time.Duration) time.Duration { } // Generate a jitter between +/- 10% of the value. r := int64(v / 10) - j := grpcrand.Int63n(2*r) - r + j := rand.Int64N(2*r) - r return time.Duration(j) } diff --git a/vendor/google.golang.org/grpc/internal/transport/http_util.go b/vendor/google.golang.org/grpc/internal/transport/http_util.go index 39cef3bd44..e3663f87f3 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http_util.go +++ b/vendor/google.golang.org/grpc/internal/transport/http_util.go @@ -196,11 +196,11 @@ func decodeTimeout(s string) (time.Duration, error) { if !ok { return 0, fmt.Errorf("transport: timeout unit is not recognized: %q", s) } - t, err := strconv.ParseInt(s[:size-1], 10, 64) + t, err := strconv.ParseUint(s[:size-1], 10, 64) if err != nil { return 0, err } - const maxHours = math.MaxInt64 / int64(time.Hour) + const maxHours = math.MaxInt64 / uint64(time.Hour) if d == time.Hour && t > maxHours { // This timeout would overflow math.MaxInt64; clamp it. return time.Duration(math.MaxInt64), nil @@ -317,28 +317,32 @@ func newBufWriter(conn net.Conn, batchSize int, pool *sync.Pool) *bufWriter { return w } -func (w *bufWriter) Write(b []byte) (n int, err error) { +func (w *bufWriter) Write(b []byte) (int, error) { if w.err != nil { return 0, w.err } if w.batchSize == 0 { // Buffer has been disabled. - n, err = w.conn.Write(b) + n, err := w.conn.Write(b) return n, toIOError(err) } if w.buf == nil { b := w.pool.Get().(*[]byte) w.buf = *b } + written := 0 for len(b) > 0 { - nn := copy(w.buf[w.offset:], b) - b = b[nn:] - w.offset += nn - n += nn - if w.offset >= w.batchSize { - err = w.flushKeepBuffer() + copied := copy(w.buf[w.offset:], b) + b = b[copied:] + written += copied + w.offset += copied + if w.offset < w.batchSize { + continue + } + if err := w.flushKeepBuffer(); err != nil { + return written, err } } - return n, err + return written, nil } func (w *bufWriter) Flush() error { @@ -389,7 +393,7 @@ type framer struct { fr *http2.Framer } -var writeBufferPoolMap map[int]*sync.Pool = make(map[int]*sync.Pool) +var writeBufferPoolMap = make(map[int]*sync.Pool) var writeBufferMutex sync.Mutex func newFramer(conn net.Conn, writeBufferSize, readBufferSize int, sharedWriteBuffer bool, maxHeaderListSize uint32) *framer { @@ -435,8 +439,8 @@ func getWriteBufferPool(size int) *sync.Pool { return pool } -// parseDialTarget returns the network and address to pass to dialer. -func parseDialTarget(target string) (string, string) { +// ParseDialTarget returns the network and address to pass to dialer. +func ParseDialTarget(target string) (string, string) { net := "tcp" m1 := strings.Index(target, ":") m2 := strings.Index(target, ":/") diff --git a/vendor/google.golang.org/grpc/internal/transport/proxy.go b/vendor/google.golang.org/grpc/internal/transport/proxy.go index 24fa103257..d773845955 100644 --- a/vendor/google.golang.org/grpc/internal/transport/proxy.go +++ b/vendor/google.golang.org/grpc/internal/transport/proxy.go @@ -30,34 +30,16 @@ import ( "net/url" "google.golang.org/grpc/internal" + "google.golang.org/grpc/internal/proxyattributes" + "google.golang.org/grpc/resolver" ) const proxyAuthHeaderKey = "Proxy-Authorization" -var ( - // The following variable will be overwritten in the tests. - httpProxyFromEnvironment = http.ProxyFromEnvironment -) - -func mapAddress(address string) (*url.URL, error) { - req := &http.Request{ - URL: &url.URL{ - Scheme: "https", - Host: address, - }, - } - url, err := httpProxyFromEnvironment(req) - if err != nil { - return nil, err - } - return url, nil -} - // To read a response from a net.Conn, http.ReadResponse() takes a bufio.Reader. -// It's possible that this reader reads more than what's need for the response and stores -// those bytes in the buffer. -// bufConn wraps the original net.Conn and the bufio.Reader to make sure we don't lose the -// bytes in the buffer. +// It's possible that this reader reads more than what's need for the response +// and stores those bytes in the buffer. bufConn wraps the original net.Conn +// and the bufio.Reader to make sure we don't lose the bytes in the buffer. type bufConn struct { net.Conn r io.Reader @@ -72,7 +54,7 @@ func basicAuth(username, password string) string { return base64.StdEncoding.EncodeToString([]byte(auth)) } -func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr string, proxyURL *url.URL, grpcUA string) (_ net.Conn, err error) { +func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, grpcUA string, opts proxyattributes.Options) (_ net.Conn, err error) { defer func() { if err != nil { conn.Close() @@ -81,15 +63,14 @@ func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr stri req := &http.Request{ Method: http.MethodConnect, - URL: &url.URL{Host: backendAddr}, + URL: &url.URL{Host: opts.ConnectAddr}, Header: map[string][]string{"User-Agent": {grpcUA}}, } - if t := proxyURL.User; t != nil { - u := t.Username() - p, _ := t.Password() + if user := opts.User; user != nil { + u := user.Username() + p, _ := user.Password() req.Header.Add(proxyAuthHeaderKey, "Basic "+basicAuth(u, p)) } - if err := sendHTTPRequest(ctx, req, conn); err != nil { return nil, fmt.Errorf("failed to write the HTTP request: %v", err) } @@ -107,32 +88,23 @@ func doHTTPConnectHandshake(ctx context.Context, conn net.Conn, backendAddr stri } return nil, fmt.Errorf("failed to do connect handshake, response: %q", dump) } - - return &bufConn{Conn: conn, r: r}, nil -} - -// proxyDial dials, connecting to a proxy first if necessary. Checks if a proxy -// is necessary, dials, does the HTTP CONNECT handshake, and returns the -// connection. -func proxyDial(ctx context.Context, addr string, grpcUA string) (net.Conn, error) { - newAddr := addr - proxyURL, err := mapAddress(addr) - if err != nil { - return nil, err - } - if proxyURL != nil { - newAddr = proxyURL.Host + // The buffer could contain extra bytes from the target server, so we can't + // discard it. However, in many cases where the server waits for the client + // to send the first message (e.g. when TLS is being used), the buffer will + // be empty, so we can avoid the overhead of reading through this buffer. + if r.Buffered() != 0 { + return &bufConn{Conn: conn, r: r}, nil } + return conn, nil +} - conn, err := internal.NetDialerWithTCPKeepalive().DialContext(ctx, "tcp", newAddr) +// proxyDial establishes a TCP connection to the specified address and performs an HTTP CONNECT handshake. +func proxyDial(ctx context.Context, addr resolver.Address, grpcUA string, opts proxyattributes.Options) (net.Conn, error) { + conn, err := internal.NetDialerWithTCPKeepalive().DialContext(ctx, "tcp", addr.Addr) if err != nil { return nil, err } - if proxyURL == nil { - // proxy is disabled if proxyURL is nil. - return conn, err - } - return doHTTPConnectHandshake(ctx, conn, addr, proxyURL, grpcUA) + return doHTTPConnectHandshake(ctx, conn, grpcUA, opts) } func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error { diff --git a/vendor/google.golang.org/grpc/internal/transport/server_stream.go b/vendor/google.golang.org/grpc/internal/transport/server_stream.go new file mode 100644 index 0000000000..cf8da0b52d --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/server_stream.go @@ -0,0 +1,180 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "context" + "errors" + "strings" + "sync" + "sync/atomic" + + "google.golang.org/grpc/mem" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// ServerStream implements streaming functionality for a gRPC server. +type ServerStream struct { + *Stream // Embed for common stream functionality. + + st internalServerTransport + ctxDone <-chan struct{} // closed at the end of stream. Cache of ctx.Done() (for performance) + // cancel is invoked at the end of stream to cancel ctx. It also stops the + // timer for monitoring the rpc deadline if configured. + cancel func() + + // Holds compressor names passed in grpc-accept-encoding metadata from the + // client. + clientAdvertisedCompressors string + headerWireLength int + + // hdrMu protects outgoing header and trailer metadata. + hdrMu sync.Mutex + header metadata.MD // the outgoing header metadata. Updated by WriteHeader. + headerSent atomic.Bool // atomically set when the headers are sent out. +} + +// Read reads an n byte message from the input stream. +func (s *ServerStream) Read(n int) (mem.BufferSlice, error) { + b, err := s.Stream.read(n) + if err == nil { + s.st.incrMsgRecv() + } + return b, err +} + +// SendHeader sends the header metadata for the given stream. +func (s *ServerStream) SendHeader(md metadata.MD) error { + return s.st.writeHeader(s, md) +} + +// Write writes the hdr and data bytes to the output stream. +func (s *ServerStream) Write(hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { + return s.st.write(s, hdr, data, opts) +} + +// WriteStatus sends the status of a stream to the client. WriteStatus is +// the final call made on a stream and always occurs. +func (s *ServerStream) WriteStatus(st *status.Status) error { + return s.st.writeStatus(s, st) +} + +// isHeaderSent indicates whether headers have been sent. +func (s *ServerStream) isHeaderSent() bool { + return s.headerSent.Load() +} + +// updateHeaderSent updates headerSent and returns true +// if it was already set. +func (s *ServerStream) updateHeaderSent() bool { + return s.headerSent.Swap(true) +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *ServerStream) RecvCompress() string { + return s.recvCompress +} + +// SendCompress returns the send compressor name. +func (s *ServerStream) SendCompress() string { + return s.sendCompress +} + +// ContentSubtype returns the content-subtype for a request. For example, a +// content-subtype of "proto" will result in a content-type of +// "application/grpc+proto". This will always be lowercase. See +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +func (s *ServerStream) ContentSubtype() string { + return s.contentSubtype +} + +// SetSendCompress sets the compression algorithm to the stream. +func (s *ServerStream) SetSendCompress(name string) error { + if s.isHeaderSent() || s.getState() == streamDone { + return errors.New("transport: set send compressor called after headers sent or stream done") + } + + s.sendCompress = name + return nil +} + +// SetContext sets the context of the stream. This will be deleted once the +// stats handler callouts all move to gRPC layer. +func (s *ServerStream) SetContext(ctx context.Context) { + s.ctx = ctx +} + +// ClientAdvertisedCompressors returns the compressor names advertised by the +// client via grpc-accept-encoding header. +func (s *ServerStream) ClientAdvertisedCompressors() []string { + values := strings.Split(s.clientAdvertisedCompressors, ",") + for i, v := range values { + values[i] = strings.TrimSpace(v) + } + return values +} + +// Header returns the header metadata of the stream. It returns the out header +// after t.WriteHeader is called. It does not block and must not be called +// until after WriteHeader. +func (s *ServerStream) Header() (metadata.MD, error) { + // Return the header in stream. It will be the out + // header after t.WriteHeader is called. + return s.header.Copy(), nil +} + +// HeaderWireLength returns the size of the headers of the stream as received +// from the wire. +func (s *ServerStream) HeaderWireLength() int { + return s.headerWireLength +} + +// SetHeader sets the header metadata. This can be called multiple times. +// This should not be called in parallel to other data writes. +func (s *ServerStream) SetHeader(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.isHeaderSent() || s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.header = metadata.Join(s.header, md) + s.hdrMu.Unlock() + return nil +} + +// SetTrailer sets the trailer metadata which will be sent with the RPC status +// by the server. This can be called multiple times. +// This should not be called parallel to other data writes. +func (s *ServerStream) SetTrailer(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.trailer = metadata.Join(s.trailer, md) + s.hdrMu.Unlock() + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index 0d2a6e47f6..7dd53e80a7 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -22,13 +22,11 @@ package transport import ( - "bytes" "context" "errors" "fmt" "io" "net" - "strings" "sync" "sync/atomic" "time" @@ -37,9 +35,9 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" - "google.golang.org/grpc/resolver" "google.golang.org/grpc/stats" "google.golang.org/grpc/status" "google.golang.org/grpc/tap" @@ -47,32 +45,10 @@ import ( const logLevel = 2 -type bufferPool struct { - pool sync.Pool -} - -func newBufferPool() *bufferPool { - return &bufferPool{ - pool: sync.Pool{ - New: func() any { - return new(bytes.Buffer) - }, - }, - } -} - -func (p *bufferPool) get() *bytes.Buffer { - return p.pool.Get().(*bytes.Buffer) -} - -func (p *bufferPool) put(b *bytes.Buffer) { - p.pool.Put(b) -} - // recvMsg represents the received msg from the transport. All transport // protocol specific info has been removed. type recvMsg struct { - buffer *bytes.Buffer + buffer mem.Buffer // nil: received some data // io.EOF: stream is completed. data is nil. // other non-nil error: transport failure. data is nil. @@ -102,6 +78,9 @@ func newRecvBuffer() *recvBuffer { func (b *recvBuffer) put(r recvMsg) { b.mu.Lock() if b.err != nil { + // drop the buffer on the floor. Since b.err is not nil, any subsequent reads + // will always return an error, making this buffer inaccessible. + r.buffer.Free() b.mu.Unlock() // An error had occurred earlier, don't accept more // data or errors. @@ -148,45 +127,97 @@ type recvBufferReader struct { ctx context.Context ctxDone <-chan struct{} // cache of ctx.Done() (for performance). recv *recvBuffer - last *bytes.Buffer // Stores the remaining data in the previous calls. + last mem.Buffer // Stores the remaining data in the previous calls. err error - freeBuffer func(*bytes.Buffer) } -// Read reads the next len(p) bytes from last. If last is drained, it tries to -// read additional data from recv. It blocks if there no additional data available -// in recv. If Read returns any non-nil error, it will continue to return that error. -func (r *recvBufferReader) Read(p []byte) (n int, err error) { +func (r *recvBufferReader) ReadMessageHeader(header []byte) (n int, err error) { if r.err != nil { return 0, r.err } if r.last != nil { - // Read remaining data left in last call. - copied, _ := r.last.Read(p) - if r.last.Len() == 0 { - r.freeBuffer(r.last) + n, r.last = mem.ReadUnsafe(header, r.last) + return n, nil + } + if r.closeStream != nil { + n, r.err = r.readMessageHeaderClient(header) + } else { + n, r.err = r.readMessageHeader(header) + } + return n, r.err +} + +// Read reads the next n bytes from last. If last is drained, it tries to read +// additional data from recv. It blocks if there no additional data available in +// recv. If Read returns any non-nil error, it will continue to return that +// error. +func (r *recvBufferReader) Read(n int) (buf mem.Buffer, err error) { + if r.err != nil { + return nil, r.err + } + if r.last != nil { + buf = r.last + if r.last.Len() > n { + buf, r.last = mem.SplitUnsafe(buf, n) + } else { r.last = nil } - return copied, nil + return buf, nil } if r.closeStream != nil { - n, r.err = r.readClient(p) + buf, r.err = r.readClient(n) } else { - n, r.err = r.read(p) + buf, r.err = r.read(n) } - return n, r.err + return buf, r.err } -func (r *recvBufferReader) read(p []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeader(header []byte) (n int, err error) { select { case <-r.ctxDone: return 0, ContextErr(r.ctx.Err()) case m := <-r.recv.get(): - return r.readAdditional(m, p) + return r.readMessageHeaderAdditional(m, header) + } +} + +func (r *recvBufferReader) read(n int) (buf mem.Buffer, err error) { + select { + case <-r.ctxDone: + return nil, ContextErr(r.ctx.Err()) + case m := <-r.recv.get(): + return r.readAdditional(m, n) + } +} + +func (r *recvBufferReader) readMessageHeaderClient(header []byte) (n int, err error) { + // If the context is canceled, then closes the stream with nil metadata. + // closeStream writes its error parameter to r.recv as a recvMsg. + // r.readAdditional acts on that message and returns the necessary error. + select { + case <-r.ctxDone: + // Note that this adds the ctx error to the end of recv buffer, and + // reads from the head. This will delay the error until recv buffer is + // empty, thus will delay ctx cancellation in Recv(). + // + // It's done this way to fix a race between ctx cancel and trailer. The + // race was, stream.Recv() may return ctx error if ctxDone wins the + // race, but stream.Trailer() may return a non-nil md because the stream + // was not marked as done when trailer is received. This closeStream + // call will mark stream as done, thus fix the race. + // + // TODO: delaying ctx error seems like a unnecessary side effect. What + // we really want is to mark the stream as done, and return ctx error + // faster. + r.closeStream(ContextErr(r.ctx.Err())) + m := <-r.recv.get() + return r.readMessageHeaderAdditional(m, header) + case m := <-r.recv.get(): + return r.readMessageHeaderAdditional(m, header) } } -func (r *recvBufferReader) readClient(p []byte) (n int, err error) { +func (r *recvBufferReader) readClient(n int) (buf mem.Buffer, err error) { // If the context is canceled, then closes the stream with nil metadata. // closeStream writes its error parameter to r.recv as a recvMsg. // r.readAdditional acts on that message and returns the necessary error. @@ -207,25 +238,40 @@ func (r *recvBufferReader) readClient(p []byte) (n int, err error) { // faster. r.closeStream(ContextErr(r.ctx.Err())) m := <-r.recv.get() - return r.readAdditional(m, p) + return r.readAdditional(m, n) case m := <-r.recv.get(): - return r.readAdditional(m, p) + return r.readAdditional(m, n) } } -func (r *recvBufferReader) readAdditional(m recvMsg, p []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeaderAdditional(m recvMsg, header []byte) (n int, err error) { r.recv.load() if m.err != nil { + if m.buffer != nil { + m.buffer.Free() + } return 0, m.err } - copied, _ := m.buffer.Read(p) - if m.buffer.Len() == 0 { - r.freeBuffer(m.buffer) - r.last = nil - } else { - r.last = m.buffer + + n, r.last = mem.ReadUnsafe(header, m.buffer) + + return n, nil +} + +func (r *recvBufferReader) readAdditional(m recvMsg, n int) (b mem.Buffer, err error) { + r.recv.load() + if m.err != nil { + if m.buffer != nil { + m.buffer.Free() + } + return nil, m.err + } + + if m.buffer.Len() > n { + m.buffer, r.last = mem.SplitUnsafe(m.buffer, n) } - return copied, nil + + return m.buffer, nil } type streamState uint32 @@ -240,73 +286,26 @@ const ( // Stream represents an RPC in the transport layer. type Stream struct { id uint32 - st ServerTransport // nil for client side Stream - ct *http2Client // nil for server side Stream - ctx context.Context // the associated context of the stream - cancel context.CancelFunc // always nil for client side Stream - done chan struct{} // closed at the end of stream to unblock writers. On the client side. - doneFunc func() // invoked at the end of stream on client side. - ctxDone <-chan struct{} // same as done chan but for server side. Cache of ctx.Done() (for performance) - method string // the associated RPC method of the stream + ctx context.Context // the associated context of the stream + method string // the associated RPC method of the stream recvCompress string sendCompress string buf *recvBuffer - trReader io.Reader + trReader *transportReader fc *inFlow wq *writeQuota - // Holds compressor names passed in grpc-accept-encoding metadata from the - // client. This is empty for the client side stream. - clientAdvertisedCompressors string // Callback to state application's intentions to read data. This // is used to adjust flow control, if needed. requestRead func(int) - headerChan chan struct{} // closed to indicate the end of header metadata. - headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. - // headerValid indicates whether a valid header was received. Only - // meaningful after headerChan is closed (always call waitOnHeader() before - // reading its value). Not valid on server side. - headerValid bool - headerWireLength int // Only set on server side. - - // hdrMu protects header and trailer metadata on the server-side. - hdrMu sync.Mutex - // On client side, header keeps the received header metadata. - // - // On server side, header keeps the header set by SetHeader(). The complete - // header will merged into this after t.WriteHeader() is called. - header metadata.MD - trailer metadata.MD // the key-value map of trailer metadata. - - noHeaders bool // set if the client never received headers (set only after the stream is done). - - // On the server-side, headerSent is atomically set to 1 when the headers are sent out. - headerSent uint32 - state streamState - // On client-side it is the status error received from the server. - // On server-side it is unused. - status *status.Status - - bytesReceived uint32 // indicates whether any bytes have been received on this stream - unprocessed uint32 // set if the server sends a refused stream or GOAWAY including this stream - // contentSubtype is the content-subtype for requests. // this must be lowercase or the behavior is undefined. contentSubtype string -} -// isHeaderSent is only valid on the server-side. -func (s *Stream) isHeaderSent() bool { - return atomic.LoadUint32(&s.headerSent) == 1 -} - -// updateHeaderSent updates headerSent and returns true -// if it was alreay set. It is valid only on server-side. -func (s *Stream) updateHeaderSent() bool { - return atomic.SwapUint32(&s.headerSent, 1) == 1 + trailer metadata.MD // the key-value map of trailer metadata. } func (s *Stream) swapState(st streamState) streamState { @@ -321,110 +320,12 @@ func (s *Stream) getState() streamState { return streamState(atomic.LoadUint32((*uint32)(&s.state))) } -func (s *Stream) waitOnHeader() { - if s.headerChan == nil { - // On the server headerChan is always nil since a stream originates - // only after having received headers. - return - } - select { - case <-s.ctx.Done(): - // Close the stream to prevent headers/trailers from changing after - // this function returns. - s.ct.CloseStream(s, ContextErr(s.ctx.Err())) - // headerChan could possibly not be closed yet if closeStream raced - // with operateHeaders; wait until it is closed explicitly here. - <-s.headerChan - case <-s.headerChan: - } -} - -// RecvCompress returns the compression algorithm applied to the inbound -// message. It is empty string if there is no compression applied. -func (s *Stream) RecvCompress() string { - s.waitOnHeader() - return s.recvCompress -} - -// SetSendCompress sets the compression algorithm to the stream. -func (s *Stream) SetSendCompress(name string) error { - if s.isHeaderSent() || s.getState() == streamDone { - return errors.New("transport: set send compressor called after headers sent or stream done") - } - - s.sendCompress = name - return nil -} - -// SendCompress returns the send compressor name. -func (s *Stream) SendCompress() string { - return s.sendCompress -} - -// ClientAdvertisedCompressors returns the compressor names advertised by the -// client via grpc-accept-encoding header. -func (s *Stream) ClientAdvertisedCompressors() []string { - values := strings.Split(s.clientAdvertisedCompressors, ",") - for i, v := range values { - values[i] = strings.TrimSpace(v) - } - return values -} - -// Done returns a channel which is closed when it receives the final status -// from the server. -func (s *Stream) Done() <-chan struct{} { - return s.done -} - -// Header returns the header metadata of the stream. -// -// On client side, it acquires the key-value pairs of header metadata once it is -// available. It blocks until i) the metadata is ready or ii) there is no header -// metadata or iii) the stream is canceled/expired. -// -// On server side, it returns the out header after t.WriteHeader is called. It -// does not block and must not be called until after WriteHeader. -func (s *Stream) Header() (metadata.MD, error) { - if s.headerChan == nil { - // On server side, return the header in stream. It will be the out - // header after t.WriteHeader is called. - return s.header.Copy(), nil - } - s.waitOnHeader() - - if !s.headerValid || s.noHeaders { - return nil, s.status.Err() - } - - return s.header.Copy(), nil -} - -// TrailersOnly blocks until a header or trailers-only frame is received and -// then returns true if the stream was trailers-only. If the stream ends -// before headers are received, returns true, nil. Client-side only. -func (s *Stream) TrailersOnly() bool { - s.waitOnHeader() - return s.noHeaders -} - -// Trailer returns the cached trailer metedata. Note that if it is not called -// after the entire stream is done, it could return an empty MD. Client -// side only. +// Trailer returns the cached trailer metadata. Note that if it is not called +// after the entire stream is done, it could return an empty MD. // It can be safely read only after stream has ended that is either read // or write have returned io.EOF. func (s *Stream) Trailer() metadata.MD { - c := s.trailer.Copy() - return c -} - -// ContentSubtype returns the content-subtype for a request. For example, a -// content-subtype of "proto" will result in a content-type of -// "application/grpc+proto". This will always be lowercase. See -// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for -// more details. -func (s *Stream) ContentSubtype() string { - return s.contentSubtype + return s.trailer.Copy() } // Context returns the context of the stream. @@ -432,114 +333,104 @@ func (s *Stream) Context() context.Context { return s.ctx } -// SetContext sets the context of the stream. This will be deleted once the -// stats handler callouts all move to gRPC layer. -func (s *Stream) SetContext(ctx context.Context) { - s.ctx = ctx -} - // Method returns the method for the stream. func (s *Stream) Method() string { return s.method } -// Status returns the status received from the server. -// Status can be read safely only after the stream has ended, -// that is, after Done() is closed. -func (s *Stream) Status() *status.Status { - return s.status -} - -// HeaderWireLength returns the size of the headers of the stream as received -// from the wire. Valid only on the server. -func (s *Stream) HeaderWireLength() int { - return s.headerWireLength -} - -// SetHeader sets the header metadata. This can be called multiple times. -// Server side only. -// This should not be called in parallel to other data writes. -func (s *Stream) SetHeader(md metadata.MD) error { - if md.Len() == 0 { - return nil - } - if s.isHeaderSent() || s.getState() == streamDone { - return ErrIllegalHeaderWrite - } - s.hdrMu.Lock() - s.header = metadata.Join(s.header, md) - s.hdrMu.Unlock() - return nil -} - -// SendHeader sends the given header metadata. The given metadata is -// combined with any metadata set by previous calls to SetHeader and -// then written to the transport stream. -func (s *Stream) SendHeader(md metadata.MD) error { - return s.st.WriteHeader(s, md) +func (s *Stream) write(m recvMsg) { + s.buf.put(m) } -// SetTrailer sets the trailer metadata which will be sent with the RPC status -// by the server. This can be called multiple times. Server side only. -// This should not be called parallel to other data writes. -func (s *Stream) SetTrailer(md metadata.MD) error { - if md.Len() == 0 { - return nil +// ReadMessageHeader reads data into the provided header slice from the stream. +// It first checks if there was an error during a previous read operation and +// returns it if present. It then requests a read operation for the length of +// the header. It continues to read from the stream until the entire header +// slice is filled or an error occurs. If an `io.EOF` error is encountered with +// partially read data, it is converted to `io.ErrUnexpectedEOF` to indicate an +// unexpected end of the stream. The method returns any error encountered during +// the read process or nil if the header was successfully read. +func (s *Stream) ReadMessageHeader(header []byte) (err error) { + // Don't request a read if there was an error earlier + if er := s.trReader.er; er != nil { + return er } - if s.getState() == streamDone { - return ErrIllegalHeaderWrite + s.requestRead(len(header)) + for len(header) != 0 { + n, err := s.trReader.ReadMessageHeader(header) + header = header[n:] + if len(header) == 0 { + err = nil + } + if err != nil { + if n > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + return err + } } - s.hdrMu.Lock() - s.trailer = metadata.Join(s.trailer, md) - s.hdrMu.Unlock() return nil } -func (s *Stream) write(m recvMsg) { - s.buf.put(m) -} - -// Read reads all p bytes from the wire for this stream. -func (s *Stream) Read(p []byte) (n int, err error) { +// Read reads n bytes from the wire for this stream. +func (s *Stream) read(n int) (data mem.BufferSlice, err error) { // Don't request a read if there was an error earlier - if er := s.trReader.(*transportReader).er; er != nil { - return 0, er + if er := s.trReader.er; er != nil { + return nil, er + } + s.requestRead(n) + for n != 0 { + buf, err := s.trReader.Read(n) + var bufLen int + if buf != nil { + bufLen = buf.Len() + } + n -= bufLen + if n == 0 { + err = nil + } + if err != nil { + if bufLen > 0 && err == io.EOF { + err = io.ErrUnexpectedEOF + } + data.Free() + return nil, err + } + data = append(data, buf) } - s.requestRead(len(p)) - return io.ReadFull(s.trReader, p) + return data, nil } -// tranportReader reads all the data available for this Stream from the transport and +// transportReader reads all the data available for this Stream from the transport and // passes them into the decoder, which converts them into a gRPC message stream. // The error is io.EOF when the stream is done or another non-nil error if // the stream broke. type transportReader struct { - reader io.Reader + reader *recvBufferReader // The handler to control the window update procedure for both this // particular stream and the associated transport. windowHandler func(int) er error } -func (t *transportReader) Read(p []byte) (n int, err error) { - n, err = t.reader.Read(p) +func (t *transportReader) ReadMessageHeader(header []byte) (int, error) { + n, err := t.reader.ReadMessageHeader(header) if err != nil { t.er = err - return + return 0, err } t.windowHandler(n) - return -} - -// BytesReceived indicates whether any bytes have been received on this stream. -func (s *Stream) BytesReceived() bool { - return atomic.LoadUint32(&s.bytesReceived) == 1 + return n, nil } -// Unprocessed indicates whether the server did not process this stream -- -// i.e. it sent a refused stream or GOAWAY including this stream ID. -func (s *Stream) Unprocessed() bool { - return atomic.LoadUint32(&s.unprocessed) == 1 +func (t *transportReader) Read(n int) (mem.Buffer, error) { + buf, err := t.reader.Read(n) + if err != nil { + t.er = err + return buf, err + } + t.windowHandler(buf.Len()) + return buf, nil } // GoString is implemented by Stream so context.String() won't @@ -574,6 +465,8 @@ type ServerConfig struct { ChannelzParent *channelz.Server MaxHeaderListSize *uint32 HeaderTableSize *uint32 + BufferPool mem.BufferPool + StaticWindowSize bool } // ConnectOptions covers all relevant options for communicating with the server. @@ -610,19 +503,15 @@ type ConnectOptions struct { ChannelzParent *channelz.SubChannel // MaxHeaderListSize sets the max (uncompressed) size of header list that is prepared to be received. MaxHeaderListSize *uint32 - // UseProxy specifies if a proxy should be used. - UseProxy bool -} - -// NewClientTransport establishes the transport with the required ConnectOptions -// and returns it to the caller. -func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (ClientTransport, error) { - return newHTTP2Client(connectCtx, ctx, addr, opts, onClose) + // The mem.BufferPool to use when reading/writing to the wire. + BufferPool mem.BufferPool + // StaticWindowSize controls whether dynamic window sizing is enabled. + StaticWindowSize bool } -// Options provides additional hints and information for message +// WriteOptions provides additional hints and information for message // transmission. -type Options struct { +type WriteOptions struct { // Last indicates whether this write is the last piece for // this stream. Last bool @@ -654,6 +543,11 @@ type CallHdr struct { PreviousAttempts int // value of grpc-previous-rpc-attempts header to set DoneFunc func() // called when the stream is finished + + // Authority is used to explicitly override the `:authority` header. If set, + // this value takes precedence over the Host field and will be used as the + // value for the `:authority` header. + Authority string } // ClientTransport is the common interface for all gRPC client-side transport @@ -671,18 +565,8 @@ type ClientTransport interface { // It does not block. GracefulClose() - // Write sends the data for the given stream. A nil stream indicates - // the write is to be performed on the transport as a whole. - Write(s *Stream, hdr []byte, data []byte, opts *Options) error - // NewStream creates a Stream for an RPC. - NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) - - // CloseStream clears the footprint of a stream when the stream is - // not needed any more. The err indicates the error incurred when - // CloseStream is called. Must be called when a stream is finished - // unless the associated transport is closing. - CloseStream(stream *Stream, err error) + NewStream(ctx context.Context, callHdr *CallHdr) (*ClientStream, error) // Error returns a channel that is closed when some I/O error // happens. Typically the caller should have a goroutine to monitor @@ -702,12 +586,6 @@ type ClientTransport interface { // RemoteAddr returns the remote network address. RemoteAddr() net.Addr - - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() - - // IncrMsgRecv increments the number of message received through this transport. - IncrMsgRecv() } // ServerTransport is the common interface for all gRPC server-side transport @@ -717,19 +595,7 @@ type ClientTransport interface { // Write methods for a given Stream will be called serially. type ServerTransport interface { // HandleStreams receives incoming streams using the given handler. - HandleStreams(context.Context, func(*Stream)) - - // WriteHeader sends the header metadata for the given stream. - // WriteHeader may not be called on all streams. - WriteHeader(s *Stream, md metadata.MD) error - - // Write sends the data for the given stream. - // Write may not be called on all streams. - Write(s *Stream, hdr []byte, data []byte, opts *Options) error - - // WriteStatus sends the status of a stream to the client. WriteStatus is - // the final call made on a stream and always occurs. - WriteStatus(s *Stream, st *status.Status) error + HandleStreams(context.Context, func(*ServerStream)) // Close tears down the transport. Once it is called, the transport // should not be accessed any more. All the pending streams and their @@ -741,12 +607,14 @@ type ServerTransport interface { // Drain notifies the client this ServerTransport stops accepting new RPCs. Drain(debugData string) +} - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() - - // IncrMsgRecv increments the number of message received through this transport. - IncrMsgRecv() +type internalServerTransport interface { + ServerTransport + writeHeader(s *ServerStream, md metadata.MD) error + write(s *ServerStream, hdr []byte, data mem.BufferSlice, opts *WriteOptions) error + writeStatus(s *ServerStream, st *status.Status) error + incrMsgRecv() } // connectionErrorf creates an ConnectionError with the specified error description. @@ -798,7 +666,7 @@ var ( // connection is draining. This could be caused by goaway or balancer // removing the address. errStreamDrain = status.Error(codes.Unavailable, "the connection is draining") - // errStreamDone is returned from write at the client side to indiacte application + // errStreamDone is returned from write at the client side to indicate application // layer of an error. errStreamDone = errors.New("the stream is done") // StatusGoAway indicates that the server sent a GOAWAY that included this diff --git a/vendor/google.golang.org/grpc/keepalive/keepalive.go b/vendor/google.golang.org/grpc/keepalive/keepalive.go index 34d31b5e7d..eb42b19fb9 100644 --- a/vendor/google.golang.org/grpc/keepalive/keepalive.go +++ b/vendor/google.golang.org/grpc/keepalive/keepalive.go @@ -34,15 +34,29 @@ type ClientParameters struct { // After a duration of this time if the client doesn't see any activity it // pings the server to see if the transport is still alive. // If set below 10s, a minimum value of 10s will be used instead. - Time time.Duration // The current default value is infinity. + // + // Note that gRPC servers have a default EnforcementPolicy.MinTime of 5 + // minutes (which means the client shouldn't ping more frequently than every + // 5 minutes). + // + // Though not ideal, it's not a strong requirement for Time to be less than + // EnforcementPolicy.MinTime. Time will automatically double if the server + // disconnects due to its enforcement policy. + // + // For more details, see + // https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md + Time time.Duration // After having pinged for keepalive check, the client waits for a duration // of Timeout and if no activity is seen even after that the connection is // closed. - Timeout time.Duration // The current default value is 20 seconds. + // + // If keepalive is enabled, and this value is not explicitly set, the default + // is 20 seconds. + Timeout time.Duration // If true, client sends keepalive pings even with no active RPCs. If false, // when there are no active RPCs, Time and Timeout will be ignored and no // keepalive pings will be sent. - PermitWithoutStream bool // false by default. + PermitWithoutStream bool } // ServerParameters is used to set keepalive and max-age parameters on the diff --git a/vendor/google.golang.org/grpc/mem/buffer_pool.go b/vendor/google.golang.org/grpc/mem/buffer_pool.go new file mode 100644 index 0000000000..c37c58c023 --- /dev/null +++ b/vendor/google.golang.org/grpc/mem/buffer_pool.go @@ -0,0 +1,194 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package mem + +import ( + "sort" + "sync" + + "google.golang.org/grpc/internal" +) + +// BufferPool is a pool of buffers that can be shared and reused, resulting in +// decreased memory allocation. +type BufferPool interface { + // Get returns a buffer with specified length from the pool. + Get(length int) *[]byte + + // Put returns a buffer to the pool. + Put(*[]byte) +} + +var defaultBufferPoolSizes = []int{ + 256, + 4 << 10, // 4KB (go page size) + 16 << 10, // 16KB (max HTTP/2 frame size used by gRPC) + 32 << 10, // 32KB (default buffer size for io.Copy) + 1 << 20, // 1MB +} + +var defaultBufferPool BufferPool + +func init() { + defaultBufferPool = NewTieredBufferPool(defaultBufferPoolSizes...) + + internal.SetDefaultBufferPoolForTesting = func(pool BufferPool) { + defaultBufferPool = pool + } + + internal.SetBufferPoolingThresholdForTesting = func(threshold int) { + bufferPoolingThreshold = threshold + } +} + +// DefaultBufferPool returns the current default buffer pool. It is a BufferPool +// created with NewBufferPool that uses a set of default sizes optimized for +// expected workflows. +func DefaultBufferPool() BufferPool { + return defaultBufferPool +} + +// NewTieredBufferPool returns a BufferPool implementation that uses multiple +// underlying pools of the given pool sizes. +func NewTieredBufferPool(poolSizes ...int) BufferPool { + sort.Ints(poolSizes) + pools := make([]*sizedBufferPool, len(poolSizes)) + for i, s := range poolSizes { + pools[i] = newSizedBufferPool(s) + } + return &tieredBufferPool{ + sizedPools: pools, + } +} + +// tieredBufferPool implements the BufferPool interface with multiple tiers of +// buffer pools for different sizes of buffers. +type tieredBufferPool struct { + sizedPools []*sizedBufferPool + fallbackPool simpleBufferPool +} + +func (p *tieredBufferPool) Get(size int) *[]byte { + return p.getPool(size).Get(size) +} + +func (p *tieredBufferPool) Put(buf *[]byte) { + p.getPool(cap(*buf)).Put(buf) +} + +func (p *tieredBufferPool) getPool(size int) BufferPool { + poolIdx := sort.Search(len(p.sizedPools), func(i int) bool { + return p.sizedPools[i].defaultSize >= size + }) + + if poolIdx == len(p.sizedPools) { + return &p.fallbackPool + } + + return p.sizedPools[poolIdx] +} + +// sizedBufferPool is a BufferPool implementation that is optimized for specific +// buffer sizes. For example, HTTP/2 frames within gRPC have a default max size +// of 16kb and a sizedBufferPool can be configured to only return buffers with a +// capacity of 16kb. Note that however it does not support returning larger +// buffers and in fact panics if such a buffer is requested. Because of this, +// this BufferPool implementation is not meant to be used on its own and rather +// is intended to be embedded in a tieredBufferPool such that Get is only +// invoked when the required size is smaller than or equal to defaultSize. +type sizedBufferPool struct { + pool sync.Pool + defaultSize int +} + +func (p *sizedBufferPool) Get(size int) *[]byte { + buf := p.pool.Get().(*[]byte) + b := *buf + clear(b[:cap(b)]) + *buf = b[:size] + return buf +} + +func (p *sizedBufferPool) Put(buf *[]byte) { + if cap(*buf) < p.defaultSize { + // Ignore buffers that are too small to fit in the pool. Otherwise, when + // Get is called it will panic as it tries to index outside the bounds + // of the buffer. + return + } + p.pool.Put(buf) +} + +func newSizedBufferPool(size int) *sizedBufferPool { + return &sizedBufferPool{ + pool: sync.Pool{ + New: func() any { + buf := make([]byte, size) + return &buf + }, + }, + defaultSize: size, + } +} + +var _ BufferPool = (*simpleBufferPool)(nil) + +// simpleBufferPool is an implementation of the BufferPool interface that +// attempts to pool buffers with a sync.Pool. When Get is invoked, it tries to +// acquire a buffer from the pool but if that buffer is too small, it returns it +// to the pool and creates a new one. +type simpleBufferPool struct { + pool sync.Pool +} + +func (p *simpleBufferPool) Get(size int) *[]byte { + bs, ok := p.pool.Get().(*[]byte) + if ok && cap(*bs) >= size { + *bs = (*bs)[:size] + return bs + } + + // A buffer was pulled from the pool, but it is too small. Put it back in + // the pool and create one large enough. + if ok { + p.pool.Put(bs) + } + + b := make([]byte, size) + return &b +} + +func (p *simpleBufferPool) Put(buf *[]byte) { + p.pool.Put(buf) +} + +var _ BufferPool = NopBufferPool{} + +// NopBufferPool is a buffer pool that returns new buffers without pooling. +type NopBufferPool struct{} + +// Get returns a buffer with specified length from the pool. +func (NopBufferPool) Get(length int) *[]byte { + b := make([]byte, length) + return &b +} + +// Put returns a buffer to the pool. +func (NopBufferPool) Put(*[]byte) { +} diff --git a/vendor/google.golang.org/grpc/mem/buffer_slice.go b/vendor/google.golang.org/grpc/mem/buffer_slice.go new file mode 100644 index 0000000000..af510d20c5 --- /dev/null +++ b/vendor/google.golang.org/grpc/mem/buffer_slice.go @@ -0,0 +1,292 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package mem + +import ( + "io" +) + +const ( + // 32 KiB is what io.Copy uses. + readAllBufSize = 32 * 1024 +) + +// BufferSlice offers a means to represent data that spans one or more Buffer +// instances. A BufferSlice is meant to be immutable after creation, and methods +// like Ref create and return copies of the slice. This is why all methods have +// value receivers rather than pointer receivers. +// +// Note that any of the methods that read the underlying buffers such as Ref, +// Len or CopyTo etc., will panic if any underlying buffers have already been +// freed. It is recommended to not directly interact with any of the underlying +// buffers directly, rather such interactions should be mediated through the +// various methods on this type. +// +// By convention, any APIs that return (mem.BufferSlice, error) should reduce +// the burden on the caller by never returning a mem.BufferSlice that needs to +// be freed if the error is non-nil, unless explicitly stated. +type BufferSlice []Buffer + +// Len returns the sum of the length of all the Buffers in this slice. +// +// # Warning +// +// Invoking the built-in len on a BufferSlice will return the number of buffers +// in the slice, and *not* the value returned by this function. +func (s BufferSlice) Len() int { + var length int + for _, b := range s { + length += b.Len() + } + return length +} + +// Ref invokes Ref on each buffer in the slice. +func (s BufferSlice) Ref() { + for _, b := range s { + b.Ref() + } +} + +// Free invokes Buffer.Free() on each Buffer in the slice. +func (s BufferSlice) Free() { + for _, b := range s { + b.Free() + } +} + +// CopyTo copies each of the underlying Buffer's data into the given buffer, +// returning the number of bytes copied. Has the same semantics as the copy +// builtin in that it will copy as many bytes as it can, stopping when either dst +// is full or s runs out of data, returning the minimum of s.Len() and len(dst). +func (s BufferSlice) CopyTo(dst []byte) int { + off := 0 + for _, b := range s { + off += copy(dst[off:], b.ReadOnlyData()) + } + return off +} + +// Materialize concatenates all the underlying Buffer's data into a single +// contiguous buffer using CopyTo. +func (s BufferSlice) Materialize() []byte { + l := s.Len() + if l == 0 { + return nil + } + out := make([]byte, l) + s.CopyTo(out) + return out +} + +// MaterializeToBuffer functions like Materialize except that it writes the data +// to a single Buffer pulled from the given BufferPool. +// +// As a special case, if the input BufferSlice only actually has one Buffer, this +// function simply increases the refcount before returning said Buffer. Freeing this +// buffer won't release it until the BufferSlice is itself released. +func (s BufferSlice) MaterializeToBuffer(pool BufferPool) Buffer { + if len(s) == 1 { + s[0].Ref() + return s[0] + } + sLen := s.Len() + if sLen == 0 { + return emptyBuffer{} + } + buf := pool.Get(sLen) + s.CopyTo(*buf) + return NewBuffer(buf, pool) +} + +// Reader returns a new Reader for the input slice after taking references to +// each underlying buffer. +func (s BufferSlice) Reader() Reader { + s.Ref() + return &sliceReader{ + data: s, + len: s.Len(), + } +} + +// Reader exposes a BufferSlice's data as an io.Reader, allowing it to interface +// with other parts systems. It also provides an additional convenience method +// Remaining(), which returns the number of unread bytes remaining in the slice. +// Buffers will be freed as they are read. +type Reader interface { + io.Reader + io.ByteReader + // Close frees the underlying BufferSlice and never returns an error. Subsequent + // calls to Read will return (0, io.EOF). + Close() error + // Remaining returns the number of unread bytes remaining in the slice. + Remaining() int + // Reset frees the currently held buffer slice and starts reading from the + // provided slice. This allows reusing the reader object. + Reset(s BufferSlice) +} + +type sliceReader struct { + data BufferSlice + len int + // The index into data[0].ReadOnlyData(). + bufferIdx int +} + +func (r *sliceReader) Remaining() int { + return r.len +} + +func (r *sliceReader) Reset(s BufferSlice) { + r.data.Free() + s.Ref() + r.data = s + r.len = s.Len() + r.bufferIdx = 0 +} + +func (r *sliceReader) Close() error { + r.data.Free() + r.data = nil + r.len = 0 + return nil +} + +func (r *sliceReader) freeFirstBufferIfEmpty() bool { + if len(r.data) == 0 || r.bufferIdx != len(r.data[0].ReadOnlyData()) { + return false + } + + r.data[0].Free() + r.data = r.data[1:] + r.bufferIdx = 0 + return true +} + +func (r *sliceReader) Read(buf []byte) (n int, _ error) { + if r.len == 0 { + return 0, io.EOF + } + + for len(buf) != 0 && r.len != 0 { + // Copy as much as possible from the first Buffer in the slice into the + // given byte slice. + data := r.data[0].ReadOnlyData() + copied := copy(buf, data[r.bufferIdx:]) + r.len -= copied // Reduce len by the number of bytes copied. + r.bufferIdx += copied // Increment the buffer index. + n += copied // Increment the total number of bytes read. + buf = buf[copied:] // Shrink the given byte slice. + + // If we have copied all the data from the first Buffer, free it and advance to + // the next in the slice. + r.freeFirstBufferIfEmpty() + } + + return n, nil +} + +func (r *sliceReader) ReadByte() (byte, error) { + if r.len == 0 { + return 0, io.EOF + } + + // There may be any number of empty buffers in the slice, clear them all until a + // non-empty buffer is reached. This is guaranteed to exit since r.len is not 0. + for r.freeFirstBufferIfEmpty() { + } + + b := r.data[0].ReadOnlyData()[r.bufferIdx] + r.len-- + r.bufferIdx++ + // Free the first buffer in the slice if the last byte was read + r.freeFirstBufferIfEmpty() + return b, nil +} + +var _ io.Writer = (*writer)(nil) + +type writer struct { + buffers *BufferSlice + pool BufferPool +} + +func (w *writer) Write(p []byte) (n int, err error) { + b := Copy(p, w.pool) + *w.buffers = append(*w.buffers, b) + return b.Len(), nil +} + +// NewWriter wraps the given BufferSlice and BufferPool to implement the +// io.Writer interface. Every call to Write copies the contents of the given +// buffer into a new Buffer pulled from the given pool and the Buffer is +// added to the given BufferSlice. +func NewWriter(buffers *BufferSlice, pool BufferPool) io.Writer { + return &writer{buffers: buffers, pool: pool} +} + +// ReadAll reads from r until an error or EOF and returns the data it read. +// A successful call returns err == nil, not err == EOF. Because ReadAll is +// defined to read from src until EOF, it does not treat an EOF from Read +// as an error to be reported. +// +// Important: A failed call returns a non-nil error and may also return +// partially read buffers. It is the responsibility of the caller to free the +// BufferSlice returned, or its memory will not be reused. +func ReadAll(r io.Reader, pool BufferPool) (BufferSlice, error) { + var result BufferSlice + if wt, ok := r.(io.WriterTo); ok { + // This is more optimal since wt knows the size of chunks it wants to + // write and, hence, we can allocate buffers of an optimal size to fit + // them. E.g. might be a single big chunk, and we wouldn't chop it + // into pieces. + w := NewWriter(&result, pool) + _, err := wt.WriteTo(w) + return result, err + } +nextBuffer: + for { + buf := pool.Get(readAllBufSize) + // We asked for 32KiB but may have been given a bigger buffer. + // Use all of it if that's the case. + *buf = (*buf)[:cap(*buf)] + usedCap := 0 + for { + n, err := r.Read((*buf)[usedCap:]) + usedCap += n + if err != nil { + if usedCap == 0 { + // Nothing in this buf, put it back + pool.Put(buf) + } else { + *buf = (*buf)[:usedCap] + result = append(result, NewBuffer(buf, pool)) + } + if err == io.EOF { + err = nil + } + return result, err + } + if len(*buf) == usedCap { + result = append(result, NewBuffer(buf, pool)) + continue nextBuffer + } + } + } +} diff --git a/vendor/google.golang.org/grpc/mem/buffers.go b/vendor/google.golang.org/grpc/mem/buffers.go new file mode 100644 index 0000000000..ecbf0b9a73 --- /dev/null +++ b/vendor/google.golang.org/grpc/mem/buffers.go @@ -0,0 +1,268 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package mem provides utilities that facilitate memory reuse in byte slices +// that are used as buffers. +// +// # Experimental +// +// Notice: All APIs in this package are EXPERIMENTAL and may be changed or +// removed in a later release. +package mem + +import ( + "fmt" + "sync" + "sync/atomic" +) + +// A Buffer represents a reference counted piece of data (in bytes) that can be +// acquired by a call to NewBuffer() or Copy(). A reference to a Buffer may be +// released by calling Free(), which invokes the free function given at creation +// only after all references are released. +// +// Note that a Buffer is not safe for concurrent access and instead each +// goroutine should use its own reference to the data, which can be acquired via +// a call to Ref(). +// +// Attempts to access the underlying data after releasing the reference to the +// Buffer will panic. +type Buffer interface { + // ReadOnlyData returns the underlying byte slice. Note that it is undefined + // behavior to modify the contents of this slice in any way. + ReadOnlyData() []byte + // Ref increases the reference counter for this Buffer. + Ref() + // Free decrements this Buffer's reference counter and frees the underlying + // byte slice if the counter reaches 0 as a result of this call. + Free() + // Len returns the Buffer's size. + Len() int + + split(n int) (left, right Buffer) + read(buf []byte) (int, Buffer) +} + +var ( + bufferPoolingThreshold = 1 << 10 + + bufferObjectPool = sync.Pool{New: func() any { return new(buffer) }} + refObjectPool = sync.Pool{New: func() any { return new(atomic.Int32) }} +) + +// IsBelowBufferPoolingThreshold returns true if the given size is less than or +// equal to the threshold for buffer pooling. This is used to determine whether +// to pool buffers or allocate them directly. +func IsBelowBufferPoolingThreshold(size int) bool { + return size <= bufferPoolingThreshold +} + +type buffer struct { + origData *[]byte + data []byte + refs *atomic.Int32 + pool BufferPool +} + +func newBuffer() *buffer { + return bufferObjectPool.Get().(*buffer) +} + +// NewBuffer creates a new Buffer from the given data, initializing the reference +// counter to 1. The data will then be returned to the given pool when all +// references to the returned Buffer are released. As a special case to avoid +// additional allocations, if the given buffer pool is nil, the returned buffer +// will be a "no-op" Buffer where invoking Buffer.Free() does nothing and the +// underlying data is never freed. +// +// Note that the backing array of the given data is not copied. +func NewBuffer(data *[]byte, pool BufferPool) Buffer { + // Use the buffer's capacity instead of the length, otherwise buffers may + // not be reused under certain conditions. For example, if a large buffer + // is acquired from the pool, but fewer bytes than the buffering threshold + // are written to it, the buffer will not be returned to the pool. + if pool == nil || IsBelowBufferPoolingThreshold(cap(*data)) { + return (SliceBuffer)(*data) + } + b := newBuffer() + b.origData = data + b.data = *data + b.pool = pool + b.refs = refObjectPool.Get().(*atomic.Int32) + b.refs.Add(1) + return b +} + +// Copy creates a new Buffer from the given data, initializing the reference +// counter to 1. +// +// It acquires a []byte from the given pool and copies over the backing array +// of the given data. The []byte acquired from the pool is returned to the +// pool when all references to the returned Buffer are released. +func Copy(data []byte, pool BufferPool) Buffer { + if IsBelowBufferPoolingThreshold(len(data)) { + buf := make(SliceBuffer, len(data)) + copy(buf, data) + return buf + } + + buf := pool.Get(len(data)) + copy(*buf, data) + return NewBuffer(buf, pool) +} + +func (b *buffer) ReadOnlyData() []byte { + if b.refs == nil { + panic("Cannot read freed buffer") + } + return b.data +} + +func (b *buffer) Ref() { + if b.refs == nil { + panic("Cannot ref freed buffer") + } + b.refs.Add(1) +} + +func (b *buffer) Free() { + if b.refs == nil { + panic("Cannot free freed buffer") + } + + refs := b.refs.Add(-1) + switch { + case refs > 0: + return + case refs == 0: + if b.pool != nil { + b.pool.Put(b.origData) + } + + refObjectPool.Put(b.refs) + b.origData = nil + b.data = nil + b.refs = nil + b.pool = nil + bufferObjectPool.Put(b) + default: + panic("Cannot free freed buffer") + } +} + +func (b *buffer) Len() int { + return len(b.ReadOnlyData()) +} + +func (b *buffer) split(n int) (Buffer, Buffer) { + if b.refs == nil { + panic("Cannot split freed buffer") + } + + b.refs.Add(1) + split := newBuffer() + split.origData = b.origData + split.data = b.data[n:] + split.refs = b.refs + split.pool = b.pool + + b.data = b.data[:n] + + return b, split +} + +func (b *buffer) read(buf []byte) (int, Buffer) { + if b.refs == nil { + panic("Cannot read freed buffer") + } + + n := copy(buf, b.data) + if n == len(b.data) { + b.Free() + return n, nil + } + + b.data = b.data[n:] + return n, b +} + +func (b *buffer) String() string { + return fmt.Sprintf("mem.Buffer(%p, data: %p, length: %d)", b, b.ReadOnlyData(), len(b.ReadOnlyData())) +} + +// ReadUnsafe reads bytes from the given Buffer into the provided slice. +// It does not perform safety checks. +func ReadUnsafe(dst []byte, buf Buffer) (int, Buffer) { + return buf.read(dst) +} + +// SplitUnsafe modifies the receiver to point to the first n bytes while it +// returns a new reference to the remaining bytes. The returned Buffer +// functions just like a normal reference acquired using Ref(). +func SplitUnsafe(buf Buffer, n int) (left, right Buffer) { + return buf.split(n) +} + +type emptyBuffer struct{} + +func (e emptyBuffer) ReadOnlyData() []byte { + return nil +} + +func (e emptyBuffer) Ref() {} +func (e emptyBuffer) Free() {} + +func (e emptyBuffer) Len() int { + return 0 +} + +func (e emptyBuffer) split(int) (left, right Buffer) { + return e, e +} + +func (e emptyBuffer) read([]byte) (int, Buffer) { + return 0, e +} + +// SliceBuffer is a Buffer implementation that wraps a byte slice. It provides +// methods for reading, splitting, and managing the byte slice. +type SliceBuffer []byte + +// ReadOnlyData returns the byte slice. +func (s SliceBuffer) ReadOnlyData() []byte { return s } + +// Ref is a noop implementation of Ref. +func (s SliceBuffer) Ref() {} + +// Free is a noop implementation of Free. +func (s SliceBuffer) Free() {} + +// Len is a noop implementation of Len. +func (s SliceBuffer) Len() int { return len(s) } + +func (s SliceBuffer) split(n int) (left, right Buffer) { + return s[:n], s[n:] +} + +func (s SliceBuffer) read(buf []byte) (int, Buffer) { + n := copy(buf, s) + if n == len(s) { + return n, nil + } + return n, s[n:] +} diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go index 1e9485fd6e..d2e15253bb 100644 --- a/vendor/google.golang.org/grpc/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/metadata/metadata.go @@ -213,11 +213,6 @@ func FromIncomingContext(ctx context.Context) (MD, bool) { // ValueFromIncomingContext returns the metadata value corresponding to the metadata // key from the incoming metadata if it exists. Keys are matched in a case insensitive // manner. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. func ValueFromIncomingContext(ctx context.Context, key string) []string { md, ok := ctx.Value(mdIncomingKey{}).(MD) if !ok { @@ -228,7 +223,7 @@ func ValueFromIncomingContext(ctx context.Context, key string) []string { return copyOf(v) } for k, v := range md { - // Case insenitive comparison: MD is a map, and there's no guarantee + // Case insensitive comparison: MD is a map, and there's no guarantee // that the MD attached to the context is created using our helper // functions. if strings.EqualFold(k, key) { diff --git a/vendor/google.golang.org/grpc/peer/peer.go b/vendor/google.golang.org/grpc/peer/peer.go index a821ff9b2b..499a49c8c1 100644 --- a/vendor/google.golang.org/grpc/peer/peer.go +++ b/vendor/google.golang.org/grpc/peer/peer.go @@ -22,7 +22,9 @@ package peer import ( "context" + "fmt" "net" + "strings" "google.golang.org/grpc/credentials" ) @@ -39,6 +41,34 @@ type Peer struct { AuthInfo credentials.AuthInfo } +// String ensures the Peer types implements the Stringer interface in order to +// allow to print a context with a peerKey value effectively. +func (p *Peer) String() string { + if p == nil { + return "Peer" + } + sb := &strings.Builder{} + sb.WriteString("Peer{") + if p.Addr != nil { + fmt.Fprintf(sb, "Addr: '%s', ", p.Addr.String()) + } else { + fmt.Fprintf(sb, "Addr: , ") + } + if p.LocalAddr != nil { + fmt.Fprintf(sb, "LocalAddr: '%s', ", p.LocalAddr.String()) + } else { + fmt.Fprintf(sb, "LocalAddr: , ") + } + if p.AuthInfo != nil { + fmt.Fprintf(sb, "AuthInfo: '%s'", p.AuthInfo.AuthType()) + } else { + fmt.Fprintf(sb, "AuthInfo: ") + } + sb.WriteString("}") + + return sb.String() +} + type peerKey struct{} // NewContext creates a new context with peer information attached. diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go index bf56faa76d..aa52bfe95f 100644 --- a/vendor/google.golang.org/grpc/picker_wrapper.go +++ b/vendor/google.golang.org/grpc/picker_wrapper.go @@ -20,47 +20,52 @@ package grpc import ( "context" + "fmt" "io" - "sync" + "sync/atomic" "google.golang.org/grpc/balancer" "google.golang.org/grpc/codes" "google.golang.org/grpc/internal/channelz" istatus "google.golang.org/grpc/internal/status" "google.golang.org/grpc/internal/transport" - "google.golang.org/grpc/stats" "google.golang.org/grpc/status" ) +// pickerGeneration stores a picker and a channel used to signal that a picker +// newer than this one is available. +type pickerGeneration struct { + // picker is the picker produced by the LB policy. May be nil if a picker + // has never been produced. + picker balancer.Picker + // blockingCh is closed when the picker has been invalidated because there + // is a new one available. + blockingCh chan struct{} +} + // pickerWrapper is a wrapper of balancer.Picker. It blocks on certain pick // actions and unblock when there's a picker update. type pickerWrapper struct { - mu sync.Mutex - done bool - blockingCh chan struct{} - picker balancer.Picker - statsHandlers []stats.Handler // to record blocking picker calls + // If pickerGen holds a nil pointer, the pickerWrapper is closed. + pickerGen atomic.Pointer[pickerGeneration] } -func newPickerWrapper(statsHandlers []stats.Handler) *pickerWrapper { - return &pickerWrapper{ - blockingCh: make(chan struct{}), - statsHandlers: statsHandlers, - } +func newPickerWrapper() *pickerWrapper { + pw := &pickerWrapper{} + pw.pickerGen.Store(&pickerGeneration{ + blockingCh: make(chan struct{}), + }) + return pw } -// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick. +// updatePicker is called by UpdateState calls from the LB policy. It +// unblocks all blocked pick. func (pw *pickerWrapper) updatePicker(p balancer.Picker) { - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() - return - } - pw.picker = p - // pw.blockingCh should never be nil. - close(pw.blockingCh) - pw.blockingCh = make(chan struct{}) - pw.mu.Unlock() + old := pw.pickerGen.Swap(&pickerGeneration{ + picker: p, + blockingCh: make(chan struct{}), + }) + close(old.blockingCh) } // doneChannelzWrapper performs the following: @@ -84,6 +89,12 @@ func doneChannelzWrapper(acbw *acBalancerWrapper, result *balancer.PickResult) { } } +type pick struct { + transport transport.ClientTransport // the selected transport + result balancer.PickResult // the contents of the pick from the LB policy + blocked bool // set if a picker call queued for a new picker +} + // pick returns the transport that will be used for the RPC. // It may block in the following cases: // - there's no picker @@ -91,39 +102,37 @@ func doneChannelzWrapper(acbw *acBalancerWrapper, result *balancer.PickResult) { // - the current picker returns other errors and failfast is false. // - the subConn returned by the current picker is not READY // When one of these situations happens, pick blocks until the picker gets updated. -func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (transport.ClientTransport, balancer.PickResult, error) { +func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer.PickInfo) (pick, error) { var ch chan struct{} var lastPickErr error + pickBlocked := false for { - pw.mu.Lock() - if pw.done { - pw.mu.Unlock() - return nil, balancer.PickResult{}, ErrClientConnClosing + pg := pw.pickerGen.Load() + if pg == nil { + return pick{}, ErrClientConnClosing } - - if pw.picker == nil { - ch = pw.blockingCh + if pg.picker == nil { + ch = pg.blockingCh } - if ch == pw.blockingCh { + if ch == pg.blockingCh { // This could happen when either: // - pw.picker is nil (the previous if condition), or - // - has called pick on the current picker. - pw.mu.Unlock() + // - we have already called pick on the current picker. select { case <-ctx.Done(): var errStr string if lastPickErr != nil { errStr = "latest balancer error: " + lastPickErr.Error() } else { - errStr = ctx.Err().Error() + errStr = fmt.Sprintf("%v while waiting for connections to become ready", ctx.Err()) } switch ctx.Err() { case context.DeadlineExceeded: - return nil, balancer.PickResult{}, status.Error(codes.DeadlineExceeded, errStr) + return pick{}, status.Error(codes.DeadlineExceeded, errStr) case context.Canceled: - return nil, balancer.PickResult{}, status.Error(codes.Canceled, errStr) + return pick{}, status.Error(codes.Canceled, errStr) } case <-ch: } @@ -139,14 +148,11 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. // In the second case, the only way it will get to this conditional is // if there is a new picker. if ch != nil { - for _, sh := range pw.statsHandlers { - sh.HandleRPC(ctx, &stats.PickerUpdated{}) - } + pickBlocked = true } - ch = pw.blockingCh - p := pw.picker - pw.mu.Unlock() + ch = pg.blockingCh + p := pg.picker pickResult, err := p.Pick(info) if err != nil { @@ -159,7 +165,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. if istatus.IsRestrictedControlPlaneCode(st) { err = status.Errorf(codes.Internal, "received picker error with illegal status: %v", err) } - return nil, balancer.PickResult{}, dropError{error: err} + return pick{}, dropError{error: err} } // For all other errors, wait for ready RPCs should block and other // RPCs should fail with unavailable. @@ -167,7 +173,7 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. lastPickErr = err continue } - return nil, balancer.PickResult{}, status.Error(codes.Unavailable, err.Error()) + return pick{}, status.Error(codes.Unavailable, err.Error()) } acbw, ok := pickResult.SubConn.(*acBalancerWrapper) @@ -178,9 +184,8 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. if t := acbw.ac.getReadyTransport(); t != nil { if channelz.IsOn() { doneChannelzWrapper(acbw, &pickResult) - return t, pickResult, nil } - return t, pickResult, nil + return pick{transport: t, result: pickResult, blocked: pickBlocked}, nil } if pickResult.Done != nil { // Calling done with nil error, no bytes sent and no bytes received. @@ -196,24 +201,15 @@ func (pw *pickerWrapper) pick(ctx context.Context, failfast bool, info balancer. } func (pw *pickerWrapper) close() { - pw.mu.Lock() - defer pw.mu.Unlock() - if pw.done { - return - } - pw.done = true - close(pw.blockingCh) + old := pw.pickerGen.Swap(nil) + close(old.blockingCh) } // reset clears the pickerWrapper and prepares it for being used again when idle // mode is exited. func (pw *pickerWrapper) reset() { - pw.mu.Lock() - defer pw.mu.Unlock() - if pw.done { - return - } - pw.blockingCh = make(chan struct{}) + old := pw.pickerGen.Swap(&pickerGeneration{blockingCh: make(chan struct{})}) + close(old.blockingCh) } // dropError is a wrapper error that indicates the LB policy wishes to drop the diff --git a/vendor/google.golang.org/grpc/preloader.go b/vendor/google.golang.org/grpc/preloader.go index 73bd633643..ee0ff969af 100644 --- a/vendor/google.golang.org/grpc/preloader.go +++ b/vendor/google.golang.org/grpc/preloader.go @@ -20,6 +20,7 @@ package grpc import ( "google.golang.org/grpc/codes" + "google.golang.org/grpc/mem" "google.golang.org/grpc/status" ) @@ -31,9 +32,10 @@ import ( // later release. type PreparedMsg struct { // Struct for preparing msg before sending them - encodedData []byte + encodedData mem.BufferSlice hdr []byte - payload []byte + payload mem.BufferSlice + pf payloadFormat } // Encode marshalls and compresses the message using the codec and compressor for the stream. @@ -57,11 +59,27 @@ func (p *PreparedMsg) Encode(s Stream, msg any) error { if err != nil { return err } - p.encodedData = data - compData, err := compress(data, rpcInfo.preloaderInfo.cp, rpcInfo.preloaderInfo.comp) + + materializedData := data.Materialize() + data.Free() + p.encodedData = mem.BufferSlice{mem.SliceBuffer(materializedData)} + + // TODO: it should be possible to grab the bufferPool from the underlying + // stream implementation with a type cast to its actual type (such as + // addrConnStream) and accessing the buffer pool directly. + var compData mem.BufferSlice + compData, p.pf, err = compress(p.encodedData, rpcInfo.preloaderInfo.cp, rpcInfo.preloaderInfo.comp, mem.DefaultBufferPool()) if err != nil { return err } - p.hdr, p.payload = msgHeader(data, compData) + + if p.pf.isCompressed() { + materializedCompData := compData.Materialize() + compData.Free() + compData = mem.BufferSlice{mem.SliceBuffer(materializedCompData)} + } + + p.hdr, p.payload = msgHeader(p.encodedData, compData, p.pf) + return nil } diff --git a/vendor/google.golang.org/grpc/reflection/adapt.go b/vendor/google.golang.org/grpc/reflection/adapt.go index 33b907a36d..6997e47403 100644 --- a/vendor/google.golang.org/grpc/reflection/adapt.go +++ b/vendor/google.golang.org/grpc/reflection/adapt.go @@ -19,10 +19,11 @@ package reflection import ( + "google.golang.org/grpc/reflection/internal" + v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" - v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" ) // asV1Alpha returns an implementation of the v1alpha version of the reflection @@ -44,7 +45,7 @@ type v1AlphaServerStreamAdapter struct { } func (s v1AlphaServerStreamAdapter) Send(response *v1reflectionpb.ServerReflectionResponse) error { - return s.ServerReflection_ServerReflectionInfoServer.Send(v1ToV1AlphaResponse(response)) + return s.ServerReflection_ServerReflectionInfoServer.Send(internal.V1ToV1AlphaResponse(response)) } func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequest, error) { @@ -52,136 +53,5 @@ func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequ if err != nil { return nil, err } - return v1AlphaToV1Request(resp), nil -} - -func v1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse { - var v1alpha v1alphareflectionpb.ServerReflectionResponse - v1alpha.ValidHost = v1.ValidHost - if v1.OriginalRequest != nil { - v1alpha.OriginalRequest = v1ToV1AlphaRequest(v1.OriginalRequest) - } - switch mr := v1.MessageResponse.(type) { - case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{ - FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ - AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{ - BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), - ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse: - if mr != nil { - svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) - for i, svc := range mr.ListServicesResponse.GetService() { - svcs[i] = &v1alphareflectionpb.ServiceResponse{ - Name: svc.GetName(), - } - } - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{ - ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{ - Service: svcs, - }, - } - } - case *v1reflectionpb.ServerReflectionResponse_ErrorResponse: - if mr != nil { - v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1alphareflectionpb.ErrorResponse{ - ErrorCode: mr.ErrorResponse.GetErrorCode(), - ErrorMessage: mr.ErrorResponse.GetErrorMessage(), - }, - } - } - default: - // no value set - } - return &v1alpha -} - -func v1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest { - var v1 v1reflectionpb.ServerReflectionRequest - v1.Host = v1alpha.Host - switch mr := v1alpha.MessageRequest.(type) { - case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{ - FileByFilename: mr.FileByFilename, - } - case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: mr.FileContainingSymbol, - } - case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension: - if mr.FileContainingExtension != nil { - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{ - FileContainingExtension: &v1reflectionpb.ExtensionRequest{ - ContainingType: mr.FileContainingExtension.GetContainingType(), - ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), - }, - } - } - case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ - AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, - } - case *v1alphareflectionpb.ServerReflectionRequest_ListServices: - v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{ - ListServices: mr.ListServices, - } - default: - // no value set - } - return &v1 -} - -func v1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest { - var v1alpha v1alphareflectionpb.ServerReflectionRequest - v1alpha.Host = v1.Host - switch mr := v1.MessageRequest.(type) { - case *v1reflectionpb.ServerReflectionRequest_FileByFilename: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{ - FileByFilename: mr.FileByFilename, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{ - FileContainingSymbol: mr.FileContainingSymbol, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{ - FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{ - ContainingType: mr.FileContainingExtension.GetContainingType(), - ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), - }, - } - } - case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ - AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, - } - } - case *v1reflectionpb.ServerReflectionRequest_ListServices: - if mr != nil { - v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{ - ListServices: mr.ListServices, - } - } - default: - // no value set - } - return &v1alpha + return internal.V1AlphaToV1Request(resp), nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go index 8953c9d8d6..92f5292211 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection.pb.go @@ -21,8 +21,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // source: grpc/reflection/v1/reflection.proto package grpc_reflection_v1 @@ -32,6 +32,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -43,16 +44,13 @@ const ( // The message sent by the client when calling ServerReflectionInfo method. type ServerReflectionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // To use reflection service, the client should set one of the following // fields in message_request. The server distinguishes requests by their // defined field and then handles them using corresponding methods. // - // Types that are assignable to MessageRequest: + // Types that are valid to be assigned to MessageRequest: // // *ServerReflectionRequest_FileByFilename // *ServerReflectionRequest_FileContainingSymbol @@ -60,15 +58,15 @@ type ServerReflectionRequest struct { // *ServerReflectionRequest_AllExtensionNumbersOfType // *ServerReflectionRequest_ListServices MessageRequest isServerReflectionRequest_MessageRequest `protobuf_oneof:"message_request"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionRequest) Reset() { *x = ServerReflectionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionRequest) String() string { @@ -79,7 +77,7 @@ func (*ServerReflectionRequest) ProtoMessage() {} func (x *ServerReflectionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -101,44 +99,54 @@ func (x *ServerReflectionRequest) GetHost() string { return "" } -func (m *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { - if m != nil { - return m.MessageRequest +func (x *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { + if x != nil { + return x.MessageRequest } return nil } func (x *ServerReflectionRequest) GetFileByFilename() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileByFilename); ok { - return x.FileByFilename + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileByFilename); ok { + return x.FileByFilename + } } return "" } func (x *ServerReflectionRequest) GetFileContainingSymbol() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingSymbol); ok { - return x.FileContainingSymbol + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingSymbol); ok { + return x.FileContainingSymbol + } } return "" } func (x *ServerReflectionRequest) GetFileContainingExtension() *ExtensionRequest { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingExtension); ok { - return x.FileContainingExtension + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingExtension); ok { + return x.FileContainingExtension + } } return nil } func (x *ServerReflectionRequest) GetAllExtensionNumbersOfType() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { - return x.AllExtensionNumbersOfType + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { + return x.AllExtensionNumbersOfType + } } return "" } func (x *ServerReflectionRequest) GetListServices() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_ListServices); ok { - return x.ListServices + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_ListServices); ok { + return x.ListServices + } } return "" } @@ -197,22 +205,19 @@ func (*ServerReflectionRequest_ListServices) isServerReflectionRequest_MessageRe // The type name and extension number sent by the client when requesting // file_containing_extension. type ExtensionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Fully-qualified type name. The format should be . ContainingType string `protobuf:"bytes,1,opt,name=containing_type,json=containingType,proto3" json:"containing_type,omitempty"` ExtensionNumber int32 `protobuf:"varint,2,opt,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionRequest) Reset() { *x = ExtensionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionRequest) String() string { @@ -223,7 +228,7 @@ func (*ExtensionRequest) ProtoMessage() {} func (x *ExtensionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -254,31 +259,28 @@ func (x *ExtensionRequest) GetExtensionNumber() int32 { // The message sent by the server to answer ServerReflectionInfo method. type ServerReflectionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` ValidHost string `protobuf:"bytes,1,opt,name=valid_host,json=validHost,proto3" json:"valid_host,omitempty"` OriginalRequest *ServerReflectionRequest `protobuf:"bytes,2,opt,name=original_request,json=originalRequest,proto3" json:"original_request,omitempty"` // The server sets one of the following fields according to the message_request // in the request. // - // Types that are assignable to MessageResponse: + // Types that are valid to be assigned to MessageResponse: // // *ServerReflectionResponse_FileDescriptorResponse // *ServerReflectionResponse_AllExtensionNumbersResponse // *ServerReflectionResponse_ListServicesResponse // *ServerReflectionResponse_ErrorResponse MessageResponse isServerReflectionResponse_MessageResponse `protobuf_oneof:"message_response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionResponse) Reset() { *x = ServerReflectionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionResponse) String() string { @@ -289,7 +291,7 @@ func (*ServerReflectionResponse) ProtoMessage() {} func (x *ServerReflectionResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -318,37 +320,45 @@ func (x *ServerReflectionResponse) GetOriginalRequest() *ServerReflectionRequest return nil } -func (m *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { - if m != nil { - return m.MessageResponse +func (x *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { + if x != nil { + return x.MessageResponse } return nil } func (x *ServerReflectionResponse) GetFileDescriptorResponse() *FileDescriptorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_FileDescriptorResponse); ok { - return x.FileDescriptorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_FileDescriptorResponse); ok { + return x.FileDescriptorResponse + } } return nil } func (x *ServerReflectionResponse) GetAllExtensionNumbersResponse() *ExtensionNumberResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { - return x.AllExtensionNumbersResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { + return x.AllExtensionNumbersResponse + } } return nil } func (x *ServerReflectionResponse) GetListServicesResponse() *ListServiceResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ListServicesResponse); ok { - return x.ListServicesResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ListServicesResponse); ok { + return x.ListServicesResponse + } } return nil } func (x *ServerReflectionResponse) GetErrorResponse() *ErrorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ErrorResponse); ok { - return x.ErrorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ErrorResponse); ok { + return x.ErrorResponse + } } return nil } @@ -396,23 +406,20 @@ func (*ServerReflectionResponse_ErrorResponse) isServerReflectionResponse_Messag // a file_by_filename, file_containing_symbol, or file_containing_extension // request. type FileDescriptorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Serialized FileDescriptorProto messages. We avoid taking a dependency on // descriptor.proto, which uses proto2 only features, by making them opaque // bytes instead. FileDescriptorProto [][]byte `protobuf:"bytes,1,rep,name=file_descriptor_proto,json=fileDescriptorProto,proto3" json:"file_descriptor_proto,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FileDescriptorResponse) Reset() { *x = FileDescriptorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileDescriptorResponse) String() string { @@ -423,7 +430,7 @@ func (*FileDescriptorResponse) ProtoMessage() {} func (x *FileDescriptorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -448,23 +455,20 @@ func (x *FileDescriptorResponse) GetFileDescriptorProto() [][]byte { // A list of extension numbers sent by the server answering // all_extension_numbers_of_type request. type ExtensionNumberResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of the base type, including the package name. The format // is . BaseTypeName string `protobuf:"bytes,1,opt,name=base_type_name,json=baseTypeName,proto3" json:"base_type_name,omitempty"` ExtensionNumber []int32 `protobuf:"varint,2,rep,packed,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionNumberResponse) Reset() { *x = ExtensionNumberResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionNumberResponse) String() string { @@ -475,7 +479,7 @@ func (*ExtensionNumberResponse) ProtoMessage() {} func (x *ExtensionNumberResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -506,22 +510,19 @@ func (x *ExtensionNumberResponse) GetExtensionNumber() []int32 { // A list of ServiceResponse sent by the server answering list_services request. type ListServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The information of each service may be expanded in the future, so we use // ServiceResponse message to encapsulate it. - Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListServiceResponse) Reset() { *x = ListServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListServiceResponse) String() string { @@ -532,7 +533,7 @@ func (*ListServiceResponse) ProtoMessage() {} func (x *ListServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -557,22 +558,19 @@ func (x *ListServiceResponse) GetService() []*ServiceResponse { // The information of a single service used by ListServiceResponse to answer // list_services request. type ServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of a registered service, including its package name. The format // is . - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServiceResponse) Reset() { *x = ServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServiceResponse) String() string { @@ -583,7 +581,7 @@ func (*ServiceResponse) ProtoMessage() {} func (x *ServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -607,22 +605,19 @@ func (x *ServiceResponse) GetName() string { // The error code and error message sent by the server when an error occurs. type ErrorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This field uses the error codes defined in grpc::StatusCode. - ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` - ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ErrorResponse) Reset() { *x = ErrorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ErrorResponse) String() string { @@ -633,7 +628,7 @@ func (*ErrorResponse) ProtoMessage() {} func (x *ErrorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1_reflection_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -664,132 +659,60 @@ func (x *ErrorResponse) GetErrorMessage() string { var File_grpc_reflection_v1_reflection_proto protoreflect.FileDescriptor -var file_grpc_reflection_v1_reflection_proto_rawDesc = []byte{ - 0x0a, 0x23, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, 0xf3, 0x02, 0x0a, 0x17, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x46, 0x69, 0x6c, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x62, 0x0a, - 0x19, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x42, 0x0a, 0x1d, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x4f, - 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, - 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x66, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xae, 0x04, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x10, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x18, 0x66, - 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x1e, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1b, 0x61, 0x6c, 0x6c, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x16, 0x6c, 0x69, 0x73, 0x74, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, - 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x14, 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x0a, 0x16, 0x46, 0x69, 0x6c, 0x65, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6a, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x53, 0x0a, 0x0d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x32, 0x89, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x75, 0x0a, 0x14, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, - 0x42, 0x66, 0x0a, 0x15, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x15, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x34, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, - 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_reflection_v1_reflection_proto_rawDesc = "" + + "\n" + + "#grpc/reflection/v1/reflection.proto\x12\x12grpc.reflection.v1\"\xf3\x02\n" + + "\x17ServerReflectionRequest\x12\x12\n" + + "\x04host\x18\x01 \x01(\tR\x04host\x12*\n" + + "\x10file_by_filename\x18\x03 \x01(\tH\x00R\x0efileByFilename\x126\n" + + "\x16file_containing_symbol\x18\x04 \x01(\tH\x00R\x14fileContainingSymbol\x12b\n" + + "\x19file_containing_extension\x18\x05 \x01(\v2$.grpc.reflection.v1.ExtensionRequestH\x00R\x17fileContainingExtension\x12B\n" + + "\x1dall_extension_numbers_of_type\x18\x06 \x01(\tH\x00R\x19allExtensionNumbersOfType\x12%\n" + + "\rlist_services\x18\a \x01(\tH\x00R\flistServicesB\x11\n" + + "\x0fmessage_request\"f\n" + + "\x10ExtensionRequest\x12'\n" + + "\x0fcontaining_type\x18\x01 \x01(\tR\x0econtainingType\x12)\n" + + "\x10extension_number\x18\x02 \x01(\x05R\x0fextensionNumber\"\xae\x04\n" + + "\x18ServerReflectionResponse\x12\x1d\n" + + "\n" + + "valid_host\x18\x01 \x01(\tR\tvalidHost\x12V\n" + + "\x10original_request\x18\x02 \x01(\v2+.grpc.reflection.v1.ServerReflectionRequestR\x0foriginalRequest\x12f\n" + + "\x18file_descriptor_response\x18\x04 \x01(\v2*.grpc.reflection.v1.FileDescriptorResponseH\x00R\x16fileDescriptorResponse\x12r\n" + + "\x1eall_extension_numbers_response\x18\x05 \x01(\v2+.grpc.reflection.v1.ExtensionNumberResponseH\x00R\x1ballExtensionNumbersResponse\x12_\n" + + "\x16list_services_response\x18\x06 \x01(\v2'.grpc.reflection.v1.ListServiceResponseH\x00R\x14listServicesResponse\x12J\n" + + "\x0eerror_response\x18\a \x01(\v2!.grpc.reflection.v1.ErrorResponseH\x00R\rerrorResponseB\x12\n" + + "\x10message_response\"L\n" + + "\x16FileDescriptorResponse\x122\n" + + "\x15file_descriptor_proto\x18\x01 \x03(\fR\x13fileDescriptorProto\"j\n" + + "\x17ExtensionNumberResponse\x12$\n" + + "\x0ebase_type_name\x18\x01 \x01(\tR\fbaseTypeName\x12)\n" + + "\x10extension_number\x18\x02 \x03(\x05R\x0fextensionNumber\"T\n" + + "\x13ListServiceResponse\x12=\n" + + "\aservice\x18\x01 \x03(\v2#.grpc.reflection.v1.ServiceResponseR\aservice\"%\n" + + "\x0fServiceResponse\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"S\n" + + "\rErrorResponse\x12\x1d\n" + + "\n" + + "error_code\x18\x01 \x01(\x05R\terrorCode\x12#\n" + + "\rerror_message\x18\x02 \x01(\tR\ferrorMessage2\x89\x01\n" + + "\x10ServerReflection\x12u\n" + + "\x14ServerReflectionInfo\x12+.grpc.reflection.v1.ServerReflectionRequest\x1a,.grpc.reflection.v1.ServerReflectionResponse(\x010\x01Bf\n" + + "\x15io.grpc.reflection.v1B\x15ServerReflectionProtoP\x01Z4google.golang.org/grpc/reflection/grpc_reflection_v1b\x06proto3" var ( file_grpc_reflection_v1_reflection_proto_rawDescOnce sync.Once - file_grpc_reflection_v1_reflection_proto_rawDescData = file_grpc_reflection_v1_reflection_proto_rawDesc + file_grpc_reflection_v1_reflection_proto_rawDescData []byte ) func file_grpc_reflection_v1_reflection_proto_rawDescGZIP() []byte { file_grpc_reflection_v1_reflection_proto_rawDescOnce.Do(func() { - file_grpc_reflection_v1_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_reflection_v1_reflection_proto_rawDescData) + file_grpc_reflection_v1_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1_reflection_proto_rawDesc), len(file_grpc_reflection_v1_reflection_proto_rawDesc))) }) return file_grpc_reflection_v1_reflection_proto_rawDescData } var file_grpc_reflection_v1_reflection_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_grpc_reflection_v1_reflection_proto_goTypes = []interface{}{ +var file_grpc_reflection_v1_reflection_proto_goTypes = []any{ (*ServerReflectionRequest)(nil), // 0: grpc.reflection.v1.ServerReflectionRequest (*ExtensionRequest)(nil), // 1: grpc.reflection.v1.ExtensionRequest (*ServerReflectionResponse)(nil), // 2: grpc.reflection.v1.ServerReflectionResponse @@ -821,112 +744,14 @@ func file_grpc_reflection_v1_reflection_proto_init() { if File_grpc_reflection_v1_reflection_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_reflection_v1_reflection_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileDescriptorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionNumberResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_reflection_v1_reflection_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_grpc_reflection_v1_reflection_proto_msgTypes[0].OneofWrappers = []any{ (*ServerReflectionRequest_FileByFilename)(nil), (*ServerReflectionRequest_FileContainingSymbol)(nil), (*ServerReflectionRequest_FileContainingExtension)(nil), (*ServerReflectionRequest_AllExtensionNumbersOfType)(nil), (*ServerReflectionRequest_ListServices)(nil), } - file_grpc_reflection_v1_reflection_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_grpc_reflection_v1_reflection_proto_msgTypes[2].OneofWrappers = []any{ (*ServerReflectionResponse_FileDescriptorResponse)(nil), (*ServerReflectionResponse_AllExtensionNumbersResponse)(nil), (*ServerReflectionResponse_ListServicesResponse)(nil), @@ -936,7 +761,7 @@ func file_grpc_reflection_v1_reflection_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_reflection_v1_reflection_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1_reflection_proto_rawDesc), len(file_grpc_reflection_v1_reflection_proto_rawDesc)), NumEnums: 0, NumMessages: 8, NumExtensions: 0, @@ -947,7 +772,6 @@ func file_grpc_reflection_v1_reflection_proto_init() { MessageInfos: file_grpc_reflection_v1_reflection_proto_msgTypes, }.Build() File_grpc_reflection_v1_reflection_proto = out.File - file_grpc_reflection_v1_reflection_proto_rawDesc = nil file_grpc_reflection_v1_reflection_proto_goTypes = nil file_grpc_reflection_v1_reflection_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go index d6cdd5b54c..f4a361c644 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1/reflection_grpc.pb.go @@ -21,8 +21,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // source: grpc/reflection/v1/reflection.proto package grpc_reflection_v1 @@ -36,8 +36,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( ServerReflection_ServerReflectionInfo_FullMethodName = "/grpc.reflection.v1.ServerReflection/ServerReflectionInfo" @@ -49,7 +49,7 @@ const ( type ServerReflectionClient interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) + ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) } type serverReflectionClient struct { @@ -60,53 +60,39 @@ func NewServerReflectionClient(cc grpc.ClientConnInterface) ServerReflectionClie return &serverReflectionClient{cc} } -func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, opts...) +func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &serverReflectionServerReflectionInfoClient{stream} + x := &grpc.GenericClientStream[ServerReflectionRequest, ServerReflectionResponse]{ClientStream: stream} return x, nil } -type ServerReflection_ServerReflectionInfoClient interface { - Send(*ServerReflectionRequest) error - Recv() (*ServerReflectionResponse, error) - grpc.ClientStream -} - -type serverReflectionServerReflectionInfoClient struct { - grpc.ClientStream -} - -func (x *serverReflectionServerReflectionInfoClient) Send(m *ServerReflectionRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoClient) Recv() (*ServerReflectionResponse, error) { - m := new(ServerReflectionResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoClient = grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse] // ServerReflectionServer is the server API for ServerReflection service. // All implementations should embed UnimplementedServerReflectionServer -// for forward compatibility +// for forward compatibility. type ServerReflectionServer interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error + ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error } -// UnimplementedServerReflectionServer should be embedded to have forward compatible implementations. -type UnimplementedServerReflectionServer struct { -} +// UnimplementedServerReflectionServer should be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedServerReflectionServer struct{} -func (UnimplementedServerReflectionServer) ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error { - return status.Errorf(codes.Unimplemented, "method ServerReflectionInfo not implemented") +func (UnimplementedServerReflectionServer) ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error { + return status.Error(codes.Unimplemented, "method ServerReflectionInfo not implemented") } +func (UnimplementedServerReflectionServer) testEmbeddedByValue() {} // UnsafeServerReflectionServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ServerReflectionServer will @@ -116,34 +102,22 @@ type UnsafeServerReflectionServer interface { } func RegisterServerReflectionServer(s grpc.ServiceRegistrar, srv ServerReflectionServer) { + // If the following call panics, it indicates UnimplementedServerReflectionServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&ServerReflection_ServiceDesc, srv) } func _ServerReflection_ServerReflectionInfo_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{stream}) -} - -type ServerReflection_ServerReflectionInfoServer interface { - Send(*ServerReflectionResponse) error - Recv() (*ServerReflectionRequest, error) - grpc.ServerStream -} - -type serverReflectionServerReflectionInfoServer struct { - grpc.ServerStream + return srv.(ServerReflectionServer).ServerReflectionInfo(&grpc.GenericServerStream[ServerReflectionRequest, ServerReflectionResponse]{ServerStream: stream}) } -func (x *serverReflectionServerReflectionInfoServer) Send(m *ServerReflectionResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoServer) Recv() (*ServerReflectionRequest, error) { - m := new(ServerReflectionRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoServer = grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse] // ServerReflection_ServiceDesc is the grpc.ServiceDesc for ServerReflection service. // It's only intended for direct use with grpc.RegisterService, diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go index 929733e7bd..5253e862f0 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.2 +// protoc-gen-go v1.36.6 +// protoc v5.27.1 // grpc/reflection/v1alpha/reflection.proto is a deprecated file. package grpc_reflection_v1alpha @@ -29,6 +29,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -42,17 +43,14 @@ const ( // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ServerReflectionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // To use reflection service, the client should set one of the following // fields in message_request. The server distinguishes requests by their // defined field and then handles them using corresponding methods. // - // Types that are assignable to MessageRequest: + // Types that are valid to be assigned to MessageRequest: // // *ServerReflectionRequest_FileByFilename // *ServerReflectionRequest_FileContainingSymbol @@ -60,15 +58,15 @@ type ServerReflectionRequest struct { // *ServerReflectionRequest_AllExtensionNumbersOfType // *ServerReflectionRequest_ListServices MessageRequest isServerReflectionRequest_MessageRequest `protobuf_oneof:"message_request"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionRequest) Reset() { *x = ServerReflectionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionRequest) String() string { @@ -79,7 +77,7 @@ func (*ServerReflectionRequest) ProtoMessage() {} func (x *ServerReflectionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -102,49 +100,59 @@ func (x *ServerReflectionRequest) GetHost() string { return "" } -func (m *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { - if m != nil { - return m.MessageRequest +func (x *ServerReflectionRequest) GetMessageRequest() isServerReflectionRequest_MessageRequest { + if x != nil { + return x.MessageRequest } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetFileByFilename() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileByFilename); ok { - return x.FileByFilename + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileByFilename); ok { + return x.FileByFilename + } } return "" } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetFileContainingSymbol() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingSymbol); ok { - return x.FileContainingSymbol + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingSymbol); ok { + return x.FileContainingSymbol + } } return "" } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetFileContainingExtension() *ExtensionRequest { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_FileContainingExtension); ok { - return x.FileContainingExtension + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_FileContainingExtension); ok { + return x.FileContainingExtension + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetAllExtensionNumbersOfType() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { - return x.AllExtensionNumbersOfType + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_AllExtensionNumbersOfType); ok { + return x.AllExtensionNumbersOfType + } } return "" } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionRequest) GetListServices() string { - if x, ok := x.GetMessageRequest().(*ServerReflectionRequest_ListServices); ok { - return x.ListServices + if x != nil { + if x, ok := x.MessageRequest.(*ServerReflectionRequest_ListServices); ok { + return x.ListServices + } } return "" } @@ -215,25 +223,22 @@ func (*ServerReflectionRequest_ListServices) isServerReflectionRequest_MessageRe // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ExtensionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Fully-qualified type name. The format should be . // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ContainingType string `protobuf:"bytes,1,opt,name=containing_type,json=containingType,proto3" json:"containing_type,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ExtensionNumber int32 `protobuf:"varint,2,opt,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionRequest) Reset() { *x = ExtensionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionRequest) String() string { @@ -244,7 +249,7 @@ func (*ExtensionRequest) ProtoMessage() {} func (x *ExtensionRequest) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -279,10 +284,7 @@ func (x *ExtensionRequest) GetExtensionNumber() int32 { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ServerReflectionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ValidHost string `protobuf:"bytes,1,opt,name=valid_host,json=validHost,proto3" json:"valid_host,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. @@ -290,22 +292,22 @@ type ServerReflectionResponse struct { // The server set one of the following fields according to the message_request // in the request. // - // Types that are assignable to MessageResponse: + // Types that are valid to be assigned to MessageResponse: // // *ServerReflectionResponse_FileDescriptorResponse // *ServerReflectionResponse_AllExtensionNumbersResponse // *ServerReflectionResponse_ListServicesResponse // *ServerReflectionResponse_ErrorResponse MessageResponse isServerReflectionResponse_MessageResponse `protobuf_oneof:"message_response"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerReflectionResponse) Reset() { *x = ServerReflectionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerReflectionResponse) String() string { @@ -316,7 +318,7 @@ func (*ServerReflectionResponse) ProtoMessage() {} func (x *ServerReflectionResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -347,41 +349,49 @@ func (x *ServerReflectionResponse) GetOriginalRequest() *ServerReflectionRequest return nil } -func (m *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { - if m != nil { - return m.MessageResponse +func (x *ServerReflectionResponse) GetMessageResponse() isServerReflectionResponse_MessageResponse { + if x != nil { + return x.MessageResponse } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetFileDescriptorResponse() *FileDescriptorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_FileDescriptorResponse); ok { - return x.FileDescriptorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_FileDescriptorResponse); ok { + return x.FileDescriptorResponse + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetAllExtensionNumbersResponse() *ExtensionNumberResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { - return x.AllExtensionNumbersResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_AllExtensionNumbersResponse); ok { + return x.AllExtensionNumbersResponse + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetListServicesResponse() *ListServiceResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ListServicesResponse); ok { - return x.ListServicesResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ListServicesResponse); ok { + return x.ListServicesResponse + } } return nil } // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. func (x *ServerReflectionResponse) GetErrorResponse() *ErrorResponse { - if x, ok := x.GetMessageResponse().(*ServerReflectionResponse_ErrorResponse); ok { - return x.ErrorResponse + if x != nil { + if x, ok := x.MessageResponse.(*ServerReflectionResponse_ErrorResponse); ok { + return x.ErrorResponse + } } return nil } @@ -403,7 +413,7 @@ type ServerReflectionResponse_FileDescriptorResponse struct { } type ServerReflectionResponse_AllExtensionNumbersResponse struct { - // This message is used to answer all_extension_numbers_of_type requst. + // This message is used to answer all_extension_numbers_of_type request. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. AllExtensionNumbersResponse *ExtensionNumberResponse `protobuf:"bytes,5,opt,name=all_extension_numbers_response,json=allExtensionNumbersResponse,proto3,oneof"` @@ -439,25 +449,22 @@ func (*ServerReflectionResponse_ErrorResponse) isServerReflectionResponse_Messag // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type FileDescriptorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Serialized FileDescriptorProto messages. We avoid taking a dependency on // descriptor.proto, which uses proto2 only features, by making them opaque // bytes instead. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. FileDescriptorProto [][]byte `protobuf:"bytes,1,rep,name=file_descriptor_proto,json=fileDescriptorProto,proto3" json:"file_descriptor_proto,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FileDescriptorResponse) Reset() { *x = FileDescriptorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *FileDescriptorResponse) String() string { @@ -468,7 +475,7 @@ func (*FileDescriptorResponse) ProtoMessage() {} func (x *FileDescriptorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -496,10 +503,7 @@ func (x *FileDescriptorResponse) GetFileDescriptorProto() [][]byte { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ExtensionNumberResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of the base type, including the package name. The format // is . // @@ -507,15 +511,15 @@ type ExtensionNumberResponse struct { BaseTypeName string `protobuf:"bytes,1,opt,name=base_type_name,json=baseTypeName,proto3" json:"base_type_name,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ExtensionNumber []int32 `protobuf:"varint,2,rep,packed,name=extension_number,json=extensionNumber,proto3" json:"extension_number,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionNumberResponse) Reset() { *x = ExtensionNumberResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExtensionNumberResponse) String() string { @@ -526,7 +530,7 @@ func (*ExtensionNumberResponse) ProtoMessage() {} func (x *ExtensionNumberResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -561,24 +565,21 @@ func (x *ExtensionNumberResponse) GetExtensionNumber() []int32 { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ListServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The information of each service may be expanded in the future, so we use // ServiceResponse message to encapsulate it. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. - Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + Service []*ServiceResponse `protobuf:"bytes,1,rep,name=service,proto3" json:"service,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListServiceResponse) Reset() { *x = ListServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListServiceResponse) String() string { @@ -589,7 +590,7 @@ func (*ListServiceResponse) ProtoMessage() {} func (x *ListServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -617,24 +618,21 @@ func (x *ListServiceResponse) GetService() []*ServiceResponse { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ServiceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Full name of a registered service, including its package name. The format // is . // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServiceResponse) Reset() { *x = ServiceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServiceResponse) String() string { @@ -645,7 +643,7 @@ func (*ServiceResponse) ProtoMessage() {} func (x *ServiceResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -672,25 +670,22 @@ func (x *ServiceResponse) GetName() string { // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. type ErrorResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // This field uses the error codes defined in grpc::StatusCode. // // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` // Deprecated: The entire proto file grpc/reflection/v1alpha/reflection.proto is marked as deprecated. - ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ErrorResponse) Reset() { *x = ErrorResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ErrorResponse) String() string { @@ -701,7 +696,7 @@ func (*ErrorResponse) ProtoMessage() {} func (x *ErrorResponse) ProtoReflect() protoreflect.Message { mi := &file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -734,137 +729,60 @@ func (x *ErrorResponse) GetErrorMessage() string { var File_grpc_reflection_v1alpha_reflection_proto protoreflect.FileDescriptor -var file_grpc_reflection_v1alpha_reflection_proto_rawDesc = []byte{ - 0x0a, 0x28, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x22, 0xf8, 0x02, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, - 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, - 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x67, 0x0a, 0x19, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x42, 0x0a, 0x1d, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x4f, 0x66, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6c, - 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, - 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xc7, 0x04, 0x0a, 0x18, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x6f, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x10, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0f, - 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x6b, 0x0a, 0x18, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x1e, - 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1b, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x16, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x14, 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x12, 0x0a, 0x10, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4c, 0x0a, 0x16, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6a, - 0x0a, 0x17, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x61, 0x73, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x29, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x59, 0x0a, 0x13, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x42, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x0d, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x32, 0x93, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7f, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x30, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x73, 0x0a, 0x1a, 0x69, 0x6f, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x42, 0x15, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x66, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x39, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, - 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xb8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} +const file_grpc_reflection_v1alpha_reflection_proto_rawDesc = "" + + "\n" + + "(grpc/reflection/v1alpha/reflection.proto\x12\x17grpc.reflection.v1alpha\"\xf8\x02\n" + + "\x17ServerReflectionRequest\x12\x12\n" + + "\x04host\x18\x01 \x01(\tR\x04host\x12*\n" + + "\x10file_by_filename\x18\x03 \x01(\tH\x00R\x0efileByFilename\x126\n" + + "\x16file_containing_symbol\x18\x04 \x01(\tH\x00R\x14fileContainingSymbol\x12g\n" + + "\x19file_containing_extension\x18\x05 \x01(\v2).grpc.reflection.v1alpha.ExtensionRequestH\x00R\x17fileContainingExtension\x12B\n" + + "\x1dall_extension_numbers_of_type\x18\x06 \x01(\tH\x00R\x19allExtensionNumbersOfType\x12%\n" + + "\rlist_services\x18\a \x01(\tH\x00R\flistServicesB\x11\n" + + "\x0fmessage_request\"f\n" + + "\x10ExtensionRequest\x12'\n" + + "\x0fcontaining_type\x18\x01 \x01(\tR\x0econtainingType\x12)\n" + + "\x10extension_number\x18\x02 \x01(\x05R\x0fextensionNumber\"\xc7\x04\n" + + "\x18ServerReflectionResponse\x12\x1d\n" + + "\n" + + "valid_host\x18\x01 \x01(\tR\tvalidHost\x12[\n" + + "\x10original_request\x18\x02 \x01(\v20.grpc.reflection.v1alpha.ServerReflectionRequestR\x0foriginalRequest\x12k\n" + + "\x18file_descriptor_response\x18\x04 \x01(\v2/.grpc.reflection.v1alpha.FileDescriptorResponseH\x00R\x16fileDescriptorResponse\x12w\n" + + "\x1eall_extension_numbers_response\x18\x05 \x01(\v20.grpc.reflection.v1alpha.ExtensionNumberResponseH\x00R\x1ballExtensionNumbersResponse\x12d\n" + + "\x16list_services_response\x18\x06 \x01(\v2,.grpc.reflection.v1alpha.ListServiceResponseH\x00R\x14listServicesResponse\x12O\n" + + "\x0eerror_response\x18\a \x01(\v2&.grpc.reflection.v1alpha.ErrorResponseH\x00R\rerrorResponseB\x12\n" + + "\x10message_response\"L\n" + + "\x16FileDescriptorResponse\x122\n" + + "\x15file_descriptor_proto\x18\x01 \x03(\fR\x13fileDescriptorProto\"j\n" + + "\x17ExtensionNumberResponse\x12$\n" + + "\x0ebase_type_name\x18\x01 \x01(\tR\fbaseTypeName\x12)\n" + + "\x10extension_number\x18\x02 \x03(\x05R\x0fextensionNumber\"Y\n" + + "\x13ListServiceResponse\x12B\n" + + "\aservice\x18\x01 \x03(\v2(.grpc.reflection.v1alpha.ServiceResponseR\aservice\"%\n" + + "\x0fServiceResponse\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"S\n" + + "\rErrorResponse\x12\x1d\n" + + "\n" + + "error_code\x18\x01 \x01(\x05R\terrorCode\x12#\n" + + "\rerror_message\x18\x02 \x01(\tR\ferrorMessage2\x93\x01\n" + + "\x10ServerReflection\x12\x7f\n" + + "\x14ServerReflectionInfo\x120.grpc.reflection.v1alpha.ServerReflectionRequest\x1a1.grpc.reflection.v1alpha.ServerReflectionResponse(\x010\x01Bs\n" + + "\x1aio.grpc.reflection.v1alphaB\x15ServerReflectionProtoP\x01Z9google.golang.org/grpc/reflection/grpc_reflection_v1alpha\xb8\x01\x01b\x06proto3" var ( file_grpc_reflection_v1alpha_reflection_proto_rawDescOnce sync.Once - file_grpc_reflection_v1alpha_reflection_proto_rawDescData = file_grpc_reflection_v1alpha_reflection_proto_rawDesc + file_grpc_reflection_v1alpha_reflection_proto_rawDescData []byte ) func file_grpc_reflection_v1alpha_reflection_proto_rawDescGZIP() []byte { file_grpc_reflection_v1alpha_reflection_proto_rawDescOnce.Do(func() { - file_grpc_reflection_v1alpha_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(file_grpc_reflection_v1alpha_reflection_proto_rawDescData) + file_grpc_reflection_v1alpha_reflection_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1alpha_reflection_proto_rawDesc), len(file_grpc_reflection_v1alpha_reflection_proto_rawDesc))) }) return file_grpc_reflection_v1alpha_reflection_proto_rawDescData } var file_grpc_reflection_v1alpha_reflection_proto_msgTypes = make([]protoimpl.MessageInfo, 8) -var file_grpc_reflection_v1alpha_reflection_proto_goTypes = []interface{}{ +var file_grpc_reflection_v1alpha_reflection_proto_goTypes = []any{ (*ServerReflectionRequest)(nil), // 0: grpc.reflection.v1alpha.ServerReflectionRequest (*ExtensionRequest)(nil), // 1: grpc.reflection.v1alpha.ExtensionRequest (*ServerReflectionResponse)(nil), // 2: grpc.reflection.v1alpha.ServerReflectionResponse @@ -896,112 +814,14 @@ func file_grpc_reflection_v1alpha_reflection_proto_init() { if File_grpc_reflection_v1alpha_reflection_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerReflectionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileDescriptorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionNumberResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_grpc_reflection_v1alpha_reflection_proto_msgTypes[0].OneofWrappers = []any{ (*ServerReflectionRequest_FileByFilename)(nil), (*ServerReflectionRequest_FileContainingSymbol)(nil), (*ServerReflectionRequest_FileContainingExtension)(nil), (*ServerReflectionRequest_AllExtensionNumbersOfType)(nil), (*ServerReflectionRequest_ListServices)(nil), } - file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_grpc_reflection_v1alpha_reflection_proto_msgTypes[2].OneofWrappers = []any{ (*ServerReflectionResponse_FileDescriptorResponse)(nil), (*ServerReflectionResponse_AllExtensionNumbersResponse)(nil), (*ServerReflectionResponse_ListServicesResponse)(nil), @@ -1011,7 +831,7 @@ func file_grpc_reflection_v1alpha_reflection_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_grpc_reflection_v1alpha_reflection_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_grpc_reflection_v1alpha_reflection_proto_rawDesc), len(file_grpc_reflection_v1alpha_reflection_proto_rawDesc)), NumEnums: 0, NumMessages: 8, NumExtensions: 0, @@ -1022,7 +842,6 @@ func file_grpc_reflection_v1alpha_reflection_proto_init() { MessageInfos: file_grpc_reflection_v1alpha_reflection_proto_msgTypes, }.Build() File_grpc_reflection_v1alpha_reflection_proto = out.File - file_grpc_reflection_v1alpha_reflection_proto_rawDesc = nil file_grpc_reflection_v1alpha_reflection_proto_goTypes = nil file_grpc_reflection_v1alpha_reflection_proto_depIdxs = nil } diff --git a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go index ef69140635..0a43b521c9 100644 --- a/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go +++ b/vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go @@ -18,8 +18,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.2 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.27.1 // grpc/reflection/v1alpha/reflection.proto is a deprecated file. package grpc_reflection_v1alpha @@ -33,8 +33,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( ServerReflection_ServerReflectionInfo_FullMethodName = "/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo" @@ -46,7 +46,7 @@ const ( type ServerReflectionClient interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) + ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) } type serverReflectionClient struct { @@ -57,53 +57,39 @@ func NewServerReflectionClient(cc grpc.ClientConnInterface) ServerReflectionClie return &serverReflectionClient{cc} } -func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (ServerReflection_ServerReflectionInfoClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, opts...) +func (c *serverReflectionClient) ServerReflectionInfo(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &ServerReflection_ServiceDesc.Streams[0], ServerReflection_ServerReflectionInfo_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &serverReflectionServerReflectionInfoClient{stream} + x := &grpc.GenericClientStream[ServerReflectionRequest, ServerReflectionResponse]{ClientStream: stream} return x, nil } -type ServerReflection_ServerReflectionInfoClient interface { - Send(*ServerReflectionRequest) error - Recv() (*ServerReflectionResponse, error) - grpc.ClientStream -} - -type serverReflectionServerReflectionInfoClient struct { - grpc.ClientStream -} - -func (x *serverReflectionServerReflectionInfoClient) Send(m *ServerReflectionRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoClient) Recv() (*ServerReflectionResponse, error) { - m := new(ServerReflectionResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoClient = grpc.BidiStreamingClient[ServerReflectionRequest, ServerReflectionResponse] // ServerReflectionServer is the server API for ServerReflection service. // All implementations should embed UnimplementedServerReflectionServer -// for forward compatibility +// for forward compatibility. type ServerReflectionServer interface { // The reflection service is structured as a bidirectional stream, ensuring // all related requests go to a single server. - ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error + ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error } -// UnimplementedServerReflectionServer should be embedded to have forward compatible implementations. -type UnimplementedServerReflectionServer struct { -} +// UnimplementedServerReflectionServer should be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedServerReflectionServer struct{} -func (UnimplementedServerReflectionServer) ServerReflectionInfo(ServerReflection_ServerReflectionInfoServer) error { - return status.Errorf(codes.Unimplemented, "method ServerReflectionInfo not implemented") +func (UnimplementedServerReflectionServer) ServerReflectionInfo(grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse]) error { + return status.Error(codes.Unimplemented, "method ServerReflectionInfo not implemented") } +func (UnimplementedServerReflectionServer) testEmbeddedByValue() {} // UnsafeServerReflectionServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ServerReflectionServer will @@ -113,34 +99,22 @@ type UnsafeServerReflectionServer interface { } func RegisterServerReflectionServer(s grpc.ServiceRegistrar, srv ServerReflectionServer) { + // If the following call panics, it indicates UnimplementedServerReflectionServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&ServerReflection_ServiceDesc, srv) } func _ServerReflection_ServerReflectionInfo_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(ServerReflectionServer).ServerReflectionInfo(&serverReflectionServerReflectionInfoServer{stream}) -} - -type ServerReflection_ServerReflectionInfoServer interface { - Send(*ServerReflectionResponse) error - Recv() (*ServerReflectionRequest, error) - grpc.ServerStream -} - -type serverReflectionServerReflectionInfoServer struct { - grpc.ServerStream + return srv.(ServerReflectionServer).ServerReflectionInfo(&grpc.GenericServerStream[ServerReflectionRequest, ServerReflectionResponse]{ServerStream: stream}) } -func (x *serverReflectionServerReflectionInfoServer) Send(m *ServerReflectionResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *serverReflectionServerReflectionInfoServer) Recv() (*ServerReflectionRequest, error) { - m := new(ServerReflectionRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type ServerReflection_ServerReflectionInfoServer = grpc.BidiStreamingServer[ServerReflectionRequest, ServerReflectionResponse] // ServerReflection_ServiceDesc is the grpc.ServiceDesc for ServerReflection service. // It's only intended for direct use with grpc.RegisterService, diff --git a/vendor/google.golang.org/grpc/reflection/internal/internal.go b/vendor/google.golang.org/grpc/reflection/internal/internal.go new file mode 100644 index 0000000000..902fc6d35c --- /dev/null +++ b/vendor/google.golang.org/grpc/reflection/internal/internal.go @@ -0,0 +1,436 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Package internal contains code that is shared by both reflection package and +// the test package. The packages are split in this way inorder to avoid +// dependency to deprecated package github.com/golang/protobuf. +package internal + +import ( + "io" + "sort" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + + v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" + v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" + v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" + v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" +) + +// ServiceInfoProvider is an interface used to retrieve metadata about the +// services to expose. +type ServiceInfoProvider interface { + GetServiceInfo() map[string]grpc.ServiceInfo +} + +// ExtensionResolver is the interface used to query details about extensions. +// This interface is satisfied by protoregistry.GlobalTypes. +type ExtensionResolver interface { + protoregistry.ExtensionTypeResolver + RangeExtensionsByMessage(message protoreflect.FullName, f func(protoreflect.ExtensionType) bool) +} + +// ServerReflectionServer is the server API for ServerReflection service. +type ServerReflectionServer struct { + v1alphareflectiongrpc.UnimplementedServerReflectionServer + S ServiceInfoProvider + DescResolver protodesc.Resolver + ExtResolver ExtensionResolver +} + +// FileDescWithDependencies returns a slice of serialized fileDescriptors in +// wire format ([]byte). The fileDescriptors will include fd and all the +// transitive dependencies of fd with names not in sentFileDescriptors. +func (s *ServerReflectionServer) FileDescWithDependencies(fd protoreflect.FileDescriptor, sentFileDescriptors map[string]bool) ([][]byte, error) { + if fd.IsPlaceholder() { + // If the given root file is a placeholder, treat it + // as missing instead of serializing it. + return nil, protoregistry.NotFound + } + var r [][]byte + queue := []protoreflect.FileDescriptor{fd} + for len(queue) > 0 { + currentfd := queue[0] + queue = queue[1:] + if currentfd.IsPlaceholder() { + // Skip any missing files in the dependency graph. + continue + } + if sent := sentFileDescriptors[currentfd.Path()]; len(r) == 0 || !sent { + sentFileDescriptors[currentfd.Path()] = true + fdProto := protodesc.ToFileDescriptorProto(currentfd) + currentfdEncoded, err := proto.Marshal(fdProto) + if err != nil { + return nil, err + } + r = append(r, currentfdEncoded) + } + for i := 0; i < currentfd.Imports().Len(); i++ { + queue = append(queue, currentfd.Imports().Get(i)) + } + } + return r, nil +} + +// FileDescEncodingContainingSymbol finds the file descriptor containing the +// given symbol, finds all of its previously unsent transitive dependencies, +// does marshalling on them, and returns the marshalled result. The given symbol +// can be a type, a service or a method. +func (s *ServerReflectionServer) FileDescEncodingContainingSymbol(name string, sentFileDescriptors map[string]bool) ([][]byte, error) { + d, err := s.DescResolver.FindDescriptorByName(protoreflect.FullName(name)) + if err != nil { + return nil, err + } + return s.FileDescWithDependencies(d.ParentFile(), sentFileDescriptors) +} + +// FileDescEncodingContainingExtension finds the file descriptor containing +// given extension, finds all of its previously unsent transitive dependencies, +// does marshalling on them, and returns the marshalled result. +func (s *ServerReflectionServer) FileDescEncodingContainingExtension(typeName string, extNum int32, sentFileDescriptors map[string]bool) ([][]byte, error) { + xt, err := s.ExtResolver.FindExtensionByNumber(protoreflect.FullName(typeName), protoreflect.FieldNumber(extNum)) + if err != nil { + return nil, err + } + return s.FileDescWithDependencies(xt.TypeDescriptor().ParentFile(), sentFileDescriptors) +} + +// AllExtensionNumbersForTypeName returns all extension numbers for the given type. +func (s *ServerReflectionServer) AllExtensionNumbersForTypeName(name string) ([]int32, error) { + var numbers []int32 + s.ExtResolver.RangeExtensionsByMessage(protoreflect.FullName(name), func(xt protoreflect.ExtensionType) bool { + numbers = append(numbers, int32(xt.TypeDescriptor().Number())) + return true + }) + sort.Slice(numbers, func(i, j int) bool { + return numbers[i] < numbers[j] + }) + if len(numbers) == 0 { + // maybe return an error if given type name is not known + if _, err := s.DescResolver.FindDescriptorByName(protoreflect.FullName(name)); err != nil { + return nil, err + } + } + return numbers, nil +} + +// ListServices returns the names of services this server exposes. +func (s *ServerReflectionServer) ListServices() []*v1reflectionpb.ServiceResponse { + serviceInfo := s.S.GetServiceInfo() + resp := make([]*v1reflectionpb.ServiceResponse, 0, len(serviceInfo)) + for svc := range serviceInfo { + resp = append(resp, &v1reflectionpb.ServiceResponse{Name: svc}) + } + sort.Slice(resp, func(i, j int) bool { + return resp[i].Name < resp[j].Name + }) + return resp +} + +// ServerReflectionInfo is the reflection service handler. +func (s *ServerReflectionServer) ServerReflectionInfo(stream v1reflectiongrpc.ServerReflection_ServerReflectionInfoServer) error { + sentFileDescriptors := make(map[string]bool) + for { + in, err := stream.Recv() + if err == io.EOF { + return nil + } + if err != nil { + return err + } + + out := &v1reflectionpb.ServerReflectionResponse{ + ValidHost: in.Host, + OriginalRequest: in, + } + switch req := in.MessageRequest.(type) { + case *v1reflectionpb.ServerReflectionRequest_FileByFilename: + var b [][]byte + fd, err := s.DescResolver.FindFileByPath(req.FileByFilename) + if err == nil { + b, err = s.FileDescWithDependencies(fd, sentFileDescriptors) + } + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: + b, err := s.FileDescEncodingContainingSymbol(req.FileContainingSymbol, sentFileDescriptors) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: + typeName := req.FileContainingExtension.ContainingType + extNum := req.FileContainingExtension.ExtensionNumber + b, err := s.FileDescEncodingContainingExtension(typeName, extNum, sentFileDescriptors) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, + } + } + case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + extNums, err := s.AllExtensionNumbersForTypeName(req.AllExtensionNumbersOfType) + if err != nil { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: int32(codes.NotFound), + ErrorMessage: err.Error(), + }, + } + } else { + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ + BaseTypeName: req.AllExtensionNumbersOfType, + ExtensionNumber: extNums, + }, + } + } + case *v1reflectionpb.ServerReflectionRequest_ListServices: + out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1reflectionpb.ListServiceResponse{ + Service: s.ListServices(), + }, + } + default: + return status.Errorf(codes.InvalidArgument, "invalid MessageRequest: %v", in.MessageRequest) + } + + if err := stream.Send(out); err != nil { + return err + } + } +} + +// V1ToV1AlphaResponse converts a v1 ServerReflectionResponse to a v1alpha. +func V1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse { + var v1alpha v1alphareflectionpb.ServerReflectionResponse + v1alpha.ValidHost = v1.ValidHost + if v1.OriginalRequest != nil { + v1alpha.OriginalRequest = V1ToV1AlphaRequest(v1.OriginalRequest) + } + switch mr := v1.MessageResponse.(type) { + case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{ + FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{ + BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), + ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse: + if mr != nil { + svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) + for i, svc := range mr.ListServicesResponse.GetService() { + svcs[i] = &v1alphareflectionpb.ServiceResponse{ + Name: svc.GetName(), + } + } + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{ + Service: svcs, + }, + } + } + case *v1reflectionpb.ServerReflectionResponse_ErrorResponse: + if mr != nil { + v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1alphareflectionpb.ErrorResponse{ + ErrorCode: mr.ErrorResponse.GetErrorCode(), + ErrorMessage: mr.ErrorResponse.GetErrorMessage(), + }, + } + } + default: + // no value set + } + return &v1alpha +} + +// V1AlphaToV1Request converts a v1alpha ServerReflectionRequest to a v1. +func V1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest { + var v1 v1reflectionpb.ServerReflectionRequest + v1.Host = v1alpha.Host + switch mr := v1alpha.MessageRequest.(type) { + case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{ + FileByFilename: mr.FileByFilename, + } + case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{ + FileContainingSymbol: mr.FileContainingSymbol, + } + case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension: + if mr.FileContainingExtension != nil { + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{ + FileContainingExtension: &v1reflectionpb.ExtensionRequest{ + ContainingType: mr.FileContainingExtension.GetContainingType(), + ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ + AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, + } + case *v1alphareflectionpb.ServerReflectionRequest_ListServices: + v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{ + ListServices: mr.ListServices, + } + default: + // no value set + } + return &v1 +} + +// V1ToV1AlphaRequest converts a v1 ServerReflectionRequest to a v1alpha. +func V1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest { + var v1alpha v1alphareflectionpb.ServerReflectionRequest + v1alpha.Host = v1.Host + switch mr := v1.MessageRequest.(type) { + case *v1reflectionpb.ServerReflectionRequest_FileByFilename: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{ + FileByFilename: mr.FileByFilename, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{ + FileContainingSymbol: mr.FileContainingSymbol, + } + } + case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{ + FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{ + ContainingType: mr.FileContainingExtension.GetContainingType(), + ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(), + }, + } + } + case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{ + AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType, + } + } + case *v1reflectionpb.ServerReflectionRequest_ListServices: + if mr != nil { + v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{ + ListServices: mr.ListServices, + } + } + default: + // no value set + } + return &v1alpha +} + +// V1AlphaToV1Response converts a v1alpha ServerReflectionResponse to a v1. +func V1AlphaToV1Response(v1alpha *v1alphareflectionpb.ServerReflectionResponse) *v1reflectionpb.ServerReflectionResponse { + var v1 v1reflectionpb.ServerReflectionResponse + v1.ValidHost = v1alpha.ValidHost + if v1alpha.OriginalRequest != nil { + v1.OriginalRequest = V1AlphaToV1Request(v1alpha.OriginalRequest) + } + switch mr := v1alpha.MessageResponse.(type) { + case *v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ + FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{ + FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ + AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ + BaseTypeName: mr.AllExtensionNumbersResponse.GetBaseTypeName(), + ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(), + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse: + if mr != nil { + svcs := make([]*v1reflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService())) + for i, svc := range mr.ListServicesResponse.GetService() { + svcs[i] = &v1reflectionpb.ServiceResponse{ + Name: svc.GetName(), + } + } + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ + ListServicesResponse: &v1reflectionpb.ListServiceResponse{ + Service: svcs, + }, + } + } + case *v1alphareflectionpb.ServerReflectionResponse_ErrorResponse: + if mr != nil { + v1.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ + ErrorResponse: &v1reflectionpb.ErrorResponse{ + ErrorCode: mr.ErrorResponse.GetErrorCode(), + ErrorMessage: mr.ErrorResponse.GetErrorMessage(), + }, + } + } + default: + // no value set + } + return &v1 +} diff --git a/vendor/google.golang.org/grpc/reflection/serverreflection.go b/vendor/google.golang.org/grpc/reflection/serverreflection.go index c3b408392f..13a94e2dd2 100644 --- a/vendor/google.golang.org/grpc/reflection/serverreflection.go +++ b/vendor/google.golang.org/grpc/reflection/serverreflection.go @@ -37,19 +37,13 @@ To register server reflection on a gRPC server: package reflection // import "google.golang.org/grpc/reflection" import ( - "io" - "sort" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" + "google.golang.org/grpc/reflection/internal" "google.golang.org/protobuf/reflect/protodesc" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1" - v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1" v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha" ) @@ -158,203 +152,9 @@ func NewServerV1(opts ServerOptions) v1reflectiongrpc.ServerReflectionServer { if opts.ExtensionResolver == nil { opts.ExtensionResolver = protoregistry.GlobalTypes } - return &serverReflectionServer{ - s: opts.Services, - descResolver: opts.DescriptorResolver, - extResolver: opts.ExtensionResolver, - } -} - -type serverReflectionServer struct { - v1alphareflectiongrpc.UnimplementedServerReflectionServer - s ServiceInfoProvider - descResolver protodesc.Resolver - extResolver ExtensionResolver -} - -// fileDescWithDependencies returns a slice of serialized fileDescriptors in -// wire format ([]byte). The fileDescriptors will include fd and all the -// transitive dependencies of fd with names not in sentFileDescriptors. -func (s *serverReflectionServer) fileDescWithDependencies(fd protoreflect.FileDescriptor, sentFileDescriptors map[string]bool) ([][]byte, error) { - if fd.IsPlaceholder() { - // If the given root file is a placeholder, treat it - // as missing instead of serializing it. - return nil, protoregistry.NotFound - } - var r [][]byte - queue := []protoreflect.FileDescriptor{fd} - for len(queue) > 0 { - currentfd := queue[0] - queue = queue[1:] - if currentfd.IsPlaceholder() { - // Skip any missing files in the dependency graph. - continue - } - if sent := sentFileDescriptors[currentfd.Path()]; len(r) == 0 || !sent { - sentFileDescriptors[currentfd.Path()] = true - fdProto := protodesc.ToFileDescriptorProto(currentfd) - currentfdEncoded, err := proto.Marshal(fdProto) - if err != nil { - return nil, err - } - r = append(r, currentfdEncoded) - } - for i := 0; i < currentfd.Imports().Len(); i++ { - queue = append(queue, currentfd.Imports().Get(i)) - } - } - return r, nil -} - -// fileDescEncodingContainingSymbol finds the file descriptor containing the -// given symbol, finds all of its previously unsent transitive dependencies, -// does marshalling on them, and returns the marshalled result. The given symbol -// can be a type, a service or a method. -func (s *serverReflectionServer) fileDescEncodingContainingSymbol(name string, sentFileDescriptors map[string]bool) ([][]byte, error) { - d, err := s.descResolver.FindDescriptorByName(protoreflect.FullName(name)) - if err != nil { - return nil, err - } - return s.fileDescWithDependencies(d.ParentFile(), sentFileDescriptors) -} - -// fileDescEncodingContainingExtension finds the file descriptor containing -// given extension, finds all of its previously unsent transitive dependencies, -// does marshalling on them, and returns the marshalled result. -func (s *serverReflectionServer) fileDescEncodingContainingExtension(typeName string, extNum int32, sentFileDescriptors map[string]bool) ([][]byte, error) { - xt, err := s.extResolver.FindExtensionByNumber(protoreflect.FullName(typeName), protoreflect.FieldNumber(extNum)) - if err != nil { - return nil, err - } - return s.fileDescWithDependencies(xt.TypeDescriptor().ParentFile(), sentFileDescriptors) -} - -// allExtensionNumbersForTypeName returns all extension numbers for the given type. -func (s *serverReflectionServer) allExtensionNumbersForTypeName(name string) ([]int32, error) { - var numbers []int32 - s.extResolver.RangeExtensionsByMessage(protoreflect.FullName(name), func(xt protoreflect.ExtensionType) bool { - numbers = append(numbers, int32(xt.TypeDescriptor().Number())) - return true - }) - sort.Slice(numbers, func(i, j int) bool { - return numbers[i] < numbers[j] - }) - if len(numbers) == 0 { - // maybe return an error if given type name is not known - if _, err := s.descResolver.FindDescriptorByName(protoreflect.FullName(name)); err != nil { - return nil, err - } - } - return numbers, nil -} - -// listServices returns the names of services this server exposes. -func (s *serverReflectionServer) listServices() []*v1reflectionpb.ServiceResponse { - serviceInfo := s.s.GetServiceInfo() - resp := make([]*v1reflectionpb.ServiceResponse, 0, len(serviceInfo)) - for svc := range serviceInfo { - resp = append(resp, &v1reflectionpb.ServiceResponse{Name: svc}) - } - sort.Slice(resp, func(i, j int) bool { - return resp[i].Name < resp[j].Name - }) - return resp -} - -// ServerReflectionInfo is the reflection service handler. -func (s *serverReflectionServer) ServerReflectionInfo(stream v1reflectiongrpc.ServerReflection_ServerReflectionInfoServer) error { - sentFileDescriptors := make(map[string]bool) - for { - in, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - out := &v1reflectionpb.ServerReflectionResponse{ - ValidHost: in.Host, - OriginalRequest: in, - } - switch req := in.MessageRequest.(type) { - case *v1reflectionpb.ServerReflectionRequest_FileByFilename: - var b [][]byte - fd, err := s.descResolver.FindFileByPath(req.FileByFilename) - if err == nil { - b, err = s.fileDescWithDependencies(fd, sentFileDescriptors) - } - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol: - b, err := s.fileDescEncodingContainingSymbol(req.FileContainingSymbol, sentFileDescriptors) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension: - typeName := req.FileContainingExtension.ContainingType - extNum := req.FileContainingExtension.ExtensionNumber - b, err := s.fileDescEncodingContainingExtension(typeName, extNum, sentFileDescriptors) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse{ - FileDescriptorResponse: &v1reflectionpb.FileDescriptorResponse{FileDescriptorProto: b}, - } - } - case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType: - extNums, err := s.allExtensionNumbersForTypeName(req.AllExtensionNumbersOfType) - if err != nil { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ErrorResponse{ - ErrorResponse: &v1reflectionpb.ErrorResponse{ - ErrorCode: int32(codes.NotFound), - ErrorMessage: err.Error(), - }, - } - } else { - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{ - AllExtensionNumbersResponse: &v1reflectionpb.ExtensionNumberResponse{ - BaseTypeName: req.AllExtensionNumbersOfType, - ExtensionNumber: extNums, - }, - } - } - case *v1reflectionpb.ServerReflectionRequest_ListServices: - out.MessageResponse = &v1reflectionpb.ServerReflectionResponse_ListServicesResponse{ - ListServicesResponse: &v1reflectionpb.ListServiceResponse{ - Service: s.listServices(), - }, - } - default: - return status.Errorf(codes.InvalidArgument, "invalid MessageRequest: %v", in.MessageRequest) - } - - if err := stream.Send(out); err != nil { - return err - } + return &internal.ServerReflectionServer{ + S: opts.Services, + DescResolver: opts.DescriptorResolver, + ExtResolver: opts.ExtensionResolver, } } diff --git a/vendor/google.golang.org/grpc/regenerate.sh b/vendor/google.golang.org/grpc/regenerate.sh deleted file mode 100644 index a6f26c8ab0..0000000000 --- a/vendor/google.golang.org/grpc/regenerate.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/bin/bash -# Copyright 2020 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eu -o pipefail - -WORKDIR=$(mktemp -d) - -function finish { - rm -rf "$WORKDIR" -} -trap finish EXIT - -export GOBIN=${WORKDIR}/bin -export PATH=${GOBIN}:${PATH} -mkdir -p ${GOBIN} - -echo "remove existing generated files" -# grpc_testing_not_regenerate/*.pb.go is not re-generated, -# see grpc_testing_not_regenerate/README.md for details. -rm -f $(find . -name '*.pb.go' | grep -v 'grpc_testing_not_regenerate') - -echo "go install google.golang.org/protobuf/cmd/protoc-gen-go" -(cd test/tools && go install google.golang.org/protobuf/cmd/protoc-gen-go) - -echo "go install cmd/protoc-gen-go-grpc" -(cd cmd/protoc-gen-go-grpc && go install .) - -echo "git clone https://github.com/grpc/grpc-proto" -git clone --quiet https://github.com/grpc/grpc-proto ${WORKDIR}/grpc-proto - -echo "git clone https://github.com/protocolbuffers/protobuf" -git clone --quiet https://github.com/protocolbuffers/protobuf ${WORKDIR}/protobuf - -# Pull in code.proto as a proto dependency -mkdir -p ${WORKDIR}/googleapis/google/rpc -echo "curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto" -curl --silent https://raw.githubusercontent.com/googleapis/googleapis/master/google/rpc/code.proto > ${WORKDIR}/googleapis/google/rpc/code.proto - -mkdir -p ${WORKDIR}/out - -# Generates sources without the embed requirement -LEGACY_SOURCES=( - ${WORKDIR}/grpc-proto/grpc/binlog/v1/binarylog.proto - ${WORKDIR}/grpc-proto/grpc/channelz/v1/channelz.proto - ${WORKDIR}/grpc-proto/grpc/health/v1/health.proto - ${WORKDIR}/grpc-proto/grpc/lb/v1/load_balancer.proto - profiling/proto/service.proto - ${WORKDIR}/grpc-proto/grpc/reflection/v1alpha/reflection.proto - ${WORKDIR}/grpc-proto/grpc/reflection/v1/reflection.proto -) - -# Generates only the new gRPC Service symbols -SOURCES=( - $(git ls-files --exclude-standard --cached --others "*.proto" | grep -v '^\(profiling/proto/service.proto\|reflection/grpc_reflection_v1alpha/reflection.proto\)$') - ${WORKDIR}/grpc-proto/grpc/gcp/altscontext.proto - ${WORKDIR}/grpc-proto/grpc/gcp/handshaker.proto - ${WORKDIR}/grpc-proto/grpc/gcp/transport_security_common.proto - ${WORKDIR}/grpc-proto/grpc/lookup/v1/rls.proto - ${WORKDIR}/grpc-proto/grpc/lookup/v1/rls_config.proto - ${WORKDIR}/grpc-proto/grpc/testing/*.proto - ${WORKDIR}/grpc-proto/grpc/core/*.proto -) - -# These options of the form 'Mfoo.proto=bar' instruct the codegen to use an -# import path of 'bar' in the generated code when 'foo.proto' is imported in -# one of the sources. -# -# Note that the protos listed here are all for testing purposes. All protos to -# be used externally should have a go_package option (and they don't need to be -# listed here). -OPTS=Mgrpc/core/stats.proto=google.golang.org/grpc/interop/grpc_testing/core,\ -Mgrpc/testing/benchmark_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/stats.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/report_qps_scenario_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/messages.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/worker_service.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/control.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/test.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/payloads.proto=google.golang.org/grpc/interop/grpc_testing,\ -Mgrpc/testing/empty.proto=google.golang.org/grpc/interop/grpc_testing - -for src in ${SOURCES[@]}; do - echo "protoc ${src}" - protoc --go_out=${OPTS}:${WORKDIR}/out --go-grpc_out=${OPTS}:${WORKDIR}/out \ - -I"." \ - -I${WORKDIR}/grpc-proto \ - -I${WORKDIR}/googleapis \ - -I${WORKDIR}/protobuf/src \ - ${src} -done - -for src in ${LEGACY_SOURCES[@]}; do - echo "protoc ${src}" - protoc --go_out=${OPTS}:${WORKDIR}/out --go-grpc_out=${OPTS},require_unimplemented_servers=false:${WORKDIR}/out \ - -I"." \ - -I${WORKDIR}/grpc-proto \ - -I${WORKDIR}/googleapis \ - -I${WORKDIR}/protobuf/src \ - ${src} -done - -# The go_package option in grpc/lookup/v1/rls.proto doesn't match the -# current location. Move it into the right place. -mkdir -p ${WORKDIR}/out/google.golang.org/grpc/internal/proto/grpc_lookup_v1 -mv ${WORKDIR}/out/google.golang.org/grpc/lookup/grpc_lookup_v1/* ${WORKDIR}/out/google.golang.org/grpc/internal/proto/grpc_lookup_v1 - -# grpc_testing_not_regenerate/*.pb.go are not re-generated, -# see grpc_testing_not_regenerate/README.md for details. -rm ${WORKDIR}/out/google.golang.org/grpc/reflection/grpc_testing_not_regenerate/*.pb.go - -cp -R ${WORKDIR}/out/google.golang.org/grpc/* . diff --git a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go index b54a3a3225..ef3d6ed6c4 100644 --- a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go @@ -18,9 +18,6 @@ // Package dns implements a dns resolver to be installed as the default resolver // in grpc. -// -// Deprecated: this package is imported by grpc and should not need to be -// imported directly by users. package dns import ( @@ -52,3 +49,12 @@ func SetResolvingTimeout(timeout time.Duration) { func NewBuilder() resolver.Builder { return dns.NewBuilder() } + +// SetMinResolutionInterval sets the default minimum interval at which DNS +// re-resolutions are allowed. This helps to prevent excessive re-resolution. +// +// It must be called only at application startup, before any gRPC calls are +// made. Modifying this value after initialization is not thread-safe. +func SetMinResolutionInterval(d time.Duration) { + dns.MinResolutionInterval = d +} diff --git a/vendor/google.golang.org/grpc/resolver/manual/manual.go b/vendor/google.golang.org/grpc/resolver/manual/manual.go index f2efa2a2cb..82fcc2e35f 100644 --- a/vendor/google.golang.org/grpc/resolver/manual/manual.go +++ b/vendor/google.golang.org/grpc/resolver/manual/manual.go @@ -62,7 +62,7 @@ type Resolver struct { // Fields actually belong to the resolver. // Guards access to below fields. mu sync.Mutex - CC resolver.ClientConn + cc resolver.ClientConn // Storing the most recent state update makes this resolver resilient to // restarts, which is possible with channel idleness. lastSeenState *resolver.State @@ -76,12 +76,14 @@ func (r *Resolver) InitialState(s resolver.State) { // Build returns itself for Resolver, because it's both a builder and a resolver. func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { - r.BuildCallback(target, cc, opts) r.mu.Lock() defer r.mu.Unlock() - r.CC = cc + // Call BuildCallback after locking to avoid a race when UpdateState or CC + // is called before Build returns. + r.BuildCallback(target, cc, opts) + r.cc = cc if r.lastSeenState != nil { - err := r.CC.UpdateState(*r.lastSeenState) + err := r.cc.UpdateState(*r.lastSeenState) go r.UpdateStateCallback(err) } return r, nil @@ -102,25 +104,27 @@ func (r *Resolver) Close() { r.CloseCallback() } -// UpdateState calls CC.UpdateState. +// UpdateState calls UpdateState(s) on the channel. If the resolver has not +// been Built before, this instead sets the initial state of the resolver, like +// InitialState. func (r *Resolver) UpdateState(s resolver.State) { r.mu.Lock() defer r.mu.Unlock() - var err error - if r.CC == nil { - panic("cannot update state as grpc.Dial with resolver has not been called") - } - err = r.CC.UpdateState(s) r.lastSeenState = &s + if r.cc == nil { + return + } + err := r.cc.UpdateState(s) r.UpdateStateCallback(err) } -// ReportError calls CC.ReportError. -func (r *Resolver) ReportError(err error) { +// CC returns r's ClientConn when r was last Built. Panics if the resolver has +// not been Built before. +func (r *Resolver) CC() resolver.ClientConn { r.mu.Lock() defer r.mu.Unlock() - if r.CC == nil { - panic("cannot report error as grpc.Dial with resolver has not been called") + if r.cc == nil { + panic("Manual resolver instance has not yet been built.") } - r.CC.ReportError(err) + return r.cc } diff --git a/vendor/google.golang.org/grpc/resolver/map.go b/vendor/google.golang.org/grpc/resolver/map.go index ada5b9bb79..c3c15ac96f 100644 --- a/vendor/google.golang.org/grpc/resolver/map.go +++ b/vendor/google.golang.org/grpc/resolver/map.go @@ -18,16 +18,28 @@ package resolver -type addressMapEntry struct { +import ( + "encoding/base64" + "sort" + "strings" +) + +type addressMapEntry[T any] struct { addr Address - value any + value T } -// AddressMap is a map of addresses to arbitrary values taking into account +// AddressMap is an AddressMapV2[any]. It will be deleted in an upcoming +// release of grpc-go. +// +// Deprecated: use the generic AddressMapV2 type instead. +type AddressMap = AddressMapV2[any] + +// AddressMapV2 is a map of addresses to arbitrary values taking into account // Attributes. BalancerAttributes are ignored, as are Metadata and Type. // Multiple accesses may not be performed concurrently. Must be created via // NewAddressMap; do not construct directly. -type AddressMap struct { +type AddressMapV2[T any] struct { // The underlying map is keyed by an Address with fields that we don't care // about being set to their zero values. The only fields that we care about // are `Addr`, `ServerName` and `Attributes`. Since we need to be able to @@ -41,23 +53,30 @@ type AddressMap struct { // The value type of the map contains a slice of addresses which match the key // in their `Addr` and `ServerName` fields and contain the corresponding value // associated with them. - m map[Address]addressMapEntryList + m map[Address]addressMapEntryList[T] } func toMapKey(addr *Address) Address { return Address{Addr: addr.Addr, ServerName: addr.ServerName} } -type addressMapEntryList []*addressMapEntry +type addressMapEntryList[T any] []*addressMapEntry[T] -// NewAddressMap creates a new AddressMap. +// NewAddressMap creates a new AddressMapV2[any]. +// +// Deprecated: use the generic NewAddressMapV2 constructor instead. func NewAddressMap() *AddressMap { - return &AddressMap{m: make(map[Address]addressMapEntryList)} + return NewAddressMapV2[any]() +} + +// NewAddressMapV2 creates a new AddressMapV2. +func NewAddressMapV2[T any]() *AddressMapV2[T] { + return &AddressMapV2[T]{m: make(map[Address]addressMapEntryList[T])} } // find returns the index of addr in the addressMapEntry slice, or -1 if not // present. -func (l addressMapEntryList) find(addr Address) int { +func (l addressMapEntryList[T]) find(addr Address) int { for i, entry := range l { // Attributes are the only thing to match on here, since `Addr` and // `ServerName` are already equal. @@ -69,28 +88,28 @@ func (l addressMapEntryList) find(addr Address) int { } // Get returns the value for the address in the map, if present. -func (a *AddressMap) Get(addr Address) (value any, ok bool) { +func (a *AddressMapV2[T]) Get(addr Address) (value T, ok bool) { addrKey := toMapKey(&addr) entryList := a.m[addrKey] if entry := entryList.find(addr); entry != -1 { return entryList[entry].value, true } - return nil, false + return value, false } // Set updates or adds the value to the address in the map. -func (a *AddressMap) Set(addr Address, value any) { +func (a *AddressMapV2[T]) Set(addr Address, value T) { addrKey := toMapKey(&addr) entryList := a.m[addrKey] if entry := entryList.find(addr); entry != -1 { entryList[entry].value = value return } - a.m[addrKey] = append(entryList, &addressMapEntry{addr: addr, value: value}) + a.m[addrKey] = append(entryList, &addressMapEntry[T]{addr: addr, value: value}) } // Delete removes addr from the map. -func (a *AddressMap) Delete(addr Address) { +func (a *AddressMapV2[T]) Delete(addr Address) { addrKey := toMapKey(&addr) entryList := a.m[addrKey] entry := entryList.find(addr) @@ -107,7 +126,7 @@ func (a *AddressMap) Delete(addr Address) { } // Len returns the number of entries in the map. -func (a *AddressMap) Len() int { +func (a *AddressMapV2[T]) Len() int { ret := 0 for _, entryList := range a.m { ret += len(entryList) @@ -116,7 +135,7 @@ func (a *AddressMap) Len() int { } // Keys returns a slice of all current map keys. -func (a *AddressMap) Keys() []Address { +func (a *AddressMapV2[T]) Keys() []Address { ret := make([]Address, 0, a.Len()) for _, entryList := range a.m { for _, entry := range entryList { @@ -127,8 +146,8 @@ func (a *AddressMap) Keys() []Address { } // Values returns a slice of all current map values. -func (a *AddressMap) Values() []any { - ret := make([]any, 0, a.Len()) +func (a *AddressMapV2[T]) Values() []T { + ret := make([]T, 0, a.Len()) for _, entryList := range a.m { for _, entry := range entryList { ret = append(ret, entry.value) @@ -137,70 +156,65 @@ func (a *AddressMap) Values() []any { return ret } -type endpointNode struct { - addrs map[string]struct{} -} - -// Equal returns whether the unordered set of addrs are the same between the -// endpoint nodes. -func (en *endpointNode) Equal(en2 *endpointNode) bool { - if len(en.addrs) != len(en2.addrs) { - return false - } - for addr := range en.addrs { - if _, ok := en2.addrs[addr]; !ok { - return false - } - } - return true -} - -func toEndpointNode(endpoint Endpoint) endpointNode { - en := make(map[string]struct{}) - for _, addr := range endpoint.Addresses { - en[addr.Addr] = struct{}{} - } - return endpointNode{ - addrs: en, - } -} +type endpointMapKey string // EndpointMap is a map of endpoints to arbitrary values keyed on only the // unordered set of address strings within an endpoint. This map is not thread // safe, thus it is unsafe to access concurrently. Must be created via // NewEndpointMap; do not construct directly. -type EndpointMap struct { - endpoints map[*endpointNode]any +type EndpointMap[T any] struct { + endpoints map[endpointMapKey]endpointData[T] +} + +type endpointData[T any] struct { + // decodedKey stores the original key to avoid decoding when iterating on + // EndpointMap keys. + decodedKey Endpoint + value T } // NewEndpointMap creates a new EndpointMap. -func NewEndpointMap() *EndpointMap { - return &EndpointMap{ - endpoints: make(map[*endpointNode]any), +func NewEndpointMap[T any]() *EndpointMap[T] { + return &EndpointMap[T]{ + endpoints: make(map[endpointMapKey]endpointData[T]), } } +// encodeEndpoint returns a string that uniquely identifies the unordered set of +// addresses within an endpoint. +func encodeEndpoint(e Endpoint) endpointMapKey { + addrs := make([]string, 0, len(e.Addresses)) + // base64 encoding the address strings restricts the characters present + // within the strings. This allows us to use a delimiter without the need of + // escape characters. + for _, addr := range e.Addresses { + addrs = append(addrs, base64.StdEncoding.EncodeToString([]byte(addr.Addr))) + } + sort.Strings(addrs) + // " " should not appear in base64 encoded strings. + return endpointMapKey(strings.Join(addrs, " ")) +} + // Get returns the value for the address in the map, if present. -func (em *EndpointMap) Get(e Endpoint) (value any, ok bool) { - en := toEndpointNode(e) - if endpoint := em.find(en); endpoint != nil { - return em.endpoints[endpoint], true +func (em *EndpointMap[T]) Get(e Endpoint) (value T, ok bool) { + val, found := em.endpoints[encodeEndpoint(e)] + if found { + return val.value, true } - return nil, false + return value, false } // Set updates or adds the value to the address in the map. -func (em *EndpointMap) Set(e Endpoint, value any) { - en := toEndpointNode(e) - if endpoint := em.find(en); endpoint != nil { - em.endpoints[endpoint] = value - return +func (em *EndpointMap[T]) Set(e Endpoint, value T) { + en := encodeEndpoint(e) + em.endpoints[en] = endpointData[T]{ + decodedKey: Endpoint{Addresses: e.Addresses}, + value: value, } - em.endpoints[&en] = value } // Len returns the number of entries in the map. -func (em *EndpointMap) Len() int { +func (em *EndpointMap[T]) Len() int { return len(em.endpoints) } @@ -209,43 +223,25 @@ func (em *EndpointMap) Len() int { // the unordered set of addresses. Thus, endpoint information returned is not // the full endpoint data (drops duplicated addresses and attributes) but can be // used for EndpointMap accesses. -func (em *EndpointMap) Keys() []Endpoint { +func (em *EndpointMap[T]) Keys() []Endpoint { ret := make([]Endpoint, 0, len(em.endpoints)) - for en := range em.endpoints { - var endpoint Endpoint - for addr := range en.addrs { - endpoint.Addresses = append(endpoint.Addresses, Address{Addr: addr}) - } - ret = append(ret, endpoint) + for _, en := range em.endpoints { + ret = append(ret, en.decodedKey) } return ret } // Values returns a slice of all current map values. -func (em *EndpointMap) Values() []any { - ret := make([]any, 0, len(em.endpoints)) +func (em *EndpointMap[T]) Values() []T { + ret := make([]T, 0, len(em.endpoints)) for _, val := range em.endpoints { - ret = append(ret, val) + ret = append(ret, val.value) } return ret } -// find returns a pointer to the endpoint node in em if the endpoint node is -// already present. If not found, nil is returned. The comparisons are done on -// the unordered set of addresses within an endpoint. -func (em EndpointMap) find(e endpointNode) *endpointNode { - for endpoint := range em.endpoints { - if e.Equal(endpoint) { - return endpoint - } - } - return nil -} - // Delete removes the specified endpoint from the map. -func (em *EndpointMap) Delete(e Endpoint) { - en := toEndpointNode(e) - if entry := em.find(en); entry != nil { - delete(em.endpoints, entry) - } +func (em *EndpointMap[T]) Delete(e Endpoint) { + en := encodeEndpoint(e) + delete(em.endpoints, en) } diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go index 202854511b..8e6af9514b 100644 --- a/vendor/google.golang.org/grpc/resolver/resolver.go +++ b/vendor/google.golang.org/grpc/resolver/resolver.go @@ -22,6 +22,7 @@ package resolver import ( "context" + "errors" "fmt" "net" "net/url" @@ -29,6 +30,7 @@ import ( "google.golang.org/grpc/attributes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/internal" "google.golang.org/grpc/serviceconfig" ) @@ -174,6 +176,8 @@ type BuildOptions struct { // Authority is the effective authority of the clientconn for which the // resolver is built. Authority string + // MetricsRecorder is the metrics recorder to do recording. + MetricsRecorder stats.MetricsRecorder } // An Endpoint is one network endpoint, or server, which may have multiple @@ -237,8 +241,8 @@ type ClientConn interface { // UpdateState can be omitted. UpdateState(State) error // ReportError notifies the ClientConn that the Resolver encountered an - // error. The ClientConn will notify the load balancer and begin calling - // ResolveNow on the Resolver with exponential backoff. + // error. The ClientConn then forwards this error to the load balancing + // policy. ReportError(error) // NewAddress is called by resolver to notify ClientConn a new list // of resolved addresses. @@ -328,5 +332,27 @@ type AuthorityOverrider interface { // OverrideAuthority returns the authority to use for a ClientConn with the // given target. The implementation must generate it without blocking, // typically in line, and must keep it unchanged. + // + // The returned string must be a valid ":authority" header value, i.e. be + // encoded according to + // [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2) as + // necessary. OverrideAuthority(Target) string } + +// ValidateEndpoints validates endpoints from a petiole policy's perspective. +// Petiole policies should call this before calling into their children. See +// [gRPC A61](https://github.com/grpc/proposal/blob/master/A61-IPv4-IPv6-dualstack-backends.md) +// for details. +func ValidateEndpoints(endpoints []Endpoint) error { + if len(endpoints) == 0 { + return errors.New("endpoints list is empty") + } + + for _, endpoint := range endpoints { + for range endpoint.Addresses { + return nil + } + } + return errors.New("endpoints list contains no addresses") +} diff --git a/vendor/google.golang.org/grpc/resolver_wrapper.go b/vendor/google.golang.org/grpc/resolver_wrapper.go index 9dcc9780f8..80e16a327c 100644 --- a/vendor/google.golang.org/grpc/resolver_wrapper.go +++ b/vendor/google.golang.org/grpc/resolver_wrapper.go @@ -26,6 +26,7 @@ import ( "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/pretty" + "google.golang.org/grpc/internal/resolver/delegatingresolver" "google.golang.org/grpc/resolver" "google.golang.org/grpc/serviceconfig" ) @@ -66,7 +67,7 @@ func newCCResolverWrapper(cc *ClientConn) *ccResolverWrapper { // any newly created ccResolverWrapper, except that close may be called instead. func (ccr *ccResolverWrapper) start() error { errCh := make(chan error) - ccr.serializer.Schedule(func(ctx context.Context) { + ccr.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil { return } @@ -76,16 +77,26 @@ func (ccr *ccResolverWrapper) start() error { CredsBundle: ccr.cc.dopts.copts.CredsBundle, Dialer: ccr.cc.dopts.copts.Dialer, Authority: ccr.cc.authority, + MetricsRecorder: ccr.cc.metricsRecorderList, } var err error - ccr.resolver, err = ccr.cc.resolverBuilder.Build(ccr.cc.parsedTarget, ccr, opts) + // The delegating resolver is used unless: + // - A custom dialer is provided via WithContextDialer dialoption or + // - Proxy usage is disabled through WithNoProxy dialoption. + // In these cases, the resolver is built based on the scheme of target, + // using the appropriate resolver builder. + if ccr.cc.dopts.copts.Dialer != nil || !ccr.cc.dopts.useProxy { + ccr.resolver, err = ccr.cc.resolverBuilder.Build(ccr.cc.parsedTarget, ccr, opts) + } else { + ccr.resolver, err = delegatingresolver.New(ccr.cc.parsedTarget, ccr, opts, ccr.cc.resolverBuilder, ccr.cc.dopts.enableLocalDNSResolution) + } errCh <- err }) return <-errCh } func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOptions) { - ccr.serializer.Schedule(func(ctx context.Context) { + ccr.serializer.TrySchedule(func(ctx context.Context) { if ctx.Err() != nil || ccr.resolver == nil { return } @@ -102,7 +113,7 @@ func (ccr *ccResolverWrapper) close() { ccr.closed = true ccr.mu.Unlock() - ccr.serializer.Schedule(func(context.Context) { + ccr.serializer.TrySchedule(func(context.Context) { if ccr.resolver == nil { return } @@ -123,12 +134,7 @@ func (ccr *ccResolverWrapper) UpdateState(s resolver.State) error { return nil } if s.Endpoints == nil { - s.Endpoints = make([]resolver.Endpoint, 0, len(s.Addresses)) - for _, a := range s.Addresses { - ep := resolver.Endpoint{Addresses: []resolver.Address{a}, Attributes: a.BalancerAttributes} - ep.Addresses[0].BalancerAttributes = nil - s.Endpoints = append(s.Endpoints, ep) - } + s.Endpoints = addressesToEndpoints(s.Addresses) } ccr.addChannelzTraceEvent(s) ccr.curState = s @@ -161,7 +167,11 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { ccr.cc.mu.Unlock() return } - s := resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig} + s := resolver.State{ + Addresses: addrs, + ServiceConfig: ccr.curState.ServiceConfig, + Endpoints: addressesToEndpoints(addrs), + } ccr.addChannelzTraceEvent(s) ccr.curState = s ccr.mu.Unlock() @@ -171,12 +181,15 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) { // ParseServiceConfig is called by resolver implementations to parse a JSON // representation of the service config. func (ccr *ccResolverWrapper) ParseServiceConfig(scJSON string) *serviceconfig.ParseResult { - return parseServiceConfig(scJSON) + return parseServiceConfig(scJSON, ccr.cc.dopts.maxCallAttempts) } // addChannelzTraceEvent adds a channelz trace event containing the new // state received from resolver implementations. func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { + if !logger.V(0) && !channelz.IsOn() { + return + } var updates []string var oldSC, newSC *ServiceConfig var oldOK, newOK bool @@ -196,3 +209,13 @@ func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) { } channelz.Infof(logger, ccr.cc.channelz, "Resolver state updated: %s (%v)", pretty.ToJSON(s), strings.Join(updates, "; ")) } + +func addressesToEndpoints(addrs []resolver.Address) []resolver.Endpoint { + endpoints := make([]resolver.Endpoint, 0, len(addrs)) + for _, a := range addrs { + ep := resolver.Endpoint{Addresses: []resolver.Address{a}, Attributes: a.BalancerAttributes} + ep.Addresses[0].BalancerAttributes = nil + endpoints = append(endpoints, ep) + } + return endpoints +} diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index 998e251ddc..47ea09f5c9 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -19,7 +19,6 @@ package grpc import ( - "bytes" "compress/gzip" "context" "encoding/binary" @@ -35,6 +34,7 @@ import ( "google.golang.org/grpc/encoding" "google.golang.org/grpc/encoding/proto" "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -151,7 +151,7 @@ func (d *gzipDecompressor) Type() string { // callInfo contains all related configuration and information about an RPC. type callInfo struct { - compressorType string + compressorName string failFast bool maxReceiveMessageSize *int maxSendMessageSize *int @@ -160,6 +160,7 @@ type callInfo struct { codec baseCodec maxRetryRPCBufferSize int onFinish []func(err error) + authority string } func defaultCallInfo() *callInfo { @@ -220,9 +221,9 @@ type HeaderCallOption struct { HeaderAddr *metadata.MD } -func (o HeaderCallOption) before(c *callInfo) error { return nil } -func (o HeaderCallOption) after(c *callInfo, attempt *csAttempt) { - *o.HeaderAddr, _ = attempt.s.Header() +func (o HeaderCallOption) before(*callInfo) error { return nil } +func (o HeaderCallOption) after(_ *callInfo, attempt *csAttempt) { + *o.HeaderAddr, _ = attempt.transportStream.Header() } // Trailer returns a CallOptions that retrieves the trailer metadata @@ -242,9 +243,9 @@ type TrailerCallOption struct { TrailerAddr *metadata.MD } -func (o TrailerCallOption) before(c *callInfo) error { return nil } -func (o TrailerCallOption) after(c *callInfo, attempt *csAttempt) { - *o.TrailerAddr = attempt.s.Trailer() +func (o TrailerCallOption) before(*callInfo) error { return nil } +func (o TrailerCallOption) after(_ *callInfo, attempt *csAttempt) { + *o.TrailerAddr = attempt.transportStream.Trailer() } // Peer returns a CallOption that retrieves peer information for a unary RPC. @@ -264,24 +265,20 @@ type PeerCallOption struct { PeerAddr *peer.Peer } -func (o PeerCallOption) before(c *callInfo) error { return nil } -func (o PeerCallOption) after(c *callInfo, attempt *csAttempt) { - if x, ok := peer.FromContext(attempt.s.Context()); ok { +func (o PeerCallOption) before(*callInfo) error { return nil } +func (o PeerCallOption) after(_ *callInfo, attempt *csAttempt) { + if x, ok := peer.FromContext(attempt.transportStream.Context()); ok { *o.PeerAddr = *x } } -// WaitForReady configures the action to take when an RPC is attempted on broken -// connections or unreachable servers. If waitForReady is false and the -// connection is in the TRANSIENT_FAILURE state, the RPC will fail -// immediately. Otherwise, the RPC client will block the call until a -// connection is available (or the call is canceled or times out) and will -// retry the call if it fails due to a transient error. gRPC will not retry if -// data was written to the wire unless the server indicates it did not process -// the data. Please refer to -// https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. +// WaitForReady configures the RPC's behavior when the client is in +// TRANSIENT_FAILURE, which occurs when all addresses fail to connect. If +// waitForReady is false, the RPC will fail immediately. Otherwise, the client +// will wait until a connection becomes available or the RPC's deadline is +// reached. // -// By default, RPCs don't "wait for ready". +// By default, RPCs do not "wait for ready". func WaitForReady(waitForReady bool) CallOption { return FailFastCallOption{FailFast: !waitForReady} } @@ -308,7 +305,7 @@ func (o FailFastCallOption) before(c *callInfo) error { c.failFast = o.FailFast return nil } -func (o FailFastCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o FailFastCallOption) after(*callInfo, *csAttempt) {} // OnFinish returns a CallOption that configures a callback to be called when // the call completes. The error passed to the callback is the status of the @@ -343,7 +340,7 @@ func (o OnFinishCallOption) before(c *callInfo) error { return nil } -func (o OnFinishCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o OnFinishCallOption) after(*callInfo, *csAttempt) {} // MaxCallRecvMsgSize returns a CallOption which sets the maximum message size // in bytes the client can receive. If this is not set, gRPC uses the default @@ -367,7 +364,37 @@ func (o MaxRecvMsgSizeCallOption) before(c *callInfo) error { c.maxReceiveMessageSize = &o.MaxRecvMsgSize return nil } -func (o MaxRecvMsgSizeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o MaxRecvMsgSizeCallOption) after(*callInfo, *csAttempt) {} + +// CallAuthority returns a CallOption that sets the HTTP/2 :authority header of +// an RPC to the specified value. When using CallAuthority, the credentials in +// use must implement the AuthorityValidator interface. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a later +// release. +func CallAuthority(authority string) CallOption { + return AuthorityOverrideCallOption{Authority: authority} +} + +// AuthorityOverrideCallOption is a CallOption that indicates the HTTP/2 +// :authority header value to use for the call. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a later +// release. +type AuthorityOverrideCallOption struct { + Authority string +} + +func (o AuthorityOverrideCallOption) before(c *callInfo) error { + c.authority = o.Authority + return nil +} + +func (o AuthorityOverrideCallOption) after(*callInfo, *csAttempt) {} // MaxCallSendMsgSize returns a CallOption which sets the maximum message size // in bytes the client can send. If this is not set, gRPC uses the default @@ -391,7 +418,7 @@ func (o MaxSendMsgSizeCallOption) before(c *callInfo) error { c.maxSendMessageSize = &o.MaxSendMsgSize return nil } -func (o MaxSendMsgSizeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o MaxSendMsgSizeCallOption) after(*callInfo, *csAttempt) {} // PerRPCCredentials returns a CallOption that sets credentials.PerRPCCredentials // for a call. @@ -414,7 +441,7 @@ func (o PerRPCCredsCallOption) before(c *callInfo) error { c.creds = o.Creds return nil } -func (o PerRPCCredsCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o PerRPCCredsCallOption) after(*callInfo, *csAttempt) {} // UseCompressor returns a CallOption which sets the compressor used when // sending the request. If WithCompressor is also set, UseCompressor has @@ -439,10 +466,10 @@ type CompressorCallOption struct { } func (o CompressorCallOption) before(c *callInfo) error { - c.compressorType = o.CompressorType + c.compressorName = o.CompressorType return nil } -func (o CompressorCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o CompressorCallOption) after(*callInfo, *csAttempt) {} // CallContentSubtype returns a CallOption that will set the content-subtype // for a call. For example, if content-subtype is "json", the Content-Type over @@ -479,7 +506,7 @@ func (o ContentSubtypeCallOption) before(c *callInfo) error { c.contentSubtype = o.ContentSubtype return nil } -func (o ContentSubtypeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o ContentSubtypeCallOption) after(*callInfo, *csAttempt) {} // ForceCodec returns a CallOption that will set codec to be used for all // request and response messages for a call. The result of calling Name() will @@ -515,10 +542,50 @@ type ForceCodecCallOption struct { } func (o ForceCodecCallOption) before(c *callInfo) error { - c.codec = o.Codec + c.codec = newCodecV1Bridge(o.Codec) return nil } -func (o ForceCodecCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o ForceCodecCallOption) after(*callInfo, *csAttempt) {} + +// ForceCodecV2 returns a CallOption that will set codec to be used for all +// request and response messages for a call. The result of calling Name() will +// be used as the content-subtype after converting to lowercase, unless +// CallContentSubtype is also used. +// +// See Content-Type on +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. Also see the documentation on RegisterCodec and +// CallContentSubtype for more details on the interaction between Codec and +// content-subtype. +// +// This function is provided for advanced users; prefer to use only +// CallContentSubtype to select a registered codec instead. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func ForceCodecV2(codec encoding.CodecV2) CallOption { + return ForceCodecV2CallOption{CodecV2: codec} +} + +// ForceCodecV2CallOption is a CallOption that indicates the codec used for +// marshaling messages. +// +// # Experimental +// +// Notice: This type is EXPERIMENTAL and may be changed or removed in a +// later release. +type ForceCodecV2CallOption struct { + CodecV2 encoding.CodecV2 +} + +func (o ForceCodecV2CallOption) before(c *callInfo) error { + c.codec = o.CodecV2 + return nil +} + +func (o ForceCodecV2CallOption) after(*callInfo, *csAttempt) {} // CallCustomCodec behaves like ForceCodec, but accepts a grpc.Codec instead of // an encoding.Codec. @@ -540,10 +607,10 @@ type CustomCodecCallOption struct { } func (o CustomCodecCallOption) before(c *callInfo) error { - c.codec = o.Codec + c.codec = newCodecV0Bridge(o.Codec) return nil } -func (o CustomCodecCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o CustomCodecCallOption) after(*callInfo, *csAttempt) {} // MaxRetryRPCBufferSize returns a CallOption that limits the amount of memory // used for buffering this RPC's requests for retry purposes. @@ -571,7 +638,7 @@ func (o MaxRetryRPCBufferSizeCallOption) before(c *callInfo) error { c.maxRetryRPCBufferSize = o.MaxRetryRPCBufferSize return nil } -func (o MaxRetryRPCBufferSizeCallOption) after(c *callInfo, attempt *csAttempt) {} +func (o MaxRetryRPCBufferSizeCallOption) after(*callInfo, *csAttempt) {} // The format of the payload: compressed or not? type payloadFormat uint8 @@ -581,19 +648,28 @@ const ( compressionMade payloadFormat = 1 // compressed ) +func (pf payloadFormat) isCompressed() bool { + return pf == compressionMade +} + +type streamReader interface { + ReadMessageHeader(header []byte) error + Read(n int) (mem.BufferSlice, error) +} + // parser reads complete gRPC messages from the underlying reader. type parser struct { // r is the underlying reader. // See the comment on recvMsg for the permissible // error types. - r io.Reader + r streamReader // The header of a gRPC message. Find more detail at // https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md header [5]byte - // recvBufferPool is the pool of shared receive buffers. - recvBufferPool SharedBufferPool + // bufferPool is the pool of shared receive buffers. + bufferPool mem.BufferPool } // recvMsg reads a complete gRPC message from the stream. @@ -608,39 +684,38 @@ type parser struct { // - an error from the status package // // No other error values or types must be returned, which also means -// that the underlying io.Reader must not return an incompatible +// that the underlying streamReader must not return an incompatible // error. -func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byte, err error) { - if _, err := p.r.Read(p.header[:]); err != nil { +func (p *parser) recvMsg(maxReceiveMessageSize int) (payloadFormat, mem.BufferSlice, error) { + err := p.r.ReadMessageHeader(p.header[:]) + if err != nil { return 0, nil, err } - pf = payloadFormat(p.header[0]) + pf := payloadFormat(p.header[0]) length := binary.BigEndian.Uint32(p.header[1:]) - if length == 0 { - return pf, nil, nil - } if int64(length) > int64(maxInt) { return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max length allowed on current machine (%d vs. %d)", length, maxInt) } if int(length) > maxReceiveMessageSize { return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize) } - msg = p.recvBufferPool.Get(int(length)) - if _, err := p.r.Read(msg); err != nil { + + data, err := p.r.Read(int(length)) + if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } return 0, nil, err } - return pf, msg, nil + return pf, data, nil } // encode serializes msg and returns a buffer containing the message, or an // error if it is too large to be transmitted by grpc. If msg is nil, it // generates an empty message. -func encode(c baseCodec, msg any) ([]byte, error) { +func encode(c baseCodec, msg any) (mem.BufferSlice, error) { if msg == nil { // NOTE: typed nils will not be caught by this check return nil, nil } @@ -648,8 +723,9 @@ func encode(c baseCodec, msg any) ([]byte, error) { if err != nil { return nil, status.Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error()) } - if uint(len(b)) > math.MaxUint32 { - return nil, status.Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", len(b)) + if bufSize := uint(b.Len()); bufSize > math.MaxUint32 { + b.Free() + return nil, status.Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", bufSize) } return b, nil } @@ -659,34 +735,41 @@ func encode(c baseCodec, msg any) ([]byte, error) { // indicating no compression was done. // // TODO(dfawley): eliminate cp parameter by wrapping Compressor in an encoding.Compressor. -func compress(in []byte, cp Compressor, compressor encoding.Compressor) ([]byte, error) { - if compressor == nil && cp == nil { - return nil, nil - } - if len(in) == 0 { - return nil, nil +func compress(in mem.BufferSlice, cp Compressor, compressor encoding.Compressor, pool mem.BufferPool) (mem.BufferSlice, payloadFormat, error) { + if (compressor == nil && cp == nil) || in.Len() == 0 { + return nil, compressionNone, nil } + var out mem.BufferSlice + w := mem.NewWriter(&out, pool) wrapErr := func(err error) error { + out.Free() return status.Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error()) } - cbuf := &bytes.Buffer{} if compressor != nil { - z, err := compressor.Compress(cbuf) + z, err := compressor.Compress(w) if err != nil { - return nil, wrapErr(err) + return nil, 0, wrapErr(err) } - if _, err := z.Write(in); err != nil { - return nil, wrapErr(err) + for _, b := range in { + if _, err := z.Write(b.ReadOnlyData()); err != nil { + return nil, 0, wrapErr(err) + } } if err := z.Close(); err != nil { - return nil, wrapErr(err) + return nil, 0, wrapErr(err) } } else { - if err := cp.Do(cbuf, in); err != nil { - return nil, wrapErr(err) + // This is obviously really inefficient since it fully materializes the data, but + // there is no way around this with the old Compressor API. At least it attempts + // to return the buffer to the provider, in the hopes it can be reused (maybe + // even by a subsequent call to this very function). + buf := in.MaterializeToBuffer(pool) + defer buf.Free() + if err := cp.Do(w, buf.ReadOnlyData()); err != nil { + return nil, 0, wrapErr(err) } } - return cbuf.Bytes(), nil + return out, compressionMade, nil } const ( @@ -697,33 +780,36 @@ const ( // msgHeader returns a 5-byte header for the message being transmitted and the // payload, which is compData if non-nil or data otherwise. -func msgHeader(data, compData []byte) (hdr []byte, payload []byte) { +func msgHeader(data, compData mem.BufferSlice, pf payloadFormat) (hdr []byte, payload mem.BufferSlice) { hdr = make([]byte, headerLen) - if compData != nil { - hdr[0] = byte(compressionMade) - data = compData + hdr[0] = byte(pf) + + var length uint32 + if pf.isCompressed() { + length = uint32(compData.Len()) + payload = compData } else { - hdr[0] = byte(compressionNone) + length = uint32(data.Len()) + payload = data } // Write length of payload into buf - binary.BigEndian.PutUint32(hdr[payloadLen:], uint32(len(data))) - return hdr, data + binary.BigEndian.PutUint32(hdr[payloadLen:], length) + return hdr, payload } -func outPayload(client bool, msg any, data, payload []byte, t time.Time) *stats.OutPayload { +func outPayload(client bool, msg any, dataLength, payloadLength int, t time.Time) *stats.OutPayload { return &stats.OutPayload{ Client: client, Payload: msg, - Data: data, - Length: len(data), - WireLength: len(payload) + headerLen, - CompressedLength: len(payload), + Length: dataLength, + WireLength: payloadLength + headerLen, + CompressedLength: payloadLength, SentTime: t, } } -func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool) *status.Status { +func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool, isServer bool) *status.Status { switch pf { case compressionNone: case compressionMade: @@ -731,7 +817,10 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool return status.New(codes.Internal, "grpc: compressed flag set with identity or empty encoding") } if !haveCompressor { - return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) + if isServer { + return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) + } + return status.Newf(codes.Internal, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress) } default: return status.Newf(codes.Internal, "grpc: received unexpected payload format %d", pf) @@ -741,104 +830,119 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool type payloadInfo struct { compressedLength int // The compressed length got from wire. - uncompressedBytes []byte + uncompressedBytes mem.BufferSlice +} + +func (p *payloadInfo) free() { + if p != nil && p.uncompressedBytes != nil { + p.uncompressedBytes.Free() + } } // recvAndDecompress reads a message from the stream, decompressing it if necessary. // // Cancelling the returned cancel function releases the buffer back to the pool. So the caller should cancel as soon as // the buffer is no longer needed. -func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, -) (uncompressedBuf []byte, cancel func(), err error) { - pf, compressedBuf, err := p.recvMsg(maxReceiveMessageSize) +// TODO: Refactor this function to reduce the number of arguments. +// See: https://google.github.io/styleguide/go/best-practices.html#function-argument-lists +func recvAndDecompress(p *parser, s recvCompressor, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool, +) (out mem.BufferSlice, err error) { + pf, compressed, err := p.recvMsg(maxReceiveMessageSize) if err != nil { - return nil, nil, err + return nil, err } - if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil); st != nil { - return nil, nil, st.Err() + compressedLength := compressed.Len() + + if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil, isServer); st != nil { + compressed.Free() + return nil, st.Err() } - var size int - if pf == compressionMade { + if pf.isCompressed() { + defer compressed.Free() // To match legacy behavior, if the decompressor is set by WithDecompressor or RPCDecompressor, // use this decompressor as the default. - if dc != nil { - uncompressedBuf, err = dc.Do(bytes.NewReader(compressedBuf)) - size = len(uncompressedBuf) - } else { - uncompressedBuf, size, err = decompress(compressor, compressedBuf, maxReceiveMessageSize) - } + out, err = decompress(compressor, compressed, dc, maxReceiveMessageSize, p.bufferPool) if err != nil { - return nil, nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message: %v", err) - } - if size > maxReceiveMessageSize { - // TODO: Revisit the error code. Currently keep it consistent with java - // implementation. - return nil, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message after decompression larger than max (%d vs. %d)", size, maxReceiveMessageSize) + return nil, err } } else { - uncompressedBuf = compressedBuf + out = compressed } if payInfo != nil { - payInfo.compressedLength = len(compressedBuf) - payInfo.uncompressedBytes = uncompressedBuf + payInfo.compressedLength = compressedLength + out.Ref() + payInfo.uncompressedBytes = out + } - cancel = func() {} - } else { - cancel = func() { - p.recvBufferPool.Put(&compressedBuf) + return out, nil +} + +// decompress processes the given data by decompressing it using either a custom decompressor or a standard compressor. +// If a custom decompressor is provided, it takes precedence. The function validates that the decompressed data +// does not exceed the specified maximum size and returns an error if this limit is exceeded. +// On success, it returns the decompressed data. Otherwise, it returns an error if decompression fails or the data exceeds the size limit. +func decompress(compressor encoding.Compressor, d mem.BufferSlice, dc Decompressor, maxReceiveMessageSize int, pool mem.BufferPool) (mem.BufferSlice, error) { + if dc != nil { + uncompressed, err := dc.Do(d.Reader()) + if err != nil { + return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the received message: %v", err) + } + if len(uncompressed) > maxReceiveMessageSize { + return nil, status.Errorf(codes.ResourceExhausted, "grpc: message after decompression larger than max (%d vs. %d)", len(uncompressed), maxReceiveMessageSize) } + return mem.BufferSlice{mem.SliceBuffer(uncompressed)}, nil } + if compressor != nil { + dcReader, err := compressor.Decompress(d.Reader()) + if err != nil { + return nil, status.Errorf(codes.Internal, "grpc: failed to decompress the message: %v", err) + } - return uncompressedBuf, cancel, nil -} + // Read at most one byte more than the limit from the decompressor. + // Unless the limit is MaxInt64, in which case, that's impossible, so + // apply no limit. + if limit := int64(maxReceiveMessageSize); limit < math.MaxInt64 { + dcReader = io.LimitReader(dcReader, limit+1) + } + out, err := mem.ReadAll(dcReader, pool) + if err != nil { + out.Free() + return nil, status.Errorf(codes.Internal, "grpc: failed to read decompressed data: %v", err) + } -// Using compressor, decompress d, returning data and size. -// Optionally, if data will be over maxReceiveMessageSize, just return the size. -func decompress(compressor encoding.Compressor, d []byte, maxReceiveMessageSize int) ([]byte, int, error) { - dcReader, err := compressor.Decompress(bytes.NewReader(d)) - if err != nil { - return nil, 0, err - } - if sizer, ok := compressor.(interface { - DecompressedSize(compressedBytes []byte) int - }); ok { - if size := sizer.DecompressedSize(d); size >= 0 { - if size > maxReceiveMessageSize { - return nil, size, nil - } - // size is used as an estimate to size the buffer, but we - // will read more data if available. - // +MinRead so ReadFrom will not reallocate if size is correct. - // - // TODO: If we ensure that the buffer size is the same as the DecompressedSize, - // we can also utilize the recv buffer pool here. - buf := bytes.NewBuffer(make([]byte, 0, size+bytes.MinRead)) - bytesRead, err := buf.ReadFrom(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) - return buf.Bytes(), int(bytesRead), err + if out.Len() > maxReceiveMessageSize { + out.Free() + return nil, status.Errorf(codes.ResourceExhausted, "grpc: received message after decompression larger than max %d", maxReceiveMessageSize) } + return out, nil } - // Read from LimitReader with limit max+1. So if the underlying - // reader is over limit, the result will be bigger than max. - d, err = io.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) - return d, len(d), err + return nil, status.Errorf(codes.Internal, "grpc: no decompressor available for compressed payload") +} + +type recvCompressor interface { + RecvCompress() string } // For the two compressor parameters, both should not be set, but if they are, // dc takes precedence over compressor. // TODO(dfawley): wrap the old compressor/decompressor using the new API? -func recv(p *parser, c baseCodec, s *transport.Stream, dc Decompressor, m any, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor) error { - buf, cancel, err := recvAndDecompress(p, s, dc, maxReceiveMessageSize, payInfo, compressor) +func recv(p *parser, c baseCodec, s recvCompressor, dc Decompressor, m any, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool) error { + data, err := recvAndDecompress(p, s, dc, maxReceiveMessageSize, payInfo, compressor, isServer) if err != nil { return err } - defer cancel() - if err := c.Unmarshal(buf, m); err != nil { + // If the codec wants its own reference to the data, it can get it. Otherwise, always + // free the buffers. + defer data.Free() + + if err := c.Unmarshal(data, m); err != nil { return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message: %v", err) } + return nil } @@ -941,7 +1045,7 @@ func setCallInfoCodec(c *callInfo) error { // encoding.Codec (Name vs. String method name). We only support // setting content subtype from encoding.Codec to avoid a behavior // change with the deprecated version. - if ec, ok := c.codec.(encoding.Codec); ok { + if ec, ok := c.codec.(encoding.CodecV2); ok { c.contentSubtype = strings.ToLower(ec.Name()) } } @@ -950,12 +1054,12 @@ func setCallInfoCodec(c *callInfo) error { if c.contentSubtype == "" { // No codec specified in CallOptions; use proto by default. - c.codec = encoding.GetCodec(proto.Name) + c.codec = getCodec(proto.Name) return nil } // c.contentSubtype is already lowercased in CallContentSubtype - c.codec = encoding.GetCodec(c.contentSubtype) + c.codec = getCodec(c.contentSubtype) if c.codec == nil { return status.Errorf(codes.Internal, "no codec registered for content-subtype %s", c.contentSubtype) } @@ -964,7 +1068,7 @@ func setCallInfoCodec(c *callInfo) error { // The SupportPackageIsVersion variables are referenced from generated protocol // buffer files to ensure compatibility with the gRPC version used. The latest -// support package version is 7. +// support package version is 9. // // Older versions are kept for compatibility. // @@ -976,6 +1080,7 @@ const ( SupportPackageIsVersion6 = true SupportPackageIsVersion7 = true SupportPackageIsVersion8 = true + SupportPackageIsVersion9 = true ) const grpcUA = "grpc-go/" + Version diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index fd4558daa5..1da2a542ac 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -37,14 +37,17 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/encoding" "google.golang.org/grpc/encoding/proto" + estats "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" "google.golang.org/grpc/internal/grpcsync" "google.golang.org/grpc/internal/grpcutil" + istats "google.golang.org/grpc/internal/stats" "google.golang.org/grpc/internal/transport" "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -80,18 +83,22 @@ func init() { } internal.BinaryLogger = binaryLogger internal.JoinServerOptions = newJoinServerOption - internal.RecvBufferPool = recvBufferPool + internal.BufferPool = bufferPool + internal.MetricsRecorderForServer = func(srv *Server) estats.MetricsRecorder { + return istats.NewMetricsRecorderList(srv.opts.statsHandlers) + } } var statusOK = status.New(codes.OK, "") var logger = grpclog.Component("core") -type methodHandler func(srv any, ctx context.Context, dec func(any) error, interceptor UnaryServerInterceptor) (any, error) +// MethodHandler is a function type that processes a unary RPC method call. +type MethodHandler func(srv any, ctx context.Context, dec func(any) error, interceptor UnaryServerInterceptor) (any, error) // MethodDesc represents an RPC service's method specification. type MethodDesc struct { MethodName string - Handler methodHandler + Handler MethodHandler } // ServiceDesc represents an RPC service's specification. @@ -170,8 +177,9 @@ type serverOptions struct { maxHeaderListSize *uint32 headerTableSize *uint32 numServerWorkers uint32 - recvBufferPool SharedBufferPool + bufferPool mem.BufferPool waitForHandlers bool + staticWindowSize bool } var defaultServerOptions = serverOptions{ @@ -181,7 +189,7 @@ var defaultServerOptions = serverOptions{ connectionTimeout: 120 * time.Second, writeBufferSize: defaultWriteBufSize, readBufferSize: defaultReadBufSize, - recvBufferPool: nopBufferPool{}, + bufferPool: mem.DefaultBufferPool(), } var globalServerOptions []ServerOption @@ -272,6 +280,7 @@ func ReadBufferSize(s int) ServerOption { func InitialWindowSize(s int32) ServerOption { return newFuncServerOption(func(o *serverOptions) { o.initialWindowSize = s + o.staticWindowSize = true }) } @@ -280,6 +289,29 @@ func InitialWindowSize(s int32) ServerOption { func InitialConnWindowSize(s int32) ServerOption { return newFuncServerOption(func(o *serverOptions) { o.initialConnWindowSize = s + o.staticWindowSize = true + }) +} + +// StaticStreamWindowSize returns a ServerOption to set the initial stream +// window size to the value provided and disables dynamic flow control. +// The lower bound for window size is 64K and any value smaller than that +// will be ignored. +func StaticStreamWindowSize(s int32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.initialWindowSize = s + o.staticWindowSize = true + }) +} + +// StaticConnWindowSize returns a ServerOption to set the initial connection +// window size to the value provided and disables dynamic flow control. +// The lower bound for window size is 64K and any value smaller than that +// will be ignored. +func StaticConnWindowSize(s int32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.initialConnWindowSize = s + o.staticWindowSize = true }) } @@ -313,7 +345,7 @@ func KeepaliveEnforcementPolicy(kep keepalive.EnforcementPolicy) ServerOption { // Will be supported throughout 1.x. func CustomCodec(codec Codec) ServerOption { return newFuncServerOption(func(o *serverOptions) { - o.codec = codec + o.codec = newCodecV0Bridge(codec) }) } @@ -342,7 +374,22 @@ func CustomCodec(codec Codec) ServerOption { // later release. func ForceServerCodec(codec encoding.Codec) ServerOption { return newFuncServerOption(func(o *serverOptions) { - o.codec = codec + o.codec = newCodecV1Bridge(codec) + }) +} + +// ForceServerCodecV2 is the equivalent of ForceServerCodec, but for the new +// CodecV2 interface. +// +// Will be supported throughout 1.x. +// +// # Experimental +// +// Notice: This API is EXPERIMENTAL and may be changed or removed in a +// later release. +func ForceServerCodecV2(codecV2 encoding.CodecV2) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.codec = codecV2 }) } @@ -527,12 +574,22 @@ func ConnectionTimeout(d time.Duration) ServerOption { }) } +// MaxHeaderListSizeServerOption is a ServerOption that sets the max +// (uncompressed) size of header list that the server is prepared to accept. +type MaxHeaderListSizeServerOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeServerOption) apply(so *serverOptions) { + so.maxHeaderListSize = &o.MaxHeaderListSize +} + // MaxHeaderListSize returns a ServerOption that sets the max (uncompressed) size // of header list that the server is prepared to accept. func MaxHeaderListSize(s uint32) ServerOption { - return newFuncServerOption(func(o *serverOptions) { - o.maxHeaderListSize = &s - }) + return MaxHeaderListSizeServerOption{ + MaxHeaderListSize: s, + } } // HeaderTableSize returns a ServerOption that sets the size of dynamic @@ -582,26 +639,9 @@ func WaitForHandlers(w bool) ServerOption { }) } -// RecvBufferPool returns a ServerOption that configures the server -// to use the provided shared buffer pool for parsing incoming messages. Depending -// on the application's workload, this could result in reduced memory allocation. -// -// If you are unsure about how to implement a memory pool but want to utilize one, -// begin with grpc.NewSharedBufferPool. -// -// Note: The shared buffer pool feature will not be active if any of the following -// options are used: StatsHandler, EnableTracing, or binary logging. In such -// cases, the shared buffer pool will be ignored. -// -// Deprecated: use experimental.WithRecvBufferPool instead. Will be deleted in -// v1.60.0 or later. -func RecvBufferPool(bufferPool SharedBufferPool) ServerOption { - return recvBufferPool(bufferPool) -} - -func recvBufferPool(bufferPool SharedBufferPool) ServerOption { +func bufferPool(bufferPool mem.BufferPool) ServerOption { return newFuncServerOption(func(o *serverOptions) { - o.recvBufferPool = bufferPool + o.bufferPool = bufferPool }) } @@ -612,8 +652,8 @@ func recvBufferPool(bufferPool SharedBufferPool) ServerOption { // workload (assuming a QPS of a few thousand requests/sec). const serverWorkerResetThreshold = 1 << 16 -// serverWorkers blocks on a *transport.Stream channel forever and waits for -// data to be fed by serveStreams. This allows multiple requests to be +// serverWorker blocks on a *transport.ServerStream channel forever and waits +// for data to be fed by serveStreams. This allows multiple requests to be // processed by the same goroutine, removing the need for expensive stack // re-allocations (see the runtime.morestack problem [1]). // @@ -633,7 +673,7 @@ func (s *Server) serverWorker() { // connections to reduce the time spent overall on runtime.morestack. func (s *Server) initServerWorkers() { s.serverWorkerChannel = make(chan func()) - s.serverWorkerChannelClose = grpcsync.OnceFunc(func() { + s.serverWorkerChannelClose = sync.OnceFunc(func() { close(s.serverWorkerChannel) }) for i := uint32(0); i < s.opts.numServerWorkers; i++ { @@ -970,6 +1010,8 @@ func (s *Server) newHTTP2Transport(c net.Conn) transport.ServerTransport { ChannelzParent: s.channelz, MaxHeaderListSize: s.opts.maxHeaderListSize, HeaderTableSize: s.opts.headerTableSize, + BufferPool: s.opts.bufferPool, + StaticWindowSize: s.opts.staticWindowSize, } st, err := transport.NewServerTransport(c, config) if err != nil { @@ -1010,7 +1052,7 @@ func (s *Server) serveStreams(ctx context.Context, st transport.ServerTransport, }() streamQuota := newHandlerQuota(s.opts.maxConcurrentStreams) - st.HandleStreams(ctx, func(stream *transport.Stream) { + st.HandleStreams(ctx, func(stream *transport.ServerStream) { s.handlersWG.Add(1) streamQuota.acquire() f := func() { @@ -1062,7 +1104,7 @@ var _ http.Handler = (*Server)(nil) // Notice: This API is EXPERIMENTAL and may be changed or removed in a // later release. func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandlers) + st, err := transport.NewServerHandlerTransport(w, r, s.opts.statsHandlers, s.opts.bufferPool) if err != nil { // Errors returned from transport.NewServerHandlerTransport have // already been written to w. @@ -1126,26 +1168,41 @@ func (s *Server) incrCallsFailed() { s.channelz.ServerMetrics.CallsFailed.Add(1) } -func (s *Server) sendResponse(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, msg any, cp Compressor, opts *transport.Options, comp encoding.Compressor) error { +func (s *Server) sendResponse(ctx context.Context, stream *transport.ServerStream, msg any, cp Compressor, opts *transport.WriteOptions, comp encoding.Compressor) error { data, err := encode(s.getCodec(stream.ContentSubtype()), msg) if err != nil { channelz.Error(logger, s.channelz, "grpc: server failed to encode response: ", err) return err } - compData, err := compress(data, cp, comp) + + compData, pf, err := compress(data, cp, comp, s.opts.bufferPool) if err != nil { + data.Free() channelz.Error(logger, s.channelz, "grpc: server failed to compress response: ", err) return err } - hdr, payload := msgHeader(data, compData) + + hdr, payload := msgHeader(data, compData, pf) + + defer func() { + compData.Free() + data.Free() + // payload does not need to be freed here, it is either data or compData, both of + // which are already freed. + }() + + dataLen := data.Len() + payloadLen := payload.Len() // TODO(dfawley): should we be checking len(data) instead? - if len(payload) > s.opts.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(payload), s.opts.maxSendMessageSize) + if payloadLen > s.opts.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", payloadLen, s.opts.maxSendMessageSize) } - err = t.Write(stream, hdr, payload, opts) + err = stream.Write(hdr, payload, opts) if err == nil { - for _, sh := range s.opts.statsHandlers { - sh.HandleRPC(ctx, outPayload(false, msg, data, payload, time.Now())) + if len(s.opts.statsHandlers) != 0 { + for _, sh := range s.opts.statsHandlers { + sh.HandleRPC(ctx, outPayload(false, msg, dataLen, payloadLen, time.Now())) + } } } return err @@ -1187,7 +1244,7 @@ func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info } } -func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { +func (s *Server) processUnaryRPC(ctx context.Context, stream *transport.ServerStream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { shs := s.opts.statsHandlers if len(shs) != 0 || trInfo != nil || channelz.IsOn() { if channelz.IsOn() { @@ -1295,7 +1352,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor decomp = encoding.GetCompressor(rc) if decomp == nil { st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) - t.WriteStatus(stream, st) + stream.WriteStatus(st) return st.Err() } } @@ -1324,37 +1381,42 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor var payInfo *payloadInfo if len(shs) != 0 || len(binlogs) != 0 { payInfo = &payloadInfo{} + defer payInfo.free() } - d, cancel, err := recvAndDecompress(&parser{r: stream, recvBufferPool: s.opts.recvBufferPool}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp) + d, err := recvAndDecompress(&parser{r: stream, bufferPool: s.opts.bufferPool}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp, true) if err != nil { - if e := t.WriteStatus(stream, status.Convert(err)); e != nil { + if e := stream.WriteStatus(status.Convert(err)); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } return err } - if channelz.IsOn() { - t.IncrMsgRecv() + freed := false + dataFree := func() { + if !freed { + d.Free() + freed = true + } } + defer dataFree() df := func(v any) error { - defer cancel() - + defer dataFree() if err := s.getCodec(stream.ContentSubtype()).Unmarshal(d, v); err != nil { return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) } + for _, sh := range shs { sh.HandleRPC(ctx, &stats.InPayload{ RecvTime: time.Now(), Payload: v, - Length: len(d), + Length: d.Len(), WireLength: payInfo.compressedLength + headerLen, CompressedLength: payInfo.compressedLength, - Data: d, }) } if len(binlogs) != 0 { cm := &binarylog.ClientMessage{ - Message: d, + Message: d.Materialize(), } for _, binlog := range binlogs { binlog.Log(ctx, cm) @@ -1379,7 +1441,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor trInfo.tr.LazyLog(stringer(appStatus.Message()), true) trInfo.tr.SetError() } - if e := t.WriteStatus(stream, appStatus); e != nil { + if e := stream.WriteStatus(appStatus); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } if len(binlogs) != 0 { @@ -1406,20 +1468,20 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor if trInfo != nil { trInfo.tr.LazyLog(stringer("OK"), false) } - opts := &transport.Options{Last: true} + opts := &transport.WriteOptions{Last: true} // Server handler could have set new compressor by calling SetSendCompressor. // In case it is set, we need to use it for compressing outbound message. if stream.SendCompress() != sendCompressorName { comp = encoding.GetCompressor(stream.SendCompress()) } - if err := s.sendResponse(ctx, t, stream, reply, cp, opts, comp); err != nil { + if err := s.sendResponse(ctx, stream, reply, cp, opts, comp); err != nil { if err == io.EOF { // The entire stream is done (for unary RPC only). return err } if sts, ok := status.FromError(err); ok { - if e := t.WriteStatus(stream, sts); e != nil { + if e := stream.WriteStatus(sts); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } } else { @@ -1459,9 +1521,6 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor binlog.Log(ctx, sm) } } - if channelz.IsOn() { - t.IncrMsgSent() - } if trInfo != nil { trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) } @@ -1477,7 +1536,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor binlog.Log(ctx, st) } } - return t.WriteStatus(stream, statusOK) + return stream.WriteStatus(statusOK) } // chainStreamServerInterceptors chains all stream server interceptors into one. @@ -1516,7 +1575,7 @@ func getChainStreamHandler(interceptors []StreamServerInterceptor, curr int, inf } } -func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, sd *StreamDesc, trInfo *traceInfo) (err error) { +func (s *Server) processStreamingRPC(ctx context.Context, stream *transport.ServerStream, info *serviceInfo, sd *StreamDesc, trInfo *traceInfo) (err error) { if channelz.IsOn() { s.incrCallsStarted() } @@ -1536,10 +1595,10 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran ctx = NewContextWithServerTransportStream(ctx, stream) ss := &serverStream{ ctx: ctx, - t: t, s: stream, - p: &parser{r: stream, recvBufferPool: s.opts.recvBufferPool}, + p: &parser{r: stream, bufferPool: s.opts.bufferPool}, codec: s.getCodec(stream.ContentSubtype()), + desc: sd, maxReceiveMessageSize: s.opts.maxReceiveMessageSize, maxSendMessageSize: s.opts.maxSendMessageSize, trInfo: trInfo, @@ -1618,12 +1677,12 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran // If dc is set and matches the stream's compression, use it. Otherwise, try // to find a matching registered compressor for decomp. if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc { - ss.dc = s.opts.dc + ss.decompressorV0 = s.opts.dc } else if rc != "" && rc != encoding.Identity { - ss.decomp = encoding.GetCompressor(rc) - if ss.decomp == nil { + ss.decompressorV1 = encoding.GetCompressor(rc) + if ss.decompressorV1 == nil { st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) - t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) return st.Err() } } @@ -1633,12 +1692,12 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran // // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686. if s.opts.cp != nil { - ss.cp = s.opts.cp + ss.compressorV0 = s.opts.cp ss.sendCompressorName = s.opts.cp.Type() } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity { // Legacy compressor not specified; attempt to respond with same encoding. - ss.comp = encoding.GetCompressor(rc) - if ss.comp != nil { + ss.compressorV1 = encoding.GetCompressor(rc) + if ss.compressorV1 != nil { ss.sendCompressorName = rc } } @@ -1649,7 +1708,7 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran } } - ss.ctx = newContextWithRPCInfo(ss.ctx, false, ss.codec, ss.cp, ss.comp) + ss.ctx = newContextWithRPCInfo(ss.ctx, false, ss.codec, ss.compressorV0, ss.compressorV1) if trInfo != nil { trInfo.tr.LazyLog(&trInfo.firstLine, false) @@ -1692,7 +1751,7 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran binlog.Log(ctx, st) } } - t.WriteStatus(ss.s, appStatus) + ss.s.WriteStatus(appStatus) // TODO: Should we log an error from WriteStatus here and below? return appErr } @@ -1710,10 +1769,10 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran binlog.Log(ctx, st) } } - return t.WriteStatus(ss.s, statusOK) + return ss.s.WriteStatus(statusOK) } -func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream) { +func (s *Server) handleStream(t transport.ServerTransport, stream *transport.ServerStream) { ctx := stream.Context() ctx = contextWithServer(ctx, s) var ti *traceInfo @@ -1743,7 +1802,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str ti.tr.SetError() } errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if err := stream.WriteStatus(status.New(codes.Unimplemented, errDesc)); err != nil { if ti != nil { ti.tr.LazyLog(&fmtStringer{"%v", []any{err}}, true) ti.tr.SetError() @@ -1758,17 +1817,20 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str service := sm[:pos] method := sm[pos+1:] - md, _ := metadata.FromIncomingContext(ctx) - for _, sh := range s.opts.statsHandlers { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: stream.Method()}) - sh.HandleRPC(ctx, &stats.InHeader{ - FullMethod: stream.Method(), - RemoteAddr: t.Peer().Addr, - LocalAddr: t.Peer().LocalAddr, - Compression: stream.RecvCompress(), - WireLength: stream.HeaderWireLength(), - Header: md, - }) + // FromIncomingContext is expensive: skip if there are no statsHandlers + if len(s.opts.statsHandlers) > 0 { + md, _ := metadata.FromIncomingContext(ctx) + for _, sh := range s.opts.statsHandlers { + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: stream.Method()}) + sh.HandleRPC(ctx, &stats.InHeader{ + FullMethod: stream.Method(), + RemoteAddr: t.Peer().Addr, + LocalAddr: t.Peer().LocalAddr, + Compression: stream.RecvCompress(), + WireLength: stream.HeaderWireLength(), + Header: md, + }) + } } // To have calls in stream callouts work. Will delete once all stats handler // calls come from the gRPC layer. @@ -1777,17 +1839,17 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str srv, knownService := s.services[service] if knownService { if md, ok := srv.methods[method]; ok { - s.processUnaryRPC(ctx, t, stream, srv, md, ti) + s.processUnaryRPC(ctx, stream, srv, md, ti) return } if sd, ok := srv.streams[method]; ok { - s.processStreamingRPC(ctx, t, stream, srv, sd, ti) + s.processStreamingRPC(ctx, stream, srv, sd, ti) return } } // Unknown service, or known server unknown method. if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { - s.processStreamingRPC(ctx, t, stream, nil, unknownDesc, ti) + s.processStreamingRPC(ctx, stream, nil, unknownDesc, ti) return } var errDesc string @@ -1800,7 +1862,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str ti.tr.LazyPrintf("%s", errDesc) ti.tr.SetError() } - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if err := stream.WriteStatus(status.New(codes.Unimplemented, errDesc)); err != nil { if ti != nil { ti.tr.LazyLog(&fmtStringer{"%v", []any{err}}, true) ti.tr.SetError() @@ -1900,7 +1962,7 @@ func (s *Server) stop(graceful bool) { s.conns = nil if s.opts.numServerWorkers > 0 { - // Closing the channel (only once, via grpcsync.OnceFunc) after all the + // Closing the channel (only once, via sync.OnceFunc) after all the // connections have been closed above ensures that there are no // goroutines executing the callback passed to st.HandleStreams (where // the channel is written to). @@ -1953,12 +2015,12 @@ func (s *Server) getCodec(contentSubtype string) baseCodec { return s.opts.codec } if contentSubtype == "" { - return encoding.GetCodec(proto.Name) + return getCodec(proto.Name) } - codec := encoding.GetCodec(contentSubtype) + codec := getCodec(contentSubtype) if codec == nil { logger.Warningf("Unsupported codec %q. Defaulting to %q for now. This will start to fail in future releases.", contentSubtype, proto.Name) - return encoding.GetCodec(proto.Name) + return getCodec(proto.Name) } return codec } @@ -2075,7 +2137,7 @@ func SendHeader(ctx context.Context, md metadata.MD) error { // Notice: This function is EXPERIMENTAL and may be changed or removed in a // later release. func SetSendCompressor(ctx context.Context, name string) error { - stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.ServerStream) if !ok || stream == nil { return fmt.Errorf("failed to fetch the stream from the given context") } @@ -2097,7 +2159,7 @@ func SetSendCompressor(ctx context.Context, name string) error { // Notice: This function is EXPERIMENTAL and may be changed or removed in a // later release. func ClientSupportedCompressors(ctx context.Context) ([]string, error) { - stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.ServerStream) if !ok || stream == nil { return nil, fmt.Errorf("failed to fetch the stream from the given context %v", ctx) } diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index 2b35c5d213..8d451e07c7 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -26,6 +26,7 @@ import ( "time" "google.golang.org/grpc/balancer" + "google.golang.org/grpc/balancer/pickfirst" "google.golang.org/grpc/codes" "google.golang.org/grpc/internal" "google.golang.org/grpc/internal/balancer/gracefulswitch" @@ -163,16 +164,19 @@ type jsonSC struct { } func init() { - internal.ParseServiceConfig = parseServiceConfig + internal.ParseServiceConfig = func(js string) *serviceconfig.ParseResult { + return parseServiceConfig(js, defaultMaxCallAttempts) + } } -func parseServiceConfig(js string) *serviceconfig.ParseResult { + +func parseServiceConfig(js string, maxAttempts int) *serviceconfig.ParseResult { if len(js) == 0 { return &serviceconfig.ParseResult{Err: fmt.Errorf("no JSON service config provided")} } var rsc jsonSC err := json.Unmarshal([]byte(js), &rsc) if err != nil { - logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) + logger.Warningf("grpc: unmarshalling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } sc := ServiceConfig{ @@ -183,12 +187,12 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { } c := rsc.LoadBalancingConfig if c == nil { - name := PickFirstBalancerName + name := pickfirst.Name if rsc.LoadBalancingPolicy != nil { name = *rsc.LoadBalancingPolicy } if balancer.Get(name) == nil { - name = PickFirstBalancerName + name = pickfirst.Name } cfg := []map[string]any{{name: struct{}{}}} strCfg, err := json.Marshal(cfg) @@ -218,8 +222,8 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { WaitForReady: m.WaitForReady, Timeout: (*time.Duration)(m.Timeout), } - if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy); err != nil { - logger.Warningf("grpc: unmarshaling service config %s: %v", js, err) + if mc.RetryPolicy, err = convertRetryPolicy(m.RetryPolicy, maxAttempts); err != nil { + logger.Warningf("grpc: unmarshalling service config %s: %v", js, err) return &serviceconfig.ParseResult{Err: err} } if m.MaxRequestMessageBytes != nil { @@ -239,13 +243,13 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { for i, n := range *m.Name { path, err := n.generatePath() if err != nil { - logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshalling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } if _, ok := paths[path]; ok { err = errDuplicatedName - logger.Warningf("grpc: error unmarshaling service config %s due to methodConfig[%d]: %v", js, i, err) + logger.Warningf("grpc: error unmarshalling service config %s due to methodConfig[%d]: %v", js, i, err) return &serviceconfig.ParseResult{Err: err} } paths[path] = struct{}{} @@ -264,38 +268,40 @@ func parseServiceConfig(js string) *serviceconfig.ParseResult { return &serviceconfig.ParseResult{Config: &sc} } -func convertRetryPolicy(jrp *jsonRetryPolicy) (p *internalserviceconfig.RetryPolicy, err error) { +func isValidRetryPolicy(jrp *jsonRetryPolicy) bool { + return jrp.MaxAttempts > 1 && + jrp.InitialBackoff > 0 && + jrp.MaxBackoff > 0 && + jrp.BackoffMultiplier > 0 && + len(jrp.RetryableStatusCodes) > 0 +} + +func convertRetryPolicy(jrp *jsonRetryPolicy, maxAttempts int) (p *internalserviceconfig.RetryPolicy, err error) { if jrp == nil { return nil, nil } - if jrp.MaxAttempts <= 1 || - jrp.InitialBackoff <= 0 || - jrp.MaxBackoff <= 0 || - jrp.BackoffMultiplier <= 0 || - len(jrp.RetryableStatusCodes) == 0 { - logger.Warningf("grpc: ignoring retry policy %v due to illegal configuration", jrp) - return nil, nil + if !isValidRetryPolicy(jrp) { + return nil, fmt.Errorf("invalid retry policy (%+v): ", jrp) } + if jrp.MaxAttempts < maxAttempts { + maxAttempts = jrp.MaxAttempts + } rp := &internalserviceconfig.RetryPolicy{ - MaxAttempts: jrp.MaxAttempts, + MaxAttempts: maxAttempts, InitialBackoff: time.Duration(jrp.InitialBackoff), MaxBackoff: time.Duration(jrp.MaxBackoff), BackoffMultiplier: jrp.BackoffMultiplier, RetryableStatusCodes: make(map[codes.Code]bool), } - if rp.MaxAttempts > 5 { - // TODO(retry): Make the max maxAttempts configurable. - rp.MaxAttempts = 5 - } for _, code := range jrp.RetryableStatusCodes { rp.RetryableStatusCodes[code] = true } return rp, nil } -func min(a, b *int) *int { +func minPointers(a, b *int) *int { if *a < *b { return a } @@ -307,7 +313,7 @@ func getMaxSize(mcMax, doptMax *int, defaultVal int) *int { return &defaultVal } if mcMax != nil && doptMax != nil { - return min(mcMax, doptMax) + return minPointers(mcMax, doptMax) } if mcMax != nil { return mcMax diff --git a/vendor/google.golang.org/grpc/shared_buffer_pool.go b/vendor/google.golang.org/grpc/shared_buffer_pool.go deleted file mode 100644 index 48a64cfe8e..0000000000 --- a/vendor/google.golang.org/grpc/shared_buffer_pool.go +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * Copyright 2023 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpc - -import "sync" - -// SharedBufferPool is a pool of buffers that can be shared, resulting in -// decreased memory allocation. Currently, in gRPC-go, it is only utilized -// for parsing incoming messages. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. -type SharedBufferPool interface { - // Get returns a buffer with specified length from the pool. - // - // The returned byte slice may be not zero initialized. - Get(length int) []byte - - // Put returns a buffer to the pool. - Put(*[]byte) -} - -// NewSharedBufferPool creates a simple SharedBufferPool with buckets -// of different sizes to optimize memory usage. This prevents the pool from -// wasting large amounts of memory, even when handling messages of varying sizes. -// -// # Experimental -// -// Notice: This API is EXPERIMENTAL and may be changed or removed in a -// later release. -func NewSharedBufferPool() SharedBufferPool { - return &simpleSharedBufferPool{ - pools: [poolArraySize]simpleSharedBufferChildPool{ - newBytesPool(level0PoolMaxSize), - newBytesPool(level1PoolMaxSize), - newBytesPool(level2PoolMaxSize), - newBytesPool(level3PoolMaxSize), - newBytesPool(level4PoolMaxSize), - newBytesPool(0), - }, - } -} - -// simpleSharedBufferPool is a simple implementation of SharedBufferPool. -type simpleSharedBufferPool struct { - pools [poolArraySize]simpleSharedBufferChildPool -} - -func (p *simpleSharedBufferPool) Get(size int) []byte { - return p.pools[p.poolIdx(size)].Get(size) -} - -func (p *simpleSharedBufferPool) Put(bs *[]byte) { - p.pools[p.poolIdx(cap(*bs))].Put(bs) -} - -func (p *simpleSharedBufferPool) poolIdx(size int) int { - switch { - case size <= level0PoolMaxSize: - return level0PoolIdx - case size <= level1PoolMaxSize: - return level1PoolIdx - case size <= level2PoolMaxSize: - return level2PoolIdx - case size <= level3PoolMaxSize: - return level3PoolIdx - case size <= level4PoolMaxSize: - return level4PoolIdx - default: - return levelMaxPoolIdx - } -} - -const ( - level0PoolMaxSize = 16 // 16 B - level1PoolMaxSize = level0PoolMaxSize * 16 // 256 B - level2PoolMaxSize = level1PoolMaxSize * 16 // 4 KB - level3PoolMaxSize = level2PoolMaxSize * 16 // 64 KB - level4PoolMaxSize = level3PoolMaxSize * 16 // 1 MB -) - -const ( - level0PoolIdx = iota - level1PoolIdx - level2PoolIdx - level3PoolIdx - level4PoolIdx - levelMaxPoolIdx - poolArraySize -) - -type simpleSharedBufferChildPool interface { - Get(size int) []byte - Put(any) -} - -type bufferPool struct { - sync.Pool - - defaultSize int -} - -func (p *bufferPool) Get(size int) []byte { - bs := p.Pool.Get().(*[]byte) - - if cap(*bs) < size { - p.Pool.Put(bs) - - return make([]byte, size) - } - - return (*bs)[:size] -} - -func newBytesPool(size int) simpleSharedBufferChildPool { - return &bufferPool{ - Pool: sync.Pool{ - New: func() any { - bs := make([]byte, size) - return &bs - }, - }, - defaultSize: size, - } -} - -// nopBufferPool is a buffer pool just makes new buffer without pooling. -type nopBufferPool struct { -} - -func (nopBufferPool) Get(length int) []byte { - return make([]byte, length) -} - -func (nopBufferPool) Put(*[]byte) { -} diff --git a/vendor/google.golang.org/grpc/stats/handlers.go b/vendor/google.golang.org/grpc/stats/handlers.go index dc03731e45..67194a592f 100644 --- a/vendor/google.golang.org/grpc/stats/handlers.go +++ b/vendor/google.golang.org/grpc/stats/handlers.go @@ -38,6 +38,15 @@ type RPCTagInfo struct { // FailFast indicates if this RPC is failfast. // This field is only valid on client side, it's always false on server side. FailFast bool + // NameResolutionDelay indicates if the RPC needed to wait for the + // initial name resolver update before it could begin. This should only + // happen if the channel is IDLE when the RPC is started. Note that + // all retry or hedging attempts for an RPC that experienced a delay + // will have it set. + // + // This field is only valid on the client side; it is always false on + // the server side. + NameResolutionDelay bool } // Handler defines the interface for the related stats handling (e.g., RPCs, connections). diff --git a/vendor/google.golang.org/grpc/stats/metrics.go b/vendor/google.golang.org/grpc/stats/metrics.go new file mode 100644 index 0000000000..641c8e9794 --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/metrics.go @@ -0,0 +1,81 @@ +/* + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package stats + +import "maps" + +// MetricSet is a set of metrics to record. Once created, MetricSet is immutable, +// however Add and Remove can make copies with specific metrics added or +// removed, respectively. +// +// Do not construct directly; use NewMetricSet instead. +type MetricSet struct { + // metrics are the set of metrics to initialize. + metrics map[string]bool +} + +// NewMetricSet returns a MetricSet containing metricNames. +func NewMetricSet(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for _, metric := range metricNames { + newMetrics[metric] = true + } + return &MetricSet{metrics: newMetrics} +} + +// Metrics returns the metrics set. The returned map is read-only and must not +// be modified. +func (m *MetricSet) Metrics() map[string]bool { + return m.metrics +} + +// Add adds the metricNames to the metrics set and returns a new copy with the +// additional metrics. +func (m *MetricSet) Add(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for metric := range m.metrics { + newMetrics[metric] = true + } + + for _, metric := range metricNames { + newMetrics[metric] = true + } + return &MetricSet{metrics: newMetrics} +} + +// Join joins the metrics passed in with the metrics set, and returns a new copy +// with the merged metrics. +func (m *MetricSet) Join(metrics *MetricSet) *MetricSet { + newMetrics := make(map[string]bool) + maps.Copy(newMetrics, m.metrics) + maps.Copy(newMetrics, metrics.metrics) + return &MetricSet{metrics: newMetrics} +} + +// Remove removes the metricNames from the metrics set and returns a new copy +// with the metrics removed. +func (m *MetricSet) Remove(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for metric := range m.metrics { + newMetrics[metric] = true + } + + for _, metric := range metricNames { + delete(newMetrics, metric) + } + return &MetricSet{metrics: newMetrics} +} diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go index 4ab70e2d46..10bf998aa5 100644 --- a/vendor/google.golang.org/grpc/stats/stats.go +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -36,7 +36,12 @@ type RPCStats interface { IsClient() bool } -// Begin contains stats when an RPC attempt begins. +// Begin contains stats for the start of an RPC attempt. +// +// - Server-side: Triggered after `InHeader`, as headers are processed +// before the RPC lifecycle begins. +// - Client-side: The first stats event recorded. +// // FailFast is only valid if this Begin is from client side. type Begin struct { // Client is true if this Begin is from client side. @@ -59,24 +64,30 @@ func (s *Begin) IsClient() bool { return s.Client } func (s *Begin) isRPCStats() {} -// PickerUpdated indicates that the LB policy provided a new picker while the -// RPC was waiting for one. -type PickerUpdated struct{} +// DelayedPickComplete indicates that the RPC is unblocked following a delay in +// selecting a connection for the call. +type DelayedPickComplete struct{} -// IsClient indicates if the stats information is from client side. Only Client -// Side interfaces with a Picker, thus always returns true. -func (*PickerUpdated) IsClient() bool { return true } +// IsClient indicates DelayedPickComplete is available on the client. +func (*DelayedPickComplete) IsClient() bool { return true } -func (*PickerUpdated) isRPCStats() {} +func (*DelayedPickComplete) isRPCStats() {} -// InPayload contains the information for an incoming payload. +// PickerUpdated indicates that the RPC is unblocked following a delay in +// selecting a connection for the call. +// +// Deprecated: will be removed in a future release; use DelayedPickComplete +// instead. +type PickerUpdated = DelayedPickComplete + +// InPayload contains stats about an incoming payload. type InPayload struct { // Client is true if this InPayload is from client side. Client bool - // Payload is the payload with original type. + // Payload is the payload with original type. This may be modified after + // the call to HandleRPC which provides the InPayload returns and must be + // copied if needed later. Payload any - // Data is the serialized message payload. - Data []byte // Length is the size of the uncompressed payload data. Does not include any // framing (gRPC or HTTP/2). @@ -98,7 +109,9 @@ func (s *InPayload) IsClient() bool { return s.Client } func (s *InPayload) isRPCStats() {} -// InHeader contains stats when a header is received. +// InHeader contains stats about header reception. +// +// - Server-side: The first stats event after the RPC request is received. type InHeader struct { // Client is true if this InHeader is from client side. Client bool @@ -123,7 +136,7 @@ func (s *InHeader) IsClient() bool { return s.Client } func (s *InHeader) isRPCStats() {} -// InTrailer contains stats when a trailer is received. +// InTrailer contains stats about trailer reception. type InTrailer struct { // Client is true if this InTrailer is from client side. Client bool @@ -139,14 +152,14 @@ func (s *InTrailer) IsClient() bool { return s.Client } func (s *InTrailer) isRPCStats() {} -// OutPayload contains the information for an outgoing payload. +// OutPayload contains stats about an outgoing payload. type OutPayload struct { // Client is true if this OutPayload is from client side. Client bool - // Payload is the payload with original type. + // Payload is the payload with original type. This may be modified after + // the call to HandleRPC which provides the OutPayload returns and must be + // copied if needed later. Payload any - // Data is the serialized message payload. - Data []byte // Length is the size of the uncompressed payload data. Does not include any // framing (gRPC or HTTP/2). Length int @@ -166,7 +179,10 @@ func (s *OutPayload) IsClient() bool { return s.Client } func (s *OutPayload) isRPCStats() {} -// OutHeader contains stats when a header is sent. +// OutHeader contains stats about header transmission. +// +// - Client-side: Only occurs after 'Begin', as headers are always the first +// thing sent on a stream. type OutHeader struct { // Client is true if this OutHeader is from client side. Client bool @@ -189,14 +205,15 @@ func (s *OutHeader) IsClient() bool { return s.Client } func (s *OutHeader) isRPCStats() {} -// OutTrailer contains stats when a trailer is sent. +// OutTrailer contains stats about trailer transmission. type OutTrailer struct { // Client is true if this OutTrailer is from client side. Client bool // WireLength is the wire length of trailer. // - // Deprecated: This field is never set. The length is not known when this message is - // emitted because the trailer fields are compressed with hpack after that. + // Deprecated: This field is never set. The length is not known when this + // message is emitted because the trailer fields are compressed with hpack + // after that. WireLength int // Trailer contains the trailer metadata sent to the client. This // field is only valid if this OutTrailer is from the server side. @@ -208,7 +225,7 @@ func (s *OutTrailer) IsClient() bool { return s.Client } func (s *OutTrailer) isRPCStats() {} -// End contains stats when an RPC ends. +// End contains stats about RPC completion. type End struct { // Client is true if this End is from client side. Client bool @@ -238,7 +255,7 @@ type ConnStats interface { IsClient() bool } -// ConnBegin contains the stats of a connection when it is established. +// ConnBegin contains stats about connection establishment. type ConnBegin struct { // Client is true if this ConnBegin is from client side. Client bool @@ -249,7 +266,7 @@ func (s *ConnBegin) IsClient() bool { return s.Client } func (s *ConnBegin) isConnStats() {} -// ConnEnd contains the stats of a connection when it ends. +// ConnEnd contains stats about connection termination. type ConnEnd struct { // Client is true if this ConnEnd is from client side. Client bool @@ -260,84 +277,42 @@ func (s *ConnEnd) IsClient() bool { return s.Client } func (s *ConnEnd) isConnStats() {} -type incomingTagsKey struct{} -type outgoingTagsKey struct{} - // SetTags attaches stats tagging data to the context, which will be sent in // the outgoing RPC with the header grpc-tags-bin. Subsequent calls to // SetTags will overwrite the values from earlier calls. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: set the `grpc-tags-bin` header in the metadata instead. func SetTags(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, outgoingTagsKey{}, b) + return metadata.AppendToOutgoingContext(ctx, "grpc-tags-bin", string(b)) } // Tags returns the tags from the context for the inbound RPC. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: obtain the `grpc-tags-bin` header from metadata instead. func Tags(ctx context.Context) []byte { - b, _ := ctx.Value(incomingTagsKey{}).([]byte) - return b -} - -// SetIncomingTags attaches stats tagging data to the context, to be read by -// the application (not sent in outgoing RPCs). -// -// This is intended for gRPC-internal use ONLY. -func SetIncomingTags(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, incomingTagsKey{}, b) + traceValues := metadata.ValueFromIncomingContext(ctx, "grpc-tags-bin") + if len(traceValues) == 0 { + return nil + } + return []byte(traceValues[len(traceValues)-1]) } -// OutgoingTags returns the tags from the context for the outbound RPC. -// -// This is intended for gRPC-internal use ONLY. -func OutgoingTags(ctx context.Context) []byte { - b, _ := ctx.Value(outgoingTagsKey{}).([]byte) - return b -} - -type incomingTraceKey struct{} -type outgoingTraceKey struct{} - // SetTrace attaches stats tagging data to the context, which will be sent in // the outgoing RPC with the header grpc-trace-bin. Subsequent calls to // SetTrace will overwrite the values from earlier calls. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: set the `grpc-trace-bin` header in the metadata instead. func SetTrace(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, outgoingTraceKey{}, b) + return metadata.AppendToOutgoingContext(ctx, "grpc-trace-bin", string(b)) } // Trace returns the trace from the context for the inbound RPC. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: obtain the `grpc-trace-bin` header from metadata instead. func Trace(ctx context.Context) []byte { - b, _ := ctx.Value(incomingTraceKey{}).([]byte) - return b -} - -// SetIncomingTrace attaches stats tagging data to the context, to be read by -// the application (not sent in outgoing RPCs). It is intended for -// gRPC-internal use. -func SetIncomingTrace(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, incomingTraceKey{}, b) -} - -// OutgoingTrace returns the trace from the context for the outbound RPC. It is -// intended for gRPC-internal use. -func OutgoingTrace(ctx context.Context) []byte { - b, _ := ctx.Value(outgoingTraceKey{}).([]byte) - return b + traceValues := metadata.ValueFromIncomingContext(ctx, "grpc-trace-bin") + if len(traceValues) == 0 { + return nil + } + return []byte(traceValues[len(traceValues)-1]) } diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index d939ffc634..0a0af8961f 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -23,6 +23,7 @@ import ( "errors" "io" "math" + rand "math/rand/v2" "strconv" "sync" "time" @@ -34,13 +35,13 @@ import ( "google.golang.org/grpc/internal/balancerload" "google.golang.org/grpc/internal/binarylog" "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/internal/grpcrand" "google.golang.org/grpc/internal/grpcutil" imetadata "google.golang.org/grpc/internal/metadata" iresolver "google.golang.org/grpc/internal/resolver" "google.golang.org/grpc/internal/serviceconfig" istatus "google.golang.org/grpc/internal/status" "google.golang.org/grpc/internal/transport" + "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" @@ -100,9 +101,9 @@ type ClientStream interface { // It must only be called after stream.CloseAndRecv has returned, or // stream.Recv has returned a non-nil error (including io.EOF). Trailer() metadata.MD - // CloseSend closes the send direction of the stream. It closes the stream - // when non-nil error is met. It is also not safe to call CloseSend - // concurrently with SendMsg. + // CloseSend closes the send direction of the stream. This method always + // returns a nil error. The status of the stream may be discovered using + // RecvMsg. It is also not safe to call CloseSend concurrently with SendMsg. CloseSend() error // Context returns the context for this stream. // @@ -112,7 +113,9 @@ type ClientStream interface { // SendMsg is generally called by generated code. On error, SendMsg aborts // the stream. If the error was generated by the client, the status is // returned directly; otherwise, io.EOF is returned and the status of - // the stream may be discovered using RecvMsg. + // the stream may be discovered using RecvMsg. For unary or server-streaming + // RPCs (StreamDesc.ClientStreams is false), a nil error is returned + // unconditionally. // // SendMsg blocks until: // - There is sufficient flow control to schedule m with the transport, or @@ -209,14 +212,15 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth } // Provide an opportunity for the first RPC to see the first service config // provided by the resolver. - if err := cc.waitForResolvedAddrs(ctx); err != nil { + nameResolutionDelayed, err := cc.waitForResolvedAddrs(ctx) + if err != nil { return nil, err } var mc serviceconfig.MethodConfig var onCommit func() - var newStream = func(ctx context.Context, done func()) (iresolver.ClientStream, error) { - return newClientStreamWithParams(ctx, desc, cc, method, mc, onCommit, done, opts...) + newStream := func(ctx context.Context, done func()) (iresolver.ClientStream, error) { + return newClientStreamWithParams(ctx, desc, cc, method, mc, onCommit, done, nameResolutionDelayed, opts...) } rpcInfo := iresolver.RPCInfo{Context: ctx, Method: method} @@ -254,10 +258,10 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth return newStream(ctx, func() {}) } -func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, mc serviceconfig.MethodConfig, onCommit, doneFunc func(), opts ...CallOption) (_ iresolver.ClientStream, err error) { - c := defaultCallInfo() +func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, mc serviceconfig.MethodConfig, onCommit, doneFunc func(), nameResolutionDelayed bool, opts ...CallOption) (_ iresolver.ClientStream, err error) { + callInfo := defaultCallInfo() if mc.WaitForReady != nil { - c.failFast = !*mc.WaitForReady + callInfo.failFast = !*mc.WaitForReady } // Possible context leak: @@ -278,59 +282,61 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client }() for _, o := range opts { - if err := o.before(c); err != nil { + if err := o.before(callInfo); err != nil { return nil, toRPCErr(err) } } - c.maxSendMessageSize = getMaxSize(mc.MaxReqSize, c.maxSendMessageSize, defaultClientMaxSendMessageSize) - c.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, c.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) - if err := setCallInfoCodec(c); err != nil { + callInfo.maxSendMessageSize = getMaxSize(mc.MaxReqSize, callInfo.maxSendMessageSize, defaultClientMaxSendMessageSize) + callInfo.maxReceiveMessageSize = getMaxSize(mc.MaxRespSize, callInfo.maxReceiveMessageSize, defaultClientMaxReceiveMessageSize) + if err := setCallInfoCodec(callInfo); err != nil { return nil, err } callHdr := &transport.CallHdr{ Host: cc.authority, Method: method, - ContentSubtype: c.contentSubtype, + ContentSubtype: callInfo.contentSubtype, DoneFunc: doneFunc, + Authority: callInfo.authority, } // Set our outgoing compression according to the UseCompressor CallOption, if // set. In that case, also find the compressor from the encoding package. // Otherwise, use the compressor configured by the WithCompressor DialOption, // if set. - var cp Compressor - var comp encoding.Compressor - if ct := c.compressorType; ct != "" { + var compressorV0 Compressor + var compressorV1 encoding.Compressor + if ct := callInfo.compressorName; ct != "" { callHdr.SendCompress = ct if ct != encoding.Identity { - comp = encoding.GetCompressor(ct) - if comp == nil { + compressorV1 = encoding.GetCompressor(ct) + if compressorV1 == nil { return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct) } } - } else if cc.dopts.cp != nil { - callHdr.SendCompress = cc.dopts.cp.Type() - cp = cc.dopts.cp + } else if cc.dopts.compressorV0 != nil { + callHdr.SendCompress = cc.dopts.compressorV0.Type() + compressorV0 = cc.dopts.compressorV0 } - if c.creds != nil { - callHdr.Creds = c.creds + if callInfo.creds != nil { + callHdr.Creds = callInfo.creds } cs := &clientStream{ - callHdr: callHdr, - ctx: ctx, - methodConfig: &mc, - opts: opts, - callInfo: c, - cc: cc, - desc: desc, - codec: c.codec, - cp: cp, - comp: comp, - cancel: cancel, - firstAttempt: true, - onCommit: onCommit, + callHdr: callHdr, + ctx: ctx, + methodConfig: &mc, + opts: opts, + callInfo: callInfo, + cc: cc, + desc: desc, + codec: callInfo.codec, + compressorV0: compressorV0, + compressorV1: compressorV1, + cancel: cancel, + firstAttempt: true, + onCommit: onCommit, + nameResolutionDelay: nameResolutionDelayed, } if !cc.dopts.disableRetry { cs.retryThrottler = cc.retryThrottler.Load().(*retryThrottler) @@ -359,7 +365,7 @@ func newClientStreamWithParams(ctx context.Context, desc *StreamDesc, cc *Client cs.attempt = a return nil } - if err := cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }); err != nil { + if err := cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op, nil) }); err != nil { return nil, err } @@ -409,12 +415,12 @@ func (cs *clientStream) newAttemptLocked(isTransparent bool) (*csAttempt, error) return nil, ErrClientConnClosing } - ctx := newContextWithRPCInfo(cs.ctx, cs.callInfo.failFast, cs.callInfo.codec, cs.cp, cs.comp) + ctx := newContextWithRPCInfo(cs.ctx, cs.callInfo.failFast, cs.callInfo.codec, cs.compressorV0, cs.compressorV1) method := cs.callHdr.Method var beginTime time.Time shs := cs.cc.dopts.copts.StatsHandlers for _, sh := range shs { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: cs.callInfo.failFast}) + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: cs.callInfo.failFast, NameResolutionDelay: cs.nameResolutionDelay}) beginTime = time.Now() begin := &stats.Begin{ Client: true, @@ -451,20 +457,21 @@ func (cs *clientStream) newAttemptLocked(isTransparent bool) (*csAttempt, error) } return &csAttempt{ - ctx: ctx, - beginTime: beginTime, - cs: cs, - dc: cs.cc.dopts.dc, - statsHandlers: shs, - trInfo: trInfo, + ctx: ctx, + beginTime: beginTime, + cs: cs, + decompressorV0: cs.cc.dopts.dc, + statsHandlers: shs, + trInfo: trInfo, }, nil } func (a *csAttempt) getTransport() error { cs := a.cs - var err error - a.t, a.pickResult, err = cs.cc.getTransport(a.ctx, cs.callInfo.failFast, cs.callHdr.Method) + pickInfo := balancer.PickInfo{Ctx: a.ctx, FullMethodName: cs.callHdr.Method} + pick, err := cs.cc.pickerWrapper.pick(a.ctx, cs.callInfo.failFast, pickInfo) + a.transport, a.pickResult = pick.transport, pick.result if err != nil { if de, ok := err.(dropError); ok { err = de.error @@ -473,7 +480,12 @@ func (a *csAttempt) getTransport() error { return err } if a.trInfo != nil { - a.trInfo.firstLine.SetRemoteAddr(a.t.RemoteAddr()) + a.trInfo.firstLine.SetRemoteAddr(a.transport.RemoteAddr()) + } + if pick.blocked { + for _, sh := range a.statsHandlers { + sh.HandleRPC(a.ctx, &stats.DelayedPickComplete{}) + } } return nil } @@ -500,7 +512,7 @@ func (a *csAttempt) newStream() error { a.ctx = metadata.NewOutgoingContext(a.ctx, md) } - s, err := a.t.NewStream(a.ctx, cs.callHdr) + s, err := a.transport.NewStream(a.ctx, cs.callHdr) if err != nil { nse, ok := err.(*transport.NewStreamError) if !ok { @@ -515,8 +527,9 @@ func (a *csAttempt) newStream() error { // Unwrap and convert error. return toRPCErr(nse.Err) } - a.s = s - a.p = &parser{r: s, recvBufferPool: a.cs.cc.dopts.recvBufferPool} + a.transportStream = s + a.ctx = s.Context() + a.parser = &parser{r: s, bufferPool: a.cs.cc.dopts.copts.BufferPool} return nil } @@ -528,14 +541,16 @@ type clientStream struct { cc *ClientConn desc *StreamDesc - codec baseCodec - cp Compressor - comp encoding.Compressor + codec baseCodec + compressorV0 Compressor + compressorV1 encoding.Compressor cancel context.CancelFunc // cancels all attempts sentLast bool // sent an end stream + receivedFirstMsg bool // set after the first message is received + methodConfig *MethodConfig ctx context.Context // the application's context, wrapped by stats/tracing @@ -565,26 +580,34 @@ type clientStream struct { // place where we need to check if the attempt is nil. attempt *csAttempt // TODO(hedging): hedging will have multiple attempts simultaneously. - committed bool // active attempt committed for retry? - onCommit func() - buffer []func(a *csAttempt) error // operations to replay on retry - bufferSize int // current size of buffer + committed bool // active attempt committed for retry? + onCommit func() + replayBuffer []replayOp // operations to replay on retry + replayBufferSize int // current size of replayBuffer + // nameResolutionDelay indicates if there was a delay in the name resolution. + // This field is only valid on client side, it's always false on server side. + nameResolutionDelay bool +} + +type replayOp struct { + op func(a *csAttempt) error + cleanup func() } // csAttempt implements a single transport stream attempt within a // clientStream. type csAttempt struct { - ctx context.Context - cs *clientStream - t transport.ClientTransport - s *transport.Stream - p *parser - pickResult balancer.PickResult - - finished bool - dc Decompressor - decomp encoding.Compressor - decompSet bool + ctx context.Context + cs *clientStream + transport transport.ClientTransport + transportStream *transport.ClientStream + parser *parser + pickResult balancer.PickResult + + finished bool + decompressorV0 Decompressor + decompressorV1 encoding.Compressor + decompressorSet bool mu sync.Mutex // guards trInfo.tr // trInfo may be nil (if EnableTracing is false). @@ -606,7 +629,12 @@ func (cs *clientStream) commitAttemptLocked() { cs.onCommit() } cs.committed = true - cs.buffer = nil + for _, op := range cs.replayBuffer { + if op.cleanup != nil { + op.cleanup() + } + } + cs.replayBuffer = nil } func (cs *clientStream) commitAttempt() { @@ -625,14 +653,14 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { // RPC is finished or committed or was dropped by the picker; cannot retry. return false, err } - if a.s == nil && a.allowTransparentRetry { + if a.transportStream == nil && a.allowTransparentRetry { return true, nil } // Wait for the trailers. unprocessed := false - if a.s != nil { - <-a.s.Done() - unprocessed = a.s.Unprocessed() + if a.transportStream != nil { + <-a.transportStream.Done() + unprocessed = a.transportStream.Unprocessed() } if cs.firstAttempt && unprocessed { // First attempt, stream unprocessed: transparently retry. @@ -644,14 +672,14 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { pushback := 0 hasPushback := false - if a.s != nil { - if !a.s.TrailersOnly() { + if a.transportStream != nil { + if !a.transportStream.TrailersOnly() { return false, err } // TODO(retry): Move down if the spec changes to not check server pushback // before considering this a failure for throttling. - sps := a.s.Trailer()["grpc-retry-pushback-ms"] + sps := a.transportStream.Trailer()["grpc-retry-pushback-ms"] if len(sps) == 1 { var e error if pushback, e = strconv.Atoi(sps[0]); e != nil || pushback < 0 { @@ -668,8 +696,8 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { } var code codes.Code - if a.s != nil { - code = a.s.Status().Code() + if a.transportStream != nil { + code = a.transportStream.Status().Code() } else { code = status.Code(err) } @@ -694,11 +722,10 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { cs.numRetriesSincePushback = 0 } else { fact := math.Pow(rp.BackoffMultiplier, float64(cs.numRetriesSincePushback)) - cur := float64(rp.InitialBackoff) * fact - if max := float64(rp.MaxBackoff); cur > max { - cur = max - } - dur = time.Duration(grpcrand.Int63n(int64(cur))) + cur := min(float64(rp.InitialBackoff)*fact, float64(rp.MaxBackoff)) + // Apply jitter by multiplying with a random factor between 0.8 and 1.2 + cur *= 0.8 + 0.4*rand.Float64() + dur = time.Duration(int64(cur)) cs.numRetriesSincePushback++ } @@ -731,7 +758,7 @@ func (cs *clientStream) retryLocked(attempt *csAttempt, lastErr error) error { // the stream is canceled. return err } - // Note that the first op in the replay buffer always sets cs.attempt + // Note that the first op in replayBuffer always sets cs.attempt // if it is able to pick a transport and create a stream. if lastErr = cs.replayBufferLocked(attempt); lastErr == nil { return nil @@ -743,8 +770,8 @@ func (cs *clientStream) Context() context.Context { cs.commitAttempt() // No need to lock before using attempt, since we know it is committed and // cannot change. - if cs.attempt.s != nil { - return cs.attempt.s.Context() + if cs.attempt.transportStream != nil { + return cs.attempt.transportStream.Context() } return cs.ctx } @@ -760,7 +787,7 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) // already be status errors. return toRPCErr(op(cs.attempt)) } - if len(cs.buffer) == 0 { + if len(cs.replayBuffer) == 0 { // For the first op, which controls creation of the stream and // assigns cs.attempt, we need to create a new attempt inline // before executing the first op. On subsequent ops, the attempt @@ -781,9 +808,9 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func()) continue } if err == io.EOF { - <-a.s.Done() + <-a.transportStream.Done() } - if err == nil || (err == io.EOF && a.s.Status().Code() == codes.OK) { + if err == nil || (err == io.EOF && a.transportStream.Status().Code() == codes.OK) { onSuccess() cs.mu.Unlock() return err @@ -799,7 +826,7 @@ func (cs *clientStream) Header() (metadata.MD, error) { var m metadata.MD err := cs.withRetry(func(a *csAttempt) error { var err error - m, err = a.s.Header() + m, err = a.transportStream.Header() return toRPCErr(err) }, cs.commitAttemptLocked) @@ -843,32 +870,33 @@ func (cs *clientStream) Trailer() metadata.MD { // directions -- it will prevent races and should not meaningfully impact // performance. cs.commitAttempt() - if cs.attempt.s == nil { + if cs.attempt.transportStream == nil { return nil } - return cs.attempt.s.Trailer() + return cs.attempt.transportStream.Trailer() } func (cs *clientStream) replayBufferLocked(attempt *csAttempt) error { - for _, f := range cs.buffer { - if err := f(attempt); err != nil { + for _, f := range cs.replayBuffer { + if err := f.op(attempt); err != nil { return err } } return nil } -func (cs *clientStream) bufferForRetryLocked(sz int, op func(a *csAttempt) error) { +func (cs *clientStream) bufferForRetryLocked(sz int, op func(a *csAttempt) error, cleanup func()) { // Note: we still will buffer if retry is disabled (for transparent retries). if cs.committed { return } - cs.bufferSize += sz - if cs.bufferSize > cs.callInfo.maxRetryRPCBufferSize { + cs.replayBufferSize += sz + if cs.replayBufferSize > cs.callInfo.maxRetryRPCBufferSize { cs.commitAttemptLocked() + cleanup() return } - cs.buffer = append(cs.buffer, op) + cs.replayBuffer = append(cs.replayBuffer, replayOp{op: op, cleanup: cleanup}) } func (cs *clientStream) SendMsg(m any) (err error) { @@ -890,23 +918,50 @@ func (cs *clientStream) SendMsg(m any) (err error) { } // load hdr, payload, data - hdr, payload, data, err := prepareMsg(m, cs.codec, cs.cp, cs.comp) + hdr, data, payload, pf, err := prepareMsg(m, cs.codec, cs.compressorV0, cs.compressorV1, cs.cc.dopts.copts.BufferPool) if err != nil { return err } + defer func() { + data.Free() + // only free payload if compression was made, and therefore it is a different set + // of buffers from data. + if pf.isCompressed() { + payload.Free() + } + }() + + dataLen := data.Len() + payloadLen := payload.Len() // TODO(dfawley): should we be checking len(data) instead? - if len(payload) > *cs.callInfo.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), *cs.callInfo.maxSendMessageSize) + if payloadLen > *cs.callInfo.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payloadLen, *cs.callInfo.maxSendMessageSize) } + + // always take an extra ref in case data == payload (i.e. when the data isn't + // compressed). The original ref will always be freed by the deferred free above. + payload.Ref() op := func(a *csAttempt) error { - return a.sendMsg(m, hdr, payload, data) + return a.sendMsg(m, hdr, payload, dataLen, payloadLen) + } + + // onSuccess is invoked when the op is captured for a subsequent retry. If the + // stream was established by a previous message and therefore retries are + // disabled, onSuccess will not be invoked, and payloadRef can be freed + // immediately. + onSuccessCalled := false + err = cs.withRetry(op, func() { + cs.bufferForRetryLocked(len(hdr)+payloadLen, op, payload.Free) + onSuccessCalled = true + }) + if !onSuccessCalled { + payload.Free() } - err = cs.withRetry(op, func() { cs.bufferForRetryLocked(len(hdr)+len(payload), op) }) if len(cs.binlogs) != 0 && err == nil { cm := &binarylog.ClientMessage{ OnClientSide: true, - Message: data, + Message: data.Materialize(), } for _, binlog := range cs.binlogs { binlog.Log(cs.ctx, cm) @@ -923,6 +978,7 @@ func (cs *clientStream) RecvMsg(m any) error { var recvInfo *payloadInfo if len(cs.binlogs) != 0 { recvInfo = &payloadInfo{} + defer recvInfo.free() } err := cs.withRetry(func(a *csAttempt) error { return a.recvMsg(m, recvInfo) @@ -930,7 +986,7 @@ func (cs *clientStream) RecvMsg(m any) error { if len(cs.binlogs) != 0 && err == nil { sm := &binarylog.ServerMessage{ OnClientSide: true, - Message: recvInfo.uncompressedBytes, + Message: recvInfo.uncompressedBytes.Materialize(), } for _, binlog := range cs.binlogs { binlog.Log(cs.ctx, sm) @@ -945,19 +1001,19 @@ func (cs *clientStream) RecvMsg(m any) error { func (cs *clientStream) CloseSend() error { if cs.sentLast { - // TODO: return an error and finish the stream instead, due to API misuse? + // Return a nil error on repeated calls to this method. return nil } cs.sentLast = true op := func(a *csAttempt) error { - a.t.Write(a.s, nil, nil, &transport.Options{Last: true}) + a.transportStream.Write(nil, nil, &transport.WriteOptions{Last: true}) // Always return nil; io.EOF is the only error that might make sense // instead, but there is no need to signal the client to call RecvMsg // as the only use left for the stream after CloseSend is to call // RecvMsg. This also matches historical behavior. return nil } - cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op) }) + cs.withRetry(op, func() { cs.bufferForRetryLocked(0, op, nil) }) if len(cs.binlogs) != 0 { chc := &binarylog.ClientHalfClose{ OnClientSide: true, @@ -966,7 +1022,10 @@ func (cs *clientStream) CloseSend() error { binlog.Log(cs.ctx, chc) } } - // We never returned an error here for reasons. + // We don't return an error here as we expect users to read all messages + // from the stream and get the RPC status from RecvMsg(). Note that + // SendMsg() must return an error when one occurs so the application + // knows to stop sending messages, but that does not apply here. return nil } @@ -988,7 +1047,7 @@ func (cs *clientStream) finish(err error) { if cs.attempt != nil { cs.attempt.finish(err) // after functions all rely upon having a stream. - if cs.attempt.s != nil { + if cs.attempt.transportStream != nil { for _, o := range cs.opts { o.after(cs.callInfo, cs.attempt) } @@ -1033,7 +1092,7 @@ func (cs *clientStream) finish(err error) { cs.cancel() } -func (a *csAttempt) sendMsg(m any, hdr, payld, data []byte) error { +func (a *csAttempt) sendMsg(m any, hdr []byte, payld mem.BufferSlice, dataLength, payloadLength int) error { cs := a.cs if a.trInfo != nil { a.mu.Lock() @@ -1042,7 +1101,7 @@ func (a *csAttempt) sendMsg(m any, hdr, payld, data []byte) error { } a.mu.Unlock() } - if err := a.t.Write(a.s, hdr, payld, &transport.Options{Last: !cs.desc.ClientStreams}); err != nil { + if err := a.transportStream.Write(hdr, payld, &transport.WriteOptions{Last: !cs.desc.ClientStreams}); err != nil { if !cs.desc.ClientStreams { // For non-client-streaming RPCs, we return nil instead of EOF on error // because the generated code requires it. finish is not called; RecvMsg() @@ -1051,11 +1110,10 @@ func (a *csAttempt) sendMsg(m any, hdr, payld, data []byte) error { } return io.EOF } - for _, sh := range a.statsHandlers { - sh.HandleRPC(a.ctx, outPayload(true, m, data, payld, time.Now())) - } - if channelz.IsOn() { - a.t.IncrMsgSent() + if len(a.statsHandlers) != 0 { + for _, sh := range a.statsHandlers { + sh.HandleRPC(a.ctx, outPayload(true, m, dataLength, payloadLength, time.Now())) + } } return nil } @@ -1064,35 +1122,40 @@ func (a *csAttempt) recvMsg(m any, payInfo *payloadInfo) (err error) { cs := a.cs if len(a.statsHandlers) != 0 && payInfo == nil { payInfo = &payloadInfo{} + defer payInfo.free() } - if !a.decompSet { + if !a.decompressorSet { // Block until we receive headers containing received message encoding. - if ct := a.s.RecvCompress(); ct != "" && ct != encoding.Identity { - if a.dc == nil || a.dc.Type() != ct { + if ct := a.transportStream.RecvCompress(); ct != "" && ct != encoding.Identity { + if a.decompressorV0 == nil || a.decompressorV0.Type() != ct { // No configured decompressor, or it does not match the incoming // message encoding; attempt to find a registered compressor that does. - a.dc = nil - a.decomp = encoding.GetCompressor(ct) + a.decompressorV0 = nil + a.decompressorV1 = encoding.GetCompressor(ct) } } else { // No compression is used; disable our decompressor. - a.dc = nil + a.decompressorV0 = nil } // Only initialize this state once per stream. - a.decompSet = true + a.decompressorSet = true } - err = recv(a.p, cs.codec, a.s, a.dc, m, *cs.callInfo.maxReceiveMessageSize, payInfo, a.decomp) - if err != nil { + if err := recv(a.parser, cs.codec, a.transportStream, a.decompressorV0, m, *cs.callInfo.maxReceiveMessageSize, payInfo, a.decompressorV1, false); err != nil { if err == io.EOF { - if statusErr := a.s.Status().Err(); statusErr != nil { + if statusErr := a.transportStream.Status().Err(); statusErr != nil { return statusErr } + // Received no msg and status OK for non-server streaming rpcs. + if !cs.desc.ServerStreams && !cs.receivedFirstMsg { + return status.Error(codes.Internal, "cardinality violation: received no response message from non-server-streaming RPC") + } return io.EOF // indicates successful end of stream. } return toRPCErr(err) } + cs.receivedFirstMsg = true if a.trInfo != nil { a.mu.Lock() if a.trInfo.tr != nil { @@ -1102,33 +1165,26 @@ func (a *csAttempt) recvMsg(m any, payInfo *payloadInfo) (err error) { } for _, sh := range a.statsHandlers { sh.HandleRPC(a.ctx, &stats.InPayload{ - Client: true, - RecvTime: time.Now(), - Payload: m, - // TODO truncate large payload. - Data: payInfo.uncompressedBytes, + Client: true, + RecvTime: time.Now(), + Payload: m, WireLength: payInfo.compressedLength + headerLen, CompressedLength: payInfo.compressedLength, - Length: len(payInfo.uncompressedBytes), + Length: payInfo.uncompressedBytes.Len(), }) } - if channelz.IsOn() { - a.t.IncrMsgRecv() - } if cs.desc.ServerStreams { // Subsequent messages should be received by subsequent RecvMsg calls. return nil } // Special handling for non-server-stream rpcs. // This recv expects EOF or errors, so we don't collect inPayload. - err = recv(a.p, cs.codec, a.s, a.dc, m, *cs.callInfo.maxReceiveMessageSize, nil, a.decomp) - if err == nil { - return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) - } - if err == io.EOF { - return a.s.Status().Err() // non-server streaming Recv returns nil on success + if err := recv(a.parser, cs.codec, a.transportStream, a.decompressorV0, m, *cs.callInfo.maxReceiveMessageSize, nil, a.decompressorV1, false); err == io.EOF { + return a.transportStream.Status().Err() // non-server streaming Recv returns nil on success + } else if err != nil { + return toRPCErr(err) } - return toRPCErr(err) + return status.Error(codes.Internal, "cardinality violation: expected for non server-streaming RPCs, but received another message") } func (a *csAttempt) finish(err error) { @@ -1143,20 +1199,20 @@ func (a *csAttempt) finish(err error) { err = nil } var tr metadata.MD - if a.s != nil { - a.t.CloseStream(a.s, err) - tr = a.s.Trailer() + if a.transportStream != nil { + a.transportStream.Close(err) + tr = a.transportStream.Trailer() } if a.pickResult.Done != nil { br := false - if a.s != nil { - br = a.s.BytesReceived() + if a.transportStream != nil { + br = a.transportStream.BytesReceived() } a.pickResult.Done(balancer.DoneInfo{ Err: err, Trailer: tr, - BytesSent: a.s != nil, + BytesSent: a.transportStream != nil, BytesReceived: br, ServerLoad: balancerload.Parse(tr), }) @@ -1184,12 +1240,12 @@ func (a *csAttempt) finish(err error) { a.mu.Unlock() } -// newClientStream creates a ClientStream with the specified transport, on the +// newNonRetryClientStream creates a ClientStream with the specified transport, on the // given addrConn. // // It's expected that the given transport is either the same one in addrConn, or // is already closed. To avoid race, transport is specified separately, instead -// of using ac.transpot. +// of using ac.transport. // // Main difference between this and ClientConn.NewStream: // - no retry @@ -1238,7 +1294,7 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin // if set. var cp Compressor var comp encoding.Compressor - if ct := c.compressorType; ct != "" { + if ct := c.compressorName; ct != "" { callHdr.SendCompress = ct if ct != encoding.Identity { comp = encoding.GetCompressor(ct) @@ -1246,9 +1302,9 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct) } } - } else if ac.cc.dopts.cp != nil { - callHdr.SendCompress = ac.cc.dopts.cp.Type() - cp = ac.cc.dopts.cp + } else if ac.cc.dopts.compressorV0 != nil { + callHdr.SendCompress = ac.cc.dopts.compressorV0.Type() + cp = ac.cc.dopts.compressorV0 } if c.creds != nil { callHdr.Creds = c.creds @@ -1256,26 +1312,26 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin // Use a special addrConnStream to avoid retry. as := &addrConnStream{ - callHdr: callHdr, - ac: ac, - ctx: ctx, - cancel: cancel, - opts: opts, - callInfo: c, - desc: desc, - codec: c.codec, - cp: cp, - comp: comp, - t: t, - } - - s, err := as.t.NewStream(as.ctx, as.callHdr) + callHdr: callHdr, + ac: ac, + ctx: ctx, + cancel: cancel, + opts: opts, + callInfo: c, + desc: desc, + codec: c.codec, + sendCompressorV0: cp, + sendCompressorV1: comp, + transport: t, + } + + s, err := as.transport.NewStream(as.ctx, as.callHdr) if err != nil { err = toRPCErr(err) return nil, err } - as.s = s - as.p = &parser{r: s, recvBufferPool: ac.dopts.recvBufferPool} + as.transportStream = s + as.parser = &parser{r: s, bufferPool: ac.dopts.copts.BufferPool} ac.incrCallsStarted() if desc != unaryStreamDesc { // Listen on stream context to cleanup when the stream context is @@ -1301,29 +1357,32 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin } type addrConnStream struct { - s *transport.Stream - ac *addrConn - callHdr *transport.CallHdr - cancel context.CancelFunc - opts []CallOption - callInfo *callInfo - t transport.ClientTransport - ctx context.Context - sentLast bool - desc *StreamDesc - codec baseCodec - cp Compressor - comp encoding.Compressor - decompSet bool - dc Decompressor - decomp encoding.Compressor - p *parser - mu sync.Mutex - finished bool + transportStream *transport.ClientStream + ac *addrConn + callHdr *transport.CallHdr + cancel context.CancelFunc + opts []CallOption + callInfo *callInfo + transport transport.ClientTransport + ctx context.Context + sentLast bool + receivedFirstMsg bool + desc *StreamDesc + codec baseCodec + sendCompressorV0 Compressor + sendCompressorV1 encoding.Compressor + decompressorSet bool + decompressorV0 Decompressor + decompressorV1 encoding.Compressor + parser *parser + + // mu guards finished and is held for the entire finish method. + mu sync.Mutex + finished bool } func (as *addrConnStream) Header() (metadata.MD, error) { - m, err := as.s.Header() + m, err := as.transportStream.Header() if err != nil { as.finish(toRPCErr(err)) } @@ -1331,17 +1390,17 @@ func (as *addrConnStream) Header() (metadata.MD, error) { } func (as *addrConnStream) Trailer() metadata.MD { - return as.s.Trailer() + return as.transportStream.Trailer() } func (as *addrConnStream) CloseSend() error { if as.sentLast { - // TODO: return an error and finish the stream instead, due to API misuse? + // Return a nil error on repeated calls to this method. return nil } as.sentLast = true - as.t.Write(as.s, nil, nil, &transport.Options{Last: true}) + as.transportStream.Write(nil, nil, &transport.WriteOptions{Last: true}) // Always return nil; io.EOF is the only error that might make sense // instead, but there is no need to signal the client to call RecvMsg // as the only use left for the stream after CloseSend is to call @@ -1350,7 +1409,7 @@ func (as *addrConnStream) CloseSend() error { } func (as *addrConnStream) Context() context.Context { - return as.s.Context() + return as.transportStream.Context() } func (as *addrConnStream) SendMsg(m any) (err error) { @@ -1372,17 +1431,26 @@ func (as *addrConnStream) SendMsg(m any) (err error) { } // load hdr, payload, data - hdr, payld, _, err := prepareMsg(m, as.codec, as.cp, as.comp) + hdr, data, payload, pf, err := prepareMsg(m, as.codec, as.sendCompressorV0, as.sendCompressorV1, as.ac.dopts.copts.BufferPool) if err != nil { return err } + defer func() { + data.Free() + // only free payload if compression was made, and therefore it is a different set + // of buffers from data. + if pf.isCompressed() { + payload.Free() + } + }() + // TODO(dfawley): should we be checking len(data) instead? - if len(payld) > *as.callInfo.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payld), *as.callInfo.maxSendMessageSize) + if payload.Len() > *as.callInfo.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payload.Len(), *as.callInfo.maxSendMessageSize) } - if err := as.t.Write(as.s, hdr, payld, &transport.Options{Last: !as.desc.ClientStreams}); err != nil { + if err := as.transportStream.Write(hdr, payload, &transport.WriteOptions{Last: !as.desc.ClientStreams}); err != nil { if !as.desc.ClientStreams { // For non-client-streaming RPCs, we return nil instead of EOF on error // because the generated code requires it. finish is not called; RecvMsg() @@ -1392,9 +1460,6 @@ func (as *addrConnStream) SendMsg(m any) (err error) { return io.EOF } - if channelz.IsOn() { - as.t.IncrMsgSent() - } return nil } @@ -1406,36 +1471,37 @@ func (as *addrConnStream) RecvMsg(m any) (err error) { } }() - if !as.decompSet { + if !as.decompressorSet { // Block until we receive headers containing received message encoding. - if ct := as.s.RecvCompress(); ct != "" && ct != encoding.Identity { - if as.dc == nil || as.dc.Type() != ct { + if ct := as.transportStream.RecvCompress(); ct != "" && ct != encoding.Identity { + if as.decompressorV0 == nil || as.decompressorV0.Type() != ct { // No configured decompressor, or it does not match the incoming // message encoding; attempt to find a registered compressor that does. - as.dc = nil - as.decomp = encoding.GetCompressor(ct) + as.decompressorV0 = nil + as.decompressorV1 = encoding.GetCompressor(ct) } } else { // No compression is used; disable our decompressor. - as.dc = nil + as.decompressorV0 = nil } // Only initialize this state once per stream. - as.decompSet = true + as.decompressorSet = true } - err = recv(as.p, as.codec, as.s, as.dc, m, *as.callInfo.maxReceiveMessageSize, nil, as.decomp) - if err != nil { + if err := recv(as.parser, as.codec, as.transportStream, as.decompressorV0, m, *as.callInfo.maxReceiveMessageSize, nil, as.decompressorV1, false); err != nil { if err == io.EOF { - if statusErr := as.s.Status().Err(); statusErr != nil { + if statusErr := as.transportStream.Status().Err(); statusErr != nil { return statusErr } + // Received no msg and status OK for non-server streaming rpcs. + if !as.desc.ServerStreams && !as.receivedFirstMsg { + return status.Error(codes.Internal, "cardinality violation: received no response message from non-server-streaming RPC") + } return io.EOF // indicates successful end of stream. } return toRPCErr(err) } + as.receivedFirstMsg = true - if channelz.IsOn() { - as.t.IncrMsgRecv() - } if as.desc.ServerStreams { // Subsequent messages should be received by subsequent RecvMsg calls. return nil @@ -1443,14 +1509,12 @@ func (as *addrConnStream) RecvMsg(m any) (err error) { // Special handling for non-server-stream rpcs. // This recv expects EOF or errors, so we don't collect inPayload. - err = recv(as.p, as.codec, as.s, as.dc, m, *as.callInfo.maxReceiveMessageSize, nil, as.decomp) - if err == nil { - return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) - } - if err == io.EOF { - return as.s.Status().Err() // non-server streaming Recv returns nil on success + if err := recv(as.parser, as.codec, as.transportStream, as.decompressorV0, m, *as.callInfo.maxReceiveMessageSize, nil, as.decompressorV1, false); err == io.EOF { + return as.transportStream.Status().Err() // non-server streaming Recv returns nil on success + } else if err != nil { + return toRPCErr(err) } - return toRPCErr(err) + return status.Error(codes.Internal, "cardinality violation: expected for non server-streaming RPCs, but received another message") } func (as *addrConnStream) finish(err error) { @@ -1464,8 +1528,8 @@ func (as *addrConnStream) finish(err error) { // Ending a stream with EOF indicates a success. err = nil } - if as.s != nil { - as.t.CloseStream(as.s, err) + if as.transportStream != nil { + as.transportStream.Close(err) } if err != nil { @@ -1532,18 +1596,20 @@ type ServerStream interface { // serverStream implements a server side Stream. type serverStream struct { ctx context.Context - t transport.ServerTransport - s *transport.Stream + s *transport.ServerStream p *parser codec baseCodec + desc *StreamDesc - cp Compressor - dc Decompressor - comp encoding.Compressor - decomp encoding.Compressor + compressorV0 Compressor + compressorV1 encoding.Compressor + decompressorV0 Decompressor + decompressorV1 encoding.Compressor sendCompressorName string + recvFirstMsg bool // set after the first message is received + maxReceiveMessageSize int maxSendMessageSize int trInfo *traceInfo @@ -1583,7 +1649,7 @@ func (ss *serverStream) SendHeader(md metadata.MD) error { return status.Error(codes.Internal, err.Error()) } - err = ss.t.WriteHeader(ss.s, md) + err = ss.s.SendHeader(md) if len(ss.binlogs) != 0 && !ss.serverHeaderBinlogged { h, _ := ss.s.Header() sh := &binarylog.ServerHeader{ @@ -1623,7 +1689,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } if err != nil && err != io.EOF { st, _ := status.FromError(toRPCErr(err)) - ss.t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) // Non-user specified status was sent out. This should be an error // case (as a server side Cancel maybe). // @@ -1631,31 +1697,41 @@ func (ss *serverStream) SendMsg(m any) (err error) { // status from the service handler, we will log that error instead. // This behavior is similar to an interceptor. } - if channelz.IsOn() && err == nil { - ss.t.IncrMsgSent() - } }() // Server handler could have set new compressor by calling SetSendCompressor. // In case it is set, we need to use it for compressing outbound message. if sendCompressorsName := ss.s.SendCompress(); sendCompressorsName != ss.sendCompressorName { - ss.comp = encoding.GetCompressor(sendCompressorsName) + ss.compressorV1 = encoding.GetCompressor(sendCompressorsName) ss.sendCompressorName = sendCompressorsName } // load hdr, payload, data - hdr, payload, data, err := prepareMsg(m, ss.codec, ss.cp, ss.comp) + hdr, data, payload, pf, err := prepareMsg(m, ss.codec, ss.compressorV0, ss.compressorV1, ss.p.bufferPool) if err != nil { return err } + defer func() { + data.Free() + // only free payload if compression was made, and therefore it is a different set + // of buffers from data. + if pf.isCompressed() { + payload.Free() + } + }() + + dataLen := data.Len() + payloadLen := payload.Len() + // TODO(dfawley): should we be checking len(data) instead? - if len(payload) > ss.maxSendMessageSize { - return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(payload), ss.maxSendMessageSize) + if payloadLen > ss.maxSendMessageSize { + return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payloadLen, ss.maxSendMessageSize) } - if err := ss.t.Write(ss.s, hdr, payload, &transport.Options{Last: false}); err != nil { + if err := ss.s.Write(hdr, payload, &transport.WriteOptions{Last: false}); err != nil { return toRPCErr(err) } + if len(ss.binlogs) != 0 { if !ss.serverHeaderBinlogged { h, _ := ss.s.Header() @@ -1668,7 +1744,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } } sm := &binarylog.ServerMessage{ - Message: data, + Message: data.Materialize(), } for _, binlog := range ss.binlogs { binlog.Log(ss.ctx, sm) @@ -1676,7 +1752,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } if len(ss.statsHandler) != 0 { for _, sh := range ss.statsHandler { - sh.HandleRPC(ss.s.Context(), outPayload(false, m, data, payload, time.Now())) + sh.HandleRPC(ss.s.Context(), outPayload(false, m, dataLen, payloadLen, time.Now())) } } return nil @@ -1698,7 +1774,7 @@ func (ss *serverStream) RecvMsg(m any) (err error) { } if err != nil && err != io.EOF { st, _ := status.FromError(toRPCErr(err)) - ss.t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) // Non-user specified status was sent out. This should be an error // case (as a server side Cancel maybe). // @@ -1706,15 +1782,13 @@ func (ss *serverStream) RecvMsg(m any) (err error) { // status from the service handler, we will log that error instead. // This behavior is similar to an interceptor. } - if channelz.IsOn() && err == nil { - ss.t.IncrMsgRecv() - } }() var payInfo *payloadInfo if len(ss.statsHandler) != 0 || len(ss.binlogs) != 0 { payInfo = &payloadInfo{} + defer payInfo.free() } - if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, payInfo, ss.decomp); err != nil { + if err := recv(ss.p, ss.codec, ss.s, ss.decompressorV0, m, ss.maxReceiveMessageSize, payInfo, ss.decompressorV1, true); err != nil { if err == io.EOF { if len(ss.binlogs) != 0 { chc := &binarylog.ClientHalfClose{} @@ -1722,21 +1796,24 @@ func (ss *serverStream) RecvMsg(m any) (err error) { binlog.Log(ss.ctx, chc) } } + // Received no request msg for non-client streaming rpcs. + if !ss.desc.ClientStreams && !ss.recvFirstMsg { + return status.Error(codes.Internal, "cardinality violation: received no request message from non-client-streaming RPC") + } return err } if err == io.ErrUnexpectedEOF { - err = status.Errorf(codes.Internal, io.ErrUnexpectedEOF.Error()) + err = status.Error(codes.Internal, io.ErrUnexpectedEOF.Error()) } return toRPCErr(err) } + ss.recvFirstMsg = true if len(ss.statsHandler) != 0 { for _, sh := range ss.statsHandler { sh.HandleRPC(ss.s.Context(), &stats.InPayload{ - RecvTime: time.Now(), - Payload: m, - // TODO truncate large payload. - Data: payInfo.uncompressedBytes, - Length: len(payInfo.uncompressedBytes), + RecvTime: time.Now(), + Payload: m, + Length: payInfo.uncompressedBytes.Len(), WireLength: payInfo.compressedLength + headerLen, CompressedLength: payInfo.compressedLength, }) @@ -1744,13 +1821,25 @@ func (ss *serverStream) RecvMsg(m any) (err error) { } if len(ss.binlogs) != 0 { cm := &binarylog.ClientMessage{ - Message: payInfo.uncompressedBytes, + Message: payInfo.uncompressedBytes.Materialize(), } for _, binlog := range ss.binlogs { binlog.Log(ss.ctx, cm) } } - return nil + + if ss.desc.ClientStreams { + // Subsequent messages should be received by subsequent RecvMsg calls. + return nil + } + // Special handling for non-client-stream rpcs. + // This recv expects EOF or errors, so we don't collect inPayload. + if err := recv(ss.p, ss.codec, ss.s, ss.decompressorV0, m, ss.maxReceiveMessageSize, nil, ss.decompressorV1, true); err == io.EOF { + return nil + } else if err != nil { + return err + } + return status.Error(codes.Internal, "cardinality violation: received multiple request messages for non-client-streaming RPC") } // MethodFromServerStream returns the method string for the input stream. @@ -1759,23 +1848,26 @@ func MethodFromServerStream(stream ServerStream) (string, bool) { return Method(stream.Context()) } -// prepareMsg returns the hdr, payload and data -// using the compressors passed or using the -// passed preparedmsg -func prepareMsg(m any, codec baseCodec, cp Compressor, comp encoding.Compressor) (hdr, payload, data []byte, err error) { +// prepareMsg returns the hdr, payload and data using the compressors passed or +// using the passed preparedmsg. The returned boolean indicates whether +// compression was made and therefore whether the payload needs to be freed in +// addition to the returned data. Freeing the payload if the returned boolean is +// false can lead to undefined behavior. +func prepareMsg(m any, codec baseCodec, cp Compressor, comp encoding.Compressor, pool mem.BufferPool) (hdr []byte, data, payload mem.BufferSlice, pf payloadFormat, err error) { if preparedMsg, ok := m.(*PreparedMsg); ok { - return preparedMsg.hdr, preparedMsg.payload, preparedMsg.encodedData, nil + return preparedMsg.hdr, preparedMsg.encodedData, preparedMsg.payload, preparedMsg.pf, nil } // The input interface is not a prepared msg. // Marshal and Compress the data at this point data, err = encode(codec, m) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, 0, err } - compData, err := compress(data, cp, comp) + compData, pf, err := compress(data, cp, comp, pool) if err != nil { - return nil, nil, nil, err + data.Free() + return nil, nil, nil, 0, err } - hdr, payload = msgHeader(data, compData) - return hdr, payload, data, nil + hdr, payload = msgHeader(data, compData, pf) + return hdr, data, payload, pf, nil } diff --git a/vendor/google.golang.org/grpc/stream_interfaces.go b/vendor/google.golang.org/grpc/stream_interfaces.go new file mode 100644 index 0000000000..0037fee0bd --- /dev/null +++ b/vendor/google.golang.org/grpc/stream_interfaces.go @@ -0,0 +1,238 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package grpc + +// ServerStreamingClient represents the client side of a server-streaming (one +// request, many responses) RPC. It is generic over the type of the response +// message. It is used in generated code. +type ServerStreamingClient[Res any] interface { + // Recv receives the next response message from the server. The client may + // repeatedly call Recv to read messages from the response stream. If + // io.EOF is returned, the stream has terminated with an OK status. Any + // other error is compatible with the status package and indicates the + // RPC's status code and message. + Recv() (*Res, error) + + // ClientStream is embedded to provide Context, Header, and Trailer + // functionality. No other methods in the ClientStream should be called + // directly. + ClientStream +} + +// ServerStreamingServer represents the server side of a server-streaming (one +// request, many responses) RPC. It is generic over the type of the response +// message. It is used in generated code. +// +// To terminate the response stream, return from the handler method and return +// an error from the status package, or use nil to indicate an OK status code. +type ServerStreamingServer[Res any] interface { + // Send sends a response message to the client. The server handler may + // call Send multiple times to send multiple messages to the client. An + // error is returned if the stream was terminated unexpectedly, and the + // handler method should return, as the stream is no longer usable. + Send(*Res) error + + // ServerStream is embedded to provide Context, SetHeader, SendHeader, and + // SetTrailer functionality. No other methods in the ServerStream should + // be called directly. + ServerStream +} + +// ClientStreamingClient represents the client side of a client-streaming (many +// requests, one response) RPC. It is generic over both the type of the request +// message stream and the type of the unary response message. It is used in +// generated code. +type ClientStreamingClient[Req any, Res any] interface { + // Send sends a request message to the server. The client may call Send + // multiple times to send multiple messages to the server. On error, Send + // aborts the stream. If the error was generated by the client, the status + // is returned directly. Otherwise, io.EOF is returned, and the status of + // the stream may be discovered using CloseAndRecv(). + Send(*Req) error + + // CloseAndRecv closes the request stream and waits for the server's + // response. This method must be called once and only once after sending + // all request messages. Any error returned is implemented by the status + // package. + CloseAndRecv() (*Res, error) + + // ClientStream is embedded to provide Context, Header, and Trailer + // functionality. No other methods in the ClientStream should be called + // directly. + ClientStream +} + +// ClientStreamingServer represents the server side of a client-streaming (many +// requests, one response) RPC. It is generic over both the type of the request +// message stream and the type of the unary response message. It is used in +// generated code. +// +// To terminate the RPC, call SendAndClose and return nil from the method +// handler or do not call SendAndClose and return an error from the status +// package. +type ClientStreamingServer[Req any, Res any] interface { + // Recv receives the next request message from the client. The server may + // repeatedly call Recv to read messages from the request stream. If + // io.EOF is returned, it indicates the client called CloseAndRecv on its + // ClientStreamingClient. Any other error indicates the stream was + // terminated unexpectedly, and the handler method should return, as the + // stream is no longer usable. + Recv() (*Req, error) + + // SendAndClose sends a single response message to the client and closes + // the stream. This method must be called once and only once after all + // request messages have been processed. Recv should not be called after + // calling SendAndClose. + SendAndClose(*Res) error + + // ServerStream is embedded to provide Context, SetHeader, SendHeader, and + // SetTrailer functionality. No other methods in the ServerStream should + // be called directly. + ServerStream +} + +// BidiStreamingClient represents the client side of a bidirectional-streaming +// (many requests, many responses) RPC. It is generic over both the type of the +// request message stream and the type of the response message stream. It is +// used in generated code. +type BidiStreamingClient[Req any, Res any] interface { + // Send sends a request message to the server. The client may call Send + // multiple times to send multiple messages to the server. On error, Send + // aborts the stream. If the error was generated by the client, the status + // is returned directly. Otherwise, io.EOF is returned, and the status of + // the stream may be discovered using Recv(). + Send(*Req) error + + // Recv receives the next response message from the server. The client may + // repeatedly call Recv to read messages from the response stream. If + // io.EOF is returned, the stream has terminated with an OK status. Any + // other error is compatible with the status package and indicates the + // RPC's status code and message. + Recv() (*Res, error) + + // ClientStream is embedded to provide Context, Header, Trailer, and + // CloseSend functionality. No other methods in the ClientStream should be + // called directly. + ClientStream +} + +// BidiStreamingServer represents the server side of a bidirectional-streaming +// (many requests, many responses) RPC. It is generic over both the type of the +// request message stream and the type of the response message stream. It is +// used in generated code. +// +// To terminate the stream, return from the handler method and return +// an error from the status package, or use nil to indicate an OK status code. +type BidiStreamingServer[Req any, Res any] interface { + // Recv receives the next request message from the client. The server may + // repeatedly call Recv to read messages from the request stream. If + // io.EOF is returned, it indicates the client called CloseSend on its + // BidiStreamingClient. Any other error indicates the stream was + // terminated unexpectedly, and the handler method should return, as the + // stream is no longer usable. + Recv() (*Req, error) + + // Send sends a response message to the client. The server handler may + // call Send multiple times to send multiple messages to the client. An + // error is returned if the stream was terminated unexpectedly, and the + // handler method should return, as the stream is no longer usable. + Send(*Res) error + + // ServerStream is embedded to provide Context, SetHeader, SendHeader, and + // SetTrailer functionality. No other methods in the ServerStream should + // be called directly. + ServerStream +} + +// GenericClientStream implements the ServerStreamingClient, ClientStreamingClient, +// and BidiStreamingClient interfaces. It is used in generated code. +type GenericClientStream[Req any, Res any] struct { + ClientStream +} + +var _ ServerStreamingClient[string] = (*GenericClientStream[int, string])(nil) +var _ ClientStreamingClient[int, string] = (*GenericClientStream[int, string])(nil) +var _ BidiStreamingClient[int, string] = (*GenericClientStream[int, string])(nil) + +// Send pushes one message into the stream of requests to be consumed by the +// server. The type of message which can be sent is determined by the Req type +// parameter of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) Send(m *Req) error { + return x.ClientStream.SendMsg(m) +} + +// Recv reads one message from the stream of responses generated by the server. +// The type of the message returned is determined by the Res type parameter +// of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) Recv() (*Res, error) { + m := new(Res) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// CloseAndRecv closes the sending side of the stream, then receives the unary +// response from the server. The type of message which it returns is determined +// by the Res type parameter of the GenericClientStream receiver. +func (x *GenericClientStream[Req, Res]) CloseAndRecv() (*Res, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(Res) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// GenericServerStream implements the ServerStreamingServer, ClientStreamingServer, +// and BidiStreamingServer interfaces. It is used in generated code. +type GenericServerStream[Req any, Res any] struct { + ServerStream +} + +var _ ServerStreamingServer[string] = (*GenericServerStream[int, string])(nil) +var _ ClientStreamingServer[int, string] = (*GenericServerStream[int, string])(nil) +var _ BidiStreamingServer[int, string] = (*GenericServerStream[int, string])(nil) + +// Send pushes one message into the stream of responses to be consumed by the +// client. The type of message which can be sent is determined by the Res +// type parameter of the serverStreamServer receiver. +func (x *GenericServerStream[Req, Res]) Send(m *Res) error { + return x.ServerStream.SendMsg(m) +} + +// SendAndClose pushes the unary response to the client. The type of message +// which can be sent is determined by the Res type parameter of the +// clientStreamServer receiver. +func (x *GenericServerStream[Req, Res]) SendAndClose(m *Res) error { + return x.ServerStream.SendMsg(m) +} + +// Recv reads one message from the stream of requests generated by the client. +// The type of the message returned is determined by the Req type parameter +// of the clientStreamServer receiver. +func (x *GenericServerStream[Req, Res]) Recv() (*Req, error) { + m := new(Req) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 2556f75838..76f2e0d060 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.63.2" +const Version = "1.76.0" diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh deleted file mode 100644 index 7e6b92e491..0000000000 --- a/vendor/google.golang.org/grpc/vet.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash - -set -ex # Exit on error; debugging enabled. -set -o pipefail # Fail a pipe if any sub-command fails. - -# not makes sure the command passed to it does not exit with a return code of 0. -not() { - # This is required instead of the earlier (! $COMMAND) because subshells and - # pipefail don't work the same on Darwin as in Linux. - ! "$@" -} - -die() { - echo "$@" >&2 - exit 1 -} - -fail_on_output() { - tee /dev/stderr | not read -} - -# Check to make sure it's safe to modify the user's git repo. -git status --porcelain | fail_on_output - -# Undo any edits made by this script. -cleanup() { - git reset --hard HEAD -} -trap cleanup EXIT - -PATH="${HOME}/go/bin:${GOROOT}/bin:${PATH}" -go version - -if [[ "$1" = "-install" ]]; then - # Install the pinned versions as defined in module tools. - pushd ./test/tools - go install \ - golang.org/x/tools/cmd/goimports \ - honnef.co/go/tools/cmd/staticcheck \ - github.com/client9/misspell/cmd/misspell - popd - if [[ -z "${VET_SKIP_PROTO}" ]]; then - if [[ "${GITHUB_ACTIONS}" = "true" ]]; then - PROTOBUF_VERSION=25.2 # a.k.a. v4.22.0 in pb.go files. - PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip - pushd /home/runner/go - wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} - unzip ${PROTOC_FILENAME} - bin/protoc --version - popd - elif not which protoc > /dev/null; then - die "Please install protoc into your path" - fi - fi - exit 0 -elif [[ "$#" -ne 0 ]]; then - die "Unknown argument(s): $*" -fi - -# - Check that generated proto files are up to date. -if [[ -z "${VET_SKIP_PROTO}" ]]; then - make proto && git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) -fi - -if [[ -n "${VET_ONLY_PROTO}" ]]; then - exit 0 -fi - -# - Ensure all source files contain a copyright message. -# (Done in two parts because Darwin "git grep" has broken support for compound -# exclusion matches.) -(grep -L "DO NOT EDIT" $(git grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)" -- '*.go') || true) | fail_on_output - -# - Make sure all tests in grpc and grpc/test use leakcheck via Teardown. -not grep 'func Test[^(]' *_test.go -not grep 'func Test[^(]' test/*.go - -# - Check for typos in test function names -git grep 'func (s) ' -- "*_test.go" | not grep -v 'func (s) Test' -git grep 'func [A-Z]' -- "*_test.go" | not grep -v 'func Test\|Benchmark\|Example' - -# - Do not import x/net/context. -not git grep -l 'x/net/context' -- "*.go" - -# - Do not use time.After except in tests. It has the potential to leak the -# timer since there is no way to stop it early. -git grep -l 'time.After(' -- "*.go" | not grep -v '_test.go\|test_utils\|testutils' - -# - Do not import math/rand for real library code. Use internal/grpcrand for -# thread safety. -git grep -l '"math/rand"' -- "*.go" 2>&1 | not grep -v '^examples\|^interop/stress\|grpcrand\|^benchmark\|wrr_test' - -# - Do not use "interface{}"; use "any" instead. -git grep -l 'interface{}' -- "*.go" 2>&1 | not grep -v '\.pb\.go\|protoc-gen-go-grpc\|grpc_testing_not_regenerate' - -# - Do not call grpclog directly. Use grpclog.Component instead. -git grep -l -e 'grpclog.I' --or -e 'grpclog.W' --or -e 'grpclog.E' --or -e 'grpclog.F' --or -e 'grpclog.V' -- "*.go" | not grep -v '^grpclog/component.go\|^internal/grpctest/tlogger_test.go' - -# - Ensure all ptypes proto packages are renamed when importing. -not git grep "\(import \|^\s*\)\"github.com/golang/protobuf/ptypes/" -- "*.go" - -# - Ensure all usages of grpc_testing package are renamed when importing. -not git grep "\(import \|^\s*\)\"google.golang.org/grpc/interop/grpc_testing" -- "*.go" - -# - Ensure all xds proto imports are renamed to *pb or *grpc. -git grep '"github.com/envoyproxy/go-control-plane/envoy' -- '*.go' ':(exclude)*.pb.go' | not grep -v 'pb "\|grpc "' - -misspell -error . - -# - gofmt, goimports, go vet, go mod tidy. -# Perform these checks on each module inside gRPC. -for MOD_FILE in $(find . -name 'go.mod'); do - MOD_DIR=$(dirname ${MOD_FILE}) - pushd ${MOD_DIR} - go vet -all ./... | fail_on_output - gofmt -s -d -l . 2>&1 | fail_on_output - goimports -l . 2>&1 | not grep -vE "\.pb\.go" - - go mod tidy -compat=1.19 - git status --porcelain 2>&1 | fail_on_output || \ - (git status; git --no-pager diff; exit 1) - popd -done - -# - Collection of static analysis checks -SC_OUT="$(mktemp)" -staticcheck -go 1.19 -checks 'all' ./... > "${SC_OUT}" || true - -# Error for anything other than checks that need exclusions. -grep -v "(ST1000)" "${SC_OUT}" | grep -v "(SA1019)" | grep -v "(ST1003)" | not grep -v "(ST1019)\|\(other import of\)" - -# Exclude underscore checks for generated code. -grep "(ST1003)" "${SC_OUT}" | not grep -v '\(.pb.go:\)\|\(code_string_test.go:\)\|\(grpc_testing_not_regenerate\)' - -# Error for duplicate imports not including grpc protos. -grep "(ST1019)\|\(other import of\)" "${SC_OUT}" | not grep -Fv 'XXXXX PleaseIgnoreUnused -channelz/grpc_channelz_v1" -go-control-plane/envoy -grpclb/grpc_lb_v1" -health/grpc_health_v1" -interop/grpc_testing" -orca/v3" -proto/grpc_gcp" -proto/grpc_lookup_v1" -reflection/grpc_reflection_v1" -reflection/grpc_reflection_v1alpha" -XXXXX PleaseIgnoreUnused' - -# Error for any package comments not in generated code. -grep "(ST1000)" "${SC_OUT}" | not grep -v "\.pb\.go:" - -# Only ignore the following deprecated types/fields/functions and exclude -# generated code. -grep "(SA1019)" "${SC_OUT}" | not grep -Fv 'XXXXX PleaseIgnoreUnused -XXXXX Protobuf related deprecation errors: -"github.com/golang/protobuf -.pb.go: -grpc_testing_not_regenerate -: ptypes. -proto.RegisterType -XXXXX gRPC internal usage deprecation errors: -"google.golang.org/grpc -: grpc. -: v1alpha. -: v1alphareflectionpb. -BalancerAttributes is deprecated: -CredsBundle is deprecated: -Metadata is deprecated: use Attributes instead. -NewSubConn is deprecated: -OverrideServerName is deprecated: -RemoveSubConn is deprecated: -SecurityVersion is deprecated: -Target is deprecated: Use the Target field in the BuildOptions instead. -UpdateAddresses is deprecated: -UpdateSubConnState is deprecated: -balancer.ErrTransientFailure is deprecated: -grpc/reflection/v1alpha/reflection.proto -SwitchTo is deprecated: -XXXXX xDS deprecated fields we support -.ExactMatch -.PrefixMatch -.SafeRegexMatch -.SuffixMatch -GetContainsMatch -GetExactMatch -GetMatchSubjectAltNames -GetPrefixMatch -GetSafeRegexMatch -GetSuffixMatch -GetTlsCertificateCertificateProviderInstance -GetValidationContextCertificateProviderInstance -XXXXX PleaseIgnoreUnused' - -echo SUCCESS diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 688aabe434..dbcf90b871 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -72,9 +72,10 @@ type ( EditionFeatures EditionFeatures } FileL2 struct { - Options func() protoreflect.ProtoMessage - Imports FileImports - Locations SourceLocations + Options func() protoreflect.ProtoMessage + Imports FileImports + OptionImports func() protoreflect.FileImports + Locations SourceLocations } // EditionFeatures is a frequently-instantiated struct, so please take care @@ -126,12 +127,9 @@ func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } func (fd *File) Parent() protoreflect.Descriptor { return nil } func (fd *File) Index() int { return 0 } func (fd *File) Syntax() protoreflect.Syntax { return fd.L1.Syntax } - -// Not exported and just used to reconstruct the original FileDescriptor proto -func (fd *File) Edition() int32 { return int32(fd.L1.Edition) } -func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } -func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } -func (fd *File) IsPlaceholder() bool { return false } +func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } +func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } +func (fd *File) IsPlaceholder() bool { return false } func (fd *File) Options() protoreflect.ProtoMessage { if f := fd.lazyInit().Options; f != nil { return f() @@ -150,6 +148,16 @@ func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatD func (fd *File) ProtoType(protoreflect.FileDescriptor) {} func (fd *File) ProtoInternal(pragma.DoNotImplement) {} +// The next two are not part of the FileDescriptor interface. They are just used to reconstruct +// the original FileDescriptor proto. +func (fd *File) Edition() int32 { return int32(fd.L1.Edition) } +func (fd *File) OptionImports() protoreflect.FileImports { + if f := fd.lazyInit().OptionImports; f != nil { + return f() + } + return emptyFiles +} + func (fd *File) lazyInit() *FileL2 { if atomic.LoadUint32(&fd.once) == 0 { fd.lazyInitOnce() @@ -182,9 +190,9 @@ type ( L2 *EnumL2 // protected by fileDesc.once } EnumL1 struct { - eagerValues bool // controls whether EnumL2.Values is already populated - EditionFeatures EditionFeatures + Visibility int32 + eagerValues bool // controls whether EnumL2.Values is already populated } EnumL2 struct { Options func() protoreflect.ProtoMessage @@ -219,6 +227,11 @@ func (ed *Enum) ReservedNames() protoreflect.Names { return &ed.lazyInit() func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges } func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } func (ed *Enum) ProtoType(protoreflect.EnumDescriptor) {} + +// This is not part of the EnumDescriptor interface. It is just used to reconstruct +// the original FileDescriptor proto. +func (ed *Enum) Visibility() int32 { return ed.L1.Visibility } + func (ed *Enum) lazyInit() *EnumL2 { ed.L0.ParentFile.lazyInit() // implicitly initializes L2 return ed.L2 @@ -244,13 +257,13 @@ type ( L2 *MessageL2 // protected by fileDesc.once } MessageL1 struct { - Enums Enums - Messages Messages - Extensions Extensions - IsMapEntry bool // promoted from google.protobuf.MessageOptions - IsMessageSet bool // promoted from google.protobuf.MessageOptions - + Enums Enums + Messages Messages + Extensions Extensions EditionFeatures EditionFeatures + Visibility int32 + IsMapEntry bool // promoted from google.protobuf.MessageOptions + IsMessageSet bool // promoted from google.protobuf.MessageOptions } MessageL2 struct { Options func() protoreflect.ProtoMessage @@ -319,6 +332,11 @@ func (md *Message) Messages() protoreflect.MessageDescriptors { return &md.L func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions } func (md *Message) ProtoType(protoreflect.MessageDescriptor) {} func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } + +// This is not part of the MessageDescriptor interface. It is just used to reconstruct +// the original FileDescriptor proto. +func (md *Message) Visibility() int32 { return md.L1.Visibility } + func (md *Message) lazyInit() *MessageL2 { md.L0.ParentFile.lazyInit() // implicitly initializes L2 return md.L2 diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go index d2f549497e..e91860f5a2 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go @@ -284,6 +284,13 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protorefl case genid.EnumDescriptorProto_Value_field_number: numValues++ } + case protowire.VarintType: + v, m := protowire.ConsumeVarint(b) + b = b[m:] + switch num { + case genid.EnumDescriptorProto_Visibility_field_number: + ed.L1.Visibility = int32(v) + } default: m := protowire.ConsumeFieldValue(num, typ, b) b = b[m:] @@ -365,6 +372,13 @@ func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protor md.unmarshalSeedOptions(v) } prevField = num + case protowire.VarintType: + v, m := protowire.ConsumeVarint(b) + b = b[m:] + switch num { + case genid.DescriptorProto_Visibility_field_number: + md.L1.Visibility = int32(v) + } default: m := protowire.ConsumeFieldValue(num, typ, b) b = b[m:] diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go index d4c94458bd..dd31faaeb0 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go @@ -134,6 +134,7 @@ func (fd *File) unmarshalFull(b []byte) { var enumIdx, messageIdx, extensionIdx, serviceIdx int var rawOptions []byte + var optionImports []string fd.L2 = new(FileL2) for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) @@ -157,6 +158,8 @@ func (fd *File) unmarshalFull(b []byte) { imp = PlaceholderFile(path) } fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp}) + case genid.FileDescriptorProto_OptionDependency_field_number: + optionImports = append(optionImports, sb.MakeString(v)) case genid.FileDescriptorProto_EnumType_field_number: fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) enumIdx++ @@ -178,6 +181,23 @@ func (fd *File) unmarshalFull(b []byte) { } } fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions) + if len(optionImports) > 0 { + var imps FileImports + var once sync.Once + fd.L2.OptionImports = func() protoreflect.FileImports { + once.Do(func() { + imps = make(FileImports, len(optionImports)) + for i, path := range optionImports { + imp, _ := fd.builder.FileRegistry.FindFileByPath(path) + if imp == nil { + imp = PlaceholderFile(path) + } + imps[i] = protoreflect.FileImport{FileDescriptor: imp} + } + }) + return &imps + } + } } func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 31e79a6535..77de0f238c 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -52,7 +52,7 @@ import ( const ( Major = 1 Minor = 36 - Patch = 9 + Patch = 10 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go index 823dbf3ba6..9196288e4a 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go @@ -152,6 +152,28 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot imp := &f.L2.Imports[i] imps.importPublic(imp.Imports()) } + if len(fd.GetOptionDependency()) > 0 { + optionImports := make(filedesc.FileImports, len(fd.GetOptionDependency())) + for i, path := range fd.GetOptionDependency() { + imp := &optionImports[i] + f, err := r.FindFileByPath(path) + if err == protoregistry.NotFound { + // We always allow option imports to be unresolvable. + f = filedesc.PlaceholderFile(path) + } else if err != nil { + return nil, errors.New("could not resolve import %q: %v", path, err) + } + imp.FileDescriptor = f + + if imps[imp.Path()] { + return nil, errors.New("already imported %q", path) + } + imps[imp.Path()] = true + } + f.L2.OptionImports = func() protoreflect.FileImports { + return &optionImports + } + } // Handle source locations. f.L2.Locations.File = f diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go index 9da34998b1..c826ad0430 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go @@ -29,6 +29,7 @@ func (r descsByName) initEnumDeclarations(eds []*descriptorpb.EnumDescriptorProt e.L2.Options = func() protoreflect.ProtoMessage { return opts } } e.L1.EditionFeatures = mergeEditionFeatures(parent, ed.GetOptions().GetFeatures()) + e.L1.Visibility = int32(ed.GetVisibility()) for _, s := range ed.GetReservedName() { e.L2.ReservedNames.List = append(e.L2.ReservedNames.List, protoreflect.Name(s)) } @@ -70,6 +71,7 @@ func (r descsByName) initMessagesDeclarations(mds []*descriptorpb.DescriptorProt return nil, err } m.L1.EditionFeatures = mergeEditionFeatures(parent, md.GetOptions().GetFeatures()) + m.L1.Visibility = int32(md.GetVisibility()) if opts := md.GetOptions(); opts != nil { opts = proto.Clone(opts).(*descriptorpb.MessageOptions) m.L2.Options = func() protoreflect.ProtoMessage { return opts } diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go index 9b880aa8c9..6f91074e36 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go @@ -70,16 +70,27 @@ func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileD if syntax := file.Syntax(); syntax != protoreflect.Proto2 && syntax.IsValid() { p.Syntax = proto.String(file.Syntax().String()) } + desc := file + if fileImportDesc, ok := file.(protoreflect.FileImport); ok { + desc = fileImportDesc.FileDescriptor + } if file.Syntax() == protoreflect.Editions { - desc := file - if fileImportDesc, ok := file.(protoreflect.FileImport); ok { - desc = fileImportDesc.FileDescriptor - } - if editionsInterface, ok := desc.(interface{ Edition() int32 }); ok { p.Edition = descriptorpb.Edition(editionsInterface.Edition()).Enum() } } + type hasOptionImports interface { + OptionImports() protoreflect.FileImports + } + if opts, ok := desc.(hasOptionImports); ok { + if optionImports := opts.OptionImports(); optionImports.Len() > 0 { + optionDeps := make([]string, optionImports.Len()) + for i := range optionImports.Len() { + optionDeps[i] = optionImports.Get(i).Path() + } + p.OptionDependency = optionDeps + } + } return p } @@ -123,6 +134,14 @@ func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.Des for i, names := 0, message.ReservedNames(); i < names.Len(); i++ { p.ReservedName = append(p.ReservedName, string(names.Get(i))) } + type hasVisibility interface { + Visibility() int32 + } + if vis, ok := message.(hasVisibility); ok { + if visibility := vis.Visibility(); visibility > 0 { + p.Visibility = descriptorpb.SymbolVisibility(visibility).Enum() + } + } return p } @@ -216,6 +235,14 @@ func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumD for i, names := 0, enum.ReservedNames(); i < names.Len(); i++ { p.ReservedName = append(p.ReservedName, string(names.Get(i))) } + type hasVisibility interface { + Visibility() int32 + } + if vis, ok := enum.(hasVisibility); ok { + if visibility := vis.Visibility(); visibility > 0 { + p.Visibility = descriptorpb.SymbolVisibility(visibility).Enum() + } + } return p } diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go index 261ae41bd0..bf1ae59488 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go @@ -25,6 +25,7 @@ import ( io "io" proto "github.com/gogo/protobuf/proto" + k8s_io_api_admissionregistration_v1 "k8s.io/api/admissionregistration/v1" v11 "k8s.io/api/admissionregistration/v1" k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -46,10 +47,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +func (m *ApplyConfiguration) Reset() { *m = ApplyConfiguration{} } +func (*ApplyConfiguration) ProtoMessage() {} +func (*ApplyConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{0} +} +func (m *ApplyConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplyConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ApplyConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyConfiguration.Merge(m, src) +} +func (m *ApplyConfiguration) XXX_Size() int { + return m.Size() +} +func (m *ApplyConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplyConfiguration proto.InternalMessageInfo + func (m *AuditAnnotation) Reset() { *m = AuditAnnotation{} } func (*AuditAnnotation) ProtoMessage() {} func (*AuditAnnotation) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{0} + return fileDescriptor_7f7c65a4f012fb19, []int{1} } func (m *AuditAnnotation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -77,7 +106,7 @@ var xxx_messageInfo_AuditAnnotation proto.InternalMessageInfo func (m *ExpressionWarning) Reset() { *m = ExpressionWarning{} } func (*ExpressionWarning) ProtoMessage() {} func (*ExpressionWarning) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{1} + return fileDescriptor_7f7c65a4f012fb19, []int{2} } func (m *ExpressionWarning) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,10 +131,38 @@ func (m *ExpressionWarning) XXX_DiscardUnknown() { var xxx_messageInfo_ExpressionWarning proto.InternalMessageInfo +func (m *JSONPatch) Reset() { *m = JSONPatch{} } +func (*JSONPatch) ProtoMessage() {} +func (*JSONPatch) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{3} +} +func (m *JSONPatch) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *JSONPatch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *JSONPatch) XXX_Merge(src proto.Message) { + xxx_messageInfo_JSONPatch.Merge(m, src) +} +func (m *JSONPatch) XXX_Size() int { + return m.Size() +} +func (m *JSONPatch) XXX_DiscardUnknown() { + xxx_messageInfo_JSONPatch.DiscardUnknown(m) +} + +var xxx_messageInfo_JSONPatch proto.InternalMessageInfo + func (m *MatchCondition) Reset() { *m = MatchCondition{} } func (*MatchCondition) ProtoMessage() {} func (*MatchCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{2} + return fileDescriptor_7f7c65a4f012fb19, []int{4} } func (m *MatchCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -133,7 +190,7 @@ var xxx_messageInfo_MatchCondition proto.InternalMessageInfo func (m *MatchResources) Reset() { *m = MatchResources{} } func (*MatchResources) ProtoMessage() {} func (*MatchResources) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{3} + return fileDescriptor_7f7c65a4f012fb19, []int{5} } func (m *MatchResources) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,10 +215,178 @@ func (m *MatchResources) XXX_DiscardUnknown() { var xxx_messageInfo_MatchResources proto.InternalMessageInfo +func (m *MutatingAdmissionPolicy) Reset() { *m = MutatingAdmissionPolicy{} } +func (*MutatingAdmissionPolicy) ProtoMessage() {} +func (*MutatingAdmissionPolicy) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{6} +} +func (m *MutatingAdmissionPolicy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicy) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicy.Merge(m, src) +} +func (m *MutatingAdmissionPolicy) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicy) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicy.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicy proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyBinding) Reset() { *m = MutatingAdmissionPolicyBinding{} } +func (*MutatingAdmissionPolicyBinding) ProtoMessage() {} +func (*MutatingAdmissionPolicyBinding) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{7} +} +func (m *MutatingAdmissionPolicyBinding) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyBinding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyBinding) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyBinding.Merge(m, src) +} +func (m *MutatingAdmissionPolicyBinding) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyBinding) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyBinding.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyBinding proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyBindingList) Reset() { *m = MutatingAdmissionPolicyBindingList{} } +func (*MutatingAdmissionPolicyBindingList) ProtoMessage() {} +func (*MutatingAdmissionPolicyBindingList) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{8} +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyBindingList.Merge(m, src) +} +func (m *MutatingAdmissionPolicyBindingList) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyBindingList) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyBindingList.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyBindingList proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyBindingSpec) Reset() { *m = MutatingAdmissionPolicyBindingSpec{} } +func (*MutatingAdmissionPolicyBindingSpec) ProtoMessage() {} +func (*MutatingAdmissionPolicyBindingSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{9} +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyBindingSpec.Merge(m, src) +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyBindingSpec) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyBindingSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyBindingSpec proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicyList) Reset() { *m = MutatingAdmissionPolicyList{} } +func (*MutatingAdmissionPolicyList) ProtoMessage() {} +func (*MutatingAdmissionPolicyList) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{10} +} +func (m *MutatingAdmissionPolicyList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicyList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicyList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicyList.Merge(m, src) +} +func (m *MutatingAdmissionPolicyList) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicyList) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicyList.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicyList proto.InternalMessageInfo + +func (m *MutatingAdmissionPolicySpec) Reset() { *m = MutatingAdmissionPolicySpec{} } +func (*MutatingAdmissionPolicySpec) ProtoMessage() {} +func (*MutatingAdmissionPolicySpec) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{11} +} +func (m *MutatingAdmissionPolicySpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MutatingAdmissionPolicySpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *MutatingAdmissionPolicySpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_MutatingAdmissionPolicySpec.Merge(m, src) +} +func (m *MutatingAdmissionPolicySpec) XXX_Size() int { + return m.Size() +} +func (m *MutatingAdmissionPolicySpec) XXX_DiscardUnknown() { + xxx_messageInfo_MutatingAdmissionPolicySpec.DiscardUnknown(m) +} + +var xxx_messageInfo_MutatingAdmissionPolicySpec proto.InternalMessageInfo + func (m *MutatingWebhook) Reset() { *m = MutatingWebhook{} } func (*MutatingWebhook) ProtoMessage() {} func (*MutatingWebhook) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{4} + return fileDescriptor_7f7c65a4f012fb19, []int{12} } func (m *MutatingWebhook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -189,7 +414,7 @@ var xxx_messageInfo_MutatingWebhook proto.InternalMessageInfo func (m *MutatingWebhookConfiguration) Reset() { *m = MutatingWebhookConfiguration{} } func (*MutatingWebhookConfiguration) ProtoMessage() {} func (*MutatingWebhookConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{5} + return fileDescriptor_7f7c65a4f012fb19, []int{13} } func (m *MutatingWebhookConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -217,7 +442,7 @@ var xxx_messageInfo_MutatingWebhookConfiguration proto.InternalMessageInfo func (m *MutatingWebhookConfigurationList) Reset() { *m = MutatingWebhookConfigurationList{} } func (*MutatingWebhookConfigurationList) ProtoMessage() {} func (*MutatingWebhookConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{6} + return fileDescriptor_7f7c65a4f012fb19, []int{14} } func (m *MutatingWebhookConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,10 +467,38 @@ func (m *MutatingWebhookConfigurationList) XXX_DiscardUnknown() { var xxx_messageInfo_MutatingWebhookConfigurationList proto.InternalMessageInfo +func (m *Mutation) Reset() { *m = Mutation{} } +func (*Mutation) ProtoMessage() {} +func (*Mutation) Descriptor() ([]byte, []int) { + return fileDescriptor_7f7c65a4f012fb19, []int{15} +} +func (m *Mutation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Mutation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Mutation) XXX_Merge(src proto.Message) { + xxx_messageInfo_Mutation.Merge(m, src) +} +func (m *Mutation) XXX_Size() int { + return m.Size() +} +func (m *Mutation) XXX_DiscardUnknown() { + xxx_messageInfo_Mutation.DiscardUnknown(m) +} + +var xxx_messageInfo_Mutation proto.InternalMessageInfo + func (m *NamedRuleWithOperations) Reset() { *m = NamedRuleWithOperations{} } func (*NamedRuleWithOperations) ProtoMessage() {} func (*NamedRuleWithOperations) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{7} + return fileDescriptor_7f7c65a4f012fb19, []int{16} } func (m *NamedRuleWithOperations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -273,7 +526,7 @@ var xxx_messageInfo_NamedRuleWithOperations proto.InternalMessageInfo func (m *ParamKind) Reset() { *m = ParamKind{} } func (*ParamKind) ProtoMessage() {} func (*ParamKind) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{8} + return fileDescriptor_7f7c65a4f012fb19, []int{17} } func (m *ParamKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,7 +554,7 @@ var xxx_messageInfo_ParamKind proto.InternalMessageInfo func (m *ParamRef) Reset() { *m = ParamRef{} } func (*ParamRef) ProtoMessage() {} func (*ParamRef) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{9} + return fileDescriptor_7f7c65a4f012fb19, []int{18} } func (m *ParamRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -329,7 +582,7 @@ var xxx_messageInfo_ParamRef proto.InternalMessageInfo func (m *ServiceReference) Reset() { *m = ServiceReference{} } func (*ServiceReference) ProtoMessage() {} func (*ServiceReference) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{10} + return fileDescriptor_7f7c65a4f012fb19, []int{19} } func (m *ServiceReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -357,7 +610,7 @@ var xxx_messageInfo_ServiceReference proto.InternalMessageInfo func (m *TypeChecking) Reset() { *m = TypeChecking{} } func (*TypeChecking) ProtoMessage() {} func (*TypeChecking) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{11} + return fileDescriptor_7f7c65a4f012fb19, []int{20} } func (m *TypeChecking) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -385,7 +638,7 @@ var xxx_messageInfo_TypeChecking proto.InternalMessageInfo func (m *ValidatingAdmissionPolicy) Reset() { *m = ValidatingAdmissionPolicy{} } func (*ValidatingAdmissionPolicy) ProtoMessage() {} func (*ValidatingAdmissionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{12} + return fileDescriptor_7f7c65a4f012fb19, []int{21} } func (m *ValidatingAdmissionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +666,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicy proto.InternalMessageInfo func (m *ValidatingAdmissionPolicyBinding) Reset() { *m = ValidatingAdmissionPolicyBinding{} } func (*ValidatingAdmissionPolicyBinding) ProtoMessage() {} func (*ValidatingAdmissionPolicyBinding) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{13} + return fileDescriptor_7f7c65a4f012fb19, []int{22} } func (m *ValidatingAdmissionPolicyBinding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -441,7 +694,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyBinding proto.InternalMessageInfo func (m *ValidatingAdmissionPolicyBindingList) Reset() { *m = ValidatingAdmissionPolicyBindingList{} } func (*ValidatingAdmissionPolicyBindingList) ProtoMessage() {} func (*ValidatingAdmissionPolicyBindingList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{14} + return fileDescriptor_7f7c65a4f012fb19, []int{23} } func (m *ValidatingAdmissionPolicyBindingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -469,7 +722,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyBindingList proto.InternalMessageIn func (m *ValidatingAdmissionPolicyBindingSpec) Reset() { *m = ValidatingAdmissionPolicyBindingSpec{} } func (*ValidatingAdmissionPolicyBindingSpec) ProtoMessage() {} func (*ValidatingAdmissionPolicyBindingSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{15} + return fileDescriptor_7f7c65a4f012fb19, []int{24} } func (m *ValidatingAdmissionPolicyBindingSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -497,7 +750,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyBindingSpec proto.InternalMessageIn func (m *ValidatingAdmissionPolicyList) Reset() { *m = ValidatingAdmissionPolicyList{} } func (*ValidatingAdmissionPolicyList) ProtoMessage() {} func (*ValidatingAdmissionPolicyList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{16} + return fileDescriptor_7f7c65a4f012fb19, []int{25} } func (m *ValidatingAdmissionPolicyList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -525,7 +778,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyList proto.InternalMessageInfo func (m *ValidatingAdmissionPolicySpec) Reset() { *m = ValidatingAdmissionPolicySpec{} } func (*ValidatingAdmissionPolicySpec) ProtoMessage() {} func (*ValidatingAdmissionPolicySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{17} + return fileDescriptor_7f7c65a4f012fb19, []int{26} } func (m *ValidatingAdmissionPolicySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -553,7 +806,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicySpec proto.InternalMessageInfo func (m *ValidatingAdmissionPolicyStatus) Reset() { *m = ValidatingAdmissionPolicyStatus{} } func (*ValidatingAdmissionPolicyStatus) ProtoMessage() {} func (*ValidatingAdmissionPolicyStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{18} + return fileDescriptor_7f7c65a4f012fb19, []int{27} } func (m *ValidatingAdmissionPolicyStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -581,7 +834,7 @@ var xxx_messageInfo_ValidatingAdmissionPolicyStatus proto.InternalMessageInfo func (m *ValidatingWebhook) Reset() { *m = ValidatingWebhook{} } func (*ValidatingWebhook) ProtoMessage() {} func (*ValidatingWebhook) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{19} + return fileDescriptor_7f7c65a4f012fb19, []int{28} } func (m *ValidatingWebhook) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -609,7 +862,7 @@ var xxx_messageInfo_ValidatingWebhook proto.InternalMessageInfo func (m *ValidatingWebhookConfiguration) Reset() { *m = ValidatingWebhookConfiguration{} } func (*ValidatingWebhookConfiguration) ProtoMessage() {} func (*ValidatingWebhookConfiguration) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{20} + return fileDescriptor_7f7c65a4f012fb19, []int{29} } func (m *ValidatingWebhookConfiguration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -637,7 +890,7 @@ var xxx_messageInfo_ValidatingWebhookConfiguration proto.InternalMessageInfo func (m *ValidatingWebhookConfigurationList) Reset() { *m = ValidatingWebhookConfigurationList{} } func (*ValidatingWebhookConfigurationList) ProtoMessage() {} func (*ValidatingWebhookConfigurationList) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{21} + return fileDescriptor_7f7c65a4f012fb19, []int{30} } func (m *ValidatingWebhookConfigurationList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -665,7 +918,7 @@ var xxx_messageInfo_ValidatingWebhookConfigurationList proto.InternalMessageInfo func (m *Validation) Reset() { *m = Validation{} } func (*Validation) ProtoMessage() {} func (*Validation) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{22} + return fileDescriptor_7f7c65a4f012fb19, []int{31} } func (m *Validation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -693,7 +946,7 @@ var xxx_messageInfo_Validation proto.InternalMessageInfo func (m *Variable) Reset() { *m = Variable{} } func (*Variable) ProtoMessage() {} func (*Variable) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{23} + return fileDescriptor_7f7c65a4f012fb19, []int{32} } func (m *Variable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -721,7 +974,7 @@ var xxx_messageInfo_Variable proto.InternalMessageInfo func (m *WebhookClientConfig) Reset() { *m = WebhookClientConfig{} } func (*WebhookClientConfig) ProtoMessage() {} func (*WebhookClientConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_7f7c65a4f012fb19, []int{24} + return fileDescriptor_7f7c65a4f012fb19, []int{33} } func (m *WebhookClientConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -747,13 +1000,22 @@ func (m *WebhookClientConfig) XXX_DiscardUnknown() { var xxx_messageInfo_WebhookClientConfig proto.InternalMessageInfo func init() { + proto.RegisterType((*ApplyConfiguration)(nil), "k8s.io.api.admissionregistration.v1beta1.ApplyConfiguration") proto.RegisterType((*AuditAnnotation)(nil), "k8s.io.api.admissionregistration.v1beta1.AuditAnnotation") proto.RegisterType((*ExpressionWarning)(nil), "k8s.io.api.admissionregistration.v1beta1.ExpressionWarning") + proto.RegisterType((*JSONPatch)(nil), "k8s.io.api.admissionregistration.v1beta1.JSONPatch") proto.RegisterType((*MatchCondition)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchCondition") proto.RegisterType((*MatchResources)(nil), "k8s.io.api.admissionregistration.v1beta1.MatchResources") + proto.RegisterType((*MutatingAdmissionPolicy)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicy") + proto.RegisterType((*MutatingAdmissionPolicyBinding)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyBinding") + proto.RegisterType((*MutatingAdmissionPolicyBindingList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyBindingList") + proto.RegisterType((*MutatingAdmissionPolicyBindingSpec)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyBindingSpec") + proto.RegisterType((*MutatingAdmissionPolicyList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicyList") + proto.RegisterType((*MutatingAdmissionPolicySpec)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingAdmissionPolicySpec") proto.RegisterType((*MutatingWebhook)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhook") proto.RegisterType((*MutatingWebhookConfiguration)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhookConfiguration") proto.RegisterType((*MutatingWebhookConfigurationList)(nil), "k8s.io.api.admissionregistration.v1beta1.MutatingWebhookConfigurationList") + proto.RegisterType((*Mutation)(nil), "k8s.io.api.admissionregistration.v1beta1.Mutation") proto.RegisterType((*NamedRuleWithOperations)(nil), "k8s.io.api.admissionregistration.v1beta1.NamedRuleWithOperations") proto.RegisterType((*ParamKind)(nil), "k8s.io.api.admissionregistration.v1beta1.ParamKind") proto.RegisterType((*ParamRef)(nil), "k8s.io.api.admissionregistration.v1beta1.ParamRef") @@ -779,130 +1041,174 @@ func init() { } var fileDescriptor_7f7c65a4f012fb19 = []byte{ - // 1957 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x1a, 0x4d, 0x6f, 0x1b, 0xc7, - 0xd5, 0x2b, 0x52, 0x12, 0xf9, 0xa8, 0x2f, 0x4e, 0x9c, 0x8a, 0x76, 0x1c, 0x52, 0x58, 0x04, 0x85, - 0x0c, 0xb4, 0x64, 0xac, 0x04, 0x89, 0xeb, 0xa0, 0x28, 0x44, 0xc5, 0x76, 0xed, 0x58, 0xb2, 0x30, - 0x4a, 0x24, 0xa0, 0x4d, 0x00, 0x8f, 0x76, 0x87, 0xe4, 0x96, 0xe4, 0xee, 0x76, 0x67, 0x49, 0x5b, - 0x2d, 0xd0, 0x16, 0xe8, 0x21, 0xd7, 0x02, 0xbd, 0x14, 0xe8, 0xa9, 0x7f, 0xa1, 0xf7, 0x02, 0xed, - 0xcd, 0xc7, 0xdc, 0x6a, 0xa0, 0x28, 0x51, 0xb1, 0x87, 0x9e, 0x7a, 0xe8, 0xa1, 0x3d, 0xe8, 0xd2, - 0x62, 0x66, 0x67, 0x3f, 0xb9, 0xb4, 0x56, 0xaa, 0xac, 0x5c, 0x7c, 0xd3, 0xbe, 0xcf, 0x79, 0x6f, - 0xde, 0xd7, 0x3c, 0x0a, 0x6e, 0x77, 0x6f, 0xb3, 0xba, 0x61, 0x35, 0x88, 0x6d, 0x34, 0x88, 0xde, - 0x37, 0x18, 0x33, 0x2c, 0xd3, 0xa1, 0x6d, 0x83, 0xb9, 0x0e, 0x71, 0x0d, 0xcb, 0x6c, 0x0c, 0x6f, - 0x1d, 0x52, 0x97, 0xdc, 0x6a, 0xb4, 0xa9, 0x49, 0x1d, 0xe2, 0x52, 0xbd, 0x6e, 0x3b, 0x96, 0x6b, - 0xa1, 0x75, 0x8f, 0xb3, 0x4e, 0x6c, 0xa3, 0x9e, 0xca, 0x59, 0x97, 0x9c, 0xd7, 0xbf, 0xdd, 0x36, - 0xdc, 0xce, 0xe0, 0xb0, 0xae, 0x59, 0xfd, 0x46, 0xdb, 0x6a, 0x5b, 0x0d, 0x21, 0xe0, 0x70, 0xd0, - 0x12, 0x5f, 0xe2, 0x43, 0xfc, 0xe5, 0x09, 0xbe, 0xfe, 0x5e, 0x86, 0x23, 0x25, 0x4f, 0x73, 0xfd, - 0xfd, 0x90, 0xa9, 0x4f, 0xb4, 0x8e, 0x61, 0x52, 0xe7, 0xa8, 0x61, 0x77, 0xdb, 0x1c, 0xc0, 0x1a, - 0x7d, 0xea, 0x92, 0x34, 0xae, 0xc6, 0x34, 0x2e, 0x67, 0x60, 0xba, 0x46, 0x9f, 0x4e, 0x30, 0x7c, - 0x70, 0x1a, 0x03, 0xd3, 0x3a, 0xb4, 0x4f, 0x92, 0x7c, 0x2a, 0x83, 0xe5, 0xcd, 0x81, 0x6e, 0xb8, - 0x9b, 0xa6, 0x69, 0xb9, 0xc2, 0x08, 0xf4, 0x36, 0xe4, 0xba, 0xf4, 0xa8, 0xa2, 0xac, 0x29, 0xeb, - 0xc5, 0x66, 0xe9, 0xf9, 0xa8, 0x76, 0x65, 0x3c, 0xaa, 0xe5, 0x3e, 0xa1, 0x47, 0x98, 0xc3, 0xd1, - 0x26, 0x2c, 0x0f, 0x49, 0x6f, 0x40, 0xef, 0x3e, 0xb3, 0x1d, 0x2a, 0x5c, 0x50, 0x99, 0x11, 0xa4, - 0xab, 0x92, 0x74, 0x79, 0x3f, 0x8e, 0xc6, 0x49, 0x7a, 0xb5, 0x07, 0xe5, 0xf0, 0xeb, 0x80, 0x38, - 0xa6, 0x61, 0xb6, 0xd1, 0xb7, 0xa0, 0xd0, 0x32, 0x68, 0x4f, 0xc7, 0xb4, 0x25, 0x05, 0xae, 0x48, - 0x81, 0x85, 0x7b, 0x12, 0x8e, 0x03, 0x0a, 0x74, 0x13, 0xe6, 0x9f, 0x7a, 0x8c, 0x95, 0x9c, 0x20, - 0x5e, 0x96, 0xc4, 0xf3, 0x52, 0x1e, 0xf6, 0xf1, 0x6a, 0x0b, 0x96, 0xb6, 0x89, 0xab, 0x75, 0xb6, - 0x2c, 0x53, 0x37, 0x84, 0x85, 0x6b, 0x90, 0x37, 0x49, 0x9f, 0x4a, 0x13, 0x17, 0x24, 0x67, 0x7e, - 0x87, 0xf4, 0x29, 0x16, 0x18, 0xb4, 0x01, 0x40, 0x93, 0xf6, 0x21, 0x49, 0x07, 0x11, 0xd3, 0x22, - 0x54, 0xea, 0x9f, 0xf3, 0x52, 0x11, 0xa6, 0xcc, 0x1a, 0x38, 0x1a, 0x65, 0xe8, 0x19, 0x94, 0xb9, - 0x38, 0x66, 0x13, 0x8d, 0xee, 0xd1, 0x1e, 0xd5, 0x5c, 0xcb, 0x11, 0x5a, 0x4b, 0x1b, 0xef, 0xd5, - 0xc3, 0x30, 0x0d, 0x6e, 0xac, 0x6e, 0x77, 0xdb, 0x1c, 0xc0, 0xea, 0x3c, 0x30, 0xea, 0xc3, 0x5b, - 0xf5, 0x47, 0xe4, 0x90, 0xf6, 0x7c, 0xd6, 0xe6, 0x9b, 0xe3, 0x51, 0xad, 0xbc, 0x93, 0x94, 0x88, - 0x27, 0x95, 0x20, 0x0b, 0x96, 0xac, 0xc3, 0x1f, 0x51, 0xcd, 0x0d, 0xd4, 0xce, 0x9c, 0x5f, 0x2d, - 0x1a, 0x8f, 0x6a, 0x4b, 0x8f, 0x63, 0xe2, 0x70, 0x42, 0x3c, 0xfa, 0x19, 0x2c, 0x3a, 0xd2, 0x6e, - 0x3c, 0xe8, 0x51, 0x56, 0xc9, 0xad, 0xe5, 0xd6, 0x4b, 0x1b, 0x9b, 0xf5, 0xac, 0xd9, 0x58, 0xe7, - 0x76, 0xe9, 0x9c, 0xf7, 0xc0, 0x70, 0x3b, 0x8f, 0x6d, 0xea, 0xa1, 0x59, 0xf3, 0x4d, 0xe9, 0xf7, - 0x45, 0x1c, 0x95, 0x8f, 0xe3, 0xea, 0xd0, 0xaf, 0x15, 0xb8, 0x4a, 0x9f, 0x69, 0xbd, 0x81, 0x4e, - 0x63, 0x74, 0x95, 0xfc, 0x45, 0x9d, 0xe3, 0x86, 0x3c, 0xc7, 0xd5, 0xbb, 0x29, 0x6a, 0x70, 0xaa, - 0x72, 0xf4, 0x31, 0x94, 0xfa, 0x3c, 0x24, 0x76, 0xad, 0x9e, 0xa1, 0x1d, 0x55, 0xe6, 0x45, 0x20, - 0xa9, 0xe3, 0x51, 0xad, 0xb4, 0x1d, 0x82, 0x4f, 0x46, 0xb5, 0xe5, 0xc8, 0xe7, 0xa7, 0x47, 0x36, - 0xc5, 0x51, 0x36, 0xf5, 0x4f, 0x05, 0x58, 0xde, 0x1e, 0xf0, 0xf4, 0x34, 0xdb, 0x07, 0xf4, 0xb0, - 0x63, 0x59, 0xdd, 0x0c, 0x31, 0xfc, 0x14, 0x16, 0xb4, 0x9e, 0x41, 0x4d, 0x77, 0xcb, 0x32, 0x5b, - 0x46, 0x5b, 0x06, 0xc0, 0x77, 0xb3, 0x3b, 0x42, 0xaa, 0xda, 0x8a, 0x08, 0x69, 0x5e, 0x95, 0x8a, - 0x16, 0xa2, 0x50, 0x1c, 0x53, 0x84, 0x3e, 0x87, 0x59, 0x27, 0x12, 0x02, 0x1f, 0x66, 0xd1, 0x58, - 0x4f, 0x71, 0xf8, 0xa2, 0xd4, 0x35, 0xeb, 0x79, 0xd8, 0x13, 0x8a, 0x1e, 0xc1, 0x62, 0x8b, 0x18, - 0xbd, 0x81, 0x43, 0xa5, 0x53, 0xf3, 0xc2, 0x03, 0xdf, 0xe4, 0x11, 0x72, 0x2f, 0x8a, 0x38, 0x19, - 0xd5, 0xca, 0x31, 0x80, 0x70, 0x6c, 0x9c, 0x39, 0x79, 0x41, 0xc5, 0x73, 0x5d, 0x50, 0x7a, 0x9e, - 0xcf, 0x7e, 0x3d, 0x79, 0x5e, 0x7a, 0xb5, 0x79, 0xfe, 0x31, 0x94, 0x98, 0xa1, 0xd3, 0xbb, 0xad, - 0x16, 0xd5, 0x5c, 0x56, 0x99, 0x0b, 0x1d, 0xb6, 0x17, 0x82, 0xb9, 0xc3, 0xc2, 0xcf, 0xad, 0x1e, - 0x61, 0x0c, 0x47, 0xd9, 0xd0, 0x1d, 0x58, 0xe2, 0x5d, 0xc9, 0x1a, 0xb8, 0x7b, 0x54, 0xb3, 0x4c, - 0x9d, 0x89, 0xd4, 0x98, 0xf5, 0x4e, 0xf0, 0x69, 0x0c, 0x83, 0x13, 0x94, 0xe8, 0x33, 0x58, 0x0d, - 0xa2, 0x08, 0xd3, 0xa1, 0x41, 0x9f, 0xee, 0x53, 0x87, 0x7f, 0xb0, 0x4a, 0x61, 0x2d, 0xb7, 0x5e, - 0x6c, 0xbe, 0x35, 0x1e, 0xd5, 0x56, 0x37, 0xd3, 0x49, 0xf0, 0x34, 0x5e, 0xf4, 0x04, 0x90, 0x43, - 0x0d, 0x73, 0x68, 0x69, 0x22, 0xfc, 0x64, 0x40, 0x80, 0xb0, 0xef, 0xdd, 0xf1, 0xa8, 0x86, 0xf0, - 0x04, 0xf6, 0x64, 0x54, 0xfb, 0xc6, 0x24, 0x54, 0x84, 0x47, 0x8a, 0x2c, 0xf4, 0x53, 0x58, 0xee, - 0xc7, 0x1a, 0x11, 0xab, 0x2c, 0x88, 0x0c, 0xb9, 0x9d, 0x3d, 0x27, 0xe3, 0x9d, 0x2c, 0xec, 0xb9, - 0x71, 0x38, 0xc3, 0x49, 0x4d, 0xea, 0x5f, 0x15, 0xb8, 0x91, 0xa8, 0x21, 0x5e, 0xba, 0x0e, 0x3c, - 0x0d, 0xe8, 0x09, 0x14, 0x78, 0x54, 0xe8, 0xc4, 0x25, 0xb2, 0x45, 0xbd, 0x9b, 0x2d, 0x86, 0xbc, - 0x80, 0xd9, 0xa6, 0x2e, 0x09, 0x5b, 0x64, 0x08, 0xc3, 0x81, 0x54, 0xf4, 0x43, 0x28, 0x48, 0xcd, - 0xac, 0x32, 0x23, 0x0c, 0xff, 0xce, 0x19, 0x0c, 0x8f, 0x9f, 0xbd, 0x99, 0xe7, 0xaa, 0x70, 0x20, - 0x50, 0xfd, 0xa7, 0x02, 0x6b, 0x2f, 0xb3, 0xef, 0x91, 0xc1, 0x5c, 0xf4, 0xf9, 0x84, 0x8d, 0xf5, - 0x8c, 0x79, 0x62, 0x30, 0xcf, 0xc2, 0x60, 0x26, 0xf1, 0x21, 0x11, 0xfb, 0xba, 0x30, 0x6b, 0xb8, - 0xb4, 0xef, 0x1b, 0x77, 0xef, 0xdc, 0xc6, 0xc5, 0x0e, 0x1e, 0x96, 0xc1, 0x07, 0x5c, 0x38, 0xf6, - 0x74, 0xa8, 0x2f, 0x14, 0x58, 0x9d, 0xd2, 0xa9, 0xd0, 0x87, 0x61, 0x2f, 0x16, 0x45, 0xa4, 0xa2, - 0x88, 0xbc, 0x28, 0x47, 0x9b, 0xa8, 0x40, 0xe0, 0x38, 0x1d, 0xfa, 0xa5, 0x02, 0xc8, 0x99, 0x90, - 0x27, 0x3b, 0xc7, 0xb9, 0xeb, 0xf8, 0x75, 0x69, 0x00, 0x9a, 0xc4, 0xe1, 0x14, 0x75, 0x2a, 0x81, - 0xe2, 0x2e, 0x71, 0x48, 0xff, 0x13, 0xc3, 0xd4, 0xf9, 0x24, 0x46, 0x6c, 0x43, 0x66, 0xa9, 0xec, - 0x76, 0x41, 0x98, 0x6d, 0xee, 0x3e, 0x90, 0x18, 0x1c, 0xa1, 0xe2, 0xbd, 0xb1, 0x6b, 0x98, 0xba, - 0x9c, 0xdb, 0x82, 0xde, 0xc8, 0xe5, 0x61, 0x81, 0x51, 0x7f, 0x3f, 0x03, 0x05, 0xa1, 0x83, 0xcf, - 0x92, 0xa7, 0xb7, 0xd2, 0x06, 0x14, 0x83, 0xd2, 0x2b, 0xa5, 0x96, 0x25, 0x59, 0x31, 0x28, 0xd3, - 0x38, 0xa4, 0x41, 0x5f, 0x40, 0x81, 0xf9, 0x05, 0x39, 0x77, 0xfe, 0x82, 0xbc, 0xc0, 0x23, 0x2d, - 0x28, 0xc5, 0x81, 0x48, 0xe4, 0xc2, 0xaa, 0xcd, 0x4f, 0x4f, 0x5d, 0xea, 0xec, 0x58, 0xee, 0x3d, - 0x6b, 0x60, 0xea, 0x9b, 0x1a, 0xf7, 0x9e, 0xec, 0x86, 0x77, 0x78, 0x09, 0xdc, 0x4d, 0x27, 0x39, - 0x19, 0xd5, 0xde, 0x9a, 0x82, 0x12, 0xa5, 0x6b, 0x9a, 0x68, 0xf5, 0x77, 0x0a, 0xac, 0xec, 0x51, - 0x67, 0x68, 0x68, 0x14, 0xd3, 0x16, 0x75, 0xa8, 0xa9, 0x25, 0x5c, 0xa3, 0x64, 0x70, 0x8d, 0xef, - 0xed, 0x99, 0xa9, 0xde, 0xbe, 0x01, 0x79, 0x9b, 0xb8, 0x1d, 0x39, 0xd8, 0x17, 0x38, 0x76, 0x97, - 0xb8, 0x1d, 0x2c, 0xa0, 0x02, 0x6b, 0x39, 0xae, 0x30, 0x74, 0x56, 0x62, 0x2d, 0xc7, 0xc5, 0x02, - 0xaa, 0xfe, 0x46, 0x81, 0x05, 0x6e, 0xc5, 0x56, 0x87, 0x6a, 0x5d, 0xfe, 0xac, 0xf8, 0x52, 0x01, - 0x44, 0x93, 0x8f, 0x0d, 0x2f, 0x23, 0x4a, 0x1b, 0x1f, 0x65, 0x4f, 0xd1, 0x89, 0x07, 0x4b, 0x18, - 0xd6, 0x13, 0x28, 0x86, 0x53, 0x54, 0xaa, 0x7f, 0x99, 0x81, 0x6b, 0xfb, 0xa4, 0x67, 0xe8, 0x22, - 0xd5, 0x83, 0xfe, 0x24, 0x9b, 0xc3, 0xab, 0x2f, 0xbf, 0x06, 0xe4, 0x99, 0x4d, 0x35, 0x99, 0xcd, - 0xf7, 0xb3, 0x9b, 0x3e, 0xf5, 0xd0, 0x7b, 0x36, 0xd5, 0xc2, 0x1b, 0xe4, 0x5f, 0x58, 0xa8, 0x40, - 0x3f, 0x86, 0x39, 0xe6, 0x12, 0x77, 0xc0, 0x64, 0xf0, 0x3f, 0xb8, 0x08, 0x65, 0x42, 0x60, 0x73, - 0x49, 0xaa, 0x9b, 0xf3, 0xbe, 0xb1, 0x54, 0xa4, 0xfe, 0x47, 0x81, 0xb5, 0xa9, 0xbc, 0x4d, 0xc3, - 0xd4, 0x79, 0x30, 0xbc, 0x7a, 0x27, 0xdb, 0x31, 0x27, 0xef, 0x5c, 0x80, 0xdd, 0xf2, 0xec, 0xd3, - 0x7c, 0xad, 0xfe, 0x5b, 0x81, 0x77, 0x4e, 0x63, 0xbe, 0x84, 0xe6, 0x67, 0xc5, 0x9b, 0xdf, 0xc3, - 0x8b, 0xb3, 0x7c, 0x4a, 0x03, 0xfc, 0x32, 0x77, 0xba, 0xdd, 0xdc, 0x4d, 0xbc, 0x83, 0xd8, 0x02, - 0xb8, 0x13, 0x16, 0xf9, 0xe0, 0x12, 0x77, 0x03, 0x0c, 0x8e, 0x50, 0x71, 0x5f, 0xd9, 0xb2, 0x3d, - 0xc8, 0xab, 0xdc, 0xc8, 0x6e, 0x90, 0xdf, 0x58, 0xbc, 0xf2, 0xed, 0x7f, 0xe1, 0x40, 0x22, 0x72, - 0x61, 0xa9, 0x1f, 0x5b, 0x14, 0xc8, 0x34, 0x39, 0xeb, 0x1c, 0x18, 0xf0, 0x7b, 0x73, 0x73, 0x1c, - 0x86, 0x13, 0x3a, 0xd0, 0x01, 0x94, 0x87, 0xd2, 0x5f, 0x96, 0xe9, 0x95, 0x74, 0xef, 0x75, 0x5c, - 0x6c, 0xde, 0xe4, 0xef, 0x8d, 0xfd, 0x24, 0xf2, 0x64, 0x54, 0x5b, 0x49, 0x02, 0xf1, 0xa4, 0x0c, - 0xf5, 0x1f, 0x0a, 0xbc, 0x3d, 0xf5, 0x26, 0x2e, 0x21, 0xf4, 0x3a, 0xf1, 0xd0, 0xdb, 0xba, 0x88, - 0xd0, 0x4b, 0x8f, 0xb9, 0xdf, 0xce, 0xbd, 0xc4, 0x52, 0x11, 0x6c, 0x4f, 0xa0, 0x68, 0xfb, 0xb3, - 0x4b, 0xca, 0xa6, 0x27, 0x4b, 0xe4, 0x70, 0xd6, 0xe6, 0x22, 0xef, 0x9f, 0xc1, 0x27, 0x0e, 0x85, - 0xa2, 0x9f, 0xc0, 0x8a, 0x3f, 0xdb, 0x73, 0x7e, 0xc3, 0x74, 0xfd, 0x01, 0xed, 0xfc, 0xe1, 0x73, - 0x75, 0x3c, 0xaa, 0xad, 0x6c, 0x27, 0xa4, 0xe2, 0x09, 0x3d, 0xa8, 0x0b, 0xa5, 0xf0, 0xfa, 0xfd, - 0xf7, 0xfd, 0xfb, 0x67, 0xf7, 0xb7, 0x65, 0x36, 0xdf, 0x90, 0x0e, 0x2e, 0x85, 0x30, 0x86, 0xa3, - 0xd2, 0x2f, 0xf8, 0xa1, 0xff, 0x73, 0x58, 0x21, 0xf1, 0x45, 0x27, 0xab, 0xcc, 0x9e, 0xf5, 0x11, - 0x92, 0x58, 0x95, 0x36, 0x2b, 0xd2, 0x88, 0x95, 0x04, 0x82, 0xe1, 0x09, 0x65, 0x69, 0xaf, 0xbf, - 0xb9, 0xcb, 0x7a, 0xfd, 0x21, 0x0d, 0x8a, 0x43, 0xe2, 0x18, 0xe4, 0xb0, 0x47, 0xf9, 0x53, 0x3b, - 0x77, 0xb6, 0x82, 0xb6, 0x2f, 0x59, 0xc3, 0xc9, 0xce, 0x87, 0x30, 0x1c, 0xca, 0x55, 0xff, 0x38, - 0x03, 0xb5, 0x53, 0xda, 0x37, 0x7a, 0x08, 0xc8, 0x3a, 0x64, 0xd4, 0x19, 0x52, 0xfd, 0xbe, 0xb7, - 0x8a, 0xf6, 0xc7, 0xfa, 0x5c, 0x38, 0x50, 0x3d, 0x9e, 0xa0, 0xc0, 0x29, 0x5c, 0xa8, 0x07, 0x0b, - 0x6e, 0x64, 0xd4, 0x93, 0x59, 0xf0, 0x41, 0x76, 0xbb, 0xa2, 0x83, 0x62, 0x73, 0x65, 0x3c, 0xaa, - 0xc5, 0x46, 0x47, 0x1c, 0x93, 0x8e, 0x34, 0x00, 0x2d, 0xbc, 0x3a, 0x2f, 0xf4, 0x1b, 0xd9, 0xaa, - 0x58, 0x78, 0x63, 0x41, 0xdf, 0x89, 0x5c, 0x56, 0x44, 0xac, 0x7a, 0x3c, 0x0f, 0xe5, 0xd0, 0x85, - 0xaf, 0x77, 0x7d, 0xaf, 0x77, 0x7d, 0x2f, 0xdd, 0xf5, 0xc1, 0xeb, 0x5d, 0xdf, 0xb9, 0x76, 0x7d, - 0x29, 0xb5, 0xb8, 0x74, 0x69, 0x9b, 0xb8, 0x63, 0x05, 0xaa, 0x13, 0x39, 0x7e, 0xd9, 0xbb, 0xb8, - 0x2f, 0x26, 0x76, 0x71, 0x1f, 0x9d, 0x67, 0x6c, 0x9a, 0xb6, 0x8d, 0xfb, 0x97, 0x02, 0xea, 0xcb, - 0x6d, 0xbc, 0x84, 0xb9, 0xb0, 0x1f, 0x9f, 0x0b, 0xbf, 0xff, 0x7f, 0x18, 0x98, 0x65, 0x23, 0xf7, - 0x5f, 0x05, 0x20, 0x1c, 0x66, 0xd0, 0x3b, 0x10, 0xf9, 0xa1, 0x50, 0x96, 0x6e, 0xcf, 0x4d, 0x11, - 0x38, 0xba, 0x09, 0xf3, 0x7d, 0xca, 0x18, 0x69, 0xfb, 0x0b, 0x91, 0xe0, 0x77, 0xcc, 0x6d, 0x0f, - 0x8c, 0x7d, 0x3c, 0x3a, 0x80, 0x39, 0x87, 0x12, 0x66, 0x99, 0x72, 0x31, 0xf2, 0x3d, 0xfe, 0x0a, - 0xc6, 0x02, 0x72, 0x32, 0xaa, 0xdd, 0xca, 0xf2, 0x3b, 0x73, 0x5d, 0x3e, 0x9a, 0x05, 0x13, 0x96, - 0xe2, 0xd0, 0x7d, 0x28, 0x4b, 0x1d, 0x91, 0x03, 0x7b, 0x95, 0xf6, 0x9a, 0x3c, 0x4d, 0x79, 0x3b, - 0x49, 0x80, 0x27, 0x79, 0xd4, 0x87, 0x50, 0xf0, 0x07, 0x03, 0x54, 0x81, 0x7c, 0xe4, 0xbd, 0xe5, - 0x19, 0x2e, 0x20, 0x09, 0xc7, 0xcc, 0xa4, 0x3b, 0x46, 0xfd, 0x83, 0x02, 0x6f, 0xa4, 0x34, 0x25, - 0x74, 0x0d, 0x72, 0x03, 0xa7, 0x27, 0x5d, 0x30, 0x3f, 0x1e, 0xd5, 0x72, 0x9f, 0xe1, 0x47, 0x98, - 0xc3, 0x10, 0x81, 0x79, 0xe6, 0xad, 0xa7, 0x64, 0x30, 0xdd, 0xc9, 0x7e, 0xe3, 0xc9, 0xbd, 0x56, - 0xb3, 0xc4, 0xef, 0xc0, 0x87, 0xfa, 0x72, 0xd1, 0x3a, 0x14, 0x34, 0xd2, 0x1c, 0x98, 0x7a, 0xcf, - 0xbb, 0xaf, 0x05, 0xef, 0x8d, 0xb7, 0xb5, 0xe9, 0xc1, 0x70, 0x80, 0x6d, 0xee, 0x3c, 0x3f, 0xae, - 0x5e, 0xf9, 0xea, 0xb8, 0x7a, 0xe5, 0xc5, 0x71, 0xf5, 0xca, 0x2f, 0xc6, 0x55, 0xe5, 0xf9, 0xb8, - 0xaa, 0x7c, 0x35, 0xae, 0x2a, 0x2f, 0xc6, 0x55, 0xe5, 0x6f, 0xe3, 0xaa, 0xf2, 0xab, 0xbf, 0x57, - 0xaf, 0xfc, 0x60, 0x3d, 0xeb, 0x7f, 0x39, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x6f, 0xf2, 0xe8, - 0x4a, 0x10, 0x21, 0x00, 0x00, + // 2215 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4d, 0x6c, 0x1b, 0xc7, + 0x15, 0xf6, 0x92, 0x92, 0x45, 0x3e, 0xca, 0x92, 0x38, 0x71, 0x2a, 0xfa, 0x8f, 0x14, 0x16, 0x41, + 0x21, 0x03, 0x2d, 0x59, 0x2b, 0x41, 0xe2, 0x3a, 0x29, 0x02, 0xae, 0x62, 0x3b, 0x76, 0x24, 0x59, + 0x18, 0x39, 0x52, 0xd1, 0x26, 0x40, 0x56, 0xcb, 0x21, 0xb9, 0x11, 0xb9, 0xcb, 0xee, 0x2c, 0x65, + 0xab, 0x05, 0xda, 0x02, 0x2d, 0x90, 0x1e, 0x0b, 0xf4, 0x52, 0xa0, 0xa7, 0xde, 0x7b, 0x69, 0xef, + 0x05, 0x7a, 0xf4, 0x31, 0xb7, 0x1a, 0x28, 0x4a, 0x54, 0x4c, 0xd1, 0x9e, 0x7a, 0x48, 0x81, 0xf6, + 0xa0, 0x4b, 0x8b, 0x99, 0x9d, 0xfd, 0xdf, 0x95, 0x56, 0xb2, 0x2c, 0x17, 0x85, 0x6f, 0xda, 0xf7, + 0xe6, 0xbd, 0x37, 0xef, 0xcd, 0x9b, 0xf7, 0xbe, 0x79, 0x22, 0xdc, 0xdc, 0xb9, 0x49, 0xeb, 0xba, + 0xd9, 0x50, 0x07, 0x7a, 0x43, 0x6d, 0xf5, 0x75, 0x4a, 0x75, 0xd3, 0xb0, 0x48, 0x47, 0xa7, 0xb6, + 0xa5, 0xda, 0xba, 0x69, 0x34, 0x76, 0x6f, 0x6c, 0x13, 0x5b, 0xbd, 0xd1, 0xe8, 0x10, 0x83, 0x58, + 0xaa, 0x4d, 0x5a, 0xf5, 0x81, 0x65, 0xda, 0x26, 0x5a, 0x74, 0x24, 0xeb, 0xea, 0x40, 0xaf, 0x27, + 0x4a, 0xd6, 0x85, 0xe4, 0xe5, 0xaf, 0x77, 0x74, 0xbb, 0x3b, 0xdc, 0xae, 0x6b, 0x66, 0xbf, 0xd1, + 0x31, 0x3b, 0x66, 0x83, 0x2b, 0xd8, 0x1e, 0xb6, 0xf9, 0x17, 0xff, 0xe0, 0x7f, 0x39, 0x8a, 0x2f, + 0xbf, 0x9e, 0x61, 0x4b, 0xd1, 0xdd, 0x5c, 0x7e, 0xc3, 0x17, 0xea, 0xab, 0x5a, 0x57, 0x37, 0x88, + 0xb5, 0xd7, 0x18, 0xec, 0x74, 0x18, 0x81, 0x36, 0xfa, 0xc4, 0x56, 0x93, 0xa4, 0x1a, 0x69, 0x52, + 0xd6, 0xd0, 0xb0, 0xf5, 0x3e, 0x89, 0x09, 0xbc, 0x79, 0x94, 0x00, 0xd5, 0xba, 0xa4, 0xaf, 0x46, + 0xe5, 0xe4, 0xf7, 0x01, 0x35, 0x07, 0x83, 0xde, 0xde, 0xb2, 0x69, 0xb4, 0xf5, 0xce, 0xd0, 0xf1, + 0x03, 0x2d, 0x01, 0x90, 0xc7, 0x03, 0x8b, 0x70, 0x0f, 0x2b, 0xd2, 0x82, 0xb4, 0x58, 0x54, 0xd0, + 0x93, 0x51, 0xed, 0xdc, 0x78, 0x54, 0x83, 0xdb, 0x1e, 0x07, 0x07, 0x56, 0xc9, 0x14, 0x66, 0x9b, + 0xc3, 0x96, 0x6e, 0x37, 0x0d, 0xc3, 0xb4, 0x1d, 0x35, 0xd7, 0x20, 0xbf, 0x43, 0xf6, 0x84, 0x7c, + 0x49, 0xc8, 0xe7, 0x3f, 0x20, 0x7b, 0x98, 0xd1, 0x51, 0x13, 0x66, 0x77, 0xd5, 0xde, 0x90, 0xf8, + 0x0a, 0x2b, 0x39, 0xbe, 0x74, 0x5e, 0x2c, 0x9d, 0xdd, 0x0c, 0xb3, 0x71, 0x74, 0xbd, 0xdc, 0x83, + 0xb2, 0xff, 0xb5, 0xa5, 0x5a, 0x86, 0x6e, 0x74, 0xd0, 0xd7, 0xa0, 0xd0, 0xd6, 0x49, 0xaf, 0x85, + 0x49, 0x5b, 0x28, 0x9c, 0x13, 0x0a, 0x0b, 0x77, 0x04, 0x1d, 0x7b, 0x2b, 0xd0, 0x75, 0x98, 0x7a, + 0xe4, 0x08, 0x56, 0xf2, 0x7c, 0xf1, 0xac, 0x58, 0x3c, 0x25, 0xf4, 0x61, 0x97, 0x2f, 0xbf, 0x0b, + 0xc5, 0xfb, 0x1b, 0x0f, 0xd6, 0xd6, 0x55, 0x5b, 0xeb, 0x9e, 0x28, 0x46, 0x6d, 0x98, 0x59, 0x65, + 0xc2, 0xcb, 0xa6, 0xd1, 0xd2, 0x79, 0x88, 0x16, 0x60, 0xc2, 0x50, 0xfb, 0x44, 0xc8, 0x4f, 0x0b, + 0xf9, 0x89, 0x35, 0xb5, 0x4f, 0x30, 0xe7, 0x44, 0xec, 0xe4, 0x32, 0xd9, 0xf9, 0xe3, 0x84, 0x30, + 0x84, 0x09, 0x35, 0x87, 0x96, 0x46, 0x28, 0x7a, 0x0c, 0x65, 0xa6, 0x8e, 0x0e, 0x54, 0x8d, 0x6c, + 0x90, 0x1e, 0xd1, 0x6c, 0xd3, 0xe2, 0x56, 0x4b, 0x4b, 0xaf, 0xd7, 0xfd, 0x1b, 0xe3, 0x25, 0x4f, + 0x7d, 0xb0, 0xd3, 0x61, 0x04, 0x5a, 0x67, 0x39, 0x5a, 0xdf, 0xbd, 0x51, 0x5f, 0x51, 0xb7, 0x49, + 0xcf, 0x15, 0x55, 0x5e, 0x1d, 0x8f, 0x6a, 0xe5, 0xb5, 0xa8, 0x46, 0x1c, 0x37, 0x82, 0x4c, 0x98, + 0x31, 0xb7, 0x3f, 0x25, 0x9a, 0xed, 0x99, 0xcd, 0x9d, 0xdc, 0x2c, 0x1a, 0x8f, 0x6a, 0x33, 0x0f, + 0x42, 0xea, 0x70, 0x44, 0x3d, 0xfa, 0x21, 0x5c, 0xb0, 0x84, 0xdf, 0x78, 0xd8, 0x23, 0xb4, 0x92, + 0x5f, 0xc8, 0x2f, 0x96, 0x96, 0x9a, 0xf5, 0xac, 0x85, 0xa1, 0xce, 0xfc, 0x6a, 0x31, 0xd9, 0x2d, + 0xdd, 0xee, 0x3e, 0x18, 0x10, 0x87, 0x4d, 0x95, 0x57, 0x45, 0xdc, 0x2f, 0xe0, 0xa0, 0x7e, 0x1c, + 0x36, 0x87, 0x7e, 0x21, 0xc1, 0x45, 0xf2, 0x58, 0xeb, 0x0d, 0x5b, 0x24, 0xb4, 0xae, 0x32, 0x71, + 0x5a, 0xfb, 0xb8, 0x2a, 0xf6, 0x71, 0xf1, 0x76, 0x82, 0x19, 0x9c, 0x68, 0x1c, 0xbd, 0x07, 0xa5, + 0x3e, 0x4b, 0x89, 0x75, 0xb3, 0xa7, 0x6b, 0x7b, 0x95, 0x29, 0x9e, 0x48, 0xf2, 0x78, 0x54, 0x2b, + 0xad, 0xfa, 0xe4, 0x83, 0x51, 0x6d, 0x36, 0xf0, 0xf9, 0x70, 0x6f, 0x40, 0x70, 0x50, 0x4c, 0xfe, + 0xab, 0x04, 0xf3, 0xab, 0x43, 0x76, 0xbf, 0x8d, 0x4e, 0xd3, 0xdd, 0xbb, 0xc3, 0x43, 0x9f, 0x40, + 0x81, 0x1d, 0x5a, 0x4b, 0xb5, 0x55, 0x91, 0x59, 0xdf, 0xc8, 0x76, 0xc4, 0xce, 0x79, 0xae, 0x12, + 0x5b, 0xf5, 0x33, 0xdb, 0xa7, 0x61, 0x4f, 0x2b, 0xea, 0xc0, 0x04, 0x1d, 0x10, 0x4d, 0x24, 0xd0, + 0xed, 0xec, 0x81, 0x4c, 0xd9, 0xf2, 0xc6, 0x80, 0x68, 0xfe, 0xa5, 0x63, 0x5f, 0x98, 0x1b, 0x90, + 0xff, 0x29, 0x41, 0x35, 0x45, 0x46, 0xd1, 0x8d, 0x16, 0xab, 0x32, 0xcf, 0xdf, 0x5b, 0x23, 0xe4, + 0xed, 0xca, 0x33, 0x7b, 0x2b, 0x76, 0x9e, 0xea, 0xf4, 0x97, 0x12, 0xc8, 0x87, 0x8b, 0xae, 0xe8, + 0xd4, 0x46, 0x1f, 0xc5, 0x1c, 0xaf, 0x67, 0xbc, 0xc9, 0x3a, 0x75, 0xdc, 0xf6, 0xca, 0xb1, 0x4b, + 0x09, 0x38, 0xdd, 0x87, 0x49, 0xdd, 0x26, 0x7d, 0x5a, 0xc9, 0xf1, 0xcb, 0xf2, 0xfe, 0x69, 0x79, + 0xad, 0x5c, 0x10, 0x46, 0x27, 0xef, 0x31, 0xf5, 0xd8, 0xb1, 0x22, 0xff, 0x26, 0x77, 0x94, 0xcf, + 0x2c, 0x40, 0xac, 0x08, 0x0f, 0x38, 0x71, 0xcd, 0x2f, 0xd6, 0xde, 0xe1, 0xad, 0x7b, 0x1c, 0x1c, + 0x58, 0xc5, 0xe2, 0x34, 0x50, 0x2d, 0xb5, 0xef, 0xb6, 0xa1, 0xd2, 0xd2, 0x52, 0x76, 0x67, 0xd6, + 0x85, 0xa4, 0x32, 0xcd, 0xe2, 0xe4, 0x7e, 0x61, 0x4f, 0x23, 0xb2, 0x61, 0xa6, 0x1f, 0xaa, 0xf0, + 0xbc, 0x7b, 0x95, 0x96, 0x6e, 0x1e, 0x23, 0x60, 0x21, 0x79, 0xa7, 0xb4, 0x86, 0x69, 0x38, 0x62, + 0x43, 0xfe, 0x42, 0x82, 0x2b, 0x29, 0xe1, 0x3a, 0x83, 0xdc, 0x68, 0x87, 0x73, 0xa3, 0xf9, 0xec, + 0xb9, 0x91, 0x9c, 0x14, 0xbf, 0x3a, 0x9f, 0xea, 0x25, 0xcf, 0x86, 0x4f, 0xa0, 0xc8, 0xcf, 0xe1, + 0x03, 0xdd, 0x68, 0x25, 0xf4, 0xd0, 0x2c, 0x47, 0xcb, 0x44, 0x95, 0x0b, 0xe3, 0x51, 0xad, 0xe8, + 0x7d, 0x62, 0x5f, 0x29, 0xfa, 0x3e, 0xcc, 0xf5, 0x05, 0x50, 0x60, 0xf2, 0xba, 0x61, 0x53, 0x91, + 0x43, 0x27, 0x3f, 0xdf, 0x8b, 0xe3, 0x51, 0x6d, 0x6e, 0x35, 0xa2, 0x15, 0xc7, 0xec, 0x20, 0x0d, + 0x8a, 0xbb, 0xaa, 0xa5, 0xab, 0xdb, 0x7e, 0xeb, 0x3c, 0x46, 0xe2, 0x6e, 0x0a, 0x51, 0xa5, 0x2c, + 0x42, 0x5b, 0x74, 0x29, 0x14, 0xfb, 0x7a, 0x99, 0x91, 0xfe, 0xd0, 0x81, 0x89, 0x6e, 0x5f, 0x5c, + 0x3a, 0xee, 0x71, 0x9a, 0x86, 0x6f, 0xc4, 0xa5, 0x50, 0xec, 0xeb, 0x45, 0x2b, 0x70, 0xa1, 0xad, + 0xea, 0xbd, 0xa1, 0x45, 0x44, 0xd3, 0x9b, 0xe4, 0x17, 0xf7, 0xab, 0xac, 0x83, 0xdf, 0x09, 0x32, + 0x0e, 0x46, 0xb5, 0x72, 0x88, 0xc0, 0x1b, 0x5f, 0x58, 0x18, 0xfd, 0x00, 0x66, 0xfb, 0x21, 0xf0, + 0x46, 0x2b, 0xe7, 0xf9, 0xc6, 0x8f, 0x7b, 0x24, 0x9e, 0x02, 0x1f, 0xe8, 0x86, 0xe9, 0x14, 0x47, + 0x2d, 0xa1, 0x9f, 0x49, 0x80, 0x2c, 0xa2, 0x1b, 0xbb, 0xa6, 0xc6, 0x35, 0x86, 0xba, 0xf8, 0xb7, + 0x85, 0x1a, 0x84, 0x63, 0x2b, 0x0e, 0x46, 0xb5, 0x5b, 0x19, 0x9e, 0x2d, 0xf5, 0xb8, 0x24, 0x0f, + 0x41, 0x82, 0x4d, 0xf9, 0x6f, 0x05, 0x98, 0x75, 0x6f, 0xc7, 0x16, 0xd9, 0xee, 0x9a, 0xe6, 0x4e, + 0x06, 0x18, 0xfb, 0x08, 0xa6, 0xb5, 0x9e, 0x4e, 0x0c, 0xdb, 0x79, 0x69, 0x88, 0x6c, 0xfe, 0x56, + 0xf6, 0xd0, 0x09, 0x53, 0xcb, 0x01, 0x25, 0xca, 0x45, 0x61, 0x68, 0x3a, 0x48, 0xc5, 0x21, 0x43, + 0xe8, 0x23, 0x98, 0xb4, 0x02, 0x28, 0xf0, 0xad, 0x2c, 0x16, 0xeb, 0x09, 0x98, 0xcb, 0x2b, 0x15, + 0x0e, 0xc8, 0x72, 0x94, 0xc6, 0x53, 0x6c, 0xe2, 0x59, 0x52, 0x2c, 0x82, 0xd1, 0x8a, 0x27, 0xc2, + 0x68, 0xc9, 0x50, 0x7f, 0xf2, 0xc5, 0x40, 0xfd, 0xd2, 0xf3, 0x85, 0xfa, 0xef, 0x41, 0x89, 0xea, + 0x2d, 0x72, 0xbb, 0xdd, 0x26, 0x9a, 0xcd, 0xee, 0xa3, 0x17, 0xb0, 0x0d, 0x9f, 0xcc, 0x02, 0xe6, + 0x7f, 0x2e, 0xf7, 0x54, 0x4a, 0x71, 0x50, 0x0c, 0xdd, 0x82, 0x19, 0xf6, 0x46, 0x36, 0x87, 0xf6, + 0x06, 0xd1, 0x4c, 0xa3, 0x45, 0xf9, 0xbd, 0x9a, 0x74, 0x76, 0xf0, 0x30, 0xc4, 0xc1, 0x91, 0x95, + 0xe8, 0x43, 0x98, 0xf7, 0xb2, 0x08, 0x93, 0x5d, 0x9d, 0x3c, 0xda, 0x24, 0x16, 0xe5, 0xd5, 0xa1, + 0xb0, 0x90, 0x5f, 0x2c, 0x2a, 0x57, 0xc6, 0xa3, 0xda, 0x7c, 0x33, 0x79, 0x09, 0x4e, 0x93, 0x45, + 0x3f, 0x4d, 0xbe, 0xef, 0xc0, 0x1d, 0x7c, 0x78, 0x56, 0x77, 0x3d, 0xa9, 0xe6, 0x4d, 0x9f, 0x55, + 0xcd, 0x93, 0xff, 0x2c, 0xc1, 0xd5, 0x48, 0xa1, 0x09, 0x8f, 0x29, 0x9e, 0x3f, 0x04, 0xff, 0x2e, + 0x14, 0x84, 0x65, 0x17, 0x74, 0x7c, 0xf3, 0xf8, 0xa0, 0x43, 0x68, 0x50, 0x26, 0x98, 0x29, 0xec, + 0x29, 0x94, 0xff, 0x21, 0xc1, 0xc2, 0x61, 0xfe, 0x9d, 0x01, 0xa2, 0xda, 0x09, 0x23, 0xaa, 0x3b, + 0x27, 0x76, 0x2e, 0xb4, 0xf1, 0x14, 0x58, 0xf5, 0xdb, 0x1c, 0x14, 0xdc, 0x3e, 0x8d, 0xde, 0x61, + 0x18, 0xca, 0xd6, 0xba, 0x2c, 0xf5, 0xc4, 0x54, 0xa3, 0xea, 0x36, 0xf3, 0x75, 0x97, 0x71, 0x10, + 0xfc, 0xc0, 0xbe, 0x00, 0xbf, 0x1e, 0x6a, 0x6c, 0x6e, 0x25, 0x20, 0xf0, 0x3b, 0xd9, 0xbd, 0x88, + 0xcf, 0xbe, 0x94, 0xaf, 0xb0, 0xcb, 0x15, 0xa7, 0xe3, 0x04, 0x7b, 0x0c, 0x08, 0x7e, 0x4a, 0x4d, + 0x83, 0x6f, 0x91, 0x57, 0xfe, 0x63, 0x01, 0x41, 0x6f, 0x96, 0xe4, 0x00, 0x41, 0xef, 0x13, 0xfb, + 0x4a, 0xe5, 0xa7, 0x12, 0xcc, 0xa7, 0x4c, 0x01, 0xd0, 0x5b, 0xfe, 0x9c, 0x83, 0x57, 0xe7, 0x8a, + 0xc4, 0x0b, 0x4e, 0x39, 0x38, 0xa0, 0xe0, 0x0c, 0x1c, 0x5e, 0x87, 0x7e, 0xc2, 0x8a, 0x4b, 0x4c, + 0x9f, 0x68, 0xc9, 0x27, 0x6e, 0x90, 0x97, 0x3d, 0x14, 0x12, 0xe3, 0xe1, 0x04, 0x73, 0xb2, 0x0a, + 0x3e, 0xf6, 0x65, 0x0f, 0x2c, 0x75, 0xa0, 0x8b, 0xf2, 0x17, 0x7d, 0x60, 0x35, 0xd7, 0xef, 0x09, + 0x0e, 0x0e, 0xac, 0x62, 0xa0, 0x63, 0x87, 0x21, 0xf0, 0x5c, 0x18, 0x74, 0x70, 0x2c, 0xcd, 0x39, + 0xf2, 0xef, 0x72, 0xe0, 0xbd, 0x9d, 0x32, 0x60, 0x94, 0x06, 0x14, 0xbd, 0x9e, 0x26, 0xb4, 0x7a, + 0x00, 0xd3, 0xeb, 0x7f, 0xd8, 0x5f, 0x83, 0x3e, 0x86, 0x02, 0x75, 0x3b, 0x5d, 0xfe, 0xe4, 0x9d, + 0x8e, 0xbf, 0xf1, 0xbc, 0x1e, 0xe7, 0xa9, 0x44, 0x36, 0xcc, 0xf3, 0x27, 0x01, 0xb1, 0x89, 0xb5, + 0x66, 0xda, 0x77, 0xcc, 0xa1, 0xd1, 0x6a, 0x6a, 0x3c, 0xd3, 0x1d, 0x98, 0x71, 0x8b, 0xf5, 0x96, + 0xf5, 0xe4, 0x25, 0x07, 0xa3, 0xda, 0x95, 0x14, 0x16, 0xbf, 0x4d, 0x69, 0xaa, 0xe5, 0x5f, 0x4b, + 0x30, 0xb7, 0x41, 0xac, 0x5d, 0x5d, 0x23, 0x98, 0xb4, 0x89, 0x45, 0x0c, 0x2d, 0x12, 0x1a, 0x29, + 0x43, 0x68, 0xdc, 0x68, 0xe7, 0x52, 0xa3, 0x7d, 0x15, 0x26, 0x06, 0xaa, 0xdd, 0x15, 0x53, 0xd7, + 0x02, 0xe3, 0xae, 0xab, 0x76, 0x17, 0x73, 0x2a, 0xe7, 0x9a, 0x96, 0xcd, 0x1d, 0x9d, 0x14, 0x5c, + 0xd3, 0xb2, 0x31, 0xa7, 0xca, 0xbf, 0x94, 0x60, 0x9a, 0x79, 0xb1, 0xdc, 0x25, 0xda, 0x8e, 0x6e, + 0x74, 0xd0, 0x67, 0x12, 0x20, 0x12, 0x9d, 0x04, 0x3b, 0x37, 0xa2, 0xb4, 0xf4, 0x76, 0xf6, 0x3b, + 0x19, 0x9b, 0x26, 0xfb, 0x69, 0x1d, 0x63, 0x51, 0x9c, 0x60, 0x52, 0xfe, 0x53, 0x0e, 0x2e, 0x6d, + 0xaa, 0x3d, 0xbd, 0xf5, 0x82, 0x66, 0x64, 0x7a, 0x68, 0x6a, 0x74, 0xf7, 0x38, 0x2f, 0xb7, 0x94, + 0x4d, 0xa7, 0x0d, 0x8c, 0xd0, 0xf7, 0xe0, 0x3c, 0xb5, 0x55, 0x7b, 0xe8, 0xce, 0x1e, 0xee, 0x9d, + 0x86, 0x31, 0xae, 0x50, 0x99, 0x11, 0xe6, 0xce, 0x3b, 0xdf, 0x58, 0x18, 0x92, 0xff, 0x2d, 0xc1, + 0x42, 0xaa, 0xec, 0xd9, 0x8d, 0xe6, 0x06, 0xa1, 0x20, 0xaf, 0x9d, 0x82, 0xdf, 0x47, 0x0d, 0xe7, + 0xfe, 0x25, 0xc1, 0x6b, 0x47, 0x09, 0x9f, 0x01, 0x60, 0x30, 0xc3, 0x80, 0xe1, 0xfe, 0xe9, 0x79, + 0x9e, 0x02, 0x1a, 0x3e, 0xcb, 0x1f, 0xed, 0xf7, 0xcb, 0x11, 0x5d, 0xe0, 0x1f, 0x3d, 0x5b, 0x50, + 0xde, 0x15, 0xf1, 0x32, 0x0d, 0xa7, 0xa4, 0x3b, 0x13, 0x96, 0xa2, 0x72, 0x9d, 0x3d, 0xe4, 0x36, + 0xa3, 0xcc, 0x83, 0x51, 0x6d, 0x2e, 0x4a, 0xc4, 0x71, 0x1d, 0xf2, 0xdf, 0x25, 0xb8, 0x96, 0x7a, + 0x12, 0x67, 0x90, 0x7a, 0xdd, 0x70, 0xea, 0x2d, 0x9f, 0x46, 0xea, 0xa5, 0xce, 0xff, 0xae, 0x1d, + 0x5a, 0x0d, 0xff, 0xcf, 0x27, 0x80, 0x3b, 0x50, 0xf2, 0x8f, 0xdf, 0x1d, 0x9c, 0xbc, 0x71, 0xfc, + 0x78, 0x9b, 0x86, 0xf2, 0x8a, 0x08, 0x70, 0xc9, 0xa7, 0x51, 0x1c, 0xd4, 0x7e, 0xca, 0x13, 0x94, + 0x1f, 0xc1, 0x9c, 0x1a, 0xfe, 0x2f, 0x34, 0xad, 0x4c, 0x1e, 0xf7, 0xe1, 0x16, 0xf9, 0x3f, 0xb6, + 0x52, 0x11, 0x4e, 0xcc, 0x45, 0x18, 0x14, 0xc7, 0x8c, 0xbd, 0xd8, 0x29, 0x61, 0x68, 0x74, 0x3b, + 0xf5, 0x7c, 0x46, 0xb7, 0xf2, 0x1f, 0x72, 0x50, 0x3b, 0xa2, 0x7d, 0xa3, 0xfb, 0x80, 0xcc, 0x6d, + 0x4a, 0xac, 0x5d, 0xd2, 0xba, 0xeb, 0xfc, 0xe2, 0xc0, 0x85, 0xf5, 0x79, 0x1f, 0x50, 0x3d, 0x88, + 0xad, 0xc0, 0x09, 0x52, 0xa8, 0x07, 0xd3, 0x76, 0x00, 0xea, 0x89, 0x5b, 0xf0, 0x66, 0x76, 0xbf, + 0x82, 0x40, 0x51, 0x99, 0x1b, 0x8f, 0x6a, 0x21, 0xe8, 0x88, 0x43, 0xda, 0x91, 0x06, 0xa0, 0xf9, + 0x47, 0xe7, 0xa4, 0x7e, 0x23, 0x5b, 0x15, 0xf3, 0x4f, 0xcc, 0xeb, 0x3b, 0x81, 0xc3, 0x0a, 0xa8, + 0x95, 0xf7, 0xa7, 0xa0, 0xec, 0x87, 0xf0, 0xe5, 0x10, 0xf5, 0xe5, 0x10, 0xf5, 0xd0, 0x21, 0x2a, + 0xbc, 0x1c, 0xa2, 0x9e, 0x68, 0x88, 0x9a, 0x50, 0x8b, 0x4b, 0x67, 0x36, 0xbd, 0xdc, 0x97, 0xa0, + 0x1a, 0xbb, 0xe3, 0x67, 0x3d, 0xbf, 0xfc, 0x38, 0x36, 0xbf, 0x7c, 0xfb, 0x24, 0xb0, 0x29, 0x6d, + 0x82, 0xf9, 0xa5, 0x04, 0xf2, 0xe1, 0x3e, 0xfe, 0x4f, 0xff, 0x62, 0xe0, 0xf0, 0xad, 0xa7, 0x80, + 0xc3, 0xff, 0x48, 0x00, 0x3e, 0x98, 0x41, 0xaf, 0x41, 0xe0, 0x47, 0x58, 0xa2, 0x74, 0x3b, 0x61, + 0x0a, 0xd0, 0xd1, 0x75, 0x98, 0xea, 0x13, 0x4a, 0xd5, 0x8e, 0x3b, 0x10, 0xf1, 0x7e, 0x64, 0xb6, + 0xea, 0x90, 0xb1, 0xcb, 0x47, 0x5b, 0x70, 0xde, 0x22, 0x2a, 0x15, 0xd3, 0xcc, 0xa2, 0xf2, 0x2e, + 0x7b, 0x05, 0x63, 0x4e, 0x39, 0x18, 0xd5, 0x6e, 0x64, 0xf9, 0x39, 0x61, 0x5d, 0x3c, 0x9a, 0xb9, + 0x10, 0x16, 0xea, 0xd0, 0x5d, 0x28, 0x0b, 0x1b, 0x81, 0x0d, 0x3b, 0x95, 0xf6, 0x92, 0xd8, 0x4d, + 0x79, 0x35, 0xba, 0x00, 0xc7, 0x65, 0xe4, 0xfb, 0x50, 0x70, 0x81, 0x01, 0xaa, 0xc0, 0x44, 0xe0, + 0xbd, 0xe5, 0x38, 0xce, 0x29, 0x91, 0xc0, 0xe4, 0x92, 0x03, 0x23, 0xff, 0x5e, 0x82, 0x57, 0x12, + 0x9a, 0x12, 0xba, 0x04, 0xf9, 0xa1, 0xd5, 0x13, 0x21, 0x98, 0x1a, 0x8f, 0x6a, 0xf9, 0x0f, 0xf1, + 0x0a, 0x66, 0x34, 0xa4, 0xc2, 0x14, 0x75, 0xc6, 0x53, 0x22, 0x99, 0x6e, 0x65, 0x3f, 0xf1, 0xe8, + 0x5c, 0x4b, 0x29, 0xb1, 0x33, 0x70, 0xa9, 0xae, 0x5e, 0xb4, 0x08, 0x05, 0x4d, 0x55, 0x86, 0x46, + 0xab, 0xe7, 0x9c, 0xd7, 0xb4, 0xf3, 0xc6, 0x5b, 0x6e, 0x3a, 0x34, 0xec, 0x71, 0x95, 0xb5, 0x27, + 0xfb, 0xd5, 0x73, 0x9f, 0xef, 0x57, 0xcf, 0x3d, 0xdd, 0xaf, 0x9e, 0xfb, 0xf1, 0xb8, 0x2a, 0x3d, + 0x19, 0x57, 0xa5, 0xcf, 0xc7, 0x55, 0xe9, 0xe9, 0xb8, 0x2a, 0xfd, 0x65, 0x5c, 0x95, 0x7e, 0xfe, + 0x45, 0xf5, 0xdc, 0x77, 0x16, 0xb3, 0xfe, 0x98, 0xf5, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x13, + 0x7c, 0x49, 0xa4, 0xf7, 0x2a, 0x00, 0x00, +} + +func (m *ApplyConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplyConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplyConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } func (m *AuditAnnotation) Marshal() (dAtA []byte, err error) { @@ -971,6 +1277,34 @@ func (m *ExpressionWarning) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *JSONPatch) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *JSONPatch) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *JSONPatch) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *MatchCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1086,7 +1420,7 @@ func (m *MatchResources) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1096,112 +1430,18 @@ func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MutatingWebhook) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - } - } - if m.ObjectSelector != nil { - { - size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - } - if m.ReinvocationPolicy != nil { - i -= len(*m.ReinvocationPolicy) - copy(dAtA[i:], *m.ReinvocationPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ReinvocationPolicy))) - i-- - dAtA[i] = 0x52 - } - if m.MatchPolicy != nil { - i -= len(*m.MatchPolicy) - copy(dAtA[i:], *m.MatchPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) - i-- - dAtA[i] = 0x4a - } - if len(m.AdmissionReviewVersions) > 0 { - for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AdmissionReviewVersions[iNdEx]) - copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) - i-- - dAtA[i] = 0x42 - } - } - if m.TimeoutSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) - i-- - dAtA[i] = 0x38 - } - if m.SideEffects != nil { - i -= len(*m.SideEffects) - copy(dAtA[i:], *m.SideEffects) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) - i-- - dAtA[i] = 0x32 - } - if m.NamespaceSelector != nil { - { - size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) - i-- - dAtA[i] = 0x22 - } - if len(m.Rules) > 0 { - for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } { - size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1210,15 +1450,20 @@ func (m *MutatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *MutatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1228,30 +1473,26 @@ func (m *MutatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MutatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Webhooks) > 0 { - for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1265,7 +1506,7 @@ func (m *MutatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } -func (m *MutatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1275,12 +1516,12 @@ func (m *MutatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *MutatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1312,7 +1553,7 @@ func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } -func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1322,39 +1563,49 @@ func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NamedRuleWithOperations) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NamedRuleWithOperations) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.RuleWithOperations.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.MatchResources != nil { + { + size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a } - i-- - dAtA[i] = 0x12 - if len(m.ResourceNames) > 0 { - for iNdEx := len(m.ResourceNames) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ResourceNames[iNdEx]) - copy(dAtA[i:], m.ResourceNames[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceNames[iNdEx]))) - i-- - dAtA[i] = 0xa + if m.ParamRef != nil { + { + size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } + i -= len(m.PolicyName) + copy(dAtA[i:], m.PolicyName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ParamKind) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1364,30 +1615,44 @@ func (m *ParamKind) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ParamKind) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ParamKind) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.Kind) - copy(dAtA[i:], m.Kind) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) - i-- - dAtA[i] = 0x12 - i -= len(m.APIVersion) - copy(dAtA[i:], m.APIVersion) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion))) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ParamRef) Marshal() (dAtA []byte, err error) { +func (m *MutatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1397,26 +1662,73 @@ func (m *ParamRef) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ParamRef) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.ParameterNotFoundAction != nil { - i -= len(*m.ParameterNotFoundAction) - copy(dAtA[i:], *m.ParameterNotFoundAction) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ParameterNotFoundAction))) + i -= len(m.ReinvocationPolicy) + copy(dAtA[i:], m.ReinvocationPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ReinvocationPolicy))) + i-- + dAtA[i] = 0x3a + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x2a } - if m.Selector != nil { + if len(m.Mutations) > 0 { + for iNdEx := len(m.Mutations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mutations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Variables) > 0 { + for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.MatchConstraints != nil { { - size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1424,67 +1736,24 @@ func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceReference) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceReference) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Port != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) - i-- - dAtA[i] = 0x20 + dAtA[i] = 0x12 } - if m.Path != nil { - i -= len(*m.Path) - copy(dAtA[i:], *m.Path) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Path))) + if m.ParamKind != nil { + { + size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x1a + dAtA[i] = 0xa } - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x12 - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *TypeChecking) Marshal() (dAtA []byte, err error) { +func (m *MutatingWebhook) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1494,20 +1763,20 @@ func (m *TypeChecking) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TypeChecking) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingWebhook) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ExpressionWarnings) > 0 { - for iNdEx := len(m.ExpressionWarnings) - 1; iNdEx >= 0; iNdEx-- { + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.ExpressionWarnings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1515,54 +1784,91 @@ func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x62 } } - return len(dAtA) - i, nil -} - -func (m *ValidatingAdmissionPolicy) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if m.ObjectSelector != nil { + { + size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a } - return dAtA[:n], nil -} - -func (m *ValidatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.ReinvocationPolicy != nil { + i -= len(*m.ReinvocationPolicy) + copy(dAtA[i:], *m.ReinvocationPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ReinvocationPolicy))) + i-- + dAtA[i] = 0x52 + } + if m.MatchPolicy != nil { + i -= len(*m.MatchPolicy) + copy(dAtA[i:], *m.MatchPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) + i-- + dAtA[i] = 0x4a + } + if len(m.AdmissionReviewVersions) > 0 { + for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AdmissionReviewVersions[iNdEx]) + copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) + i-- + dAtA[i] = 0x42 } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x1a - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if m.TimeoutSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + i-- + dAtA[i] = 0x38 + } + if m.SideEffects != nil { + i -= len(*m.SideEffects) + copy(dAtA[i:], *m.SideEffects) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) + i-- + dAtA[i] = 0x32 + } + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 + } + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x12 { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1570,11 +1876,16 @@ func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, erro i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { +func (m *MutatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1584,26 +1895,30 @@ func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Webhooks) > 0 { + for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -1617,7 +1932,7 @@ func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { +func (m *MutatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1627,12 +1942,12 @@ func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *MutatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1664,7 +1979,7 @@ func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { +func (m *Mutation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1674,28 +1989,19 @@ func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { +func (m *Mutation) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Mutation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.ValidationActions) > 0 { - for iNdEx := len(m.ValidationActions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.ValidationActions[iNdEx]) - copy(dAtA[i:], m.ValidationActions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ValidationActions[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if m.MatchResources != nil { + if m.JSONPatch != nil { { - size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.JSONPatch.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1703,11 +2009,11 @@ func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } - if m.ParamRef != nil { + if m.ApplyConfiguration != nil { { - size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ApplyConfiguration.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1715,17 +2021,17 @@ func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - i -= len(m.PolicyName) - copy(dAtA[i:], m.PolicyName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) + i -= len(m.PatchType) + copy(dAtA[i:], m.PatchType) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PatchType))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { +func (m *NamedRuleWithOperations) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1735,32 +2041,18 @@ func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { +func (m *NamedRuleWithOperations) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NamedRuleWithOperations) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.RuleWithOperations.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1768,11 +2060,20 @@ func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + if len(m.ResourceNames) > 0 { + for iNdEx := len(m.ResourceNames) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ResourceNames[iNdEx]) + copy(dAtA[i:], m.ResourceNames[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceNames[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { +func (m *ParamKind) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1782,94 +2083,59 @@ func (m *ValidatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { +func (m *ParamKind) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ParamKind) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Variables) > 0 { - for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.AuditAnnotations) > 0 { - for iNdEx := len(m.AuditAnnotations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AuditAnnotations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0x12 + i -= len(m.APIVersion) + copy(dAtA[i:], m.APIVersion) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ParamRef) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + return dAtA[:n], nil +} + +func (m *ParamRef) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ParamRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ParameterNotFoundAction != nil { + i -= len(*m.ParameterNotFoundAction) + copy(dAtA[i:], *m.ParameterNotFoundAction) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ParameterNotFoundAction))) i-- dAtA[i] = 0x22 } - if len(m.Validations) > 0 { - for iNdEx := len(m.Validations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Validations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.MatchConstraints != nil { - { - size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ParamKind != nil { + if m.Selector != nil { { - size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Selector.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1877,12 +2143,22 @@ func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicyStatus) Marshal() (dAtA []byte, err error) { +func (m *ServiceReference) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1892,49 +2168,42 @@ func (m *ValidatingAdmissionPolicyStatus) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyStatus) MarshalTo(dAtA []byte) (int, error) { +func (m *ServiceReference) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingAdmissionPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ServiceReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } + if m.Port != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Port)) + i-- + dAtA[i] = 0x20 } - if m.TypeChecking != nil { - { - size, err := m.TypeChecking.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } + if m.Path != nil { + i -= len(*m.Path) + copy(dAtA[i:], *m.Path) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Path))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0x12 + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { +func (m *TypeChecking) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1944,20 +2213,20 @@ func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingWebhook) MarshalTo(dAtA []byte) (int, error) { +func (m *TypeChecking) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TypeChecking) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.MatchConditions) > 0 { - for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + if len(m.ExpressionWarnings) > 0 { + for iNdEx := len(m.ExpressionWarnings) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ExpressionWarnings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1965,84 +2234,44 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x5a - } - } - if m.ObjectSelector != nil { - { - size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + dAtA[i] = 0xa } - i-- - dAtA[i] = 0x52 } - if m.MatchPolicy != nil { - i -= len(*m.MatchPolicy) - copy(dAtA[i:], *m.MatchPolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) - i-- - dAtA[i] = 0x4a + return len(dAtA) - i, nil +} + +func (m *ValidatingAdmissionPolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if len(m.AdmissionReviewVersions) > 0 { - for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AdmissionReviewVersions[iNdEx]) - copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) - i-- - dAtA[i] = 0x42 - } - } - if m.TimeoutSeconds != nil { - i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) - i-- - dAtA[i] = 0x38 - } - if m.SideEffects != nil { - i -= len(*m.SideEffects) - copy(dAtA[i:], *m.SideEffects) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) - i-- - dAtA[i] = 0x32 - } - if m.NamespaceSelector != nil { - { - size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if m.FailurePolicy != nil { - i -= len(*m.FailurePolicy) - copy(dAtA[i:], *m.FailurePolicy) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) - i-- - dAtA[i] = 0x22 - } - if len(m.Rules) > 0 { - for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a + return dAtA[:n], nil +} + +func (m *ValidatingAdmissionPolicy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingAdmissionPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x1a { - size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -2051,15 +2280,20 @@ func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBinding) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2069,30 +2303,26 @@ func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ValidatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBinding) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBinding) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Webhooks) > 0 { - for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 { size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -2106,7 +2336,7 @@ func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBindingList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2116,12 +2346,12 @@ func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *ValidatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2153,7 +2383,7 @@ func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) ( return len(dAtA) - i, nil } -func (m *Validation) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyBindingSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2163,42 +2393,58 @@ func (m *Validation) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Validation) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingSpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Validation) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyBindingSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.MessageExpression) - copy(dAtA[i:], m.MessageExpression) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) - i-- - dAtA[i] = 0x22 - if m.Reason != nil { - i -= len(*m.Reason) - copy(dAtA[i:], *m.Reason) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + if len(m.ValidationActions) > 0 { + for iNdEx := len(m.ValidationActions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ValidationActions[iNdEx]) + copy(dAtA[i:], m.ValidationActions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ValidationActions[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if m.MatchResources != nil { + { + size, err := m.MatchResources.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x1a } - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x12 - i -= len(m.Expression) - copy(dAtA[i:], m.Expression) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + if m.ParamRef != nil { + { + size, err := m.ParamRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.PolicyName) + copy(dAtA[i:], m.PolicyName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PolicyName))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *Variable) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicyList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2208,30 +2454,44 @@ func (m *Variable) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Variable) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Variable) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicyList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - i -= len(m.Expression) - copy(dAtA[i:], m.Expression) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) - i-- - dAtA[i] = 0x12 - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { +func (m *ValidatingAdmissionPolicySpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2241,335 +2501,636 @@ func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WebhookClientConfig) MarshalTo(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicySpec) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ValidatingAdmissionPolicySpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.URL != nil { - i -= len(*m.URL) - copy(dAtA[i:], *m.URL) - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.URL))) - i-- - dAtA[i] = 0x1a - } - if m.CABundle != nil { - i -= len(m.CABundle) - copy(dAtA[i:], m.CABundle) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.CABundle))) - i-- - dAtA[i] = 0x12 - } - if m.Service != nil { - { - size, err := m.Service.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.Variables) > 0 { + for iNdEx := len(m.Variables) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Variables[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x3a } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ } - dAtA[offset] = uint8(v) - return base -} -func (m *AuditAnnotation) Size() (n int) { - if m == nil { - return 0 + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - var l int - _ = l - l = len(m.Key) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.ValueExpression) - n += 1 + l + sovGenerated(uint64(l)) - return n + if len(m.AuditAnnotations) > 0 { + for iNdEx := len(m.AuditAnnotations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AuditAnnotations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 + } + if len(m.Validations) > 0 { + for iNdEx := len(m.Validations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Validations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.MatchConstraints != nil { + { + size, err := m.MatchConstraints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.ParamKind != nil { + { + size, err := m.ParamKind.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *ExpressionWarning) Size() (n int) { - if m == nil { - return 0 +func (m *ValidatingAdmissionPolicyStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - l = len(m.FieldRef) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Warning) - n += 1 + l + sovGenerated(uint64(l)) - return n + return dAtA[:n], nil } -func (m *MatchCondition) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Expression) - n += 1 + l + sovGenerated(uint64(l)) - return n +func (m *ValidatingAdmissionPolicyStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MatchResources) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingAdmissionPolicyStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.NamespaceSelector != nil { - l = m.NamespaceSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ObjectSelector != nil { - l = m.ObjectSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.ResourceRules) > 0 { - for _, e := range m.ResourceRules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - if len(m.ExcludeResourceRules) > 0 { - for _, e := range m.ExcludeResourceRules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.TypeChecking != nil { + { + size, err := m.TypeChecking.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.MatchPolicy != nil { - l = len(*m.MatchPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - return n + i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil } -func (m *MutatingWebhook) Size() (n int) { - if m == nil { - return 0 +func (m *ValidatingWebhook) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ValidatingWebhook) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhook) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = m.ClientConfig.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Rules) > 0 { - for _, e := range m.Rules { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.MatchConditions) > 0 { + for iNdEx := len(m.MatchConditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MatchConditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a } } - if m.FailurePolicy != nil { - l = len(*m.FailurePolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.NamespaceSelector != nil { - l = m.NamespaceSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.SideEffects != nil { - l = len(*m.SideEffects) - n += 1 + l + sovGenerated(uint64(l)) + if m.ObjectSelector != nil { + { + size, err := m.ObjectSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 } - if m.TimeoutSeconds != nil { - n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) + if m.MatchPolicy != nil { + i -= len(*m.MatchPolicy) + copy(dAtA[i:], *m.MatchPolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchPolicy))) + i-- + dAtA[i] = 0x4a } if len(m.AdmissionReviewVersions) > 0 { - for _, s := range m.AdmissionReviewVersions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) + for iNdEx := len(m.AdmissionReviewVersions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AdmissionReviewVersions[iNdEx]) + copy(dAtA[i:], m.AdmissionReviewVersions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AdmissionReviewVersions[iNdEx]))) + i-- + dAtA[i] = 0x42 } } - if m.MatchPolicy != nil { - l = len(*m.MatchPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.ReinvocationPolicy != nil { - l = len(*m.ReinvocationPolicy) - n += 1 + l + sovGenerated(uint64(l)) + if m.TimeoutSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) + i-- + dAtA[i] = 0x38 } - if m.ObjectSelector != nil { - l = m.ObjectSelector.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.SideEffects != nil { + i -= len(*m.SideEffects) + copy(dAtA[i:], *m.SideEffects) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) + i-- + dAtA[i] = 0x32 } - if len(m.MatchConditions) > 0 { - for _, e := range m.MatchConditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if m.NamespaceSelector != nil { + { + size, err := m.NamespaceSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } - return n -} - -func (m *MutatingWebhookConfiguration) Size() (n int) { - if m == nil { - return 0 + if m.FailurePolicy != nil { + i -= len(*m.FailurePolicy) + copy(dAtA[i:], *m.FailurePolicy) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FailurePolicy))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Webhooks) > 0 { - for _, e := range m.Webhooks { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for iNdEx := len(m.Rules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Rules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - return n -} - -func (m *MutatingWebhookConfigurationList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + { + size, err := m.ClientConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - return n + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *NamedRuleWithOperations) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ResourceNames) > 0 { - for _, s := range m.ResourceNames { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } +func (m *ValidatingWebhookConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - l = m.RuleWithOperations.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n + return dAtA[:n], nil } -func (m *ParamKind) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.APIVersion) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Kind) - n += 1 + l + sovGenerated(uint64(l)) - return n +func (m *ValidatingWebhookConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ParamRef) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingWebhookConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - if m.Selector != nil { - l = m.Selector.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Webhooks) > 0 { + for iNdEx := len(m.Webhooks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Webhooks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if m.ParameterNotFoundAction != nil { - l = len(*m.ParameterNotFoundAction) - n += 1 + l + sovGenerated(uint64(l)) + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } - return n + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *ServiceReference) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if m.Path != nil { - l = len(*m.Path) - n += 1 + l + sovGenerated(uint64(l)) - } - if m.Port != nil { - n += 1 + sovGenerated(uint64(*m.Port)) +func (m *ValidatingWebhookConfigurationList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *TypeChecking) Size() (n int) { - if m == nil { - return 0 - } +func (m *ValidatingWebhookConfigurationList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatingWebhookConfigurationList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.ExpressionWarnings) > 0 { - for _, e := range m.ExpressionWarnings { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } } - return n + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil } -func (m *ValidatingAdmissionPolicy) Size() (n int) { - if m == nil { - return 0 +func (m *Validation) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n + return dAtA[:n], nil } -func (m *ValidatingAdmissionPolicyBinding) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() +func (m *Validation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Validation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.MessageExpression) + copy(dAtA[i:], m.MessageExpression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.MessageExpression))) + i-- + dAtA[i] = 0x22 + if m.Reason != nil { + i -= len(*m.Reason) + copy(dAtA[i:], *m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Reason))) + i-- + dAtA[i] = 0x1a + } + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x12 + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Variable) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Variable) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Variable) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *WebhookClientConfig) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WebhookClientConfig) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WebhookClientConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.URL != nil { + i -= len(*m.URL) + copy(dAtA[i:], *m.URL) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.URL))) + i-- + dAtA[i] = 0x1a + } + if m.CABundle != nil { + i -= len(m.CABundle) + copy(dAtA[i:], m.CABundle) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CABundle))) + i-- + dAtA[i] = 0x12 + } + if m.Service != nil { + { + size, err := m.Service.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ApplyConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *AuditAnnotation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ValueExpression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ExpressionWarning) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FieldRef) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Warning) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *JSONPatch) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MatchCondition) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MatchResources) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ResourceRules) > 0 { + for _, e := range m.ResourceRules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.ExcludeResourceRules) > 0 { + for _, e := range m.ExcludeResourceRules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *MutatingAdmissionPolicy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() n += 1 + l + sovGenerated(uint64(l)) l = m.Spec.Size() n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { +func (m *MutatingAdmissionPolicyBinding) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *MutatingAdmissionPolicyBindingList) Size() (n int) { if m == nil { return 0 } @@ -2586,7 +3147,7 @@ func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { return n } -func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { +func (m *MutatingAdmissionPolicyBindingSpec) Size() (n int) { if m == nil { return 0 } @@ -2602,16 +3163,10 @@ func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { l = m.MatchResources.Size() n += 1 + l + sovGenerated(uint64(l)) } - if len(m.ValidationActions) > 0 { - for _, s := range m.ValidationActions { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } return n } -func (m *ValidatingAdmissionPolicyList) Size() (n int) { +func (m *MutatingAdmissionPolicyList) Size() (n int) { if m == nil { return 0 } @@ -2628,7 +3183,7 @@ func (m *ValidatingAdmissionPolicyList) Size() (n int) { return n } -func (m *ValidatingAdmissionPolicySpec) Size() (n int) { +func (m *MutatingAdmissionPolicySpec) Size() (n int) { if m == nil { return 0 } @@ -2642,8 +3197,14 @@ func (m *ValidatingAdmissionPolicySpec) Size() (n int) { l = m.MatchConstraints.Size() n += 1 + l + sovGenerated(uint64(l)) } - if len(m.Validations) > 0 { - for _, e := range m.Validations { + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Mutations) > 0 { + for _, e := range m.Mutations { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -2652,48 +3213,18 @@ func (m *ValidatingAdmissionPolicySpec) Size() (n int) { l = len(*m.FailurePolicy) n += 1 + l + sovGenerated(uint64(l)) } - if len(m.AuditAnnotations) > 0 { - for _, e := range m.AuditAnnotations { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } if len(m.MatchConditions) > 0 { for _, e := range m.MatchConditions { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } } - if len(m.Variables) > 0 { - for _, e := range m.Variables { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ValidatingAdmissionPolicyStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - n += 1 + sovGenerated(uint64(m.ObservedGeneration)) - if m.TypeChecking != nil { - l = m.TypeChecking.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } + l = len(m.ReinvocationPolicy) + n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *ValidatingWebhook) Size() (n int) { +func (m *MutatingWebhook) Size() (n int) { if m == nil { return 0 } @@ -2734,6 +3265,10 @@ func (m *ValidatingWebhook) Size() (n int) { l = len(*m.MatchPolicy) n += 1 + l + sovGenerated(uint64(l)) } + if m.ReinvocationPolicy != nil { + l = len(*m.ReinvocationPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } if m.ObjectSelector != nil { l = m.ObjectSelector.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -2747,7 +3282,7 @@ func (m *ValidatingWebhook) Size() (n int) { return n } -func (m *ValidatingWebhookConfiguration) Size() (n int) { +func (m *MutatingWebhookConfiguration) Size() (n int) { if m == nil { return 0 } @@ -2764,7 +3299,7 @@ func (m *ValidatingWebhookConfiguration) Size() (n int) { return n } -func (m *ValidatingWebhookConfigurationList) Size() (n int) { +func (m *MutatingWebhookConfigurationList) Size() (n int) { if m == nil { return 0 } @@ -2781,476 +3316,1911 @@ func (m *ValidatingWebhookConfigurationList) Size() (n int) { return n } -func (m *Validation) Size() (n int) { +func (m *Mutation) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Expression) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Message) + l = len(m.PatchType) n += 1 + l + sovGenerated(uint64(l)) - if m.Reason != nil { - l = len(*m.Reason) + if m.ApplyConfiguration != nil { + l = m.ApplyConfiguration.Size() n += 1 + l + sovGenerated(uint64(l)) } - l = len(m.MessageExpression) + if m.JSONPatch != nil { + l = m.JSONPatch.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *NamedRuleWithOperations) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ResourceNames) > 0 { + for _, s := range m.ResourceNames { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.RuleWithOperations.Size() n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *Variable) Size() (n int) { +func (m *ParamKind) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) + l = len(m.APIVersion) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Expression) + l = len(m.Kind) n += 1 + l + sovGenerated(uint64(l)) return n } -func (m *WebhookClientConfig) Size() (n int) { +func (m *ParamRef) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Service != nil { - l = m.Service.Size() + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() n += 1 + l + sovGenerated(uint64(l)) } - if m.CABundle != nil { - l = len(m.CABundle) + if m.ParameterNotFoundAction != nil { + l = len(*m.ParameterNotFoundAction) n += 1 + l + sovGenerated(uint64(l)) } - if m.URL != nil { - l = len(*m.URL) + return n +} + +func (m *ServiceReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Path != nil { + l = len(*m.Path) n += 1 + l + sovGenerated(uint64(l)) } + if m.Port != nil { + n += 1 + sovGenerated(uint64(*m.Port)) + } return n } -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +func (m *TypeChecking) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ExpressionWarnings) > 0 { + for _, e := range m.ExpressionWarnings { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *AuditAnnotation) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicy) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&AuditAnnotation{`, - `Key:` + fmt.Sprintf("%v", this.Key) + `,`, - `ValueExpression:` + fmt.Sprintf("%v", this.ValueExpression) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n } -func (this *ExpressionWarning) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyBinding) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&ExpressionWarning{`, - `FieldRef:` + fmt.Sprintf("%v", this.FieldRef) + `,`, - `Warning:` + fmt.Sprintf("%v", this.Warning) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n } -func (this *MatchCondition) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyBindingList) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&MatchCondition{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `}`, - }, "") - return s + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *MatchResources) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyBindingSpec) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForResourceRules := "[]NamedRuleWithOperations{" - for _, f := range this.ResourceRules { - repeatedStringForResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + var l int + _ = l + l = len(m.PolicyName) + n += 1 + l + sovGenerated(uint64(l)) + if m.ParamRef != nil { + l = m.ParamRef.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForResourceRules += "}" - repeatedStringForExcludeResourceRules := "[]NamedRuleWithOperations{" - for _, f := range this.ExcludeResourceRules { - repeatedStringForExcludeResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + if m.MatchResources != nil { + l = m.MatchResources.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForExcludeResourceRules += "}" - s := strings.Join([]string{`&MatchResources{`, - `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ResourceRules:` + repeatedStringForResourceRules + `,`, - `ExcludeResourceRules:` + repeatedStringForExcludeResourceRules + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, - `}`, - }, "") - return s + if len(m.ValidationActions) > 0 { + for _, s := range m.ValidationActions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n } -func (this *MutatingWebhook) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyList) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForRules := "[]RuleWithOperations{" - for _, f := range this.Rules { - repeatedStringForRules += fmt.Sprintf("%v", f) + "," + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForRules += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," - } - repeatedStringForMatchConditions += "}" - s := strings.Join([]string{`&MutatingWebhook{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, - `Rules:` + repeatedStringForRules + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, - `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, - `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, - `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, - `ReinvocationPolicy:` + valueToStringGenerated(this.ReinvocationPolicy) + `,`, - `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, - `}`, - }, "") - return s + return n } -func (this *MutatingWebhookConfiguration) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicySpec) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForWebhooks := "[]MutatingWebhook{" - for _, f := range this.Webhooks { - repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "MutatingWebhook", "MutatingWebhook", 1), `&`, ``, 1) + "," + var l int + _ = l + if m.ParamKind != nil { + l = m.ParamKind.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForWebhooks += "}" - s := strings.Join([]string{`&MutatingWebhookConfiguration{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Webhooks:` + repeatedStringForWebhooks + `,`, - `}`, - }, "") - return s -} -func (this *MutatingWebhookConfigurationList) String() string { - if this == nil { - return "nil" + if m.MatchConstraints != nil { + l = m.MatchConstraints.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForItems := "[]MutatingWebhookConfiguration{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingWebhookConfiguration", "MutatingWebhookConfiguration", 1), `&`, ``, 1) + "," + if len(m.Validations) > 0 { + for _, e := range m.Validations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForItems += "}" - s := strings.Join([]string{`&MutatingWebhookConfigurationList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *NamedRuleWithOperations) String() string { - if this == nil { - return "nil" + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) } - s := strings.Join([]string{`&NamedRuleWithOperations{`, - `ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`, - `RuleWithOperations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuleWithOperations), "RuleWithOperations", "v11.RuleWithOperations", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ParamKind) String() string { - if this == nil { - return "nil" + if len(m.AuditAnnotations) > 0 { + for _, e := range m.AuditAnnotations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ParamKind{`, - `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, - `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, - `}`, - }, "") - return s -} -func (this *ParamRef) String() string { - if this == nil { - return "nil" + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ParamRef{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `ParameterNotFoundAction:` + valueToStringGenerated(this.ParameterNotFoundAction) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceReference) String() string { - if this == nil { - return "nil" + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ServiceReference{`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Path:` + valueToStringGenerated(this.Path) + `,`, - `Port:` + valueToStringGenerated(this.Port) + `,`, - `}`, - }, "") - return s + return n } -func (this *TypeChecking) String() string { - if this == nil { - return "nil" + +func (m *ValidatingAdmissionPolicyStatus) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForExpressionWarnings := "[]ExpressionWarning{" - for _, f := range this.ExpressionWarnings { - repeatedStringForExpressionWarnings += strings.Replace(strings.Replace(f.String(), "ExpressionWarning", "ExpressionWarning", 1), `&`, ``, 1) + "," + var l int + _ = l + n += 1 + sovGenerated(uint64(m.ObservedGeneration)) + if m.TypeChecking != nil { + l = m.TypeChecking.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForExpressionWarnings += "}" - s := strings.Join([]string{`&TypeChecking{`, - `ExpressionWarnings:` + repeatedStringForExpressionWarnings + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicy) String() string { - if this == nil { - return "nil" + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - s := strings.Join([]string{`&ValidatingAdmissionPolicy{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicySpec", "ValidatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ValidatingAdmissionPolicyStatus", "ValidatingAdmissionPolicyStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s + return n } -func (this *ValidatingAdmissionPolicyBinding) String() string { - if this == nil { - return "nil" + +func (m *ValidatingWebhook) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&ValidatingAdmissionPolicyBinding{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicyBindingSpec", "ValidatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicyBindingList) String() string { - if this == nil { - return "nil" + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.ClientConfig.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Rules) > 0 { + for _, e := range m.Rules { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForItems := "[]ValidatingAdmissionPolicyBinding{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicyBinding", "ValidatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," + if m.FailurePolicy != nil { + l = len(*m.FailurePolicy) + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicyBindingSpec) String() string { - if this == nil { - return "nil" + if m.NamespaceSelector != nil { + l = m.NamespaceSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) } - s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingSpec{`, - `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, - `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, - `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, - `ValidationActions:` + fmt.Sprintf("%v", this.ValidationActions) + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicyList) String() string { - if this == nil { - return "nil" + if m.SideEffects != nil { + l = len(*m.SideEffects) + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForItems := "[]ValidatingAdmissionPolicy{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicy", "ValidatingAdmissionPolicy", 1), `&`, ``, 1) + "," + if m.TimeoutSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicyList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ValidatingAdmissionPolicySpec) String() string { - if this == nil { - return "nil" + if len(m.AdmissionReviewVersions) > 0 { + for _, s := range m.AdmissionReviewVersions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForValidations := "[]Validation{" - for _, f := range this.Validations { - repeatedStringForValidations += strings.Replace(strings.Replace(f.String(), "Validation", "Validation", 1), `&`, ``, 1) + "," + if m.MatchPolicy != nil { + l = len(*m.MatchPolicy) + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForValidations += "}" - repeatedStringForAuditAnnotations := "[]AuditAnnotation{" - for _, f := range this.AuditAnnotations { - repeatedStringForAuditAnnotations += strings.Replace(strings.Replace(f.String(), "AuditAnnotation", "AuditAnnotation", 1), `&`, ``, 1) + "," + if m.ObjectSelector != nil { + l = m.ObjectSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) } - repeatedStringForAuditAnnotations += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + if len(m.MatchConditions) > 0 { + for _, e := range m.MatchConditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } } - repeatedStringForMatchConditions += "}" - repeatedStringForVariables := "[]Variable{" - for _, f := range this.Variables { - repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + return n +} + +func (m *ValidatingWebhookConfiguration) Size() (n int) { + if m == nil { + return 0 } - repeatedStringForVariables += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicySpec{`, - `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, - `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, - `Validations:` + repeatedStringForValidations + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, - `AuditAnnotations:` + repeatedStringForAuditAnnotations + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, - `Variables:` + repeatedStringForVariables + `,`, + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Webhooks) > 0 { + for _, e := range m.Webhooks { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ValidatingWebhookConfigurationList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *Validation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + if m.Reason != nil { + l = len(*m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.MessageExpression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Variable) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *WebhookClientConfig) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Service != nil { + l = m.Service.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.CABundle != nil { + l = len(m.CABundle) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.URL != nil { + l = len(*m.URL) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ApplyConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ApplyConfiguration{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, `}`, }, "") return s } -func (this *ValidatingAdmissionPolicyStatus) String() string { +func (this *AuditAnnotation) String() string { if this == nil { return "nil" } - repeatedStringForConditions := "[]Condition{" - for _, f := range this.Conditions { - repeatedStringForConditions += fmt.Sprintf("%v", f) + "," - } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&ValidatingAdmissionPolicyStatus{`, - `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, - `TypeChecking:` + strings.Replace(this.TypeChecking.String(), "TypeChecking", "TypeChecking", 1) + `,`, - `Conditions:` + repeatedStringForConditions + `,`, + s := strings.Join([]string{`&AuditAnnotation{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `ValueExpression:` + fmt.Sprintf("%v", this.ValueExpression) + `,`, `}`, }, "") return s } -func (this *ValidatingWebhook) String() string { +func (this *ExpressionWarning) String() string { if this == nil { return "nil" } - repeatedStringForRules := "[]RuleWithOperations{" - for _, f := range this.Rules { - repeatedStringForRules += fmt.Sprintf("%v", f) + "," + s := strings.Join([]string{`&ExpressionWarning{`, + `FieldRef:` + fmt.Sprintf("%v", this.FieldRef) + `,`, + `Warning:` + fmt.Sprintf("%v", this.Warning) + `,`, + `}`, + }, "") + return s +} +func (this *JSONPatch) String() string { + if this == nil { + return "nil" } - repeatedStringForRules += "}" - repeatedStringForMatchConditions := "[]MatchCondition{" - for _, f := range this.MatchConditions { - repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + s := strings.Join([]string{`&JSONPatch{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *MatchCondition) String() string { + if this == nil { + return "nil" } - repeatedStringForMatchConditions += "}" - s := strings.Join([]string{`&ValidatingWebhook{`, + s := strings.Join([]string{`&MatchCondition{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, - `Rules:` + repeatedStringForRules + `,`, - `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *MatchResources) String() string { + if this == nil { + return "nil" + } + repeatedStringForResourceRules := "[]NamedRuleWithOperations{" + for _, f := range this.ResourceRules { + repeatedStringForResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + } + repeatedStringForResourceRules += "}" + repeatedStringForExcludeResourceRules := "[]NamedRuleWithOperations{" + for _, f := range this.ExcludeResourceRules { + repeatedStringForExcludeResourceRules += strings.Replace(strings.Replace(f.String(), "NamedRuleWithOperations", "NamedRuleWithOperations", 1), `&`, ``, 1) + "," + } + repeatedStringForExcludeResourceRules += "}" + s := strings.Join([]string{`&MatchResources{`, `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, - `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, - `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, - `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, - `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `ResourceRules:` + repeatedStringForResourceRules + `,`, + `ExcludeResourceRules:` + repeatedStringForExcludeResourceRules + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, `}`, }, "") return s } -func (this *ValidatingWebhookConfiguration) String() string { +func (this *MutatingAdmissionPolicy) String() string { if this == nil { return "nil" } - repeatedStringForWebhooks := "[]ValidatingWebhook{" - for _, f := range this.Webhooks { - repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "ValidatingWebhook", "ValidatingWebhook", 1), `&`, ``, 1) + "," + s := strings.Join([]string{`&MutatingAdmissionPolicy{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "MutatingAdmissionPolicySpec", "MutatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *MutatingAdmissionPolicyBinding) String() string { + if this == nil { + return "nil" } - repeatedStringForWebhooks += "}" - s := strings.Join([]string{`&ValidatingWebhookConfiguration{`, + s := strings.Join([]string{`&MutatingAdmissionPolicyBinding{`, `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Webhooks:` + repeatedStringForWebhooks + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "MutatingAdmissionPolicyBindingSpec", "MutatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, `}`, }, "") return s } -func (this *ValidatingWebhookConfigurationList) String() string { +func (this *MutatingAdmissionPolicyBindingList) String() string { if this == nil { return "nil" } - repeatedStringForItems := "[]ValidatingWebhookConfiguration{" + repeatedStringForItems := "[]MutatingAdmissionPolicyBinding{" for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingWebhookConfiguration", "ValidatingWebhookConfiguration", 1), `&`, ``, 1) + "," + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingAdmissionPolicyBinding", "MutatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," } repeatedStringForItems += "}" - s := strings.Join([]string{`&ValidatingWebhookConfigurationList{`, + s := strings.Join([]string{`&MutatingAdmissionPolicyBindingList{`, `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, `Items:` + repeatedStringForItems + `,`, `}`, }, "") return s } -func (this *Validation) String() string { +func (this *MutatingAdmissionPolicyBindingSpec) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&Validation{`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `Message:` + fmt.Sprintf("%v", this.Message) + `,`, - `Reason:` + valueToStringGenerated(this.Reason) + `,`, - `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + s := strings.Join([]string{`&MutatingAdmissionPolicyBindingSpec{`, + `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, + `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, + `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, `}`, }, "") return s } -func (this *Variable) String() string { +func (this *MutatingAdmissionPolicyList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]MutatingAdmissionPolicy{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingAdmissionPolicy", "MutatingAdmissionPolicy", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&MutatingAdmissionPolicyList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *MutatingAdmissionPolicySpec) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&Variable{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, - `}`, - }, "") - return s -} -func (this *WebhookClientConfig) String() string { - if this == nil { - return "nil" + repeatedStringForVariables := "[]Variable{" + for _, f := range this.Variables { + repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + } + repeatedStringForVariables += "}" + repeatedStringForMutations := "[]Mutation{" + for _, f := range this.Mutations { + repeatedStringForMutations += strings.Replace(strings.Replace(f.String(), "Mutation", "Mutation", 1), `&`, ``, 1) + "," + } + repeatedStringForMutations += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&MutatingAdmissionPolicySpec{`, + `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, + `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, + `Variables:` + repeatedStringForVariables + `,`, + `Mutations:` + repeatedStringForMutations + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `ReinvocationPolicy:` + fmt.Sprintf("%v", this.ReinvocationPolicy) + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhook) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]RuleWithOperations{" + for _, f := range this.Rules { + repeatedStringForRules += fmt.Sprintf("%v", f) + "," + } + repeatedStringForRules += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&MutatingWebhook{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, + `Rules:` + repeatedStringForRules + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, + `ReinvocationPolicy:` + valueToStringGenerated(this.ReinvocationPolicy) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhookConfiguration) String() string { + if this == nil { + return "nil" + } + repeatedStringForWebhooks := "[]MutatingWebhook{" + for _, f := range this.Webhooks { + repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "MutatingWebhook", "MutatingWebhook", 1), `&`, ``, 1) + "," + } + repeatedStringForWebhooks += "}" + s := strings.Join([]string{`&MutatingWebhookConfiguration{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Webhooks:` + repeatedStringForWebhooks + `,`, + `}`, + }, "") + return s +} +func (this *MutatingWebhookConfigurationList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]MutatingWebhookConfiguration{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "MutatingWebhookConfiguration", "MutatingWebhookConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&MutatingWebhookConfigurationList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *Mutation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Mutation{`, + `PatchType:` + fmt.Sprintf("%v", this.PatchType) + `,`, + `ApplyConfiguration:` + strings.Replace(this.ApplyConfiguration.String(), "ApplyConfiguration", "ApplyConfiguration", 1) + `,`, + `JSONPatch:` + strings.Replace(this.JSONPatch.String(), "JSONPatch", "JSONPatch", 1) + `,`, + `}`, + }, "") + return s +} +func (this *NamedRuleWithOperations) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NamedRuleWithOperations{`, + `ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`, + `RuleWithOperations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.RuleWithOperations), "RuleWithOperations", "v11.RuleWithOperations", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ParamKind) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ParamKind{`, + `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `}`, + }, "") + return s +} +func (this *ParamRef) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ParamRef{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `ParameterNotFoundAction:` + valueToStringGenerated(this.ParameterNotFoundAction) + `,`, + `}`, + }, "") + return s +} +func (this *ServiceReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ServiceReference{`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Path:` + valueToStringGenerated(this.Path) + `,`, + `Port:` + valueToStringGenerated(this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *TypeChecking) String() string { + if this == nil { + return "nil" + } + repeatedStringForExpressionWarnings := "[]ExpressionWarning{" + for _, f := range this.ExpressionWarnings { + repeatedStringForExpressionWarnings += strings.Replace(strings.Replace(f.String(), "ExpressionWarning", "ExpressionWarning", 1), `&`, ``, 1) + "," + } + repeatedStringForExpressionWarnings += "}" + s := strings.Join([]string{`&TypeChecking{`, + `ExpressionWarnings:` + repeatedStringForExpressionWarnings + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicy{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicySpec", "ValidatingAdmissionPolicySpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ValidatingAdmissionPolicyStatus", "ValidatingAdmissionPolicyStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBinding) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicyBinding{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ValidatingAdmissionPolicyBindingSpec", "ValidatingAdmissionPolicyBindingSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBindingList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingAdmissionPolicyBinding{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicyBinding", "ValidatingAdmissionPolicyBinding", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyBindingSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ValidatingAdmissionPolicyBindingSpec{`, + `PolicyName:` + fmt.Sprintf("%v", this.PolicyName) + `,`, + `ParamRef:` + strings.Replace(this.ParamRef.String(), "ParamRef", "ParamRef", 1) + `,`, + `MatchResources:` + strings.Replace(this.MatchResources.String(), "MatchResources", "MatchResources", 1) + `,`, + `ValidationActions:` + fmt.Sprintf("%v", this.ValidationActions) + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingAdmissionPolicy{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingAdmissionPolicy", "ValidatingAdmissionPolicy", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicySpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForValidations := "[]Validation{" + for _, f := range this.Validations { + repeatedStringForValidations += strings.Replace(strings.Replace(f.String(), "Validation", "Validation", 1), `&`, ``, 1) + "," + } + repeatedStringForValidations += "}" + repeatedStringForAuditAnnotations := "[]AuditAnnotation{" + for _, f := range this.AuditAnnotations { + repeatedStringForAuditAnnotations += strings.Replace(strings.Replace(f.String(), "AuditAnnotation", "AuditAnnotation", 1), `&`, ``, 1) + "," + } + repeatedStringForAuditAnnotations += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + repeatedStringForVariables := "[]Variable{" + for _, f := range this.Variables { + repeatedStringForVariables += strings.Replace(strings.Replace(f.String(), "Variable", "Variable", 1), `&`, ``, 1) + "," + } + repeatedStringForVariables += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicySpec{`, + `ParamKind:` + strings.Replace(this.ParamKind.String(), "ParamKind", "ParamKind", 1) + `,`, + `MatchConstraints:` + strings.Replace(this.MatchConstraints.String(), "MatchResources", "MatchResources", 1) + `,`, + `Validations:` + repeatedStringForValidations + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `AuditAnnotations:` + repeatedStringForAuditAnnotations + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `Variables:` + repeatedStringForVariables + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingAdmissionPolicyStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&ValidatingAdmissionPolicyStatus{`, + `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, + `TypeChecking:` + strings.Replace(this.TypeChecking.String(), "TypeChecking", "TypeChecking", 1) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhook) String() string { + if this == nil { + return "nil" + } + repeatedStringForRules := "[]RuleWithOperations{" + for _, f := range this.Rules { + repeatedStringForRules += fmt.Sprintf("%v", f) + "," + } + repeatedStringForRules += "}" + repeatedStringForMatchConditions := "[]MatchCondition{" + for _, f := range this.MatchConditions { + repeatedStringForMatchConditions += strings.Replace(strings.Replace(f.String(), "MatchCondition", "MatchCondition", 1), `&`, ``, 1) + "," + } + repeatedStringForMatchConditions += "}" + s := strings.Join([]string{`&ValidatingWebhook{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ClientConfig:` + strings.Replace(strings.Replace(this.ClientConfig.String(), "WebhookClientConfig", "WebhookClientConfig", 1), `&`, ``, 1) + `,`, + `Rules:` + repeatedStringForRules + `,`, + `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, + `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, + `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, + `AdmissionReviewVersions:` + fmt.Sprintf("%v", this.AdmissionReviewVersions) + `,`, + `MatchPolicy:` + valueToStringGenerated(this.MatchPolicy) + `,`, + `ObjectSelector:` + strings.Replace(fmt.Sprintf("%v", this.ObjectSelector), "LabelSelector", "v1.LabelSelector", 1) + `,`, + `MatchConditions:` + repeatedStringForMatchConditions + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhookConfiguration) String() string { + if this == nil { + return "nil" + } + repeatedStringForWebhooks := "[]ValidatingWebhook{" + for _, f := range this.Webhooks { + repeatedStringForWebhooks += strings.Replace(strings.Replace(f.String(), "ValidatingWebhook", "ValidatingWebhook", 1), `&`, ``, 1) + "," + } + repeatedStringForWebhooks += "}" + s := strings.Join([]string{`&ValidatingWebhookConfiguration{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Webhooks:` + repeatedStringForWebhooks + `,`, + `}`, + }, "") + return s +} +func (this *ValidatingWebhookConfigurationList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ValidatingWebhookConfiguration{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ValidatingWebhookConfiguration", "ValidatingWebhookConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ValidatingWebhookConfigurationList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *Validation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Validation{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `Reason:` + valueToStringGenerated(this.Reason) + `,`, + `MessageExpression:` + fmt.Sprintf("%v", this.MessageExpression) + `,`, + `}`, + }, "") + return s +} +func (this *Variable) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Variable{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *WebhookClientConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&WebhookClientConfig{`, + `Service:` + strings.Replace(this.Service.String(), "ServiceReference", "ServiceReference", 1) + `,`, + `CABundle:` + valueToStringGenerated(this.CABundle) + `,`, + `URL:` + valueToStringGenerated(this.URL) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *ApplyConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplyConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplyConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AuditAnnotation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AuditAnnotation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValueExpression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValueExpression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExpressionWarning: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExpressionWarning: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FieldRef = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Warning", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Warning = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *JSONPatch) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: JSONPatch: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: JSONPatch: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MatchCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MatchCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MatchCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MatchResources) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MatchResources: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MatchResources: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NamespaceSelector == nil { + m.NamespaceSelector = &v1.LabelSelector{} + } + if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ObjectSelector == nil { + m.ObjectSelector = &v1.LabelSelector{} + } + if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceRules = append(m.ResourceRules, NamedRuleWithOperations{}) + if err := m.ResourceRules[len(m.ResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeResourceRules", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludeResourceRules = append(m.ExcludeResourceRules, NamedRuleWithOperations{}) + if err := m.ExcludeResourceRules[len(m.ExcludeResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := MatchPolicyType(dAtA[iNdEx:postIndex]) + m.MatchPolicy = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MutatingAdmissionPolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingAdmissionPolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingAdmissionPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF } - s := strings.Join([]string{`&WebhookClientConfig{`, - `Service:` + strings.Replace(this.Service.String(), "ServiceReference", "ServiceReference", 1) + `,`, - `CABundle:` + valueToStringGenerated(this.CABundle) + `,`, - `URL:` + valueToStringGenerated(this.URL) + `,`, - `}`, - }, "") - return s + return nil } -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" +func (m *MutatingAdmissionPolicyBinding) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MutatingAdmissionPolicyBinding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MutatingAdmissionPolicyBinding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil } -func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicyBindingList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3273,17 +5243,17 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AuditAnnotation: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AuditAnnotation: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3293,29 +5263,30 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = string(dAtA[iNdEx:postIndex]) + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValueExpression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3325,23 +5296,25 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.ValueExpression = string(dAtA[iNdEx:postIndex]) + m.Items = append(m.Items, MutatingAdmissionPolicyBinding{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3364,7 +5337,7 @@ func (m *AuditAnnotation) Unmarshal(dAtA []byte) error { } return nil } -func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicyBindingSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3387,15 +5360,15 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ExpressionWarning: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingSpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ExpressionWarning: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicyBindingSpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PolicyName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3423,13 +5396,49 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.FieldRef = string(dAtA[iNdEx:postIndex]) + m.PolicyName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ParamRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ParamRef == nil { + m.ParamRef = &ParamRef{} + } + if err := m.ParamRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Warning", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MatchResources", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3439,23 +5448,27 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Warning = string(dAtA[iNdEx:postIndex]) + if m.MatchResources == nil { + m.MatchResources = &MatchResources{} + } + if err := m.MatchResources.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3478,7 +5491,7 @@ func (m *ExpressionWarning) Unmarshal(dAtA []byte) error { } return nil } -func (m *MatchCondition) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicyList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3501,17 +5514,17 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MatchCondition: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicyList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MatchCondition: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicyList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3521,29 +5534,30 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3553,23 +5567,25 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Expression = string(dAtA[iNdEx:postIndex]) + m.Items = append(m.Items, MutatingAdmissionPolicy{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3592,7 +5608,7 @@ func (m *MatchCondition) Unmarshal(dAtA []byte) error { } return nil } -func (m *MatchResources) Unmarshal(dAtA []byte) error { +func (m *MutatingAdmissionPolicySpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3615,15 +5631,15 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MatchResources: wiretype end group for non-group") + return fmt.Errorf("proto: MutatingAdmissionPolicySpec: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MatchResources: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MutatingAdmissionPolicySpec: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NamespaceSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ParamKind", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3650,16 +5666,16 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.NamespaceSelector == nil { - m.NamespaceSelector = &v1.LabelSelector{} + if m.ParamKind == nil { + m.ParamKind = &ParamKind{} } - if err := m.NamespaceSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ParamKind.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectSelector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MatchConstraints", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3686,16 +5702,16 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ObjectSelector == nil { - m.ObjectSelector = &v1.LabelSelector{} + if m.MatchConstraints == nil { + m.MatchConstraints = &MatchResources{} } - if err := m.ObjectSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.MatchConstraints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceRules", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Variables", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3722,14 +5738,14 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceRules = append(m.ResourceRules, NamedRuleWithOperations{}) - if err := m.ResourceRules[len(m.ResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Variables = append(m.Variables, Variable{}) + if err := m.Variables[len(m.Variables)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeResourceRules", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Mutations", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3756,14 +5772,81 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExcludeResourceRules = append(m.ExcludeResourceRules, NamedRuleWithOperations{}) - if err := m.ExcludeResourceRules[len(m.ExcludeResourceRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Mutations = append(m.Mutations, Mutation{}) + if err := m.Mutations[len(m.Mutations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FailurePolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FailurePolicyType(dAtA[iNdEx:postIndex]) + m.FailurePolicy = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchConditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MatchConditions = append(m.MatchConditions, MatchCondition{}) + if err := m.MatchConditions[len(m.MatchConditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MatchPolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ReinvocationPolicy", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3791,8 +5874,7 @@ func (m *MatchResources) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := MatchPolicyType(dAtA[iNdEx:postIndex]) - m.MatchPolicy = &s + m.ReinvocationPolicy = k8s_io_api_admissionregistration_v1.ReinvocationPolicyType(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -4160,7 +6242,7 @@ func (m *MutatingWebhook) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := ReinvocationPolicyType(dAtA[iNdEx:postIndex]) + s := k8s_io_api_admissionregistration_v1.ReinvocationPolicyType(dAtA[iNdEx:postIndex]) m.ReinvocationPolicy = &s iNdEx = postIndex case 11: @@ -4488,6 +6570,160 @@ func (m *MutatingWebhookConfigurationList) Unmarshal(dAtA []byte) error { } return nil } +func (m *Mutation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mutation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mutation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PatchType = PatchType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApplyConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ApplyConfiguration == nil { + m.ApplyConfiguration = &ApplyConfiguration{} + } + if err := m.ApplyConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JSONPatch", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.JSONPatch == nil { + m.JSONPatch = &JSONPatch{} + } + if err := m.JSONPatch.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NamedRuleWithOperations) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto index 30f99f64d0..fb47a20056 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto @@ -29,6 +29,51 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". option go_package = "k8s.io/api/admissionregistration/v1beta1"; +// ApplyConfiguration defines the desired configuration values of an object. +message ApplyConfiguration { + // expression will be evaluated by CEL to create an apply configuration. + // ref: https://github.com/google/cel-spec + // + // Apply configurations are declared in CEL using object initialization. For example, this CEL expression + // returns an apply configuration to set a single field: + // + // Object{ + // spec: Object.spec{ + // serviceAccountName: "example" + // } + // } + // + // Apply configurations may not modify atomic structs, maps or arrays due to the risk of accidental deletion of + // values not included in the apply configuration. + // + // CEL expressions have access to the object types needed to create apply configurations: + // + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // The `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the + // object. No other metadata properties are accessible. + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + optional string expression = 1; +} + // AuditAnnotation describes how to produce an audit annotation for an API request. message AuditAnnotation { // key specifies the audit annotation key. The audit annotation keys of @@ -79,6 +124,75 @@ message ExpressionWarning { optional string warning = 3; } +// JSONPatch defines a JSON Patch. +message JSONPatch { + // expression will be evaluated by CEL to create a [JSON patch](https://jsonpatch.com/). + // ref: https://github.com/google/cel-spec + // + // expression must return an array of JSONPatch values. + // + // For example, this CEL expression returns a JSON patch to conditionally modify a value: + // + // [ + // JSONPatch{op: "test", path: "/spec/example", value: "Red"}, + // JSONPatch{op: "replace", path: "/spec/example", value: "Green"} + // ] + // + // To define an object for the patch value, use Object types. For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/spec/selector", + // value: Object.spec.selector{matchLabels: {"environment": "test"}} + // } + // ] + // + // To use strings containing '/' and '~' as JSONPatch path keys, use "jsonpatch.escapeKey". For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/metadata/labels/" + jsonpatch.escapeKey("example.com/environment"), + // value: "test" + // }, + // ] + // + // CEL expressions have access to the types needed to create JSON patches and objects: + // + // - 'JSONPatch' - CEL type of JSON Patch operations. JSONPatch has the fields 'op', 'from', 'path' and 'value'. + // See [JSON patch](https://jsonpatch.com/) for more details. The 'value' field may be set to any of: string, + // integer, array, map or object. If set, the 'path' and 'from' fields must be set to a + // [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901/) string, where the 'jsonpatch.escapeKey()' CEL + // function may be used to escape path keys containing '/' and '~'. + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // CEL expressions have access to [Kubernetes CEL function libraries](https://kubernetes.io/docs/reference/using-api/cel/#cel-options-language-features-and-libraries) + // as well as: + // + // - 'jsonpatch.escapeKey' - Performs JSONPatch key escaping. '~' and '/' are escaped as '~0' and `~1' respectively). + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + optional string expression = 1; +} + // MatchCondition represents a condition which must be fulfilled for a request to be sent to a webhook. message MatchCondition { // Name is an identifier for this match condition, used for strategic merging of MatchConditions, @@ -203,6 +317,173 @@ message MatchResources { optional string matchPolicy = 7; } +// MutatingAdmissionPolicy describes the definition of an admission mutation policy that mutates the object coming into admission chain. +message MutatingAdmissionPolicy { + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the MutatingAdmissionPolicy. + optional MutatingAdmissionPolicySpec spec = 2; +} + +// MutatingAdmissionPolicyBinding binds the MutatingAdmissionPolicy with parametrized resources. +// MutatingAdmissionPolicyBinding and the optional parameter resource together define how cluster administrators +// configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// Each evaluation is constrained by a [runtime cost budget](https://kubernetes.io/docs/reference/using-api/cel/#runtime-cost-budget). +// +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. +message MutatingAdmissionPolicyBinding { + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the desired behavior of the MutatingAdmissionPolicyBinding. + optional MutatingAdmissionPolicyBindingSpec spec = 2; +} + +// MutatingAdmissionPolicyBindingList is a list of MutatingAdmissionPolicyBinding. +message MutatingAdmissionPolicyBindingList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of PolicyBinding. + repeated MutatingAdmissionPolicyBinding items = 2; +} + +// MutatingAdmissionPolicyBindingSpec is the specification of the MutatingAdmissionPolicyBinding. +message MutatingAdmissionPolicyBindingSpec { + // policyName references a MutatingAdmissionPolicy name which the MutatingAdmissionPolicyBinding binds to. + // If the referenced resource does not exist, this binding is considered invalid and will be ignored + // Required. + optional string policyName = 1; + + // paramRef specifies the parameter resource used to configure the admission control policy. + // It should point to a resource of the type specified in spec.ParamKind of the bound MutatingAdmissionPolicy. + // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the MutatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. + // +optional + optional ParamRef paramRef = 2; + + // matchResources limits what resources match this binding and may be mutated by it. + // Note that if matchResources matches a resource, the resource must also match a policy's matchConstraints and + // matchConditions before the resource may be mutated. + // When matchResources is unset, it does not constrain resource matching, and only the policy's matchConstraints + // and matchConditions must match for the resource to be mutated. + // Additionally, matchResources.resourceRules are optional and do not constraint matching when unset. + // Note that this is differs from MutatingAdmissionPolicy matchConstraints, where resourceRules are required. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // +optional + optional MatchResources matchResources = 3; +} + +// MutatingAdmissionPolicyList is a list of MutatingAdmissionPolicy. +message MutatingAdmissionPolicyList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // List of ValidatingAdmissionPolicy. + repeated MutatingAdmissionPolicy items = 2; +} + +// MutatingAdmissionPolicySpec is the specification of the desired behavior of the admission policy. +message MutatingAdmissionPolicySpec { + // paramKind specifies the kind of resources used to parameterize this policy. + // If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. + // If paramKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. + // If paramKind is specified but paramRef is unset in MutatingAdmissionPolicyBinding, the params variable will be null. + // +optional + optional ParamKind paramKind = 1; + + // matchConstraints specifies what resources this policy is designed to validate. + // The MutatingAdmissionPolicy cares about a request if it matches _all_ Constraints. + // However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API + // MutatingAdmissionPolicy cannot match MutatingAdmissionPolicy and MutatingAdmissionPolicyBinding. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // Required. + optional MatchResources matchConstraints = 2; + + // variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except matchConditions because matchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, variables must be sorted by the order of first appearance and acyclic. + // +listType=atomic + // +optional + repeated Variable variables = 3; + + // mutations contain operations to perform on matching objects. + // mutations may not be empty; a minimum of one mutation is required. + // mutations are evaluated in order, and are reinvoked according to + // the reinvocationPolicy. + // The mutations of a policy are invoked for each binding of this policy + // and reinvocation of mutations occurs on a per binding basis. + // + // +listType=atomic + // +optional + repeated Mutation mutations = 4; + + // failurePolicy defines how to handle failures for the admission policy. Failures can + // occur from CEL expression parse errors, type check errors, runtime errors and invalid + // or mis-configured policy definitions or bindings. + // + // A policy is invalid if paramKind refers to a non-existent Kind. + // A binding is invalid if paramRef.name refers to a non-existent resource. + // + // failurePolicy does not define how validations that evaluate to false are handled. + // + // Allowed values are Ignore or Fail. Defaults to Fail. + // +optional + optional string failurePolicy = 5; + + // matchConditions is a list of conditions that must be met for a request to be validated. + // Match conditions filter requests that have already been matched by the matchConstraints. + // An empty list of matchConditions matches all requests. + // There are a maximum of 64 match conditions allowed. + // + // If a parameter object is provided, it can be accessed via the `params` handle in the same + // manner as validation expressions. + // + // The exact matching logic is (in order): + // 1. If ANY matchCondition evaluates to FALSE, the policy is skipped. + // 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated. + // 3. If any matchCondition evaluates to an error (but none are FALSE): + // - If failurePolicy=Fail, reject the request + // - If failurePolicy=Ignore, the policy is skipped + // + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + repeated MatchCondition matchConditions = 6; + + // reinvocationPolicy indicates whether mutations may be called multiple times per MutatingAdmissionPolicyBinding + // as part of a single admission evaluation. + // Allowed values are "Never" and "IfNeeded". + // + // Never: These mutations will not be called more than once per binding in a single admission evaluation. + // + // IfNeeded: These mutations may be invoked more than once per binding for a single admission request and there is no guarantee of + // order with respect to other admission plugins, admission webhooks, bindings of this policy and admission policies. Mutations are only + // reinvoked when mutations change the object after this mutation is invoked. + // Required. + optional string reinvocationPolicy = 7; +} + // MutatingWebhook describes an admission webhook and the resources and operations it applies to. message MutatingWebhook { // The name of the admission webhook. @@ -401,6 +682,26 @@ message MutatingWebhookConfigurationList { repeated MutatingWebhookConfiguration items = 2; } +// Mutation specifies the CEL expression which is used to apply the Mutation. +message Mutation { + // patchType indicates the patch strategy used. + // Allowed values are "ApplyConfiguration" and "JSONPatch". + // Required. + // + // +unionDiscriminator + optional string patchType = 2; + + // applyConfiguration defines the desired configuration values of an object. + // The configuration is applied to the admission object using + // [structured merge diff](https://github.com/kubernetes-sigs/structured-merge-diff). + // A CEL expression is used to create apply configuration. + optional ApplyConfiguration applyConfiguration = 3; + + // jsonPatch defines a [JSON patch](https://jsonpatch.com/) operation to perform a mutation to the object. + // A CEL expression is used to create the JSON patch. + optional JSONPatch jsonPatch = 4; +} + // NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames. // +structType=atomic message NamedRuleWithOperations { diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/register.go b/vendor/k8s.io/api/admissionregistration/v1beta1/register.go index 363233a2f9..be64c4a5fa 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/register.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/register.go @@ -54,6 +54,10 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ValidatingAdmissionPolicyList{}, &ValidatingAdmissionPolicyBinding{}, &ValidatingAdmissionPolicyBindingList{}, + &MutatingAdmissionPolicy{}, + &MutatingAdmissionPolicyList{}, + &MutatingAdmissionPolicyBinding{}, + &MutatingAdmissionPolicyBindingList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go index 0f59031239..cffdda82c9 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go @@ -1073,7 +1073,7 @@ type MutatingWebhook struct { } // ReinvocationPolicyType specifies what type of policy the admission hook uses. -type ReinvocationPolicyType string +type ReinvocationPolicyType = v1.ReinvocationPolicyType const ( // NeverReinvocationPolicy indicates that the webhook must not be called more than once in a @@ -1197,3 +1197,332 @@ type MatchCondition struct { // Required. Expression string `json:"expression" protobuf:"bytes,2,opt,name=expression"` } + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicy describes the definition of an admission mutation policy that mutates the object coming into admission chain. +type MutatingAdmissionPolicy struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Specification of the desired behavior of the MutatingAdmissionPolicy. + Spec MutatingAdmissionPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicyList is a list of MutatingAdmissionPolicy. +type MutatingAdmissionPolicyList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of ValidatingAdmissionPolicy. + Items []MutatingAdmissionPolicy `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// MutatingAdmissionPolicySpec is the specification of the desired behavior of the admission policy. +type MutatingAdmissionPolicySpec struct { + // paramKind specifies the kind of resources used to parameterize this policy. + // If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. + // If paramKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. + // If paramKind is specified but paramRef is unset in MutatingAdmissionPolicyBinding, the params variable will be null. + // +optional + ParamKind *ParamKind `json:"paramKind,omitempty" protobuf:"bytes,1,rep,name=paramKind"` + + // matchConstraints specifies what resources this policy is designed to validate. + // The MutatingAdmissionPolicy cares about a request if it matches _all_ Constraints. + // However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API + // MutatingAdmissionPolicy cannot match MutatingAdmissionPolicy and MutatingAdmissionPolicyBinding. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // Required. + MatchConstraints *MatchResources `json:"matchConstraints,omitempty" protobuf:"bytes,2,rep,name=matchConstraints"` + + // variables contain definitions of variables that can be used in composition of other expressions. + // Each variable is defined as a named CEL expression. + // The variables defined here will be available under `variables` in other expressions of the policy + // except matchConditions because matchConditions are evaluated before the rest of the policy. + // + // The expression of a variable can refer to other variables defined earlier in the list but not those after. + // Thus, variables must be sorted by the order of first appearance and acyclic. + // +listType=atomic + // +optional + Variables []Variable `json:"variables,omitempty" protobuf:"bytes,3,rep,name=variables"` + + // mutations contain operations to perform on matching objects. + // mutations may not be empty; a minimum of one mutation is required. + // mutations are evaluated in order, and are reinvoked according to + // the reinvocationPolicy. + // The mutations of a policy are invoked for each binding of this policy + // and reinvocation of mutations occurs on a per binding basis. + // + // +listType=atomic + // +optional + Mutations []Mutation `json:"mutations,omitempty" protobuf:"bytes,4,rep,name=mutations"` + + // failurePolicy defines how to handle failures for the admission policy. Failures can + // occur from CEL expression parse errors, type check errors, runtime errors and invalid + // or mis-configured policy definitions or bindings. + // + // A policy is invalid if paramKind refers to a non-existent Kind. + // A binding is invalid if paramRef.name refers to a non-existent resource. + // + // failurePolicy does not define how validations that evaluate to false are handled. + // + // Allowed values are Ignore or Fail. Defaults to Fail. + // +optional + FailurePolicy *FailurePolicyType `json:"failurePolicy,omitempty" protobuf:"bytes,5,opt,name=failurePolicy,casttype=FailurePolicyType"` + + // matchConditions is a list of conditions that must be met for a request to be validated. + // Match conditions filter requests that have already been matched by the matchConstraints. + // An empty list of matchConditions matches all requests. + // There are a maximum of 64 match conditions allowed. + // + // If a parameter object is provided, it can be accessed via the `params` handle in the same + // manner as validation expressions. + // + // The exact matching logic is (in order): + // 1. If ANY matchCondition evaluates to FALSE, the policy is skipped. + // 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated. + // 3. If any matchCondition evaluates to an error (but none are FALSE): + // - If failurePolicy=Fail, reject the request + // - If failurePolicy=Ignore, the policy is skipped + // + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +optional + MatchConditions []MatchCondition `json:"matchConditions,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,6,rep,name=matchConditions"` + + // reinvocationPolicy indicates whether mutations may be called multiple times per MutatingAdmissionPolicyBinding + // as part of a single admission evaluation. + // Allowed values are "Never" and "IfNeeded". + // + // Never: These mutations will not be called more than once per binding in a single admission evaluation. + // + // IfNeeded: These mutations may be invoked more than once per binding for a single admission request and there is no guarantee of + // order with respect to other admission plugins, admission webhooks, bindings of this policy and admission policies. Mutations are only + // reinvoked when mutations change the object after this mutation is invoked. + // Required. + ReinvocationPolicy ReinvocationPolicyType `json:"reinvocationPolicy,omitempty" protobuf:"bytes,7,opt,name=reinvocationPolicy,casttype=ReinvocationPolicyType"` +} + +// Mutation specifies the CEL expression which is used to apply the Mutation. +type Mutation struct { + // patchType indicates the patch strategy used. + // Allowed values are "ApplyConfiguration" and "JSONPatch". + // Required. + // + // +unionDiscriminator + PatchType PatchType `json:"patchType" protobuf:"bytes,2,opt,name=patchType,casttype=PatchType"` + + // applyConfiguration defines the desired configuration values of an object. + // The configuration is applied to the admission object using + // [structured merge diff](https://github.com/kubernetes-sigs/structured-merge-diff). + // A CEL expression is used to create apply configuration. + ApplyConfiguration *ApplyConfiguration `json:"applyConfiguration,omitempty" protobuf:"bytes,3,opt,name=applyConfiguration"` + + // jsonPatch defines a [JSON patch](https://jsonpatch.com/) operation to perform a mutation to the object. + // A CEL expression is used to create the JSON patch. + JSONPatch *JSONPatch `json:"jsonPatch,omitempty" protobuf:"bytes,4,opt,name=jsonPatch"` +} + +// PatchType specifies the type of patch operation for a mutation. +// +enum +type PatchType string + +const ( + // ApplyConfiguration indicates that the mutation is using apply configuration to mutate the object. + PatchTypeApplyConfiguration PatchType = "ApplyConfiguration" + // JSONPatch indicates that the object is mutated through JSON Patch. + PatchTypeJSONPatch PatchType = "JSONPatch" +) + +// ApplyConfiguration defines the desired configuration values of an object. +type ApplyConfiguration struct { + // expression will be evaluated by CEL to create an apply configuration. + // ref: https://github.com/google/cel-spec + // + // Apply configurations are declared in CEL using object initialization. For example, this CEL expression + // returns an apply configuration to set a single field: + // + // Object{ + // spec: Object.spec{ + // serviceAccountName: "example" + // } + // } + // + // Apply configurations may not modify atomic structs, maps or arrays due to the risk of accidental deletion of + // values not included in the apply configuration. + // + // CEL expressions have access to the object types needed to create apply configurations: + // + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // The `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the + // object. No other metadata properties are accessible. + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + Expression string `json:"expression,omitempty" protobuf:"bytes,1,opt,name=expression"` +} + +// JSONPatch defines a JSON Patch. +type JSONPatch struct { + // expression will be evaluated by CEL to create a [JSON patch](https://jsonpatch.com/). + // ref: https://github.com/google/cel-spec + // + // expression must return an array of JSONPatch values. + // + // For example, this CEL expression returns a JSON patch to conditionally modify a value: + // + // [ + // JSONPatch{op: "test", path: "/spec/example", value: "Red"}, + // JSONPatch{op: "replace", path: "/spec/example", value: "Green"} + // ] + // + // To define an object for the patch value, use Object types. For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/spec/selector", + // value: Object.spec.selector{matchLabels: {"environment": "test"}} + // } + // ] + // + // To use strings containing '/' and '~' as JSONPatch path keys, use "jsonpatch.escapeKey". For example: + // + // [ + // JSONPatch{ + // op: "add", + // path: "/metadata/labels/" + jsonpatch.escapeKey("example.com/environment"), + // value: "test" + // }, + // ] + // + // CEL expressions have access to the types needed to create JSON patches and objects: + // + // - 'JSONPatch' - CEL type of JSON Patch operations. JSONPatch has the fields 'op', 'from', 'path' and 'value'. + // See [JSON patch](https://jsonpatch.com/) for more details. The 'value' field may be set to any of: string, + // integer, array, map or object. If set, the 'path' and 'from' fields must be set to a + // [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901/) string, where the 'jsonpatch.escapeKey()' CEL + // function may be used to escape path keys containing '/' and '~'. + // - 'Object' - CEL type of the resource object. + // - 'Object.' - CEL type of object field (such as 'Object.spec') + // - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers') + // + // CEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables: + // + // - 'object' - The object from the incoming request. The value is null for DELETE requests. + // - 'oldObject' - The existing object. The value is null for CREATE requests. + // - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). + // - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. + // - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. + // - 'variables' - Map of composited variables, from its name to its lazily evaluated value. + // For example, a variable named 'foo' can be accessed as 'variables.foo'. + // - 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request. + // See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz + // - 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the + // request resource. + // + // CEL expressions have access to [Kubernetes CEL function libraries](https://kubernetes.io/docs/reference/using-api/cel/#cel-options-language-features-and-libraries) + // as well as: + // + // - 'jsonpatch.escapeKey' - Performs JSONPatch key escaping. '~' and '/' are escaped as '~0' and `~1' respectively). + // + // + // Only property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. + // Required. + Expression string `json:"expression,omitempty" protobuf:"bytes,1,opt,name=expression"` +} + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicyBinding binds the MutatingAdmissionPolicy with parametrized resources. +// MutatingAdmissionPolicyBinding and the optional parameter resource together define how cluster administrators +// configure policies for clusters. +// +// For a given admission request, each binding will cause its policy to be +// evaluated N times, where N is 1 for policies/bindings that don't use +// params, otherwise N is the number of parameters selected by the binding. +// Each evaluation is constrained by a [runtime cost budget](https://kubernetes.io/docs/reference/using-api/cel/#runtime-cost-budget). +// +// Adding/removing policies, bindings, or params can not affect whether a +// given (policy, binding, param) combination is within its own CEL budget. +type MutatingAdmissionPolicyBinding struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata. + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // Specification of the desired behavior of the MutatingAdmissionPolicyBinding. + Spec MutatingAdmissionPolicyBindingSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// MutatingAdmissionPolicyBindingList is a list of MutatingAdmissionPolicyBinding. +type MutatingAdmissionPolicyBindingList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + // List of PolicyBinding. + Items []MutatingAdmissionPolicyBinding `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// MutatingAdmissionPolicyBindingSpec is the specification of the MutatingAdmissionPolicyBinding. +type MutatingAdmissionPolicyBindingSpec struct { + // policyName references a MutatingAdmissionPolicy name which the MutatingAdmissionPolicyBinding binds to. + // If the referenced resource does not exist, this binding is considered invalid and will be ignored + // Required. + PolicyName string `json:"policyName,omitempty" protobuf:"bytes,1,rep,name=policyName"` + + // paramRef specifies the parameter resource used to configure the admission control policy. + // It should point to a resource of the type specified in spec.ParamKind of the bound MutatingAdmissionPolicy. + // If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the MutatingAdmissionPolicy applied. + // If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param. + // +optional + ParamRef *ParamRef `json:"paramRef,omitempty" protobuf:"bytes,2,rep,name=paramRef"` + + // matchResources limits what resources match this binding and may be mutated by it. + // Note that if matchResources matches a resource, the resource must also match a policy's matchConstraints and + // matchConditions before the resource may be mutated. + // When matchResources is unset, it does not constrain resource matching, and only the policy's matchConstraints + // and matchConditions must match for the resource to be mutated. + // Additionally, matchResources.resourceRules are optional and do not constraint matching when unset. + // Note that this is differs from MutatingAdmissionPolicy matchConstraints, where resourceRules are required. + // The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. + // '*' matches CREATE, UPDATE and CONNECT. + // +optional + MatchResources *MatchResources `json:"matchResources,omitempty" protobuf:"bytes,3,rep,name=matchResources"` +} diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go index cc1509b539..1a97c94729 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go @@ -27,6 +27,15 @@ package v1beta1 // Those methods can be generated by using hack/update-codegen.sh // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ApplyConfiguration = map[string]string{ + "": "ApplyConfiguration defines the desired configuration values of an object.", + "expression": "expression will be evaluated by CEL to create an apply configuration. ref: https://github.com/google/cel-spec\n\nApply configurations are declared in CEL using object initialization. For example, this CEL expression returns an apply configuration to set a single field:\n\n\tObject{\n\t spec: Object.spec{\n\t serviceAccountName: \"example\"\n\t }\n\t}\n\nApply configurations may not modify atomic structs, maps or arrays due to the risk of accidental deletion of values not included in the apply configuration.\n\nCEL expressions have access to the object types needed to create apply configurations:\n\n- 'Object' - CEL type of the resource object. - 'Object.' - CEL type of object field (such as 'Object.spec') - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers')\n\nCEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. - 'variables' - Map of composited variables, from its name to its lazily evaluated value.\n For example, a variable named 'foo' can be accessed as 'variables.foo'.\n- 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nThe `apiVersion`, `kind`, `metadata.name` and `metadata.generateName` are always accessible from the root of the object. No other metadata properties are accessible.\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Required.", +} + +func (ApplyConfiguration) SwaggerDoc() map[string]string { + return map_ApplyConfiguration +} + var map_AuditAnnotation = map[string]string{ "": "AuditAnnotation describes how to produce an audit annotation for an API request.", "key": "key specifies the audit annotation key. The audit annotation keys of a ValidatingAdmissionPolicy must be unique. The key must be a qualified name ([A-Za-z0-9][-A-Za-z0-9_.]*) no more than 63 bytes in length.\n\nThe key is combined with the resource name of the ValidatingAdmissionPolicy to construct an audit annotation key: \"{ValidatingAdmissionPolicy name}/{key}\".\n\nIf an admission webhook uses the same resource name as this ValidatingAdmissionPolicy and the same audit annotation key, the annotation key will be identical. In this case, the first annotation written with the key will be included in the audit event and all subsequent annotations with the same key will be discarded.\n\nRequired.", @@ -47,6 +56,15 @@ func (ExpressionWarning) SwaggerDoc() map[string]string { return map_ExpressionWarning } +var map_JSONPatch = map[string]string{ + "": "JSONPatch defines a JSON Patch.", + "expression": "expression will be evaluated by CEL to create a [JSON patch](https://jsonpatch.com/). ref: https://github.com/google/cel-spec\n\nexpression must return an array of JSONPatch values.\n\nFor example, this CEL expression returns a JSON patch to conditionally modify a value:\n\n\t [\n\t JSONPatch{op: \"test\", path: \"/spec/example\", value: \"Red\"},\n\t JSONPatch{op: \"replace\", path: \"/spec/example\", value: \"Green\"}\n\t ]\n\nTo define an object for the patch value, use Object types. For example:\n\n\t [\n\t JSONPatch{\n\t op: \"add\",\n\t path: \"/spec/selector\",\n\t value: Object.spec.selector{matchLabels: {\"environment\": \"test\"}}\n\t }\n\t ]\n\nTo use strings containing '/' and '~' as JSONPatch path keys, use \"jsonpatch.escapeKey\". For example:\n\n\t [\n\t JSONPatch{\n\t op: \"add\",\n\t path: \"/metadata/labels/\" + jsonpatch.escapeKey(\"example.com/environment\"),\n\t value: \"test\"\n\t },\n\t ]\n\nCEL expressions have access to the types needed to create JSON patches and objects:\n\n- 'JSONPatch' - CEL type of JSON Patch operations. JSONPatch has the fields 'op', 'from', 'path' and 'value'.\n See [JSON patch](https://jsonpatch.com/) for more details. The 'value' field may be set to any of: string,\n integer, array, map or object. If set, the 'path' and 'from' fields must be set to a\n [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901/) string, where the 'jsonpatch.escapeKey()' CEL\n function may be used to escape path keys containing '/' and '~'.\n- 'Object' - CEL type of the resource object. - 'Object.' - CEL type of object field (such as 'Object.spec') - 'Object.....` - CEL type of nested field (such as 'Object.spec.containers')\n\nCEL expressions have access to the contents of the API request, organized into CEL variables as well as some other useful variables:\n\n- 'object' - The object from the incoming request. The value is null for DELETE requests. - 'oldObject' - The existing object. The value is null for CREATE requests. - 'request' - Attributes of the API request([ref](/pkg/apis/admission/types.go#AdmissionRequest)). - 'params' - Parameter resource referred to by the policy binding being evaluated. Only populated if the policy has a ParamKind. - 'namespaceObject' - The namespace object that the incoming object belongs to. The value is null for cluster-scoped resources. - 'variables' - Map of composited variables, from its name to its lazily evaluated value.\n For example, a variable named 'foo' can be accessed as 'variables.foo'.\n- 'authorizer' - A CEL Authorizer. May be used to perform authorization checks for the principal (user or service account) of the request.\n See https://pkg.go.dev/k8s.io/apiserver/pkg/cel/library#Authz\n- 'authorizer.requestResource' - A CEL ResourceCheck constructed from the 'authorizer' and configured with the\n request resource.\n\nCEL expressions have access to [Kubernetes CEL function libraries](https://kubernetes.io/docs/reference/using-api/cel/#cel-options-language-features-and-libraries) as well as:\n\n- 'jsonpatch.escapeKey' - Performs JSONPatch key escaping. '~' and '/' are escaped as '~0' and `~1' respectively).\n\nOnly property names of the form `[a-zA-Z_.-/][a-zA-Z0-9_.-/]*` are accessible. Required.", +} + +func (JSONPatch) SwaggerDoc() map[string]string { + return map_JSONPatch +} + var map_MatchCondition = map[string]string{ "": "MatchCondition represents a condition which must be fulfilled for a request to be sent to a webhook.", "name": "Name is an identifier for this match condition, used for strategic merging of MatchConditions, as well as providing an identifier for logging purposes. A good name should be descriptive of the associated expression. Name must be a qualified name consisting of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]') with an optional DNS subdomain prefix and '/' (e.g. 'example.com/MyName')\n\nRequired.", @@ -70,6 +88,72 @@ func (MatchResources) SwaggerDoc() map[string]string { return map_MatchResources } +var map_MutatingAdmissionPolicy = map[string]string{ + "": "MutatingAdmissionPolicy describes the definition of an admission mutation policy that mutates the object coming into admission chain.", + "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + "spec": "Specification of the desired behavior of the MutatingAdmissionPolicy.", +} + +func (MutatingAdmissionPolicy) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicy +} + +var map_MutatingAdmissionPolicyBinding = map[string]string{ + "": "MutatingAdmissionPolicyBinding binds the MutatingAdmissionPolicy with parametrized resources. MutatingAdmissionPolicyBinding and the optional parameter resource together define how cluster administrators configure policies for clusters.\n\nFor a given admission request, each binding will cause its policy to be evaluated N times, where N is 1 for policies/bindings that don't use params, otherwise N is the number of parameters selected by the binding. Each evaluation is constrained by a [runtime cost budget](https://kubernetes.io/docs/reference/using-api/cel/#runtime-cost-budget).\n\nAdding/removing policies, bindings, or params can not affect whether a given (policy, binding, param) combination is within its own CEL budget.", + "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata.", + "spec": "Specification of the desired behavior of the MutatingAdmissionPolicyBinding.", +} + +func (MutatingAdmissionPolicyBinding) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyBinding +} + +var map_MutatingAdmissionPolicyBindingList = map[string]string{ + "": "MutatingAdmissionPolicyBindingList is a list of MutatingAdmissionPolicyBinding.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "items": "List of PolicyBinding.", +} + +func (MutatingAdmissionPolicyBindingList) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyBindingList +} + +var map_MutatingAdmissionPolicyBindingSpec = map[string]string{ + "": "MutatingAdmissionPolicyBindingSpec is the specification of the MutatingAdmissionPolicyBinding.", + "policyName": "policyName references a MutatingAdmissionPolicy name which the MutatingAdmissionPolicyBinding binds to. If the referenced resource does not exist, this binding is considered invalid and will be ignored Required.", + "paramRef": "paramRef specifies the parameter resource used to configure the admission control policy. It should point to a resource of the type specified in spec.ParamKind of the bound MutatingAdmissionPolicy. If the policy specifies a ParamKind and the resource referred to by ParamRef does not exist, this binding is considered mis-configured and the FailurePolicy of the MutatingAdmissionPolicy applied. If the policy does not specify a ParamKind then this field is ignored, and the rules are evaluated without a param.", + "matchResources": "matchResources limits what resources match this binding and may be mutated by it. Note that if matchResources matches a resource, the resource must also match a policy's matchConstraints and matchConditions before the resource may be mutated. When matchResources is unset, it does not constrain resource matching, and only the policy's matchConstraints and matchConditions must match for the resource to be mutated. Additionally, matchResources.resourceRules are optional and do not constraint matching when unset. Note that this is differs from MutatingAdmissionPolicy matchConstraints, where resourceRules are required. The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. '*' matches CREATE, UPDATE and CONNECT.", +} + +func (MutatingAdmissionPolicyBindingSpec) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyBindingSpec +} + +var map_MutatingAdmissionPolicyList = map[string]string{ + "": "MutatingAdmissionPolicyList is a list of MutatingAdmissionPolicy.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + "items": "List of ValidatingAdmissionPolicy.", +} + +func (MutatingAdmissionPolicyList) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicyList +} + +var map_MutatingAdmissionPolicySpec = map[string]string{ + "": "MutatingAdmissionPolicySpec is the specification of the desired behavior of the admission policy.", + "paramKind": "paramKind specifies the kind of resources used to parameterize this policy. If absent, there are no parameters for this policy and the param CEL variable will not be provided to validation expressions. If paramKind refers to a non-existent kind, this policy definition is mis-configured and the FailurePolicy is applied. If paramKind is specified but paramRef is unset in MutatingAdmissionPolicyBinding, the params variable will be null.", + "matchConstraints": "matchConstraints specifies what resources this policy is designed to validate. The MutatingAdmissionPolicy cares about a request if it matches _all_ Constraints. However, in order to prevent clusters from being put into an unstable state that cannot be recovered from via the API MutatingAdmissionPolicy cannot match MutatingAdmissionPolicy and MutatingAdmissionPolicyBinding. The CREATE, UPDATE and CONNECT operations are allowed. The DELETE operation may not be matched. '*' matches CREATE, UPDATE and CONNECT. Required.", + "variables": "variables contain definitions of variables that can be used in composition of other expressions. Each variable is defined as a named CEL expression. The variables defined here will be available under `variables` in other expressions of the policy except matchConditions because matchConditions are evaluated before the rest of the policy.\n\nThe expression of a variable can refer to other variables defined earlier in the list but not those after. Thus, variables must be sorted by the order of first appearance and acyclic.", + "mutations": "mutations contain operations to perform on matching objects. mutations may not be empty; a minimum of one mutation is required. mutations are evaluated in order, and are reinvoked according to the reinvocationPolicy. The mutations of a policy are invoked for each binding of this policy and reinvocation of mutations occurs on a per binding basis.", + "failurePolicy": "failurePolicy defines how to handle failures for the admission policy. Failures can occur from CEL expression parse errors, type check errors, runtime errors and invalid or mis-configured policy definitions or bindings.\n\nA policy is invalid if paramKind refers to a non-existent Kind. A binding is invalid if paramRef.name refers to a non-existent resource.\n\nfailurePolicy does not define how validations that evaluate to false are handled.\n\nAllowed values are Ignore or Fail. Defaults to Fail.", + "matchConditions": "matchConditions is a list of conditions that must be met for a request to be validated. Match conditions filter requests that have already been matched by the matchConstraints. An empty list of matchConditions matches all requests. There are a maximum of 64 match conditions allowed.\n\nIf a parameter object is provided, it can be accessed via the `params` handle in the same manner as validation expressions.\n\nThe exact matching logic is (in order):\n 1. If ANY matchCondition evaluates to FALSE, the policy is skipped.\n 2. If ALL matchConditions evaluate to TRUE, the policy is evaluated.\n 3. If any matchCondition evaluates to an error (but none are FALSE):\n - If failurePolicy=Fail, reject the request\n - If failurePolicy=Ignore, the policy is skipped", + "reinvocationPolicy": "reinvocationPolicy indicates whether mutations may be called multiple times per MutatingAdmissionPolicyBinding as part of a single admission evaluation. Allowed values are \"Never\" and \"IfNeeded\".\n\nNever: These mutations will not be called more than once per binding in a single admission evaluation.\n\nIfNeeded: These mutations may be invoked more than once per binding for a single admission request and there is no guarantee of order with respect to other admission plugins, admission webhooks, bindings of this policy and admission policies. Mutations are only reinvoked when mutations change the object after this mutation is invoked. Required.", +} + +func (MutatingAdmissionPolicySpec) SwaggerDoc() map[string]string { + return map_MutatingAdmissionPolicySpec +} + var map_MutatingWebhook = map[string]string{ "": "MutatingWebhook describes an admission webhook and the resources and operations it applies to.", "name": "The name of the admission webhook. Name should be fully qualified, e.g., imagepolicy.kubernetes.io, where \"imagepolicy\" is the name of the webhook, and kubernetes.io is the name of the organization. Required.", @@ -110,6 +194,17 @@ func (MutatingWebhookConfigurationList) SwaggerDoc() map[string]string { return map_MutatingWebhookConfigurationList } +var map_Mutation = map[string]string{ + "": "Mutation specifies the CEL expression which is used to apply the Mutation.", + "patchType": "patchType indicates the patch strategy used. Allowed values are \"ApplyConfiguration\" and \"JSONPatch\". Required.", + "applyConfiguration": "applyConfiguration defines the desired configuration values of an object. The configuration is applied to the admission object using [structured merge diff](https://github.com/kubernetes-sigs/structured-merge-diff). A CEL expression is used to create apply configuration.", + "jsonPatch": "jsonPatch defines a [JSON patch](https://jsonpatch.com/) operation to perform a mutation to the object. A CEL expression is used to create the JSON patch.", +} + +func (Mutation) SwaggerDoc() map[string]string { + return map_Mutation +} + var map_NamedRuleWithOperations = map[string]string{ "": "NamedRuleWithOperations is a tuple of Operations and Resources with ResourceNames.", "resourceNames": "ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.", diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go index 4c10b1d113..3749a3d141 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go @@ -27,6 +27,22 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ApplyConfiguration) DeepCopyInto(out *ApplyConfiguration) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ApplyConfiguration. +func (in *ApplyConfiguration) DeepCopy() *ApplyConfiguration { + if in == nil { + return nil + } + out := new(ApplyConfiguration) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AuditAnnotation) DeepCopyInto(out *AuditAnnotation) { *out = *in @@ -59,6 +75,22 @@ func (in *ExpressionWarning) DeepCopy() *ExpressionWarning { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *JSONPatch) DeepCopyInto(out *JSONPatch) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JSONPatch. +func (in *JSONPatch) DeepCopy() *JSONPatch { + if in == nil { + return nil + } + out := new(JSONPatch) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MatchCondition) DeepCopyInto(out *MatchCondition) { *out = *in @@ -120,6 +152,200 @@ func (in *MatchResources) DeepCopy() *MatchResources { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicy) DeepCopyInto(out *MutatingAdmissionPolicy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicy. +func (in *MutatingAdmissionPolicy) DeepCopy() *MutatingAdmissionPolicy { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyBinding) DeepCopyInto(out *MutatingAdmissionPolicyBinding) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyBinding. +func (in *MutatingAdmissionPolicyBinding) DeepCopy() *MutatingAdmissionPolicyBinding { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyBinding) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicyBinding) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyBindingList) DeepCopyInto(out *MutatingAdmissionPolicyBindingList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]MutatingAdmissionPolicyBinding, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyBindingList. +func (in *MutatingAdmissionPolicyBindingList) DeepCopy() *MutatingAdmissionPolicyBindingList { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyBindingList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicyBindingList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyBindingSpec) DeepCopyInto(out *MutatingAdmissionPolicyBindingSpec) { + *out = *in + if in.ParamRef != nil { + in, out := &in.ParamRef, &out.ParamRef + *out = new(ParamRef) + (*in).DeepCopyInto(*out) + } + if in.MatchResources != nil { + in, out := &in.MatchResources, &out.MatchResources + *out = new(MatchResources) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyBindingSpec. +func (in *MutatingAdmissionPolicyBindingSpec) DeepCopy() *MutatingAdmissionPolicyBindingSpec { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyBindingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicyList) DeepCopyInto(out *MutatingAdmissionPolicyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]MutatingAdmissionPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicyList. +func (in *MutatingAdmissionPolicyList) DeepCopy() *MutatingAdmissionPolicyList { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *MutatingAdmissionPolicyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MutatingAdmissionPolicySpec) DeepCopyInto(out *MutatingAdmissionPolicySpec) { + *out = *in + if in.ParamKind != nil { + in, out := &in.ParamKind, &out.ParamKind + *out = new(ParamKind) + **out = **in + } + if in.MatchConstraints != nil { + in, out := &in.MatchConstraints, &out.MatchConstraints + *out = new(MatchResources) + (*in).DeepCopyInto(*out) + } + if in.Variables != nil { + in, out := &in.Variables, &out.Variables + *out = make([]Variable, len(*in)) + copy(*out, *in) + } + if in.Mutations != nil { + in, out := &in.Mutations, &out.Mutations + *out = make([]Mutation, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailurePolicy != nil { + in, out := &in.FailurePolicy, &out.FailurePolicy + *out = new(FailurePolicyType) + **out = **in + } + if in.MatchConditions != nil { + in, out := &in.MatchConditions, &out.MatchConditions + *out = make([]MatchCondition, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MutatingAdmissionPolicySpec. +func (in *MutatingAdmissionPolicySpec) DeepCopy() *MutatingAdmissionPolicySpec { + if in == nil { + return nil + } + out := new(MutatingAdmissionPolicySpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MutatingWebhook) DeepCopyInto(out *MutatingWebhook) { *out = *in @@ -168,7 +394,7 @@ func (in *MutatingWebhook) DeepCopyInto(out *MutatingWebhook) { } if in.ReinvocationPolicy != nil { in, out := &in.ReinvocationPolicy, &out.ReinvocationPolicy - *out = new(ReinvocationPolicyType) + *out = new(admissionregistrationv1.ReinvocationPolicyType) **out = **in } if in.MatchConditions != nil { @@ -255,6 +481,32 @@ func (in *MutatingWebhookConfigurationList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Mutation) DeepCopyInto(out *Mutation) { + *out = *in + if in.ApplyConfiguration != nil { + in, out := &in.ApplyConfiguration, &out.ApplyConfiguration + *out = new(ApplyConfiguration) + **out = **in + } + if in.JSONPatch != nil { + in, out := &in.JSONPatch, &out.JSONPatch + *out = new(JSONPatch) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Mutation. +func (in *Mutation) DeepCopy() *Mutation { + if in == nil { + return nil + } + out := new(Mutation) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NamedRuleWithOperations) DeepCopyInto(out *NamedRuleWithOperations) { *out = *in diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go index c1be5122a8..4fc0596b34 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.prerelease-lifecycle.go @@ -25,6 +25,78 @@ import ( schema "k8s.io/apimachinery/pkg/runtime/schema" ) +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicy) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicy) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicy) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicyBinding) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicyBinding) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicyBinding) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicyBindingList) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicyBindingList) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicyBindingList) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *MutatingAdmissionPolicyList) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *MutatingAdmissionPolicyList) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *MutatingAdmissionPolicyList) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + // APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. // It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. func (in *MutatingWebhookConfiguration) APILifecycleIntroduced() (major, minor int) { diff --git a/vendor/k8s.io/api/apps/v1/generated.proto b/vendor/k8s.io/api/apps/v1/generated.proto index 38c8997e99..5885a62225 100644 --- a/vendor/k8s.io/api/apps/v1/generated.proto +++ b/vendor/k8s.io/api/apps/v1/generated.proto @@ -530,7 +530,7 @@ message RollingUpdateDaemonSet { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/apps/v1/types.go b/vendor/k8s.io/api/apps/v1/types.go index 1362d875d8..4cf54cc99b 100644 --- a/vendor/k8s.io/api/apps/v1/types.go +++ b/vendor/k8s.io/api/apps/v1/types.go @@ -635,7 +635,7 @@ type RollingUpdateDaemonSet struct { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go index f44ba7bc33..ac54033fd6 100644 --- a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go @@ -265,7 +265,7 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediately created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.proto b/vendor/k8s.io/api/apps/v1beta1/generated.proto index 0601efc3c4..b61dc490db 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta1/generated.proto @@ -316,6 +316,9 @@ message Scale { message ScaleSpec { // replicas is the number of observed instances of the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/apps/v1beta1/types.go b/vendor/k8s.io/api/apps/v1beta1/types.go index 5530c990da..cd140be12f 100644 --- a/vendor/k8s.io/api/apps/v1beta1/types.go +++ b/vendor/k8s.io/api/apps/v1beta1/types.go @@ -33,6 +33,9 @@ const ( type ScaleSpec struct { // replicas is the number of observed instances of the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } @@ -60,6 +63,7 @@ type ScaleStatus struct { // +k8s:prerelease-lifecycle-gen:deprecated=1.8 // +k8s:prerelease-lifecycle-gen:removed=1.16 // +k8s:prerelease-lifecycle-gen:replacement=autoscaling,v1,Scale +// +k8s:isSubresource=/scale // Scale represents a scaling request for a resource. type Scale struct { diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.proto b/vendor/k8s.io/api/apps/v1beta2/generated.proto index 68c463e257..37c6d5ae1b 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta2/generated.proto @@ -536,7 +536,7 @@ message RollingUpdateDaemonSet { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may @@ -614,6 +614,9 @@ message Scale { message ScaleSpec { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/apps/v1beta2/types.go b/vendor/k8s.io/api/apps/v1beta2/types.go index 491afc59f5..e9dc85df05 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types.go +++ b/vendor/k8s.io/api/apps/v1beta2/types.go @@ -35,6 +35,9 @@ const ( type ScaleSpec struct { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } @@ -63,6 +66,7 @@ type ScaleStatus struct { // +k8s:prerelease-lifecycle-gen:deprecated=1.9 // +k8s:prerelease-lifecycle-gen:removed=1.16 // +k8s:prerelease-lifecycle-gen:replacement=autoscaling,v1,Scale +// +k8s:isSubresource=/scale // Scale represents a scaling request for a resource. type Scale struct { @@ -681,7 +685,7 @@ type RollingUpdateDaemonSet struct { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index 4089434151..34d80af58d 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -265,7 +265,7 @@ func (ReplicaSetStatus) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediately created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/authorization/v1/generated.proto b/vendor/k8s.io/api/authorization/v1/generated.proto index 37b05b8552..ff529c969e 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.proto +++ b/vendor/k8s.io/api/authorization/v1/generated.proto @@ -167,16 +167,10 @@ message ResourceAttributes { optional string name = 7; // fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional optional FieldSelectorAttributes fieldSelector = 8; // labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional optional LabelSelectorAttributes labelSelector = 9; } diff --git a/vendor/k8s.io/api/authorization/v1/types.go b/vendor/k8s.io/api/authorization/v1/types.go index 36f5fa4107..251e776b02 100644 --- a/vendor/k8s.io/api/authorization/v1/types.go +++ b/vendor/k8s.io/api/authorization/v1/types.go @@ -119,15 +119,9 @@ type ResourceAttributes struct { // +optional Name string `json:"name,omitempty" protobuf:"bytes,7,opt,name=name"` // fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional FieldSelector *FieldSelectorAttributes `json:"fieldSelector,omitempty" protobuf:"bytes,8,opt,name=fieldSelector"` // labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it. - // - // This field is alpha-level. To use this field, you must enable the - // `AuthorizeWithSelectors` feature gate (disabled by default). // +optional LabelSelector *LabelSelectorAttributes `json:"labelSelector,omitempty" protobuf:"bytes,9,opt,name=labelSelector"` } diff --git a/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go index dc6b8a89ec..29d0aa8463 100644 --- a/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go @@ -87,8 +87,8 @@ var map_ResourceAttributes = map[string]string{ "resource": "Resource is one of the existing resource types. \"*\" means all.", "subresource": "Subresource is one of the existing resource types. \"\" means none.", "name": "Name is the name of the resource being requested for a \"get\" or deleted for a \"delete\". \"\" (empty) means all.", - "fieldSelector": "fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it.\n\nThis field is alpha-level. To use this field, you must enable the `AuthorizeWithSelectors` feature gate (disabled by default).", - "labelSelector": "labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it.\n\nThis field is alpha-level. To use this field, you must enable the `AuthorizeWithSelectors` feature gate (disabled by default).", + "fieldSelector": "fieldSelector describes the limitation on access based on field. It can only limit access, not broaden it.", + "labelSelector": "labelSelector describes the limitation on access based on labels. It can only limit access, not broaden it.", } func (ResourceAttributes) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.proto b/vendor/k8s.io/api/autoscaling/v1/generated.proto index 68c35b6b22..a17d7989db 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.proto +++ b/vendor/k8s.io/api/autoscaling/v1/generated.proto @@ -472,6 +472,9 @@ message Scale { message ScaleSpec { // replicas is the desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/autoscaling/v1/types.go b/vendor/k8s.io/api/autoscaling/v1/types.go index 85c609e5c7..e1e8809fe9 100644 --- a/vendor/k8s.io/api/autoscaling/v1/types.go +++ b/vendor/k8s.io/api/autoscaling/v1/types.go @@ -117,6 +117,7 @@ type HorizontalPodAutoscalerList struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.2 +// +k8s:isSubresource=/scale // Scale represents a scaling request for a resource. type Scale struct { @@ -138,6 +139,9 @@ type Scale struct { type ScaleSpec struct { // replicas is the desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } diff --git a/vendor/k8s.io/api/batch/v1/generated.proto b/vendor/k8s.io/api/batch/v1/generated.proto index d3aeae0adb..c0ce8cef26 100644 --- a/vendor/k8s.io/api/batch/v1/generated.proto +++ b/vendor/k8s.io/api/batch/v1/generated.proto @@ -226,7 +226,8 @@ message JobSpec { optional SuccessPolicy successPolicy = 16; // Specifies the number of retries before marking this job failed. - // Defaults to 6 + // Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. + // When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647. // +optional optional int32 backoffLimit = 7; @@ -329,8 +330,6 @@ message JobSpec { // // When using podFailurePolicy, Failed is the the only allowed value. // TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. - // This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. - // This is on by default. // +optional optional string podReplacementPolicy = 14; @@ -570,7 +569,7 @@ message PodFailurePolicyRule { message SuccessPolicy { // rules represents the list of alternative rules for the declaring the Jobs // as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, - // the "SucceededCriteriaMet" condition is added, and the lingering pods are removed. + // the "SuccessCriteriaMet" condition is added, and the lingering pods are removed. // The terminal state for such a Job has the "Complete" condition. // Additionally, these rules are evaluated in order; Once the Job meets one of the rules, // other rules are ignored. At most 20 elements are allowed. diff --git a/vendor/k8s.io/api/batch/v1/types.go b/vendor/k8s.io/api/batch/v1/types.go index 6c0007c21e..9183c073d2 100644 --- a/vendor/k8s.io/api/batch/v1/types.go +++ b/vendor/k8s.io/api/batch/v1/types.go @@ -257,7 +257,7 @@ type PodFailurePolicy struct { type SuccessPolicy struct { // rules represents the list of alternative rules for the declaring the Jobs // as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, - // the "SucceededCriteriaMet" condition is added, and the lingering pods are removed. + // the "SuccessCriteriaMet" condition is added, and the lingering pods are removed. // The terminal state for such a Job has the "Complete" condition. // Additionally, these rules are evaluated in order; Once the Job meets one of the rules, // other rules are ignored. At most 20 elements are allowed. @@ -347,7 +347,8 @@ type JobSpec struct { SuccessPolicy *SuccessPolicy `json:"successPolicy,omitempty" protobuf:"bytes,16,opt,name=successPolicy"` // Specifies the number of retries before marking this job failed. - // Defaults to 6 + // Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. + // When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647. // +optional BackoffLimit *int32 `json:"backoffLimit,omitempty" protobuf:"varint,7,opt,name=backoffLimit"` @@ -455,8 +456,6 @@ type JobSpec struct { // // When using podFailurePolicy, Failed is the the only allowed value. // TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. - // This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. - // This is on by default. // +optional PodReplacementPolicy *PodReplacementPolicy `json:"podReplacementPolicy,omitempty" protobuf:"bytes,14,opt,name=podReplacementPolicy,casttype=podReplacementPolicy"` diff --git a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index ffd4e4f5fe..451f4609f2 100644 --- a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -117,7 +117,7 @@ var map_JobSpec = map[string]string{ "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be continuously active before the system tries to terminate it; value must be positive integer. If a Job is suspended (at creation or through an update), this timer will effectively be stopped and reset when the Job is resumed again.", "podFailurePolicy": "Specifies the policy of handling failed pods. In particular, it allows to specify the set of actions and conditions which need to be satisfied to take the associated action. If empty, the default behaviour applies - the counter of failed pods, represented by the jobs's .status.failed field, is incremented and it is checked against the backoffLimit. This field cannot be used in combination with restartPolicy=OnFailure.", "successPolicy": "successPolicy specifies the policy when the Job can be declared as succeeded. If empty, the default behavior applies - the Job is declared as succeeded only when the number of succeeded pods equals to the completions. When the field is specified, it must be immutable and works only for the Indexed Jobs. Once the Job meets the SuccessPolicy, the lingering pods are terminated.", - "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", + "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6, unless backoffLimitPerIndex (only Indexed Job) is specified. When backoffLimitPerIndex is specified, backoffLimit defaults to 2147483647.", "backoffLimitPerIndex": "Specifies the limit for the number of retries within an index before marking this index as failed. When enabled the number of failures per index is kept in the pod's batch.kubernetes.io/job-index-failure-count annotation. It can only be set when Job's completionMode=Indexed, and the Pod's restart policy is Never. The field is immutable.", "maxFailedIndexes": "Specifies the maximal number of failed indexes before marking the Job as failed, when backoffLimitPerIndex is set. Once the number of failed indexes exceeds this number the entire Job is marked as Failed and its execution is terminated. When left as null the job continues execution of all of its indexes and is marked with the `Complete` Job condition. It can only be specified when backoffLimitPerIndex is set. It can be null or up to completions. It is required and must be less than or equal to 10^4 when is completions greater than 10^5.", "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", @@ -126,7 +126,7 @@ var map_JobSpec = map[string]string{ "ttlSecondsAfterFinished": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes.", "completionMode": "completionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other.\n\n`Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job.", "suspend": "suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false.", - "podReplacementPolicy": "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. This is on by default.", + "podReplacementPolicy": "podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods\n when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use.", "managedBy": "ManagedBy field indicates the controller that manages a Job. The k8s Job controller reconciles jobs which don't have this field at all or the field value is the reserved string `kubernetes.io/job-controller`, but skips reconciling Jobs with a custom value for this field. The value must be a valid domain-prefixed path (e.g. acme.io/foo) - all characters before the first \"/\" must be a valid subdomain as defined by RFC 1123. All characters trailing the first \"/\" must be valid HTTP Path characters as defined by RFC 3986. The value cannot exceed 63 characters. This field is immutable.\n\nThis field is beta-level. The job controller accepts setting the field when the feature gate JobManagedBy is enabled (enabled by default).", } @@ -206,7 +206,7 @@ func (PodFailurePolicyRule) SwaggerDoc() map[string]string { var map_SuccessPolicy = map[string]string{ "": "SuccessPolicy describes when a Job can be declared as succeeded based on the success of some indexes.", - "rules": "rules represents the list of alternative rules for the declaring the Jobs as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, the \"SucceededCriteriaMet\" condition is added, and the lingering pods are removed. The terminal state for such a Job has the \"Complete\" condition. Additionally, these rules are evaluated in order; Once the Job meets one of the rules, other rules are ignored. At most 20 elements are allowed.", + "rules": "rules represents the list of alternative rules for the declaring the Jobs as successful before `.status.succeeded >= .spec.completions`. Once any of the rules are met, the \"SuccessCriteriaMet\" condition is added, and the lingering pods are removed. The terminal state for such a Job has the \"Complete\" condition. Additionally, these rules are evaluated in order; Once the Job meets one of the rules, other rules are ignored. At most 20 elements are allowed.", } func (SuccessPolicy) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/certificates/v1/generated.proto b/vendor/k8s.io/api/certificates/v1/generated.proto index dac7c7f5f2..24528fc8bc 100644 --- a/vendor/k8s.io/api/certificates/v1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1/generated.proto @@ -39,6 +39,8 @@ option go_package = "k8s.io/api/certificates/v1"; // This API can be used to request client certificates to authenticate to kube-apiserver // (with the "kubernetes.io/kube-apiserver-client" signerName), // or to obtain certificates from custom non-Kubernetes signers. +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval message CertificateSigningRequest { // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; @@ -203,6 +205,11 @@ message CertificateSigningRequestStatus { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember repeated CertificateSigningRequestCondition conditions = 1; // certificate is populated with an issued certificate by the signer after an Approved condition is present. diff --git a/vendor/k8s.io/api/certificates/v1/types.go b/vendor/k8s.io/api/certificates/v1/types.go index ba8009840d..71203e80d5 100644 --- a/vendor/k8s.io/api/certificates/v1/types.go +++ b/vendor/k8s.io/api/certificates/v1/types.go @@ -39,6 +39,8 @@ import ( // This API can be used to request client certificates to authenticate to kube-apiserver // (with the "kubernetes.io/kube-apiserver-client" signerName), // or to obtain certificates from custom non-Kubernetes signers. +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval type CertificateSigningRequest struct { metav1.TypeMeta `json:",inline"` // +optional @@ -178,6 +180,11 @@ type CertificateSigningRequestStatus struct { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember Conditions []CertificateSigningRequestCondition `json:"conditions,omitempty" protobuf:"bytes,1,rep,name=conditions"` // certificate is populated with an issued certificate by the signer after an Approved condition is present. diff --git a/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go b/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go index a62a400596..c260f0436d 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go @@ -25,11 +25,14 @@ import ( io "io" proto "github.com/gogo/protobuf/proto" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" reflect "reflect" strings "strings" + + k8s_io_apimachinery_pkg_types "k8s.io/apimachinery/pkg/types" ) // Reference imports to suppress errors if they are not otherwise used. @@ -127,10 +130,126 @@ func (m *ClusterTrustBundleSpec) XXX_DiscardUnknown() { var xxx_messageInfo_ClusterTrustBundleSpec proto.InternalMessageInfo +func (m *PodCertificateRequest) Reset() { *m = PodCertificateRequest{} } +func (*PodCertificateRequest) ProtoMessage() {} +func (*PodCertificateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{3} +} +func (m *PodCertificateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequest.Merge(m, src) +} +func (m *PodCertificateRequest) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequest proto.InternalMessageInfo + +func (m *PodCertificateRequestList) Reset() { *m = PodCertificateRequestList{} } +func (*PodCertificateRequestList) ProtoMessage() {} +func (*PodCertificateRequestList) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{4} +} +func (m *PodCertificateRequestList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequestList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequestList) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequestList.Merge(m, src) +} +func (m *PodCertificateRequestList) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequestList) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequestList.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequestList proto.InternalMessageInfo + +func (m *PodCertificateRequestSpec) Reset() { *m = PodCertificateRequestSpec{} } +func (*PodCertificateRequestSpec) ProtoMessage() {} +func (*PodCertificateRequestSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{5} +} +func (m *PodCertificateRequestSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequestSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequestSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequestSpec.Merge(m, src) +} +func (m *PodCertificateRequestSpec) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequestSpec) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequestSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequestSpec proto.InternalMessageInfo + +func (m *PodCertificateRequestStatus) Reset() { *m = PodCertificateRequestStatus{} } +func (*PodCertificateRequestStatus) ProtoMessage() {} +func (*PodCertificateRequestStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_f73d5fe56c015bb8, []int{6} +} +func (m *PodCertificateRequestStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateRequestStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateRequestStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateRequestStatus.Merge(m, src) +} +func (m *PodCertificateRequestStatus) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateRequestStatus) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateRequestStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateRequestStatus proto.InternalMessageInfo + func init() { proto.RegisterType((*ClusterTrustBundle)(nil), "k8s.io.api.certificates.v1alpha1.ClusterTrustBundle") proto.RegisterType((*ClusterTrustBundleList)(nil), "k8s.io.api.certificates.v1alpha1.ClusterTrustBundleList") proto.RegisterType((*ClusterTrustBundleSpec)(nil), "k8s.io.api.certificates.v1alpha1.ClusterTrustBundleSpec") + proto.RegisterType((*PodCertificateRequest)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequest") + proto.RegisterType((*PodCertificateRequestList)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequestList") + proto.RegisterType((*PodCertificateRequestSpec)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequestSpec") + proto.RegisterType((*PodCertificateRequestStatus)(nil), "k8s.io.api.certificates.v1alpha1.PodCertificateRequestStatus") } func init() { @@ -138,35 +257,65 @@ func init() { } var fileDescriptor_f73d5fe56c015bb8 = []byte{ - // 437 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x93, 0xcf, 0x6a, 0xdb, 0x40, - 0x10, 0xc6, 0xb5, 0x69, 0x02, 0xc9, 0xba, 0x85, 0xa2, 0x42, 0x31, 0x3e, 0x6c, 0x8c, 0x4f, 0xb9, - 0x74, 0x37, 0x36, 0x69, 0xc9, 0x59, 0x85, 0x42, 0xa1, 0x7f, 0x40, 0xe9, 0xa5, 0xa1, 0x87, 0xae, - 0xd7, 0x13, 0x79, 0x6b, 0x4b, 0x5a, 0x76, 0x57, 0x86, 0xde, 0x0a, 0x7d, 0x81, 0x3e, 0x96, 0x8f, - 0x69, 0x4f, 0x39, 0x85, 0x5a, 0x7d, 0x91, 0xb2, 0x6b, 0xd9, 0x12, 0x55, 0x8b, 0x4b, 0x6e, 0x9a, - 0xd1, 0xfc, 0xbe, 0x6f, 0xbe, 0x11, 0xc2, 0xa7, 0xb3, 0x73, 0x43, 0x65, 0xce, 0xb8, 0x92, 0x4c, - 0x80, 0xb6, 0xf2, 0x4a, 0x0a, 0x6e, 0xc1, 0xb0, 0xc5, 0x90, 0xcf, 0xd5, 0x94, 0x0f, 0x59, 0x02, - 0x19, 0x68, 0x6e, 0x61, 0x42, 0x95, 0xce, 0x6d, 0x1e, 0xf6, 0xd7, 0x04, 0xe5, 0x4a, 0xd2, 0x26, - 0x41, 0x37, 0x44, 0xef, 0x49, 0x22, 0xed, 0xb4, 0x18, 0x53, 0x91, 0xa7, 0x2c, 0xc9, 0x93, 0x9c, - 0x79, 0x70, 0x5c, 0x5c, 0xf9, 0xca, 0x17, 0xfe, 0x69, 0x2d, 0xd8, 0x3b, 0xab, 0x57, 0x48, 0xb9, - 0x98, 0xca, 0x0c, 0xf4, 0x67, 0xa6, 0x66, 0x89, 0x6b, 0x18, 0x96, 0x82, 0xe5, 0x6c, 0xd1, 0x5a, - 0xa3, 0xc7, 0xfe, 0x45, 0xe9, 0x22, 0xb3, 0x32, 0x85, 0x16, 0xf0, 0x6c, 0x17, 0x60, 0xc4, 0x14, - 0x52, 0xfe, 0x27, 0x37, 0xf8, 0x81, 0x70, 0xf8, 0x7c, 0x5e, 0x18, 0x0b, 0xfa, 0x9d, 0x2e, 0x8c, - 0x8d, 0x8a, 0x6c, 0x32, 0x87, 0xf0, 0x23, 0x3e, 0x74, 0xab, 0x4d, 0xb8, 0xe5, 0x5d, 0xd4, 0x47, - 0x27, 0x9d, 0xd1, 0x29, 0xad, 0x2f, 0xb3, 0x75, 0xa0, 0x6a, 0x96, 0xb8, 0x86, 0xa1, 0x6e, 0x9a, - 0x2e, 0x86, 0xf4, 0xed, 0xf8, 0x13, 0x08, 0xfb, 0x1a, 0x2c, 0x8f, 0xc2, 0xe5, 0xed, 0x71, 0x50, - 0xde, 0x1e, 0xe3, 0xba, 0x17, 0x6f, 0x55, 0xc3, 0x4b, 0xbc, 0x6f, 0x14, 0x88, 0xee, 0x9e, 0x57, - 0x3f, 0xa7, 0xbb, 0xee, 0x4e, 0xdb, 0x5b, 0x5e, 0x28, 0x10, 0xd1, 0xfd, 0xca, 0x65, 0xdf, 0x55, - 0xb1, 0xd7, 0x1c, 0x7c, 0x47, 0xf8, 0x71, 0x7b, 0xfc, 0x95, 0x34, 0x36, 0xfc, 0xd0, 0x0a, 0x46, - 0xff, 0x2f, 0x98, 0xa3, 0x7d, 0xac, 0x87, 0x95, 0xe1, 0xe1, 0xa6, 0xd3, 0x08, 0xf5, 0x1e, 0x1f, - 0x48, 0x0b, 0xa9, 0xe9, 0xee, 0xf5, 0xef, 0x9d, 0x74, 0x46, 0x67, 0x77, 0x49, 0x15, 0x3d, 0xa8, - 0x0c, 0x0e, 0x5e, 0x3a, 0xa9, 0x78, 0xad, 0x38, 0xf8, 0xfa, 0xd7, 0x4c, 0x2e, 0x74, 0x38, 0xc2, - 0xd8, 0xc8, 0x24, 0x03, 0xfd, 0x86, 0xa7, 0xe0, 0x53, 0x1d, 0xd5, 0xc7, 0xbf, 0xd8, 0xbe, 0x89, - 0x1b, 0x53, 0xe1, 0x53, 0xdc, 0xb1, 0xb5, 0x8c, 0xff, 0x0a, 0x47, 0xd1, 0xa3, 0x0a, 0xea, 0x34, - 0x1c, 0xe2, 0xe6, 0x5c, 0xf4, 0x62, 0xb9, 0x22, 0xc1, 0xf5, 0x8a, 0x04, 0x37, 0x2b, 0x12, 0x7c, - 0x29, 0x09, 0x5a, 0x96, 0x04, 0x5d, 0x97, 0x04, 0xdd, 0x94, 0x04, 0xfd, 0x2c, 0x09, 0xfa, 0xf6, - 0x8b, 0x04, 0x97, 0xfd, 0x5d, 0xbf, 0xdd, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd4, 0x1c, 0xcb, - 0xdd, 0x99, 0x03, 0x00, 0x00, + // 918 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0xc7, 0xe3, 0xb6, 0x69, 0x9b, 0x49, 0x5b, 0xda, 0x61, 0x17, 0x99, 0x22, 0x39, 0x21, 0x07, + 0x54, 0x90, 0xb0, 0xb7, 0xa5, 0xb0, 0x2b, 0x10, 0x48, 0x75, 0x0a, 0x52, 0xe9, 0x6e, 0x36, 0x9a, + 0x74, 0xf9, 0xb1, 0x5a, 0x24, 0x1c, 0xe7, 0x25, 0x19, 0x1a, 0x7b, 0x8c, 0x67, 0x5c, 0xb5, 0x37, + 0x24, 0xfe, 0x01, 0xfe, 0x23, 0xae, 0x3d, 0x2e, 0x5c, 0xd8, 0x53, 0xa0, 0xe6, 0x6f, 0xe0, 0xb2, + 0x27, 0xe4, 0xb1, 0x9d, 0x5f, 0x4e, 0xb6, 0xd9, 0x1e, 0x7a, 0xcb, 0xbc, 0x79, 0xdf, 0xcf, 0xfb, + 0xbe, 0x99, 0x37, 0x56, 0xd0, 0xbd, 0xd3, 0x07, 0x5c, 0xa7, 0xcc, 0xb0, 0x3c, 0x6a, 0xd8, 0xe0, + 0x0b, 0xda, 0xa6, 0xb6, 0x25, 0x80, 0x1b, 0x67, 0xbb, 0x56, 0xcf, 0xeb, 0x5a, 0xbb, 0x46, 0x07, + 0x5c, 0xf0, 0x2d, 0x01, 0x2d, 0xdd, 0xf3, 0x99, 0x60, 0xb8, 0x1c, 0x2b, 0x74, 0xcb, 0xa3, 0xfa, + 0xa8, 0x42, 0x4f, 0x15, 0xdb, 0x1f, 0x76, 0xa8, 0xe8, 0x06, 0x4d, 0xdd, 0x66, 0x8e, 0xd1, 0x61, + 0x1d, 0x66, 0x48, 0x61, 0x33, 0x68, 0xcb, 0x95, 0x5c, 0xc8, 0x5f, 0x31, 0x70, 0x7b, 0x7f, 0x68, + 0xc1, 0xb1, 0xec, 0x2e, 0x75, 0xc1, 0xbf, 0x30, 0xbc, 0xd3, 0x4e, 0x14, 0xe0, 0x86, 0x03, 0xc2, + 0x32, 0xce, 0x32, 0x36, 0xb6, 0x8d, 0x59, 0x2a, 0x3f, 0x70, 0x05, 0x75, 0x20, 0x23, 0xf8, 0xe4, + 0x3a, 0x01, 0xb7, 0xbb, 0xe0, 0x58, 0x93, 0xba, 0xca, 0x9f, 0x0a, 0xc2, 0xd5, 0x5e, 0xc0, 0x05, + 0xf8, 0x27, 0x7e, 0xc0, 0x85, 0x19, 0xb8, 0xad, 0x1e, 0xe0, 0x1f, 0xd1, 0x6a, 0x64, 0xad, 0x65, + 0x09, 0x4b, 0x55, 0xca, 0xca, 0x4e, 0x71, 0xef, 0x9e, 0x3e, 0x3c, 0x99, 0x41, 0x05, 0xdd, 0x3b, + 0xed, 0x44, 0x01, 0xae, 0x47, 0xd9, 0xfa, 0xd9, 0xae, 0xfe, 0xb8, 0xf9, 0x13, 0xd8, 0xe2, 0x11, + 0x08, 0xcb, 0xc4, 0x97, 0xfd, 0x52, 0x2e, 0xec, 0x97, 0xd0, 0x30, 0x46, 0x06, 0x54, 0xfc, 0x14, + 0x2d, 0x71, 0x0f, 0x6c, 0x75, 0x41, 0xd2, 0x1f, 0xe8, 0xd7, 0x9d, 0xbb, 0x9e, 0x75, 0xd9, 0xf0, + 0xc0, 0x36, 0xd7, 0x92, 0x2a, 0x4b, 0xd1, 0x8a, 0x48, 0x66, 0xe5, 0x0f, 0x05, 0xbd, 0x95, 0x4d, + 0x7f, 0x48, 0xb9, 0xc0, 0xcf, 0x32, 0x8d, 0xe9, 0xf3, 0x35, 0x16, 0xa9, 0x65, 0x5b, 0x9b, 0x49, + 0xc1, 0xd5, 0x34, 0x32, 0xd2, 0xd4, 0xf7, 0x28, 0x4f, 0x05, 0x38, 0x5c, 0x5d, 0x28, 0x2f, 0xee, + 0x14, 0xf7, 0xf6, 0x6f, 0xd2, 0x95, 0xb9, 0x9e, 0x14, 0xc8, 0x1f, 0x45, 0x28, 0x12, 0x13, 0x2b, + 0xbf, 0x4e, 0xed, 0x29, 0x6a, 0x1a, 0xef, 0x21, 0xc4, 0x69, 0xc7, 0x05, 0xbf, 0x66, 0x39, 0x20, + 0xbb, 0x2a, 0x0c, 0x0f, 0xbf, 0x31, 0xd8, 0x21, 0x23, 0x59, 0xf8, 0x63, 0x54, 0x14, 0x43, 0x8c, + 0xbc, 0x85, 0x82, 0xf9, 0x66, 0x22, 0x2a, 0x8e, 0x54, 0x20, 0xa3, 0x79, 0x95, 0xdf, 0x17, 0xd0, + 0xdd, 0x3a, 0x6b, 0x55, 0x87, 0xbd, 0x10, 0xf8, 0x39, 0x00, 0x2e, 0x6e, 0x61, 0x62, 0x7e, 0x18, + 0x9b, 0x98, 0xcf, 0xae, 0x3f, 0xdb, 0xa9, 0x46, 0x67, 0x0d, 0x0d, 0x06, 0xb4, 0xcc, 0x85, 0x25, + 0x02, 0xae, 0x2e, 0xca, 0x02, 0x9f, 0xdf, 0xb4, 0x80, 0x84, 0x98, 0x1b, 0x49, 0x89, 0xe5, 0x78, + 0x4d, 0x12, 0x78, 0xe5, 0x2f, 0x05, 0xbd, 0x3d, 0x55, 0x77, 0x0b, 0xe3, 0xf9, 0x6c, 0x7c, 0x3c, + 0xef, 0xdf, 0xb0, 0xc3, 0x19, 0x13, 0xfa, 0x5f, 0x7e, 0x46, 0x67, 0x37, 0x1e, 0xd2, 0xf7, 0xd1, + 0x8a, 0xc7, 0x5a, 0x52, 0x10, 0x0f, 0xe8, 0x1b, 0x89, 0x60, 0xa5, 0x1e, 0x87, 0x49, 0xba, 0x8f, + 0x8f, 0xd1, 0xb2, 0xc7, 0x5a, 0x4f, 0x8e, 0x0e, 0xe5, 0xed, 0x15, 0xcc, 0x8f, 0xd2, 0xe3, 0xaf, + 0xcb, 0xe8, 0xcb, 0x7e, 0xe9, 0xdd, 0x59, 0x5f, 0x48, 0x71, 0xe1, 0x01, 0xd7, 0x9f, 0x1c, 0x1d, + 0x92, 0x04, 0x81, 0xbf, 0x46, 0x98, 0x83, 0x7f, 0x46, 0x6d, 0x38, 0xb0, 0x6d, 0x16, 0xb8, 0x42, + 0x5a, 0x58, 0x92, 0xe0, 0xed, 0x04, 0x8c, 0x1b, 0x99, 0x0c, 0x32, 0x45, 0x85, 0x7b, 0x68, 0x6b, + 0x3c, 0x1a, 0x79, 0xcc, 0x4b, 0xd4, 0x17, 0x09, 0x6a, 0xab, 0x31, 0x99, 0x30, 0x9f, 0xdd, 0x2c, + 0x18, 0x7f, 0x83, 0x56, 0x5d, 0xd6, 0x02, 0xe9, 0x77, 0x59, 0x16, 0xf9, 0x34, 0x9d, 0x87, 0x5a, + 0x12, 0x7f, 0xd9, 0x2f, 0xbd, 0xf7, 0x6a, 0x76, 0x9a, 0x49, 0x06, 0x2c, 0x5c, 0x43, 0x2b, 0xd1, + 0xef, 0xc8, 0xfb, 0x8a, 0xc4, 0xee, 0xa7, 0x37, 0x51, 0x8b, 0xc3, 0xf3, 0x39, 0x4e, 0x21, 0xf8, + 0x21, 0xba, 0xe3, 0x58, 0xe7, 0x5f, 0x9e, 0x7b, 0xd4, 0xb7, 0x04, 0x65, 0x6e, 0x03, 0x6c, 0xe6, + 0xb6, 0xb8, 0xba, 0x5a, 0x56, 0x76, 0xf2, 0xa6, 0x1a, 0xf6, 0x4b, 0x77, 0x1e, 0x4d, 0xd9, 0x27, + 0x53, 0x55, 0xf8, 0x3e, 0x5a, 0xf7, 0x4e, 0xe9, 0x79, 0x3d, 0x68, 0xf6, 0xa8, 0x7d, 0x0c, 0x17, + 0x6a, 0xa1, 0xac, 0xec, 0xac, 0x99, 0x5b, 0x61, 0xbf, 0xb4, 0x5e, 0x3f, 0x3e, 0xfa, 0x6e, 0xb0, + 0x41, 0xc6, 0xf3, 0x70, 0x15, 0x6d, 0x79, 0x3e, 0x63, 0xed, 0xc7, 0xed, 0x3a, 0xe3, 0x1c, 0x38, + 0xa7, 0xcc, 0x55, 0x91, 0x14, 0xdf, 0x8d, 0x2e, 0xa6, 0x3e, 0xb9, 0x49, 0xb2, 0xf9, 0x95, 0xbf, + 0x17, 0xd1, 0x3b, 0xaf, 0xf8, 0x12, 0x60, 0x1b, 0xa1, 0xc8, 0x26, 0x8d, 0x1c, 0x73, 0x55, 0x91, + 0x4f, 0xcf, 0x98, 0xef, 0x55, 0x57, 0x53, 0xdd, 0xf0, 0xa9, 0x0c, 0x42, 0x9c, 0x8c, 0x60, 0xf1, + 0x21, 0xda, 0x1c, 0x79, 0xc1, 0xd5, 0xae, 0x45, 0xdd, 0xe4, 0xcd, 0xa8, 0x89, 0x72, 0xb3, 0x3a, + 0xb1, 0x4f, 0x32, 0x0a, 0xfc, 0x2d, 0x2a, 0xb8, 0x4c, 0x98, 0xd0, 0x66, 0x7e, 0x3c, 0xef, 0xc5, + 0xbd, 0x0f, 0xe6, 0x73, 0x7a, 0x42, 0x1d, 0x30, 0xd7, 0xc3, 0x7e, 0xa9, 0x50, 0x4b, 0x01, 0x64, + 0xc8, 0xc2, 0x6d, 0xb4, 0xd1, 0x84, 0x0e, 0x75, 0x09, 0xb4, 0x7d, 0xe0, 0xdd, 0x03, 0x21, 0x9f, + 0xc0, 0xeb, 0xd1, 0x71, 0xd8, 0x2f, 0x6d, 0x98, 0x63, 0x14, 0x32, 0x41, 0xc5, 0x27, 0xd1, 0xfc, + 0x8b, 0x83, 0xb6, 0x00, 0x5f, 0xce, 0xff, 0xeb, 0x55, 0x58, 0x8b, 0xdf, 0x49, 0xac, 0x27, 0x03, + 0x92, 0xf9, 0xd5, 0xe5, 0x95, 0x96, 0x7b, 0x7e, 0xa5, 0xe5, 0x5e, 0x5c, 0x69, 0xb9, 0x5f, 0x42, + 0x4d, 0xb9, 0x0c, 0x35, 0xe5, 0x79, 0xa8, 0x29, 0x2f, 0x42, 0x4d, 0xf9, 0x27, 0xd4, 0x94, 0xdf, + 0xfe, 0xd5, 0x72, 0x4f, 0xcb, 0xd7, 0xfd, 0xd9, 0xfc, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x6c, + 0x5a, 0xc4, 0x8f, 0x0a, 0x00, 0x00, } func (m *ClusterTrustBundle) Marshal() (dAtA []byte, err error) { @@ -292,6 +441,261 @@ func (m *ClusterTrustBundleSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *PodCertificateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodCertificateRequestList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequestList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequestList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodCertificateRequestSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequestSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequestSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ProofOfPossession != nil { + i -= len(m.ProofOfPossession) + copy(dAtA[i:], m.ProofOfPossession) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ProofOfPossession))) + i-- + dAtA[i] = 0x52 + } + if m.PKIXPublicKey != nil { + i -= len(m.PKIXPublicKey) + copy(dAtA[i:], m.PKIXPublicKey) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PKIXPublicKey))) + i-- + dAtA[i] = 0x4a + } + if m.MaxExpirationSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxExpirationSeconds)) + i-- + dAtA[i] = 0x40 + } + i -= len(m.NodeUID) + copy(dAtA[i:], m.NodeUID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeUID))) + i-- + dAtA[i] = 0x3a + i -= len(m.NodeName) + copy(dAtA[i:], m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName))) + i-- + dAtA[i] = 0x32 + i -= len(m.ServiceAccountUID) + copy(dAtA[i:], m.ServiceAccountUID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServiceAccountUID))) + i-- + dAtA[i] = 0x2a + i -= len(m.ServiceAccountName) + copy(dAtA[i:], m.ServiceAccountName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ServiceAccountName))) + i-- + dAtA[i] = 0x22 + i -= len(m.PodUID) + copy(dAtA[i:], m.PodUID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PodUID))) + i-- + dAtA[i] = 0x1a + i -= len(m.PodName) + copy(dAtA[i:], m.PodName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PodName))) + i-- + dAtA[i] = 0x12 + i -= len(m.SignerName) + copy(dAtA[i:], m.SignerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.SignerName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PodCertificateRequestStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateRequestStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateRequestStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NotAfter != nil { + { + size, err := m.NotAfter.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.BeginRefreshAt != nil { + { + size, err := m.BeginRefreshAt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.NotBefore != nil { + { + size, err := m.NotBefore.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + i -= len(m.CertificateChain) + copy(dAtA[i:], m.CertificateChain) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CertificateChain))) + i-- + dAtA[i] = 0x12 + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { offset -= sovGenerated(v) base := offset @@ -346,25 +750,120 @@ func (m *ClusterTrustBundleSpec) Size() (n int) { return n } -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *ClusterTrustBundle) String() string { - if this == nil { - return "nil" +func (m *PodCertificateRequest) Size() (n int) { + if m == nil { + return 0 } - s := strings.Join([]string{`&ClusterTrustBundle{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ClusterTrustBundleSpec", "ClusterTrustBundleSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ClusterTrustBundleList) String() string { - if this == nil { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PodCertificateRequestList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PodCertificateRequestSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SignerName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.PodName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.PodUID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ServiceAccountName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ServiceAccountUID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.NodeUID) + n += 1 + l + sovGenerated(uint64(l)) + if m.MaxExpirationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.MaxExpirationSeconds)) + } + if m.PKIXPublicKey != nil { + l = len(m.PKIXPublicKey) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ProofOfPossession != nil { + l = len(m.ProofOfPossession) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *PodCertificateRequestStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.CertificateChain) + n += 1 + l + sovGenerated(uint64(l)) + if m.NotBefore != nil { + l = m.NotBefore.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.BeginRefreshAt != nil { + l = m.BeginRefreshAt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NotAfter != nil { + l = m.NotAfter.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *ClusterTrustBundle) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ClusterTrustBundle{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ClusterTrustBundleSpec", "ClusterTrustBundleSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ClusterTrustBundleList) String() string { + if this == nil { return "nil" } repeatedStringForItems := "[]ClusterTrustBundle{" @@ -390,6 +889,72 @@ func (this *ClusterTrustBundleSpec) String() string { }, "") return s } +func (this *PodCertificateRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodCertificateRequest{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "PodCertificateRequestSpec", "PodCertificateRequestSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "PodCertificateRequestStatus", "PodCertificateRequestStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodCertificateRequestList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]PodCertificateRequest{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "PodCertificateRequest", "PodCertificateRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&PodCertificateRequestList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *PodCertificateRequestSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodCertificateRequestSpec{`, + `SignerName:` + fmt.Sprintf("%v", this.SignerName) + `,`, + `PodName:` + fmt.Sprintf("%v", this.PodName) + `,`, + `PodUID:` + fmt.Sprintf("%v", this.PodUID) + `,`, + `ServiceAccountName:` + fmt.Sprintf("%v", this.ServiceAccountName) + `,`, + `ServiceAccountUID:` + fmt.Sprintf("%v", this.ServiceAccountUID) + `,`, + `NodeName:` + fmt.Sprintf("%v", this.NodeName) + `,`, + `NodeUID:` + fmt.Sprintf("%v", this.NodeUID) + `,`, + `MaxExpirationSeconds:` + valueToStringGenerated(this.MaxExpirationSeconds) + `,`, + `PKIXPublicKey:` + valueToStringGenerated(this.PKIXPublicKey) + `,`, + `ProofOfPossession:` + valueToStringGenerated(this.ProofOfPossession) + `,`, + `}`, + }, "") + return s +} +func (this *PodCertificateRequestStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&PodCertificateRequestStatus{`, + `Conditions:` + repeatedStringForConditions + `,`, + `CertificateChain:` + fmt.Sprintf("%v", this.CertificateChain) + `,`, + `NotBefore:` + strings.Replace(fmt.Sprintf("%v", this.NotBefore), "Time", "v1.Time", 1) + `,`, + `BeginRefreshAt:` + strings.Replace(fmt.Sprintf("%v", this.BeginRefreshAt), "Time", "v1.Time", 1) + `,`, + `NotAfter:` + strings.Replace(fmt.Sprintf("%v", this.NotAfter), "Time", "v1.Time", 1) + `,`, + `}`, + }, "") + return s +} func valueToStringGenerated(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -745,6 +1310,858 @@ func (m *ClusterTrustBundleSpec) Unmarshal(dAtA []byte) error { } return nil } +func (m *PodCertificateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateRequestList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequestList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequestList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, PodCertificateRequest{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateRequestSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequestSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequestSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignerName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignerName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PodName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PodUID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccountName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceAccountUID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeName = k8s_io_apimachinery_pkg_types.NodeName(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeUID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeUID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxExpirationSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.MaxExpirationSeconds = &v + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PKIXPublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PKIXPublicKey = append(m.PKIXPublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.PKIXPublicKey == nil { + m.PKIXPublicKey = []byte{} + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProofOfPossession", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProofOfPossession = append(m.ProofOfPossession[:0], dAtA[iNdEx:postIndex]...) + if m.ProofOfPossession == nil { + m.ProofOfPossession = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateRequestStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateRequestStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodCertificateRequestStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CertificateChain", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CertificateChain = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NotBefore", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NotBefore == nil { + m.NotBefore = &v1.Time{} + } + if err := m.NotBefore.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BeginRefreshAt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BeginRefreshAt == nil { + m.BeginRefreshAt = &v1.Time{} + } + if err := m.BeginRefreshAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NotAfter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NotAfter == nil { + m.NotAfter = &v1.Time{} + } + if err := m.NotAfter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGenerated(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/vendor/k8s.io/api/certificates/v1alpha1/generated.proto b/vendor/k8s.io/api/certificates/v1alpha1/generated.proto index 7155f778cf..194bdbc14f 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1alpha1/generated.proto @@ -101,3 +101,208 @@ message ClusterTrustBundleSpec { optional string trustBundle = 2; } +// PodCertificateRequest encodes a pod requesting a certificate from a given +// signer. +// +// Kubelets use this API to implement podCertificate projected volumes +message PodCertificateRequest { + // metadata contains the object metadata. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // spec contains the details about the certificate being requested. + optional PodCertificateRequestSpec spec = 2; + + // status contains the issued certificate, and a standard set of conditions. + // +optional + optional PodCertificateRequestStatus status = 3; +} + +// PodCertificateRequestList is a collection of PodCertificateRequest objects +message PodCertificateRequestList { + // metadata contains the list metadata. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is a collection of PodCertificateRequest objects + repeated PodCertificateRequest items = 2; +} + +// PodCertificateRequestSpec describes the certificate request. All fields are +// immutable after creation. +message PodCertificateRequestSpec { + // signerName indicates the requested signer. + // + // All signer names beginning with `kubernetes.io` are reserved for use by + // the Kubernetes project. There is currently one well-known signer + // documented by the Kubernetes project, + // `kubernetes.io/kube-apiserver-client-pod`, which will issue client + // certificates understood by kube-apiserver. It is currently + // unimplemented. + // + // +required + optional string signerName = 1; + + // podName is the name of the pod into which the certificate will be mounted. + // + // +required + optional string podName = 2; + + // podUID is the UID of the pod into which the certificate will be mounted. + // + // +required + optional string podUID = 3; + + // serviceAccountName is the name of the service account the pod is running as. + // + // +required + optional string serviceAccountName = 4; + + // serviceAccountUID is the UID of the service account the pod is running as. + // + // +required + optional string serviceAccountUID = 5; + + // nodeName is the name of the node the pod is assigned to. + // + // +required + optional string nodeName = 6; + + // nodeUID is the UID of the node the pod is assigned to. + // + // +required + optional string nodeUID = 7; + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + // +default=86400 + optional int32 maxExpirationSeconds = 8; + + // pkixPublicKey is the PKIX-serialized public key the signer will issue the + // certificate to. + // + // The key must be one of RSA3072, RSA4096, ECDSAP256, ECDSAP384, ECDSAP521, + // or ED25519. Note that this list may be expanded in the future. + // + // Signer implementations do not need to support all key types supported by + // kube-apiserver and kubelet. If a signer does not support the key type + // used for a given PodCertificateRequest, it must deny the request by + // setting a status.conditions entry with a type of "Denied" and a reason of + // "UnsupportedKeyType". It may also suggest a key type that it does support + // in the message field. + // + // +required + optional bytes pkixPublicKey = 9; + + // proofOfPossession proves that the requesting kubelet holds the private + // key corresponding to pkixPublicKey. + // + // It is contructed by signing the ASCII bytes of the pod's UID using + // `pkixPublicKey`. + // + // kube-apiserver validates the proof of possession during creation of the + // PodCertificateRequest. + // + // If the key is an RSA key, then the signature is over the ASCII bytes of + // the pod UID, using RSASSA-PSS from RFC 8017 (as implemented by the golang + // function crypto/rsa.SignPSS with nil options). + // + // If the key is an ECDSA key, then the signature is as described by [SEC 1, + // Version 2.0](https://www.secg.org/sec1-v2.pdf) (as implemented by the + // golang library function crypto/ecdsa.SignASN1) + // + // If the key is an ED25519 key, the the signature is as described by the + // [ED25519 Specification](https://ed25519.cr.yp.to/) (as implemented by + // the golang library crypto/ed25519.Sign). + // + // +required + optional bytes proofOfPossession = 10; +} + +// PodCertificateRequestStatus describes the status of the request, and holds +// the certificate data if the request is issued. +message PodCertificateRequestStatus { + // conditions applied to the request. + // + // The types "Issued", "Denied", and "Failed" have special handling. At + // most one of these conditions may be present, and they must have status + // "True". + // + // If the request is denied with `Reason=UnsupportedKeyType`, the signer may + // suggest a key type that will work in the message field. + // + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + // +optional + repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 1; + + // certificateChain is populated with an issued certificate by the signer. + // This field is set via the /status subresource. Once populated, this field + // is immutable. + // + // If the certificate signing request is denied, a condition of type + // "Denied" is added and this field remains empty. If the signer cannot + // issue the certificate, a condition of type "Failed" is added and this + // field remains empty. + // + // Validation requirements: + // 1. certificateChain must consist of one or more PEM-formatted certificates. + // 2. Each entry must be a valid PEM-wrapped, DER-encoded ASN.1 Certificate as + // described in section 4 of RFC5280. + // + // If more than one block is present, and the definition of the requested + // spec.signerName does not indicate otherwise, the first block is the + // issued certificate, and subsequent blocks should be treated as + // intermediate certificates and presented in TLS handshakes. When + // projecting the chain into a pod volume, kubelet will drop any data + // in-between the PEM blocks, as well as any PEM block headers. + // + // +optional + optional string certificateChain = 2; + + // notBefore is the time at which the certificate becomes valid. The value + // must be the same as the notBefore value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time notBefore = 4; + + // beginRefreshAt is the time at which the kubelet should begin trying to + // refresh the certificate. This field is set via the /status subresource, + // and must be set at the same time as certificateChain. Once populated, + // this field is immutable. + // + // This field is only a hint. Kubelet may start refreshing before or after + // this time if necessary. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time beginRefreshAt = 5; + + // notAfter is the time at which the certificate expires. The value must be + // the same as the notAfter value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time notAfter = 6; +} + diff --git a/vendor/k8s.io/api/certificates/v1alpha1/register.go b/vendor/k8s.io/api/certificates/v1alpha1/register.go index 7288ed9a3e..ae541e15c1 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/register.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/register.go @@ -53,6 +53,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &ClusterTrustBundle{}, &ClusterTrustBundleList{}, + &PodCertificateRequest{}, + &PodCertificateRequestList{}, ) // Add the watch version that applies diff --git a/vendor/k8s.io/api/certificates/v1alpha1/types.go b/vendor/k8s.io/api/certificates/v1alpha1/types.go index beef02599d..a5cb3809e7 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/types.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/types.go @@ -18,6 +18,7 @@ package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" ) // +genclient @@ -106,3 +107,233 @@ type ClusterTrustBundleList struct { // items is a collection of ClusterTrustBundle objects Items []ClusterTrustBundle `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// +genclient +// +k8s:prerelease-lifecycle-gen:introduced=1.34 +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// PodCertificateRequest encodes a pod requesting a certificate from a given +// signer. +// +// Kubelets use this API to implement podCertificate projected volumes +type PodCertificateRequest struct { + metav1.TypeMeta `json:",inline"` + + // metadata contains the object metadata. + // + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // spec contains the details about the certificate being requested. + Spec PodCertificateRequestSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` + + // status contains the issued certificate, and a standard set of conditions. + // +optional + Status PodCertificateRequestStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// PodCertificateRequestSpec describes the certificate request. All fields are +// immutable after creation. +type PodCertificateRequestSpec struct { + // signerName indicates the requested signer. + // + // All signer names beginning with `kubernetes.io` are reserved for use by + // the Kubernetes project. There is currently one well-known signer + // documented by the Kubernetes project, + // `kubernetes.io/kube-apiserver-client-pod`, which will issue client + // certificates understood by kube-apiserver. It is currently + // unimplemented. + // + // +required + SignerName string `json:"signerName" protobuf:"bytes,1,opt,name=signerName"` + + // podName is the name of the pod into which the certificate will be mounted. + // + // +required + PodName string `json:"podName" protobuf:"bytes,2,opt,name=podName"` + // podUID is the UID of the pod into which the certificate will be mounted. + // + // +required + PodUID types.UID `json:"podUID" protobuf:"bytes,3,opt,name=podUID"` + + // serviceAccountName is the name of the service account the pod is running as. + // + // +required + ServiceAccountName string `json:"serviceAccountName" protobuf:"bytes,4,opt,name=serviceAccountName"` + // serviceAccountUID is the UID of the service account the pod is running as. + // + // +required + ServiceAccountUID types.UID `json:"serviceAccountUID" protobuf:"bytes,5,opt,name=serviceAccountUID"` + + // nodeName is the name of the node the pod is assigned to. + // + // +required + NodeName types.NodeName `json:"nodeName" protobuf:"bytes,6,opt,name=nodeName"` + // nodeUID is the UID of the node the pod is assigned to. + // + // +required + NodeUID types.UID `json:"nodeUID" protobuf:"bytes,7,opt,name=nodeUID"` + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + // +default=86400 + MaxExpirationSeconds *int32 `json:"maxExpirationSeconds,omitempty" protobuf:"varint,8,opt,name=maxExpirationSeconds"` + + // pkixPublicKey is the PKIX-serialized public key the signer will issue the + // certificate to. + // + // The key must be one of RSA3072, RSA4096, ECDSAP256, ECDSAP384, ECDSAP521, + // or ED25519. Note that this list may be expanded in the future. + // + // Signer implementations do not need to support all key types supported by + // kube-apiserver and kubelet. If a signer does not support the key type + // used for a given PodCertificateRequest, it must deny the request by + // setting a status.conditions entry with a type of "Denied" and a reason of + // "UnsupportedKeyType". It may also suggest a key type that it does support + // in the message field. + // + // +required + PKIXPublicKey []byte `json:"pkixPublicKey" protobuf:"bytes,9,opt,name=pkixPublicKey"` + + // proofOfPossession proves that the requesting kubelet holds the private + // key corresponding to pkixPublicKey. + // + // It is contructed by signing the ASCII bytes of the pod's UID using + // `pkixPublicKey`. + // + // kube-apiserver validates the proof of possession during creation of the + // PodCertificateRequest. + // + // If the key is an RSA key, then the signature is over the ASCII bytes of + // the pod UID, using RSASSA-PSS from RFC 8017 (as implemented by the golang + // function crypto/rsa.SignPSS with nil options). + // + // If the key is an ECDSA key, then the signature is as described by [SEC 1, + // Version 2.0](https://www.secg.org/sec1-v2.pdf) (as implemented by the + // golang library function crypto/ecdsa.SignASN1) + // + // If the key is an ED25519 key, the the signature is as described by the + // [ED25519 Specification](https://ed25519.cr.yp.to/) (as implemented by + // the golang library crypto/ed25519.Sign). + // + // +required + ProofOfPossession []byte `json:"proofOfPossession" protobuf:"bytes,10,opt,name=proofOfPossession"` +} + +// PodCertificateRequestStatus describes the status of the request, and holds +// the certificate data if the request is issued. +type PodCertificateRequestStatus struct { + // conditions applied to the request. + // + // The types "Issued", "Denied", and "Failed" have special handling. At + // most one of these conditions may be present, and they must have status + // "True". + // + // If the request is denied with `Reason=UnsupportedKeyType`, the signer may + // suggest a key type that will work in the message field. + // + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` + + // certificateChain is populated with an issued certificate by the signer. + // This field is set via the /status subresource. Once populated, this field + // is immutable. + // + // If the certificate signing request is denied, a condition of type + // "Denied" is added and this field remains empty. If the signer cannot + // issue the certificate, a condition of type "Failed" is added and this + // field remains empty. + // + // Validation requirements: + // 1. certificateChain must consist of one or more PEM-formatted certificates. + // 2. Each entry must be a valid PEM-wrapped, DER-encoded ASN.1 Certificate as + // described in section 4 of RFC5280. + // + // If more than one block is present, and the definition of the requested + // spec.signerName does not indicate otherwise, the first block is the + // issued certificate, and subsequent blocks should be treated as + // intermediate certificates and presented in TLS handshakes. When + // projecting the chain into a pod volume, kubelet will drop any data + // in-between the PEM blocks, as well as any PEM block headers. + // + // +optional + CertificateChain string `json:"certificateChain,omitempty" protobuf:"bytes,2,opt,name=certificateChain"` + + // notBefore is the time at which the certificate becomes valid. The value + // must be the same as the notBefore value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + NotBefore *metav1.Time `json:"notBefore,omitempty" protobuf:"bytes,4,opt,name=notBefore"` + + // beginRefreshAt is the time at which the kubelet should begin trying to + // refresh the certificate. This field is set via the /status subresource, + // and must be set at the same time as certificateChain. Once populated, + // this field is immutable. + // + // This field is only a hint. Kubelet may start refreshing before or after + // this time if necessary. + // + // +optional + BeginRefreshAt *metav1.Time `json:"beginRefreshAt,omitempty" protobuf:"bytes,5,opt,name=beginRefreshAt"` + + // notAfter is the time at which the certificate expires. The value must be + // the same as the notAfter value in the leaf certificate in + // certificateChain. This field is set via the /status subresource. Once + // populated, it is immutable. The signer must set this field at the same + // time it sets certificateChain. + // + // +optional + NotAfter *metav1.Time `json:"notAfter,omitempty" protobuf:"bytes,6,opt,name=notAfter"` +} + +// Well-known condition types for PodCertificateRequests +const ( + // Denied indicates the request was denied by the signer. + PodCertificateRequestConditionTypeDenied string = "Denied" + // Failed indicates the signer failed to issue the certificate. + PodCertificateRequestConditionTypeFailed string = "Failed" + // Issued indicates the certificate has been issued. + PodCertificateRequestConditionTypeIssued string = "Issued" +) + +// Well-known condition reasons for PodCertificateRequests +const ( + // UnsupportedKeyType should be set on "Denied" conditions when the signer + // doesn't support the key type of publicKey. + PodCertificateRequestConditionUnsupportedKeyType string = "UnsupportedKeyType" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +k8s:prerelease-lifecycle-gen:introduced=1.34 + +// PodCertificateRequestList is a collection of PodCertificateRequest objects +type PodCertificateRequestList struct { + metav1.TypeMeta `json:",inline"` + + // metadata contains the list metadata. + // + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is a collection of PodCertificateRequest objects + Items []PodCertificateRequest `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go index bff649e3cb..d29f2d8505 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go @@ -57,4 +57,56 @@ func (ClusterTrustBundleSpec) SwaggerDoc() map[string]string { return map_ClusterTrustBundleSpec } +var map_PodCertificateRequest = map[string]string{ + "": "PodCertificateRequest encodes a pod requesting a certificate from a given signer.\n\nKubelets use this API to implement podCertificate projected volumes", + "metadata": "metadata contains the object metadata.", + "spec": "spec contains the details about the certificate being requested.", + "status": "status contains the issued certificate, and a standard set of conditions.", +} + +func (PodCertificateRequest) SwaggerDoc() map[string]string { + return map_PodCertificateRequest +} + +var map_PodCertificateRequestList = map[string]string{ + "": "PodCertificateRequestList is a collection of PodCertificateRequest objects", + "metadata": "metadata contains the list metadata.", + "items": "items is a collection of PodCertificateRequest objects", +} + +func (PodCertificateRequestList) SwaggerDoc() map[string]string { + return map_PodCertificateRequestList +} + +var map_PodCertificateRequestSpec = map[string]string{ + "": "PodCertificateRequestSpec describes the certificate request. All fields are immutable after creation.", + "signerName": "signerName indicates the requested signer.\n\nAll signer names beginning with `kubernetes.io` are reserved for use by the Kubernetes project. There is currently one well-known signer documented by the Kubernetes project, `kubernetes.io/kube-apiserver-client-pod`, which will issue client certificates understood by kube-apiserver. It is currently unimplemented.", + "podName": "podName is the name of the pod into which the certificate will be mounted.", + "podUID": "podUID is the UID of the pod into which the certificate will be mounted.", + "serviceAccountName": "serviceAccountName is the name of the service account the pod is running as.", + "serviceAccountUID": "serviceAccountUID is the UID of the service account the pod is running as.", + "nodeName": "nodeName is the name of the node the pod is assigned to.", + "nodeUID": "nodeUID is the UID of the node the pod is assigned to.", + "maxExpirationSeconds": "maxExpirationSeconds is the maximum lifetime permitted for the certificate.\n\nIf omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver will reject values shorter than 3600 (1 hour). The maximum allowable value is 7862400 (91 days).\n\nThe signer implementation is then free to issue a certificate with any lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 seconds (1 hour). This constraint is enforced by kube-apiserver. `kubernetes.io` signers will never issue certificates with a lifetime longer than 24 hours.", + "pkixPublicKey": "pkixPublicKey is the PKIX-serialized public key the signer will issue the certificate to.\n\nThe key must be one of RSA3072, RSA4096, ECDSAP256, ECDSAP384, ECDSAP521, or ED25519. Note that this list may be expanded in the future.\n\nSigner implementations do not need to support all key types supported by kube-apiserver and kubelet. If a signer does not support the key type used for a given PodCertificateRequest, it must deny the request by setting a status.conditions entry with a type of \"Denied\" and a reason of \"UnsupportedKeyType\". It may also suggest a key type that it does support in the message field.", + "proofOfPossession": "proofOfPossession proves that the requesting kubelet holds the private key corresponding to pkixPublicKey.\n\nIt is contructed by signing the ASCII bytes of the pod's UID using `pkixPublicKey`.\n\nkube-apiserver validates the proof of possession during creation of the PodCertificateRequest.\n\nIf the key is an RSA key, then the signature is over the ASCII bytes of the pod UID, using RSASSA-PSS from RFC 8017 (as implemented by the golang function crypto/rsa.SignPSS with nil options).\n\nIf the key is an ECDSA key, then the signature is as described by [SEC 1, Version 2.0](https://www.secg.org/sec1-v2.pdf) (as implemented by the golang library function crypto/ecdsa.SignASN1)\n\nIf the key is an ED25519 key, the the signature is as described by the [ED25519 Specification](https://ed25519.cr.yp.to/) (as implemented by the golang library crypto/ed25519.Sign).", +} + +func (PodCertificateRequestSpec) SwaggerDoc() map[string]string { + return map_PodCertificateRequestSpec +} + +var map_PodCertificateRequestStatus = map[string]string{ + "": "PodCertificateRequestStatus describes the status of the request, and holds the certificate data if the request is issued.", + "conditions": "conditions applied to the request.\n\nThe types \"Issued\", \"Denied\", and \"Failed\" have special handling. At most one of these conditions may be present, and they must have status \"True\".\n\nIf the request is denied with `Reason=UnsupportedKeyType`, the signer may suggest a key type that will work in the message field.", + "certificateChain": "certificateChain is populated with an issued certificate by the signer. This field is set via the /status subresource. Once populated, this field is immutable.\n\nIf the certificate signing request is denied, a condition of type \"Denied\" is added and this field remains empty. If the signer cannot issue the certificate, a condition of type \"Failed\" is added and this field remains empty.\n\nValidation requirements:\n 1. certificateChain must consist of one or more PEM-formatted certificates.\n 2. Each entry must be a valid PEM-wrapped, DER-encoded ASN.1 Certificate as\n described in section 4 of RFC5280.\n\nIf more than one block is present, and the definition of the requested spec.signerName does not indicate otherwise, the first block is the issued certificate, and subsequent blocks should be treated as intermediate certificates and presented in TLS handshakes. When projecting the chain into a pod volume, kubelet will drop any data in-between the PEM blocks, as well as any PEM block headers.", + "notBefore": "notBefore is the time at which the certificate becomes valid. The value must be the same as the notBefore value in the leaf certificate in certificateChain. This field is set via the /status subresource. Once populated, it is immutable. The signer must set this field at the same time it sets certificateChain.", + "beginRefreshAt": "beginRefreshAt is the time at which the kubelet should begin trying to refresh the certificate. This field is set via the /status subresource, and must be set at the same time as certificateChain. Once populated, this field is immutable.\n\nThis field is only a hint. Kubelet may start refreshing before or after this time if necessary.", + "notAfter": "notAfter is the time at which the certificate expires. The value must be the same as the notAfter value in the leaf certificate in certificateChain. This field is set via the /status subresource. Once populated, it is immutable. The signer must set this field at the same time it sets certificateChain.", +} + +func (PodCertificateRequestStatus) SwaggerDoc() map[string]string { + return map_PodCertificateRequestStatus +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go index 30a4dc1e80..25bc0ed6cb 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go @@ -22,6 +22,7 @@ limitations under the License. package v1alpha1 import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -100,3 +101,130 @@ func (in *ClusterTrustBundleSpec) DeepCopy() *ClusterTrustBundleSpec { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequest) DeepCopyInto(out *PodCertificateRequest) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequest. +func (in *PodCertificateRequest) DeepCopy() *PodCertificateRequest { + if in == nil { + return nil + } + out := new(PodCertificateRequest) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodCertificateRequest) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequestList) DeepCopyInto(out *PodCertificateRequestList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]PodCertificateRequest, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequestList. +func (in *PodCertificateRequestList) DeepCopy() *PodCertificateRequestList { + if in == nil { + return nil + } + out := new(PodCertificateRequestList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PodCertificateRequestList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequestSpec) DeepCopyInto(out *PodCertificateRequestSpec) { + *out = *in + if in.MaxExpirationSeconds != nil { + in, out := &in.MaxExpirationSeconds, &out.MaxExpirationSeconds + *out = new(int32) + **out = **in + } + if in.PKIXPublicKey != nil { + in, out := &in.PKIXPublicKey, &out.PKIXPublicKey + *out = make([]byte, len(*in)) + copy(*out, *in) + } + if in.ProofOfPossession != nil { + in, out := &in.ProofOfPossession, &out.ProofOfPossession + *out = make([]byte, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequestSpec. +func (in *PodCertificateRequestSpec) DeepCopy() *PodCertificateRequestSpec { + if in == nil { + return nil + } + out := new(PodCertificateRequestSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateRequestStatus) DeepCopyInto(out *PodCertificateRequestStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.NotBefore != nil { + in, out := &in.NotBefore, &out.NotBefore + *out = (*in).DeepCopy() + } + if in.BeginRefreshAt != nil { + in, out := &in.BeginRefreshAt, &out.BeginRefreshAt + *out = (*in).DeepCopy() + } + if in.NotAfter != nil { + in, out := &in.NotAfter, &out.NotAfter + *out = (*in).DeepCopy() + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateRequestStatus. +func (in *PodCertificateRequestStatus) DeepCopy() *PodCertificateRequestStatus { + if in == nil { + return nil + } + out := new(PodCertificateRequestStatus) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go index 3121a87d08..edbfce79bc 100644 --- a/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go +++ b/vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go @@ -56,3 +56,39 @@ func (in *ClusterTrustBundleList) APILifecycleDeprecated() (major, minor int) { func (in *ClusterTrustBundleList) APILifecycleRemoved() (major, minor int) { return 1, 37 } + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *PodCertificateRequest) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *PodCertificateRequest) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *PodCertificateRequest) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} + +// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. +func (in *PodCertificateRequestList) APILifecycleIntroduced() (major, minor int) { + return 1, 34 +} + +// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. +func (in *PodCertificateRequestList) APILifecycleDeprecated() (major, minor int) { + return 1, 37 +} + +// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. +// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. +func (in *PodCertificateRequestList) APILifecycleRemoved() (major, minor int) { + return 1, 40 +} diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.proto b/vendor/k8s.io/api/certificates/v1beta1/generated.proto index 7c48270f65..4c9385c196 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.proto @@ -30,6 +30,8 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; option go_package = "k8s.io/api/certificates/v1beta1"; // Describes a certificate signing request +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval message CertificateSigningRequest { // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; @@ -182,6 +184,11 @@ message CertificateSigningRequestStatus { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember repeated CertificateSigningRequestCondition conditions = 1; // If request was approved, the controller will place the issued certificate here. diff --git a/vendor/k8s.io/api/certificates/v1beta1/types.go b/vendor/k8s.io/api/certificates/v1beta1/types.go index 1ce104807d..fadb7e082e 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/types.go +++ b/vendor/k8s.io/api/certificates/v1beta1/types.go @@ -31,6 +31,8 @@ import ( // +k8s:prerelease-lifecycle-gen:replacement=certificates.k8s.io,v1,CertificateSigningRequest // Describes a certificate signing request +// +k8s:supportsSubresource=/status +// +k8s:supportsSubresource=/approval type CertificateSigningRequest struct { metav1.TypeMeta `json:",inline"` // +optional @@ -175,6 +177,11 @@ type CertificateSigningRequestStatus struct { // +listType=map // +listMapKey=type // +optional + // +k8s:listType=map + // +k8s:listMapKey=type + // +k8s:optional + // +k8s:item(type: "Approved")=+k8s:zeroOrOneOfMember + // +k8s:item(type: "Denied")=+k8s:zeroOrOneOfMember Conditions []CertificateSigningRequestCondition `json:"conditions,omitempty" protobuf:"bytes,1,rep,name=conditions"` // If request was approved, the controller will place the issued certificate here. diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index a4b8f58429..e1a297b985 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -861,10 +861,38 @@ func (m *Container) XXX_DiscardUnknown() { var xxx_messageInfo_Container proto.InternalMessageInfo +func (m *ContainerExtendedResourceRequest) Reset() { *m = ContainerExtendedResourceRequest{} } +func (*ContainerExtendedResourceRequest) ProtoMessage() {} +func (*ContainerExtendedResourceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{29} +} +func (m *ContainerExtendedResourceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerExtendedResourceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ContainerExtendedResourceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerExtendedResourceRequest.Merge(m, src) +} +func (m *ContainerExtendedResourceRequest) XXX_Size() int { + return m.Size() +} +func (m *ContainerExtendedResourceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerExtendedResourceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerExtendedResourceRequest proto.InternalMessageInfo + func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} func (*ContainerImage) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{29} + return fileDescriptor_6c07b07c062484ab, []int{30} } func (m *ContainerImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -892,7 +920,7 @@ var xxx_messageInfo_ContainerImage proto.InternalMessageInfo func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} func (*ContainerPort) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{30} + return fileDescriptor_6c07b07c062484ab, []int{31} } func (m *ContainerPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -920,7 +948,7 @@ var xxx_messageInfo_ContainerPort proto.InternalMessageInfo func (m *ContainerResizePolicy) Reset() { *m = ContainerResizePolicy{} } func (*ContainerResizePolicy) ProtoMessage() {} func (*ContainerResizePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{31} + return fileDescriptor_6c07b07c062484ab, []int{32} } func (m *ContainerResizePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,10 +973,66 @@ func (m *ContainerResizePolicy) XXX_DiscardUnknown() { var xxx_messageInfo_ContainerResizePolicy proto.InternalMessageInfo +func (m *ContainerRestartRule) Reset() { *m = ContainerRestartRule{} } +func (*ContainerRestartRule) ProtoMessage() {} +func (*ContainerRestartRule) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{33} +} +func (m *ContainerRestartRule) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerRestartRule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ContainerRestartRule) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerRestartRule.Merge(m, src) +} +func (m *ContainerRestartRule) XXX_Size() int { + return m.Size() +} +func (m *ContainerRestartRule) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerRestartRule.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerRestartRule proto.InternalMessageInfo + +func (m *ContainerRestartRuleOnExitCodes) Reset() { *m = ContainerRestartRuleOnExitCodes{} } +func (*ContainerRestartRuleOnExitCodes) ProtoMessage() {} +func (*ContainerRestartRuleOnExitCodes) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{34} +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerRestartRuleOnExitCodes.Merge(m, src) +} +func (m *ContainerRestartRuleOnExitCodes) XXX_Size() int { + return m.Size() +} +func (m *ContainerRestartRuleOnExitCodes) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerRestartRuleOnExitCodes.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerRestartRuleOnExitCodes proto.InternalMessageInfo + func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} func (*ContainerState) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{32} + return fileDescriptor_6c07b07c062484ab, []int{35} } func (m *ContainerState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -976,7 +1060,7 @@ var xxx_messageInfo_ContainerState proto.InternalMessageInfo func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} func (*ContainerStateRunning) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{33} + return fileDescriptor_6c07b07c062484ab, []int{36} } func (m *ContainerStateRunning) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1004,7 +1088,7 @@ var xxx_messageInfo_ContainerStateRunning proto.InternalMessageInfo func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{34} + return fileDescriptor_6c07b07c062484ab, []int{37} } func (m *ContainerStateTerminated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1032,7 +1116,7 @@ var xxx_messageInfo_ContainerStateTerminated proto.InternalMessageInfo func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{35} + return fileDescriptor_6c07b07c062484ab, []int{38} } func (m *ContainerStateWaiting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1060,7 +1144,7 @@ var xxx_messageInfo_ContainerStateWaiting proto.InternalMessageInfo func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} func (*ContainerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{36} + return fileDescriptor_6c07b07c062484ab, []int{39} } func (m *ContainerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1088,7 +1172,7 @@ var xxx_messageInfo_ContainerStatus proto.InternalMessageInfo func (m *ContainerUser) Reset() { *m = ContainerUser{} } func (*ContainerUser) ProtoMessage() {} func (*ContainerUser) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{37} + return fileDescriptor_6c07b07c062484ab, []int{40} } func (m *ContainerUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1116,7 +1200,7 @@ var xxx_messageInfo_ContainerUser proto.InternalMessageInfo func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} func (*DaemonEndpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{38} + return fileDescriptor_6c07b07c062484ab, []int{41} } func (m *DaemonEndpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1228,7 @@ var xxx_messageInfo_DaemonEndpoint proto.InternalMessageInfo func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{39} + return fileDescriptor_6c07b07c062484ab, []int{42} } func (m *DownwardAPIProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1172,7 +1256,7 @@ var xxx_messageInfo_DownwardAPIProjection proto.InternalMessageInfo func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{40} + return fileDescriptor_6c07b07c062484ab, []int{43} } func (m *DownwardAPIVolumeFile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1200,7 +1284,7 @@ var xxx_messageInfo_DownwardAPIVolumeFile proto.InternalMessageInfo func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{41} + return fileDescriptor_6c07b07c062484ab, []int{44} } func (m *DownwardAPIVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1228,7 +1312,7 @@ var xxx_messageInfo_DownwardAPIVolumeSource proto.InternalMessageInfo func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{42} + return fileDescriptor_6c07b07c062484ab, []int{45} } func (m *EmptyDirVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1256,7 +1340,7 @@ var xxx_messageInfo_EmptyDirVolumeSource proto.InternalMessageInfo func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} func (*EndpointAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{43} + return fileDescriptor_6c07b07c062484ab, []int{46} } func (m *EndpointAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1284,7 +1368,7 @@ var xxx_messageInfo_EndpointAddress proto.InternalMessageInfo func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} func (*EndpointPort) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{44} + return fileDescriptor_6c07b07c062484ab, []int{47} } func (m *EndpointPort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1312,7 +1396,7 @@ var xxx_messageInfo_EndpointPort proto.InternalMessageInfo func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} func (*EndpointSubset) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{45} + return fileDescriptor_6c07b07c062484ab, []int{48} } func (m *EndpointSubset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1340,7 +1424,7 @@ var xxx_messageInfo_EndpointSubset proto.InternalMessageInfo func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} func (*Endpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{46} + return fileDescriptor_6c07b07c062484ab, []int{49} } func (m *Endpoints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1368,7 +1452,7 @@ var xxx_messageInfo_Endpoints proto.InternalMessageInfo func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} func (*EndpointsList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{47} + return fileDescriptor_6c07b07c062484ab, []int{50} } func (m *EndpointsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1396,7 +1480,7 @@ var xxx_messageInfo_EndpointsList proto.InternalMessageInfo func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} func (*EnvFromSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{48} + return fileDescriptor_6c07b07c062484ab, []int{51} } func (m *EnvFromSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1424,7 +1508,7 @@ var xxx_messageInfo_EnvFromSource proto.InternalMessageInfo func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} func (*EnvVar) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{49} + return fileDescriptor_6c07b07c062484ab, []int{52} } func (m *EnvVar) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1452,7 +1536,7 @@ var xxx_messageInfo_EnvVar proto.InternalMessageInfo func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} func (*EnvVarSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{50} + return fileDescriptor_6c07b07c062484ab, []int{53} } func (m *EnvVarSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1480,7 +1564,7 @@ var xxx_messageInfo_EnvVarSource proto.InternalMessageInfo func (m *EphemeralContainer) Reset() { *m = EphemeralContainer{} } func (*EphemeralContainer) ProtoMessage() {} func (*EphemeralContainer) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{51} + return fileDescriptor_6c07b07c062484ab, []int{54} } func (m *EphemeralContainer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1508,7 +1592,7 @@ var xxx_messageInfo_EphemeralContainer proto.InternalMessageInfo func (m *EphemeralContainerCommon) Reset() { *m = EphemeralContainerCommon{} } func (*EphemeralContainerCommon) ProtoMessage() {} func (*EphemeralContainerCommon) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{52} + return fileDescriptor_6c07b07c062484ab, []int{55} } func (m *EphemeralContainerCommon) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1536,7 +1620,7 @@ var xxx_messageInfo_EphemeralContainerCommon proto.InternalMessageInfo func (m *EphemeralVolumeSource) Reset() { *m = EphemeralVolumeSource{} } func (*EphemeralVolumeSource) ProtoMessage() {} func (*EphemeralVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{53} + return fileDescriptor_6c07b07c062484ab, []int{56} } func (m *EphemeralVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1648,7 @@ var xxx_messageInfo_EphemeralVolumeSource proto.InternalMessageInfo func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{54} + return fileDescriptor_6c07b07c062484ab, []int{57} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1592,7 +1676,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} func (*EventList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{55} + return fileDescriptor_6c07b07c062484ab, []int{58} } func (m *EventList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1620,7 +1704,7 @@ var xxx_messageInfo_EventList proto.InternalMessageInfo func (m *EventSeries) Reset() { *m = EventSeries{} } func (*EventSeries) ProtoMessage() {} func (*EventSeries) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{56} + return fileDescriptor_6c07b07c062484ab, []int{59} } func (m *EventSeries) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1648,7 +1732,7 @@ var xxx_messageInfo_EventSeries proto.InternalMessageInfo func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} func (*EventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{57} + return fileDescriptor_6c07b07c062484ab, []int{60} } func (m *EventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,7 +1760,7 @@ var xxx_messageInfo_EventSource proto.InternalMessageInfo func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} func (*ExecAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{58} + return fileDescriptor_6c07b07c062484ab, []int{61} } func (m *ExecAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1704,7 +1788,7 @@ var xxx_messageInfo_ExecAction proto.InternalMessageInfo func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} func (*FCVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{59} + return fileDescriptor_6c07b07c062484ab, []int{62} } func (m *FCVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1729,10 +1813,38 @@ func (m *FCVolumeSource) XXX_DiscardUnknown() { var xxx_messageInfo_FCVolumeSource proto.InternalMessageInfo +func (m *FileKeySelector) Reset() { *m = FileKeySelector{} } +func (*FileKeySelector) ProtoMessage() {} +func (*FileKeySelector) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{63} +} +func (m *FileKeySelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *FileKeySelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *FileKeySelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_FileKeySelector.Merge(m, src) +} +func (m *FileKeySelector) XXX_Size() int { + return m.Size() +} +func (m *FileKeySelector) XXX_DiscardUnknown() { + xxx_messageInfo_FileKeySelector.DiscardUnknown(m) +} + +var xxx_messageInfo_FileKeySelector proto.InternalMessageInfo + func (m *FlexPersistentVolumeSource) Reset() { *m = FlexPersistentVolumeSource{} } func (*FlexPersistentVolumeSource) ProtoMessage() {} func (*FlexPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{60} + return fileDescriptor_6c07b07c062484ab, []int{64} } func (m *FlexPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1760,7 +1872,7 @@ var xxx_messageInfo_FlexPersistentVolumeSource proto.InternalMessageInfo func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} func (*FlexVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{61} + return fileDescriptor_6c07b07c062484ab, []int{65} } func (m *FlexVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1788,7 +1900,7 @@ var xxx_messageInfo_FlexVolumeSource proto.InternalMessageInfo func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{62} + return fileDescriptor_6c07b07c062484ab, []int{66} } func (m *FlockerVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1816,7 +1928,7 @@ var xxx_messageInfo_FlockerVolumeSource proto.InternalMessageInfo func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{63} + return fileDescriptor_6c07b07c062484ab, []int{67} } func (m *GCEPersistentDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1844,7 +1956,7 @@ var xxx_messageInfo_GCEPersistentDiskVolumeSource proto.InternalMessageInfo func (m *GRPCAction) Reset() { *m = GRPCAction{} } func (*GRPCAction) ProtoMessage() {} func (*GRPCAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{64} + return fileDescriptor_6c07b07c062484ab, []int{68} } func (m *GRPCAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1872,7 +1984,7 @@ var xxx_messageInfo_GRPCAction proto.InternalMessageInfo func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{65} + return fileDescriptor_6c07b07c062484ab, []int{69} } func (m *GitRepoVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1900,7 +2012,7 @@ var xxx_messageInfo_GitRepoVolumeSource proto.InternalMessageInfo func (m *GlusterfsPersistentVolumeSource) Reset() { *m = GlusterfsPersistentVolumeSource{} } func (*GlusterfsPersistentVolumeSource) ProtoMessage() {} func (*GlusterfsPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{66} + return fileDescriptor_6c07b07c062484ab, []int{70} } func (m *GlusterfsPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1928,7 +2040,7 @@ var xxx_messageInfo_GlusterfsPersistentVolumeSource proto.InternalMessageInfo func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{67} + return fileDescriptor_6c07b07c062484ab, []int{71} } func (m *GlusterfsVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1956,7 +2068,7 @@ var xxx_messageInfo_GlusterfsVolumeSource proto.InternalMessageInfo func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} func (*HTTPGetAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{68} + return fileDescriptor_6c07b07c062484ab, []int{72} } func (m *HTTPGetAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1984,7 +2096,7 @@ var xxx_messageInfo_HTTPGetAction proto.InternalMessageInfo func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} func (*HTTPHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{69} + return fileDescriptor_6c07b07c062484ab, []int{73} } func (m *HTTPHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2012,7 +2124,7 @@ var xxx_messageInfo_HTTPHeader proto.InternalMessageInfo func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} func (*HostAlias) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{70} + return fileDescriptor_6c07b07c062484ab, []int{74} } func (m *HostAlias) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2040,7 +2152,7 @@ var xxx_messageInfo_HostAlias proto.InternalMessageInfo func (m *HostIP) Reset() { *m = HostIP{} } func (*HostIP) ProtoMessage() {} func (*HostIP) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{71} + return fileDescriptor_6c07b07c062484ab, []int{75} } func (m *HostIP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2068,7 +2180,7 @@ var xxx_messageInfo_HostIP proto.InternalMessageInfo func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{72} + return fileDescriptor_6c07b07c062484ab, []int{76} } func (m *HostPathVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2096,7 +2208,7 @@ var xxx_messageInfo_HostPathVolumeSource proto.InternalMessageInfo func (m *ISCSIPersistentVolumeSource) Reset() { *m = ISCSIPersistentVolumeSource{} } func (*ISCSIPersistentVolumeSource) ProtoMessage() {} func (*ISCSIPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{73} + return fileDescriptor_6c07b07c062484ab, []int{77} } func (m *ISCSIPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2124,7 +2236,7 @@ var xxx_messageInfo_ISCSIPersistentVolumeSource proto.InternalMessageInfo func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{74} + return fileDescriptor_6c07b07c062484ab, []int{78} } func (m *ISCSIVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2152,7 +2264,7 @@ var xxx_messageInfo_ISCSIVolumeSource proto.InternalMessageInfo func (m *ImageVolumeSource) Reset() { *m = ImageVolumeSource{} } func (*ImageVolumeSource) ProtoMessage() {} func (*ImageVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{75} + return fileDescriptor_6c07b07c062484ab, []int{79} } func (m *ImageVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2180,7 +2292,7 @@ var xxx_messageInfo_ImageVolumeSource proto.InternalMessageInfo func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} func (*KeyToPath) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{76} + return fileDescriptor_6c07b07c062484ab, []int{80} } func (m *KeyToPath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2208,7 +2320,7 @@ var xxx_messageInfo_KeyToPath proto.InternalMessageInfo func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} func (*Lifecycle) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{77} + return fileDescriptor_6c07b07c062484ab, []int{81} } func (m *Lifecycle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2236,7 +2348,7 @@ var xxx_messageInfo_Lifecycle proto.InternalMessageInfo func (m *LifecycleHandler) Reset() { *m = LifecycleHandler{} } func (*LifecycleHandler) ProtoMessage() {} func (*LifecycleHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{78} + return fileDescriptor_6c07b07c062484ab, []int{82} } func (m *LifecycleHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2264,7 +2376,7 @@ var xxx_messageInfo_LifecycleHandler proto.InternalMessageInfo func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} func (*LimitRange) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{79} + return fileDescriptor_6c07b07c062484ab, []int{83} } func (m *LimitRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2292,7 +2404,7 @@ var xxx_messageInfo_LimitRange proto.InternalMessageInfo func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} func (*LimitRangeItem) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{80} + return fileDescriptor_6c07b07c062484ab, []int{84} } func (m *LimitRangeItem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2320,7 +2432,7 @@ var xxx_messageInfo_LimitRangeItem proto.InternalMessageInfo func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} func (*LimitRangeList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{81} + return fileDescriptor_6c07b07c062484ab, []int{85} } func (m *LimitRangeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2348,7 +2460,7 @@ var xxx_messageInfo_LimitRangeList proto.InternalMessageInfo func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} func (*LimitRangeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{82} + return fileDescriptor_6c07b07c062484ab, []int{86} } func (m *LimitRangeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2376,7 +2488,7 @@ var xxx_messageInfo_LimitRangeSpec proto.InternalMessageInfo func (m *LinuxContainerUser) Reset() { *m = LinuxContainerUser{} } func (*LinuxContainerUser) ProtoMessage() {} func (*LinuxContainerUser) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{83} + return fileDescriptor_6c07b07c062484ab, []int{87} } func (m *LinuxContainerUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2404,7 +2516,7 @@ var xxx_messageInfo_LinuxContainerUser proto.InternalMessageInfo func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{84} + return fileDescriptor_6c07b07c062484ab, []int{88} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2432,7 +2544,7 @@ var xxx_messageInfo_List proto.InternalMessageInfo func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{85} + return fileDescriptor_6c07b07c062484ab, []int{89} } func (m *LoadBalancerIngress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2460,7 +2572,7 @@ var xxx_messageInfo_LoadBalancerIngress proto.InternalMessageInfo func (m *LoadBalancerStatus) Reset() { *m = LoadBalancerStatus{} } func (*LoadBalancerStatus) ProtoMessage() {} func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{86} + return fileDescriptor_6c07b07c062484ab, []int{90} } func (m *LoadBalancerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2488,7 +2600,7 @@ var xxx_messageInfo_LoadBalancerStatus proto.InternalMessageInfo func (m *LocalObjectReference) Reset() { *m = LocalObjectReference{} } func (*LocalObjectReference) ProtoMessage() {} func (*LocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{87} + return fileDescriptor_6c07b07c062484ab, []int{91} } func (m *LocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2516,7 +2628,7 @@ var xxx_messageInfo_LocalObjectReference proto.InternalMessageInfo func (m *LocalVolumeSource) Reset() { *m = LocalVolumeSource{} } func (*LocalVolumeSource) ProtoMessage() {} func (*LocalVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{88} + return fileDescriptor_6c07b07c062484ab, []int{92} } func (m *LocalVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2544,7 +2656,7 @@ var xxx_messageInfo_LocalVolumeSource proto.InternalMessageInfo func (m *ModifyVolumeStatus) Reset() { *m = ModifyVolumeStatus{} } func (*ModifyVolumeStatus) ProtoMessage() {} func (*ModifyVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{89} + return fileDescriptor_6c07b07c062484ab, []int{93} } func (m *ModifyVolumeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2572,7 +2684,7 @@ var xxx_messageInfo_ModifyVolumeStatus proto.InternalMessageInfo func (m *NFSVolumeSource) Reset() { *m = NFSVolumeSource{} } func (*NFSVolumeSource) ProtoMessage() {} func (*NFSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{90} + return fileDescriptor_6c07b07c062484ab, []int{94} } func (m *NFSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2600,7 +2712,7 @@ var xxx_messageInfo_NFSVolumeSource proto.InternalMessageInfo func (m *Namespace) Reset() { *m = Namespace{} } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{91} + return fileDescriptor_6c07b07c062484ab, []int{95} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2628,7 +2740,7 @@ var xxx_messageInfo_Namespace proto.InternalMessageInfo func (m *NamespaceCondition) Reset() { *m = NamespaceCondition{} } func (*NamespaceCondition) ProtoMessage() {} func (*NamespaceCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{92} + return fileDescriptor_6c07b07c062484ab, []int{96} } func (m *NamespaceCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2768,7 @@ var xxx_messageInfo_NamespaceCondition proto.InternalMessageInfo func (m *NamespaceList) Reset() { *m = NamespaceList{} } func (*NamespaceList) ProtoMessage() {} func (*NamespaceList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{93} + return fileDescriptor_6c07b07c062484ab, []int{97} } func (m *NamespaceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2684,7 +2796,7 @@ var xxx_messageInfo_NamespaceList proto.InternalMessageInfo func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{94} + return fileDescriptor_6c07b07c062484ab, []int{98} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2712,7 +2824,7 @@ var xxx_messageInfo_NamespaceSpec proto.InternalMessageInfo func (m *NamespaceStatus) Reset() { *m = NamespaceStatus{} } func (*NamespaceStatus) ProtoMessage() {} func (*NamespaceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{95} + return fileDescriptor_6c07b07c062484ab, []int{99} } func (m *NamespaceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2852,7 @@ var xxx_messageInfo_NamespaceStatus proto.InternalMessageInfo func (m *Node) Reset() { *m = Node{} } func (*Node) ProtoMessage() {} func (*Node) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{96} + return fileDescriptor_6c07b07c062484ab, []int{100} } func (m *Node) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2880,7 @@ var xxx_messageInfo_Node proto.InternalMessageInfo func (m *NodeAddress) Reset() { *m = NodeAddress{} } func (*NodeAddress) ProtoMessage() {} func (*NodeAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{97} + return fileDescriptor_6c07b07c062484ab, []int{101} } func (m *NodeAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2796,7 +2908,7 @@ var xxx_messageInfo_NodeAddress proto.InternalMessageInfo func (m *NodeAffinity) Reset() { *m = NodeAffinity{} } func (*NodeAffinity) ProtoMessage() {} func (*NodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{98} + return fileDescriptor_6c07b07c062484ab, []int{102} } func (m *NodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2824,7 +2936,7 @@ var xxx_messageInfo_NodeAffinity proto.InternalMessageInfo func (m *NodeCondition) Reset() { *m = NodeCondition{} } func (*NodeCondition) ProtoMessage() {} func (*NodeCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{99} + return fileDescriptor_6c07b07c062484ab, []int{103} } func (m *NodeCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2852,7 +2964,7 @@ var xxx_messageInfo_NodeCondition proto.InternalMessageInfo func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} } func (*NodeConfigSource) ProtoMessage() {} func (*NodeConfigSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{100} + return fileDescriptor_6c07b07c062484ab, []int{104} } func (m *NodeConfigSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2880,7 +2992,7 @@ var xxx_messageInfo_NodeConfigSource proto.InternalMessageInfo func (m *NodeConfigStatus) Reset() { *m = NodeConfigStatus{} } func (*NodeConfigStatus) ProtoMessage() {} func (*NodeConfigStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{101} + return fileDescriptor_6c07b07c062484ab, []int{105} } func (m *NodeConfigStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2908,7 +3020,7 @@ var xxx_messageInfo_NodeConfigStatus proto.InternalMessageInfo func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{102} + return fileDescriptor_6c07b07c062484ab, []int{106} } func (m *NodeDaemonEndpoints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2936,7 +3048,7 @@ var xxx_messageInfo_NodeDaemonEndpoints proto.InternalMessageInfo func (m *NodeFeatures) Reset() { *m = NodeFeatures{} } func (*NodeFeatures) ProtoMessage() {} func (*NodeFeatures) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{103} + return fileDescriptor_6c07b07c062484ab, []int{107} } func (m *NodeFeatures) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2964,7 +3076,7 @@ var xxx_messageInfo_NodeFeatures proto.InternalMessageInfo func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} func (*NodeList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{104} + return fileDescriptor_6c07b07c062484ab, []int{108} } func (m *NodeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2992,7 +3104,7 @@ var xxx_messageInfo_NodeList proto.InternalMessageInfo func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} func (*NodeProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{105} + return fileDescriptor_6c07b07c062484ab, []int{109} } func (m *NodeProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3020,7 +3132,7 @@ var xxx_messageInfo_NodeProxyOptions proto.InternalMessageInfo func (m *NodeRuntimeHandler) Reset() { *m = NodeRuntimeHandler{} } func (*NodeRuntimeHandler) ProtoMessage() {} func (*NodeRuntimeHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{106} + return fileDescriptor_6c07b07c062484ab, []int{110} } func (m *NodeRuntimeHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3048,7 +3160,7 @@ var xxx_messageInfo_NodeRuntimeHandler proto.InternalMessageInfo func (m *NodeRuntimeHandlerFeatures) Reset() { *m = NodeRuntimeHandlerFeatures{} } func (*NodeRuntimeHandlerFeatures) ProtoMessage() {} func (*NodeRuntimeHandlerFeatures) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{107} + return fileDescriptor_6c07b07c062484ab, []int{111} } func (m *NodeRuntimeHandlerFeatures) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3076,7 +3188,7 @@ var xxx_messageInfo_NodeRuntimeHandlerFeatures proto.InternalMessageInfo func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} func (*NodeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{108} + return fileDescriptor_6c07b07c062484ab, []int{112} } func (m *NodeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3104,7 +3216,7 @@ var xxx_messageInfo_NodeSelector proto.InternalMessageInfo func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{109} + return fileDescriptor_6c07b07c062484ab, []int{113} } func (m *NodeSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3132,7 +3244,7 @@ var xxx_messageInfo_NodeSelectorRequirement proto.InternalMessageInfo func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{110} + return fileDescriptor_6c07b07c062484ab, []int{114} } func (m *NodeSelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3160,7 +3272,7 @@ var xxx_messageInfo_NodeSelectorTerm proto.InternalMessageInfo func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} func (*NodeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{111} + return fileDescriptor_6c07b07c062484ab, []int{115} } func (m *NodeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3188,7 +3300,7 @@ var xxx_messageInfo_NodeSpec proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{112} + return fileDescriptor_6c07b07c062484ab, []int{116} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3216,7 +3328,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NodeSwapStatus) Reset() { *m = NodeSwapStatus{} } func (*NodeSwapStatus) ProtoMessage() {} func (*NodeSwapStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{113} + return fileDescriptor_6c07b07c062484ab, []int{117} } func (m *NodeSwapStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3244,7 +3356,7 @@ var xxx_messageInfo_NodeSwapStatus proto.InternalMessageInfo func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} func (*NodeSystemInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{114} + return fileDescriptor_6c07b07c062484ab, []int{118} } func (m *NodeSystemInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3272,7 +3384,7 @@ var xxx_messageInfo_NodeSystemInfo proto.InternalMessageInfo func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{115} + return fileDescriptor_6c07b07c062484ab, []int{119} } func (m *ObjectFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3412,7 @@ var xxx_messageInfo_ObjectFieldSelector proto.InternalMessageInfo func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} func (*ObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{116} + return fileDescriptor_6c07b07c062484ab, []int{120} } func (m *ObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3328,7 +3440,7 @@ var xxx_messageInfo_ObjectReference proto.InternalMessageInfo func (m *PersistentVolume) Reset() { *m = PersistentVolume{} } func (*PersistentVolume) ProtoMessage() {} func (*PersistentVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{117} + return fileDescriptor_6c07b07c062484ab, []int{121} } func (m *PersistentVolume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3356,7 +3468,7 @@ var xxx_messageInfo_PersistentVolume proto.InternalMessageInfo func (m *PersistentVolumeClaim) Reset() { *m = PersistentVolumeClaim{} } func (*PersistentVolumeClaim) ProtoMessage() {} func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{118} + return fileDescriptor_6c07b07c062484ab, []int{122} } func (m *PersistentVolumeClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3496,7 @@ var xxx_messageInfo_PersistentVolumeClaim proto.InternalMessageInfo func (m *PersistentVolumeClaimCondition) Reset() { *m = PersistentVolumeClaimCondition{} } func (*PersistentVolumeClaimCondition) ProtoMessage() {} func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{119} + return fileDescriptor_6c07b07c062484ab, []int{123} } func (m *PersistentVolumeClaimCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3412,7 +3524,7 @@ var xxx_messageInfo_PersistentVolumeClaimCondition proto.InternalMessageInfo func (m *PersistentVolumeClaimList) Reset() { *m = PersistentVolumeClaimList{} } func (*PersistentVolumeClaimList) ProtoMessage() {} func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{120} + return fileDescriptor_6c07b07c062484ab, []int{124} } func (m *PersistentVolumeClaimList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3440,7 +3552,7 @@ var xxx_messageInfo_PersistentVolumeClaimList proto.InternalMessageInfo func (m *PersistentVolumeClaimSpec) Reset() { *m = PersistentVolumeClaimSpec{} } func (*PersistentVolumeClaimSpec) ProtoMessage() {} func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{121} + return fileDescriptor_6c07b07c062484ab, []int{125} } func (m *PersistentVolumeClaimSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3468,7 +3580,7 @@ var xxx_messageInfo_PersistentVolumeClaimSpec proto.InternalMessageInfo func (m *PersistentVolumeClaimStatus) Reset() { *m = PersistentVolumeClaimStatus{} } func (*PersistentVolumeClaimStatus) ProtoMessage() {} func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{122} + return fileDescriptor_6c07b07c062484ab, []int{126} } func (m *PersistentVolumeClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3496,7 +3608,7 @@ var xxx_messageInfo_PersistentVolumeClaimStatus proto.InternalMessageInfo func (m *PersistentVolumeClaimTemplate) Reset() { *m = PersistentVolumeClaimTemplate{} } func (*PersistentVolumeClaimTemplate) ProtoMessage() {} func (*PersistentVolumeClaimTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{123} + return fileDescriptor_6c07b07c062484ab, []int{127} } func (m *PersistentVolumeClaimTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3524,7 +3636,7 @@ var xxx_messageInfo_PersistentVolumeClaimTemplate proto.InternalMessageInfo func (m *PersistentVolumeClaimVolumeSource) Reset() { *m = PersistentVolumeClaimVolumeSource{} } func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {} func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{124} + return fileDescriptor_6c07b07c062484ab, []int{128} } func (m *PersistentVolumeClaimVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3552,7 +3664,7 @@ var xxx_messageInfo_PersistentVolumeClaimVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeList) Reset() { *m = PersistentVolumeList{} } func (*PersistentVolumeList) ProtoMessage() {} func (*PersistentVolumeList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{125} + return fileDescriptor_6c07b07c062484ab, []int{129} } func (m *PersistentVolumeList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3580,7 +3692,7 @@ var xxx_messageInfo_PersistentVolumeList proto.InternalMessageInfo func (m *PersistentVolumeSource) Reset() { *m = PersistentVolumeSource{} } func (*PersistentVolumeSource) ProtoMessage() {} func (*PersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{126} + return fileDescriptor_6c07b07c062484ab, []int{130} } func (m *PersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3608,7 +3720,7 @@ var xxx_messageInfo_PersistentVolumeSource proto.InternalMessageInfo func (m *PersistentVolumeSpec) Reset() { *m = PersistentVolumeSpec{} } func (*PersistentVolumeSpec) ProtoMessage() {} func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{127} + return fileDescriptor_6c07b07c062484ab, []int{131} } func (m *PersistentVolumeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3636,7 +3748,7 @@ var xxx_messageInfo_PersistentVolumeSpec proto.InternalMessageInfo func (m *PersistentVolumeStatus) Reset() { *m = PersistentVolumeStatus{} } func (*PersistentVolumeStatus) ProtoMessage() {} func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{128} + return fileDescriptor_6c07b07c062484ab, []int{132} } func (m *PersistentVolumeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3664,7 +3776,7 @@ var xxx_messageInfo_PersistentVolumeStatus proto.InternalMessageInfo func (m *PhotonPersistentDiskVolumeSource) Reset() { *m = PhotonPersistentDiskVolumeSource{} } func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {} func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{129} + return fileDescriptor_6c07b07c062484ab, []int{133} } func (m *PhotonPersistentDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3692,7 +3804,7 @@ var xxx_messageInfo_PhotonPersistentDiskVolumeSource proto.InternalMessageInfo func (m *Pod) Reset() { *m = Pod{} } func (*Pod) ProtoMessage() {} func (*Pod) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{130} + return fileDescriptor_6c07b07c062484ab, []int{134} } func (m *Pod) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3720,7 +3832,7 @@ var xxx_messageInfo_Pod proto.InternalMessageInfo func (m *PodAffinity) Reset() { *m = PodAffinity{} } func (*PodAffinity) ProtoMessage() {} func (*PodAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{131} + return fileDescriptor_6c07b07c062484ab, []int{135} } func (m *PodAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3748,7 +3860,7 @@ var xxx_messageInfo_PodAffinity proto.InternalMessageInfo func (m *PodAffinityTerm) Reset() { *m = PodAffinityTerm{} } func (*PodAffinityTerm) ProtoMessage() {} func (*PodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{132} + return fileDescriptor_6c07b07c062484ab, []int{136} } func (m *PodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3776,7 +3888,7 @@ var xxx_messageInfo_PodAffinityTerm proto.InternalMessageInfo func (m *PodAntiAffinity) Reset() { *m = PodAntiAffinity{} } func (*PodAntiAffinity) ProtoMessage() {} func (*PodAntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{133} + return fileDescriptor_6c07b07c062484ab, []int{137} } func (m *PodAntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3804,7 +3916,7 @@ var xxx_messageInfo_PodAntiAffinity proto.InternalMessageInfo func (m *PodAttachOptions) Reset() { *m = PodAttachOptions{} } func (*PodAttachOptions) ProtoMessage() {} func (*PodAttachOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{134} + return fileDescriptor_6c07b07c062484ab, []int{138} } func (m *PodAttachOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3829,10 +3941,38 @@ func (m *PodAttachOptions) XXX_DiscardUnknown() { var xxx_messageInfo_PodAttachOptions proto.InternalMessageInfo +func (m *PodCertificateProjection) Reset() { *m = PodCertificateProjection{} } +func (*PodCertificateProjection) ProtoMessage() {} +func (*PodCertificateProjection) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{139} +} +func (m *PodCertificateProjection) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodCertificateProjection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodCertificateProjection) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodCertificateProjection.Merge(m, src) +} +func (m *PodCertificateProjection) XXX_Size() int { + return m.Size() +} +func (m *PodCertificateProjection) XXX_DiscardUnknown() { + xxx_messageInfo_PodCertificateProjection.DiscardUnknown(m) +} + +var xxx_messageInfo_PodCertificateProjection proto.InternalMessageInfo + func (m *PodCondition) Reset() { *m = PodCondition{} } func (*PodCondition) ProtoMessage() {} func (*PodCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{135} + return fileDescriptor_6c07b07c062484ab, []int{140} } func (m *PodCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3860,7 +4000,7 @@ var xxx_messageInfo_PodCondition proto.InternalMessageInfo func (m *PodDNSConfig) Reset() { *m = PodDNSConfig{} } func (*PodDNSConfig) ProtoMessage() {} func (*PodDNSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{136} + return fileDescriptor_6c07b07c062484ab, []int{141} } func (m *PodDNSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3888,7 +4028,7 @@ var xxx_messageInfo_PodDNSConfig proto.InternalMessageInfo func (m *PodDNSConfigOption) Reset() { *m = PodDNSConfigOption{} } func (*PodDNSConfigOption) ProtoMessage() {} func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{137} + return fileDescriptor_6c07b07c062484ab, []int{142} } func (m *PodDNSConfigOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3916,7 +4056,7 @@ var xxx_messageInfo_PodDNSConfigOption proto.InternalMessageInfo func (m *PodExecOptions) Reset() { *m = PodExecOptions{} } func (*PodExecOptions) ProtoMessage() {} func (*PodExecOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{138} + return fileDescriptor_6c07b07c062484ab, []int{143} } func (m *PodExecOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3941,10 +4081,38 @@ func (m *PodExecOptions) XXX_DiscardUnknown() { var xxx_messageInfo_PodExecOptions proto.InternalMessageInfo +func (m *PodExtendedResourceClaimStatus) Reset() { *m = PodExtendedResourceClaimStatus{} } +func (*PodExtendedResourceClaimStatus) ProtoMessage() {} +func (*PodExtendedResourceClaimStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_6c07b07c062484ab, []int{144} +} +func (m *PodExtendedResourceClaimStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PodExtendedResourceClaimStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PodExtendedResourceClaimStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_PodExtendedResourceClaimStatus.Merge(m, src) +} +func (m *PodExtendedResourceClaimStatus) XXX_Size() int { + return m.Size() +} +func (m *PodExtendedResourceClaimStatus) XXX_DiscardUnknown() { + xxx_messageInfo_PodExtendedResourceClaimStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_PodExtendedResourceClaimStatus proto.InternalMessageInfo + func (m *PodIP) Reset() { *m = PodIP{} } func (*PodIP) ProtoMessage() {} func (*PodIP) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{139} + return fileDescriptor_6c07b07c062484ab, []int{145} } func (m *PodIP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3972,7 +4140,7 @@ var xxx_messageInfo_PodIP proto.InternalMessageInfo func (m *PodList) Reset() { *m = PodList{} } func (*PodList) ProtoMessage() {} func (*PodList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{140} + return fileDescriptor_6c07b07c062484ab, []int{146} } func (m *PodList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4000,7 +4168,7 @@ var xxx_messageInfo_PodList proto.InternalMessageInfo func (m *PodLogOptions) Reset() { *m = PodLogOptions{} } func (*PodLogOptions) ProtoMessage() {} func (*PodLogOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{141} + return fileDescriptor_6c07b07c062484ab, []int{147} } func (m *PodLogOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4028,7 +4196,7 @@ var xxx_messageInfo_PodLogOptions proto.InternalMessageInfo func (m *PodOS) Reset() { *m = PodOS{} } func (*PodOS) ProtoMessage() {} func (*PodOS) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{142} + return fileDescriptor_6c07b07c062484ab, []int{148} } func (m *PodOS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4056,7 +4224,7 @@ var xxx_messageInfo_PodOS proto.InternalMessageInfo func (m *PodPortForwardOptions) Reset() { *m = PodPortForwardOptions{} } func (*PodPortForwardOptions) ProtoMessage() {} func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{143} + return fileDescriptor_6c07b07c062484ab, []int{149} } func (m *PodPortForwardOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4084,7 +4252,7 @@ var xxx_messageInfo_PodPortForwardOptions proto.InternalMessageInfo func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} func (*PodProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{144} + return fileDescriptor_6c07b07c062484ab, []int{150} } func (m *PodProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4112,7 +4280,7 @@ var xxx_messageInfo_PodProxyOptions proto.InternalMessageInfo func (m *PodReadinessGate) Reset() { *m = PodReadinessGate{} } func (*PodReadinessGate) ProtoMessage() {} func (*PodReadinessGate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{145} + return fileDescriptor_6c07b07c062484ab, []int{151} } func (m *PodReadinessGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4140,7 +4308,7 @@ var xxx_messageInfo_PodReadinessGate proto.InternalMessageInfo func (m *PodResourceClaim) Reset() { *m = PodResourceClaim{} } func (*PodResourceClaim) ProtoMessage() {} func (*PodResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{146} + return fileDescriptor_6c07b07c062484ab, []int{152} } func (m *PodResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4168,7 +4336,7 @@ var xxx_messageInfo_PodResourceClaim proto.InternalMessageInfo func (m *PodResourceClaimStatus) Reset() { *m = PodResourceClaimStatus{} } func (*PodResourceClaimStatus) ProtoMessage() {} func (*PodResourceClaimStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{147} + return fileDescriptor_6c07b07c062484ab, []int{153} } func (m *PodResourceClaimStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4196,7 +4364,7 @@ var xxx_messageInfo_PodResourceClaimStatus proto.InternalMessageInfo func (m *PodSchedulingGate) Reset() { *m = PodSchedulingGate{} } func (*PodSchedulingGate) ProtoMessage() {} func (*PodSchedulingGate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{148} + return fileDescriptor_6c07b07c062484ab, []int{154} } func (m *PodSchedulingGate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4224,7 +4392,7 @@ var xxx_messageInfo_PodSchedulingGate proto.InternalMessageInfo func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} func (*PodSecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{149} + return fileDescriptor_6c07b07c062484ab, []int{155} } func (m *PodSecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4252,7 +4420,7 @@ var xxx_messageInfo_PodSecurityContext proto.InternalMessageInfo func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} func (*PodSignature) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{150} + return fileDescriptor_6c07b07c062484ab, []int{156} } func (m *PodSignature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4280,7 +4448,7 @@ var xxx_messageInfo_PodSignature proto.InternalMessageInfo func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} func (*PodSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{151} + return fileDescriptor_6c07b07c062484ab, []int{157} } func (m *PodSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4308,7 +4476,7 @@ var xxx_messageInfo_PodSpec proto.InternalMessageInfo func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} func (*PodStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{152} + return fileDescriptor_6c07b07c062484ab, []int{158} } func (m *PodStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4336,7 +4504,7 @@ var xxx_messageInfo_PodStatus proto.InternalMessageInfo func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} func (*PodStatusResult) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{153} + return fileDescriptor_6c07b07c062484ab, []int{159} } func (m *PodStatusResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4364,7 +4532,7 @@ var xxx_messageInfo_PodStatusResult proto.InternalMessageInfo func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} func (*PodTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{154} + return fileDescriptor_6c07b07c062484ab, []int{160} } func (m *PodTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4392,7 +4560,7 @@ var xxx_messageInfo_PodTemplate proto.InternalMessageInfo func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} func (*PodTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{155} + return fileDescriptor_6c07b07c062484ab, []int{161} } func (m *PodTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4420,7 +4588,7 @@ var xxx_messageInfo_PodTemplateList proto.InternalMessageInfo func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} func (*PodTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{156} + return fileDescriptor_6c07b07c062484ab, []int{162} } func (m *PodTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4448,7 +4616,7 @@ var xxx_messageInfo_PodTemplateSpec proto.InternalMessageInfo func (m *PortStatus) Reset() { *m = PortStatus{} } func (*PortStatus) ProtoMessage() {} func (*PortStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{157} + return fileDescriptor_6c07b07c062484ab, []int{163} } func (m *PortStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4476,7 +4644,7 @@ var xxx_messageInfo_PortStatus proto.InternalMessageInfo func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{158} + return fileDescriptor_6c07b07c062484ab, []int{164} } func (m *PortworxVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4504,7 +4672,7 @@ var xxx_messageInfo_PortworxVolumeSource proto.InternalMessageInfo func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} func (*Preconditions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{159} + return fileDescriptor_6c07b07c062484ab, []int{165} } func (m *Preconditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4532,7 +4700,7 @@ var xxx_messageInfo_Preconditions proto.InternalMessageInfo func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{160} + return fileDescriptor_6c07b07c062484ab, []int{166} } func (m *PreferAvoidPodsEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4560,7 +4728,7 @@ var xxx_messageInfo_PreferAvoidPodsEntry proto.InternalMessageInfo func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{161} + return fileDescriptor_6c07b07c062484ab, []int{167} } func (m *PreferredSchedulingTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4588,7 +4756,7 @@ var xxx_messageInfo_PreferredSchedulingTerm proto.InternalMessageInfo func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} func (*Probe) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{162} + return fileDescriptor_6c07b07c062484ab, []int{168} } func (m *Probe) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4616,7 +4784,7 @@ var xxx_messageInfo_Probe proto.InternalMessageInfo func (m *ProbeHandler) Reset() { *m = ProbeHandler{} } func (*ProbeHandler) ProtoMessage() {} func (*ProbeHandler) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{163} + return fileDescriptor_6c07b07c062484ab, []int{169} } func (m *ProbeHandler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4644,7 +4812,7 @@ var xxx_messageInfo_ProbeHandler proto.InternalMessageInfo func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{164} + return fileDescriptor_6c07b07c062484ab, []int{170} } func (m *ProjectedVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4672,7 +4840,7 @@ var xxx_messageInfo_ProjectedVolumeSource proto.InternalMessageInfo func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{165} + return fileDescriptor_6c07b07c062484ab, []int{171} } func (m *QuobyteVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4700,7 +4868,7 @@ var xxx_messageInfo_QuobyteVolumeSource proto.InternalMessageInfo func (m *RBDPersistentVolumeSource) Reset() { *m = RBDPersistentVolumeSource{} } func (*RBDPersistentVolumeSource) ProtoMessage() {} func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{166} + return fileDescriptor_6c07b07c062484ab, []int{172} } func (m *RBDPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4728,7 +4896,7 @@ var xxx_messageInfo_RBDPersistentVolumeSource proto.InternalMessageInfo func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} func (*RBDVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{167} + return fileDescriptor_6c07b07c062484ab, []int{173} } func (m *RBDVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4756,7 +4924,7 @@ var xxx_messageInfo_RBDVolumeSource proto.InternalMessageInfo func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} func (*RangeAllocation) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{168} + return fileDescriptor_6c07b07c062484ab, []int{174} } func (m *RangeAllocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4784,7 +4952,7 @@ var xxx_messageInfo_RangeAllocation proto.InternalMessageInfo func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} func (*ReplicationController) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{169} + return fileDescriptor_6c07b07c062484ab, []int{175} } func (m *ReplicationController) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4812,7 +4980,7 @@ var xxx_messageInfo_ReplicationController proto.InternalMessageInfo func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{170} + return fileDescriptor_6c07b07c062484ab, []int{176} } func (m *ReplicationControllerCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4840,7 +5008,7 @@ var xxx_messageInfo_ReplicationControllerCondition proto.InternalMessageInfo func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{171} + return fileDescriptor_6c07b07c062484ab, []int{177} } func (m *ReplicationControllerList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4868,7 +5036,7 @@ var xxx_messageInfo_ReplicationControllerList proto.InternalMessageInfo func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{172} + return fileDescriptor_6c07b07c062484ab, []int{178} } func (m *ReplicationControllerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4896,7 +5064,7 @@ var xxx_messageInfo_ReplicationControllerSpec proto.InternalMessageInfo func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{173} + return fileDescriptor_6c07b07c062484ab, []int{179} } func (m *ReplicationControllerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4924,7 +5092,7 @@ var xxx_messageInfo_ReplicationControllerStatus proto.InternalMessageInfo func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } func (*ResourceClaim) ProtoMessage() {} func (*ResourceClaim) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{174} + return fileDescriptor_6c07b07c062484ab, []int{180} } func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4952,7 +5120,7 @@ var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{175} + return fileDescriptor_6c07b07c062484ab, []int{181} } func (m *ResourceFieldSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4980,7 +5148,7 @@ var xxx_messageInfo_ResourceFieldSelector proto.InternalMessageInfo func (m *ResourceHealth) Reset() { *m = ResourceHealth{} } func (*ResourceHealth) ProtoMessage() {} func (*ResourceHealth) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{176} + return fileDescriptor_6c07b07c062484ab, []int{182} } func (m *ResourceHealth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5008,7 +5176,7 @@ var xxx_messageInfo_ResourceHealth proto.InternalMessageInfo func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} func (*ResourceQuota) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{177} + return fileDescriptor_6c07b07c062484ab, []int{183} } func (m *ResourceQuota) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5036,7 +5204,7 @@ var xxx_messageInfo_ResourceQuota proto.InternalMessageInfo func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} func (*ResourceQuotaList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{178} + return fileDescriptor_6c07b07c062484ab, []int{184} } func (m *ResourceQuotaList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5064,7 +5232,7 @@ var xxx_messageInfo_ResourceQuotaList proto.InternalMessageInfo func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{179} + return fileDescriptor_6c07b07c062484ab, []int{185} } func (m *ResourceQuotaSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5092,7 +5260,7 @@ var xxx_messageInfo_ResourceQuotaSpec proto.InternalMessageInfo func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{180} + return fileDescriptor_6c07b07c062484ab, []int{186} } func (m *ResourceQuotaStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5120,7 +5288,7 @@ var xxx_messageInfo_ResourceQuotaStatus proto.InternalMessageInfo func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} func (*ResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{181} + return fileDescriptor_6c07b07c062484ab, []int{187} } func (m *ResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5148,7 +5316,7 @@ var xxx_messageInfo_ResourceRequirements proto.InternalMessageInfo func (m *ResourceStatus) Reset() { *m = ResourceStatus{} } func (*ResourceStatus) ProtoMessage() {} func (*ResourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{182} + return fileDescriptor_6c07b07c062484ab, []int{188} } func (m *ResourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5176,7 +5344,7 @@ var xxx_messageInfo_ResourceStatus proto.InternalMessageInfo func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} func (*SELinuxOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{183} + return fileDescriptor_6c07b07c062484ab, []int{189} } func (m *SELinuxOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5204,7 +5372,7 @@ var xxx_messageInfo_SELinuxOptions proto.InternalMessageInfo func (m *ScaleIOPersistentVolumeSource) Reset() { *m = ScaleIOPersistentVolumeSource{} } func (*ScaleIOPersistentVolumeSource) ProtoMessage() {} func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{184} + return fileDescriptor_6c07b07c062484ab, []int{190} } func (m *ScaleIOPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5232,7 +5400,7 @@ var xxx_messageInfo_ScaleIOPersistentVolumeSource proto.InternalMessageInfo func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{185} + return fileDescriptor_6c07b07c062484ab, []int{191} } func (m *ScaleIOVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5260,7 +5428,7 @@ var xxx_messageInfo_ScaleIOVolumeSource proto.InternalMessageInfo func (m *ScopeSelector) Reset() { *m = ScopeSelector{} } func (*ScopeSelector) ProtoMessage() {} func (*ScopeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{186} + return fileDescriptor_6c07b07c062484ab, []int{192} } func (m *ScopeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5288,7 +5456,7 @@ var xxx_messageInfo_ScopeSelector proto.InternalMessageInfo func (m *ScopedResourceSelectorRequirement) Reset() { *m = ScopedResourceSelectorRequirement{} } func (*ScopedResourceSelectorRequirement) ProtoMessage() {} func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{187} + return fileDescriptor_6c07b07c062484ab, []int{193} } func (m *ScopedResourceSelectorRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5316,7 +5484,7 @@ var xxx_messageInfo_ScopedResourceSelectorRequirement proto.InternalMessageInfo func (m *SeccompProfile) Reset() { *m = SeccompProfile{} } func (*SeccompProfile) ProtoMessage() {} func (*SeccompProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{188} + return fileDescriptor_6c07b07c062484ab, []int{194} } func (m *SeccompProfile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5344,7 +5512,7 @@ var xxx_messageInfo_SeccompProfile proto.InternalMessageInfo func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{189} + return fileDescriptor_6c07b07c062484ab, []int{195} } func (m *Secret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5372,7 +5540,7 @@ var xxx_messageInfo_Secret proto.InternalMessageInfo func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} func (*SecretEnvSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{190} + return fileDescriptor_6c07b07c062484ab, []int{196} } func (m *SecretEnvSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5400,7 +5568,7 @@ var xxx_messageInfo_SecretEnvSource proto.InternalMessageInfo func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} func (*SecretKeySelector) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{191} + return fileDescriptor_6c07b07c062484ab, []int{197} } func (m *SecretKeySelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5428,7 +5596,7 @@ var xxx_messageInfo_SecretKeySelector proto.InternalMessageInfo func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} func (*SecretList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{192} + return fileDescriptor_6c07b07c062484ab, []int{198} } func (m *SecretList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5456,7 +5624,7 @@ var xxx_messageInfo_SecretList proto.InternalMessageInfo func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} func (*SecretProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{193} + return fileDescriptor_6c07b07c062484ab, []int{199} } func (m *SecretProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5484,7 +5652,7 @@ var xxx_messageInfo_SecretProjection proto.InternalMessageInfo func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} func (*SecretReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{194} + return fileDescriptor_6c07b07c062484ab, []int{200} } func (m *SecretReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5512,7 +5680,7 @@ var xxx_messageInfo_SecretReference proto.InternalMessageInfo func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} func (*SecretVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{195} + return fileDescriptor_6c07b07c062484ab, []int{201} } func (m *SecretVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5540,7 +5708,7 @@ var xxx_messageInfo_SecretVolumeSource proto.InternalMessageInfo func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} func (*SecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{196} + return fileDescriptor_6c07b07c062484ab, []int{202} } func (m *SecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5568,7 +5736,7 @@ var xxx_messageInfo_SecurityContext proto.InternalMessageInfo func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} func (*SerializedReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{197} + return fileDescriptor_6c07b07c062484ab, []int{203} } func (m *SerializedReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5596,7 +5764,7 @@ var xxx_messageInfo_SerializedReference proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{198} + return fileDescriptor_6c07b07c062484ab, []int{204} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5624,7 +5792,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} func (*ServiceAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{199} + return fileDescriptor_6c07b07c062484ab, []int{205} } func (m *ServiceAccount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5652,7 +5820,7 @@ var xxx_messageInfo_ServiceAccount proto.InternalMessageInfo func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} func (*ServiceAccountList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{200} + return fileDescriptor_6c07b07c062484ab, []int{206} } func (m *ServiceAccountList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5680,7 +5848,7 @@ var xxx_messageInfo_ServiceAccountList proto.InternalMessageInfo func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } func (*ServiceAccountTokenProjection) ProtoMessage() {} func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{201} + return fileDescriptor_6c07b07c062484ab, []int{207} } func (m *ServiceAccountTokenProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5708,7 +5876,7 @@ var xxx_messageInfo_ServiceAccountTokenProjection proto.InternalMessageInfo func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} func (*ServiceList) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{202} + return fileDescriptor_6c07b07c062484ab, []int{208} } func (m *ServiceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5736,7 +5904,7 @@ var xxx_messageInfo_ServiceList proto.InternalMessageInfo func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} func (*ServicePort) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{203} + return fileDescriptor_6c07b07c062484ab, []int{209} } func (m *ServicePort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5764,7 +5932,7 @@ var xxx_messageInfo_ServicePort proto.InternalMessageInfo func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{204} + return fileDescriptor_6c07b07c062484ab, []int{210} } func (m *ServiceProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5792,7 +5960,7 @@ var xxx_messageInfo_ServiceProxyOptions proto.InternalMessageInfo func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} func (*ServiceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{205} + return fileDescriptor_6c07b07c062484ab, []int{211} } func (m *ServiceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5820,7 +5988,7 @@ var xxx_messageInfo_ServiceSpec proto.InternalMessageInfo func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} func (*ServiceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{206} + return fileDescriptor_6c07b07c062484ab, []int{212} } func (m *ServiceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5848,7 +6016,7 @@ var xxx_messageInfo_ServiceStatus proto.InternalMessageInfo func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{207} + return fileDescriptor_6c07b07c062484ab, []int{213} } func (m *SessionAffinityConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5876,7 +6044,7 @@ var xxx_messageInfo_SessionAffinityConfig proto.InternalMessageInfo func (m *SleepAction) Reset() { *m = SleepAction{} } func (*SleepAction) ProtoMessage() {} func (*SleepAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{208} + return fileDescriptor_6c07b07c062484ab, []int{214} } func (m *SleepAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5904,7 +6072,7 @@ var xxx_messageInfo_SleepAction proto.InternalMessageInfo func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{209} + return fileDescriptor_6c07b07c062484ab, []int{215} } func (m *StorageOSPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5932,7 +6100,7 @@ var xxx_messageInfo_StorageOSPersistentVolumeSource proto.InternalMessageInfo func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{210} + return fileDescriptor_6c07b07c062484ab, []int{216} } func (m *StorageOSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5960,7 +6128,7 @@ var xxx_messageInfo_StorageOSVolumeSource proto.InternalMessageInfo func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} func (*Sysctl) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{211} + return fileDescriptor_6c07b07c062484ab, []int{217} } func (m *Sysctl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5988,7 +6156,7 @@ var xxx_messageInfo_Sysctl proto.InternalMessageInfo func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} func (*TCPSocketAction) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{212} + return fileDescriptor_6c07b07c062484ab, []int{218} } func (m *TCPSocketAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6016,7 +6184,7 @@ var xxx_messageInfo_TCPSocketAction proto.InternalMessageInfo func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} func (*Taint) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{213} + return fileDescriptor_6c07b07c062484ab, []int{219} } func (m *Taint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6044,7 +6212,7 @@ var xxx_messageInfo_Taint proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{214} + return fileDescriptor_6c07b07c062484ab, []int{220} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6072,7 +6240,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelectorLabelRequirement{} } func (*TopologySelectorLabelRequirement) ProtoMessage() {} func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{215} + return fileDescriptor_6c07b07c062484ab, []int{221} } func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6100,7 +6268,7 @@ var xxx_messageInfo_TopologySelectorLabelRequirement proto.InternalMessageInfo func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} } func (*TopologySelectorTerm) ProtoMessage() {} func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{216} + return fileDescriptor_6c07b07c062484ab, []int{222} } func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6128,7 +6296,7 @@ var xxx_messageInfo_TopologySelectorTerm proto.InternalMessageInfo func (m *TopologySpreadConstraint) Reset() { *m = TopologySpreadConstraint{} } func (*TopologySpreadConstraint) ProtoMessage() {} func (*TopologySpreadConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{217} + return fileDescriptor_6c07b07c062484ab, []int{223} } func (m *TopologySpreadConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6156,7 +6324,7 @@ var xxx_messageInfo_TopologySpreadConstraint proto.InternalMessageInfo func (m *TypedLocalObjectReference) Reset() { *m = TypedLocalObjectReference{} } func (*TypedLocalObjectReference) ProtoMessage() {} func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{218} + return fileDescriptor_6c07b07c062484ab, []int{224} } func (m *TypedLocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6184,7 +6352,7 @@ var xxx_messageInfo_TypedLocalObjectReference proto.InternalMessageInfo func (m *TypedObjectReference) Reset() { *m = TypedObjectReference{} } func (*TypedObjectReference) ProtoMessage() {} func (*TypedObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{219} + return fileDescriptor_6c07b07c062484ab, []int{225} } func (m *TypedObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6212,7 +6380,7 @@ var xxx_messageInfo_TypedObjectReference proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{220} + return fileDescriptor_6c07b07c062484ab, []int{226} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6240,7 +6408,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} func (*VolumeDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{221} + return fileDescriptor_6c07b07c062484ab, []int{227} } func (m *VolumeDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6268,7 +6436,7 @@ var xxx_messageInfo_VolumeDevice proto.InternalMessageInfo func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} func (*VolumeMount) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{222} + return fileDescriptor_6c07b07c062484ab, []int{228} } func (m *VolumeMount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6296,7 +6464,7 @@ var xxx_messageInfo_VolumeMount proto.InternalMessageInfo func (m *VolumeMountStatus) Reset() { *m = VolumeMountStatus{} } func (*VolumeMountStatus) ProtoMessage() {} func (*VolumeMountStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{223} + return fileDescriptor_6c07b07c062484ab, []int{229} } func (m *VolumeMountStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6324,7 +6492,7 @@ var xxx_messageInfo_VolumeMountStatus proto.InternalMessageInfo func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{224} + return fileDescriptor_6c07b07c062484ab, []int{230} } func (m *VolumeNodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6352,7 +6520,7 @@ var xxx_messageInfo_VolumeNodeAffinity proto.InternalMessageInfo func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} func (*VolumeProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{225} + return fileDescriptor_6c07b07c062484ab, []int{231} } func (m *VolumeProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6380,7 +6548,7 @@ var xxx_messageInfo_VolumeProjection proto.InternalMessageInfo func (m *VolumeResourceRequirements) Reset() { *m = VolumeResourceRequirements{} } func (*VolumeResourceRequirements) ProtoMessage() {} func (*VolumeResourceRequirements) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{226} + return fileDescriptor_6c07b07c062484ab, []int{232} } func (m *VolumeResourceRequirements) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6408,7 +6576,7 @@ var xxx_messageInfo_VolumeResourceRequirements proto.InternalMessageInfo func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} func (*VolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{227} + return fileDescriptor_6c07b07c062484ab, []int{233} } func (m *VolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6436,7 +6604,7 @@ var xxx_messageInfo_VolumeSource proto.InternalMessageInfo func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{228} + return fileDescriptor_6c07b07c062484ab, []int{234} } func (m *VsphereVirtualDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6464,7 +6632,7 @@ var xxx_messageInfo_VsphereVirtualDiskVolumeSource proto.InternalMessageInfo func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{229} + return fileDescriptor_6c07b07c062484ab, []int{235} } func (m *WeightedPodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6492,7 +6660,7 @@ var xxx_messageInfo_WeightedPodAffinityTerm proto.InternalMessageInfo func (m *WindowsSecurityContextOptions) Reset() { *m = WindowsSecurityContextOptions{} } func (*WindowsSecurityContextOptions) ProtoMessage() {} func (*WindowsSecurityContextOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_6c07b07c062484ab, []int{230} + return fileDescriptor_6c07b07c062484ab, []int{236} } func (m *WindowsSecurityContextOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6551,9 +6719,12 @@ func init() { proto.RegisterType((*ConfigMapProjection)(nil), "k8s.io.api.core.v1.ConfigMapProjection") proto.RegisterType((*ConfigMapVolumeSource)(nil), "k8s.io.api.core.v1.ConfigMapVolumeSource") proto.RegisterType((*Container)(nil), "k8s.io.api.core.v1.Container") + proto.RegisterType((*ContainerExtendedResourceRequest)(nil), "k8s.io.api.core.v1.ContainerExtendedResourceRequest") proto.RegisterType((*ContainerImage)(nil), "k8s.io.api.core.v1.ContainerImage") proto.RegisterType((*ContainerPort)(nil), "k8s.io.api.core.v1.ContainerPort") proto.RegisterType((*ContainerResizePolicy)(nil), "k8s.io.api.core.v1.ContainerResizePolicy") + proto.RegisterType((*ContainerRestartRule)(nil), "k8s.io.api.core.v1.ContainerRestartRule") + proto.RegisterType((*ContainerRestartRuleOnExitCodes)(nil), "k8s.io.api.core.v1.ContainerRestartRuleOnExitCodes") proto.RegisterType((*ContainerState)(nil), "k8s.io.api.core.v1.ContainerState") proto.RegisterType((*ContainerStateRunning)(nil), "k8s.io.api.core.v1.ContainerStateRunning") proto.RegisterType((*ContainerStateTerminated)(nil), "k8s.io.api.core.v1.ContainerStateTerminated") @@ -6583,6 +6754,7 @@ func init() { proto.RegisterType((*EventSource)(nil), "k8s.io.api.core.v1.EventSource") proto.RegisterType((*ExecAction)(nil), "k8s.io.api.core.v1.ExecAction") proto.RegisterType((*FCVolumeSource)(nil), "k8s.io.api.core.v1.FCVolumeSource") + proto.RegisterType((*FileKeySelector)(nil), "k8s.io.api.core.v1.FileKeySelector") proto.RegisterType((*FlexPersistentVolumeSource)(nil), "k8s.io.api.core.v1.FlexPersistentVolumeSource") proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.core.v1.FlexPersistentVolumeSource.OptionsEntry") proto.RegisterType((*FlexVolumeSource)(nil), "k8s.io.api.core.v1.FlexVolumeSource") @@ -6671,10 +6843,12 @@ func init() { proto.RegisterType((*PodAffinityTerm)(nil), "k8s.io.api.core.v1.PodAffinityTerm") proto.RegisterType((*PodAntiAffinity)(nil), "k8s.io.api.core.v1.PodAntiAffinity") proto.RegisterType((*PodAttachOptions)(nil), "k8s.io.api.core.v1.PodAttachOptions") + proto.RegisterType((*PodCertificateProjection)(nil), "k8s.io.api.core.v1.PodCertificateProjection") proto.RegisterType((*PodCondition)(nil), "k8s.io.api.core.v1.PodCondition") proto.RegisterType((*PodDNSConfig)(nil), "k8s.io.api.core.v1.PodDNSConfig") proto.RegisterType((*PodDNSConfigOption)(nil), "k8s.io.api.core.v1.PodDNSConfigOption") proto.RegisterType((*PodExecOptions)(nil), "k8s.io.api.core.v1.PodExecOptions") + proto.RegisterType((*PodExtendedResourceClaimStatus)(nil), "k8s.io.api.core.v1.PodExtendedResourceClaimStatus") proto.RegisterType((*PodIP)(nil), "k8s.io.api.core.v1.PodIP") proto.RegisterType((*PodList)(nil), "k8s.io.api.core.v1.PodList") proto.RegisterType((*PodLogOptions)(nil), "k8s.io.api.core.v1.PodLogOptions") @@ -6787,1020 +6961,1049 @@ func init() { } var fileDescriptor_6c07b07c062484ab = []byte{ - // 16206 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x90, 0x1c, 0xc9, - 0x75, 0x30, 0xc6, 0xea, 0x9e, 0xf3, 0xcd, 0x9d, 0xb8, 0x06, 0xb3, 0x00, 0x1a, 0x5b, 0xbb, 0x8b, - 0xc5, 0x5e, 0x03, 0x62, 0x0f, 0x2e, 0xb8, 0xbb, 0x5c, 0xed, 0x9c, 0x40, 0x2f, 0x30, 0x83, 0xde, - 0xec, 0x01, 0x40, 0x2e, 0x97, 0x14, 0x0b, 0xdd, 0x39, 0x33, 0xc5, 0xe9, 0xae, 0xea, 0xad, 0xaa, - 0x1e, 0x60, 0x60, 0x2a, 0x24, 0x51, 0x16, 0x25, 0x52, 0x72, 0x04, 0x43, 0x21, 0x59, 0x0e, 0x4a, - 0xa1, 0x1f, 0xba, 0x65, 0x5a, 0xb2, 0x68, 0xc9, 0x92, 0x2c, 0xea, 0xb2, 0x2d, 0x47, 0xc8, 0xfe, - 0x21, 0x4b, 0x8a, 0x30, 0xa9, 0xb0, 0xc2, 0x23, 0x73, 0x6c, 0x87, 0x42, 0x3f, 0x2c, 0x29, 0x64, - 0xff, 0xb0, 0x27, 0xf4, 0x7d, 0xfc, 0x22, 0xcf, 0xca, 0xac, 0xa3, 0xbb, 0x07, 0x0b, 0x0c, 0x97, - 0x8c, 0xfd, 0xd7, 0x9d, 0xef, 0xe5, 0xcb, 0xac, 0x3c, 0x5f, 0xbe, 0x13, 0xec, 0xad, 0x4b, 0xe1, - 0xac, 0xeb, 0x5f, 0x70, 0x5a, 0xee, 0x85, 0x9a, 0x1f, 0x90, 0x0b, 0xdb, 0x17, 0x2f, 0x6c, 0x10, - 0x8f, 0x04, 0x4e, 0x44, 0xea, 0xb3, 0xad, 0xc0, 0x8f, 0x7c, 0x84, 0x38, 0xce, 0xac, 0xd3, 0x72, - 0x67, 0x29, 0xce, 0xec, 0xf6, 0xc5, 0x99, 0xe7, 0x36, 0xdc, 0x68, 0xb3, 0x7d, 0x7b, 0xb6, 0xe6, - 0x37, 0x2f, 0x6c, 0xf8, 0x1b, 0xfe, 0x05, 0x86, 0x7a, 0xbb, 0xbd, 0xce, 0xfe, 0xb1, 0x3f, 0xec, - 0x17, 0x27, 0x31, 0xf3, 0x62, 0xdc, 0x4c, 0xd3, 0xa9, 0x6d, 0xba, 0x1e, 0x09, 0x76, 0x2e, 0xb4, - 0xb6, 0x36, 0x58, 0xbb, 0x01, 0x09, 0xfd, 0x76, 0x50, 0x23, 0xc9, 0x86, 0x3b, 0xd6, 0x0a, 0x2f, - 0x34, 0x49, 0xe4, 0x64, 0x74, 0x77, 0xe6, 0x42, 0x5e, 0xad, 0xa0, 0xed, 0x45, 0x6e, 0x33, 0xdd, - 0xcc, 0x47, 0xba, 0x55, 0x08, 0x6b, 0x9b, 0xa4, 0xe9, 0xa4, 0xea, 0xbd, 0x90, 0x57, 0xaf, 0x1d, - 0xb9, 0x8d, 0x0b, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, 0x7f, 0xd3, 0x82, 0xb3, 0x73, 0xb7, - 0xaa, 0x4b, 0x0d, 0x27, 0x8c, 0xdc, 0xda, 0x7c, 0xc3, 0xaf, 0x6d, 0x55, 0x23, 0x3f, 0x20, 0x37, - 0xfd, 0x46, 0xbb, 0x49, 0xaa, 0x6c, 0x20, 0xd0, 0xb3, 0x30, 0xb4, 0xcd, 0xfe, 0x97, 0x17, 0xa7, - 0xad, 0xb3, 0xd6, 0xf9, 0xe1, 0xf9, 0xc9, 0xbf, 0xd8, 0x2d, 0x7d, 0x68, 0x6f, 0xb7, 0x34, 0x74, - 0x53, 0x94, 0x63, 0x85, 0x81, 0xce, 0xc1, 0xc0, 0x7a, 0xb8, 0xb6, 0xd3, 0x22, 0xd3, 0x05, 0x86, - 0x3b, 0x2e, 0x70, 0x07, 0x96, 0xab, 0xb4, 0x14, 0x0b, 0x28, 0xba, 0x00, 0xc3, 0x2d, 0x27, 0x88, - 0xdc, 0xc8, 0xf5, 0xbd, 0xe9, 0xe2, 0x59, 0xeb, 0x7c, 0xff, 0xfc, 0x94, 0x40, 0x1d, 0xae, 0x48, - 0x00, 0x8e, 0x71, 0x68, 0x37, 0x02, 0xe2, 0xd4, 0xaf, 0x7b, 0x8d, 0x9d, 0xe9, 0xbe, 0xb3, 0xd6, - 0xf9, 0xa1, 0xb8, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0x7f, 0xa5, 0x00, 0x43, 0x73, 0xeb, 0xeb, - 0xae, 0xe7, 0x46, 0x3b, 0xe8, 0x26, 0x8c, 0x7a, 0x7e, 0x9d, 0xc8, 0xff, 0xec, 0x2b, 0x46, 0x9e, - 0x3f, 0x3b, 0x9b, 0x5e, 0x4a, 0xb3, 0xab, 0x1a, 0xde, 0xfc, 0xe4, 0xde, 0x6e, 0x69, 0x54, 0x2f, - 0xc1, 0x06, 0x1d, 0x84, 0x61, 0xa4, 0xe5, 0xd7, 0x15, 0xd9, 0x02, 0x23, 0x5b, 0xca, 0x22, 0x5b, - 0x89, 0xd1, 0xe6, 0x27, 0xf6, 0x76, 0x4b, 0x23, 0x5a, 0x01, 0xd6, 0x89, 0xa0, 0xdb, 0x30, 0x41, - 0xff, 0x7a, 0x91, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xc7, 0xf2, 0xe8, 0x6a, 0xa8, 0xf3, 0x47, 0xf6, - 0x76, 0x4b, 0x13, 0x89, 0x42, 0x9c, 0x24, 0x68, 0xff, 0xa4, 0x05, 0x13, 0x73, 0xad, 0xd6, 0x5c, - 0xd0, 0xf4, 0x83, 0x4a, 0xe0, 0xaf, 0xbb, 0x0d, 0x82, 0x5e, 0x86, 0xbe, 0x88, 0xce, 0x1a, 0x9f, - 0xe1, 0xc7, 0xc4, 0xd0, 0xf6, 0xd1, 0xb9, 0xda, 0xdf, 0x2d, 0x1d, 0x49, 0xa0, 0xb3, 0xa9, 0x64, - 0x15, 0xd0, 0x1b, 0x30, 0xd9, 0xf0, 0x6b, 0x4e, 0x63, 0xd3, 0x0f, 0x23, 0x01, 0x15, 0x53, 0x7f, - 0x74, 0x6f, 0xb7, 0x34, 0x79, 0x2d, 0x01, 0xc3, 0x29, 0x6c, 0xfb, 0x1e, 0x8c, 0xcf, 0x45, 0x91, - 0x53, 0xdb, 0x24, 0x75, 0xbe, 0xa0, 0xd0, 0x8b, 0xd0, 0xe7, 0x39, 0x4d, 0xd9, 0x99, 0xb3, 0xb2, - 0x33, 0xab, 0x4e, 0x93, 0x76, 0x66, 0xf2, 0x86, 0xe7, 0xbe, 0xdb, 0x16, 0x8b, 0x94, 0x96, 0x61, - 0x86, 0x8d, 0x9e, 0x07, 0xa8, 0x93, 0x6d, 0xb7, 0x46, 0x2a, 0x4e, 0xb4, 0x29, 0xfa, 0x80, 0x44, - 0x5d, 0x58, 0x54, 0x10, 0xac, 0x61, 0xd9, 0x77, 0x61, 0x78, 0x6e, 0xdb, 0x77, 0xeb, 0x15, 0xbf, - 0x1e, 0xa2, 0x2d, 0x98, 0x68, 0x05, 0x64, 0x9d, 0x04, 0xaa, 0x68, 0xda, 0x3a, 0x5b, 0x3c, 0x3f, - 0xf2, 0xfc, 0xf9, 0xcc, 0xb1, 0x37, 0x51, 0x97, 0xbc, 0x28, 0xd8, 0x99, 0x3f, 0x21, 0xda, 0x9b, - 0x48, 0x40, 0x71, 0x92, 0xb2, 0xfd, 0xe7, 0x05, 0x38, 0x36, 0x77, 0xaf, 0x1d, 0x90, 0x45, 0x37, - 0xdc, 0x4a, 0x6e, 0xb8, 0xba, 0x1b, 0x6e, 0xad, 0xc6, 0x23, 0xa0, 0x56, 0xfa, 0xa2, 0x28, 0xc7, - 0x0a, 0x03, 0x3d, 0x07, 0x83, 0xf4, 0xf7, 0x0d, 0x5c, 0x16, 0x9f, 0x7c, 0x44, 0x20, 0x8f, 0x2c, - 0x3a, 0x91, 0xb3, 0xc8, 0x41, 0x58, 0xe2, 0xa0, 0x15, 0x18, 0xa9, 0xb1, 0xf3, 0x61, 0x63, 0xc5, - 0xaf, 0x13, 0xb6, 0xb6, 0x86, 0xe7, 0x9f, 0xa1, 0xe8, 0x0b, 0x71, 0xf1, 0xfe, 0x6e, 0x69, 0x9a, - 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xdd, 0xfb, 0x18, 0x25, 0xc8, 0xd8, - 0xea, 0xe7, 0xb5, 0x9d, 0xdb, 0xcf, 0x76, 0xee, 0x68, 0xf6, 0xae, 0x45, 0x17, 0xa1, 0x6f, 0xcb, - 0xf5, 0xea, 0xd3, 0x03, 0x8c, 0xd6, 0x69, 0x3a, 0xe7, 0x57, 0x5d, 0xaf, 0xbe, 0xbf, 0x5b, 0x9a, - 0x32, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0x1f, 0x0b, 0x4a, 0x0c, 0xb6, 0xec, 0x36, 0x48, - 0x85, 0x04, 0xa1, 0x1b, 0x46, 0xc4, 0x8b, 0x8c, 0x01, 0x7d, 0x1e, 0x20, 0x24, 0xb5, 0x80, 0x44, - 0xda, 0x90, 0xaa, 0x85, 0x51, 0x55, 0x10, 0xac, 0x61, 0xd1, 0xf3, 0x29, 0xdc, 0x74, 0x02, 0xb6, - 0xbe, 0xc4, 0xc0, 0xaa, 0xf3, 0xa9, 0x2a, 0x01, 0x38, 0xc6, 0x31, 0xce, 0xa7, 0x62, 0xb7, 0xf3, - 0x09, 0x7d, 0x0c, 0x26, 0xe2, 0xc6, 0xc2, 0x96, 0x53, 0x93, 0x03, 0xc8, 0x76, 0x70, 0xd5, 0x04, - 0xe1, 0x24, 0xae, 0xfd, 0x9f, 0x5b, 0x62, 0xf1, 0xd0, 0xaf, 0x7e, 0x9f, 0x7f, 0xab, 0xfd, 0x07, - 0x16, 0x0c, 0xce, 0xbb, 0x5e, 0xdd, 0xf5, 0x36, 0xd0, 0x67, 0x60, 0x88, 0x5e, 0x95, 0x75, 0x27, - 0x72, 0xc4, 0x31, 0xfc, 0x61, 0x6d, 0x6f, 0xa9, 0x9b, 0x6b, 0xb6, 0xb5, 0xb5, 0x41, 0x0b, 0xc2, - 0x59, 0x8a, 0x4d, 0x77, 0xdb, 0xf5, 0xdb, 0x9f, 0x25, 0xb5, 0x68, 0x85, 0x44, 0x4e, 0xfc, 0x39, - 0x71, 0x19, 0x56, 0x54, 0xd1, 0x55, 0x18, 0x88, 0x9c, 0x60, 0x83, 0x44, 0xe2, 0x3c, 0xce, 0x3c, - 0x37, 0x79, 0x4d, 0x4c, 0x77, 0x24, 0xf1, 0x6a, 0x24, 0xbe, 0xa5, 0xd6, 0x58, 0x55, 0x2c, 0x48, - 0xd8, 0xff, 0x6e, 0x10, 0x4e, 0x2e, 0x54, 0xcb, 0x39, 0xeb, 0xea, 0x1c, 0x0c, 0xd4, 0x03, 0x77, - 0x9b, 0x04, 0x62, 0x9c, 0x15, 0x95, 0x45, 0x56, 0x8a, 0x05, 0x14, 0x5d, 0x82, 0x51, 0x7e, 0x3f, - 0x5e, 0x71, 0xbc, 0x7a, 0x7c, 0x3c, 0x0a, 0xec, 0xd1, 0x9b, 0x1a, 0x0c, 0x1b, 0x98, 0x07, 0x5c, - 0x54, 0xe7, 0x12, 0x9b, 0x31, 0xef, 0xee, 0xfd, 0xa2, 0x05, 0x93, 0xbc, 0x99, 0xb9, 0x28, 0x0a, - 0xdc, 0xdb, 0xed, 0x88, 0x84, 0xd3, 0xfd, 0xec, 0xa4, 0x5b, 0xc8, 0x1a, 0xad, 0xdc, 0x11, 0x98, - 0xbd, 0x99, 0xa0, 0xc2, 0x0f, 0xc1, 0x69, 0xd1, 0xee, 0x64, 0x12, 0x8c, 0x53, 0xcd, 0xa2, 0x1f, - 0xb1, 0x60, 0xa6, 0xe6, 0x7b, 0x51, 0xe0, 0x37, 0x1a, 0x24, 0xa8, 0xb4, 0x6f, 0x37, 0xdc, 0x70, - 0x93, 0xaf, 0x53, 0x4c, 0xd6, 0xd9, 0x49, 0x90, 0x33, 0x87, 0x0a, 0x49, 0xcc, 0xe1, 0x99, 0xbd, - 0xdd, 0xd2, 0xcc, 0x42, 0x2e, 0x29, 0xdc, 0xa1, 0x19, 0xb4, 0x05, 0x88, 0xde, 0xec, 0xd5, 0xc8, - 0xd9, 0x20, 0x71, 0xe3, 0x83, 0xbd, 0x37, 0x7e, 0x7c, 0x6f, 0xb7, 0x84, 0x56, 0x53, 0x24, 0x70, - 0x06, 0x59, 0xf4, 0x2e, 0x1c, 0xa5, 0xa5, 0xa9, 0x6f, 0x1d, 0xea, 0xbd, 0xb9, 0xe9, 0xbd, 0xdd, - 0xd2, 0xd1, 0xd5, 0x0c, 0x22, 0x38, 0x93, 0x34, 0xfa, 0x21, 0x0b, 0x4e, 0xc6, 0x9f, 0xbf, 0x74, - 0xb7, 0xe5, 0x78, 0xf5, 0xb8, 0xe1, 0xe1, 0xde, 0x1b, 0xa6, 0x67, 0xf2, 0xc9, 0x85, 0x3c, 0x4a, - 0x38, 0xbf, 0x11, 0xe4, 0xc1, 0x11, 0xda, 0xb5, 0x64, 0xdb, 0xd0, 0x7b, 0xdb, 0x27, 0xf6, 0x76, - 0x4b, 0x47, 0x56, 0xd3, 0x34, 0x70, 0x16, 0xe1, 0x99, 0x05, 0x38, 0x96, 0xb9, 0x3a, 0xd1, 0x24, - 0x14, 0xb7, 0x08, 0x67, 0x02, 0x87, 0x31, 0xfd, 0x89, 0x8e, 0x42, 0xff, 0xb6, 0xd3, 0x68, 0x8b, - 0x8d, 0x89, 0xf9, 0x9f, 0x57, 0x0a, 0x97, 0x2c, 0xfb, 0x7f, 0x28, 0xc2, 0xc4, 0x42, 0xb5, 0x7c, - 0x5f, 0xbb, 0x5e, 0xbf, 0xf6, 0x0a, 0x1d, 0xaf, 0xbd, 0xf8, 0x12, 0x2d, 0xe6, 0x5e, 0xa2, 0x3f, - 0x98, 0xb1, 0x65, 0xfb, 0xd8, 0x96, 0xfd, 0x68, 0xce, 0x96, 0x7d, 0xc0, 0x1b, 0x75, 0x3b, 0x67, - 0xd5, 0xf6, 0xb3, 0x09, 0xcc, 0xe4, 0x90, 0x18, 0xef, 0x97, 0x3c, 0x6a, 0x0f, 0xb8, 0x74, 0x1f, - 0xcc, 0x3c, 0xd6, 0x60, 0x74, 0xc1, 0x69, 0x39, 0xb7, 0xdd, 0x86, 0x1b, 0xb9, 0x24, 0x44, 0x4f, - 0x42, 0xd1, 0xa9, 0xd7, 0x19, 0x77, 0x37, 0x3c, 0x7f, 0x6c, 0x6f, 0xb7, 0x54, 0x9c, 0xab, 0x53, - 0x36, 0x03, 0x14, 0xd6, 0x0e, 0xa6, 0x18, 0xe8, 0x69, 0xe8, 0xab, 0x07, 0x7e, 0x6b, 0xba, 0xc0, - 0x30, 0xe9, 0x2e, 0xef, 0x5b, 0x0c, 0xfc, 0x56, 0x02, 0x95, 0xe1, 0xd8, 0x7f, 0x56, 0x80, 0x53, - 0x0b, 0xa4, 0xb5, 0xb9, 0x5c, 0xcd, 0xb9, 0x2f, 0xce, 0xc3, 0x50, 0xd3, 0xf7, 0xdc, 0xc8, 0x0f, - 0x42, 0xd1, 0x34, 0x5b, 0x11, 0x2b, 0xa2, 0x0c, 0x2b, 0x28, 0x3a, 0x0b, 0x7d, 0xad, 0x98, 0x89, - 0x1d, 0x95, 0x0c, 0x30, 0x63, 0x5f, 0x19, 0x84, 0x62, 0xb4, 0x43, 0x12, 0x88, 0x15, 0xa3, 0x30, - 0x6e, 0x84, 0x24, 0xc0, 0x0c, 0x12, 0x73, 0x02, 0x94, 0x47, 0x10, 0x37, 0x42, 0x82, 0x13, 0xa0, - 0x10, 0xac, 0x61, 0xa1, 0x0a, 0x0c, 0x87, 0x89, 0x99, 0xed, 0x69, 0x6b, 0x8e, 0x31, 0x56, 0x41, - 0xcd, 0x64, 0x4c, 0xc4, 0xb8, 0xc1, 0x06, 0xba, 0xb2, 0x0a, 0x5f, 0x2f, 0x00, 0xe2, 0x43, 0xf8, - 0x5d, 0x36, 0x70, 0x37, 0xd2, 0x03, 0xd7, 0xfb, 0x96, 0x78, 0x50, 0xa3, 0xf7, 0xff, 0x5a, 0x70, - 0x6a, 0xc1, 0xf5, 0xea, 0x24, 0xc8, 0x59, 0x80, 0x0f, 0xe7, 0x29, 0x7f, 0x30, 0x26, 0xc5, 0x58, - 0x62, 0x7d, 0x0f, 0x60, 0x89, 0xd9, 0xff, 0x6c, 0x01, 0xe2, 0x9f, 0xfd, 0xbe, 0xfb, 0xd8, 0x1b, - 0xe9, 0x8f, 0x7d, 0x00, 0xcb, 0xc2, 0xbe, 0x06, 0xe3, 0x0b, 0x0d, 0x97, 0x78, 0x51, 0xb9, 0xb2, - 0xe0, 0x7b, 0xeb, 0xee, 0x06, 0x7a, 0x05, 0xc6, 0x23, 0xb7, 0x49, 0xfc, 0x76, 0x54, 0x25, 0x35, - 0xdf, 0x63, 0x2f, 0x57, 0xeb, 0x7c, 0xff, 0x3c, 0xda, 0xdb, 0x2d, 0x8d, 0xaf, 0x19, 0x10, 0x9c, - 0xc0, 0xb4, 0x7f, 0x95, 0x9e, 0x5b, 0x8d, 0x76, 0x18, 0x91, 0x60, 0x2d, 0x68, 0x87, 0xd1, 0x7c, - 0x9b, 0xf2, 0x9e, 0x95, 0xc0, 0xa7, 0xdd, 0x71, 0x7d, 0x0f, 0x9d, 0x32, 0x9e, 0xe3, 0x43, 0xf2, - 0x29, 0x2e, 0x9e, 0xdd, 0xb3, 0x00, 0xa1, 0xbb, 0xe1, 0x91, 0x40, 0x7b, 0x3e, 0x8c, 0xb3, 0xad, - 0xa2, 0x4a, 0xb1, 0x86, 0x81, 0x1a, 0x30, 0xd6, 0x70, 0x6e, 0x93, 0x46, 0x95, 0x34, 0x48, 0x2d, - 0xf2, 0x03, 0x21, 0xdf, 0x78, 0xa1, 0xb7, 0x77, 0xc0, 0x35, 0xbd, 0xea, 0xfc, 0xd4, 0xde, 0x6e, - 0x69, 0xcc, 0x28, 0xc2, 0x26, 0x71, 0x7a, 0x74, 0xf8, 0x2d, 0xfa, 0x15, 0x4e, 0x43, 0x7f, 0x7c, - 0x5e, 0x17, 0x65, 0x58, 0x41, 0xd5, 0xd1, 0xd1, 0x97, 0x77, 0x74, 0xd8, 0x7f, 0x47, 0x17, 0x9a, - 0xdf, 0x6c, 0xf9, 0x1e, 0xf1, 0xa2, 0x05, 0xdf, 0xab, 0x73, 0xc9, 0xd4, 0x2b, 0x86, 0xe8, 0xe4, - 0x5c, 0x42, 0x74, 0x72, 0x3c, 0x5d, 0x43, 0x93, 0x9e, 0x7c, 0x14, 0x06, 0xc2, 0xc8, 0x89, 0xda, - 0xa1, 0x18, 0xb8, 0x47, 0xe5, 0xb2, 0xab, 0xb2, 0xd2, 0xfd, 0xdd, 0xd2, 0x84, 0xaa, 0xc6, 0x8b, - 0xb0, 0xa8, 0x80, 0x9e, 0x82, 0xc1, 0x26, 0x09, 0x43, 0x67, 0x43, 0xb2, 0x0d, 0x13, 0xa2, 0xee, - 0xe0, 0x0a, 0x2f, 0xc6, 0x12, 0x8e, 0x1e, 0x83, 0x7e, 0x12, 0x04, 0x7e, 0x20, 0xbe, 0x6d, 0x4c, - 0x20, 0xf6, 0x2f, 0xd1, 0x42, 0xcc, 0x61, 0xf6, 0xff, 0x6c, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, - 0x10, 0x9e, 0x6b, 0x6f, 0x03, 0xd4, 0xe4, 0x07, 0x86, 0xec, 0x9a, 0x1d, 0x79, 0xfe, 0x5c, 0x26, - 0x47, 0x93, 0x1a, 0xc6, 0x98, 0xb2, 0x2a, 0x0a, 0xb1, 0x46, 0xcd, 0xfe, 0x63, 0x0b, 0x8e, 0x24, - 0xbe, 0xe8, 0x9a, 0x1b, 0x46, 0xe8, 0x9d, 0xd4, 0x57, 0xcd, 0xf6, 0xb8, 0xf8, 0xdc, 0x90, 0x7f, - 0x93, 0xda, 0xf3, 0xb2, 0x44, 0xfb, 0xa2, 0x2b, 0xd0, 0xef, 0x46, 0xa4, 0x29, 0x3f, 0xe6, 0xb1, - 0x8e, 0x1f, 0xc3, 0x7b, 0x15, 0xcf, 0x48, 0x99, 0xd6, 0xc4, 0x9c, 0x80, 0xfd, 0x67, 0x45, 0x18, - 0xe6, 0xfb, 0x7b, 0xc5, 0x69, 0x1d, 0xc2, 0x5c, 0x3c, 0x03, 0xc3, 0x6e, 0xb3, 0xd9, 0x8e, 0x9c, - 0xdb, 0xe2, 0xde, 0x1b, 0xe2, 0x67, 0x50, 0x59, 0x16, 0xe2, 0x18, 0x8e, 0xca, 0xd0, 0xc7, 0xba, - 0xc2, 0xbf, 0xf2, 0xc9, 0xec, 0xaf, 0x14, 0x7d, 0x9f, 0x5d, 0x74, 0x22, 0x87, 0xb3, 0x9c, 0x6a, - 0x5f, 0xd1, 0x22, 0xcc, 0x48, 0x20, 0x07, 0xe0, 0xb6, 0xeb, 0x39, 0xc1, 0x0e, 0x2d, 0x9b, 0x2e, - 0x32, 0x82, 0xcf, 0x75, 0x26, 0x38, 0xaf, 0xf0, 0x39, 0x59, 0xf5, 0x61, 0x31, 0x00, 0x6b, 0x44, - 0x67, 0x5e, 0x86, 0x61, 0x85, 0x7c, 0x10, 0xce, 0x71, 0xe6, 0x63, 0x30, 0x91, 0x68, 0xab, 0x5b, - 0xf5, 0x51, 0x9d, 0xf1, 0xfc, 0x43, 0x76, 0x64, 0x88, 0x5e, 0x2f, 0x79, 0xdb, 0xe2, 0x6e, 0xba, - 0x07, 0x47, 0x1b, 0x19, 0x47, 0xbe, 0x98, 0xd7, 0xde, 0xaf, 0x88, 0x53, 0xe2, 0xb3, 0x8f, 0x66, - 0x41, 0x71, 0x66, 0x1b, 0xc6, 0x89, 0x58, 0xe8, 0x74, 0x22, 0xd2, 0xf3, 0xee, 0xa8, 0xea, 0xfc, - 0x55, 0xb2, 0xa3, 0x0e, 0xd5, 0xef, 0x64, 0xf7, 0x4f, 0xf3, 0xd1, 0xe7, 0xc7, 0xe5, 0x88, 0x20, - 0x50, 0xbc, 0x4a, 0x76, 0xf8, 0x54, 0xe8, 0x5f, 0x57, 0xec, 0xf8, 0x75, 0x5f, 0xb3, 0x60, 0x4c, - 0x7d, 0xdd, 0x21, 0x9c, 0x0b, 0xf3, 0xe6, 0xb9, 0x70, 0xba, 0xe3, 0x02, 0xcf, 0x39, 0x11, 0xbe, - 0x5e, 0x80, 0x93, 0x0a, 0x87, 0x3e, 0xa2, 0xf8, 0x1f, 0xb1, 0xaa, 0x2e, 0xc0, 0xb0, 0xa7, 0xc4, - 0x89, 0x96, 0x29, 0xc7, 0x8b, 0x85, 0x89, 0x31, 0x0e, 0xbd, 0xf2, 0xbc, 0xf8, 0xd2, 0x1e, 0xd5, - 0xe5, 0xec, 0xe2, 0x72, 0x9f, 0x87, 0x62, 0xdb, 0xad, 0x8b, 0x0b, 0xe6, 0xc3, 0x72, 0xb4, 0x6f, - 0x94, 0x17, 0xf7, 0x77, 0x4b, 0x8f, 0xe6, 0xa9, 0x9c, 0xe8, 0xcd, 0x16, 0xce, 0xde, 0x28, 0x2f, - 0x62, 0x5a, 0x19, 0xcd, 0xc1, 0x84, 0xd4, 0xaa, 0xdd, 0xa4, 0x7c, 0xa9, 0xef, 0x89, 0x7b, 0x48, - 0x09, 0xcb, 0xb1, 0x09, 0xc6, 0x49, 0x7c, 0xb4, 0x08, 0x93, 0x5b, 0xed, 0xdb, 0xa4, 0x41, 0x22, - 0xfe, 0xc1, 0x57, 0x09, 0x17, 0x25, 0x0f, 0xc7, 0x4f, 0xd8, 0xab, 0x09, 0x38, 0x4e, 0xd5, 0xb0, - 0xbf, 0xcd, 0xee, 0x03, 0x31, 0x7a, 0x1a, 0x7f, 0xf3, 0x9d, 0x5c, 0xce, 0xbd, 0xac, 0x8a, 0xab, - 0x64, 0x67, 0xcd, 0xa7, 0x7c, 0x48, 0xf6, 0xaa, 0x30, 0xd6, 0x7c, 0x5f, 0xc7, 0x35, 0xff, 0xbb, - 0x05, 0x38, 0xa6, 0x46, 0xc0, 0xe0, 0x96, 0xbf, 0xdb, 0xc7, 0xe0, 0x22, 0x8c, 0xd4, 0xc9, 0xba, - 0xd3, 0x6e, 0x44, 0x4a, 0xaf, 0xd1, 0xcf, 0x55, 0x6d, 0x8b, 0x71, 0x31, 0xd6, 0x71, 0x0e, 0x30, - 0x6c, 0xbf, 0x39, 0xc6, 0x2e, 0xe2, 0xc8, 0xa1, 0x6b, 0x5c, 0xed, 0x1a, 0x2b, 0x77, 0xd7, 0x3c, - 0x06, 0xfd, 0x6e, 0x93, 0x32, 0x66, 0x05, 0x93, 0xdf, 0x2a, 0xd3, 0x42, 0xcc, 0x61, 0xe8, 0x09, - 0x18, 0xac, 0xf9, 0xcd, 0xa6, 0xe3, 0xd5, 0xd9, 0x95, 0x37, 0x3c, 0x3f, 0x42, 0x79, 0xb7, 0x05, - 0x5e, 0x84, 0x25, 0x8c, 0x32, 0xdf, 0x4e, 0xb0, 0xc1, 0x85, 0x3d, 0x82, 0xf9, 0x9e, 0x0b, 0x36, - 0x42, 0xcc, 0x4a, 0xe9, 0x5b, 0xf5, 0x8e, 0x1f, 0x6c, 0xb9, 0xde, 0xc6, 0xa2, 0x1b, 0x88, 0x2d, - 0xa1, 0xee, 0xc2, 0x5b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x0c, 0xfd, 0x2d, 0x3f, 0x88, 0xc2, 0xe9, - 0x01, 0x36, 0xdc, 0x8f, 0xe6, 0x1c, 0x44, 0xfc, 0x6b, 0x2b, 0x7e, 0x10, 0xc5, 0x1f, 0x40, 0xff, - 0x85, 0x98, 0x57, 0x47, 0xd7, 0x60, 0x90, 0x78, 0xdb, 0xcb, 0x81, 0xdf, 0x9c, 0x3e, 0x92, 0x4f, - 0x69, 0x89, 0xa3, 0xf0, 0x65, 0x16, 0xf3, 0xa8, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0xa3, 0x50, 0x24, - 0xde, 0xf6, 0xf4, 0x20, 0xa3, 0x34, 0x93, 0x43, 0xe9, 0xa6, 0x13, 0xc4, 0x67, 0xfe, 0x92, 0xb7, - 0x8d, 0x69, 0x1d, 0xf4, 0x09, 0x18, 0x96, 0x07, 0x46, 0x28, 0xa4, 0xa8, 0x99, 0x0b, 0x56, 0x1e, - 0x33, 0x98, 0xbc, 0xdb, 0x76, 0x03, 0xd2, 0x24, 0x5e, 0x14, 0xc6, 0x27, 0xa4, 0x84, 0x86, 0x38, - 0xa6, 0x86, 0x6a, 0x30, 0x1a, 0x90, 0xd0, 0xbd, 0x47, 0x2a, 0x7e, 0xc3, 0xad, 0xed, 0x4c, 0x9f, - 0x60, 0xdd, 0x7b, 0xaa, 0xe3, 0x90, 0x61, 0xad, 0x42, 0x2c, 0xe5, 0xd7, 0x4b, 0xb1, 0x41, 0x14, - 0xbd, 0x05, 0x63, 0x01, 0x09, 0x23, 0x27, 0x88, 0x44, 0x2b, 0xd3, 0x4a, 0x2b, 0x37, 0x86, 0x75, - 0x00, 0x7f, 0x4e, 0xc4, 0xcd, 0xc4, 0x10, 0x6c, 0x52, 0x40, 0x9f, 0x90, 0x2a, 0x87, 0x15, 0xbf, - 0xed, 0x45, 0xe1, 0xf4, 0x30, 0xeb, 0x77, 0xa6, 0x6e, 0xfa, 0x66, 0x8c, 0x97, 0xd4, 0x49, 0xf0, - 0xca, 0xd8, 0x20, 0x85, 0x3e, 0x05, 0x63, 0xfc, 0x3f, 0x57, 0xa9, 0x86, 0xd3, 0xc7, 0x18, 0xed, - 0xb3, 0xf9, 0xb4, 0x39, 0xe2, 0xfc, 0x31, 0x41, 0x7c, 0x4c, 0x2f, 0x0d, 0xb1, 0x49, 0x0d, 0x61, - 0x18, 0x6b, 0xb8, 0xdb, 0xc4, 0x23, 0x61, 0x58, 0x09, 0xfc, 0xdb, 0x44, 0x48, 0x88, 0x4f, 0x66, - 0xab, 0x60, 0xfd, 0xdb, 0x44, 0x3c, 0x02, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0x6e, 0xc0, 0x38, 0x7d, - 0x92, 0xbb, 0x31, 0xd1, 0x91, 0x6e, 0x44, 0xd9, 0xc3, 0x19, 0x1b, 0x95, 0x70, 0x82, 0x08, 0xba, - 0x0e, 0xa3, 0x6c, 0xcc, 0xdb, 0x2d, 0x4e, 0xf4, 0x78, 0x37, 0xa2, 0xcc, 0xa0, 0xa0, 0xaa, 0x55, - 0xc1, 0x06, 0x01, 0xf4, 0x26, 0x0c, 0x37, 0xdc, 0x75, 0x52, 0xdb, 0xa9, 0x35, 0xc8, 0xf4, 0x28, - 0xa3, 0x96, 0x79, 0x18, 0x5e, 0x93, 0x48, 0x9c, 0x3f, 0x57, 0x7f, 0x71, 0x5c, 0x1d, 0xdd, 0x84, - 0xe3, 0x11, 0x09, 0x9a, 0xae, 0xe7, 0xd0, 0x43, 0x4c, 0x3c, 0x09, 0x99, 0x66, 0x7c, 0x8c, 0xad, - 0xae, 0x33, 0x62, 0x36, 0x8e, 0xaf, 0x65, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x2e, 0x4c, 0x67, 0x40, - 0xf8, 0xba, 0x3d, 0xca, 0x28, 0xbf, 0x26, 0x28, 0x4f, 0xaf, 0xe5, 0xe0, 0xed, 0x77, 0x80, 0xe1, - 0x5c, 0xea, 0xe8, 0x3a, 0x4c, 0xb0, 0x93, 0xb3, 0xd2, 0x6e, 0x34, 0x44, 0x83, 0xe3, 0xac, 0xc1, - 0x27, 0x24, 0x1f, 0x51, 0x36, 0xc1, 0xfb, 0xbb, 0x25, 0x88, 0xff, 0xe1, 0x64, 0x6d, 0x74, 0x9b, - 0x29, 0x61, 0xdb, 0x81, 0x1b, 0xed, 0xd0, 0x5d, 0x45, 0xee, 0x46, 0xd3, 0x13, 0x1d, 0x05, 0x52, - 0x3a, 0xaa, 0xd2, 0xd4, 0xea, 0x85, 0x38, 0x49, 0x90, 0x5e, 0x05, 0x61, 0x54, 0x77, 0xbd, 0xe9, - 0x49, 0xfe, 0x9e, 0x92, 0x27, 0x69, 0x95, 0x16, 0x62, 0x0e, 0x63, 0x0a, 0x58, 0xfa, 0xe3, 0x3a, - 0xbd, 0x71, 0xa7, 0x18, 0x62, 0xac, 0x80, 0x95, 0x00, 0x1c, 0xe3, 0x50, 0x26, 0x38, 0x8a, 0x76, - 0xa6, 0x11, 0x43, 0x55, 0x07, 0xe2, 0xda, 0xda, 0x27, 0x30, 0x2d, 0xb7, 0x6f, 0xc3, 0xb8, 0x3a, - 0x26, 0xd8, 0x98, 0xa0, 0x12, 0xf4, 0x33, 0xb6, 0x4f, 0x88, 0x4f, 0x87, 0x69, 0x17, 0x18, 0x4b, - 0x88, 0x79, 0x39, 0xeb, 0x82, 0x7b, 0x8f, 0xcc, 0xef, 0x44, 0x84, 0xcb, 0x22, 0x8a, 0x5a, 0x17, - 0x24, 0x00, 0xc7, 0x38, 0xf6, 0xbf, 0xe7, 0xec, 0x73, 0x7c, 0x4b, 0xf4, 0x70, 0x2f, 0x3e, 0x0b, - 0x43, 0xcc, 0xf0, 0xc3, 0x0f, 0xb8, 0x76, 0xb6, 0x3f, 0x66, 0x98, 0xaf, 0x88, 0x72, 0xac, 0x30, - 0xd0, 0xab, 0x30, 0x56, 0xd3, 0x1b, 0x10, 0x97, 0xba, 0x3a, 0x46, 0x8c, 0xd6, 0xb1, 0x89, 0x8b, - 0x2e, 0xc1, 0x10, 0xb3, 0x71, 0xaa, 0xf9, 0x0d, 0xc1, 0x6d, 0x4a, 0xce, 0x64, 0xa8, 0x22, 0xca, - 0xf7, 0xb5, 0xdf, 0x58, 0x61, 0xa3, 0x73, 0x30, 0x40, 0xbb, 0x50, 0xae, 0x88, 0xeb, 0x54, 0x49, - 0x02, 0xaf, 0xb0, 0x52, 0x2c, 0xa0, 0xf6, 0x1f, 0x5b, 0x8c, 0x97, 0x4a, 0x9f, 0xf9, 0xe8, 0x0a, - 0xbb, 0x34, 0xd8, 0x0d, 0xa2, 0x69, 0xe1, 0x1f, 0xd7, 0x6e, 0x02, 0x05, 0xdb, 0x4f, 0xfc, 0xc7, - 0x46, 0x4d, 0xf4, 0x76, 0xf2, 0x66, 0xe0, 0x0c, 0xc5, 0x8b, 0x72, 0x08, 0x92, 0xb7, 0xc3, 0x23, - 0xf1, 0x15, 0x47, 0xfb, 0xd3, 0xe9, 0x8a, 0xb0, 0x7f, 0xaa, 0xa0, 0xad, 0x92, 0x6a, 0xe4, 0x44, - 0x04, 0x55, 0x60, 0xf0, 0x8e, 0xe3, 0x46, 0xae, 0xb7, 0x21, 0xf8, 0xbe, 0xce, 0x17, 0x1d, 0xab, - 0x74, 0x8b, 0x57, 0xe0, 0xdc, 0x8b, 0xf8, 0x83, 0x25, 0x19, 0x4a, 0x31, 0x68, 0x7b, 0x1e, 0xa5, - 0x58, 0xe8, 0x95, 0x22, 0xe6, 0x15, 0x38, 0x45, 0xf1, 0x07, 0x4b, 0x32, 0xe8, 0x1d, 0x00, 0x79, - 0x42, 0x90, 0xba, 0x90, 0x1d, 0x3e, 0xdb, 0x9d, 0xe8, 0x9a, 0xaa, 0xc3, 0x85, 0x93, 0xf1, 0x7f, - 0xac, 0xd1, 0xb3, 0x23, 0x6d, 0x4e, 0xf5, 0xce, 0xa0, 0x4f, 0xd2, 0x2d, 0xea, 0x04, 0x11, 0xa9, - 0xcf, 0x45, 0x62, 0x70, 0x9e, 0xee, 0xed, 0x71, 0xb8, 0xe6, 0x36, 0x89, 0xbe, 0x9d, 0x05, 0x11, - 0x1c, 0xd3, 0xb3, 0x7f, 0xbf, 0x08, 0xd3, 0x79, 0xdd, 0xa5, 0x9b, 0x86, 0xdc, 0x75, 0xa3, 0x05, - 0xca, 0xd6, 0x5a, 0xe6, 0xa6, 0x59, 0x12, 0xe5, 0x58, 0x61, 0xd0, 0xd5, 0x1b, 0xba, 0x1b, 0xf2, - 0x6d, 0xdf, 0x1f, 0xaf, 0xde, 0x2a, 0x2b, 0xc5, 0x02, 0x4a, 0xf1, 0x02, 0xe2, 0x84, 0xc2, 0xf8, - 0x4e, 0x5b, 0xe5, 0x98, 0x95, 0x62, 0x01, 0xd5, 0xa5, 0x8c, 0x7d, 0x5d, 0xa4, 0x8c, 0xc6, 0x10, - 0xf5, 0x3f, 0xd8, 0x21, 0x42, 0x9f, 0x06, 0x58, 0x77, 0x3d, 0x37, 0xdc, 0x64, 0xd4, 0x07, 0x0e, - 0x4c, 0x5d, 0x31, 0xc5, 0xcb, 0x8a, 0x0a, 0xd6, 0x28, 0xa2, 0x97, 0x60, 0x44, 0x1d, 0x20, 0xe5, - 0x45, 0xa6, 0xfa, 0xd7, 0x4c, 0xa9, 0xe2, 0xd3, 0x74, 0x11, 0xeb, 0x78, 0xf6, 0x67, 0x93, 0xeb, - 0x45, 0xec, 0x00, 0x6d, 0x7c, 0xad, 0x5e, 0xc7, 0xb7, 0xd0, 0x79, 0x7c, 0xed, 0xbf, 0x1e, 0x86, - 0x09, 0xa3, 0xb1, 0x76, 0xd8, 0xc3, 0x99, 0x7b, 0x99, 0x5e, 0x40, 0x4e, 0x44, 0xc4, 0xfe, 0xb3, - 0xbb, 0x6f, 0x15, 0xfd, 0x92, 0xa2, 0x3b, 0x80, 0xd7, 0x47, 0x9f, 0x86, 0xe1, 0x86, 0x13, 0x32, - 0x89, 0x25, 0x11, 0xfb, 0xae, 0x17, 0x62, 0xf1, 0x83, 0xd0, 0x09, 0x23, 0xed, 0xd6, 0xe7, 0xb4, - 0x63, 0x92, 0xf4, 0xa6, 0xa4, 0xfc, 0x95, 0xb4, 0xee, 0x54, 0x9d, 0xa0, 0x4c, 0xd8, 0x0e, 0xe6, - 0x30, 0x74, 0x89, 0x1d, 0xad, 0x74, 0x55, 0x2c, 0x50, 0x6e, 0x94, 0x2d, 0xb3, 0x7e, 0x83, 0xc9, - 0x56, 0x30, 0x6c, 0x60, 0xc6, 0x6f, 0xb2, 0x81, 0x0e, 0x6f, 0xb2, 0xa7, 0x60, 0x90, 0xfd, 0x50, - 0x2b, 0x40, 0xcd, 0x46, 0x99, 0x17, 0x63, 0x09, 0x4f, 0x2e, 0x98, 0xa1, 0xde, 0x16, 0x0c, 0x7d, - 0xf5, 0x89, 0x45, 0xcd, 0xcc, 0x2e, 0x86, 0xf8, 0x29, 0x27, 0x96, 0x3c, 0x96, 0x30, 0xf4, 0x6b, - 0x16, 0x20, 0xa7, 0x41, 0x5f, 0xcb, 0xb4, 0x58, 0x3d, 0x6e, 0x80, 0xb1, 0xda, 0xaf, 0x76, 0x1d, - 0xf6, 0x76, 0x38, 0x3b, 0x97, 0xaa, 0xcd, 0x25, 0xa5, 0xaf, 0x88, 0x2e, 0xa2, 0x34, 0x82, 0x7e, - 0x19, 0x5d, 0x73, 0xc3, 0xe8, 0xf3, 0x7f, 0x9f, 0xb8, 0x9c, 0x32, 0xba, 0x84, 0x6e, 0xe8, 0x8f, - 0xaf, 0x91, 0x03, 0x3e, 0xbe, 0xc6, 0x72, 0x1f, 0x5e, 0xdf, 0x9f, 0x78, 0xc0, 0x8c, 0xb2, 0x2f, - 0x7f, 0xa2, 0xcb, 0x03, 0x46, 0x88, 0xd3, 0x7b, 0x79, 0xc6, 0x54, 0x84, 0x1e, 0x78, 0x8c, 0x75, - 0xb9, 0xf3, 0x23, 0xf8, 0x46, 0x48, 0x82, 0xf9, 0x93, 0x52, 0x4d, 0xbc, 0xaf, 0xf3, 0x1e, 0x9a, - 0xde, 0xf8, 0x87, 0x2c, 0x98, 0x4e, 0x0f, 0x10, 0xef, 0xd2, 0xf4, 0x38, 0xeb, 0xbf, 0xdd, 0x69, - 0x64, 0x44, 0xe7, 0xa5, 0xb9, 0xeb, 0xf4, 0x5c, 0x0e, 0x2d, 0x9c, 0xdb, 0x0a, 0xba, 0x04, 0x10, - 0x46, 0x7e, 0x8b, 0x9f, 0xf5, 0x8c, 0x99, 0x1d, 0x66, 0x06, 0x17, 0x50, 0x55, 0xa5, 0xfb, 0xf1, - 0x5d, 0xa0, 0xe1, 0xce, 0xb4, 0xe1, 0x44, 0xce, 0x8a, 0xc9, 0x90, 0x77, 0x2f, 0xea, 0xf2, 0xee, - 0x2e, 0x52, 0xd2, 0x59, 0x39, 0xa7, 0xb3, 0x6f, 0xb5, 0x1d, 0x2f, 0x72, 0xa3, 0x1d, 0x5d, 0x3e, - 0xee, 0x81, 0x39, 0x94, 0xe8, 0x53, 0xd0, 0xdf, 0x70, 0xbd, 0xf6, 0x5d, 0x71, 0xc7, 0x9e, 0xcb, - 0x7e, 0xfe, 0x78, 0xed, 0xbb, 0xe6, 0xe4, 0x94, 0xe8, 0x56, 0x66, 0xe5, 0xfb, 0xbb, 0x25, 0x94, - 0x46, 0xc0, 0x9c, 0xaa, 0xfd, 0x34, 0x8c, 0x2f, 0x3a, 0xa4, 0xe9, 0x7b, 0x4b, 0x5e, 0xbd, 0xe5, - 0xbb, 0x5e, 0x84, 0xa6, 0xa1, 0x8f, 0x31, 0x97, 0xfc, 0x6a, 0xed, 0xa3, 0x83, 0x8f, 0x59, 0x89, - 0xbd, 0x01, 0xc7, 0x16, 0xfd, 0x3b, 0xde, 0x1d, 0x27, 0xa8, 0xcf, 0x55, 0xca, 0x9a, 0xbc, 0x70, - 0x55, 0xca, 0xab, 0xac, 0x7c, 0x69, 0x80, 0x56, 0x93, 0x2f, 0xc2, 0x65, 0xb7, 0x41, 0x72, 0xa4, - 0xba, 0x3f, 0x5b, 0x30, 0x5a, 0x8a, 0xf1, 0x95, 0x4e, 0xd2, 0xca, 0x35, 0x67, 0x78, 0x0b, 0x86, - 0xd6, 0x5d, 0xd2, 0xa8, 0x63, 0xb2, 0x2e, 0x66, 0xe3, 0xc9, 0x7c, 0x83, 0xc7, 0x65, 0x8a, 0xa9, - 0x94, 0xa7, 0x4c, 0xda, 0xb5, 0x2c, 0x2a, 0x63, 0x45, 0x06, 0x6d, 0xc1, 0xa4, 0x9c, 0x33, 0x09, - 0x15, 0xe7, 0xfd, 0x53, 0x9d, 0x96, 0xaf, 0x49, 0x9c, 0x19, 0x7f, 0xe3, 0x04, 0x19, 0x9c, 0x22, - 0x8c, 0x4e, 0x41, 0x5f, 0x93, 0x72, 0x36, 0x7d, 0x6c, 0xf8, 0x99, 0x78, 0x8b, 0x49, 0xea, 0x58, - 0xa9, 0xfd, 0xf3, 0x16, 0x9c, 0x48, 0x8d, 0x8c, 0x90, 0x58, 0x3e, 0xe0, 0x59, 0x48, 0x4a, 0x10, - 0x0b, 0xdd, 0x25, 0x88, 0xf6, 0x7f, 0x61, 0xc1, 0xd1, 0xa5, 0x66, 0x2b, 0xda, 0x59, 0x74, 0x4d, - 0xdb, 0x83, 0x97, 0x61, 0xa0, 0x49, 0xea, 0x6e, 0xbb, 0x29, 0x66, 0xae, 0x24, 0x6f, 0xff, 0x15, - 0x56, 0x4a, 0x4f, 0x90, 0x6a, 0xe4, 0x07, 0xce, 0x06, 0xe1, 0x05, 0x58, 0xa0, 0x33, 0x1e, 0xca, - 0xbd, 0x47, 0xae, 0xb9, 0x4d, 0x37, 0xba, 0xbf, 0xdd, 0x25, 0xcc, 0x06, 0x24, 0x11, 0x1c, 0xd3, - 0xb3, 0xbf, 0x69, 0xc1, 0x84, 0x5c, 0xf7, 0x73, 0xf5, 0x7a, 0x40, 0xc2, 0x10, 0xcd, 0x40, 0xc1, - 0x6d, 0x89, 0x5e, 0x82, 0xe8, 0x65, 0xa1, 0x5c, 0xc1, 0x05, 0xb7, 0x25, 0x9f, 0x6b, 0x8c, 0xc1, - 0x28, 0x9a, 0x16, 0x14, 0x57, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x3c, 0x0c, 0x79, 0x7e, 0x9d, 0xbf, - 0x78, 0x84, 0x0e, 0x9d, 0x62, 0xae, 0x8a, 0x32, 0xac, 0xa0, 0xa8, 0x02, 0xc3, 0xdc, 0xbe, 0x36, - 0x5e, 0xb4, 0x3d, 0x59, 0xe9, 0xb2, 0x2f, 0x5b, 0x93, 0x35, 0x71, 0x4c, 0xc4, 0xfe, 0x53, 0x0b, - 0x46, 0xe5, 0x97, 0xf5, 0xf8, 0x16, 0xa5, 0x5b, 0x2b, 0x7e, 0x87, 0xc6, 0x5b, 0x8b, 0xbe, 0x25, - 0x19, 0xc4, 0x78, 0x42, 0x16, 0x0f, 0xf4, 0x84, 0xbc, 0x08, 0x23, 0x4e, 0xab, 0x55, 0x31, 0xdf, - 0x9f, 0x6c, 0x29, 0xcd, 0xc5, 0xc5, 0x58, 0xc7, 0xb1, 0x7f, 0xae, 0x00, 0xe3, 0xf2, 0x0b, 0xaa, - 0xed, 0xdb, 0x21, 0x89, 0xd0, 0x1a, 0x0c, 0x3b, 0x7c, 0x96, 0x88, 0x5c, 0xe4, 0x8f, 0x65, 0xcb, - 0x45, 0x8d, 0x29, 0x8d, 0x19, 0xe9, 0x39, 0x59, 0x1b, 0xc7, 0x84, 0x50, 0x03, 0xa6, 0x3c, 0x3f, - 0x62, 0x4c, 0x95, 0x82, 0x77, 0x52, 0x55, 0x27, 0xa9, 0x9f, 0x14, 0xd4, 0xa7, 0x56, 0x93, 0x54, - 0x70, 0x9a, 0x30, 0x5a, 0x92, 0xb2, 0xe6, 0x62, 0xbe, 0x90, 0x50, 0x9f, 0xb8, 0x6c, 0x51, 0xb3, - 0xfd, 0x47, 0x16, 0x0c, 0x4b, 0xb4, 0xc3, 0xb0, 0x4a, 0x58, 0x81, 0xc1, 0x90, 0x4d, 0x82, 0x1c, - 0x1a, 0xbb, 0x53, 0xc7, 0xf9, 0x7c, 0xc5, 0xbc, 0x22, 0xff, 0x1f, 0x62, 0x49, 0x83, 0xa9, 0x1a, - 0x55, 0xf7, 0xdf, 0x27, 0xaa, 0x46, 0xd5, 0x9f, 0x9c, 0x4b, 0xe9, 0x1f, 0x58, 0x9f, 0x35, 0xd9, - 0x3d, 0x7d, 0xd2, 0xb4, 0x02, 0xb2, 0xee, 0xde, 0x4d, 0x3e, 0x69, 0x2a, 0xac, 0x14, 0x0b, 0x28, - 0x7a, 0x07, 0x46, 0x6b, 0x52, 0xc7, 0x14, 0xef, 0xf0, 0x73, 0x1d, 0xf5, 0x9d, 0x4a, 0x35, 0xce, - 0x65, 0xa4, 0x0b, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0xed, 0xc7, 0x8a, 0xdd, 0xec, 0xc7, 0x62, 0xba, - 0xf9, 0xd6, 0x54, 0xbf, 0x60, 0xc1, 0x00, 0xd7, 0x2d, 0xf4, 0xa6, 0xda, 0xd1, 0x2c, 0x05, 0xe2, - 0xb1, 0xbb, 0x49, 0x0b, 0x05, 0x67, 0x83, 0x56, 0x60, 0x98, 0xfd, 0x60, 0xba, 0x91, 0x62, 0xbe, - 0xb7, 0x19, 0x6f, 0x55, 0xef, 0xe0, 0x4d, 0x59, 0x0d, 0xc7, 0x14, 0xec, 0x9f, 0x2e, 0xd2, 0xd3, - 0x2d, 0x46, 0x35, 0x2e, 0x7d, 0xeb, 0xe1, 0x5d, 0xfa, 0x85, 0x87, 0x75, 0xe9, 0x6f, 0xc0, 0x44, - 0x4d, 0xb3, 0x2b, 0x88, 0x67, 0xf2, 0x7c, 0xc7, 0x45, 0xa2, 0x99, 0x20, 0x70, 0xe9, 0xeb, 0x82, - 0x49, 0x04, 0x27, 0xa9, 0xa2, 0x4f, 0xc2, 0x28, 0x9f, 0x67, 0xd1, 0x0a, 0x37, 0xc1, 0x7b, 0x22, - 0x7f, 0xbd, 0xe8, 0x4d, 0x70, 0x69, 0xbd, 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x7f, 0xb1, 0x00, 0x2d, - 0xb5, 0x36, 0x49, 0x93, 0x04, 0x4e, 0x23, 0x56, 0x0f, 0x7e, 0xc9, 0x82, 0x69, 0x92, 0x2a, 0x5e, - 0xf0, 0x9b, 0x4d, 0x21, 0x0c, 0xc8, 0x91, 0x57, 0x2d, 0xe5, 0xd4, 0x89, 0x1f, 0x04, 0x79, 0x18, - 0x38, 0xb7, 0x3d, 0xb4, 0x02, 0x47, 0xf8, 0x2d, 0xa9, 0x00, 0x9a, 0x95, 0xde, 0x23, 0x82, 0xf0, - 0x91, 0xb5, 0x34, 0x0a, 0xce, 0xaa, 0x67, 0xff, 0xd1, 0x18, 0xe4, 0xf6, 0xe2, 0x03, 0xbd, 0xe8, - 0x07, 0x7a, 0xd1, 0x0f, 0xf4, 0xa2, 0x1f, 0xe8, 0x45, 0x3f, 0xd0, 0x8b, 0x7e, 0xa0, 0x17, 0x7d, - 0x9f, 0xea, 0x45, 0x7f, 0xc6, 0x82, 0x63, 0xea, 0xfa, 0x32, 0x1e, 0xec, 0x9f, 0x83, 0x23, 0x7c, - 0xbb, 0x2d, 0x34, 0x1c, 0xb7, 0xb9, 0x46, 0x9a, 0xad, 0x86, 0x13, 0x49, 0xeb, 0xa7, 0x8b, 0x99, - 0x2b, 0x37, 0xe1, 0x62, 0x61, 0x54, 0xe4, 0xbe, 0x6a, 0x19, 0x00, 0x9c, 0xd5, 0x8c, 0xfd, 0xfb, - 0x43, 0xd0, 0xbf, 0xb4, 0x4d, 0xbc, 0xe8, 0x10, 0x9e, 0x36, 0x35, 0x18, 0x77, 0xbd, 0x6d, 0xbf, - 0xb1, 0x4d, 0xea, 0x1c, 0x7e, 0x90, 0x17, 0xf8, 0x71, 0x41, 0x7a, 0xbc, 0x6c, 0x90, 0xc0, 0x09, - 0x92, 0x0f, 0x43, 0xbb, 0x74, 0x19, 0x06, 0xf8, 0xe5, 0x23, 0x54, 0x4b, 0x99, 0x67, 0x36, 0x1b, - 0x44, 0x71, 0xa5, 0xc6, 0x9a, 0x2f, 0x7e, 0xb9, 0x89, 0xea, 0xe8, 0xb3, 0x30, 0xbe, 0xee, 0x06, - 0x61, 0xb4, 0xe6, 0x36, 0xe9, 0xd5, 0xd0, 0x6c, 0xdd, 0x87, 0x36, 0x49, 0x8d, 0xc3, 0xb2, 0x41, - 0x09, 0x27, 0x28, 0xa3, 0x0d, 0x18, 0x6b, 0x38, 0x7a, 0x53, 0x83, 0x07, 0x6e, 0x4a, 0xdd, 0x0e, - 0xd7, 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0xb7, 0x53, 0x8d, 0x29, 0x44, 0x86, 0x98, 0x38, 0x43, 0x6d, - 0x27, 0xae, 0x09, 0xe1, 0x30, 0xca, 0xa0, 0x31, 0x47, 0x85, 0x61, 0x93, 0x41, 0xd3, 0xdc, 0x11, - 0x3e, 0x03, 0xc3, 0x84, 0x0e, 0x21, 0x25, 0x2c, 0x2e, 0x98, 0x0b, 0xbd, 0xf5, 0x75, 0xc5, 0xad, - 0x05, 0xbe, 0xa9, 0xc7, 0x5b, 0x92, 0x94, 0x70, 0x4c, 0x14, 0x2d, 0xc0, 0x40, 0x48, 0x02, 0x57, - 0xe9, 0x0a, 0x3a, 0x4c, 0x23, 0x43, 0xe3, 0xce, 0x90, 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, - 0x98, 0x28, 0x96, 0x5d, 0x06, 0xda, 0xf2, 0x9a, 0x63, 0xa5, 0x58, 0x40, 0xd1, 0x9b, 0x30, 0x18, - 0x90, 0x06, 0x53, 0x14, 0x8f, 0xf5, 0xbe, 0xc8, 0xb9, 0xde, 0x99, 0xd7, 0xc3, 0x92, 0x00, 0xba, - 0x0a, 0x28, 0x20, 0x94, 0xc1, 0x73, 0xbd, 0x0d, 0x65, 0xbe, 0x2f, 0x0e, 0x5a, 0xc5, 0x48, 0xe3, - 0x18, 0x43, 0xfa, 0xc1, 0xe2, 0x8c, 0x6a, 0xe8, 0x32, 0x4c, 0xa9, 0xd2, 0xb2, 0x17, 0x46, 0x0e, - 0x3d, 0xe0, 0xb8, 0xb8, 0x5e, 0xc9, 0x57, 0x70, 0x12, 0x01, 0xa7, 0xeb, 0xd8, 0xbf, 0x61, 0x01, - 0x1f, 0xe7, 0x43, 0x90, 0x2a, 0xbc, 0x6e, 0x4a, 0x15, 0x4e, 0xe6, 0xce, 0x5c, 0x8e, 0x44, 0xe1, - 0x37, 0x2c, 0x18, 0xd1, 0x66, 0x36, 0x5e, 0xb3, 0x56, 0x87, 0x35, 0xdb, 0x86, 0x49, 0xba, 0xd2, - 0xaf, 0xdf, 0x0e, 0x49, 0xb0, 0x4d, 0xea, 0x6c, 0x61, 0x16, 0xee, 0x6f, 0x61, 0x2a, 0x53, 0xe1, - 0x6b, 0x09, 0x82, 0x38, 0xd5, 0x84, 0xfd, 0x19, 0xd9, 0x55, 0x65, 0x59, 0x5d, 0x53, 0x73, 0x9e, - 0xb0, 0xac, 0x56, 0xb3, 0x8a, 0x63, 0x1c, 0xba, 0xd5, 0x36, 0xfd, 0x30, 0x4a, 0x5a, 0x56, 0x5f, - 0xf1, 0xc3, 0x08, 0x33, 0x88, 0xfd, 0x02, 0xc0, 0xd2, 0x5d, 0x52, 0xe3, 0x2b, 0x56, 0x7f, 0xf4, - 0x58, 0xf9, 0x8f, 0x1e, 0xfb, 0x6f, 0x2c, 0x18, 0x5f, 0x5e, 0x30, 0x6e, 0xae, 0x59, 0x00, 0xfe, - 0x52, 0xbb, 0x75, 0x6b, 0x55, 0x9a, 0xf7, 0x70, 0x0b, 0x07, 0x55, 0x8a, 0x35, 0x0c, 0x74, 0x12, - 0x8a, 0x8d, 0xb6, 0x27, 0xc4, 0x9e, 0x83, 0xf4, 0x7a, 0xbc, 0xd6, 0xf6, 0x30, 0x2d, 0xd3, 0x7c, - 0xe0, 0x8a, 0x3d, 0xfb, 0xc0, 0x75, 0x0d, 0xc5, 0x83, 0x4a, 0xd0, 0x7f, 0xe7, 0x8e, 0x5b, 0xe7, - 0x11, 0x06, 0x84, 0xe9, 0xd1, 0xad, 0x5b, 0xe5, 0xc5, 0x10, 0xf3, 0x72, 0xfb, 0xcb, 0x45, 0x98, - 0x59, 0x6e, 0x90, 0xbb, 0xef, 0x31, 0xca, 0x42, 0xaf, 0x1e, 0x7c, 0x07, 0x13, 0x20, 0x1d, 0xd4, - 0x4b, 0xb3, 0xfb, 0x78, 0xac, 0xc3, 0x20, 0x37, 0x2c, 0x96, 0x31, 0x17, 0x32, 0xd5, 0xb9, 0xf9, - 0x03, 0x32, 0xcb, 0x0d, 0x94, 0x85, 0x3a, 0x57, 0x5d, 0x98, 0xa2, 0x14, 0x4b, 0xe2, 0x33, 0xaf, - 0xc0, 0xa8, 0x8e, 0x79, 0x20, 0x7f, 0xe9, 0x1f, 0x2e, 0xc2, 0x24, 0xed, 0xc1, 0x43, 0x9d, 0x88, - 0x1b, 0xe9, 0x89, 0x78, 0xd0, 0x3e, 0xb3, 0xdd, 0x67, 0xe3, 0x9d, 0xe4, 0x6c, 0x5c, 0xcc, 0x9b, - 0x8d, 0xc3, 0x9e, 0x83, 0x1f, 0xb1, 0xe0, 0xc8, 0x72, 0xc3, 0xaf, 0x6d, 0x25, 0xfc, 0x5a, 0x5f, - 0x82, 0x11, 0x7a, 0x1c, 0x87, 0x46, 0x88, 0x17, 0x23, 0xe8, 0x8f, 0x00, 0x61, 0x1d, 0x4f, 0xab, - 0x76, 0xe3, 0x46, 0x79, 0x31, 0x2b, 0x56, 0x90, 0x00, 0x61, 0x1d, 0xcf, 0xfe, 0x4b, 0x0b, 0x4e, - 0x5f, 0x5e, 0x58, 0x8a, 0x97, 0x62, 0x2a, 0x5c, 0xd1, 0x39, 0x18, 0x68, 0xd5, 0xb5, 0xae, 0xc4, - 0x62, 0xe1, 0x45, 0xd6, 0x0b, 0x01, 0x7d, 0xbf, 0x44, 0x06, 0xbb, 0x01, 0x70, 0x19, 0x57, 0x16, - 0xc4, 0xb9, 0x2b, 0xb5, 0x40, 0x56, 0xae, 0x16, 0xe8, 0x09, 0x18, 0xa4, 0xf7, 0x82, 0x5b, 0x93, - 0xfd, 0xe6, 0x06, 0x1b, 0xbc, 0x08, 0x4b, 0x98, 0xfd, 0xeb, 0x16, 0x1c, 0xb9, 0xec, 0x46, 0xf4, - 0xd2, 0x4e, 0xc6, 0xe3, 0xa1, 0xb7, 0x76, 0xe8, 0x46, 0x7e, 0xb0, 0x93, 0x8c, 0xc7, 0x83, 0x15, - 0x04, 0x6b, 0x58, 0xfc, 0x83, 0xb6, 0x5d, 0xe6, 0x29, 0x53, 0x30, 0xf5, 0x6e, 0x58, 0x94, 0x63, - 0x85, 0x41, 0xc7, 0xab, 0xee, 0x06, 0x4c, 0x64, 0xb9, 0x23, 0x0e, 0x6e, 0x35, 0x5e, 0x8b, 0x12, - 0x80, 0x63, 0x1c, 0xfb, 0x9f, 0x2c, 0x28, 0x5d, 0xe6, 0xfe, 0xbe, 0xeb, 0x61, 0xce, 0xa1, 0xfb, - 0x02, 0x0c, 0x13, 0xa9, 0x20, 0x10, 0xbd, 0x56, 0x8c, 0xa8, 0xd2, 0x1c, 0xf0, 0xb0, 0x40, 0x0a, - 0xaf, 0x07, 0xe7, 0xfb, 0x83, 0x79, 0x4f, 0x2f, 0x03, 0x22, 0x7a, 0x5b, 0x7a, 0x9c, 0x24, 0x16, - 0x70, 0x65, 0x29, 0x05, 0xc5, 0x19, 0x35, 0xec, 0x9f, 0xb7, 0xe0, 0x98, 0xfa, 0xe0, 0xf7, 0xdd, - 0x67, 0xda, 0xbf, 0x53, 0x80, 0xb1, 0x2b, 0x6b, 0x6b, 0x95, 0xcb, 0x24, 0xd2, 0x56, 0x65, 0x67, - 0xb5, 0x3f, 0xd6, 0xb4, 0x97, 0x9d, 0xde, 0x88, 0xed, 0xc8, 0x6d, 0xcc, 0xf2, 0xe8, 0x7f, 0xb3, - 0x65, 0x2f, 0xba, 0x1e, 0x54, 0xa3, 0xc0, 0xf5, 0x36, 0x32, 0x57, 0xba, 0xe4, 0x59, 0x8a, 0x79, - 0x3c, 0x0b, 0x7a, 0x01, 0x06, 0x58, 0xf8, 0x41, 0x39, 0x09, 0x8f, 0xa8, 0x27, 0x16, 0x2b, 0xdd, - 0xdf, 0x2d, 0x0d, 0xdf, 0xc0, 0x65, 0xfe, 0x07, 0x0b, 0x54, 0x74, 0x03, 0x46, 0x36, 0xa3, 0xa8, - 0x75, 0x85, 0x38, 0x75, 0x12, 0xc8, 0x53, 0xf6, 0x4c, 0xd6, 0x29, 0x4b, 0x07, 0x81, 0xa3, 0xc5, - 0x07, 0x53, 0x5c, 0x16, 0x62, 0x9d, 0x8e, 0x5d, 0x05, 0x88, 0x61, 0x0f, 0x48, 0x71, 0x63, 0xaf, - 0xc1, 0x30, 0xfd, 0xdc, 0xb9, 0x86, 0xeb, 0x74, 0x56, 0x8d, 0x3f, 0x03, 0xc3, 0x52, 0xf1, 0x1d, - 0x8a, 0xe0, 0x20, 0xec, 0x46, 0x92, 0x7a, 0xf1, 0x10, 0xc7, 0x70, 0xfb, 0x71, 0x10, 0xb6, 0xc3, - 0x9d, 0x48, 0xda, 0xeb, 0x70, 0x94, 0x19, 0x41, 0x3b, 0xd1, 0xa6, 0xb1, 0x46, 0xbb, 0x2f, 0x86, - 0x67, 0xc5, 0xbb, 0xae, 0xa0, 0xec, 0x7d, 0xa4, 0xf3, 0xf9, 0xa8, 0xa4, 0x18, 0xbf, 0xf1, 0xec, - 0x7f, 0xec, 0x83, 0x47, 0xca, 0xd5, 0xfc, 0xa8, 0x56, 0x97, 0x60, 0x94, 0xb3, 0x8b, 0x74, 0x69, - 0x38, 0x0d, 0xd1, 0xae, 0x92, 0x80, 0xae, 0x69, 0x30, 0x6c, 0x60, 0xa2, 0xd3, 0x50, 0x74, 0xdf, - 0xf5, 0x92, 0xae, 0x99, 0xe5, 0xb7, 0x56, 0x31, 0x2d, 0xa7, 0x60, 0xca, 0x79, 0xf2, 0x23, 0x5d, - 0x81, 0x15, 0xf7, 0xf9, 0x3a, 0x8c, 0xbb, 0x61, 0x2d, 0x74, 0xcb, 0x1e, 0xdd, 0xa7, 0xda, 0x4e, - 0x57, 0x32, 0x07, 0xda, 0x69, 0x05, 0xc5, 0x09, 0x6c, 0xed, 0x7e, 0xe9, 0xef, 0x99, 0x7b, 0xed, - 0x1a, 0x53, 0x83, 0x1e, 0xff, 0x2d, 0xf6, 0x75, 0x21, 0x13, 0xc1, 0x8b, 0xe3, 0x9f, 0x7f, 0x70, - 0x88, 0x25, 0x8c, 0x3e, 0xe8, 0x6a, 0x9b, 0x4e, 0x6b, 0xae, 0x1d, 0x6d, 0x2e, 0xba, 0x61, 0xcd, - 0xdf, 0x26, 0xc1, 0x0e, 0x7b, 0x8b, 0x0f, 0xc5, 0x0f, 0x3a, 0x05, 0x58, 0xb8, 0x32, 0x57, 0xa1, - 0x98, 0x38, 0x5d, 0x07, 0xcd, 0xc1, 0x84, 0x2c, 0xac, 0x92, 0x90, 0x5d, 0x01, 0x23, 0x8c, 0x8c, - 0x72, 0x96, 0x14, 0xc5, 0x8a, 0x48, 0x12, 0xdf, 0x64, 0x70, 0xe1, 0x41, 0x30, 0xb8, 0x2f, 0xc3, - 0x98, 0xeb, 0xb9, 0x91, 0xeb, 0x44, 0x3e, 0xd7, 0x1f, 0xf1, 0x67, 0x37, 0x13, 0x30, 0x97, 0x75, - 0x00, 0x36, 0xf1, 0xec, 0xff, 0xb3, 0x0f, 0xa6, 0xd8, 0xb4, 0x7d, 0xb0, 0xc2, 0xbe, 0x97, 0x56, - 0xd8, 0x8d, 0xf4, 0x0a, 0x7b, 0x10, 0x9c, 0xfb, 0x7d, 0x2f, 0xb3, 0x2f, 0x58, 0x30, 0xc5, 0x64, - 0xdc, 0xc6, 0x32, 0xbb, 0x00, 0xc3, 0x81, 0xe1, 0xc7, 0x3a, 0xac, 0x2b, 0xb5, 0xa4, 0x4b, 0x6a, - 0x8c, 0x83, 0xde, 0x00, 0x68, 0xc5, 0x32, 0xf4, 0x82, 0x11, 0x7c, 0x14, 0x72, 0xc5, 0xe7, 0x5a, - 0x1d, 0xfb, 0xb3, 0x30, 0xac, 0x1c, 0x55, 0xa5, 0xa7, 0xba, 0x95, 0xe3, 0xa9, 0xde, 0x9d, 0x8d, - 0x90, 0xb6, 0x71, 0xc5, 0x4c, 0xdb, 0xb8, 0xff, 0xcb, 0x82, 0x58, 0xc3, 0x81, 0xde, 0x82, 0xe1, - 0x96, 0xcf, 0x4c, 0xa9, 0x03, 0xe9, 0x9f, 0xf0, 0x78, 0x47, 0x15, 0x09, 0x8f, 0x30, 0x18, 0xf0, - 0xe9, 0xa8, 0xc8, 0xaa, 0x38, 0xa6, 0x82, 0xae, 0xc2, 0x60, 0x2b, 0x20, 0xd5, 0x88, 0x85, 0xbf, - 0xea, 0x9d, 0x20, 0x5f, 0xbe, 0xbc, 0x22, 0x96, 0x14, 0x12, 0x96, 0xa9, 0xc5, 0xde, 0x2d, 0x53, - 0xed, 0xdf, 0x2a, 0xc0, 0x64, 0xb2, 0x11, 0xf4, 0x1a, 0xf4, 0x91, 0xbb, 0xa4, 0x26, 0xbe, 0x34, - 0x93, 0x9b, 0x88, 0xa5, 0x2b, 0x7c, 0xe8, 0xe8, 0x7f, 0xcc, 0x6a, 0xa1, 0x2b, 0x30, 0x48, 0x59, - 0x89, 0xcb, 0x2a, 0x48, 0xe4, 0xa3, 0x79, 0xec, 0x88, 0xe2, 0xc9, 0xf8, 0x67, 0x89, 0x22, 0x2c, - 0xab, 0x33, 0x53, 0xb6, 0x5a, 0xab, 0x4a, 0x5f, 0x69, 0x51, 0x27, 0x61, 0xc2, 0xda, 0x42, 0x85, - 0x23, 0x09, 0x6a, 0xdc, 0x94, 0x4d, 0x16, 0xe2, 0x98, 0x08, 0x7a, 0x03, 0xfa, 0xc3, 0x06, 0x21, - 0x2d, 0x61, 0xab, 0x90, 0x29, 0x1f, 0xad, 0x52, 0x04, 0x41, 0x89, 0xc9, 0x53, 0x58, 0x01, 0xe6, - 0x15, 0xed, 0xdf, 0xb5, 0x00, 0xb8, 0xed, 0x9f, 0xe3, 0x6d, 0x90, 0x43, 0x50, 0x29, 0x2c, 0x42, - 0x5f, 0xd8, 0x22, 0xb5, 0x4e, 0x1e, 0x06, 0x71, 0x7f, 0xaa, 0x2d, 0x52, 0x8b, 0x57, 0x3b, 0xfd, - 0x87, 0x59, 0x6d, 0xfb, 0x47, 0x01, 0xc6, 0x63, 0xb4, 0x72, 0x44, 0x9a, 0xe8, 0x39, 0x23, 0xb2, - 0xce, 0xc9, 0x44, 0x64, 0x9d, 0x61, 0x86, 0xad, 0x49, 0xaf, 0x3f, 0x0b, 0xc5, 0xa6, 0x73, 0x57, - 0x88, 0x27, 0x9f, 0xe9, 0xdc, 0x0d, 0x4a, 0x7f, 0x76, 0xc5, 0xb9, 0xcb, 0x5f, 0xf0, 0xcf, 0xc8, - 0xdd, 0xb9, 0xe2, 0xdc, 0xed, 0x6a, 0x05, 0x4f, 0x1b, 0x61, 0x6d, 0xb9, 0x9e, 0x30, 0x6b, 0xeb, - 0xa9, 0x2d, 0xd7, 0x4b, 0xb6, 0xe5, 0x7a, 0x3d, 0xb4, 0xe5, 0x7a, 0xe8, 0x1e, 0x0c, 0x0a, 0xab, - 0x53, 0x11, 0xf2, 0xef, 0x42, 0x0f, 0xed, 0x09, 0xa3, 0x55, 0xde, 0xe6, 0x05, 0x29, 0xa1, 0x10, - 0xa5, 0x5d, 0xdb, 0x95, 0x0d, 0xa2, 0xff, 0xd4, 0x82, 0x71, 0xf1, 0x1b, 0x93, 0x77, 0xdb, 0x24, - 0x8c, 0x04, 0x07, 0xff, 0x91, 0xde, 0xfb, 0x20, 0x2a, 0xf2, 0xae, 0x7c, 0x44, 0x5e, 0xb6, 0x26, - 0xb0, 0x6b, 0x8f, 0x12, 0xbd, 0x40, 0xbf, 0x65, 0xc1, 0xd1, 0xa6, 0x73, 0x97, 0xb7, 0xc8, 0xcb, - 0xb0, 0x13, 0xb9, 0xbe, 0xb0, 0xde, 0x78, 0xad, 0xb7, 0xe9, 0x4f, 0x55, 0xe7, 0x9d, 0x94, 0xaa, - 0xda, 0xa3, 0x59, 0x28, 0x5d, 0xbb, 0x9a, 0xd9, 0xaf, 0x99, 0x75, 0x18, 0x92, 0xeb, 0xed, 0x61, - 0x9a, 0xd4, 0xb3, 0x76, 0xc4, 0x5a, 0x7b, 0xa8, 0xed, 0x7c, 0x16, 0x46, 0xf5, 0x35, 0xf6, 0x50, - 0xdb, 0x7a, 0x17, 0x8e, 0x64, 0xac, 0xa5, 0x87, 0xda, 0xe4, 0x1d, 0x38, 0x99, 0xbb, 0x3e, 0x1e, - 0xaa, 0x4b, 0xc4, 0xef, 0x58, 0xfa, 0x39, 0x78, 0x08, 0x7a, 0x9d, 0x05, 0x53, 0xaf, 0x73, 0xa6, - 0xf3, 0xce, 0xc9, 0x51, 0xee, 0xbc, 0xa3, 0x77, 0x9a, 0x9e, 0xea, 0xe8, 0x4d, 0x18, 0x68, 0xd0, - 0x12, 0x69, 0xbb, 0x6c, 0x77, 0xdf, 0x91, 0x31, 0x47, 0xcd, 0xca, 0x43, 0x2c, 0x28, 0xd8, 0x5f, - 0xb1, 0x20, 0xc3, 0xa9, 0x83, 0x72, 0x58, 0x6d, 0xb7, 0xce, 0x86, 0xa4, 0x18, 0x73, 0x58, 0x2a, - 0xf0, 0xcc, 0x69, 0x28, 0x6e, 0xb8, 0x75, 0xe1, 0xcd, 0xac, 0xc0, 0x97, 0x29, 0x78, 0xc3, 0xad, - 0xa3, 0x65, 0x40, 0x61, 0xbb, 0xd5, 0x6a, 0x30, 0x83, 0x27, 0xa7, 0x71, 0x39, 0xf0, 0xdb, 0x2d, - 0x6e, 0xa8, 0x5c, 0xe4, 0xe2, 0xa5, 0x6a, 0x0a, 0x8a, 0x33, 0x6a, 0xd8, 0x7f, 0x60, 0x41, 0xdf, - 0x21, 0x4c, 0x13, 0x36, 0xa7, 0xe9, 0xb9, 0x5c, 0xd2, 0x22, 0x53, 0xc4, 0x2c, 0x76, 0xee, 0x2c, - 0xdd, 0x8d, 0x88, 0x17, 0x32, 0x86, 0x23, 0x73, 0xd6, 0x76, 0x2d, 0x38, 0x72, 0xcd, 0x77, 0xea, - 0xf3, 0x4e, 0xc3, 0xf1, 0x6a, 0x24, 0x28, 0x7b, 0x1b, 0x07, 0xf2, 0x0a, 0x28, 0x74, 0xf5, 0x0a, - 0xb8, 0x04, 0x03, 0x6e, 0x4b, 0x0b, 0x35, 0x7f, 0x96, 0xce, 0x6e, 0xb9, 0x22, 0xa2, 0xcc, 0x23, - 0xa3, 0x71, 0x56, 0x8a, 0x05, 0x3e, 0x5d, 0x96, 0xdc, 0x1c, 0xaf, 0x2f, 0x7f, 0x59, 0xd2, 0x57, - 0x52, 0x32, 0x84, 0x9a, 0x61, 0x38, 0xbe, 0x09, 0x46, 0x13, 0xc2, 0x4d, 0x0a, 0xc3, 0xa0, 0xcb, - 0xbf, 0x54, 0xac, 0xcd, 0x27, 0xb3, 0x5f, 0x2f, 0xa9, 0x81, 0xd1, 0xfc, 0x01, 0x79, 0x01, 0x96, - 0x84, 0xec, 0x4b, 0x90, 0x19, 0xf2, 0xa6, 0xbb, 0x64, 0xca, 0xfe, 0x04, 0x4c, 0xb1, 0x9a, 0x07, - 0x94, 0xfa, 0xd8, 0x09, 0x79, 0x7a, 0x46, 0xd4, 0x60, 0xfb, 0x7f, 0xb5, 0x00, 0xad, 0xf8, 0x75, - 0x77, 0x7d, 0x47, 0x10, 0xe7, 0xdf, 0xff, 0x2e, 0x94, 0xf8, 0xb3, 0x3a, 0x19, 0x59, 0x77, 0xa1, - 0xe1, 0x84, 0xa1, 0x26, 0xcb, 0x7f, 0x52, 0xb4, 0x5b, 0x5a, 0xeb, 0x8c, 0x8e, 0xbb, 0xd1, 0x43, - 0x6f, 0x25, 0x02, 0x1d, 0x7e, 0x34, 0x15, 0xe8, 0xf0, 0xc9, 0x4c, 0x8b, 0x9a, 0x74, 0xef, 0x65, - 0x00, 0x44, 0xfb, 0x8b, 0x16, 0x4c, 0xac, 0x26, 0x22, 0xc5, 0x9e, 0x63, 0xe6, 0x05, 0x19, 0x3a, - 0xaa, 0x2a, 0x2b, 0xc5, 0x02, 0xfa, 0xc0, 0x65, 0xb8, 0xdf, 0xb6, 0x20, 0x0e, 0xb1, 0x75, 0x08, - 0x2c, 0xf7, 0x82, 0xc1, 0x72, 0x67, 0x3e, 0x5f, 0x54, 0x77, 0xf2, 0x38, 0x6e, 0x74, 0x55, 0xcd, - 0x49, 0x87, 0x97, 0x4b, 0x4c, 0x86, 0xef, 0xb3, 0x71, 0x73, 0xe2, 0xd4, 0x6c, 0x7c, 0xa3, 0x00, - 0x48, 0xe1, 0xf6, 0x1c, 0x1c, 0x33, 0x5d, 0xe3, 0xc1, 0x04, 0xc7, 0xdc, 0x06, 0xc4, 0x0c, 0x64, - 0x02, 0xc7, 0x0b, 0x39, 0x59, 0x57, 0x48, 0xad, 0x0f, 0x66, 0x7d, 0x33, 0x23, 0xbd, 0x65, 0xaf, - 0xa5, 0xa8, 0xe1, 0x8c, 0x16, 0x34, 0xc3, 0xa7, 0xfe, 0x5e, 0x0d, 0x9f, 0x06, 0xba, 0xb8, 0x7d, - 0x7f, 0xcd, 0x82, 0x31, 0x35, 0x4c, 0xef, 0x13, 0xe7, 0x11, 0xd5, 0x9f, 0x9c, 0x7b, 0xa5, 0xa2, - 0x75, 0x99, 0x31, 0x03, 0xdf, 0xc7, 0xdc, 0xf7, 0x9d, 0x86, 0x7b, 0x8f, 0xa8, 0x18, 0xce, 0x25, - 0xe1, 0x8e, 0x2f, 0x4a, 0xf7, 0x77, 0x4b, 0x63, 0xea, 0x1f, 0x8f, 0x1a, 0x1b, 0x57, 0xb1, 0x7f, - 0x99, 0x6e, 0x76, 0x73, 0x29, 0xa2, 0x97, 0xa0, 0xbf, 0xb5, 0xe9, 0x84, 0x24, 0xe1, 0x64, 0xd7, - 0x5f, 0xa1, 0x85, 0xfb, 0xbb, 0xa5, 0x71, 0x55, 0x81, 0x95, 0x60, 0x8e, 0xdd, 0x7b, 0xc8, 0xd1, - 0xf4, 0xe2, 0xec, 0x1a, 0x72, 0xf4, 0x5f, 0x2c, 0xe8, 0x5b, 0xa5, 0xb7, 0xd7, 0xc3, 0x3f, 0x02, - 0x5e, 0x37, 0x8e, 0x80, 0x53, 0x79, 0xd9, 0x8c, 0x72, 0x77, 0xff, 0x72, 0x62, 0xf7, 0x9f, 0xc9, - 0xa5, 0xd0, 0x79, 0xe3, 0x37, 0x61, 0x84, 0xe5, 0x48, 0x12, 0x0e, 0x85, 0x2f, 0x18, 0x1b, 0xbe, - 0x94, 0xd8, 0xf0, 0x13, 0x1a, 0xaa, 0xb6, 0xd3, 0x9f, 0x82, 0x41, 0xe1, 0xa1, 0x96, 0x8c, 0x82, - 0x20, 0x70, 0xb1, 0x84, 0xdb, 0xbf, 0x50, 0x04, 0x23, 0x27, 0x13, 0xfa, 0x23, 0x0b, 0x66, 0x03, - 0x6e, 0xb9, 0x5e, 0x5f, 0x6c, 0x07, 0xae, 0xb7, 0x51, 0xad, 0x6d, 0x92, 0x7a, 0xbb, 0xe1, 0x7a, - 0x1b, 0xe5, 0x0d, 0xcf, 0x57, 0xc5, 0x4b, 0x77, 0x49, 0xad, 0xcd, 0xb4, 0xca, 0x5d, 0x12, 0x40, - 0x29, 0x0f, 0x90, 0xe7, 0xf7, 0x76, 0x4b, 0xb3, 0xf8, 0x40, 0xb4, 0xf1, 0x01, 0xfb, 0x82, 0xfe, - 0xd2, 0x82, 0x0b, 0x3c, 0x37, 0x50, 0xef, 0xfd, 0xef, 0x20, 0xe1, 0xa8, 0x48, 0x52, 0x31, 0x91, - 0x35, 0x12, 0x34, 0xe7, 0x5f, 0x16, 0x03, 0x7a, 0xa1, 0x72, 0xb0, 0xb6, 0xf0, 0x41, 0x3b, 0x67, - 0xff, 0xb7, 0x45, 0x18, 0x13, 0xa1, 0x29, 0xc5, 0x1d, 0xf0, 0x92, 0xb1, 0x24, 0x1e, 0x4d, 0x2c, - 0x89, 0x29, 0x03, 0xf9, 0xc1, 0x1c, 0xff, 0x21, 0x4c, 0xd1, 0xc3, 0xf9, 0x0a, 0x71, 0x82, 0xe8, - 0x36, 0x71, 0xb8, 0x3d, 0x63, 0xf1, 0xc0, 0xa7, 0xbf, 0x12, 0xac, 0x5f, 0x4b, 0x12, 0xc3, 0x69, - 0xfa, 0xdf, 0x4b, 0x77, 0x8e, 0x07, 0x93, 0xa9, 0xe8, 0xa2, 0x6f, 0xc3, 0xb0, 0x72, 0xaf, 0x12, - 0x87, 0x4e, 0xe7, 0x20, 0xbd, 0x49, 0x0a, 0x5c, 0xe8, 0x19, 0xbb, 0xf6, 0xc5, 0xe4, 0xec, 0xdf, - 0x2e, 0x18, 0x0d, 0xf2, 0x49, 0x5c, 0x85, 0x21, 0x27, 0x64, 0x81, 0xc3, 0xeb, 0x9d, 0x24, 0xda, - 0xa9, 0x66, 0x98, 0x8b, 0xdb, 0x9c, 0xa8, 0x89, 0x15, 0x0d, 0x74, 0x85, 0x5b, 0x8d, 0x6e, 0x93, - 0x4e, 0xe2, 0xec, 0x14, 0x35, 0x90, 0x76, 0xa5, 0xdb, 0x04, 0x8b, 0xfa, 0xe8, 0x53, 0xdc, 0xac, - 0xf7, 0xaa, 0xe7, 0xdf, 0xf1, 0x2e, 0xfb, 0xbe, 0x0c, 0x43, 0xd4, 0x1b, 0xc1, 0x29, 0x69, 0xcc, - 0xab, 0xaa, 0x63, 0x93, 0x5a, 0x6f, 0xe1, 0xba, 0x3f, 0x07, 0x2c, 0x17, 0x8a, 0x19, 0xcd, 0x20, - 0x44, 0x04, 0x26, 0x44, 0xdc, 0x53, 0x59, 0x26, 0xc6, 0x2e, 0xf3, 0xf9, 0x6d, 0xd6, 0x8e, 0x35, - 0x40, 0x57, 0x4d, 0x12, 0x38, 0x49, 0xd3, 0xde, 0xe4, 0x87, 0xf0, 0x32, 0x71, 0xa2, 0x76, 0x40, - 0x42, 0xf4, 0x71, 0x98, 0x4e, 0xbf, 0x8c, 0x85, 0x22, 0xc5, 0x62, 0xdc, 0xf3, 0xa9, 0xbd, 0xdd, - 0xd2, 0x74, 0x35, 0x07, 0x07, 0xe7, 0xd6, 0xb6, 0x7f, 0xcd, 0x02, 0xe6, 0x43, 0x7e, 0x08, 0x9c, - 0xcf, 0xc7, 0x4c, 0xce, 0x67, 0x3a, 0x6f, 0x3a, 0x73, 0x98, 0x9e, 0x17, 0xf9, 0x1a, 0xae, 0x04, - 0xfe, 0xdd, 0x1d, 0x61, 0xf5, 0xd5, 0xfd, 0x19, 0x67, 0x7f, 0xd9, 0x02, 0x96, 0x38, 0x08, 0xf3, - 0x57, 0xbb, 0x54, 0x70, 0x74, 0x37, 0x68, 0xf8, 0x38, 0x0c, 0xad, 0x8b, 0xe1, 0xcf, 0x10, 0x3a, - 0x19, 0x1d, 0x36, 0x69, 0xcb, 0x49, 0x13, 0xbe, 0xa0, 0xe2, 0x1f, 0x56, 0xd4, 0xec, 0xff, 0xd2, - 0x82, 0x99, 0xfc, 0x6a, 0xe8, 0x06, 0x9c, 0x08, 0x48, 0xad, 0x1d, 0x84, 0x74, 0x4b, 0x88, 0x07, - 0x90, 0x70, 0xa7, 0xe2, 0x53, 0xfd, 0xc8, 0xde, 0x6e, 0xe9, 0x04, 0xce, 0x46, 0xc1, 0x79, 0x75, - 0xd1, 0x2b, 0x30, 0xde, 0x0e, 0x39, 0xe7, 0xc7, 0x98, 0xae, 0x50, 0x44, 0xa7, 0x66, 0x1e, 0x47, - 0x37, 0x0c, 0x08, 0x4e, 0x60, 0xda, 0x3f, 0xc0, 0x97, 0xa3, 0x0a, 0x50, 0xdd, 0x84, 0x29, 0x4f, - 0xfb, 0x4f, 0x6f, 0x40, 0xf9, 0xd4, 0x7f, 0xbc, 0xdb, 0xad, 0xcf, 0xae, 0x4b, 0xcd, 0xcb, 0x3d, - 0x41, 0x06, 0xa7, 0x29, 0xdb, 0xbf, 0x68, 0xc1, 0x09, 0x1d, 0x51, 0x73, 0xa4, 0xeb, 0xa6, 0x05, - 0x5c, 0x84, 0x21, 0xbf, 0x45, 0x02, 0x27, 0xf2, 0x03, 0x71, 0xcd, 0x9d, 0x97, 0x2b, 0xf4, 0xba, - 0x28, 0xdf, 0x17, 0x09, 0x73, 0x24, 0x75, 0x59, 0x8e, 0x55, 0x4d, 0x64, 0xc3, 0x00, 0x13, 0x20, - 0x86, 0xc2, 0x65, 0x92, 0x1d, 0x5a, 0xcc, 0xb2, 0x25, 0xc4, 0x02, 0x62, 0xff, 0xa3, 0xc5, 0xd7, - 0xa7, 0xde, 0x75, 0xf4, 0x2e, 0x4c, 0x36, 0x9d, 0xa8, 0xb6, 0xb9, 0x74, 0xb7, 0x15, 0x70, 0xe5, - 0xae, 0x1c, 0xa7, 0x67, 0xba, 0x8d, 0x93, 0xf6, 0x91, 0xb1, 0x69, 0xf5, 0x4a, 0x82, 0x18, 0x4e, - 0x91, 0x47, 0xb7, 0x61, 0x84, 0x95, 0x31, 0x6f, 0xe0, 0xb0, 0x13, 0x2f, 0x93, 0xd7, 0x9a, 0x32, - 0x0e, 0x5a, 0x89, 0xe9, 0x60, 0x9d, 0xa8, 0xfd, 0xd5, 0x22, 0x3f, 0x34, 0xd8, 0xdb, 0xe3, 0x29, - 0x18, 0x6c, 0xf9, 0xf5, 0x85, 0xf2, 0x22, 0x16, 0xb3, 0xa0, 0xee, 0xbd, 0x0a, 0x2f, 0xc6, 0x12, - 0x8e, 0xce, 0xc3, 0x90, 0xf8, 0x29, 0x95, 0xf1, 0x6c, 0x8f, 0x08, 0xbc, 0x10, 0x2b, 0x28, 0x7a, - 0x1e, 0xa0, 0x15, 0xf8, 0xdb, 0x6e, 0x9d, 0x45, 0x7f, 0x2a, 0x9a, 0x76, 0x7d, 0x15, 0x05, 0xc1, - 0x1a, 0x16, 0x7a, 0x15, 0xc6, 0xda, 0x5e, 0xc8, 0xf9, 0x27, 0x2d, 0xc6, 0xbe, 0xb2, 0x38, 0xbb, - 0xa1, 0x03, 0xb1, 0x89, 0x8b, 0xe6, 0x60, 0x20, 0x72, 0x98, 0x9d, 0x5a, 0x7f, 0xbe, 0xf9, 0xfd, - 0x1a, 0xc5, 0xd0, 0xb3, 0xd9, 0xd1, 0x0a, 0x58, 0x54, 0x44, 0x6f, 0x4b, 0xc7, 0x7c, 0x7e, 0x13, - 0x09, 0xbf, 0x97, 0xde, 0x6e, 0x2d, 0xcd, 0x2d, 0x5f, 0xf8, 0xd3, 0x18, 0xb4, 0xd0, 0x2b, 0x00, - 0xe4, 0x6e, 0x44, 0x02, 0xcf, 0x69, 0x28, 0xeb, 0x52, 0xc5, 0xc8, 0x2c, 0xfa, 0xab, 0x7e, 0x74, - 0x23, 0x24, 0x4b, 0x0a, 0x03, 0x6b, 0xd8, 0xf6, 0x8f, 0x8e, 0x00, 0xc4, 0x0f, 0x0d, 0x74, 0x0f, - 0x86, 0x6a, 0x4e, 0xcb, 0xa9, 0xf1, 0x54, 0xad, 0xc5, 0x3c, 0x7f, 0xe9, 0xb8, 0xc6, 0xec, 0x82, - 0x40, 0xe7, 0xca, 0x1b, 0x19, 0xa6, 0x7c, 0x48, 0x16, 0x77, 0x55, 0xd8, 0xa8, 0xf6, 0xd0, 0x17, - 0x2c, 0x18, 0x11, 0xd1, 0x95, 0xd8, 0x0c, 0x15, 0xf2, 0xf5, 0x6d, 0x5a, 0xfb, 0x73, 0x71, 0x0d, - 0xde, 0x85, 0x17, 0xe4, 0x0a, 0xd5, 0x20, 0x5d, 0x7b, 0xa1, 0x37, 0x8c, 0x3e, 0x2c, 0xdf, 0xb6, - 0x45, 0x63, 0x28, 0xd5, 0xdb, 0x76, 0x98, 0x5d, 0x35, 0xfa, 0xb3, 0xf6, 0x86, 0xf1, 0xac, 0xed, - 0xcb, 0xf7, 0x3c, 0x36, 0xf8, 0xed, 0x6e, 0x2f, 0x5a, 0x54, 0xd1, 0xa3, 0x90, 0xf4, 0xe7, 0xbb, - 0xcb, 0x6a, 0x0f, 0xbb, 0x2e, 0x11, 0x48, 0x3e, 0x0b, 0x13, 0x75, 0x93, 0x6b, 0x11, 0x2b, 0xf1, - 0xc9, 0x3c, 0xba, 0x09, 0x26, 0x27, 0xe6, 0x53, 0x12, 0x00, 0x9c, 0x24, 0x8c, 0x2a, 0x3c, 0x28, - 0x4d, 0xd9, 0x5b, 0xf7, 0x85, 0xef, 0x95, 0x9d, 0x3b, 0x97, 0x3b, 0x61, 0x44, 0x9a, 0x14, 0x33, - 0x66, 0x12, 0x56, 0x45, 0x5d, 0xac, 0xa8, 0xa0, 0x37, 0x61, 0x80, 0xf9, 0x4b, 0x86, 0xd3, 0x43, - 0xf9, 0x6a, 0x0d, 0x33, 0xfa, 0x6a, 0xbc, 0x21, 0xd9, 0xdf, 0x10, 0x0b, 0x0a, 0xe8, 0x8a, 0xf4, - 0x46, 0x0e, 0xcb, 0xde, 0x8d, 0x90, 0x30, 0x6f, 0xe4, 0xe1, 0xf9, 0xc7, 0x63, 0x47, 0x63, 0x5e, - 0x9e, 0x99, 0xf3, 0xd6, 0xa8, 0x49, 0xd9, 0x3e, 0xf1, 0x5f, 0xa6, 0xd2, 0x15, 0xb1, 0xe2, 0x32, - 0xbb, 0x67, 0xa6, 0xdb, 0x8d, 0x87, 0xf3, 0xa6, 0x49, 0x02, 0x27, 0x69, 0x52, 0x16, 0x9a, 0xef, - 0x7a, 0xe1, 0xbd, 0xd5, 0xed, 0xec, 0xe0, 0x92, 0x03, 0x76, 0x1b, 0xf1, 0x12, 0x2c, 0xea, 0x23, - 0x17, 0x26, 0x02, 0x83, 0xbd, 0x90, 0x21, 0xde, 0xce, 0xf5, 0xc6, 0xc4, 0x68, 0xc9, 0x03, 0x4c, - 0x32, 0x38, 0x49, 0x17, 0xbd, 0xa9, 0x31, 0x4a, 0x63, 0x9d, 0x5f, 0xfe, 0xdd, 0x58, 0xa3, 0x99, - 0x2d, 0x18, 0x33, 0x0e, 0x9b, 0x87, 0xaa, 0x82, 0xf4, 0x60, 0x32, 0x79, 0xb2, 0x3c, 0x54, 0xcd, - 0xe3, 0x2b, 0x30, 0xce, 0x36, 0xc2, 0x1d, 0xa7, 0x25, 0x8e, 0xe2, 0xf3, 0xc6, 0x51, 0x6c, 0x9d, - 0x2f, 0xf2, 0x81, 0x91, 0x43, 0x10, 0x1f, 0x9c, 0xf6, 0xaf, 0xf4, 0x8b, 0xca, 0x6a, 0x17, 0xa1, - 0x0b, 0x30, 0x2c, 0x3a, 0xa0, 0x32, 0x70, 0xa9, 0x83, 0x61, 0x45, 0x02, 0x70, 0x8c, 0xc3, 0x12, - 0xaf, 0xb1, 0xea, 0x9a, 0x87, 0x42, 0x9c, 0x78, 0x4d, 0x41, 0xb0, 0x86, 0x45, 0x1f, 0xbf, 0xb7, - 0x7d, 0x3f, 0x52, 0x77, 0xb0, 0xda, 0x6a, 0xf3, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x7b, 0xb7, 0x48, - 0xe0, 0x91, 0x86, 0x99, 0x82, 0x42, 0xdd, 0xbd, 0x57, 0x75, 0x20, 0x36, 0x71, 0x29, 0x07, 0xe1, - 0x87, 0x6c, 0xef, 0x8a, 0x27, 0x76, 0xec, 0xf1, 0x51, 0xe5, 0xb1, 0x2b, 0x24, 0x1c, 0x7d, 0x02, - 0x4e, 0xa8, 0x70, 0x8f, 0x62, 0x65, 0xca, 0x16, 0x07, 0x0c, 0x89, 0xd8, 0x89, 0x85, 0x6c, 0x34, - 0x9c, 0x57, 0x1f, 0xbd, 0x0e, 0xe3, 0xe2, 0x19, 0x26, 0x29, 0x0e, 0x9a, 0xe6, 0x8b, 0x57, 0x0d, - 0x28, 0x4e, 0x60, 0xcb, 0x24, 0x1a, 0xec, 0x7d, 0x22, 0x29, 0x0c, 0xa5, 0x93, 0x68, 0xe8, 0x70, - 0x9c, 0xaa, 0x81, 0xe6, 0x60, 0x82, 0xb3, 0x9d, 0xae, 0xb7, 0xc1, 0xe7, 0x44, 0xf8, 0x93, 0xaa, - 0x0d, 0x79, 0xdd, 0x04, 0xe3, 0x24, 0x3e, 0xba, 0x04, 0xa3, 0x4e, 0x50, 0xdb, 0x74, 0x23, 0x52, - 0xa3, 0xbb, 0x8a, 0x59, 0x10, 0x6a, 0xf6, 0x9f, 0x73, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x0d, 0xe8, - 0x0b, 0xef, 0x38, 0x2d, 0x71, 0xfa, 0xe4, 0x1f, 0xe5, 0x6a, 0x05, 0x73, 0xd3, 0x2f, 0xfa, 0x1f, - 0xb3, 0x9a, 0xf6, 0x3d, 0x38, 0x92, 0x11, 0x16, 0x87, 0x2e, 0x3d, 0xa7, 0xe5, 0xca, 0x51, 0x49, - 0xb8, 0x69, 0xcc, 0x55, 0xca, 0x72, 0x3c, 0x34, 0x2c, 0xba, 0xbe, 0x59, 0xf8, 0x1c, 0x2d, 0xdd, - 0xb8, 0x5a, 0xdf, 0xcb, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x5f, 0x0b, 0x30, 0x91, 0xa1, 0x1e, 0x64, - 0x29, 0xaf, 0x13, 0xef, 0xbc, 0x38, 0xc3, 0xb5, 0x99, 0xd5, 0xa5, 0x70, 0x80, 0xac, 0x2e, 0xc5, - 0x6e, 0x59, 0x5d, 0xfa, 0xde, 0x4b, 0x56, 0x17, 0x73, 0xc4, 0xfa, 0x7b, 0x1a, 0xb1, 0x8c, 0x4c, - 0x30, 0x03, 0x07, 0xcc, 0x04, 0x63, 0x0c, 0xfa, 0x60, 0x0f, 0x83, 0xfe, 0xd3, 0x05, 0x98, 0x4c, - 0x6a, 0x16, 0x0f, 0x41, 0x3a, 0xff, 0xa6, 0x21, 0x9d, 0x3f, 0xdf, 0x4b, 0x04, 0x81, 0x5c, 0x49, - 0x3d, 0x4e, 0x48, 0xea, 0x9f, 0xee, 0x89, 0x5a, 0x67, 0xa9, 0xfd, 0x2f, 0x15, 0xe0, 0x58, 0xa6, - 0xc2, 0xf5, 0x10, 0xc6, 0xe6, 0xba, 0x31, 0x36, 0xcf, 0xf5, 0x1c, 0x5d, 0x21, 0x77, 0x80, 0x6e, - 0x25, 0x06, 0xe8, 0x42, 0xef, 0x24, 0x3b, 0x8f, 0xd2, 0x37, 0x8b, 0x70, 0x26, 0xb3, 0x5e, 0x2c, - 0xdc, 0x5e, 0x36, 0x84, 0xdb, 0xcf, 0x27, 0x84, 0xdb, 0x76, 0xe7, 0xda, 0x0f, 0x46, 0xda, 0x2d, - 0xa2, 0x0c, 0xb0, 0x58, 0x29, 0xf7, 0x29, 0xe9, 0x36, 0xa2, 0x0c, 0x28, 0x42, 0xd8, 0xa4, 0xfb, - 0xbd, 0x24, 0xe1, 0xfe, 0x1f, 0x2d, 0x38, 0x99, 0x39, 0x37, 0x87, 0x20, 0x67, 0x5c, 0x35, 0xe5, - 0x8c, 0x4f, 0xf5, 0xbc, 0x5a, 0x73, 0x04, 0x8f, 0x5f, 0x1c, 0xc8, 0xf9, 0x16, 0x26, 0xfe, 0xb8, - 0x0e, 0x23, 0x4e, 0xad, 0x46, 0xc2, 0x70, 0xc5, 0xaf, 0xab, 0x04, 0x10, 0xcf, 0xb1, 0xc7, 0x69, - 0x5c, 0xbc, 0xbf, 0x5b, 0x9a, 0x49, 0x92, 0x88, 0xc1, 0x58, 0xa7, 0x80, 0x3e, 0x05, 0x43, 0xa1, - 0xcc, 0xdd, 0xd9, 0x77, 0xff, 0xb9, 0x3b, 0x19, 0x27, 0xa9, 0xc4, 0x3b, 0x8a, 0x24, 0xfa, 0x7e, - 0x3d, 0x6a, 0x55, 0x07, 0xc1, 0x26, 0xef, 0xe4, 0x7d, 0xc4, 0xae, 0x7a, 0x1e, 0x60, 0x5b, 0xbd, - 0xa3, 0x92, 0xa2, 0x1b, 0xed, 0x85, 0xa5, 0x61, 0xa1, 0x37, 0x60, 0x32, 0xe4, 0x01, 0x5b, 0x63, - 0x13, 0x19, 0xbe, 0x16, 0x59, 0xcc, 0xbb, 0x6a, 0x02, 0x86, 0x53, 0xd8, 0x68, 0x59, 0xb6, 0xca, - 0x8c, 0xa1, 0xf8, 0xf2, 0x3c, 0x17, 0xb7, 0x28, 0x0c, 0xa2, 0x8e, 0x26, 0x27, 0x81, 0x0d, 0xbf, - 0x56, 0x13, 0x7d, 0x0a, 0x80, 0x2e, 0x22, 0x21, 0xc2, 0x19, 0xcc, 0x3f, 0x42, 0xe9, 0xd9, 0x52, - 0xcf, 0xf4, 0xc0, 0x60, 0xe1, 0x01, 0x16, 0x15, 0x11, 0xac, 0x11, 0x44, 0x0e, 0x8c, 0xc5, 0xff, - 0xe2, 0xac, 0xf4, 0xe7, 0x73, 0x5b, 0x48, 0x12, 0x67, 0xea, 0x8d, 0x45, 0x9d, 0x04, 0x36, 0x29, - 0xa2, 0x4f, 0xc2, 0xc9, 0xed, 0x5c, 0xbb, 0x23, 0xce, 0x4b, 0xb2, 0x34, 0xf3, 0xf9, 0xd6, 0x46, - 0xf9, 0xf5, 0xed, 0xff, 0x09, 0xe0, 0x91, 0x0e, 0x27, 0x3d, 0x9a, 0x33, 0x6d, 0x06, 0x9e, 0x49, - 0xca, 0x55, 0x66, 0x32, 0x2b, 0x1b, 0x82, 0x96, 0xc4, 0x86, 0x2a, 0xbc, 0xe7, 0x0d, 0xf5, 0x13, - 0x96, 0xf6, 0xcc, 0xe2, 0x16, 0xe5, 0x1f, 0x3b, 0xe0, 0x0d, 0xf6, 0x00, 0x45, 0x60, 0xeb, 0x19, - 0x72, 0xa4, 0xe7, 0x7b, 0xee, 0x4e, 0xef, 0x82, 0xa5, 0xdf, 0xc9, 0x0e, 0x71, 0xcf, 0x45, 0x4c, - 0x97, 0x0f, 0xfa, 0xfd, 0x87, 0x15, 0xee, 0xfe, 0x1b, 0x16, 0x9c, 0x4c, 0x15, 0xf3, 0x3e, 0x90, - 0x50, 0x44, 0xe9, 0x5b, 0x7d, 0xcf, 0x9d, 0x97, 0x04, 0xf9, 0x37, 0x5c, 0x11, 0xdf, 0x70, 0x32, - 0x17, 0x2f, 0xd9, 0xf5, 0x2f, 0xfd, 0x7d, 0xe9, 0x08, 0x6b, 0xc0, 0x44, 0xc4, 0xf9, 0x5d, 0x47, - 0x2d, 0x38, 0x5b, 0x6b, 0x07, 0x41, 0xbc, 0x58, 0x33, 0x36, 0x27, 0x7f, 0x2d, 0x3e, 0xbe, 0xb7, - 0x5b, 0x3a, 0xbb, 0xd0, 0x05, 0x17, 0x77, 0xa5, 0x86, 0x3c, 0x40, 0xcd, 0x94, 0x75, 0x1f, 0x3b, - 0x00, 0x72, 0xa4, 0x40, 0x69, 0x5b, 0x40, 0x6e, 0xa7, 0x9b, 0x61, 0x23, 0x98, 0x41, 0xf9, 0x70, - 0x65, 0x37, 0xdf, 0x99, 0x78, 0xfa, 0x33, 0xd7, 0xe0, 0x4c, 0xe7, 0xc5, 0x74, 0xa0, 0x10, 0x14, - 0x7f, 0x63, 0xc1, 0xe9, 0x8e, 0x71, 0xce, 0xbe, 0x0b, 0x1f, 0x0b, 0xf6, 0xe7, 0x2d, 0x78, 0x34, - 0xb3, 0x46, 0xd2, 0x79, 0xb0, 0x46, 0x0b, 0x35, 0x63, 0xd8, 0x38, 0xe2, 0x8f, 0x04, 0xe0, 0x18, - 0xc7, 0xb0, 0x17, 0x2d, 0x74, 0xb5, 0x17, 0xfd, 0x53, 0x0b, 0x52, 0x57, 0xfd, 0x21, 0x70, 0x9e, - 0x65, 0x93, 0xf3, 0x7c, 0xbc, 0x97, 0xd1, 0xcc, 0x61, 0x3a, 0xff, 0x79, 0x02, 0x8e, 0xe7, 0x78, - 0x90, 0x6f, 0xc3, 0xd4, 0x46, 0x8d, 0x98, 0x21, 0x43, 0x3a, 0x85, 0xd2, 0xeb, 0x18, 0x5f, 0x64, - 0xfe, 0xd8, 0xde, 0x6e, 0x69, 0x2a, 0x85, 0x82, 0xd3, 0x4d, 0xa0, 0xcf, 0x5b, 0x70, 0xd4, 0xb9, - 0x13, 0x2e, 0xd1, 0x17, 0x84, 0x5b, 0x9b, 0x6f, 0xf8, 0xb5, 0x2d, 0xca, 0x98, 0xc9, 0x6d, 0xf5, - 0x62, 0xa6, 0x28, 0xfc, 0x56, 0x35, 0x85, 0x6f, 0x34, 0x3f, 0xbd, 0xb7, 0x5b, 0x3a, 0x9a, 0x85, - 0x85, 0x33, 0xdb, 0x42, 0x58, 0xe4, 0x38, 0x73, 0xa2, 0xcd, 0x4e, 0x41, 0x6d, 0xb2, 0x5c, 0xfd, - 0x39, 0x4b, 0x2c, 0x21, 0x58, 0xd1, 0x41, 0x9f, 0x81, 0xe1, 0x0d, 0x19, 0xbf, 0x22, 0x83, 0xe5, - 0x8e, 0x07, 0xb2, 0x73, 0x54, 0x0f, 0x6e, 0x80, 0xa3, 0x90, 0x70, 0x4c, 0x14, 0xbd, 0x0e, 0x45, - 0x6f, 0x3d, 0x14, 0xa1, 0xf5, 0xb2, 0xed, 0x80, 0x4d, 0x4b, 0x6b, 0x1e, 0x3a, 0x6a, 0x75, 0xb9, - 0x8a, 0x69, 0x45, 0x74, 0x05, 0x8a, 0xc1, 0xed, 0xba, 0xd0, 0xe3, 0x64, 0x6e, 0x52, 0x3c, 0xbf, - 0x98, 0xd3, 0x2b, 0x46, 0x09, 0xcf, 0x2f, 0x62, 0x4a, 0x02, 0x55, 0xa0, 0x9f, 0xb9, 0x5d, 0x0b, - 0xd6, 0x36, 0xf3, 0x29, 0xdf, 0x21, 0x7c, 0x01, 0xf7, 0x87, 0x64, 0x08, 0x98, 0x13, 0x42, 0x6b, - 0x30, 0x50, 0x73, 0xbd, 0x3a, 0x09, 0x04, 0x2f, 0xfb, 0xe1, 0x4c, 0x8d, 0x0d, 0xc3, 0xc8, 0xa1, - 0xc9, 0x15, 0x18, 0x0c, 0x03, 0x0b, 0x5a, 0x8c, 0x2a, 0x69, 0x6d, 0xae, 0xcb, 0x1b, 0x2b, 0x9b, - 0x2a, 0x69, 0x6d, 0x2e, 0x57, 0x3b, 0x52, 0x65, 0x18, 0x58, 0xd0, 0x42, 0xaf, 0x40, 0x61, 0xbd, - 0x26, 0x5c, 0xaa, 0x33, 0xc5, 0x9b, 0x66, 0xf4, 0xaf, 0xf9, 0x81, 0xbd, 0xdd, 0x52, 0x61, 0x79, - 0x01, 0x17, 0xd6, 0x6b, 0x68, 0x15, 0x06, 0xd7, 0x79, 0xbc, 0x20, 0x21, 0x1f, 0x7d, 0x32, 0x3b, - 0x94, 0x51, 0x2a, 0xa4, 0x10, 0xf7, 0x6d, 0x15, 0x00, 0x2c, 0x89, 0xb0, 0x94, 0x5b, 0x2a, 0xee, - 0x91, 0x08, 0xbb, 0x3a, 0x7b, 0xb0, 0x58, 0x55, 0xfc, 0xa9, 0x11, 0x47, 0x4f, 0xc2, 0x1a, 0x45, - 0xba, 0xaa, 0x9d, 0x7b, 0xed, 0x80, 0xe5, 0xe4, 0x10, 0x8a, 0x99, 0xcc, 0x55, 0x3d, 0x27, 0x91, - 0x3a, 0xad, 0x6a, 0x85, 0x84, 0x63, 0xa2, 0x68, 0x0b, 0xc6, 0xb6, 0xc3, 0xd6, 0x26, 0x91, 0x5b, - 0x9a, 0x85, 0xeb, 0xcb, 0xe1, 0x66, 0x6f, 0x0a, 0x44, 0x37, 0x88, 0xda, 0x4e, 0x23, 0x75, 0x0a, - 0xb1, 0x67, 0xcd, 0x4d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xb7, 0xed, 0xdf, 0xde, 0x89, - 0x88, 0x88, 0x96, 0x9a, 0x39, 0xfc, 0x6f, 0x71, 0x94, 0xf4, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xd0, - 0x4d, 0x31, 0x3c, 0xec, 0xf4, 0x9c, 0xcc, 0x0f, 0xc5, 0x3e, 0x27, 0x91, 0x72, 0x06, 0x85, 0x9d, - 0x96, 0x31, 0x29, 0x76, 0x4a, 0xb6, 0x36, 0xfd, 0xc8, 0xf7, 0x12, 0x27, 0xf4, 0x54, 0xfe, 0x29, - 0x59, 0xc9, 0xc0, 0x4f, 0x9f, 0x92, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x54, 0x87, 0xf1, 0x96, 0x1f, - 0x44, 0x77, 0xfc, 0x40, 0xae, 0x2f, 0xd4, 0x41, 0x50, 0x6a, 0x60, 0x8a, 0x16, 0x99, 0x59, 0x90, - 0x09, 0xc1, 0x09, 0x9a, 0xe8, 0xe3, 0x30, 0x18, 0xd6, 0x9c, 0x06, 0x29, 0x5f, 0x9f, 0x3e, 0x92, - 0x7f, 0xfd, 0x54, 0x39, 0x4a, 0xce, 0xea, 0xe2, 0xe1, 0x9e, 0x38, 0x0a, 0x96, 0xe4, 0xd0, 0x32, - 0xf4, 0xb3, 0x54, 0xd6, 0x2c, 0xb4, 0x6f, 0x4e, 0x44, 0xf9, 0x94, 0x53, 0x0f, 0x3f, 0x9b, 0x58, - 0x31, 0xe6, 0xd5, 0xe9, 0x1e, 0x10, 0x92, 0x02, 0x3f, 0x9c, 0x3e, 0x96, 0xbf, 0x07, 0x84, 0x80, - 0xe1, 0x7a, 0xb5, 0xd3, 0x1e, 0x50, 0x48, 0x38, 0x26, 0x4a, 0x4f, 0x66, 0x7a, 0x9a, 0x1e, 0xef, - 0x60, 0xb0, 0x99, 0x7b, 0x96, 0xb2, 0x93, 0x99, 0x9e, 0xa4, 0x94, 0x84, 0xfd, 0xc7, 0x43, 0x69, - 0x9e, 0x85, 0x49, 0x98, 0xfe, 0x63, 0x2b, 0x65, 0xb1, 0xf1, 0x91, 0x5e, 0x05, 0xde, 0x0f, 0xf0, - 0xe1, 0xfa, 0x79, 0x0b, 0x8e, 0xb7, 0x32, 0x3f, 0x44, 0x30, 0x00, 0xbd, 0xc9, 0xcd, 0xf9, 0xa7, - 0xab, 0x30, 0xd0, 0xd9, 0x70, 0x9c, 0xd3, 0x52, 0x52, 0x38, 0x50, 0x7c, 0xcf, 0xc2, 0x81, 0x15, - 0x18, 0xaa, 0xf1, 0x97, 0x9c, 0x4c, 0x5f, 0xd0, 0x53, 0x10, 0x53, 0xae, 0xa7, 0x15, 0x15, 0xb1, - 0x22, 0x81, 0x7e, 0xd2, 0x82, 0xd3, 0xc9, 0xae, 0x63, 0xc2, 0xc0, 0xc2, 0x5c, 0x93, 0x8b, 0xb5, - 0x96, 0xc5, 0xf7, 0xa7, 0xf8, 0x7f, 0x03, 0x79, 0xbf, 0x1b, 0x02, 0xee, 0xdc, 0x18, 0x5a, 0xcc, - 0x90, 0xab, 0x0d, 0x98, 0x3a, 0xc9, 0x1e, 0x64, 0x6b, 0x2f, 0xc2, 0x68, 0xd3, 0x6f, 0x7b, 0x91, - 0xb0, 0xba, 0x14, 0xa6, 0x5b, 0xcc, 0x64, 0x69, 0x45, 0x2b, 0xc7, 0x06, 0x56, 0x42, 0x22, 0x37, - 0x74, 0xdf, 0x12, 0xb9, 0x77, 0x60, 0xd4, 0xd3, 0x1c, 0x12, 0x3a, 0xbd, 0x60, 0x85, 0x74, 0x51, - 0xc3, 0xe6, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, 0xad, 0xb3, 0xb4, 0x0c, 0xde, 0x9b, 0xb4, 0xec, 0x50, - 0x9f, 0xc4, 0xf6, 0x6f, 0x16, 0x32, 0x5e, 0x0c, 0x5c, 0x2a, 0xf7, 0x9a, 0x29, 0x95, 0x3b, 0x97, - 0x94, 0xca, 0xa5, 0x54, 0x55, 0x86, 0x40, 0xae, 0xf7, 0x1c, 0x9a, 0x3d, 0x07, 0xa6, 0xfe, 0x61, - 0x0b, 0x4e, 0x30, 0xdd, 0x07, 0x6d, 0xe0, 0x3d, 0xeb, 0x3b, 0x98, 0x41, 0xec, 0xb5, 0x6c, 0x72, - 0x38, 0xaf, 0x1d, 0xbb, 0x01, 0x67, 0xbb, 0xdd, 0xbb, 0xcc, 0xbe, 0xb8, 0xae, 0xcc, 0x2b, 0x62, - 0xfb, 0xe2, 0x7a, 0x79, 0x11, 0x33, 0x48, 0xaf, 0x61, 0x17, 0xed, 0xff, 0xdb, 0x82, 0x62, 0xc5, - 0xaf, 0x1f, 0xc2, 0x8b, 0xfe, 0x63, 0xc6, 0x8b, 0xfe, 0x91, 0xec, 0x1b, 0xbf, 0x9e, 0xab, 0xec, - 0x5b, 0x4a, 0x28, 0xfb, 0x4e, 0xe7, 0x11, 0xe8, 0xac, 0xda, 0xfb, 0xe5, 0x22, 0x8c, 0x54, 0xfc, - 0xba, 0xda, 0x67, 0xff, 0xfd, 0xfd, 0xb8, 0x11, 0xe5, 0x66, 0xcd, 0xd2, 0x28, 0x33, 0x7b, 0x62, - 0x19, 0xf5, 0xe2, 0xbb, 0xcc, 0x9b, 0xe8, 0x16, 0x71, 0x37, 0x36, 0x23, 0x52, 0x4f, 0x7e, 0xce, - 0xe1, 0x79, 0x13, 0x7d, 0xab, 0x08, 0x13, 0x89, 0xd6, 0x51, 0x03, 0xc6, 0x1a, 0xba, 0x2a, 0x49, - 0xac, 0xd3, 0xfb, 0xd2, 0x42, 0x09, 0x6f, 0x0c, 0xad, 0x08, 0x9b, 0xc4, 0xd1, 0x2c, 0x80, 0xa7, - 0xdb, 0xa4, 0xab, 0x00, 0xcb, 0x9a, 0x3d, 0xba, 0x86, 0x81, 0x5e, 0x82, 0x91, 0xc8, 0x6f, 0xf9, - 0x0d, 0x7f, 0x63, 0xe7, 0x2a, 0x91, 0x11, 0x39, 0x95, 0xc9, 0xf2, 0x5a, 0x0c, 0xc2, 0x3a, 0x1e, - 0xba, 0x0b, 0x53, 0x8a, 0x48, 0xf5, 0x01, 0xa8, 0xd7, 0x98, 0xd8, 0x64, 0x35, 0x49, 0x11, 0xa7, - 0x1b, 0x41, 0xaf, 0xc0, 0x38, 0xb3, 0x9d, 0x66, 0xf5, 0xaf, 0x92, 0x1d, 0x19, 0xa9, 0x99, 0x71, - 0xd8, 0x2b, 0x06, 0x04, 0x27, 0x30, 0xd1, 0x02, 0x4c, 0x35, 0xdd, 0x30, 0x51, 0x7d, 0x80, 0x55, - 0x67, 0x1d, 0x58, 0x49, 0x02, 0x71, 0x1a, 0xdf, 0xfe, 0x75, 0x31, 0xc7, 0x5e, 0xe4, 0x7e, 0xb0, - 0x1d, 0xdf, 0xdf, 0xdb, 0xf1, 0x9b, 0x16, 0x4c, 0xd2, 0xd6, 0x99, 0x41, 0xa8, 0x64, 0xa4, 0x54, - 0x2e, 0x0f, 0xab, 0x43, 0x2e, 0x8f, 0x73, 0xf4, 0xd8, 0xae, 0xfb, 0xed, 0x48, 0x48, 0x47, 0xb5, - 0x73, 0x99, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x08, 0x84, 0xd7, 0xbd, 0x8e, 0x47, 0x82, 0x00, - 0x0b, 0xa8, 0x4c, 0xf5, 0xd1, 0x97, 0x9d, 0xea, 0x83, 0x47, 0x6c, 0x17, 0x76, 0x74, 0x82, 0xa5, - 0xd5, 0x22, 0xb6, 0x4b, 0x03, 0xbb, 0x18, 0xc7, 0xfe, 0x76, 0x11, 0x46, 0x2b, 0x7e, 0x3d, 0x36, - 0xec, 0x78, 0xd1, 0x30, 0xec, 0x38, 0x9b, 0x30, 0xec, 0x98, 0xd4, 0x71, 0x35, 0x33, 0x8e, 0x37, - 0x01, 0xf9, 0x22, 0x90, 0xfc, 0x65, 0xe2, 0x31, 0xbb, 0x37, 0x61, 0xa8, 0x57, 0x8c, 0xcd, 0x1e, - 0xae, 0xa7, 0x30, 0x70, 0x46, 0xad, 0x0f, 0x4c, 0x42, 0x0e, 0xd7, 0x24, 0xe4, 0x4f, 0x2c, 0xb6, - 0x02, 0x16, 0x57, 0xab, 0xdc, 0x56, 0x19, 0x5d, 0x84, 0x11, 0x76, 0x5a, 0xb2, 0x90, 0x11, 0xd2, - 0x72, 0x82, 0xa5, 0xf1, 0x5c, 0x8d, 0x8b, 0xb1, 0x8e, 0x83, 0xce, 0xc3, 0x50, 0x48, 0x9c, 0xa0, - 0xb6, 0xa9, 0xae, 0x0a, 0x61, 0xe6, 0xc0, 0xcb, 0xb0, 0x82, 0xa2, 0xb7, 0xe2, 0xc0, 0xe3, 0xc5, - 0x7c, 0xc3, 0x67, 0xbd, 0x3f, 0x7c, 0xbb, 0xe5, 0x47, 0x1b, 0xb7, 0x6f, 0x01, 0x4a, 0xe3, 0xf7, - 0xe0, 0x49, 0x56, 0x32, 0x43, 0xe3, 0x0e, 0xa7, 0xc2, 0xe2, 0xfe, 0x9b, 0x05, 0xe3, 0x15, 0xbf, - 0x4e, 0x8f, 0x81, 0xef, 0xa5, 0x3d, 0xaf, 0x67, 0x5d, 0x18, 0xe8, 0x90, 0x75, 0xe1, 0x31, 0xe8, - 0xaf, 0xf8, 0xf5, 0x2e, 0xe1, 0x7b, 0x7f, 0xc5, 0x82, 0xc1, 0x8a, 0x5f, 0x3f, 0x04, 0x25, 0xce, - 0x6b, 0xa6, 0x12, 0xe7, 0x44, 0xce, 0xba, 0xc9, 0xd1, 0xdb, 0xfc, 0x79, 0x1f, 0x8c, 0xd1, 0x7e, - 0xfa, 0x1b, 0x72, 0x2a, 0x8d, 0x61, 0xb3, 0x7a, 0x18, 0x36, 0xfa, 0xa4, 0xf0, 0x1b, 0x0d, 0xff, - 0x4e, 0x72, 0x5a, 0x97, 0x59, 0x29, 0x16, 0x50, 0xf4, 0x2c, 0x0c, 0xb5, 0x02, 0xb2, 0xed, 0xfa, - 0x82, 0x57, 0xd7, 0x54, 0x62, 0x15, 0x51, 0x8e, 0x15, 0x06, 0x7d, 0xc4, 0x87, 0xae, 0x47, 0xf9, - 0x92, 0x9a, 0xef, 0xd5, 0xb9, 0x9e, 0xa3, 0x28, 0x52, 0x83, 0x69, 0xe5, 0xd8, 0xc0, 0x42, 0xb7, - 0x60, 0x98, 0xfd, 0x67, 0xc7, 0x4e, 0xff, 0x81, 0x8f, 0x1d, 0x91, 0x2c, 0x59, 0x10, 0xc0, 0x31, - 0x2d, 0xf4, 0x3c, 0x40, 0x24, 0xd3, 0xeb, 0x84, 0x22, 0x8c, 0xab, 0x7a, 0xd7, 0xa8, 0xc4, 0x3b, - 0x21, 0xd6, 0xb0, 0xd0, 0x33, 0x30, 0x1c, 0x39, 0x6e, 0xe3, 0x9a, 0xeb, 0x31, 0x5b, 0x00, 0xda, - 0x7f, 0x91, 0xb3, 0x58, 0x14, 0xe2, 0x18, 0x4e, 0xf9, 0x4a, 0x16, 0xdd, 0x6a, 0x7e, 0x27, 0x12, - 0xe9, 0xf9, 0x8a, 0x9c, 0xaf, 0xbc, 0xa6, 0x4a, 0xb1, 0x86, 0x81, 0x36, 0xe1, 0x94, 0xeb, 0xb1, - 0x34, 0x5a, 0xa4, 0xba, 0xe5, 0xb6, 0xd6, 0xae, 0x55, 0x6f, 0x92, 0xc0, 0x5d, 0xdf, 0x99, 0x77, - 0x6a, 0x5b, 0xc4, 0xab, 0x33, 0xb1, 0xc3, 0xd0, 0xfc, 0xe3, 0xa2, 0x8b, 0xa7, 0xca, 0x1d, 0x70, - 0x71, 0x47, 0x4a, 0xc8, 0xa6, 0xdb, 0x31, 0x20, 0x4e, 0x53, 0xc8, 0x17, 0x78, 0x0a, 0x1e, 0x56, - 0x82, 0x05, 0xc4, 0x7e, 0x81, 0xed, 0x89, 0xeb, 0x55, 0xf4, 0xb4, 0x71, 0xbc, 0x1c, 0xd7, 0x8f, - 0x97, 0xfd, 0xdd, 0xd2, 0xc0, 0xf5, 0xaa, 0x16, 0xe9, 0xe8, 0x12, 0x1c, 0xab, 0xf8, 0xf5, 0x8a, - 0x1f, 0x44, 0xcb, 0x7e, 0x70, 0xc7, 0x09, 0xea, 0x72, 0x09, 0x96, 0x64, 0xac, 0x27, 0x7a, 0xc6, - 0xf6, 0xf3, 0x13, 0xc8, 0x88, 0xe3, 0xf4, 0x02, 0xe3, 0x10, 0x0f, 0xe8, 0x5a, 0x5b, 0x63, 0xbc, - 0x8a, 0x4a, 0x56, 0x77, 0xd9, 0x89, 0x08, 0xba, 0x0e, 0x63, 0x35, 0xfd, 0xda, 0x16, 0xd5, 0x9f, - 0x92, 0x97, 0x9d, 0x71, 0xa7, 0x67, 0xde, 0xf3, 0x66, 0x7d, 0xfb, 0x1b, 0x96, 0x68, 0x85, 0x4b, - 0x3e, 0xb8, 0x0d, 0x6d, 0xf7, 0x33, 0x77, 0x01, 0xa6, 0x02, 0xbd, 0x8a, 0x66, 0x8b, 0x76, 0x8c, - 0x67, 0xff, 0x49, 0x00, 0x71, 0x1a, 0x1f, 0x7d, 0x12, 0x4e, 0x1a, 0x85, 0x52, 0x2d, 0xaf, 0xe5, - 0xe0, 0x66, 0xb2, 0x21, 0x9c, 0x87, 0x84, 0xf3, 0xeb, 0xdb, 0x3f, 0x08, 0xc7, 0x93, 0xdf, 0x25, - 0xa4, 0x35, 0xf7, 0xf9, 0x75, 0x85, 0x83, 0x7d, 0x9d, 0xfd, 0x12, 0x4c, 0xd1, 0x67, 0xbc, 0x62, - 0x49, 0xd9, 0xfc, 0x75, 0x0f, 0xa7, 0xf5, 0xdb, 0x43, 0xec, 0x1a, 0x4c, 0x64, 0xa0, 0x43, 0x9f, - 0x86, 0xf1, 0x90, 0xb0, 0x18, 0x72, 0x52, 0x4a, 0xd8, 0xc1, 0x2f, 0xbe, 0xba, 0xa4, 0x63, 0xf2, - 0x97, 0x90, 0x59, 0x86, 0x13, 0xd4, 0x50, 0x13, 0xc6, 0xef, 0xb8, 0x5e, 0xdd, 0xbf, 0x13, 0x4a, - 0xfa, 0x43, 0xf9, 0x2a, 0x87, 0x5b, 0x1c, 0x33, 0xd1, 0x47, 0xa3, 0xb9, 0x5b, 0x06, 0x31, 0x9c, - 0x20, 0x4e, 0x8f, 0x9a, 0xa0, 0xed, 0xcd, 0x85, 0x37, 0x42, 0x12, 0x88, 0x08, 0x77, 0xec, 0xa8, - 0xc1, 0xb2, 0x10, 0xc7, 0x70, 0x7a, 0xd4, 0xb0, 0x3f, 0xcc, 0xb1, 0x9e, 0x9d, 0x65, 0xe2, 0xa8, - 0xc1, 0xaa, 0x14, 0x6b, 0x18, 0xf4, 0x28, 0x66, 0xff, 0x56, 0x7d, 0x0f, 0xfb, 0x7e, 0x24, 0x0f, - 0x6f, 0x96, 0xae, 0x53, 0x2b, 0xc7, 0x06, 0x56, 0x4e, 0x3c, 0xbd, 0xbe, 0x83, 0xc6, 0xd3, 0x43, - 0x51, 0x87, 0x58, 0x02, 0x3c, 0x22, 0xf4, 0xa5, 0x4e, 0xb1, 0x04, 0xf6, 0xef, 0x2b, 0xce, 0x00, - 0xe5, 0x05, 0xd6, 0xc5, 0x00, 0xf5, 0xf3, 0x80, 0x81, 0x4c, 0x29, 0x5a, 0xe5, 0xa3, 0x23, 0x61, - 0x68, 0x09, 0x06, 0xc3, 0x9d, 0xb0, 0x16, 0x35, 0xc2, 0x4e, 0x29, 0x59, 0xab, 0x0c, 0x45, 0xcb, - 0x08, 0xce, 0xab, 0x60, 0x59, 0x17, 0xd5, 0xe0, 0x88, 0xa0, 0xb8, 0xb0, 0xe9, 0x78, 0x2a, 0x51, - 0x24, 0xb7, 0x7e, 0xbc, 0xb8, 0xb7, 0x5b, 0x3a, 0x22, 0x5a, 0xd6, 0xc1, 0xfb, 0xbb, 0x25, 0xba, - 0x25, 0x33, 0x20, 0x38, 0x8b, 0x1a, 0x5f, 0xf2, 0xb5, 0x9a, 0xdf, 0x6c, 0x55, 0x02, 0x7f, 0xdd, - 0x6d, 0x90, 0x4e, 0x8a, 0xe5, 0xaa, 0x81, 0x29, 0x96, 0xbc, 0x51, 0x86, 0x13, 0xd4, 0xd0, 0x6d, - 0x98, 0x70, 0x5a, 0xad, 0xb9, 0xa0, 0xe9, 0x07, 0xb2, 0x81, 0x91, 0x7c, 0x0d, 0xc5, 0x9c, 0x89, - 0xca, 0xf3, 0x44, 0x26, 0x0a, 0x71, 0x92, 0x20, 0x1d, 0x28, 0xb1, 0xd1, 0x8c, 0x81, 0x1a, 0x8b, - 0x07, 0x4a, 0xec, 0xcb, 0x8c, 0x81, 0xca, 0x80, 0xe0, 0x2c, 0x6a, 0xf6, 0x0f, 0x30, 0xc6, 0x9f, - 0xc5, 0x9b, 0x66, 0x6e, 0x46, 0x4d, 0x18, 0x6b, 0xb1, 0x63, 0x5f, 0xe4, 0x70, 0x13, 0x47, 0xc5, - 0x8b, 0x3d, 0x0a, 0x42, 0xef, 0xb0, 0x2c, 0xb4, 0x86, 0x41, 0x6c, 0x45, 0x27, 0x87, 0x4d, 0xea, - 0xf6, 0x2f, 0xcd, 0x30, 0xd6, 0xb1, 0xca, 0xa5, 0x9b, 0x83, 0xc2, 0xe9, 0x52, 0xc8, 0x33, 0x66, - 0xf2, 0xf5, 0x08, 0xf1, 0xfa, 0x12, 0x8e, 0x9b, 0x58, 0xd6, 0x45, 0x9f, 0x82, 0x71, 0xd7, 0x73, - 0xe3, 0xec, 0xcd, 0xe1, 0xf4, 0xd1, 0xfc, 0x68, 0x5e, 0x0a, 0x4b, 0xcf, 0xef, 0xa8, 0x57, 0xc6, - 0x09, 0x62, 0xe8, 0x2d, 0x66, 0x23, 0x2a, 0x49, 0x17, 0x7a, 0x21, 0xad, 0x9b, 0x83, 0x4a, 0xb2, - 0x1a, 0x11, 0xd4, 0x86, 0x23, 0xe9, 0x2c, 0xd6, 0xe1, 0xb4, 0x9d, 0xff, 0x36, 0x4a, 0x27, 0xa2, - 0x8e, 0x13, 0xf1, 0xa5, 0x61, 0x21, 0xce, 0xa2, 0x8f, 0xae, 0x25, 0x73, 0x0c, 0x17, 0x0d, 0x0d, - 0x44, 0x2a, 0xcf, 0xf0, 0x58, 0xc7, 0xf4, 0xc2, 0x1b, 0x70, 0x5a, 0x4b, 0xd3, 0x7a, 0x39, 0x70, - 0x98, 0x8d, 0x92, 0xcb, 0x6e, 0x23, 0x8d, 0xa9, 0x7d, 0x74, 0x6f, 0xb7, 0x74, 0x7a, 0xad, 0x13, - 0x22, 0xee, 0x4c, 0x07, 0x5d, 0x87, 0x63, 0x3c, 0x16, 0xcd, 0x22, 0x71, 0xea, 0x0d, 0xd7, 0x53, - 0x5c, 0x33, 0x3f, 0xbb, 0x4e, 0xee, 0xed, 0x96, 0x8e, 0xcd, 0x65, 0x21, 0xe0, 0xec, 0x7a, 0xe8, - 0x35, 0x18, 0xae, 0x7b, 0xf2, 0x94, 0x1d, 0x30, 0x32, 0xe1, 0x0e, 0x2f, 0xae, 0x56, 0xd5, 0xf7, - 0xc7, 0x7f, 0x70, 0x5c, 0x01, 0x6d, 0x70, 0x15, 0x98, 0x92, 0x5b, 0x0e, 0xa6, 0x42, 0x94, 0x26, - 0x45, 0xfb, 0x46, 0x70, 0x07, 0xae, 0xfb, 0x55, 0x0e, 0x80, 0x46, 0xdc, 0x07, 0x83, 0x30, 0x7a, - 0x13, 0x90, 0xc8, 0xb8, 0x34, 0x57, 0x63, 0x09, 0x02, 0x35, 0xbb, 0x54, 0x25, 0x42, 0xa8, 0xa6, - 0x30, 0x70, 0x46, 0x2d, 0x74, 0x85, 0x1e, 0x8f, 0x7a, 0xa9, 0x38, 0x7e, 0x55, 0xbe, 0xf5, 0x45, - 0xd2, 0x0a, 0x08, 0x33, 0xa5, 0x34, 0x29, 0xe2, 0x44, 0x3d, 0x54, 0x87, 0x53, 0x4e, 0x3b, 0xf2, - 0x99, 0x76, 0xd1, 0x44, 0x5d, 0xf3, 0xb7, 0x88, 0xc7, 0x14, 0xfb, 0x43, 0x2c, 0xf4, 0xe9, 0xa9, - 0xb9, 0x0e, 0x78, 0xb8, 0x23, 0x15, 0xfa, 0x9c, 0xa2, 0x63, 0xa1, 0x29, 0xfe, 0x0c, 0x3f, 0x75, - 0xae, 0x0d, 0x97, 0x18, 0xe8, 0x25, 0x18, 0xd9, 0xf4, 0xc3, 0x68, 0x95, 0x44, 0x77, 0xfc, 0x60, - 0x4b, 0xa4, 0x78, 0x88, 0xd3, 0xea, 0xc4, 0x20, 0xac, 0xe3, 0xa1, 0xa7, 0x60, 0x90, 0x99, 0x9d, - 0x95, 0x17, 0xd9, 0x5d, 0x3b, 0x14, 0x9f, 0x31, 0x57, 0x78, 0x31, 0x96, 0x70, 0x89, 0x5a, 0xae, - 0x2c, 0xb0, 0xe3, 0x38, 0x81, 0x5a, 0xae, 0x2c, 0x60, 0x09, 0xa7, 0xcb, 0x35, 0xdc, 0x74, 0x02, - 0x52, 0x09, 0xfc, 0x1a, 0x09, 0xb5, 0x64, 0x4e, 0x8f, 0xf0, 0x04, 0x16, 0x74, 0xb9, 0x56, 0xb3, - 0x10, 0x70, 0x76, 0x3d, 0x44, 0xd2, 0x29, 0x8a, 0xc7, 0xf3, 0xd5, 0xae, 0x69, 0x76, 0xb0, 0xc7, - 0x2c, 0xc5, 0x1e, 0x4c, 0xaa, 0xe4, 0xc8, 0x3c, 0x65, 0x45, 0x38, 0x3d, 0xc1, 0xd6, 0x76, 0xef, - 0xf9, 0x2e, 0x94, 0x22, 0xbb, 0x9c, 0xa0, 0x84, 0x53, 0xb4, 0x8d, 0xd8, 0xba, 0x93, 0x5d, 0x63, - 0xeb, 0x5e, 0x80, 0xe1, 0xb0, 0x7d, 0xbb, 0xee, 0x37, 0x1d, 0xd7, 0x63, 0xd6, 0x3b, 0xda, 0xc3, - 0xbd, 0x2a, 0x01, 0x38, 0xc6, 0x41, 0xcb, 0x30, 0xe4, 0x48, 0x2d, 0x35, 0xca, 0x0f, 0x1b, 0xa8, - 0x74, 0xd3, 0x3c, 0x92, 0x96, 0xd4, 0x4b, 0xab, 0xba, 0xe8, 0x55, 0x18, 0x13, 0xa1, 0x49, 0x78, - 0x14, 0x1e, 0x66, 0x5d, 0xa3, 0x39, 0x53, 0x57, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x0d, 0x18, 0x89, - 0xfc, 0x86, 0x90, 0x71, 0x86, 0xd3, 0xc7, 0xf3, 0xa3, 0xfb, 0xae, 0x29, 0x34, 0x5d, 0x7f, 0xa2, - 0xaa, 0x62, 0x9d, 0x0e, 0x5a, 0xe3, 0xeb, 0x9d, 0xa5, 0x6e, 0x22, 0xa1, 0x48, 0x48, 0x7f, 0x3a, - 0xcf, 0xf4, 0x92, 0xa1, 0x99, 0xdb, 0x41, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x19, 0xa6, 0x5a, 0x81, - 0xeb, 0xb3, 0x35, 0xa1, 0xb4, 0xee, 0xd3, 0x66, 0xa2, 0xd6, 0x4a, 0x12, 0x01, 0xa7, 0xeb, 0xb0, - 0xc8, 0x32, 0xa2, 0x70, 0xfa, 0x24, 0x4f, 0x36, 0xc7, 0xe5, 0x20, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, - 0x61, 0x27, 0x31, 0x17, 0xe1, 0x4d, 0xcf, 0xe4, 0xc7, 0x2b, 0xd0, 0x45, 0x7d, 0x9c, 0xf7, 0x57, - 0x7f, 0x71, 0x4c, 0x01, 0xd5, 0xb5, 0x1c, 0xef, 0xf4, 0x05, 0x15, 0x4e, 0x9f, 0xea, 0x60, 0xfb, - 0x9b, 0x78, 0x2e, 0xc7, 0x0c, 0x81, 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x06, 0x4c, 0x8a, 0xb0, - 0x0b, 0xf1, 0x30, 0x9d, 0x8e, 0xfd, 0xa3, 0x70, 0x02, 0x86, 0x53, 0xd8, 0x3c, 0xd9, 0x9b, 0x73, - 0xbb, 0x41, 0xc4, 0xd1, 0x77, 0xcd, 0xf5, 0xb6, 0xc2, 0xe9, 0x33, 0xec, 0x7c, 0x10, 0xc9, 0xde, - 0x92, 0x50, 0x9c, 0x51, 0x03, 0xad, 0xc1, 0x64, 0x2b, 0x20, 0xa4, 0xc9, 0xde, 0x49, 0xe2, 0x3e, - 0x2b, 0xf1, 0xc0, 0x4a, 0xb4, 0x27, 0x95, 0x04, 0x6c, 0x3f, 0xa3, 0x0c, 0xa7, 0x28, 0xa0, 0x3b, - 0x30, 0xe4, 0x6f, 0x93, 0x60, 0x93, 0x38, 0xf5, 0xe9, 0xb3, 0x1d, 0xbc, 0xf6, 0xc4, 0xe5, 0x76, - 0x5d, 0xe0, 0x26, 0x8c, 0x9a, 0x64, 0x71, 0x77, 0xa3, 0x26, 0xd9, 0x18, 0xfa, 0x4f, 0x2c, 0x38, - 0x29, 0xd5, 0x84, 0xd5, 0x16, 0x1d, 0xf5, 0x05, 0xdf, 0x0b, 0xa3, 0x80, 0x87, 0x02, 0x7a, 0x34, - 0x3f, 0x3c, 0xce, 0x5a, 0x4e, 0x25, 0xa5, 0x45, 0x38, 0x99, 0x87, 0x11, 0xe2, 0xfc, 0x16, 0xe9, - 0xcb, 0x3e, 0x24, 0x91, 0x3c, 0x8c, 0xe6, 0xc2, 0xe5, 0xb7, 0x16, 0x57, 0xa7, 0x1f, 0xe3, 0x71, - 0x8c, 0xe8, 0x66, 0xa8, 0x26, 0x81, 0x38, 0x8d, 0x8f, 0x2e, 0x42, 0xc1, 0x0f, 0xa7, 0x1f, 0x67, - 0x6b, 0xfb, 0x64, 0xce, 0x38, 0x5e, 0xaf, 0x72, 0xe3, 0xd6, 0xeb, 0x55, 0x5c, 0xf0, 0x43, 0x99, - 0x70, 0x8d, 0x3e, 0x67, 0xc3, 0xe9, 0x27, 0xb8, 0xcc, 0x59, 0x26, 0x5c, 0x63, 0x85, 0x38, 0x86, - 0xa3, 0x4d, 0x98, 0x08, 0x0d, 0xb1, 0x41, 0x38, 0x7d, 0x8e, 0x8d, 0xd4, 0x13, 0x79, 0x93, 0x66, - 0x60, 0x6b, 0x99, 0x90, 0x4c, 0x2a, 0x38, 0x49, 0x96, 0xef, 0x2e, 0x4d, 0x70, 0x11, 0x4e, 0x3f, - 0xd9, 0x65, 0x77, 0x69, 0xc8, 0xfa, 0xee, 0xd2, 0x69, 0xe0, 0x04, 0x4d, 0x74, 0x43, 0x77, 0x89, - 0x3c, 0x9f, 0x6f, 0x28, 0x99, 0xe9, 0x0c, 0x39, 0x96, 0xe7, 0x08, 0x39, 0xf3, 0x7d, 0x30, 0x95, - 0xe2, 0xc2, 0x0e, 0xe2, 0x1f, 0x32, 0xb3, 0x05, 0x63, 0xc6, 0x4a, 0x7f, 0xa8, 0xe6, 0x43, 0x3f, - 0x03, 0x30, 0xac, 0xcc, 0x3a, 0x72, 0xf4, 0x6c, 0x53, 0xf7, 0xa5, 0x67, 0xbb, 0x60, 0x5a, 0x1f, - 0x9d, 0x4c, 0x5a, 0x1f, 0x0d, 0x55, 0xfc, 0xba, 0x61, 0x70, 0xb4, 0x96, 0x11, 0x41, 0x38, 0xef, - 0x8c, 0xee, 0xdd, 0x21, 0x4e, 0x53, 0x55, 0x15, 0x7b, 0x36, 0x63, 0xea, 0xeb, 0xa8, 0xfd, 0xba, - 0x0c, 0x53, 0x9e, 0xcf, 0x9e, 0x11, 0xa4, 0x2e, 0x79, 0x44, 0xc6, 0x0a, 0x0e, 0xeb, 0x11, 0xee, - 0x12, 0x08, 0x38, 0x5d, 0x87, 0x36, 0xc8, 0x79, 0xb9, 0xa4, 0xba, 0x8d, 0xb3, 0x7a, 0x58, 0x40, - 0xe9, 0xf3, 0x95, 0xff, 0x0a, 0xa7, 0x27, 0xf3, 0x9f, 0xaf, 0xbc, 0x52, 0x92, 0x5f, 0x0c, 0x25, - 0xbf, 0xc8, 0xb4, 0x4b, 0x2d, 0xbf, 0x5e, 0xae, 0x88, 0x97, 0x88, 0x16, 0xdb, 0xbf, 0x5e, 0xae, - 0x60, 0x0e, 0x43, 0x73, 0x30, 0xc0, 0x7e, 0xc8, 0xc8, 0x41, 0x79, 0x27, 0x49, 0xb9, 0xa2, 0xe5, - 0xa4, 0x65, 0x15, 0xb0, 0xa8, 0xc8, 0xb4, 0x07, 0xf4, 0xf9, 0xc6, 0xb4, 0x07, 0x83, 0xf7, 0xa9, - 0x3d, 0x90, 0x04, 0x70, 0x4c, 0x0b, 0xdd, 0x85, 0x63, 0xc6, 0x93, 0x59, 0x79, 0x08, 0x42, 0xbe, - 0x91, 0x42, 0x02, 0x79, 0xfe, 0xb4, 0xe8, 0xf4, 0xb1, 0x72, 0x16, 0x25, 0x9c, 0xdd, 0x00, 0x6a, - 0xc0, 0x54, 0x2d, 0xd5, 0xea, 0x50, 0xef, 0xad, 0xaa, 0x75, 0x91, 0x6e, 0x31, 0x4d, 0x18, 0xbd, - 0x0a, 0x43, 0xef, 0xfa, 0xdc, 0xa0, 0x50, 0xbc, 0x9e, 0x64, 0x7c, 0x9b, 0xa1, 0xb7, 0xae, 0x57, - 0x59, 0xf9, 0xfe, 0x6e, 0x69, 0xa4, 0xe2, 0xd7, 0xe5, 0x5f, 0xac, 0x2a, 0xa0, 0x1f, 0xb3, 0x60, - 0x26, 0xfd, 0x26, 0x57, 0x9d, 0x1e, 0xeb, 0xbd, 0xd3, 0xb6, 0x68, 0x74, 0x66, 0x29, 0x97, 0x1c, - 0xee, 0xd0, 0x14, 0xfa, 0x28, 0xdd, 0x4f, 0xa1, 0x7b, 0x8f, 0x88, 0x84, 0xfe, 0x8f, 0xc6, 0xfb, - 0x89, 0x96, 0xee, 0xef, 0x96, 0x26, 0xf8, 0xe1, 0xed, 0xde, 0x53, 0x59, 0x08, 0x78, 0x05, 0xf4, - 0x83, 0x70, 0x2c, 0x48, 0xcb, 0xc8, 0x89, 0x7c, 0x27, 0x3c, 0xdd, 0xcb, 0x45, 0x90, 0x9c, 0x70, - 0x9c, 0x45, 0x10, 0x67, 0xb7, 0x63, 0xff, 0xa1, 0xc5, 0x74, 0x23, 0xa2, 0x5b, 0x24, 0x6c, 0x37, - 0xa2, 0x43, 0x30, 0xe2, 0x5b, 0x32, 0x6c, 0x13, 0xee, 0xdb, 0x0a, 0xef, 0xbf, 0xb3, 0x98, 0x15, - 0xde, 0x21, 0xfa, 0x13, 0xbe, 0x05, 0x43, 0x91, 0x68, 0x4d, 0x74, 0x3d, 0xcf, 0x62, 0x48, 0x76, - 0x8a, 0x59, 0x22, 0xaa, 0x77, 0x98, 0x2c, 0xc5, 0x8a, 0x8c, 0xfd, 0x5f, 0xf3, 0x19, 0x90, 0x90, - 0x43, 0x50, 0x01, 0x2f, 0x9a, 0x2a, 0xe0, 0x52, 0x97, 0x2f, 0xc8, 0x51, 0x05, 0xff, 0x57, 0x66, - 0xbf, 0x99, 0xfc, 0xf1, 0xfd, 0x6e, 0xfe, 0x69, 0x7f, 0xd1, 0x02, 0x88, 0xd3, 0xbe, 0xf4, 0x90, - 0xc0, 0xfb, 0x12, 0x7d, 0x79, 0xf9, 0x91, 0x5f, 0xf3, 0x1b, 0x42, 0x05, 0x75, 0x2a, 0xd6, 0x42, - 0xf3, 0xf2, 0x7d, 0xed, 0x37, 0x56, 0xd8, 0xa8, 0x24, 0xe3, 0x30, 0x17, 0x63, 0xbb, 0x08, 0x23, - 0x06, 0xf3, 0x57, 0x2c, 0x38, 0x9a, 0xe5, 0x9c, 0x42, 0xdf, 0xf1, 0x5c, 0x12, 0xab, 0x4c, 0x73, - 0xd5, 0x6c, 0xde, 0x14, 0xe5, 0x58, 0x61, 0xf4, 0x9c, 0x19, 0xfd, 0x60, 0x29, 0x49, 0xae, 0xc3, - 0x58, 0x25, 0x20, 0x1a, 0x7f, 0xf1, 0x7a, 0x9c, 0x2d, 0x69, 0x78, 0xfe, 0xd9, 0x03, 0x47, 0x7c, - 0xb2, 0xbf, 0x5a, 0x80, 0xa3, 0xdc, 0xc0, 0x6c, 0x6e, 0xdb, 0x77, 0xeb, 0x15, 0xbf, 0x2e, 0x5c, - 0x8a, 0xdf, 0x86, 0xd1, 0x96, 0x26, 0x3e, 0xef, 0x14, 0x5e, 0x5f, 0x17, 0xb3, 0xc7, 0x02, 0x3f, - 0xbd, 0x14, 0x1b, 0xb4, 0x50, 0x1d, 0x46, 0xc9, 0xb6, 0x5b, 0x53, 0x96, 0x45, 0x85, 0x03, 0x5f, - 0xd2, 0xaa, 0x95, 0x25, 0x8d, 0x0e, 0x36, 0xa8, 0xf6, 0x6c, 0x16, 0xae, 0xb1, 0x68, 0x7d, 0x5d, - 0xac, 0x89, 0x7e, 0xce, 0x82, 0x13, 0x39, 0xc1, 0xf8, 0x69, 0x73, 0x77, 0x98, 0x29, 0x9f, 0x58, - 0xb6, 0xaa, 0x39, 0x6e, 0xe0, 0x87, 0x05, 0x14, 0x7d, 0x1c, 0xa0, 0x15, 0xa7, 0x30, 0xed, 0x12, - 0xb5, 0xdc, 0x88, 0x5f, 0xac, 0x85, 0xa2, 0x55, 0x99, 0x4e, 0x35, 0x5a, 0xf6, 0x57, 0xfa, 0xa0, - 0x9f, 0x19, 0x71, 0xa1, 0x0a, 0x0c, 0x6e, 0xf2, 0x48, 0x89, 0x1d, 0xe7, 0x8d, 0xe2, 0xca, 0xd0, - 0x8b, 0xf1, 0xbc, 0x69, 0xa5, 0x58, 0x92, 0x41, 0x2b, 0x70, 0x84, 0xa7, 0x67, 0x6d, 0x2c, 0x92, - 0x86, 0xb3, 0x23, 0x25, 0xd3, 0x05, 0xf6, 0xa9, 0x4a, 0x42, 0x5f, 0x4e, 0xa3, 0xe0, 0xac, 0x7a, - 0xe8, 0x75, 0x18, 0x8f, 0xdc, 0x26, 0xf1, 0xdb, 0x91, 0xa4, 0xc4, 0xf3, 0xa1, 0xaa, 0xc7, 0xd3, - 0x9a, 0x01, 0xc5, 0x09, 0x6c, 0xf4, 0x2a, 0x8c, 0xb5, 0x52, 0x32, 0xf8, 0xfe, 0x58, 0x58, 0x65, - 0xca, 0xdd, 0x4d, 0x5c, 0xe6, 0x9f, 0xd2, 0x66, 0xde, 0x38, 0x6b, 0x9b, 0x01, 0x09, 0x37, 0xfd, - 0x46, 0x9d, 0x71, 0xc0, 0xfd, 0x9a, 0x7f, 0x4a, 0x02, 0x8e, 0x53, 0x35, 0x28, 0x95, 0x75, 0xc7, - 0x6d, 0xb4, 0x03, 0x12, 0x53, 0x19, 0x30, 0xa9, 0x2c, 0x27, 0xe0, 0x38, 0x55, 0xa3, 0xbb, 0x72, - 0x61, 0xf0, 0xc1, 0x28, 0x17, 0xec, 0x5f, 0x2d, 0x80, 0x31, 0xb5, 0xdf, 0xc3, 0xd9, 0x56, 0x5f, - 0x83, 0xbe, 0x8d, 0xa0, 0x55, 0x13, 0x06, 0x8b, 0x99, 0x5f, 0x76, 0x19, 0x57, 0x16, 0xf4, 0x2f, - 0xa3, 0xff, 0x31, 0xab, 0x45, 0xf7, 0xf8, 0xb1, 0x4a, 0xe0, 0xd3, 0x4b, 0x4e, 0x06, 0x53, 0x55, - 0x6e, 0x60, 0x83, 0xf2, 0xbd, 0xde, 0x21, 0xec, 0xb8, 0xf0, 0x65, 0xe1, 0x14, 0x0c, 0xdb, 0xbe, - 0xaa, 0x78, 0xad, 0x4b, 0x2a, 0xe8, 0x22, 0x8c, 0x88, 0x04, 0x98, 0xcc, 0x5b, 0x89, 0x6f, 0x26, - 0x66, 0x8b, 0xb8, 0x18, 0x17, 0x63, 0x1d, 0xc7, 0xfe, 0xf1, 0x02, 0x1c, 0xc9, 0x70, 0x37, 0xe5, - 0xd7, 0xc8, 0x86, 0x1b, 0x46, 0xc1, 0x4e, 0xf2, 0x72, 0xc2, 0xa2, 0x1c, 0x2b, 0x0c, 0x7a, 0x56, - 0xf1, 0x8b, 0x2a, 0x79, 0x39, 0x09, 0x77, 0x2e, 0x01, 0x3d, 0xd8, 0xe5, 0x44, 0xaf, 0xed, 0x76, - 0x48, 0x64, 0x86, 0x03, 0x75, 0x6d, 0x33, 0xc3, 0x05, 0x06, 0xa1, 0x4f, 0xc0, 0x0d, 0xa5, 0x8d, - 0xd7, 0x9e, 0x80, 0x5c, 0x1f, 0xcf, 0x61, 0xb4, 0x73, 0x11, 0xf1, 0x1c, 0x2f, 0x12, 0x0f, 0xc5, - 0x38, 0xf2, 0x35, 0x2b, 0xc5, 0x02, 0x6a, 0x7f, 0xb9, 0x08, 0x27, 0x73, 0x1d, 0xd0, 0x69, 0xd7, - 0x9b, 0xbe, 0xe7, 0x46, 0xbe, 0x32, 0xf2, 0xe4, 0xd1, 0xae, 0x49, 0x6b, 0x73, 0x45, 0x94, 0x63, - 0x85, 0x81, 0xce, 0x41, 0x3f, 0x93, 0xdb, 0x27, 0x93, 0xdf, 0xe1, 0xf9, 0x45, 0x1e, 0x0b, 0x94, - 0x83, 0xb5, 0x5b, 0xbd, 0xd8, 0xf1, 0x56, 0x7f, 0x8c, 0x72, 0x30, 0x7e, 0x23, 0x79, 0xa1, 0xd0, - 0xee, 0xfa, 0x7e, 0x03, 0x33, 0x20, 0x7a, 0x42, 0x8c, 0x57, 0xc2, 0xaa, 0x11, 0x3b, 0x75, 0x3f, - 0xd4, 0x06, 0xed, 0x29, 0x18, 0xdc, 0x22, 0x3b, 0x81, 0xeb, 0x6d, 0x24, 0xad, 0x5d, 0xaf, 0xf2, - 0x62, 0x2c, 0xe1, 0x66, 0x96, 0xf8, 0xc1, 0x07, 0x91, 0x25, 0x5e, 0x5f, 0x01, 0x43, 0x5d, 0xd9, - 0x93, 0x9f, 0x28, 0xc2, 0x04, 0x9e, 0x5f, 0xfc, 0x60, 0x22, 0x6e, 0xa4, 0x27, 0xe2, 0x41, 0x24, - 0x53, 0x3f, 0xd8, 0x6c, 0xfc, 0x9e, 0x05, 0x13, 0x2c, 0x0d, 0xa7, 0x88, 0x1e, 0xe3, 0xfa, 0xde, - 0x21, 0x3c, 0x05, 0x1e, 0x83, 0xfe, 0x80, 0x36, 0x2a, 0x66, 0x50, 0xed, 0x71, 0xd6, 0x13, 0xcc, - 0x61, 0xe8, 0x14, 0xf4, 0xb1, 0x2e, 0xd0, 0xc9, 0x1b, 0xe5, 0x47, 0xf0, 0xa2, 0x13, 0x39, 0x98, - 0x95, 0xb2, 0x38, 0x96, 0x98, 0xb4, 0x1a, 0x2e, 0xef, 0x74, 0x6c, 0x55, 0xf1, 0xfe, 0x08, 0x4d, - 0x93, 0xd9, 0xb5, 0xf7, 0x16, 0xc7, 0x32, 0x9b, 0x64, 0xe7, 0x67, 0xf6, 0x3f, 0x15, 0xe0, 0x4c, - 0x66, 0xbd, 0x9e, 0xe3, 0x58, 0x76, 0xae, 0xfd, 0x30, 0x93, 0xf6, 0x15, 0x0f, 0xd1, 0x97, 0xa0, - 0xaf, 0x57, 0xee, 0xbf, 0xbf, 0x87, 0xf0, 0x92, 0x99, 0x43, 0xf6, 0x3e, 0x09, 0x2f, 0x99, 0xd9, - 0xb7, 0x1c, 0x31, 0xc1, 0xb7, 0x0b, 0x39, 0xdf, 0xc2, 0x04, 0x06, 0xe7, 0xe9, 0x39, 0xc3, 0x80, - 0xa1, 0x7c, 0x84, 0xf3, 0x33, 0x86, 0x97, 0x61, 0x05, 0x45, 0x73, 0x30, 0xd1, 0x74, 0x3d, 0x7a, - 0xf8, 0xec, 0x98, 0xac, 0xb8, 0x52, 0xb7, 0xac, 0x98, 0x60, 0x9c, 0xc4, 0x47, 0xae, 0x16, 0x7a, - 0x92, 0x7f, 0xdd, 0xab, 0x07, 0xda, 0x75, 0xb3, 0xa6, 0xc5, 0x89, 0x1a, 0xc5, 0x8c, 0x30, 0x94, - 0x2b, 0x9a, 0x9c, 0xa8, 0xd8, 0xbb, 0x9c, 0x68, 0x34, 0x5b, 0x46, 0x34, 0xf3, 0x2a, 0x8c, 0xdd, - 0xb7, 0x9e, 0xc5, 0xfe, 0x66, 0x11, 0x1e, 0xe9, 0xb0, 0xed, 0xf9, 0x59, 0x6f, 0xcc, 0x81, 0x76, - 0xd6, 0xa7, 0xe6, 0xa1, 0x02, 0x47, 0xd7, 0xdb, 0x8d, 0xc6, 0x0e, 0x73, 0xc0, 0x23, 0x75, 0x89, - 0x21, 0x78, 0x4a, 0x29, 0x1c, 0x39, 0xba, 0x9c, 0x81, 0x83, 0x33, 0x6b, 0xd2, 0x27, 0x16, 0xbd, - 0x49, 0x76, 0x14, 0xa9, 0xc4, 0x13, 0x0b, 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0xcb, 0x30, 0xe5, 0x6c, - 0x3b, 0x2e, 0x4f, 0x7a, 0x22, 0x09, 0xf0, 0x37, 0x96, 0x92, 0x45, 0xcf, 0x25, 0x11, 0x70, 0xba, - 0x4e, 0x8e, 0x4a, 0xa8, 0x78, 0x5f, 0x2a, 0x21, 0x33, 0x08, 0xe2, 0x40, 0x7e, 0x10, 0xc4, 0xce, - 0xe7, 0x62, 0xd7, 0x7c, 0x91, 0xef, 0xc0, 0xd8, 0x41, 0x2d, 0xc7, 0x9f, 0x82, 0xc1, 0x40, 0x64, - 0xe2, 0x4f, 0x78, 0xbb, 0xcb, 0x3c, 0xe5, 0x12, 0x6e, 0xff, 0x6f, 0x16, 0x28, 0x59, 0xb2, 0x19, - 0xef, 0xfc, 0x55, 0x66, 0x06, 0xcf, 0xa5, 0xe0, 0x5a, 0x88, 0xb3, 0x63, 0x9a, 0x19, 0x7c, 0x0c, - 0xc4, 0x26, 0x2e, 0x5f, 0x6e, 0x61, 0x1c, 0x59, 0xc3, 0x78, 0x40, 0x08, 0x0d, 0xa4, 0xc2, 0x40, - 0x9f, 0x80, 0xc1, 0xba, 0xbb, 0xed, 0x86, 0x42, 0x8e, 0x76, 0x60, 0x1d, 0x60, 0xfc, 0x7d, 0x8b, - 0x9c, 0x0c, 0x96, 0xf4, 0xec, 0x9f, 0xb2, 0x40, 0xa9, 0x4e, 0xaf, 0x10, 0xa7, 0x11, 0x6d, 0xa2, - 0x37, 0x00, 0x24, 0x05, 0x25, 0x7b, 0x93, 0x06, 0x5d, 0x80, 0x15, 0x64, 0xdf, 0xf8, 0x87, 0xb5, - 0x3a, 0xe8, 0x75, 0x18, 0xd8, 0x64, 0xb4, 0xc4, 0xb7, 0x9d, 0x53, 0xaa, 0x2e, 0x56, 0xba, 0xbf, - 0x5b, 0x3a, 0x6a, 0xb6, 0x29, 0x6f, 0x31, 0x5e, 0xcb, 0xfe, 0x89, 0x42, 0x3c, 0xa7, 0x6f, 0xb5, - 0xfd, 0xc8, 0x39, 0x04, 0x4e, 0xe4, 0xb2, 0xc1, 0x89, 0x3c, 0xd1, 0x49, 0x37, 0xcc, 0xba, 0x94, - 0xcb, 0x81, 0x5c, 0x4f, 0x70, 0x20, 0x4f, 0x76, 0x27, 0xd5, 0x99, 0xf3, 0xf8, 0x6f, 0x2c, 0x98, - 0x32, 0xf0, 0x0f, 0xe1, 0x02, 0x5c, 0x36, 0x2f, 0xc0, 0x47, 0xbb, 0x7e, 0x43, 0xce, 0xc5, 0xf7, - 0xa3, 0xc5, 0x44, 0xdf, 0xd9, 0x85, 0xf7, 0x2e, 0xf4, 0x6d, 0x3a, 0x41, 0x5d, 0xbc, 0xeb, 0x2f, - 0xf4, 0x34, 0xd6, 0xb3, 0x57, 0x9c, 0x40, 0x18, 0x83, 0x3c, 0x2b, 0x47, 0x9d, 0x16, 0x75, 0x35, - 0x04, 0x61, 0x4d, 0xa1, 0x4b, 0x30, 0x10, 0xd6, 0xfc, 0x96, 0xf2, 0x29, 0x64, 0x49, 0xd4, 0xab, - 0xac, 0x64, 0x7f, 0xb7, 0x84, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, 0xe8, 0x6d, 0x18, 0x63, 0xbf, - 0x94, 0x65, 0x66, 0x31, 0x5f, 0x02, 0x53, 0xd5, 0x11, 0xb9, 0xd9, 0xb2, 0x51, 0x84, 0x4d, 0x52, - 0x33, 0x1b, 0x30, 0xac, 0x3e, 0xeb, 0xa1, 0x6a, 0xfe, 0xff, 0xba, 0x08, 0x47, 0x32, 0xd6, 0x1c, - 0x0a, 0x8d, 0x99, 0xb8, 0xd8, 0xe3, 0x52, 0x7d, 0x8f, 0x73, 0x11, 0xb2, 0x07, 0x60, 0x5d, 0xac, - 0xad, 0x9e, 0x1b, 0xbd, 0x11, 0x92, 0x64, 0xa3, 0xb4, 0xa8, 0x7b, 0xa3, 0xb4, 0xb1, 0x43, 0x1b, - 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x43, 0x9d, 0xd3, 0x3f, 0xe9, 0x83, 0xa3, 0x59, 0xe6, 0x2a, 0xe8, - 0x73, 0x30, 0xc0, 0x9c, 0xde, 0xa4, 0xe0, 0xec, 0xc5, 0x5e, 0x0d, 0x5d, 0x66, 0x99, 0xdf, 0x9c, - 0x08, 0x99, 0x3b, 0x2b, 0x8f, 0x23, 0x5e, 0xd8, 0x75, 0x98, 0x45, 0x9b, 0x2c, 0x94, 0x95, 0xb8, - 0x3d, 0xe5, 0xf1, 0xf1, 0x91, 0x9e, 0x3b, 0x20, 0xee, 0xdf, 0x30, 0x61, 0xf5, 0x25, 0x8b, 0xbb, - 0x5b, 0x7d, 0xc9, 0x96, 0x51, 0x19, 0x06, 0x6a, 0xdc, 0x9c, 0xa8, 0xd8, 0xfd, 0x08, 0xe3, 0xb6, - 0x44, 0xea, 0x00, 0x16, 0x36, 0x44, 0x82, 0xc0, 0x8c, 0x0b, 0x23, 0xda, 0xc0, 0x3c, 0xd4, 0xc5, - 0xb3, 0x45, 0x2f, 0x3e, 0x6d, 0x08, 0x1e, 0xea, 0x02, 0xfa, 0x59, 0xed, 0xee, 0x17, 0xe7, 0xc1, - 0x87, 0x0d, 0xde, 0xe9, 0x54, 0xc2, 0x15, 0x31, 0xb1, 0xaf, 0x18, 0x2f, 0x55, 0x35, 0x63, 0xcd, - 0xe7, 0x26, 0xcc, 0x32, 0x2f, 0xfc, 0xce, 0xf1, 0xe5, 0xed, 0x9f, 0xb3, 0x20, 0xe1, 0x2c, 0xa6, - 0xc4, 0x9d, 0x56, 0xae, 0xb8, 0xf3, 0x2c, 0xf4, 0x05, 0x7e, 0x43, 0xf2, 0x53, 0x0a, 0x03, 0xfb, - 0x0d, 0x82, 0x19, 0x84, 0x62, 0x44, 0xb1, 0x10, 0x6b, 0x54, 0x7f, 0xa0, 0x8b, 0xa7, 0xf7, 0x63, - 0xd0, 0xdf, 0x20, 0xdb, 0xa4, 0x91, 0xcc, 0x1b, 0x7b, 0x8d, 0x16, 0x62, 0x0e, 0xb3, 0x7f, 0xaf, - 0x0f, 0x4e, 0x77, 0x8c, 0x78, 0x47, 0x19, 0xcc, 0x0d, 0x27, 0x22, 0x77, 0x9c, 0x9d, 0x64, 0xbe, - 0xc4, 0xcb, 0xbc, 0x18, 0x4b, 0x38, 0x73, 0xdc, 0xe6, 0x39, 0x80, 0x12, 0xc2, 0x61, 0x91, 0xfa, - 0x47, 0x40, 0x4d, 0x61, 0x63, 0xf1, 0x41, 0x08, 0x1b, 0x9f, 0x07, 0x08, 0xc3, 0x06, 0xb7, 0x09, - 0xad, 0x0b, 0x8f, 0xf0, 0x38, 0x57, 0x54, 0xf5, 0x9a, 0x80, 0x60, 0x0d, 0x0b, 0x2d, 0xc2, 0x64, - 0x2b, 0xf0, 0x23, 0x2e, 0x6b, 0x5f, 0xe4, 0x66, 0xd3, 0xfd, 0x66, 0xb0, 0xb1, 0x4a, 0x02, 0x8e, - 0x53, 0x35, 0xd0, 0x4b, 0x30, 0x22, 0x02, 0x90, 0x55, 0x7c, 0xbf, 0x21, 0xc4, 0x7b, 0xca, 0x92, - 0xb8, 0x1a, 0x83, 0xb0, 0x8e, 0xa7, 0x55, 0x63, 0x02, 0xfc, 0xc1, 0xcc, 0x6a, 0x5c, 0x88, 0xaf, - 0xe1, 0x25, 0x92, 0x15, 0x0c, 0xf5, 0x94, 0xac, 0x20, 0x16, 0x78, 0x0e, 0xf7, 0xac, 0x4f, 0x86, - 0xae, 0x22, 0xc2, 0xaf, 0xf5, 0xc1, 0x11, 0xb1, 0x70, 0x1e, 0xf6, 0x72, 0xb9, 0x91, 0x5e, 0x2e, - 0x0f, 0x42, 0x24, 0xfa, 0xc1, 0x9a, 0x39, 0xec, 0x35, 0xf3, 0x93, 0x16, 0x98, 0x3c, 0x24, 0xfa, - 0x8f, 0x72, 0x13, 0xce, 0xbe, 0x94, 0xcb, 0x93, 0xc6, 0x91, 0xcc, 0xdf, 0x5b, 0xea, 0x59, 0xfb, - 0x7f, 0xb1, 0xe0, 0xd1, 0xae, 0x14, 0xd1, 0x12, 0x0c, 0x33, 0x46, 0x57, 0x7b, 0x17, 0x3f, 0xa9, - 0xdc, 0x2a, 0x24, 0x20, 0x87, 0xef, 0x8e, 0x6b, 0xa2, 0xa5, 0x54, 0x66, 0xdf, 0xa7, 0x32, 0x32, - 0xfb, 0x1e, 0x33, 0x86, 0xe7, 0x3e, 0x53, 0xfb, 0x7e, 0x89, 0xde, 0x38, 0xa6, 0x6f, 0xe6, 0x47, - 0x0c, 0x71, 0xae, 0x9d, 0x10, 0xe7, 0x22, 0x13, 0x5b, 0xbb, 0x43, 0xde, 0x80, 0x49, 0x16, 0x99, - 0x94, 0x39, 0xf9, 0x08, 0xa7, 0xce, 0x42, 0x6c, 0xc8, 0x7f, 0x2d, 0x01, 0xc3, 0x29, 0x6c, 0xfb, - 0x1f, 0x8a, 0x30, 0xc0, 0xb7, 0xdf, 0x21, 0x3c, 0x7c, 0x9f, 0x81, 0x61, 0xb7, 0xd9, 0x6c, 0xf3, - 0x64, 0xad, 0xfd, 0xb1, 0x59, 0x78, 0x59, 0x16, 0xe2, 0x18, 0x8e, 0x96, 0x85, 0x26, 0xa1, 0x43, - 0xf0, 0x73, 0xde, 0xf1, 0xd9, 0x45, 0x27, 0x72, 0x38, 0x17, 0xa7, 0xee, 0xd9, 0x58, 0xe7, 0x80, - 0x3e, 0x0d, 0x10, 0x46, 0x81, 0xeb, 0x6d, 0xd0, 0x32, 0x91, 0x21, 0xe3, 0xe9, 0x0e, 0xd4, 0xaa, - 0x0a, 0x99, 0xd3, 0x8c, 0xcf, 0x1c, 0x05, 0xc0, 0x1a, 0x45, 0x34, 0x6b, 0xdc, 0xf4, 0x33, 0x89, - 0xb9, 0x03, 0x4e, 0x35, 0x9e, 0xb3, 0x99, 0x97, 0x61, 0x58, 0x11, 0xef, 0x26, 0x57, 0x1c, 0xd5, - 0x19, 0xb6, 0x8f, 0xc1, 0x44, 0xa2, 0x6f, 0x07, 0x12, 0x4b, 0xfe, 0xbe, 0x05, 0x13, 0xbc, 0x33, - 0x4b, 0xde, 0xb6, 0xb8, 0x0d, 0xee, 0xc1, 0xd1, 0x46, 0xc6, 0xa9, 0x2c, 0xa6, 0xbf, 0xf7, 0x53, - 0x5c, 0x89, 0x21, 0xb3, 0xa0, 0x38, 0xb3, 0x0d, 0x74, 0x9e, 0xee, 0x38, 0x7a, 0xea, 0x3a, 0x0d, - 0x11, 0x99, 0x64, 0x94, 0xef, 0x36, 0x5e, 0x86, 0x15, 0xd4, 0xfe, 0x5b, 0x0b, 0xa6, 0x78, 0xcf, - 0xaf, 0x92, 0x1d, 0x75, 0x36, 0x7d, 0x27, 0xfb, 0x2e, 0xd2, 0x84, 0x17, 0x72, 0xd2, 0x84, 0xeb, - 0x9f, 0x56, 0xec, 0xf8, 0x69, 0x5f, 0xb5, 0x40, 0xac, 0x90, 0x43, 0x90, 0xb4, 0x7c, 0x9f, 0x29, - 0x69, 0x99, 0xc9, 0xdf, 0x04, 0x39, 0x22, 0x96, 0x7f, 0xb3, 0x60, 0x92, 0x23, 0xc4, 0x56, 0x10, - 0xdf, 0xd1, 0x79, 0x98, 0x37, 0xbf, 0x28, 0xd3, 0xac, 0xf5, 0x2a, 0xd9, 0x59, 0xf3, 0x2b, 0x4e, - 0xb4, 0x99, 0xfd, 0x51, 0xc6, 0x64, 0xf5, 0x75, 0x9c, 0xac, 0xba, 0xdc, 0x40, 0x46, 0x42, 0xc8, - 0x2e, 0x02, 0xe0, 0x83, 0x26, 0x84, 0xb4, 0xff, 0xd1, 0x02, 0xc4, 0x9b, 0x31, 0x18, 0x37, 0xca, - 0x0e, 0xb1, 0x52, 0xed, 0xa2, 0x8b, 0x8f, 0x26, 0x05, 0xc1, 0x1a, 0xd6, 0x03, 0x19, 0x9e, 0x84, - 0x29, 0x4b, 0xb1, 0xbb, 0x29, 0xcb, 0x01, 0x46, 0xf4, 0xab, 0x83, 0x90, 0x74, 0xeb, 0x44, 0x37, - 0x61, 0xb4, 0xe6, 0xb4, 0x9c, 0xdb, 0x6e, 0xc3, 0x8d, 0x5c, 0x12, 0x76, 0xb2, 0x73, 0x5b, 0xd0, - 0xf0, 0x84, 0xf1, 0x81, 0x56, 0x82, 0x0d, 0x3a, 0x68, 0x16, 0xa0, 0x15, 0xb8, 0xdb, 0x6e, 0x83, - 0x6c, 0x30, 0x81, 0x10, 0x8b, 0x85, 0xc4, 0x8d, 0xee, 0x64, 0x29, 0xd6, 0x30, 0x32, 0x42, 0x90, - 0x14, 0x1f, 0x72, 0x08, 0x12, 0x38, 0xb4, 0x10, 0x24, 0x7d, 0x07, 0x0a, 0x41, 0x32, 0x74, 0xe0, - 0x10, 0x24, 0xfd, 0x3d, 0x85, 0x20, 0xc1, 0x70, 0x5c, 0xf2, 0x9e, 0xf4, 0xff, 0xb2, 0xdb, 0x20, - 0xe2, 0xc1, 0xc1, 0x03, 0x38, 0xcd, 0xec, 0xed, 0x96, 0x8e, 0xe3, 0x4c, 0x0c, 0x9c, 0x53, 0x13, - 0x7d, 0x1c, 0xa6, 0x9d, 0x46, 0xc3, 0xbf, 0xa3, 0x26, 0x75, 0x29, 0xac, 0x39, 0x8d, 0x38, 0xae, - 0xdf, 0xd0, 0xfc, 0xa9, 0xbd, 0xdd, 0xd2, 0xf4, 0x5c, 0x0e, 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x83, - 0xe1, 0x56, 0xe0, 0xd7, 0x56, 0x34, 0xdf, 0xf3, 0x33, 0x74, 0x00, 0x2b, 0xb2, 0x70, 0x7f, 0xb7, - 0x34, 0xa6, 0xfe, 0xb0, 0x0b, 0x3f, 0xae, 0x90, 0x11, 0xdd, 0x63, 0xe4, 0x61, 0x47, 0xf7, 0x18, - 0x7d, 0xc0, 0xd1, 0x3d, 0xec, 0x2d, 0x38, 0x52, 0x25, 0x81, 0xeb, 0x34, 0xdc, 0x7b, 0x94, 0x27, - 0x97, 0x67, 0xe0, 0x1a, 0x0c, 0x07, 0x89, 0x53, 0xbf, 0xa7, 0xa0, 0xe7, 0x9a, 0x5c, 0x46, 0x9e, - 0xf2, 0x31, 0x21, 0xfb, 0xff, 0xb7, 0x60, 0x50, 0xb8, 0x8a, 0x1e, 0x02, 0x67, 0x3a, 0x67, 0xa8, - 0x64, 0x4a, 0xd9, 0x93, 0xc2, 0x3a, 0x93, 0xab, 0x8c, 0x29, 0x27, 0x94, 0x31, 0x8f, 0x76, 0x22, - 0xd2, 0x59, 0x0d, 0xf3, 0x9f, 0x15, 0xe9, 0x0b, 0xc1, 0x08, 0x5a, 0xf0, 0xf0, 0x87, 0x60, 0x15, - 0x06, 0x43, 0xe1, 0x34, 0x5f, 0xc8, 0xf7, 0xe5, 0x49, 0x4e, 0x62, 0x6c, 0x03, 0x29, 0xdc, 0xe4, - 0x25, 0x91, 0x4c, 0x6f, 0xfc, 0xe2, 0x43, 0xf4, 0xc6, 0xef, 0x16, 0xd6, 0xa1, 0xef, 0x41, 0x84, - 0x75, 0xb0, 0xbf, 0xce, 0x6e, 0x67, 0xbd, 0xfc, 0x10, 0x18, 0xb7, 0xcb, 0xe6, 0x3d, 0x6e, 0x77, - 0x58, 0x59, 0xa2, 0x53, 0x39, 0x0c, 0xdc, 0xef, 0x5a, 0x70, 0x3a, 0xe3, 0xab, 0x34, 0x6e, 0xee, - 0x59, 0x18, 0x72, 0xda, 0x75, 0x57, 0xed, 0x65, 0x4d, 0x5b, 0x3c, 0x27, 0xca, 0xb1, 0xc2, 0x40, - 0x0b, 0x30, 0x45, 0xee, 0xb6, 0x5c, 0xae, 0x86, 0xd7, 0x4d, 0xc7, 0x8b, 0xdc, 0xbf, 0x78, 0x29, - 0x09, 0xc4, 0x69, 0x7c, 0x15, 0x1a, 0xae, 0x98, 0x1b, 0x1a, 0xee, 0x37, 0x2d, 0x18, 0x51, 0x6e, - 0xe3, 0x0f, 0x7d, 0xb4, 0xdf, 0x30, 0x47, 0xfb, 0x91, 0x0e, 0xa3, 0x9d, 0x33, 0xcc, 0x7f, 0x53, - 0x50, 0xfd, 0xad, 0xf8, 0x41, 0xd4, 0x03, 0x97, 0x78, 0xff, 0x6e, 0x2f, 0x17, 0x61, 0xc4, 0x69, - 0xb5, 0x24, 0x40, 0xda, 0x2f, 0xb2, 0x14, 0x16, 0x71, 0x31, 0xd6, 0x71, 0x94, 0x17, 0x4e, 0x31, - 0xd7, 0x0b, 0xa7, 0x0e, 0x10, 0x39, 0xc1, 0x06, 0x89, 0x68, 0x99, 0x30, 0xb7, 0xce, 0x3f, 0x6f, - 0xda, 0x91, 0xdb, 0x98, 0x75, 0xbd, 0x28, 0x8c, 0x82, 0xd9, 0xb2, 0x17, 0x5d, 0x0f, 0xf8, 0x33, - 0x55, 0x0b, 0xc0, 0xa8, 0x68, 0x61, 0x8d, 0xae, 0x0c, 0x91, 0xc2, 0xda, 0xe8, 0x37, 0x0d, 0x61, - 0x56, 0x45, 0x39, 0x56, 0x18, 0xf6, 0xcb, 0xec, 0xf6, 0x61, 0x63, 0x7a, 0xb0, 0xc0, 0x82, 0xff, - 0x34, 0xaa, 0x66, 0x83, 0xa9, 0x84, 0x17, 0xf5, 0xf0, 0x85, 0x9d, 0x0f, 0x7b, 0xda, 0xb0, 0xee, - 0xcf, 0x1a, 0xc7, 0x38, 0x44, 0x9f, 0x4c, 0x19, 0x37, 0x3d, 0xd7, 0xe5, 0xd6, 0x38, 0x80, 0x39, - 0x13, 0xcb, 0x67, 0xc7, 0xb2, 0x7d, 0x95, 0x2b, 0x62, 0x5f, 0x68, 0xf9, 0xec, 0x04, 0x00, 0xc7, - 0x38, 0x94, 0x61, 0x53, 0x7f, 0xc2, 0x69, 0x14, 0x87, 0x3d, 0x57, 0xd8, 0x21, 0xd6, 0x30, 0xd0, - 0x05, 0x21, 0xb4, 0xe0, 0xba, 0x87, 0x47, 0x12, 0x42, 0x0b, 0x39, 0x5c, 0x9a, 0xa4, 0xe9, 0x22, - 0x8c, 0x90, 0xbb, 0x11, 0x09, 0x3c, 0xa7, 0x41, 0x5b, 0xe8, 0x8f, 0xa3, 0xeb, 0x2e, 0xc5, 0xc5, - 0x58, 0xc7, 0x41, 0x6b, 0x30, 0x11, 0x72, 0x59, 0x9e, 0x4a, 0xb6, 0xc1, 0x65, 0xa2, 0x4f, 0x2b, - 0x87, 0x7d, 0x13, 0xbc, 0xcf, 0x8a, 0xf8, 0xe9, 0x24, 0xc3, 0x98, 0x24, 0x49, 0xa0, 0xd7, 0x61, - 0xbc, 0xe1, 0x3b, 0xf5, 0x79, 0xa7, 0xe1, 0x78, 0x35, 0x36, 0x3e, 0x43, 0x46, 0x2c, 0xcb, 0xf1, - 0x6b, 0x06, 0x14, 0x27, 0xb0, 0x29, 0x83, 0xa8, 0x97, 0x88, 0x04, 0x31, 0x8e, 0xb7, 0x41, 0xc2, - 0xe9, 0x61, 0xf6, 0x55, 0x8c, 0x41, 0xbc, 0x96, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x4b, 0x30, 0x2a, - 0x3f, 0x5f, 0x8b, 0xfa, 0x13, 0x3b, 0x34, 0x69, 0x30, 0x6c, 0x60, 0xa2, 0x10, 0x8e, 0xc9, 0xff, - 0x6b, 0x81, 0xb3, 0xbe, 0xee, 0xd6, 0x44, 0x28, 0x0c, 0xee, 0xfc, 0xfd, 0x31, 0xe9, 0x69, 0xba, - 0x94, 0x85, 0xb4, 0xbf, 0x5b, 0x3a, 0x25, 0x46, 0x2d, 0x13, 0x8e, 0xb3, 0x69, 0xa3, 0x15, 0x38, - 0xc2, 0x6d, 0x60, 0x16, 0x36, 0x49, 0x6d, 0x4b, 0x6e, 0x38, 0xc6, 0x35, 0x6a, 0x8e, 0x3f, 0x57, - 0xd2, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0xa6, 0x5b, 0xed, 0xdb, 0x0d, 0x37, 0xdc, 0x5c, 0xf5, - 0x23, 0x66, 0x42, 0x36, 0x57, 0xaf, 0x07, 0x24, 0xe4, 0xbe, 0xc1, 0xec, 0xea, 0x95, 0x91, 0x9a, - 0x2a, 0x39, 0x78, 0x38, 0x97, 0x02, 0xba, 0x07, 0xc7, 0x12, 0x0b, 0x41, 0x84, 0x5c, 0x19, 0xcf, - 0x4f, 0xb5, 0x55, 0xcd, 0xaa, 0x20, 0xa2, 0x17, 0x65, 0x81, 0x70, 0x76, 0x13, 0xe8, 0x15, 0x00, - 0xb7, 0xb5, 0xec, 0x34, 0xdd, 0x06, 0x7d, 0x8e, 0x1e, 0x61, 0x6b, 0x84, 0x3e, 0x4d, 0xa0, 0x5c, - 0x91, 0xa5, 0xf4, 0x6c, 0x16, 0xff, 0x76, 0xb0, 0x86, 0x8d, 0xae, 0xc1, 0xb8, 0xf8, 0xb7, 0x23, - 0xa6, 0x74, 0x4a, 0x65, 0x65, 0x1d, 0x97, 0x35, 0xd4, 0x3c, 0x26, 0x4a, 0x70, 0xa2, 0x2e, 0xda, - 0x80, 0xd3, 0x32, 0x25, 0xac, 0xbe, 0x3e, 0xe5, 0x1c, 0x84, 0x2c, 0xbf, 0xd5, 0x10, 0xf7, 0x29, - 0x9a, 0xeb, 0x84, 0x88, 0x3b, 0xd3, 0xa1, 0xf7, 0xba, 0xbe, 0xcc, 0xb9, 0xc7, 0xf8, 0xb1, 0x38, - 0x22, 0xe8, 0xb5, 0x24, 0x10, 0xa7, 0xf1, 0x91, 0x0f, 0xc7, 0x5c, 0x2f, 0x6b, 0x55, 0x1f, 0x67, - 0x84, 0x3e, 0xca, 0x9d, 0xe5, 0x3b, 0xaf, 0xe8, 0x4c, 0x38, 0xce, 0xa6, 0x8b, 0xca, 0x70, 0x24, - 0xe2, 0x05, 0x8b, 0x6e, 0xc8, 0xd3, 0xe7, 0xd0, 0x67, 0xdf, 0x09, 0xd6, 0xdc, 0x09, 0xba, 0x9a, - 0xd7, 0xd2, 0x60, 0x9c, 0x55, 0xe7, 0xbd, 0x19, 0x80, 0x7e, 0xc3, 0xa2, 0xb5, 0x35, 0x46, 0x1f, - 0x7d, 0x06, 0x46, 0xf5, 0xf1, 0x11, 0x4c, 0xcb, 0xb9, 0x6c, 0x3e, 0x58, 0x3b, 0x5e, 0xf8, 0x33, - 0x41, 0x1d, 0x21, 0x3a, 0x0c, 0x1b, 0x14, 0x51, 0x2d, 0x23, 0xc8, 0xc5, 0x85, 0xde, 0x98, 0xa2, - 0xde, 0xed, 0x1f, 0x09, 0x64, 0xef, 0x1c, 0x74, 0x0d, 0x86, 0x6a, 0x0d, 0x97, 0x78, 0x51, 0xb9, - 0xd2, 0x29, 0x50, 0xeb, 0x82, 0xc0, 0x11, 0x5b, 0x51, 0x64, 0xbd, 0xe2, 0x65, 0x58, 0x51, 0xb0, - 0x2f, 0xc1, 0x48, 0xb5, 0x41, 0x48, 0x8b, 0xfb, 0x71, 0xa1, 0xa7, 0xd8, 0xc3, 0x84, 0xb1, 0x96, - 0x16, 0x63, 0x2d, 0xf5, 0x37, 0x07, 0x63, 0x2a, 0x25, 0xdc, 0xfe, 0xb3, 0x02, 0x94, 0xba, 0x24, - 0x5f, 0x4b, 0xe8, 0xdb, 0xac, 0x9e, 0xf4, 0x6d, 0x73, 0x30, 0x11, 0xff, 0xd3, 0x45, 0x79, 0xca, - 0x18, 0xfa, 0xa6, 0x09, 0xc6, 0x49, 0xfc, 0x9e, 0xfd, 0x5a, 0x74, 0x95, 0x5d, 0x5f, 0x57, 0xcf, - 0x2c, 0x43, 0x55, 0xdf, 0xdf, 0xfb, 0xdb, 0x3b, 0x57, 0xed, 0x6a, 0x7f, 0xbd, 0x00, 0xc7, 0xd4, - 0x10, 0x7e, 0xef, 0x0e, 0xdc, 0x8d, 0xf4, 0xc0, 0x3d, 0x00, 0xa5, 0xb5, 0x7d, 0x1d, 0x06, 0x78, - 0xf4, 0xd8, 0x1e, 0x78, 0xfe, 0xc7, 0xcc, 0x40, 0xfe, 0x8a, 0xcd, 0x34, 0x82, 0xf9, 0xff, 0x98, - 0x05, 0x13, 0x09, 0x07, 0x49, 0x84, 0x35, 0x2f, 0xfa, 0xfb, 0xe1, 0xcb, 0xb3, 0x38, 0xfe, 0xb3, - 0xd0, 0xb7, 0xe9, 0x2b, 0x23, 0x65, 0x85, 0x71, 0xc5, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0xdf, 0x59, - 0xd0, 0xbf, 0xe6, 0xb8, 0x5e, 0x24, 0xb5, 0x1f, 0x56, 0x8e, 0xf6, 0xa3, 0x97, 0xef, 0x42, 0x2f, - 0xc1, 0x00, 0x59, 0x5f, 0x27, 0xb5, 0x48, 0xcc, 0xaa, 0x8c, 0xa6, 0x31, 0xb0, 0xc4, 0x4a, 0x29, - 0x13, 0xca, 0x1a, 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0xb7, 0x60, 0x38, 0x72, 0x9b, 0x64, 0xae, 0x5e, - 0x17, 0x36, 0x01, 0xf7, 0x11, 0x02, 0x66, 0x4d, 0x12, 0xc0, 0x31, 0x2d, 0xfb, 0xcb, 0x05, 0x80, - 0x38, 0x5a, 0x5d, 0xb7, 0x4f, 0x9c, 0x4f, 0x69, 0x8b, 0xcf, 0x65, 0x68, 0x8b, 0x51, 0x4c, 0x30, - 0x43, 0x55, 0xac, 0x86, 0xa9, 0xd8, 0xd3, 0x30, 0xf5, 0x1d, 0x64, 0x98, 0x16, 0x60, 0x2a, 0x8e, - 0xb6, 0x67, 0x06, 0x1b, 0x65, 0xf7, 0xf7, 0x5a, 0x12, 0x88, 0xd3, 0xf8, 0x36, 0x81, 0xb3, 0x2a, - 0xe8, 0x98, 0xb8, 0x0b, 0x99, 0x2b, 0x81, 0xae, 0x7d, 0xef, 0x32, 0x4e, 0xb1, 0x3a, 0xbc, 0x90, - 0xab, 0x0e, 0xff, 0x45, 0x0b, 0x8e, 0x26, 0xdb, 0x61, 0x7e, 0xf7, 0x5f, 0xb4, 0xe0, 0x58, 0x9c, - 0x7b, 0x28, 0x6d, 0x82, 0xf0, 0x62, 0xc7, 0x40, 0x6a, 0x39, 0x3d, 0x8e, 0xc3, 0xb6, 0xac, 0x64, - 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0xff, 0x5f, 0x1f, 0x4c, 0xe7, 0x45, 0x60, 0x63, 0x9e, 0x46, 0xce, - 0xdd, 0xea, 0x16, 0xb9, 0x23, 0xfc, 0x39, 0x62, 0x4f, 0x23, 0x5e, 0x8c, 0x25, 0x3c, 0x99, 0x6e, - 0xaa, 0xd0, 0x63, 0xba, 0xa9, 0x4d, 0x98, 0xba, 0xb3, 0x49, 0xbc, 0x1b, 0x5e, 0xe8, 0x44, 0x6e, - 0xb8, 0xee, 0x32, 0x05, 0x3a, 0x5f, 0x37, 0xaf, 0x48, 0xaf, 0x8b, 0x5b, 0x49, 0x84, 0xfd, 0xdd, - 0xd2, 0x69, 0xa3, 0x20, 0xee, 0x32, 0x3f, 0x48, 0x70, 0x9a, 0x68, 0x3a, 0x5b, 0x57, 0xdf, 0x43, - 0xce, 0xd6, 0xd5, 0x74, 0x85, 0xd9, 0x8d, 0x74, 0x23, 0x61, 0xcf, 0xd6, 0x15, 0x55, 0x8a, 0x35, - 0x0c, 0xf4, 0x29, 0x40, 0x7a, 0xba, 0x45, 0x23, 0x00, 0xee, 0x73, 0x7b, 0xbb, 0x25, 0xb4, 0x9a, - 0x82, 0xee, 0xef, 0x96, 0x8e, 0xd0, 0xd2, 0xb2, 0x47, 0x9f, 0xbf, 0x71, 0xd4, 0xc0, 0x0c, 0x42, - 0xe8, 0x16, 0x4c, 0xd2, 0x52, 0xb6, 0xa3, 0x64, 0x74, 0x5d, 0xfe, 0x64, 0x7d, 0x66, 0x6f, 0xb7, - 0x34, 0xb9, 0x9a, 0x80, 0xe5, 0x91, 0x4e, 0x11, 0xc9, 0x48, 0xda, 0x35, 0xd4, 0x6b, 0xd2, 0x2e, - 0xfb, 0x8b, 0x16, 0x9c, 0xa4, 0x17, 0x5c, 0xfd, 0x5a, 0x8e, 0x16, 0xdd, 0x69, 0xb9, 0x5c, 0x4f, - 0x23, 0xae, 0x1a, 0x26, 0xab, 0xab, 0x94, 0xb9, 0x96, 0x46, 0x41, 0xe9, 0x09, 0xbf, 0xe5, 0x7a, - 0xf5, 0xe4, 0x09, 0x7f, 0xd5, 0xf5, 0xea, 0x98, 0x41, 0xd4, 0x95, 0x55, 0xcc, 0x8d, 0xd6, 0xff, - 0x35, 0xba, 0x57, 0x69, 0x5f, 0xbe, 0xa3, 0xdd, 0x40, 0xcf, 0xe8, 0x3a, 0x55, 0x61, 0x3e, 0x99, - 0xab, 0x4f, 0xfd, 0x82, 0x05, 0xc2, 0xfb, 0xbd, 0x87, 0x3b, 0xf9, 0x6d, 0x18, 0xdd, 0x4e, 0xa7, - 0xa2, 0x3d, 0x9b, 0x1f, 0x0e, 0x40, 0x24, 0xa0, 0x55, 0x2c, 0xba, 0x91, 0x76, 0xd6, 0xa0, 0x65, - 0xd7, 0x41, 0x40, 0x17, 0x09, 0xd3, 0x6a, 0x74, 0xef, 0xcd, 0xf3, 0x00, 0x75, 0x86, 0xcb, 0xf2, - 0xd3, 0x17, 0x4c, 0x8e, 0x6b, 0x51, 0x41, 0xb0, 0x86, 0x65, 0xff, 0x7a, 0x11, 0x46, 0x64, 0xea, - 0xd3, 0xb6, 0xd7, 0x8b, 0xec, 0x51, 0x67, 0x9c, 0x0a, 0x5d, 0x19, 0xa7, 0x77, 0x60, 0x2a, 0x20, - 0xb5, 0x76, 0x10, 0xba, 0xdb, 0x44, 0x82, 0xc5, 0x26, 0x99, 0xe5, 0xc9, 0x22, 0x12, 0xc0, 0x7d, - 0x16, 0x22, 0x2b, 0x51, 0xc8, 0x94, 0xc6, 0x69, 0x42, 0xe8, 0x02, 0x0c, 0x33, 0xd1, 0x7b, 0x25, - 0x16, 0x08, 0x2b, 0xc1, 0xd7, 0x8a, 0x04, 0xe0, 0x18, 0x87, 0x3d, 0x0e, 0xda, 0xb7, 0x19, 0x7a, - 0xc2, 0x13, 0xbc, 0xca, 0x8b, 0xb1, 0x84, 0xa3, 0x8f, 0xc3, 0x24, 0xaf, 0x17, 0xf8, 0x2d, 0x67, - 0x83, 0xab, 0x04, 0xfb, 0x55, 0x78, 0x9d, 0xc9, 0x95, 0x04, 0x6c, 0x7f, 0xb7, 0x74, 0x34, 0x59, - 0xc6, 0xba, 0x9d, 0xa2, 0xc2, 0x2c, 0xff, 0x78, 0x23, 0xf4, 0xce, 0x48, 0x19, 0x0c, 0xc6, 0x20, - 0xac, 0xe3, 0xd9, 0xff, 0x6a, 0xc1, 0x94, 0x36, 0x55, 0x3d, 0xe7, 0xeb, 0x30, 0x06, 0xa9, 0xd0, - 0xc3, 0x20, 0x1d, 0x2c, 0xda, 0x43, 0xe6, 0x0c, 0xf7, 0x3d, 0xa0, 0x19, 0xb6, 0x3f, 0x03, 0x28, - 0x9d, 0x57, 0x17, 0xbd, 0xc9, 0x0d, 0xf9, 0xdd, 0x80, 0xd4, 0x3b, 0x29, 0xfc, 0xf5, 0xc8, 0x39, - 0xd2, 0x73, 0x95, 0xd7, 0xc2, 0xaa, 0xbe, 0xfd, 0xe3, 0x7d, 0x30, 0x99, 0x8c, 0xd5, 0x81, 0xae, - 0xc0, 0x00, 0xe7, 0xd2, 0x05, 0xf9, 0x0e, 0xf6, 0x64, 0x5a, 0x84, 0x0f, 0x9e, 0x4b, 0x87, 0x73, - 0xf7, 0xa2, 0x3e, 0x7a, 0x07, 0x46, 0xea, 0xfe, 0x1d, 0xef, 0x8e, 0x13, 0xd4, 0xe7, 0x2a, 0x65, - 0x71, 0x42, 0x64, 0x0a, 0xa0, 0x16, 0x63, 0x34, 0x3d, 0x6a, 0x08, 0xb3, 0x9d, 0x88, 0x41, 0x58, - 0x27, 0x87, 0xd6, 0x58, 0x7a, 0xa7, 0x75, 0x77, 0x63, 0xc5, 0x69, 0x75, 0xf2, 0xea, 0x5a, 0x90, - 0x48, 0x1a, 0xe5, 0x31, 0x91, 0x03, 0x8a, 0x03, 0x70, 0x4c, 0x08, 0x7d, 0x0e, 0x8e, 0x84, 0x39, - 0x2a, 0xb1, 0xbc, 0x34, 0xeb, 0x9d, 0xb4, 0x44, 0x5c, 0x98, 0x92, 0xa5, 0x3c, 0xcb, 0x6a, 0x06, - 0xdd, 0x05, 0x24, 0x44, 0xcf, 0x6b, 0x41, 0x3b, 0x8c, 0xe6, 0xdb, 0x5e, 0xbd, 0x21, 0xd3, 0x3f, - 0x7d, 0x38, 0x5b, 0x4e, 0x90, 0xc4, 0xd6, 0xda, 0x66, 0xe1, 0x85, 0xd3, 0x18, 0x38, 0xa3, 0x0d, - 0xfb, 0x0b, 0x7d, 0x30, 0x23, 0x13, 0x59, 0x67, 0x78, 0xaf, 0x7c, 0xde, 0x4a, 0xb8, 0xaf, 0xbc, - 0x92, 0x7f, 0xd0, 0x3f, 0x34, 0x27, 0x96, 0x2f, 0xa5, 0x9d, 0x58, 0x5e, 0x3b, 0x60, 0x37, 0x1e, - 0x98, 0x2b, 0xcb, 0xf7, 0xac, 0xff, 0xc9, 0xde, 0x51, 0x30, 0xae, 0x66, 0x84, 0x79, 0xec, 0xf6, - 0x8a, 0x54, 0x1d, 0xe5, 0x3c, 0xff, 0xaf, 0x08, 0x1c, 0xe3, 0xb2, 0x1f, 0x95, 0x11, 0xde, 0xd9, - 0x39, 0xab, 0xe8, 0x50, 0x9a, 0xa4, 0xd9, 0x8a, 0x76, 0x16, 0xdd, 0x40, 0xf4, 0x38, 0x93, 0xe6, - 0x92, 0xc0, 0x49, 0xd3, 0x94, 0x10, 0xac, 0xe8, 0xa0, 0x6d, 0x98, 0xda, 0x60, 0x11, 0x9f, 0xb4, - 0x9c, 0xd2, 0xe2, 0x5c, 0xc8, 0xdc, 0xb7, 0x97, 0x17, 0x96, 0xf2, 0x13, 0x50, 0xf3, 0xc7, 0x5f, - 0x0a, 0x05, 0xa7, 0x9b, 0xa0, 0x5b, 0xe3, 0xa8, 0x73, 0x27, 0x5c, 0x6a, 0x38, 0x61, 0xe4, 0xd6, - 0xe6, 0x1b, 0x7e, 0x6d, 0xab, 0x1a, 0xf9, 0x81, 0x4c, 0x16, 0x99, 0xf9, 0xf6, 0x9a, 0xbb, 0x55, - 0x4d, 0xe1, 0x1b, 0xcd, 0x4f, 0xef, 0xed, 0x96, 0x8e, 0x66, 0x61, 0xe1, 0xcc, 0xb6, 0xd0, 0x2a, - 0x0c, 0x6e, 0xb8, 0x11, 0x26, 0x2d, 0x5f, 0x9c, 0x16, 0x99, 0x47, 0xe1, 0x65, 0x8e, 0x62, 0xb4, - 0xc4, 0x22, 0x52, 0x09, 0x00, 0x96, 0x44, 0xd0, 0x9b, 0xea, 0x12, 0x18, 0xc8, 0x17, 0xc0, 0xa6, - 0x6d, 0xef, 0x32, 0xaf, 0x81, 0xd7, 0xa1, 0xe8, 0xad, 0x87, 0x9d, 0x62, 0xf1, 0xac, 0x2e, 0x1b, - 0xf2, 0xb3, 0xf9, 0x41, 0xfa, 0x34, 0x5e, 0x5d, 0xae, 0x62, 0x5a, 0x91, 0xb9, 0xbd, 0x86, 0xb5, - 0xd0, 0x15, 0x89, 0xa7, 0x32, 0xbd, 0x80, 0xcb, 0xd5, 0x85, 0x6a, 0xd9, 0xa0, 0xc1, 0xa2, 0x1a, - 0xb2, 0x62, 0xcc, 0xab, 0xa3, 0x9b, 0x30, 0xbc, 0xc1, 0x0f, 0xbe, 0xf5, 0x50, 0x24, 0xb3, 0xcf, - 0xbc, 0x8c, 0x2e, 0x4b, 0x24, 0x83, 0x1e, 0xbb, 0x32, 0x14, 0x08, 0xc7, 0xa4, 0xd0, 0x17, 0x2c, - 0x38, 0xd6, 0x4a, 0x48, 0x50, 0x99, 0xb3, 0x9a, 0x30, 0x53, 0xcb, 0x74, 0x00, 0xa8, 0x64, 0x55, - 0x30, 0x1a, 0x64, 0xea, 0x97, 0x4c, 0x34, 0x9c, 0xdd, 0x1c, 0x1d, 0xe8, 0xe0, 0x76, 0xbd, 0x53, - 0xae, 0xa2, 0x44, 0x60, 0x22, 0x3e, 0xd0, 0x78, 0x7e, 0x11, 0xd3, 0x8a, 0x68, 0x0d, 0x60, 0xbd, - 0x41, 0x44, 0xc4, 0x47, 0x61, 0x14, 0x95, 0x79, 0xfb, 0x2f, 0x2b, 0x2c, 0x41, 0x87, 0xbd, 0x44, - 0xe3, 0x52, 0xac, 0xd1, 0xa1, 0x4b, 0xa9, 0xe6, 0x7a, 0x75, 0x12, 0x30, 0xe5, 0x56, 0xce, 0x52, - 0x5a, 0x60, 0x18, 0xe9, 0xa5, 0xc4, 0xcb, 0xb1, 0xa0, 0xc0, 0x68, 0x91, 0xd6, 0xe6, 0x7a, 0xd8, - 0x29, 0x2b, 0xc6, 0x02, 0x69, 0x6d, 0x26, 0x16, 0x14, 0xa7, 0xc5, 0xca, 0xb1, 0xa0, 0x40, 0xb7, - 0xcc, 0x3a, 0xdd, 0x40, 0x24, 0x98, 0x9e, 0xc8, 0xdf, 0x32, 0xcb, 0x1c, 0x25, 0xbd, 0x65, 0x04, - 0x00, 0x4b, 0x22, 0xe8, 0xd3, 0x26, 0xb7, 0x33, 0xc9, 0x68, 0x3e, 0xd3, 0x85, 0xdb, 0x31, 0xe8, - 0x76, 0xe6, 0x77, 0x5e, 0x81, 0xc2, 0x7a, 0x8d, 0x29, 0xc5, 0x72, 0x74, 0x06, 0xcb, 0x0b, 0x06, - 0x35, 0x16, 0x65, 0x7e, 0x79, 0x01, 0x17, 0xd6, 0x6b, 0x74, 0xe9, 0x3b, 0xf7, 0xda, 0x01, 0x59, - 0x76, 0x1b, 0x44, 0x64, 0xc8, 0xc8, 0x5c, 0xfa, 0x73, 0x12, 0x29, 0xbd, 0xf4, 0x15, 0x08, 0xc7, - 0xa4, 0x28, 0xdd, 0x98, 0x07, 0x3b, 0x92, 0x4f, 0x57, 0xb1, 0x5a, 0x69, 0xba, 0x99, 0x5c, 0xd8, - 0x16, 0x8c, 0x6d, 0x87, 0xad, 0x4d, 0x22, 0x4f, 0x45, 0xa6, 0xae, 0xcb, 0x89, 0x54, 0x71, 0x53, - 0x20, 0xba, 0x41, 0xd4, 0x76, 0x1a, 0xa9, 0x83, 0x9c, 0x89, 0x56, 0x6e, 0xea, 0xc4, 0xb0, 0x49, - 0x9b, 0x2e, 0x84, 0x77, 0x79, 0x38, 0x39, 0xa6, 0xb8, 0xcb, 0x59, 0x08, 0x19, 0x11, 0xe7, 0xf8, - 0x42, 0x10, 0x00, 0x2c, 0x89, 0xa8, 0xc1, 0x66, 0x17, 0xd0, 0xf1, 0x2e, 0x83, 0x9d, 0xea, 0x6f, - 0x3c, 0xd8, 0xec, 0xc2, 0x89, 0x49, 0xb1, 0x8b, 0xa6, 0xb5, 0xe9, 0x47, 0xbe, 0x97, 0xb8, 0xe4, - 0x4e, 0xe4, 0x5f, 0x34, 0x95, 0x0c, 0xfc, 0xf4, 0x45, 0x93, 0x85, 0x85, 0x33, 0xdb, 0xa2, 0x1f, - 0xd7, 0x92, 0x91, 0x01, 0x45, 0x16, 0x8f, 0xa7, 0x72, 0x02, 0x6b, 0xa6, 0xc3, 0x07, 0xf2, 0x8f, - 0x53, 0x20, 0x1c, 0x93, 0x42, 0x75, 0x18, 0x6f, 0x19, 0x11, 0x67, 0x59, 0x36, 0x92, 0x1c, 0xbe, - 0x20, 0x2b, 0x36, 0x2d, 0x97, 0x10, 0x99, 0x10, 0x9c, 0xa0, 0xc9, 0x2c, 0xf7, 0xb8, 0xab, 0x1f, - 0x4b, 0x56, 0x92, 0x33, 0xd5, 0x19, 0xde, 0x80, 0x7c, 0xaa, 0x05, 0x00, 0x4b, 0x22, 0x74, 0x34, - 0x84, 0x83, 0x9a, 0x1f, 0xb2, 0x9c, 0x3f, 0x79, 0x0a, 0xf6, 0x2c, 0x35, 0x91, 0x0c, 0xb3, 0x2e, - 0x40, 0x38, 0x26, 0x45, 0x4f, 0x72, 0x7a, 0xe1, 0x9d, 0xca, 0x3f, 0xc9, 0x93, 0xd7, 0x1d, 0x3b, - 0xc9, 0xe9, 0x65, 0x57, 0x14, 0x57, 0x9d, 0x8a, 0x0a, 0xce, 0xf2, 0x95, 0xe4, 0xf4, 0x4b, 0x85, - 0x15, 0x4f, 0xf7, 0x4b, 0x81, 0x70, 0x4c, 0x8a, 0x5d, 0xc5, 0x2c, 0x34, 0xdd, 0x99, 0x0e, 0x57, - 0x31, 0x45, 0xc8, 0xb8, 0x8a, 0xb5, 0xd0, 0x75, 0xf6, 0x8f, 0x17, 0xe0, 0x4c, 0xe7, 0x7d, 0x1b, - 0xeb, 0xd0, 0x2a, 0xb1, 0xcd, 0x52, 0x42, 0x87, 0xc6, 0x25, 0x3a, 0x31, 0x56, 0xcf, 0x01, 0x87, - 0x2f, 0xc3, 0x94, 0x72, 0x47, 0x6c, 0xb8, 0xb5, 0x1d, 0x2d, 0x49, 0xa9, 0x0a, 0xcd, 0x53, 0x4d, - 0x22, 0xe0, 0x74, 0x1d, 0x34, 0x07, 0x13, 0x46, 0x61, 0x79, 0x51, 0x3c, 0xff, 0xe3, 0x4c, 0x1b, - 0x26, 0x18, 0x27, 0xf1, 0xed, 0xdf, 0xb0, 0xe0, 0x44, 0x4e, 0xfe, 0xfb, 0x9e, 0xe3, 0xe9, 0xae, - 0xc3, 0x44, 0xcb, 0xac, 0xda, 0x25, 0x04, 0xb8, 0x91, 0x65, 0x5f, 0xf5, 0x35, 0x01, 0xc0, 0x49, - 0xa2, 0xf6, 0xaf, 0x15, 0xe0, 0x74, 0x47, 0xfb, 0x7a, 0x84, 0xe1, 0xf8, 0x46, 0x33, 0x74, 0x16, - 0x02, 0x52, 0x27, 0x5e, 0xe4, 0x3a, 0x8d, 0x6a, 0x8b, 0xd4, 0x34, 0x2d, 0x28, 0x33, 0x54, 0xbf, - 0xbc, 0x52, 0x9d, 0x4b, 0x63, 0xe0, 0x9c, 0x9a, 0x68, 0x19, 0x50, 0x1a, 0x22, 0x66, 0x98, 0x3d, - 0x71, 0xd3, 0xf4, 0x70, 0x46, 0x0d, 0xf4, 0x32, 0x8c, 0x29, 0xbb, 0x7d, 0x6d, 0xc6, 0xd9, 0x05, - 0x81, 0x75, 0x00, 0x36, 0xf1, 0xd0, 0x45, 0x9e, 0x82, 0x49, 0x24, 0xeb, 0x12, 0x2a, 0xd3, 0x09, - 0x99, 0x5f, 0x49, 0x14, 0x63, 0x1d, 0x67, 0xfe, 0xd2, 0x5f, 0x7c, 0xeb, 0xcc, 0x87, 0xfe, 0xea, - 0x5b, 0x67, 0x3e, 0xf4, 0xb7, 0xdf, 0x3a, 0xf3, 0xa1, 0x1f, 0xda, 0x3b, 0x63, 0xfd, 0xc5, 0xde, - 0x19, 0xeb, 0xaf, 0xf6, 0xce, 0x58, 0x7f, 0xbb, 0x77, 0xc6, 0xfa, 0xdf, 0xf7, 0xce, 0x58, 0x5f, - 0xfe, 0x3f, 0xce, 0x7c, 0xe8, 0x6d, 0x14, 0x47, 0xa8, 0xbe, 0x40, 0x67, 0xe7, 0xc2, 0xf6, 0xc5, - 0xff, 0x10, 0x00, 0x00, 0xff, 0xff, 0xf5, 0xf1, 0x8c, 0x4c, 0x2d, 0x26, 0x01, 0x00, + // 16665 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x5b, 0x90, 0x5c, 0x49, + 0x76, 0x18, 0xb6, 0xb7, 0xaa, 0x9f, 0xa7, 0xdf, 0x89, 0x57, 0xa1, 0x07, 0x40, 0x61, 0xee, 0xcc, + 0x60, 0x30, 0x3b, 0x33, 0x8d, 0xc5, 0x3c, 0x76, 0xb1, 0x33, 0xb3, 0xc3, 0xe9, 0x27, 0xd0, 0x03, + 0x74, 0xa3, 0x26, 0xab, 0x01, 0xec, 0x63, 0x76, 0xb5, 0x17, 0x55, 0xd9, 0xdd, 0x77, 0xbb, 0xea, + 0xde, 0x9a, 0x7b, 0x6f, 0x35, 0xd0, 0x30, 0x15, 0xa4, 0x56, 0xe6, 0x4a, 0x4b, 0xd2, 0x11, 0x1b, + 0x0a, 0x4b, 0x72, 0x90, 0x0a, 0x7e, 0xe8, 0x45, 0xd2, 0xb4, 0x64, 0x52, 0xa4, 0x45, 0x59, 0x14, + 0x29, 0xda, 0x96, 0x23, 0x68, 0x7f, 0xc8, 0x14, 0x23, 0xcc, 0x65, 0x58, 0xe1, 0x96, 0xd9, 0xb6, + 0x42, 0xc1, 0x0f, 0x53, 0x0a, 0xda, 0x1f, 0x76, 0x87, 0x6c, 0x2a, 0xf2, 0x79, 0x33, 0xef, 0xab, + 0xaa, 0x31, 0x40, 0xef, 0x70, 0x63, 0xfe, 0xaa, 0xf2, 0x9c, 0x3c, 0x99, 0x37, 0x1f, 0x27, 0x4f, + 0x9e, 0x73, 0xf2, 0x1c, 0xb0, 0x77, 0xae, 0x85, 0x73, 0xae, 0x7f, 0xc5, 0xe9, 0xb8, 0x57, 0x1a, + 0x7e, 0x40, 0xae, 0xec, 0x5e, 0xbd, 0xb2, 0x45, 0x3c, 0x12, 0x38, 0x11, 0x69, 0xce, 0x75, 0x02, + 0x3f, 0xf2, 0x11, 0xe2, 0x38, 0x73, 0x4e, 0xc7, 0x9d, 0xa3, 0x38, 0x73, 0xbb, 0x57, 0x67, 0x5f, + 0xdd, 0x72, 0xa3, 0xed, 0xee, 0xfd, 0xb9, 0x86, 0xdf, 0xbe, 0xb2, 0xe5, 0x6f, 0xf9, 0x57, 0x18, + 0xea, 0xfd, 0xee, 0x26, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc4, 0xec, 0x1b, 0x71, 0x33, 0x6d, + 0xa7, 0xb1, 0xed, 0x7a, 0x24, 0xd8, 0xbb, 0xd2, 0xd9, 0xd9, 0x62, 0xed, 0x06, 0x24, 0xf4, 0xbb, + 0x41, 0x83, 0x24, 0x1b, 0x2e, 0xac, 0x15, 0x5e, 0x69, 0x93, 0xc8, 0xc9, 0xe8, 0xee, 0xec, 0x95, + 0xbc, 0x5a, 0x41, 0xd7, 0x8b, 0xdc, 0x76, 0xba, 0x99, 0xcf, 0xf7, 0xaa, 0x10, 0x36, 0xb6, 0x49, + 0xdb, 0x49, 0xd5, 0x7b, 0x3d, 0xaf, 0x5e, 0x37, 0x72, 0x5b, 0x57, 0x5c, 0x2f, 0x0a, 0xa3, 0x20, + 0x59, 0xc9, 0xfe, 0xbe, 0x05, 0x17, 0xe7, 0xef, 0xd5, 0x97, 0x5b, 0x4e, 0x18, 0xb9, 0x8d, 0x85, + 0x96, 0xdf, 0xd8, 0xa9, 0x47, 0x7e, 0x40, 0xee, 0xfa, 0xad, 0x6e, 0x9b, 0xd4, 0xd9, 0x40, 0xa0, + 0x57, 0x60, 0x64, 0x97, 0xfd, 0x5f, 0x5d, 0xaa, 0x58, 0x17, 0xad, 0xcb, 0xa3, 0x0b, 0xd3, 0xbf, + 0xb3, 0x5f, 0xfd, 0xcc, 0xc1, 0x7e, 0x75, 0xe4, 0xae, 0x28, 0xc7, 0x0a, 0x03, 0x5d, 0x82, 0xa1, + 0xcd, 0x70, 0x63, 0xaf, 0x43, 0x2a, 0x25, 0x86, 0x3b, 0x29, 0x70, 0x87, 0x56, 0xea, 0xb4, 0x14, + 0x0b, 0x28, 0xba, 0x02, 0xa3, 0x1d, 0x27, 0x88, 0xdc, 0xc8, 0xf5, 0xbd, 0x4a, 0xf9, 0xa2, 0x75, + 0x79, 0x70, 0x61, 0x46, 0xa0, 0x8e, 0xd6, 0x24, 0x00, 0xc7, 0x38, 0xb4, 0x1b, 0x01, 0x71, 0x9a, + 0xb7, 0xbd, 0xd6, 0x5e, 0x65, 0xe0, 0xa2, 0x75, 0x79, 0x24, 0xee, 0x06, 0x16, 0xe5, 0x58, 0x61, + 0xd8, 0x3f, 0x53, 0x82, 0x91, 0xf9, 0xcd, 0x4d, 0xd7, 0x73, 0xa3, 0x3d, 0x74, 0x17, 0xc6, 0x3d, + 0xbf, 0x49, 0xe4, 0x7f, 0xf6, 0x15, 0x63, 0xaf, 0x5d, 0x9c, 0x4b, 0x2f, 0xa5, 0xb9, 0x75, 0x0d, + 0x6f, 0x61, 0xfa, 0x60, 0xbf, 0x3a, 0xae, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xd6, 0xf1, 0x9b, + 0x8a, 0x6c, 0x89, 0x91, 0xad, 0x66, 0x91, 0xad, 0xc5, 0x68, 0x0b, 0x53, 0x07, 0xfb, 0xd5, 0x31, + 0xad, 0x00, 0xeb, 0x44, 0xd0, 0x7d, 0x98, 0xa2, 0x7f, 0xbd, 0xc8, 0x55, 0x74, 0xcb, 0x8c, 0xee, + 0x73, 0x79, 0x74, 0x35, 0xd4, 0x85, 0x13, 0x07, 0xfb, 0xd5, 0xa9, 0x44, 0x21, 0x4e, 0x12, 0xb4, + 0x7f, 0xda, 0x82, 0xa9, 0xf9, 0x4e, 0x67, 0x3e, 0x68, 0xfb, 0x41, 0x2d, 0xf0, 0x37, 0xdd, 0x16, + 0x41, 0x5f, 0x80, 0x81, 0x88, 0xce, 0x1a, 0x9f, 0xe1, 0xe7, 0xc4, 0xd0, 0x0e, 0xd0, 0xb9, 0x3a, + 0xdc, 0xaf, 0x9e, 0x48, 0xa0, 0xb3, 0xa9, 0x64, 0x15, 0xd0, 0x7b, 0x30, 0xdd, 0xf2, 0x1b, 0x4e, + 0x6b, 0xdb, 0x0f, 0x23, 0x01, 0x15, 0x53, 0x7f, 0xf2, 0x60, 0xbf, 0x3a, 0x7d, 0x2b, 0x01, 0xc3, + 0x29, 0x6c, 0xfb, 0x11, 0x4c, 0xce, 0x47, 0x91, 0xd3, 0xd8, 0x26, 0x4d, 0xbe, 0xa0, 0xd0, 0x1b, + 0x30, 0xe0, 0x39, 0x6d, 0xd9, 0x99, 0x8b, 0xb2, 0x33, 0xeb, 0x4e, 0x9b, 0x76, 0x66, 0xfa, 0x8e, + 0xe7, 0x7e, 0xd4, 0x15, 0x8b, 0x94, 0x96, 0x61, 0x86, 0x8d, 0x5e, 0x03, 0x68, 0x92, 0x5d, 0xb7, + 0x41, 0x6a, 0x4e, 0xb4, 0x2d, 0xfa, 0x80, 0x44, 0x5d, 0x58, 0x52, 0x10, 0xac, 0x61, 0xd9, 0x0f, + 0x61, 0x74, 0x7e, 0xd7, 0x77, 0x9b, 0x35, 0xbf, 0x19, 0xa2, 0x1d, 0x98, 0xea, 0x04, 0x64, 0x93, + 0x04, 0xaa, 0xa8, 0x62, 0x5d, 0x2c, 0x5f, 0x1e, 0x7b, 0xed, 0x72, 0xe6, 0xd8, 0x9b, 0xa8, 0xcb, + 0x5e, 0x14, 0xec, 0x2d, 0x9c, 0x11, 0xed, 0x4d, 0x25, 0xa0, 0x38, 0x49, 0xd9, 0xfe, 0x67, 0x25, + 0x38, 0x35, 0xff, 0xa8, 0x1b, 0x90, 0x25, 0x37, 0xdc, 0x49, 0x6e, 0xb8, 0xa6, 0x1b, 0xee, 0xac, + 0xc7, 0x23, 0xa0, 0x56, 0xfa, 0x92, 0x28, 0xc7, 0x0a, 0x03, 0xbd, 0x0a, 0xc3, 0xf4, 0xf7, 0x1d, + 0xbc, 0x2a, 0x3e, 0xf9, 0x84, 0x40, 0x1e, 0x5b, 0x72, 0x22, 0x67, 0x89, 0x83, 0xb0, 0xc4, 0x41, + 0x6b, 0x30, 0xd6, 0x60, 0xfc, 0x61, 0x6b, 0xcd, 0x6f, 0x12, 0xb6, 0xb6, 0x46, 0x17, 0x5e, 0xa6, + 0xe8, 0x8b, 0x71, 0xf1, 0xe1, 0x7e, 0xb5, 0xc2, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, + 0xb6, 0xda, 0xee, 0x03, 0x8c, 0x12, 0x64, 0x6c, 0xf5, 0xcb, 0xda, 0xce, 0x1d, 0x64, 0x3b, 0x77, + 0x3c, 0x7b, 0xd7, 0xa2, 0xab, 0x30, 0xb0, 0xe3, 0x7a, 0xcd, 0xca, 0x10, 0xa3, 0x75, 0x9e, 0xce, + 0xf9, 0x4d, 0xd7, 0x6b, 0x1e, 0xee, 0x57, 0x67, 0x8c, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0xff, + 0xcb, 0x82, 0x2a, 0x83, 0xad, 0xb8, 0x2d, 0x52, 0x23, 0x41, 0xe8, 0x86, 0x11, 0xf1, 0x22, 0x63, + 0x40, 0x5f, 0x03, 0x08, 0x49, 0x23, 0x20, 0x91, 0x36, 0xa4, 0x6a, 0x61, 0xd4, 0x15, 0x04, 0x6b, + 0x58, 0x94, 0x3f, 0x85, 0xdb, 0x4e, 0xc0, 0xd6, 0x97, 0x18, 0x58, 0xc5, 0x9f, 0xea, 0x12, 0x80, + 0x63, 0x1c, 0x83, 0x3f, 0x95, 0x7b, 0xf1, 0x27, 0xf4, 0x25, 0x98, 0x8a, 0x1b, 0x0b, 0x3b, 0x4e, + 0x43, 0x0e, 0x20, 0xdb, 0xc1, 0x75, 0x13, 0x84, 0x93, 0xb8, 0xf6, 0x7f, 0x6e, 0x89, 0xc5, 0x43, + 0xbf, 0xfa, 0x13, 0xfe, 0xad, 0xf6, 0x3f, 0xb2, 0x60, 0x78, 0xc1, 0xf5, 0x9a, 0xae, 0xb7, 0x85, + 0xbe, 0x09, 0x23, 0xf4, 0xa8, 0x6c, 0x3a, 0x91, 0x23, 0xd8, 0xf0, 0xe7, 0xb4, 0xbd, 0xa5, 0x4e, + 0xae, 0xb9, 0xce, 0xce, 0x16, 0x2d, 0x08, 0xe7, 0x28, 0x36, 0xdd, 0x6d, 0xb7, 0xef, 0x7f, 0x8b, + 0x34, 0xa2, 0x35, 0x12, 0x39, 0xf1, 0xe7, 0xc4, 0x65, 0x58, 0x51, 0x45, 0x37, 0x61, 0x28, 0x72, + 0x82, 0x2d, 0x12, 0x09, 0x7e, 0x9c, 0xc9, 0x37, 0x79, 0x4d, 0x4c, 0x77, 0x24, 0xf1, 0x1a, 0x24, + 0x3e, 0xa5, 0x36, 0x58, 0x55, 0x2c, 0x48, 0xd8, 0xff, 0xdf, 0x30, 0x9c, 0x5d, 0xac, 0xaf, 0xe6, + 0xac, 0xab, 0x4b, 0x30, 0xd4, 0x0c, 0xdc, 0x5d, 0x12, 0x88, 0x71, 0x56, 0x54, 0x96, 0x58, 0x29, + 0x16, 0x50, 0x74, 0x0d, 0xc6, 0xf9, 0xf9, 0x78, 0xc3, 0xf1, 0x9a, 0x31, 0x7b, 0x14, 0xd8, 0xe3, + 0x77, 0x35, 0x18, 0x36, 0x30, 0x8f, 0xb8, 0xa8, 0x2e, 0x25, 0x36, 0x63, 0xde, 0xd9, 0xfb, 0x5d, + 0x0b, 0xa6, 0x79, 0x33, 0xf3, 0x51, 0x14, 0xb8, 0xf7, 0xbb, 0x11, 0x09, 0x2b, 0x83, 0x8c, 0xd3, + 0x2d, 0x66, 0x8d, 0x56, 0xee, 0x08, 0xcc, 0xdd, 0x4d, 0x50, 0xe1, 0x4c, 0xb0, 0x22, 0xda, 0x9d, + 0x4e, 0x82, 0x71, 0xaa, 0x59, 0xf4, 0x17, 0x2d, 0x98, 0x6d, 0xf8, 0x5e, 0x14, 0xf8, 0xad, 0x16, + 0x09, 0x6a, 0xdd, 0xfb, 0x2d, 0x37, 0xdc, 0xe6, 0xeb, 0x14, 0x93, 0x4d, 0xc6, 0x09, 0x72, 0xe6, + 0x50, 0x21, 0x89, 0x39, 0xbc, 0x70, 0xb0, 0x5f, 0x9d, 0x5d, 0xcc, 0x25, 0x85, 0x0b, 0x9a, 0x41, + 0x3b, 0x80, 0xe8, 0xc9, 0x5e, 0x8f, 0x9c, 0x2d, 0x12, 0x37, 0x3e, 0xdc, 0x7f, 0xe3, 0xa7, 0x0f, + 0xf6, 0xab, 0x68, 0x3d, 0x45, 0x02, 0x67, 0x90, 0x45, 0x1f, 0xc1, 0x49, 0x5a, 0x9a, 0xfa, 0xd6, + 0x91, 0xfe, 0x9b, 0xab, 0x1c, 0xec, 0x57, 0x4f, 0xae, 0x67, 0x10, 0xc1, 0x99, 0xa4, 0xd1, 0x8f, + 0x5b, 0x70, 0x36, 0xfe, 0xfc, 0xe5, 0x87, 0x1d, 0xc7, 0x6b, 0xc6, 0x0d, 0x8f, 0xf6, 0xdf, 0x30, + 0xe5, 0xc9, 0x67, 0x17, 0xf3, 0x28, 0xe1, 0xfc, 0x46, 0x90, 0x07, 0x27, 0x68, 0xd7, 0x92, 0x6d, + 0x43, 0xff, 0x6d, 0x9f, 0x39, 0xd8, 0xaf, 0x9e, 0x58, 0x4f, 0xd3, 0xc0, 0x59, 0x84, 0x67, 0x17, + 0xe1, 0x54, 0xe6, 0xea, 0x44, 0xd3, 0x50, 0xde, 0x21, 0x5c, 0x08, 0x1c, 0xc5, 0xf4, 0x27, 0x3a, + 0x09, 0x83, 0xbb, 0x4e, 0xab, 0x2b, 0x36, 0x26, 0xe6, 0x7f, 0xde, 0x2a, 0x5d, 0xb3, 0xec, 0xff, + 0xbe, 0x0c, 0x53, 0x8b, 0xf5, 0xd5, 0xc7, 0xda, 0xf5, 0xfa, 0xb1, 0x57, 0x2a, 0x3c, 0xf6, 0xe2, + 0x43, 0xb4, 0x9c, 0x7b, 0x88, 0xfe, 0x58, 0xc6, 0x96, 0x1d, 0x60, 0x5b, 0xf6, 0x8b, 0x39, 0x5b, + 0xf6, 0x09, 0x6f, 0xd4, 0xdd, 0x9c, 0x55, 0x3b, 0xc8, 0x26, 0x30, 0x53, 0x42, 0x62, 0xb2, 0x5f, + 0x92, 0xd5, 0x1e, 0x71, 0xe9, 0x3e, 0x99, 0x79, 0x6c, 0xc0, 0xf8, 0xa2, 0xd3, 0x71, 0xee, 0xbb, + 0x2d, 0x37, 0x72, 0x49, 0x88, 0x5e, 0x84, 0xb2, 0xd3, 0x6c, 0x32, 0xe9, 0x6e, 0x74, 0xe1, 0xd4, + 0xc1, 0x7e, 0xb5, 0x3c, 0xdf, 0xa4, 0x62, 0x06, 0x28, 0xac, 0x3d, 0x4c, 0x31, 0xd0, 0x67, 0x61, + 0xa0, 0x19, 0xf8, 0x9d, 0x4a, 0x89, 0x61, 0xd2, 0x5d, 0x3e, 0xb0, 0x14, 0xf8, 0x9d, 0x04, 0x2a, + 0xc3, 0xb1, 0x7f, 0xbb, 0x04, 0xe7, 0x16, 0x49, 0x67, 0x7b, 0xa5, 0x9e, 0x73, 0x5e, 0x5c, 0x86, + 0x91, 0xb6, 0xef, 0xb9, 0x91, 0x1f, 0x84, 0xa2, 0x69, 0xb6, 0x22, 0xd6, 0x44, 0x19, 0x56, 0x50, + 0x74, 0x11, 0x06, 0x3a, 0xb1, 0x10, 0x3b, 0x2e, 0x05, 0x60, 0x26, 0xbe, 0x32, 0x08, 0xc5, 0xe8, + 0x86, 0x24, 0x10, 0x2b, 0x46, 0x61, 0xdc, 0x09, 0x49, 0x80, 0x19, 0x24, 0x96, 0x04, 0xa8, 0x8c, + 0x20, 0x4e, 0x84, 0x84, 0x24, 0x40, 0x21, 0x58, 0xc3, 0x42, 0x35, 0x18, 0x0d, 0x13, 0x33, 0xdb, + 0xd7, 0xd6, 0x9c, 0x60, 0xa2, 0x82, 0x9a, 0xc9, 0x98, 0x88, 0x71, 0x82, 0x0d, 0xf5, 0x14, 0x15, + 0x7e, 0xa3, 0x04, 0x88, 0x0f, 0xe1, 0x9f, 0xb1, 0x81, 0xbb, 0x93, 0x1e, 0xb8, 0xfe, 0xb7, 0xc4, + 0x93, 0x1a, 0xbd, 0xff, 0xdb, 0x82, 0x73, 0x8b, 0xae, 0xd7, 0x24, 0x41, 0xce, 0x02, 0x7c, 0x3a, + 0x57, 0xf9, 0xa3, 0x09, 0x29, 0xc6, 0x12, 0x1b, 0x78, 0x02, 0x4b, 0xcc, 0xfe, 0xb7, 0x16, 0x20, + 0xfe, 0xd9, 0x9f, 0xb8, 0x8f, 0xbd, 0x93, 0xfe, 0xd8, 0x27, 0xb0, 0x2c, 0xec, 0x5b, 0x30, 0xb9, + 0xd8, 0x72, 0x89, 0x17, 0xad, 0xd6, 0x16, 0x7d, 0x6f, 0xd3, 0xdd, 0x42, 0x6f, 0xc1, 0x64, 0xe4, + 0xb6, 0x89, 0xdf, 0x8d, 0xea, 0xa4, 0xe1, 0x7b, 0xec, 0xe6, 0x6a, 0x5d, 0x1e, 0x5c, 0x40, 0x07, + 0xfb, 0xd5, 0xc9, 0x0d, 0x03, 0x82, 0x13, 0x98, 0xf6, 0xdf, 0xa5, 0x7c, 0xab, 0xd5, 0x0d, 0x23, + 0x12, 0x6c, 0x04, 0xdd, 0x30, 0x5a, 0xe8, 0x52, 0xd9, 0xb3, 0x16, 0xf8, 0xb4, 0x3b, 0xae, 0xef, + 0xa1, 0x73, 0xc6, 0x75, 0x7c, 0x44, 0x5e, 0xc5, 0xc5, 0xb5, 0x7b, 0x0e, 0x20, 0x74, 0xb7, 0x3c, + 0x12, 0x68, 0xd7, 0x87, 0x49, 0xb6, 0x55, 0x54, 0x29, 0xd6, 0x30, 0x50, 0x0b, 0x26, 0x5a, 0xce, + 0x7d, 0xd2, 0xaa, 0x93, 0x16, 0x69, 0x44, 0x7e, 0x20, 0xf4, 0x1b, 0xaf, 0xf7, 0x77, 0x0f, 0xb8, + 0xa5, 0x57, 0x5d, 0x98, 0x39, 0xd8, 0xaf, 0x4e, 0x18, 0x45, 0xd8, 0x24, 0x4e, 0x59, 0x87, 0xdf, + 0xa1, 0x5f, 0xe1, 0xb4, 0xf4, 0xcb, 0xe7, 0x6d, 0x51, 0x86, 0x15, 0x54, 0xb1, 0x8e, 0x81, 0x3c, + 0xd6, 0x61, 0xff, 0x4b, 0xba, 0xd0, 0xfc, 0x76, 0xc7, 0xf7, 0x88, 0x17, 0x2d, 0xfa, 0x5e, 0x93, + 0x6b, 0xa6, 0xde, 0x32, 0x54, 0x27, 0x97, 0x12, 0xaa, 0x93, 0xd3, 0xe9, 0x1a, 0x9a, 0xf6, 0xe4, + 0x8b, 0x30, 0x14, 0x46, 0x4e, 0xd4, 0x0d, 0xc5, 0xc0, 0x3d, 0x2b, 0x97, 0x5d, 0x9d, 0x95, 0x1e, + 0xee, 0x57, 0xa7, 0x54, 0x35, 0x5e, 0x84, 0x45, 0x05, 0xf4, 0x12, 0x0c, 0xb7, 0x49, 0x18, 0x3a, + 0x5b, 0x52, 0x6c, 0x98, 0x12, 0x75, 0x87, 0xd7, 0x78, 0x31, 0x96, 0x70, 0xf4, 0x1c, 0x0c, 0x92, + 0x20, 0xf0, 0x03, 0xf1, 0x6d, 0x13, 0x02, 0x71, 0x70, 0x99, 0x16, 0x62, 0x0e, 0xb3, 0xff, 0x27, + 0x0b, 0xa6, 0x54, 0x5f, 0x79, 0x5b, 0xc7, 0x70, 0x5d, 0xfb, 0x2a, 0x40, 0x43, 0x7e, 0x60, 0xc8, + 0x8e, 0xd9, 0xb1, 0xd7, 0x2e, 0x65, 0x4a, 0x34, 0xa9, 0x61, 0x8c, 0x29, 0xab, 0xa2, 0x10, 0x6b, + 0xd4, 0xec, 0xdf, 0xb4, 0xe0, 0x44, 0xe2, 0x8b, 0x6e, 0xb9, 0x61, 0x84, 0x3e, 0x4c, 0x7d, 0xd5, + 0x5c, 0x9f, 0x8b, 0xcf, 0x0d, 0xf9, 0x37, 0xa9, 0x3d, 0x2f, 0x4b, 0xb4, 0x2f, 0xba, 0x01, 0x83, + 0x6e, 0x44, 0xda, 0xf2, 0x63, 0x9e, 0x2b, 0xfc, 0x18, 0xde, 0xab, 0x78, 0x46, 0x56, 0x69, 0x4d, + 0xcc, 0x09, 0xd8, 0xbf, 0x5d, 0x86, 0x51, 0xbe, 0xbf, 0xd7, 0x9c, 0xce, 0x31, 0xcc, 0xc5, 0xcb, + 0x30, 0xea, 0xb6, 0xdb, 0xdd, 0xc8, 0xb9, 0x2f, 0xce, 0xbd, 0x11, 0xce, 0x83, 0x56, 0x65, 0x21, + 0x8e, 0xe1, 0x68, 0x15, 0x06, 0x58, 0x57, 0xf8, 0x57, 0xbe, 0x98, 0xfd, 0x95, 0xa2, 0xef, 0x73, + 0x4b, 0x4e, 0xe4, 0x70, 0x91, 0x53, 0xed, 0x2b, 0x5a, 0x84, 0x19, 0x09, 0xe4, 0x00, 0xdc, 0x77, + 0x3d, 0x27, 0xd8, 0xa3, 0x65, 0x95, 0x32, 0x23, 0xf8, 0x6a, 0x31, 0xc1, 0x05, 0x85, 0xcf, 0xc9, + 0xaa, 0x0f, 0x8b, 0x01, 0x58, 0x23, 0x3a, 0xfb, 0x05, 0x18, 0x55, 0xc8, 0x47, 0x91, 0x1c, 0x67, + 0xbf, 0x04, 0x53, 0x89, 0xb6, 0x7a, 0x55, 0x1f, 0xd7, 0x05, 0xcf, 0x7f, 0xcc, 0x58, 0x86, 0xe8, + 0xf5, 0xb2, 0xb7, 0x2b, 0xce, 0xa6, 0x47, 0x70, 0xb2, 0x95, 0xc1, 0xf2, 0xc5, 0xbc, 0xf6, 0x7f, + 0x44, 0x9c, 0x13, 0x9f, 0x7d, 0x32, 0x0b, 0x8a, 0x33, 0xdb, 0x30, 0x38, 0x62, 0xa9, 0x88, 0x23, + 0x52, 0x7e, 0x77, 0x52, 0x75, 0xfe, 0x26, 0xd9, 0x53, 0x4c, 0xf5, 0x07, 0xd9, 0xfd, 0xf3, 0x7c, + 0xf4, 0x39, 0xbb, 0x1c, 0x13, 0x04, 0xca, 0x37, 0xc9, 0x1e, 0x9f, 0x0a, 0xfd, 0xeb, 0xca, 0x85, + 0x5f, 0xf7, 0x2b, 0x16, 0x4c, 0xa8, 0xaf, 0x3b, 0x06, 0xbe, 0xb0, 0x60, 0xf2, 0x85, 0xf3, 0x85, + 0x0b, 0x3c, 0x87, 0x23, 0xfc, 0x46, 0x09, 0xce, 0x2a, 0x1c, 0x7a, 0x89, 0xe2, 0x7f, 0xc4, 0xaa, + 0xba, 0x02, 0xa3, 0x9e, 0x52, 0x27, 0x5a, 0xa6, 0x1e, 0x2f, 0x56, 0x26, 0xc6, 0x38, 0xf4, 0xc8, + 0xf3, 0xe2, 0x43, 0x7b, 0x5c, 0xd7, 0xb3, 0x8b, 0xc3, 0x7d, 0x01, 0xca, 0x5d, 0xb7, 0x29, 0x0e, + 0x98, 0xcf, 0xc9, 0xd1, 0xbe, 0xb3, 0xba, 0x74, 0xb8, 0x5f, 0x7d, 0x36, 0xcf, 0xe4, 0x44, 0x4f, + 0xb6, 0x70, 0xee, 0xce, 0xea, 0x12, 0xa6, 0x95, 0xd1, 0x3c, 0x4c, 0x49, 0xab, 0xda, 0x5d, 0x2a, + 0x97, 0xfa, 0x9e, 0x38, 0x87, 0x94, 0xb2, 0x1c, 0x9b, 0x60, 0x9c, 0xc4, 0x47, 0x4b, 0x30, 0xbd, + 0xd3, 0xbd, 0x4f, 0x5a, 0x24, 0xe2, 0x1f, 0x7c, 0x93, 0x70, 0x55, 0xf2, 0x68, 0x7c, 0x85, 0xbd, + 0x99, 0x80, 0xe3, 0x54, 0x0d, 0xfb, 0x4f, 0xd9, 0x79, 0x20, 0x46, 0x4f, 0x93, 0x6f, 0x7e, 0x90, + 0xcb, 0xb9, 0x9f, 0x55, 0x71, 0x93, 0xec, 0x6d, 0xf8, 0x54, 0x0e, 0xc9, 0x5e, 0x15, 0xc6, 0x9a, + 0x1f, 0x28, 0x5c, 0xf3, 0xbf, 0x56, 0x82, 0x53, 0x6a, 0x04, 0x0c, 0x69, 0xf9, 0xcf, 0xfa, 0x18, + 0x5c, 0x85, 0xb1, 0x26, 0xd9, 0x74, 0xba, 0xad, 0x48, 0xd9, 0x35, 0x06, 0xb9, 0xa9, 0x6d, 0x29, + 0x2e, 0xc6, 0x3a, 0xce, 0x11, 0x86, 0xed, 0x6f, 0x4d, 0xb2, 0x83, 0x38, 0x72, 0xe8, 0x1a, 0x57, + 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0xcf, 0xc1, 0xa0, 0xdb, 0xa6, 0x82, 0x59, 0xc9, 0x94, 0xb7, 0x56, + 0x69, 0x21, 0xe6, 0x30, 0xf4, 0x02, 0x0c, 0x37, 0xfc, 0x76, 0xdb, 0xf1, 0x9a, 0xec, 0xc8, 0x1b, + 0x5d, 0x18, 0xa3, 0xb2, 0xdb, 0x22, 0x2f, 0xc2, 0x12, 0x46, 0x85, 0x6f, 0x27, 0xd8, 0xe2, 0xca, + 0x1e, 0x21, 0x7c, 0xcf, 0x07, 0x5b, 0x21, 0x66, 0xa5, 0xf4, 0xae, 0xfa, 0xc0, 0x0f, 0x76, 0x5c, + 0x6f, 0x6b, 0xc9, 0x0d, 0xc4, 0x96, 0x50, 0x67, 0xe1, 0x3d, 0x05, 0xc1, 0x1a, 0x16, 0x5a, 0x81, + 0xc1, 0x8e, 0x1f, 0x44, 0x61, 0x65, 0x88, 0x0d, 0xf7, 0xb3, 0x39, 0x8c, 0x88, 0x7f, 0x6d, 0xcd, + 0x0f, 0xa2, 0xf8, 0x03, 0xe8, 0xbf, 0x10, 0xf3, 0xea, 0xe8, 0x16, 0x0c, 0x13, 0x6f, 0x77, 0x25, + 0xf0, 0xdb, 0x95, 0x13, 0xf9, 0x94, 0x96, 0x39, 0x0a, 0x5f, 0x66, 0xb1, 0x8c, 0x2a, 0x8a, 0xb1, + 0x24, 0x81, 0xbe, 0x08, 0x65, 0xe2, 0xed, 0x56, 0x86, 0x19, 0xa5, 0xd9, 0x1c, 0x4a, 0x77, 0x9d, + 0x20, 0xe6, 0xf9, 0xcb, 0xde, 0x2e, 0xa6, 0x75, 0xd0, 0x57, 0x60, 0x54, 0x32, 0x8c, 0x50, 0x68, + 0x51, 0x33, 0x17, 0xac, 0x64, 0x33, 0x98, 0x7c, 0xd4, 0x75, 0x03, 0xd2, 0x26, 0x5e, 0x14, 0xc6, + 0x1c, 0x52, 0x42, 0x43, 0x1c, 0x53, 0x43, 0x0d, 0x18, 0x0f, 0x48, 0xe8, 0x3e, 0x22, 0x35, 0xbf, + 0xe5, 0x36, 0xf6, 0x2a, 0x67, 0x58, 0xf7, 0x5e, 0x2a, 0x1c, 0x32, 0xac, 0x55, 0x88, 0xb5, 0xfc, + 0x7a, 0x29, 0x36, 0x88, 0xa2, 0x0f, 0x60, 0x22, 0x20, 0x61, 0xe4, 0x04, 0x91, 0x68, 0xa5, 0xa2, + 0xac, 0x72, 0x13, 0x58, 0x07, 0xf0, 0xeb, 0x44, 0xdc, 0x4c, 0x0c, 0xc1, 0x26, 0x05, 0x14, 0x01, + 0x32, 0x0a, 0x70, 0xb7, 0x45, 0xc2, 0xca, 0xd9, 0x7c, 0x6b, 0x66, 0x92, 0x2c, 0xad, 0xb0, 0x30, + 0x2b, 0x3a, 0x8f, 0x70, 0x8a, 0x16, 0xce, 0xa0, 0x8f, 0xbe, 0x22, 0x0d, 0x1d, 0x6b, 0x7e, 0xd7, + 0x8b, 0xc2, 0xca, 0x28, 0x6b, 0x2f, 0xd3, 0x22, 0x7e, 0x37, 0xc6, 0x4b, 0x5a, 0x42, 0x78, 0x65, + 0x6c, 0x90, 0x42, 0x5f, 0x87, 0x09, 0xfe, 0x9f, 0x1b, 0x72, 0xc3, 0xca, 0x29, 0x46, 0xfb, 0x62, + 0x3e, 0x6d, 0x8e, 0xb8, 0x70, 0x4a, 0x10, 0x9f, 0xd0, 0x4b, 0x43, 0x6c, 0x52, 0x43, 0x18, 0x26, + 0x5a, 0xee, 0x2e, 0xf1, 0x48, 0x18, 0xd6, 0x02, 0xff, 0x3e, 0x11, 0x7a, 0xe9, 0xb3, 0xd9, 0x86, + 0x5f, 0xff, 0x3e, 0x11, 0x57, 0x4f, 0xbd, 0x0e, 0x36, 0x49, 0xa0, 0x3b, 0x30, 0x19, 0x10, 0xa7, + 0xe9, 0xc6, 0x44, 0xc7, 0x7a, 0x11, 0x65, 0xd7, 0x75, 0x6c, 0x54, 0xc2, 0x09, 0x22, 0xe8, 0x36, + 0x8c, 0xb3, 0x81, 0xef, 0x76, 0x38, 0xd1, 0xd3, 0xbd, 0x88, 0x32, 0x37, 0x86, 0xba, 0x56, 0x05, + 0x1b, 0x04, 0xd0, 0xfb, 0x30, 0xda, 0x72, 0x37, 0x49, 0x63, 0xaf, 0xd1, 0x22, 0x95, 0x71, 0x46, + 0x2d, 0x93, 0x05, 0xdf, 0x92, 0x48, 0xfc, 0x56, 0xa0, 0xfe, 0xe2, 0xb8, 0x3a, 0xba, 0x0b, 0xa7, + 0x23, 0x12, 0xb4, 0x5d, 0xcf, 0xa1, 0xac, 0x53, 0x5c, 0x44, 0x99, 0x3d, 0x7e, 0x82, 0xad, 0xe9, + 0x0b, 0x62, 0x36, 0x4e, 0x6f, 0x64, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x21, 0x54, 0x32, 0x20, 0x7c, + 0xb7, 0x9c, 0x64, 0x94, 0xdf, 0x11, 0x94, 0x2b, 0x1b, 0x39, 0x78, 0x87, 0x05, 0x30, 0x9c, 0x4b, + 0x1d, 0xdd, 0x86, 0x29, 0xc6, 0xaf, 0x6b, 0xdd, 0x56, 0x4b, 0x34, 0x38, 0xc9, 0x1a, 0x7c, 0x41, + 0x4a, 0x2f, 0xab, 0x26, 0xf8, 0x70, 0xbf, 0x0a, 0xf1, 0x3f, 0x9c, 0xac, 0x8d, 0xee, 0x33, 0xd3, + 0x6f, 0x37, 0x70, 0xa3, 0x3d, 0xba, 0xe9, 0xc8, 0xc3, 0xa8, 0x32, 0x55, 0xa8, 0x06, 0xd3, 0x51, + 0x95, 0x7d, 0x58, 0x2f, 0xc4, 0x49, 0x82, 0xf4, 0x00, 0x0a, 0xa3, 0xa6, 0xeb, 0x55, 0xa6, 0xf9, + 0x2d, 0x4e, 0xf2, 0xef, 0x3a, 0x2d, 0xc4, 0x1c, 0xc6, 0xcc, 0xbe, 0xf4, 0xc7, 0x6d, 0x7a, 0xce, + 0xcf, 0x30, 0xc4, 0xd8, 0xec, 0x2b, 0x01, 0x38, 0xc6, 0xa1, 0xa2, 0x77, 0x14, 0xed, 0x55, 0x10, + 0x43, 0x55, 0x6c, 0x78, 0x63, 0xe3, 0x2b, 0x98, 0x96, 0xdb, 0xbf, 0x6b, 0xc1, 0x45, 0xc5, 0x46, + 0x96, 0x1f, 0x46, 0xc4, 0x6b, 0x92, 0xa6, 0xce, 0x73, 0x49, 0x18, 0xa1, 0xb7, 0x61, 0xa2, 0x21, + 0x71, 0x34, 0x13, 0xb5, 0xda, 0xa5, 0x8b, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x1a, 0xe3, 0xc6, 0x8c, + 0x9e, 0xa6, 0x6c, 0xd2, 0x59, 0xac, 0x82, 0x61, 0x03, 0x13, 0xbd, 0x09, 0x63, 0x01, 0xef, 0x01, + 0xab, 0x58, 0x36, 0x3d, 0x25, 0x70, 0x0c, 0xc2, 0x3a, 0x9e, 0x7d, 0x1f, 0x26, 0x55, 0x87, 0xd8, + 0x34, 0xa3, 0x2a, 0x0c, 0x32, 0xf9, 0x59, 0xe8, 0xa1, 0x47, 0xe9, 0xa8, 0x32, 0xd9, 0x1a, 0xf3, + 0x72, 0x36, 0xaa, 0xee, 0x23, 0xb2, 0xb0, 0x17, 0x11, 0xae, 0xd4, 0x29, 0x6b, 0xa3, 0x2a, 0x01, + 0x38, 0xc6, 0xb1, 0xff, 0x7f, 0x7e, 0x0f, 0x89, 0x8f, 0xdb, 0x3e, 0x04, 0x8c, 0x57, 0x60, 0x84, + 0x79, 0xd0, 0xf8, 0x01, 0x37, 0x73, 0x0f, 0xc6, 0x37, 0x8f, 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0x63, + 0xcc, 0x59, 0x15, 0x2e, 0x1d, 0xa5, 0xc7, 0x9c, 0xd5, 0x33, 0x71, 0xd1, 0x35, 0x18, 0x61, 0xce, + 0x62, 0x0d, 0xbf, 0x25, 0xc4, 0x76, 0x29, 0xe2, 0x8d, 0xd4, 0x44, 0xf9, 0xa1, 0xf6, 0x1b, 0x2b, + 0x6c, 0x74, 0x09, 0x86, 0x68, 0x17, 0x56, 0x6b, 0x42, 0x2e, 0x51, 0x2a, 0xd5, 0x1b, 0xac, 0x14, + 0x0b, 0xa8, 0xfd, 0x9b, 0x16, 0x13, 0x4a, 0xd3, 0x87, 0x27, 0xba, 0x91, 0x98, 0x6f, 0x3e, 0x20, + 0xcf, 0x67, 0xcd, 0xf7, 0x61, 0xf1, 0xfc, 0x7f, 0x35, 0x79, 0xc4, 0xf2, 0xa5, 0xf3, 0x86, 0x1c, + 0x82, 0xe4, 0x31, 0xfb, 0x4c, 0xbc, 0x6e, 0x69, 0x7f, 0x8a, 0xce, 0x5a, 0xfb, 0xb7, 0xf8, 0x35, + 0x39, 0x75, 0x7c, 0xa2, 0x25, 0x18, 0x72, 0xd8, 0x0d, 0x43, 0x74, 0xfc, 0x15, 0x39, 0x00, 0xf3, + 0xac, 0xf4, 0x50, 0xd8, 0xab, 0x93, 0xf5, 0x38, 0x14, 0x8b, 0xba, 0xe8, 0x9b, 0x30, 0x4a, 0x1e, + 0xba, 0xd1, 0xa2, 0xdf, 0x14, 0x0b, 0xca, 0xd4, 0x95, 0x16, 0x9e, 0xe0, 0xb7, 0xbd, 0x65, 0x59, + 0x95, 0x33, 0x6d, 0xf5, 0x17, 0xc7, 0x44, 0xed, 0x9f, 0xb3, 0xa0, 0xda, 0xa3, 0x36, 0xba, 0x47, + 0x85, 0x65, 0x12, 0x38, 0x91, 0x2f, 0xed, 0x9e, 0x6f, 0xcb, 0x65, 0x70, 0x5b, 0x94, 0x1f, 0xee, + 0x57, 0x5f, 0xec, 0x41, 0x46, 0xa2, 0x62, 0x45, 0x0c, 0xd9, 0x30, 0xc4, 0xd4, 0x25, 0x5c, 0xfa, + 0x1f, 0xe4, 0xc6, 0xcf, 0xbb, 0xac, 0x04, 0x0b, 0x88, 0xfd, 0x57, 0x4a, 0xda, 0x3e, 0xac, 0x47, + 0x4e, 0x44, 0x50, 0x0d, 0x86, 0x1f, 0x38, 0x6e, 0xe4, 0x7a, 0x5b, 0xe2, 0x8a, 0x52, 0x2c, 0x93, + 0xb1, 0x4a, 0xf7, 0x78, 0x05, 0x2e, 0x68, 0x8b, 0x3f, 0x58, 0x92, 0xa1, 0x14, 0x83, 0xae, 0xe7, + 0x51, 0x8a, 0xa5, 0x7e, 0x29, 0x62, 0x5e, 0x81, 0x53, 0x14, 0x7f, 0xb0, 0x24, 0x83, 0x3e, 0x04, + 0x90, 0xc7, 0x0a, 0x69, 0x0a, 0x35, 0xf7, 0x2b, 0xbd, 0x89, 0x6e, 0xa8, 0x3a, 0x5c, 0x8f, 0x1e, + 0xff, 0xc7, 0x1a, 0x3d, 0x3b, 0xd2, 0x76, 0x8d, 0xde, 0x19, 0xf4, 0x35, 0xca, 0xd7, 0x9d, 0x20, + 0x22, 0xcd, 0xf9, 0x48, 0x0c, 0xce, 0x67, 0xfb, 0xd3, 0x63, 0x6c, 0xb8, 0x6d, 0xa2, 0x9f, 0x01, + 0x82, 0x08, 0x8e, 0xe9, 0xd9, 0xbf, 0x5e, 0x86, 0x4a, 0x5e, 0x77, 0x29, 0x5b, 0x92, 0xab, 0x4a, + 0xd8, 0x1f, 0x14, 0x5b, 0x92, 0x4b, 0x00, 0x2b, 0x0c, 0xca, 0x1f, 0x42, 0x77, 0x4b, 0xaa, 0xa1, + 0x06, 0x63, 0xfe, 0x50, 0x67, 0xa5, 0x58, 0x40, 0x29, 0x5e, 0x40, 0x9c, 0x50, 0xf8, 0x89, 0x6a, + 0x7c, 0x04, 0xb3, 0x52, 0x2c, 0xa0, 0xba, 0x42, 0x7c, 0xa0, 0x87, 0x42, 0xdc, 0x18, 0xa2, 0xc1, + 0x27, 0x3b, 0x44, 0xe8, 0x1b, 0x00, 0x9b, 0xae, 0xe7, 0x86, 0xdb, 0x8c, 0xfa, 0xd0, 0x91, 0xa9, + 0xab, 0xfb, 0xdb, 0x8a, 0xa2, 0x82, 0x35, 0x8a, 0xf4, 0x2c, 0x53, 0x2c, 0x7a, 0x75, 0x89, 0x79, + 0xa9, 0x68, 0x67, 0x59, 0x7c, 0x5e, 0x2d, 0x61, 0x1d, 0xcf, 0xfe, 0x56, 0x72, 0xbd, 0x88, 0x1d, + 0xa0, 0x8d, 0xaf, 0xd5, 0xef, 0xf8, 0x96, 0x8a, 0xc7, 0xd7, 0xfe, 0x17, 0xa3, 0x30, 0x65, 0x34, + 0xd6, 0x0d, 0xfb, 0x38, 0xd5, 0xae, 0x53, 0xa9, 0xc5, 0x89, 0x88, 0xd8, 0x7f, 0x76, 0xef, 0xad, + 0xa2, 0x4b, 0x36, 0x74, 0x07, 0xf0, 0xfa, 0xe8, 0x1b, 0x30, 0xda, 0x72, 0x42, 0xa6, 0x5c, 0x27, + 0x62, 0xdf, 0xf5, 0x43, 0x2c, 0xd6, 0x5d, 0x38, 0x61, 0xa4, 0x89, 0x8a, 0x9c, 0x76, 0x4c, 0x92, + 0x8a, 0x57, 0x54, 0x28, 0x97, 0x8e, 0xc8, 0xaa, 0x13, 0x54, 0x72, 0xdf, 0xc3, 0x1c, 0x26, 0x84, + 0x15, 0xba, 0x2a, 0x16, 0xe9, 0x15, 0x86, 0x2d, 0xb3, 0x41, 0x43, 0x58, 0x51, 0x30, 0x6c, 0x60, + 0xc6, 0xea, 0x83, 0xa1, 0x02, 0xf5, 0xc1, 0x4b, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0x63, + 0x95, 0x17, 0x63, 0x09, 0x4f, 0x2e, 0x98, 0x91, 0xfe, 0x16, 0x0c, 0x7a, 0x01, 0x86, 0xc5, 0xa2, + 0x66, 0x1e, 0x42, 0x23, 0x9c, 0xcb, 0x89, 0x25, 0x8f, 0x25, 0x0c, 0xfd, 0xbc, 0x05, 0xc8, 0x69, + 0xb5, 0xfc, 0x06, 0xe3, 0x50, 0xea, 0x1e, 0x0e, 0xec, 0x7e, 0xf6, 0x76, 0xcf, 0x61, 0xef, 0x86, + 0x73, 0xf3, 0xa9, 0xda, 0x5c, 0xa9, 0xff, 0x96, 0xbc, 0x7e, 0xa6, 0x11, 0xf4, 0xe3, 0xfe, 0x96, + 0x1b, 0x46, 0xdf, 0xfe, 0x57, 0x89, 0xe3, 0x3f, 0xa3, 0x4b, 0xe8, 0x8e, 0xae, 0x27, 0x18, 0x3b, + 0xa2, 0x9e, 0x60, 0x22, 0x57, 0x47, 0xf0, 0xe7, 0x12, 0xb7, 0xde, 0x71, 0xf6, 0xe5, 0x2f, 0xf4, + 0xb8, 0xf5, 0x0a, 0xcb, 0x4f, 0x3f, 0x77, 0xdf, 0x9a, 0x70, 0x59, 0x98, 0x60, 0x5d, 0x2e, 0xd6, + 0xd7, 0xdc, 0x09, 0x49, 0xb0, 0x70, 0x56, 0x7a, 0x34, 0x1c, 0xea, 0xd2, 0x9d, 0xe6, 0xe2, 0xf0, + 0xe3, 0x16, 0x54, 0xd2, 0x03, 0xc4, 0xbb, 0x54, 0x99, 0x64, 0xfd, 0xb7, 0x8b, 0x46, 0x46, 0x74, + 0x5e, 0x7a, 0x66, 0x57, 0xe6, 0x73, 0x68, 0xe1, 0xdc, 0x56, 0xd0, 0x35, 0x80, 0x30, 0xf2, 0x3b, + 0x9c, 0xd7, 0xb3, 0x1b, 0xd0, 0x28, 0xf3, 0x0d, 0x82, 0xba, 0x2a, 0x3d, 0x8c, 0xcf, 0x02, 0x0d, + 0x77, 0xb6, 0x0b, 0x67, 0x72, 0x56, 0x4c, 0x86, 0x69, 0x66, 0x49, 0x37, 0xcd, 0xf4, 0x50, 0xe8, + 0xcf, 0xc9, 0x39, 0x9d, 0xfb, 0xa0, 0xeb, 0x78, 0x91, 0x1b, 0xed, 0xe9, 0xa6, 0x1c, 0x0f, 0xcc, + 0xa1, 0x44, 0x5f, 0x87, 0xc1, 0x96, 0xeb, 0x75, 0x1f, 0x8a, 0x33, 0xf6, 0x52, 0xf6, 0x9d, 0xd9, + 0xeb, 0x3e, 0x34, 0x27, 0xa7, 0x4a, 0xb7, 0x32, 0x2b, 0x3f, 0xdc, 0xaf, 0xa2, 0x34, 0x02, 0xe6, + 0x54, 0xed, 0xcf, 0xc2, 0xe4, 0x92, 0x43, 0xda, 0xbe, 0xb7, 0xec, 0x35, 0x3b, 0xbe, 0xeb, 0x45, + 0xa8, 0x02, 0x03, 0x4c, 0x7c, 0xe7, 0x47, 0xeb, 0x00, 0x1d, 0x7c, 0xcc, 0x4a, 0xec, 0x2d, 0x38, + 0xb5, 0xe4, 0x3f, 0xf0, 0x1e, 0x38, 0x41, 0x73, 0xbe, 0xb6, 0xaa, 0xa9, 0xb6, 0xd7, 0xa5, 0x6a, + 0xd5, 0xca, 0x57, 0x5c, 0x69, 0x35, 0xf9, 0x22, 0x5c, 0x71, 0x5b, 0x24, 0xc7, 0x00, 0xf1, 0xd7, + 0x4b, 0x46, 0x4b, 0x31, 0xbe, 0x32, 0x9f, 0x5b, 0xb9, 0x9e, 0x37, 0x1f, 0xc0, 0xc8, 0xa6, 0x4b, + 0x5a, 0x4d, 0x4c, 0x36, 0xc5, 0x6c, 0xbc, 0x98, 0xef, 0x9b, 0xbb, 0x42, 0x31, 0x95, 0x9d, 0x9f, + 0x29, 0x66, 0x57, 0x44, 0x65, 0xac, 0xc8, 0xa0, 0x1d, 0x98, 0x96, 0x73, 0x26, 0xa1, 0x82, 0xdf, + 0xbf, 0x54, 0xb4, 0x7c, 0x4d, 0xe2, 0xec, 0x9d, 0x02, 0x4e, 0x90, 0xc1, 0x29, 0xc2, 0xe8, 0x1c, + 0x0c, 0xb4, 0xa9, 0x64, 0x33, 0xc0, 0x86, 0x9f, 0x69, 0x62, 0x99, 0x52, 0x99, 0x95, 0xda, 0x7f, + 0xc3, 0x82, 0x33, 0xa9, 0x91, 0x11, 0xca, 0xf5, 0x27, 0x3c, 0x0b, 0x49, 0x65, 0x77, 0xa9, 0xb7, + 0xb2, 0xdb, 0xfe, 0x2f, 0x2c, 0x38, 0xb9, 0xdc, 0xee, 0x44, 0x7b, 0x4b, 0xae, 0xe9, 0x26, 0xf3, + 0x05, 0x18, 0x6a, 0x93, 0xa6, 0xdb, 0x6d, 0x8b, 0x99, 0xab, 0xca, 0xd3, 0x7f, 0x8d, 0x95, 0x52, + 0x0e, 0x52, 0x8f, 0xfc, 0xc0, 0xd9, 0x22, 0xbc, 0x00, 0x0b, 0x74, 0x26, 0x43, 0xb9, 0x8f, 0xc8, + 0x2d, 0xb7, 0xed, 0x46, 0x8f, 0xb7, 0xbb, 0x84, 0x87, 0x8b, 0x24, 0x82, 0x63, 0x7a, 0xf6, 0xf7, + 0x2d, 0x98, 0x92, 0xeb, 0x7e, 0xbe, 0xd9, 0x0c, 0x48, 0x18, 0xa2, 0x59, 0x28, 0xb9, 0x1d, 0xd1, + 0x4b, 0x10, 0xbd, 0x2c, 0xad, 0xd6, 0x70, 0xc9, 0xed, 0xc8, 0x0b, 0xb1, 0x17, 0x5f, 0xee, 0x8d, + 0x0b, 0xb1, 0xc7, 0xde, 0x4c, 0x48, 0x0c, 0x74, 0x19, 0x46, 0x3c, 0xbf, 0xc9, 0xef, 0x94, 0xc2, + 0xdd, 0x83, 0x62, 0xae, 0x8b, 0x32, 0xac, 0xa0, 0xa8, 0x06, 0xa3, 0xdc, 0x15, 0x3c, 0x5e, 0xb4, + 0x7d, 0x39, 0x94, 0xb3, 0x2f, 0xdb, 0x90, 0x35, 0x71, 0x4c, 0xc4, 0xfe, 0xa7, 0x16, 0x8c, 0xcb, + 0x2f, 0xeb, 0xf3, 0xb6, 0x4f, 0xb7, 0x56, 0x7c, 0xd3, 0x8f, 0xb7, 0x16, 0xbd, 0xad, 0x33, 0x88, + 0x71, 0x49, 0x2f, 0x1f, 0xe9, 0x92, 0x7e, 0x15, 0xc6, 0x9c, 0x4e, 0xa7, 0x66, 0xde, 0xf0, 0xd9, + 0x52, 0x9a, 0x8f, 0x8b, 0xb1, 0x8e, 0x63, 0xff, 0x6c, 0x09, 0x26, 0xe5, 0x17, 0xd4, 0xbb, 0xf7, + 0x43, 0x12, 0xa1, 0x0d, 0x18, 0x75, 0xf8, 0x2c, 0x11, 0xb9, 0xc8, 0x9f, 0xcb, 0x56, 0xe1, 0x1b, + 0x53, 0x1a, 0x0b, 0xd2, 0xf3, 0xb2, 0x36, 0x8e, 0x09, 0xa1, 0x16, 0xcc, 0x78, 0x7e, 0xc4, 0x84, + 0x2a, 0x05, 0x2f, 0xf2, 0xaa, 0x48, 0x52, 0x3f, 0x2b, 0xa8, 0xcf, 0xac, 0x27, 0xa9, 0xe0, 0x34, + 0x61, 0xb4, 0x2c, 0xcd, 0x22, 0xe5, 0x7c, 0xcd, 0xb2, 0x3e, 0x71, 0xd9, 0x56, 0x11, 0xfb, 0x9f, + 0x58, 0x30, 0x2a, 0xd1, 0x8e, 0xc3, 0x81, 0x66, 0x0d, 0x86, 0x43, 0x36, 0x09, 0x72, 0x68, 0xec, + 0xa2, 0x8e, 0xf3, 0xf9, 0x8a, 0x65, 0x45, 0xfe, 0x3f, 0xc4, 0x92, 0x06, 0xb3, 0x8a, 0xab, 0xee, + 0x7f, 0x42, 0xac, 0xe2, 0xaa, 0x3f, 0x39, 0x87, 0xd2, 0xbf, 0x61, 0x7d, 0xd6, 0xcc, 0x4c, 0xf4, + 0x4a, 0xd3, 0x09, 0xc8, 0xa6, 0xfb, 0x30, 0x79, 0xa5, 0xa9, 0xb1, 0x52, 0x2c, 0xa0, 0xe8, 0x43, + 0x18, 0x6f, 0x48, 0x73, 0x68, 0xbc, 0xc3, 0x2f, 0x15, 0x9a, 0xe6, 0x95, 0x17, 0x07, 0x57, 0xac, + 0x2f, 0x6a, 0xf5, 0xb1, 0x41, 0xcd, 0x74, 0x75, 0x2c, 0xf7, 0x72, 0x75, 0x8c, 0xe9, 0xe6, 0x3b, + 0xfe, 0xfd, 0x9c, 0x05, 0x43, 0xdc, 0x0c, 0xd6, 0x9f, 0x15, 0x52, 0x73, 0x6a, 0x89, 0xc7, 0x8e, + 0x29, 0x57, 0x84, 0x64, 0x83, 0xd6, 0x60, 0x94, 0xfd, 0x60, 0x66, 0xbc, 0x72, 0xfe, 0xc3, 0x48, + 0xde, 0xaa, 0xde, 0xc1, 0xbb, 0xb2, 0x1a, 0x8e, 0x29, 0xd8, 0x7f, 0x54, 0xa6, 0xdc, 0x2d, 0x46, + 0x35, 0x0e, 0x7d, 0xeb, 0xe9, 0x1d, 0xfa, 0xa5, 0xa7, 0x75, 0xe8, 0x6f, 0xc1, 0x54, 0x43, 0x73, + 0x81, 0x89, 0x67, 0xf2, 0x72, 0xe1, 0x22, 0xd1, 0xbc, 0x65, 0xb8, 0xca, 0x7e, 0xd1, 0x24, 0x82, + 0x93, 0x54, 0xd1, 0xd7, 0x60, 0x9c, 0xcf, 0xb3, 0x68, 0x85, 0x7b, 0x8b, 0xbe, 0x90, 0xbf, 0x5e, + 0xf4, 0x26, 0xb8, 0x89, 0x47, 0xab, 0x8e, 0x0d, 0x62, 0xa8, 0x0e, 0xb0, 0xe9, 0xb6, 0x88, 0x20, + 0x5d, 0xe0, 0xd8, 0xbd, 0xc2, 0xb1, 0x14, 0xe1, 0x49, 0xae, 0x87, 0x90, 0x55, 0xb1, 0x46, 0xc6, + 0xfe, 0x77, 0x16, 0xa0, 0xe5, 0xce, 0x36, 0x69, 0x93, 0xc0, 0x69, 0xc5, 0xe6, 0xf1, 0x9f, 0xb4, + 0xa0, 0x42, 0x52, 0xc5, 0x8b, 0x7e, 0xbb, 0x2d, 0x34, 0x0c, 0x39, 0x4a, 0xb0, 0xe5, 0x9c, 0x3a, + 0xf1, 0x2d, 0x23, 0x0f, 0x03, 0xe7, 0xb6, 0x87, 0xd6, 0xe0, 0x04, 0x3f, 0x7a, 0x0d, 0xbb, 0x82, + 0xd8, 0x11, 0xcf, 0x08, 0xc2, 0x27, 0x36, 0xd2, 0x28, 0x38, 0xab, 0x9e, 0xfd, 0x0f, 0x26, 0x21, + 0xb7, 0x17, 0x9f, 0xfa, 0x05, 0x7c, 0xea, 0x17, 0xf0, 0xa9, 0x5f, 0xc0, 0xa7, 0x7e, 0x01, 0x9f, + 0xfa, 0x05, 0x7c, 0xea, 0x17, 0xf0, 0xa9, 0x5f, 0x80, 0xe6, 0x17, 0xf0, 0x57, 0x2d, 0x38, 0xa5, + 0x0e, 0x4d, 0x43, 0xf7, 0xf0, 0xa3, 0x70, 0x82, 0x6f, 0xb7, 0xc5, 0x96, 0xe3, 0xb6, 0x37, 0x48, + 0xbb, 0xd3, 0x72, 0x22, 0xe9, 0x73, 0x78, 0x35, 0x73, 0xe5, 0x26, 0x1e, 0x36, 0x19, 0x15, 0xf9, + 0x0b, 0xd1, 0x0c, 0x00, 0xce, 0x6a, 0xc6, 0xfe, 0xf5, 0x11, 0x18, 0x5c, 0xde, 0x25, 0x5e, 0x74, + 0x0c, 0xb7, 0xb4, 0x06, 0x4c, 0xba, 0xde, 0xae, 0xdf, 0xda, 0x25, 0x4d, 0x0e, 0x3f, 0x8a, 0x32, + 0xe1, 0xb4, 0x20, 0x3d, 0xb9, 0x6a, 0x90, 0xc0, 0x09, 0x92, 0x4f, 0xc3, 0x50, 0x76, 0x1d, 0x86, + 0xf8, 0x91, 0x27, 0x84, 0xc6, 0x4c, 0x9e, 0xcd, 0x06, 0x51, 0x1c, 0xe4, 0xb1, 0x11, 0x8f, 0x1f, + 0xa9, 0xa2, 0x3a, 0xfa, 0x16, 0x4c, 0x6e, 0xba, 0x41, 0x18, 0x6d, 0xb8, 0x6d, 0x7a, 0x3e, 0xb4, + 0x3b, 0x8f, 0x61, 0x18, 0x53, 0xe3, 0xb0, 0x62, 0x50, 0xc2, 0x09, 0xca, 0x68, 0x0b, 0x26, 0x5a, + 0x8e, 0xde, 0xd4, 0xf0, 0x91, 0x9b, 0x52, 0xa7, 0xc3, 0x2d, 0x9d, 0x10, 0x36, 0xe9, 0xd2, 0xed, + 0xd4, 0x60, 0xb6, 0x9d, 0x11, 0xa6, 0x99, 0x51, 0xdb, 0x89, 0x1b, 0x75, 0x38, 0x8c, 0x8a, 0x85, + 0xec, 0x79, 0xd0, 0xa8, 0x29, 0x16, 0x6a, 0x8f, 0x80, 0xbe, 0x09, 0xa3, 0x84, 0x0e, 0x21, 0x25, + 0x2c, 0x0e, 0x98, 0x2b, 0xfd, 0xf5, 0x75, 0xcd, 0x6d, 0x04, 0xbe, 0x69, 0x92, 0x5c, 0x96, 0x94, + 0x70, 0x4c, 0x14, 0x2d, 0xc2, 0x50, 0x48, 0x02, 0x57, 0x99, 0x3d, 0x0a, 0xa6, 0x91, 0xa1, 0x71, + 0x2b, 0x3c, 0xff, 0x8d, 0x45, 0x55, 0xba, 0xbc, 0x84, 0x3b, 0xc3, 0xb8, 0xb9, 0xbc, 0x12, 0x0e, + 0x0b, 0xef, 0xc3, 0x70, 0x40, 0x5a, 0xcc, 0xe6, 0x3d, 0xd1, 0xff, 0x22, 0xe7, 0x26, 0x74, 0x5e, + 0x0f, 0x4b, 0x02, 0xe8, 0x26, 0x95, 0x57, 0xa8, 0x58, 0xe9, 0x7a, 0x5b, 0xea, 0xd1, 0x8c, 0x60, + 0xb4, 0x4a, 0x7c, 0xc7, 0x31, 0x86, 0x7c, 0x7d, 0x8e, 0x33, 0xaa, 0xa1, 0xeb, 0x30, 0xa3, 0x4a, + 0x57, 0xbd, 0x30, 0x72, 0x28, 0x83, 0xe3, 0x96, 0x07, 0xa5, 0x2a, 0xc2, 0x49, 0x04, 0x9c, 0xae, + 0x63, 0xff, 0xa2, 0x05, 0x7c, 0x9c, 0x8f, 0x41, 0x41, 0xf2, 0xae, 0xa9, 0x20, 0x39, 0x9b, 0x3b, + 0x73, 0x39, 0xca, 0x91, 0x5f, 0xb4, 0x60, 0x4c, 0x9b, 0xd9, 0x78, 0xcd, 0x5a, 0x05, 0x6b, 0xb6, + 0x0b, 0xd3, 0x74, 0xa5, 0xdf, 0xbe, 0x1f, 0x92, 0x60, 0x97, 0x34, 0xd9, 0xc2, 0x2c, 0x3d, 0xde, + 0xc2, 0x54, 0x0e, 0xfa, 0xb7, 0x12, 0x04, 0x71, 0xaa, 0x09, 0xfb, 0x9b, 0xb2, 0xab, 0xea, 0x3d, + 0x43, 0x43, 0xcd, 0x79, 0xe2, 0x3d, 0x83, 0x9a, 0x55, 0x1c, 0xe3, 0xd0, 0xad, 0xb6, 0xed, 0x87, + 0x51, 0xf2, 0x3d, 0xc3, 0x0d, 0x3f, 0x8c, 0x30, 0x83, 0xd8, 0xaf, 0x03, 0x2c, 0x3f, 0x24, 0x0d, + 0xbe, 0x62, 0xf5, 0xab, 0x96, 0x95, 0x7f, 0xd5, 0xb2, 0x7f, 0xcf, 0x82, 0xc9, 0x95, 0x45, 0xe3, + 0xe4, 0x9a, 0x03, 0xe0, 0xf7, 0xc3, 0x7b, 0xf7, 0xd6, 0xa5, 0x2f, 0x18, 0x77, 0xd6, 0x50, 0xa5, + 0x58, 0xc3, 0x40, 0x67, 0xa1, 0xdc, 0xea, 0x7a, 0x42, 0x83, 0x3b, 0x4c, 0x8f, 0xc7, 0x5b, 0x5d, + 0x0f, 0xd3, 0x32, 0xed, 0xe5, 0x69, 0xb9, 0xef, 0x97, 0xa7, 0x3d, 0x03, 0x60, 0xa1, 0x2a, 0x0c, + 0x3e, 0x78, 0xe0, 0x36, 0x79, 0x5c, 0x0f, 0xe1, 0xa7, 0x76, 0xef, 0xde, 0xea, 0x52, 0x88, 0x79, + 0xb9, 0xfd, 0xcb, 0x16, 0x4c, 0x25, 0x6e, 0xfb, 0xf4, 0xd6, 0xb8, 0xab, 0xa2, 0x2a, 0x25, 0x83, + 0xc7, 0x68, 0xf1, 0x96, 0x34, 0xac, 0x3e, 0x5e, 0x5c, 0x8b, 0x17, 0x3b, 0xe5, 0x3e, 0x5e, 0xec, + 0x14, 0xbb, 0xe1, 0x7f, 0xaf, 0x0c, 0xb3, 0x2b, 0x2d, 0xf2, 0xf0, 0x63, 0x86, 0x63, 0xe9, 0xf7, + 0xa9, 0xef, 0xd1, 0xd4, 0x77, 0x47, 0x7d, 0xce, 0xdd, 0x7b, 0x0a, 0x37, 0x61, 0x98, 0x7f, 0xba, + 0x0c, 0xce, 0x92, 0x69, 0x4c, 0xcf, 0x1f, 0x90, 0x39, 0x3e, 0x84, 0xc2, 0x98, 0xae, 0xce, 0x78, + 0x51, 0x8a, 0x25, 0xf1, 0xd9, 0xb7, 0x60, 0x5c, 0xc7, 0x3c, 0x52, 0x60, 0x85, 0xbf, 0x50, 0x86, + 0x69, 0xda, 0x83, 0xa7, 0x3a, 0x11, 0x77, 0xd2, 0x13, 0xf1, 0xa4, 0x1f, 0xd7, 0xf7, 0x9e, 0x8d, + 0x0f, 0x93, 0xb3, 0x71, 0x35, 0x6f, 0x36, 0x8e, 0x7b, 0x0e, 0xfe, 0xa2, 0x05, 0x27, 0x56, 0x5a, + 0x7e, 0x63, 0x27, 0xf1, 0x00, 0xfe, 0x4d, 0x18, 0xa3, 0x27, 0x48, 0x68, 0xc4, 0x82, 0x32, 0xa2, + 0x83, 0x09, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, 0x77, 0xee, 0xac, 0x2e, 0x65, 0x05, 0x15, 0x13, 0x20, + 0xac, 0xe3, 0xd9, 0xff, 0xdc, 0x82, 0xf3, 0xd7, 0x17, 0x97, 0xe3, 0xa5, 0x98, 0x8a, 0x6b, 0x76, + 0x09, 0x86, 0x3a, 0x4d, 0xad, 0x2b, 0xb1, 0x52, 0x7e, 0x89, 0xf5, 0x42, 0x40, 0x3f, 0x29, 0x21, + 0x04, 0xef, 0x00, 0x5c, 0xc7, 0xb5, 0x45, 0x71, 0x54, 0x48, 0x1b, 0x9c, 0x95, 0x6b, 0x83, 0x7b, + 0x01, 0x86, 0xe9, 0x51, 0xe6, 0x36, 0x64, 0xbf, 0xb9, 0xbb, 0x0c, 0x2f, 0xc2, 0x12, 0x66, 0xff, + 0x82, 0x05, 0x27, 0xae, 0xbb, 0x11, 0x95, 0x33, 0x92, 0x81, 0xbb, 0xa8, 0xa0, 0x11, 0xba, 0x91, + 0x1f, 0xec, 0x25, 0x79, 0x2f, 0x56, 0x10, 0xac, 0x61, 0xf1, 0x0f, 0xda, 0x75, 0xd9, 0x93, 0xba, + 0x92, 0x69, 0xf5, 0xc4, 0xa2, 0x1c, 0x2b, 0x0c, 0x3a, 0x5e, 0x4d, 0x37, 0x60, 0x9c, 0x5e, 0x72, + 0x63, 0x35, 0x5e, 0x4b, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x8f, 0x2d, 0xa8, 0x5e, 0xe7, 0x81, 0x01, + 0x36, 0xc3, 0x1c, 0xa6, 0xfb, 0x3a, 0x8c, 0x12, 0x69, 0x9e, 0x49, 0xfa, 0x72, 0x2b, 0xbb, 0x0d, + 0x8f, 0x1f, 0xa6, 0xf0, 0xfa, 0x38, 0x33, 0x8e, 0x16, 0x66, 0x61, 0x05, 0x10, 0xd1, 0xdb, 0xd2, + 0x03, 0xaa, 0xb1, 0xc8, 0x4c, 0xcb, 0x29, 0x28, 0xce, 0xa8, 0x61, 0xff, 0x0d, 0x0b, 0x4e, 0xa9, + 0x0f, 0xfe, 0xc4, 0x7d, 0xa6, 0xfd, 0xab, 0x25, 0x98, 0xb8, 0xb1, 0xb1, 0x51, 0xbb, 0x4e, 0x22, + 0x6d, 0x55, 0x16, 0x3b, 0x5d, 0x60, 0xcd, 0x76, 0x5c, 0x74, 0xad, 0xed, 0x46, 0x6e, 0x6b, 0x8e, + 0x87, 0x09, 0x9d, 0x5b, 0xf5, 0xa2, 0xdb, 0x41, 0x3d, 0x0a, 0x5c, 0x6f, 0x2b, 0x73, 0xa5, 0x4b, + 0x31, 0xab, 0x9c, 0x27, 0x66, 0xa1, 0xd7, 0x61, 0x88, 0xc5, 0x29, 0x95, 0x93, 0xf0, 0x8c, 0xba, + 0x15, 0xb2, 0xd2, 0xc3, 0xfd, 0xea, 0xe8, 0x1d, 0xbc, 0xca, 0xff, 0x60, 0x81, 0x8a, 0xee, 0xc0, + 0xd8, 0x76, 0x14, 0x75, 0x6e, 0x10, 0xa7, 0x49, 0x02, 0xc9, 0x65, 0x2f, 0x64, 0x71, 0x59, 0x3a, + 0x08, 0x1c, 0x2d, 0x66, 0x4c, 0x71, 0x59, 0x88, 0x75, 0x3a, 0x76, 0x1d, 0x20, 0x86, 0x3d, 0x21, + 0xb3, 0x99, 0xbd, 0x01, 0xa3, 0xf4, 0x73, 0xe7, 0x5b, 0xae, 0x53, 0xec, 0x98, 0xf0, 0x32, 0x8c, + 0x4a, 0xb7, 0x83, 0x50, 0x44, 0x11, 0x62, 0x27, 0x92, 0xf4, 0x4a, 0x08, 0x71, 0x0c, 0xb7, 0x9f, + 0x07, 0xe1, 0x1b, 0x5f, 0x44, 0xd2, 0xde, 0x84, 0x93, 0xcc, 0xc9, 0xdf, 0x89, 0xb6, 0x8d, 0x35, + 0xda, 0x7b, 0x31, 0xbc, 0x22, 0xae, 0xa2, 0x25, 0xe5, 0x6d, 0x25, 0xa3, 0x54, 0x8c, 0x4b, 0x8a, + 0xf1, 0xb5, 0xd4, 0xfe, 0xa3, 0x01, 0x78, 0x66, 0xb5, 0x9e, 0x1f, 0xfe, 0xee, 0x1a, 0x8c, 0x73, + 0x09, 0x97, 0x2e, 0x0d, 0xa7, 0x25, 0xda, 0x55, 0x4a, 0xdb, 0x0d, 0x0d, 0x86, 0x0d, 0x4c, 0x2a, + 0x11, 0xba, 0x1f, 0x79, 0xc9, 0x37, 0xdc, 0xab, 0x1f, 0xac, 0x63, 0x5a, 0x4e, 0xc1, 0x54, 0x58, + 0xe6, 0x2c, 0x5d, 0x81, 0x95, 0xc0, 0xfc, 0x2e, 0x4c, 0xba, 0x61, 0x23, 0x74, 0x57, 0x3d, 0xba, + 0x4f, 0xb5, 0x9d, 0xae, 0xd4, 0x24, 0xb4, 0xd3, 0x0a, 0x8a, 0x13, 0xd8, 0xda, 0xf9, 0x32, 0xd8, + 0xb7, 0xc0, 0xdd, 0x33, 0xf8, 0x0e, 0x65, 0xff, 0x1d, 0xf6, 0x75, 0x21, 0xb3, 0x55, 0x08, 0xf6, + 0xcf, 0x3f, 0x38, 0xc4, 0x12, 0x46, 0xef, 0xa0, 0x8d, 0x6d, 0xa7, 0x33, 0xdf, 0x8d, 0xb6, 0x97, + 0xdc, 0xb0, 0xe1, 0xef, 0x92, 0x60, 0x8f, 0xa9, 0x0f, 0x46, 0xe2, 0x3b, 0xa8, 0x02, 0x2c, 0xde, + 0x98, 0xaf, 0x51, 0x4c, 0x9c, 0xae, 0x83, 0xe6, 0x61, 0x4a, 0x16, 0xd6, 0x49, 0xc8, 0x8e, 0x80, + 0x31, 0x46, 0x46, 0xbd, 0xaa, 0x16, 0xc5, 0x8a, 0x48, 0x12, 0xdf, 0x14, 0x70, 0xe1, 0x49, 0x08, + 0xb8, 0x5f, 0x80, 0x09, 0xd7, 0x73, 0x23, 0xd7, 0x89, 0x7c, 0x6e, 0x68, 0xe3, 0x9a, 0x02, 0xa6, + 0x13, 0x5f, 0xd5, 0x01, 0xd8, 0xc4, 0xb3, 0xff, 0x8f, 0x01, 0x98, 0x61, 0xd3, 0xf6, 0xe9, 0x0a, + 0xfb, 0x61, 0x5a, 0x61, 0x77, 0xd2, 0x2b, 0xec, 0x49, 0x48, 0xee, 0x8f, 0xbd, 0xcc, 0xbe, 0x63, + 0xc1, 0x0c, 0x53, 0xcb, 0x1b, 0xcb, 0xec, 0x0a, 0x8c, 0x06, 0xc6, 0x83, 0xf7, 0x51, 0xdd, 0xfa, + 0x27, 0xdf, 0xae, 0xc7, 0x38, 0xe8, 0x3d, 0x80, 0x4e, 0xac, 0xf6, 0x2f, 0x19, 0x51, 0x8a, 0x21, + 0x57, 0xe3, 0xaf, 0xd5, 0xb1, 0xbf, 0x05, 0xa3, 0xea, 0x45, 0xbb, 0xbc, 0x20, 0x5b, 0x39, 0x17, + 0xe4, 0xde, 0x62, 0x84, 0xf4, 0x4c, 0x2c, 0x67, 0x7a, 0x26, 0xfe, 0x6b, 0x0b, 0x62, 0xa3, 0x0c, + 0xfa, 0x00, 0x46, 0x3b, 0x3e, 0x73, 0x64, 0x0f, 0xe4, 0xeb, 0x90, 0xe7, 0x0b, 0xad, 0x3a, 0x3c, + 0x14, 0x69, 0xc0, 0xa7, 0xa3, 0x26, 0xab, 0xe2, 0x98, 0x0a, 0xba, 0x09, 0xc3, 0x9d, 0x80, 0xd4, + 0x23, 0x16, 0x27, 0xaf, 0x7f, 0x82, 0x7c, 0xf9, 0xf2, 0x8a, 0x58, 0x52, 0x48, 0xf8, 0x05, 0x97, + 0xfb, 0xf7, 0x0b, 0xb6, 0xff, 0x7e, 0x09, 0xa6, 0x93, 0x8d, 0xa0, 0x77, 0x60, 0x80, 0x3c, 0x24, + 0x0d, 0xf1, 0xa5, 0x99, 0xd2, 0x44, 0xac, 0x10, 0xe2, 0x43, 0x47, 0xff, 0x63, 0x56, 0x0b, 0xdd, + 0x80, 0x61, 0x2a, 0x4a, 0x5c, 0x57, 0xd1, 0x64, 0x9f, 0xcd, 0x13, 0x47, 0x94, 0x4c, 0xc6, 0x3f, + 0x4b, 0x14, 0x61, 0x59, 0x9d, 0x39, 0x12, 0x36, 0x3a, 0x75, 0x7a, 0x4b, 0x8b, 0x8a, 0x94, 0x09, + 0x1b, 0x8b, 0x35, 0x8e, 0x24, 0xa8, 0x71, 0x47, 0x42, 0x59, 0x88, 0x63, 0x22, 0xe8, 0x3d, 0x18, + 0x0c, 0x5b, 0x84, 0x74, 0x84, 0xa7, 0x48, 0xa6, 0x4a, 0xb7, 0x4e, 0x11, 0x04, 0x25, 0xa6, 0x02, + 0x62, 0x05, 0x98, 0x57, 0xb4, 0x7f, 0xcd, 0x02, 0xe0, 0x9e, 0x97, 0x8e, 0xb7, 0x45, 0x8e, 0xc1, + 0x0a, 0xb2, 0x04, 0x03, 0x61, 0x87, 0x34, 0x8a, 0xde, 0x77, 0xc4, 0xfd, 0xa9, 0x77, 0x48, 0x23, + 0x5e, 0xed, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0x9f, 0x00, 0x98, 0x8c, 0xd1, 0x56, 0x23, 0xd2, 0x46, + 0xaf, 0x1a, 0x21, 0xb8, 0xce, 0x26, 0x42, 0x70, 0x8d, 0x32, 0x6c, 0x4d, 0xe1, 0xfe, 0x2d, 0x28, + 0xb7, 0x9d, 0x87, 0x42, 0xa3, 0xfa, 0x72, 0x71, 0x37, 0x28, 0xfd, 0xb9, 0x35, 0xe7, 0x21, 0xbf, + 0xc1, 0xbf, 0x2c, 0x77, 0xe7, 0x9a, 0xf3, 0xb0, 0xe7, 0x1b, 0x04, 0xda, 0x08, 0x6b, 0xcb, 0xf5, + 0x84, 0x53, 0x61, 0x5f, 0x6d, 0xb9, 0x5e, 0xb2, 0x2d, 0xd7, 0xeb, 0xa3, 0x2d, 0xd7, 0x43, 0x8f, + 0x60, 0x58, 0xf8, 0xfc, 0x8a, 0xd8, 0xa0, 0x57, 0xfa, 0x68, 0x4f, 0xb8, 0x0c, 0xf3, 0x36, 0xaf, + 0x48, 0x0d, 0x85, 0x28, 0xed, 0xd9, 0xae, 0x6c, 0x10, 0xfd, 0x35, 0x0b, 0x26, 0xc5, 0x6f, 0xf1, + 0x9c, 0x56, 0x48, 0xf0, 0x9f, 0xef, 0xbf, 0x0f, 0xa2, 0x22, 0xef, 0xca, 0xe7, 0xe5, 0x61, 0x6b, + 0x02, 0x7b, 0xf6, 0x28, 0xd1, 0x0b, 0xf4, 0xf7, 0x2d, 0x38, 0xd9, 0x76, 0x1e, 0xf2, 0x16, 0x79, + 0x19, 0x76, 0x22, 0xd7, 0x17, 0x6e, 0x2e, 0xef, 0xf4, 0x37, 0xfd, 0xa9, 0xea, 0xbc, 0x93, 0xd2, + 0xba, 0x7c, 0x32, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, 0x35, 0xbb, 0x09, 0x23, 0x72, 0xbd, 0x3d, + 0xcd, 0x07, 0x0d, 0xac, 0x1d, 0xb1, 0xd6, 0x9e, 0x6a, 0x3b, 0xdf, 0x82, 0x71, 0x7d, 0x8d, 0x3d, + 0xd5, 0xb6, 0x3e, 0x82, 0x13, 0x19, 0x6b, 0xe9, 0xa9, 0x36, 0xf9, 0x00, 0xce, 0xe6, 0xae, 0x8f, + 0xa7, 0xfa, 0x20, 0xe5, 0x57, 0x2d, 0x9d, 0x0f, 0x1e, 0x83, 0x29, 0x6a, 0xd1, 0x34, 0x45, 0x5d, + 0x28, 0xde, 0x39, 0x39, 0xf6, 0xa8, 0x0f, 0xf5, 0x4e, 0x53, 0xae, 0x8e, 0xde, 0x87, 0xa1, 0x16, + 0x2d, 0x91, 0x9e, 0xe3, 0x76, 0xef, 0x1d, 0x19, 0x4b, 0xd4, 0xac, 0x3c, 0xc4, 0x82, 0x82, 0xfd, + 0x33, 0x16, 0x64, 0x3c, 0xa9, 0xa1, 0x12, 0x56, 0xd7, 0x6d, 0xb2, 0x21, 0x29, 0xc7, 0x12, 0x96, + 0x8a, 0x50, 0x75, 0x1e, 0xca, 0x5b, 0x6e, 0x53, 0xbc, 0xd6, 0x57, 0xe0, 0xeb, 0x14, 0xbc, 0xe5, + 0x36, 0xd1, 0x0a, 0xa0, 0xb0, 0xdb, 0xe9, 0xb4, 0x98, 0x67, 0x98, 0xd3, 0xba, 0x1e, 0xf8, 0xdd, + 0x0e, 0x77, 0x13, 0x2f, 0x73, 0xf5, 0x52, 0x3d, 0x05, 0xc5, 0x19, 0x35, 0xec, 0x7f, 0x64, 0xc1, + 0xc0, 0x31, 0x4c, 0x13, 0x36, 0xa7, 0xe9, 0xd5, 0x5c, 0xd2, 0x22, 0xa5, 0xcc, 0x1c, 0x76, 0x1e, + 0xb0, 0x70, 0x0d, 0x21, 0x13, 0x38, 0x32, 0x67, 0x6d, 0xdf, 0x82, 0x13, 0xb7, 0x7c, 0xa7, 0xb9, + 0xe0, 0xb4, 0x1c, 0xaf, 0x41, 0x82, 0x55, 0x6f, 0xeb, 0x48, 0x6f, 0x32, 0x4a, 0x3d, 0xdf, 0x64, + 0x5c, 0x83, 0x21, 0xb7, 0xa3, 0xe5, 0xa4, 0xb8, 0x48, 0x67, 0x77, 0xb5, 0x26, 0xd2, 0x51, 0x20, + 0xa3, 0x71, 0x56, 0x8a, 0x05, 0x3e, 0x5d, 0x96, 0xdc, 0x6f, 0x71, 0x20, 0x7f, 0x59, 0xd2, 0x5b, + 0x52, 0x32, 0xd6, 0xa2, 0xe1, 0xb6, 0xbf, 0x0d, 0x46, 0x13, 0xe2, 0x91, 0x1a, 0x86, 0x61, 0x97, + 0x7f, 0xa9, 0x58, 0x9b, 0x2f, 0x66, 0xdf, 0x5e, 0x52, 0x03, 0xa3, 0xbd, 0xc6, 0xe4, 0x05, 0x58, + 0x12, 0xb2, 0xaf, 0x41, 0x66, 0x6c, 0xac, 0xde, 0x9a, 0x29, 0xfb, 0x2b, 0x30, 0xc3, 0x6a, 0x1e, + 0x51, 0xeb, 0x63, 0x27, 0xf4, 0xe9, 0x19, 0xe1, 0xc5, 0xed, 0xff, 0xc5, 0x02, 0xb4, 0xe6, 0x37, + 0xdd, 0xcd, 0x3d, 0x41, 0x9c, 0x7f, 0xff, 0x47, 0x50, 0xe5, 0xd7, 0xea, 0x64, 0x08, 0xee, 0xc5, + 0x96, 0x13, 0x86, 0x9a, 0x2e, 0xff, 0x45, 0xd1, 0x6e, 0x75, 0xa3, 0x18, 0x1d, 0xf7, 0xa2, 0x87, + 0x3e, 0x48, 0x44, 0x44, 0xfd, 0x62, 0x2a, 0x22, 0xea, 0x8b, 0x99, 0x4e, 0x40, 0xe9, 0xde, 0xcb, + 0x48, 0xa9, 0xf6, 0x77, 0x2d, 0x98, 0x5a, 0x4f, 0x84, 0x94, 0xbe, 0xc4, 0x3c, 0x22, 0x32, 0x6c, + 0x54, 0x75, 0x56, 0x8a, 0x05, 0xf4, 0x89, 0xeb, 0x70, 0xff, 0xd4, 0x82, 0x38, 0x16, 0xdf, 0x31, + 0x88, 0xdc, 0x8b, 0x86, 0xc8, 0x9d, 0x79, 0x7d, 0x51, 0xdd, 0xc9, 0x93, 0xb8, 0xd1, 0x4d, 0x35, + 0x27, 0x05, 0x37, 0x97, 0x98, 0x0c, 0xdf, 0x67, 0x93, 0xe6, 0xc4, 0xa9, 0xd9, 0xf8, 0xfd, 0x12, + 0x20, 0x85, 0xdb, 0x77, 0x14, 0xdd, 0x74, 0x8d, 0x27, 0x13, 0x45, 0x77, 0x17, 0x10, 0xf3, 0xe9, + 0x09, 0x1c, 0x2f, 0xe4, 0x64, 0x5d, 0xa1, 0xb5, 0x3e, 0x9a, 0xc3, 0x90, 0x72, 0x89, 0xbd, 0x95, + 0xa2, 0x86, 0x33, 0x5a, 0xd0, 0x7c, 0xb5, 0x06, 0xfb, 0xf5, 0xd5, 0x1a, 0xea, 0xf1, 0xe8, 0xfe, + 0x57, 0x2c, 0x98, 0x50, 0xc3, 0xf4, 0x09, 0x79, 0xba, 0xa3, 0xfa, 0x93, 0x73, 0xae, 0xd4, 0xb4, + 0x2e, 0x33, 0x61, 0xe0, 0x47, 0x58, 0xf0, 0x04, 0xa7, 0xe5, 0x3e, 0x22, 0x2a, 0xd8, 0x7b, 0x55, + 0x04, 0x43, 0x10, 0xa5, 0x87, 0xfb, 0xd5, 0x09, 0xf5, 0x8f, 0xfb, 0x23, 0xc4, 0x55, 0xec, 0xbf, + 0x4d, 0x37, 0xbb, 0xb9, 0x14, 0xd1, 0x9b, 0x30, 0xd8, 0xd9, 0x76, 0x42, 0x92, 0x78, 0xe2, 0x38, + 0x58, 0xa3, 0x85, 0x87, 0xfb, 0xd5, 0x49, 0x55, 0x81, 0x95, 0x60, 0x8e, 0xdd, 0x7f, 0x6c, 0xe2, + 0xf4, 0xe2, 0xec, 0x19, 0x9b, 0xf8, 0xdf, 0x59, 0x30, 0xb0, 0x4e, 0x4f, 0xaf, 0xa7, 0xcf, 0x02, + 0xde, 0x35, 0x58, 0xc0, 0xb9, 0xbc, 0xb4, 0x67, 0xb9, 0xbb, 0x7f, 0x25, 0xb1, 0xfb, 0x2f, 0xe4, + 0x52, 0x28, 0xde, 0xf8, 0x6d, 0x18, 0x63, 0xc9, 0xd4, 0xc4, 0x73, 0xce, 0xd7, 0x8d, 0x0d, 0x5f, + 0x4d, 0x6c, 0xf8, 0x29, 0x0d, 0x55, 0xdb, 0xe9, 0x2f, 0xc1, 0xb0, 0x78, 0x1f, 0x98, 0x8c, 0x41, + 0x21, 0x70, 0xb1, 0x84, 0xdb, 0x3f, 0x57, 0x06, 0x23, 0x79, 0x1b, 0xfa, 0x27, 0x16, 0xcc, 0x05, + 0xdc, 0xc5, 0xbf, 0xb9, 0xd4, 0x0d, 0x5c, 0x6f, 0xab, 0xde, 0xd8, 0x26, 0xcd, 0x6e, 0xcb, 0xf5, + 0xb6, 0x56, 0xb7, 0x3c, 0x5f, 0x15, 0x2f, 0x3f, 0x24, 0x8d, 0xae, 0x8a, 0xdb, 0x53, 0x90, 0x29, + 0x4e, 0x3d, 0x93, 0x79, 0xed, 0x60, 0xbf, 0x3a, 0x87, 0x8f, 0x44, 0x1b, 0x1f, 0xb1, 0x2f, 0xe8, + 0x9f, 0x5b, 0x70, 0x85, 0x27, 0x11, 0xeb, 0xbf, 0xff, 0x05, 0x1a, 0x8e, 0x9a, 0x24, 0x15, 0x13, + 0xd9, 0x20, 0x41, 0x7b, 0xe1, 0x0b, 0x62, 0x40, 0xaf, 0xd4, 0x8e, 0xd6, 0x16, 0x3e, 0x6a, 0xe7, + 0xec, 0xff, 0xa6, 0x0c, 0x13, 0x22, 0x86, 0xad, 0x38, 0x03, 0xde, 0x34, 0x96, 0xc4, 0xb3, 0x89, + 0x25, 0x31, 0x63, 0x20, 0x3f, 0x19, 0xf6, 0x1f, 0xc2, 0x0c, 0x65, 0xce, 0x37, 0x88, 0x13, 0x44, + 0xf7, 0x89, 0xc3, 0x5d, 0x30, 0xcb, 0x47, 0xe6, 0xfe, 0x4a, 0xb1, 0x7e, 0x2b, 0x49, 0x0c, 0xa7, + 0xe9, 0xff, 0x30, 0x9d, 0x39, 0x1e, 0x4c, 0xa7, 0xc2, 0x10, 0x7f, 0x15, 0x46, 0xd5, 0xe3, 0x36, + 0xc1, 0x74, 0x8a, 0xa3, 0x79, 0x27, 0x29, 0x70, 0xa5, 0x67, 0xfc, 0xb0, 0x32, 0x26, 0x67, 0xff, + 0x72, 0xc9, 0x68, 0x90, 0x4f, 0xe2, 0x3a, 0x8c, 0x38, 0x21, 0xcb, 0x30, 0xd0, 0x2c, 0xd2, 0x68, + 0xa7, 0x9a, 0x61, 0x7e, 0x66, 0xf3, 0xa2, 0x26, 0x56, 0x34, 0xd0, 0x0d, 0xee, 0xe8, 0xba, 0x4b, + 0x8a, 0xd4, 0xd9, 0x29, 0x6a, 0x20, 0x5d, 0x61, 0x77, 0x09, 0x16, 0xf5, 0xd1, 0xd7, 0xb9, 0x27, + 0xf2, 0x4d, 0xcf, 0x7f, 0xe0, 0x5d, 0xf7, 0x7d, 0x19, 0x04, 0xaa, 0x3f, 0x82, 0x33, 0xd2, 0xff, + 0x58, 0x55, 0xc7, 0x26, 0xb5, 0xfe, 0xe2, 0xfa, 0xff, 0x28, 0xb0, 0xa4, 0x49, 0x66, 0x2c, 0x89, + 0x10, 0x11, 0x98, 0x12, 0x01, 0x92, 0x65, 0x99, 0x18, 0xbb, 0xcc, 0xeb, 0xb7, 0x59, 0x3b, 0xb6, + 0x00, 0xdd, 0x34, 0x49, 0xe0, 0x24, 0x4d, 0x7b, 0x9b, 0x33, 0xe1, 0x15, 0xe2, 0x44, 0xdd, 0x80, + 0x84, 0xe8, 0xcb, 0x50, 0x49, 0xdf, 0x8c, 0x85, 0x21, 0xc5, 0x62, 0xd2, 0xf3, 0xb9, 0x83, 0xfd, + 0x6a, 0xa5, 0x9e, 0x83, 0x83, 0x73, 0x6b, 0xdb, 0x3f, 0x6f, 0x01, 0x7b, 0xc1, 0x7f, 0x0c, 0x92, + 0xcf, 0x97, 0x4c, 0xc9, 0xa7, 0x92, 0x37, 0x9d, 0x39, 0x42, 0xcf, 0x1b, 0x7c, 0x0d, 0xd7, 0x02, + 0xff, 0xe1, 0x9e, 0xf0, 0xfa, 0xea, 0x7d, 0x8d, 0xb3, 0xbf, 0x67, 0x01, 0xcb, 0x30, 0x86, 0xf9, + 0xad, 0x5d, 0x1a, 0x38, 0x7a, 0x3b, 0x34, 0x7c, 0x19, 0x46, 0x36, 0xc5, 0xf0, 0x67, 0x28, 0x9d, + 0x8c, 0x0e, 0x9b, 0xb4, 0xe5, 0xa4, 0x89, 0x97, 0xb8, 0xe2, 0x1f, 0x56, 0xd4, 0xec, 0xff, 0xd2, + 0x82, 0xd9, 0xfc, 0x6a, 0xe8, 0x0e, 0x9c, 0x09, 0x48, 0xa3, 0x1b, 0x84, 0x74, 0x4b, 0x88, 0x0b, + 0x90, 0x78, 0x01, 0xc6, 0xa7, 0xfa, 0x99, 0x83, 0xfd, 0xea, 0x19, 0x9c, 0x8d, 0x82, 0xf3, 0xea, + 0xa2, 0xb7, 0x60, 0xb2, 0x1b, 0x72, 0xc9, 0x8f, 0x09, 0x5d, 0xa1, 0x08, 0x63, 0xcf, 0x1e, 0x49, + 0xdd, 0x31, 0x20, 0x38, 0x81, 0x69, 0xff, 0x79, 0xbe, 0x1c, 0x95, 0xc7, 0x6b, 0x1b, 0x66, 0x3c, + 0xed, 0x3f, 0x3d, 0x01, 0xe5, 0x55, 0xff, 0xf9, 0x5e, 0xa7, 0x3e, 0x3b, 0x2e, 0xb5, 0x18, 0x03, + 0x09, 0x32, 0x38, 0x4d, 0xd9, 0xfe, 0x9b, 0x16, 0x9c, 0xd1, 0x11, 0xb5, 0x17, 0x87, 0xbd, 0xac, + 0x80, 0x4b, 0x5a, 0x00, 0x3e, 0x7e, 0xcc, 0x5d, 0xce, 0x08, 0xc0, 0x77, 0x52, 0xa7, 0x5e, 0x18, + 0x6d, 0x8f, 0xbf, 0x2d, 0xcd, 0x8a, 0xb6, 0xf7, 0x47, 0x16, 0x5f, 0x9f, 0x7a, 0xd7, 0xd1, 0x47, + 0x30, 0xdd, 0x76, 0xa2, 0xc6, 0xf6, 0xf2, 0xc3, 0x4e, 0xc0, 0x8d, 0xbb, 0x72, 0x9c, 0x5e, 0xee, + 0x35, 0x4e, 0xda, 0x47, 0xc6, 0xde, 0xe0, 0x6b, 0x09, 0x62, 0x38, 0x45, 0x1e, 0xdd, 0x87, 0x31, + 0x56, 0xc6, 0xde, 0x62, 0x87, 0x45, 0xb2, 0x4c, 0x5e, 0x6b, 0xca, 0x39, 0x68, 0x2d, 0xa6, 0x83, + 0x75, 0xa2, 0xf6, 0x2f, 0x95, 0x39, 0xd3, 0x60, 0x77, 0x8f, 0x97, 0x60, 0xb8, 0xe3, 0x37, 0x17, + 0x57, 0x97, 0xb0, 0x98, 0x05, 0x75, 0xee, 0xd5, 0x78, 0x31, 0x96, 0x70, 0x74, 0x19, 0x46, 0xc4, + 0x4f, 0x69, 0x8c, 0x67, 0x7b, 0x44, 0xe0, 0x85, 0x58, 0x41, 0xd1, 0x6b, 0x00, 0x9d, 0xc0, 0xdf, + 0x75, 0x9b, 0x2c, 0xf6, 0x56, 0xd9, 0xf4, 0xeb, 0xab, 0x29, 0x08, 0xd6, 0xb0, 0xd0, 0xdb, 0x30, + 0xd1, 0xf5, 0x42, 0x2e, 0x3f, 0x69, 0xc9, 0x38, 0x94, 0xc7, 0xd9, 0x1d, 0x1d, 0x88, 0x4d, 0x5c, + 0x34, 0x0f, 0x43, 0x91, 0xc3, 0xfc, 0xd4, 0x06, 0xf3, 0x5f, 0x0c, 0x6c, 0x50, 0x0c, 0x3d, 0xed, + 0x25, 0xad, 0x80, 0x45, 0x45, 0xf4, 0x55, 0x19, 0x16, 0x81, 0x9f, 0x44, 0xe2, 0xa9, 0x4e, 0x7f, + 0xa7, 0x96, 0x16, 0x14, 0x41, 0x3c, 0x01, 0x32, 0x68, 0xa1, 0xb7, 0x00, 0xc8, 0xc3, 0x88, 0x04, + 0x9e, 0xd3, 0x52, 0xde, 0xa5, 0x4a, 0x90, 0x59, 0xf2, 0xd7, 0xfd, 0xe8, 0x4e, 0x48, 0x96, 0x15, + 0x06, 0xd6, 0xb0, 0xed, 0x9f, 0x18, 0x03, 0x88, 0x2f, 0x1a, 0xe8, 0x11, 0x8c, 0x34, 0x9c, 0x8e, + 0xd3, 0xe0, 0x39, 0x9d, 0xcb, 0x79, 0x0f, 0xcb, 0xe3, 0x1a, 0x73, 0x8b, 0x02, 0x9d, 0x1b, 0x6f, + 0x64, 0x3e, 0x83, 0x11, 0x59, 0xdc, 0xd3, 0x60, 0xa3, 0xda, 0x43, 0xdf, 0xb1, 0x60, 0x4c, 0xc4, + 0xb6, 0x62, 0x33, 0x54, 0xca, 0xb7, 0xb7, 0x69, 0xed, 0xcf, 0xc7, 0x35, 0x78, 0x17, 0x5e, 0x97, + 0x2b, 0x54, 0x83, 0xf4, 0xec, 0x85, 0xde, 0x30, 0xfa, 0x9c, 0xbc, 0xdb, 0x96, 0x8d, 0xa1, 0x54, + 0x77, 0xdb, 0x51, 0x76, 0xd4, 0xe8, 0xd7, 0xda, 0x3b, 0xc6, 0xb5, 0x76, 0x20, 0xff, 0x89, 0xb6, + 0x21, 0x6f, 0xf7, 0xba, 0xd1, 0xa2, 0x9a, 0x1e, 0x03, 0x66, 0x30, 0xff, 0x85, 0xaf, 0x76, 0xb1, + 0xeb, 0x11, 0xff, 0xe5, 0x5b, 0x30, 0xd5, 0x34, 0xa5, 0x16, 0xb1, 0x12, 0x5f, 0xcc, 0xa3, 0x9b, + 0x10, 0x72, 0x62, 0x39, 0x25, 0x01, 0xc0, 0x49, 0xc2, 0xa8, 0xc6, 0x43, 0x02, 0xad, 0x7a, 0x9b, + 0xbe, 0x78, 0x2e, 0x66, 0xe7, 0xce, 0xe5, 0x5e, 0x18, 0x91, 0x36, 0xc5, 0x8c, 0x85, 0x84, 0x75, + 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x7d, 0x18, 0x62, 0x4f, 0x3c, 0xc3, 0xca, 0x48, 0xbe, 0x59, 0xc3, + 0x8c, 0x2e, 0x1c, 0x6f, 0x48, 0xf6, 0x37, 0xc4, 0x82, 0x02, 0xba, 0x21, 0x1f, 0x50, 0x87, 0xab, + 0xde, 0x9d, 0x90, 0xb0, 0x07, 0xd4, 0xa3, 0x0b, 0xcf, 0xc7, 0x6f, 0xa3, 0x79, 0x79, 0x66, 0x72, + 0x6c, 0xa3, 0x26, 0x15, 0xfb, 0xc4, 0x7f, 0x99, 0x73, 0x5b, 0x44, 0xea, 0xcb, 0xec, 0x9e, 0x99, + 0x97, 0x3b, 0x1e, 0xce, 0xbb, 0x26, 0x09, 0x9c, 0xa4, 0x49, 0x45, 0x68, 0xbe, 0xeb, 0xc5, 0x83, + 0xb3, 0x5e, 0xbc, 0x83, 0x6b, 0x0e, 0xd8, 0x69, 0xc4, 0x4b, 0xb0, 0xa8, 0x8f, 0x5c, 0x98, 0x0a, + 0x0c, 0xf1, 0x42, 0x06, 0xd8, 0xbb, 0xd4, 0x9f, 0x10, 0xa3, 0x65, 0x19, 0x31, 0xc9, 0xe0, 0x24, + 0x5d, 0xf4, 0xbe, 0x26, 0x28, 0x4d, 0x14, 0xdf, 0xfc, 0x7b, 0x89, 0x46, 0xb3, 0x3b, 0x30, 0x61, + 0x30, 0x9b, 0xa7, 0x6a, 0x82, 0xf4, 0x60, 0x3a, 0xc9, 0x59, 0x9e, 0xaa, 0xe5, 0xf1, 0x2d, 0x98, + 0x64, 0x1b, 0xe1, 0x81, 0xd3, 0x11, 0xac, 0xf8, 0xb2, 0xc1, 0x8a, 0xad, 0xcb, 0x65, 0x3e, 0x30, + 0x72, 0x08, 0x62, 0xc6, 0x69, 0xff, 0x9d, 0x41, 0x51, 0x59, 0xed, 0x22, 0x74, 0x05, 0x46, 0x45, + 0x07, 0x54, 0xaa, 0x3e, 0xc5, 0x18, 0xd6, 0x24, 0x00, 0xc7, 0x38, 0x2c, 0x43, 0x23, 0xab, 0xae, + 0xbd, 0x50, 0x88, 0x33, 0x34, 0x2a, 0x08, 0xd6, 0xb0, 0xe8, 0xe5, 0xf7, 0xbe, 0xef, 0x47, 0xea, + 0x0c, 0x56, 0x5b, 0x6d, 0x81, 0x95, 0x62, 0x01, 0xa5, 0x67, 0xef, 0x0e, 0x09, 0x3c, 0xd2, 0x32, + 0x73, 0xd5, 0xa8, 0xb3, 0xf7, 0xa6, 0x0e, 0xc4, 0x26, 0x2e, 0x95, 0x20, 0xfc, 0x90, 0xed, 0x5d, + 0x71, 0xc5, 0x8e, 0x5f, 0x7c, 0xd4, 0x79, 0x90, 0x0f, 0x09, 0x47, 0x5f, 0x81, 0x33, 0x2a, 0xd8, + 0xa6, 0x58, 0x99, 0xb2, 0xc5, 0x21, 0x43, 0x23, 0x76, 0x66, 0x31, 0x1b, 0x0d, 0xe7, 0xd5, 0x47, + 0xef, 0xc2, 0xa4, 0xb8, 0x86, 0x49, 0x8a, 0xc3, 0xa6, 0xfb, 0xe2, 0x4d, 0x03, 0x8a, 0x13, 0xd8, + 0x32, 0xdb, 0x0e, 0xbb, 0x9f, 0x48, 0x0a, 0x23, 0xe9, 0x6c, 0x3b, 0x3a, 0x1c, 0xa7, 0x6a, 0xa0, + 0x79, 0x98, 0xe2, 0x62, 0xa7, 0xeb, 0x6d, 0xf1, 0x39, 0x11, 0x4f, 0x60, 0xd5, 0x86, 0xbc, 0x6d, + 0x82, 0x71, 0x12, 0x1f, 0x5d, 0x83, 0x71, 0x27, 0x68, 0x6c, 0xbb, 0x11, 0x69, 0xd0, 0x5d, 0xc5, + 0x3c, 0x08, 0x35, 0xff, 0xcf, 0x79, 0x0d, 0x86, 0x0d, 0x4c, 0xf4, 0x1e, 0x0c, 0x84, 0x0f, 0x9c, + 0x8e, 0xe0, 0x3e, 0xf9, 0xac, 0x5c, 0xad, 0x60, 0xee, 0xfa, 0x45, 0xff, 0x63, 0x56, 0xd3, 0x7e, + 0x04, 0x27, 0x32, 0x82, 0x12, 0xd1, 0xa5, 0xe7, 0x74, 0x5c, 0x39, 0x2a, 0x89, 0x67, 0x1a, 0xf3, + 0xb5, 0x55, 0x39, 0x1e, 0x1a, 0x16, 0x5d, 0xdf, 0x2c, 0x78, 0x51, 0x2d, 0x36, 0x24, 0xa9, 0xf5, + 0xbd, 0x22, 0x01, 0x38, 0xc6, 0xb1, 0xff, 0xa4, 0x04, 0x53, 0x19, 0xe6, 0x41, 0x96, 0x1b, 0x3f, + 0x71, 0xcf, 0x8b, 0x53, 0xe1, 0x9b, 0xe9, 0x9f, 0x4a, 0x47, 0x48, 0xff, 0x54, 0xee, 0x95, 0xfe, + 0x69, 0xe0, 0xe3, 0xa4, 0x7f, 0x32, 0x47, 0x6c, 0xb0, 0xaf, 0x11, 0xcb, 0x48, 0x19, 0x35, 0x74, + 0xc4, 0x94, 0x51, 0xc6, 0xa0, 0x0f, 0xf7, 0x31, 0xe8, 0xff, 0x69, 0x09, 0xa6, 0x93, 0x96, 0xc5, + 0x63, 0xd0, 0xce, 0xbf, 0x6f, 0x68, 0xe7, 0x2f, 0xf7, 0x13, 0xf4, 0x20, 0x57, 0x53, 0x8f, 0x13, + 0x9a, 0xfa, 0xcf, 0xf6, 0x45, 0xad, 0x58, 0x6b, 0xff, 0xb7, 0x4a, 0x70, 0x2a, 0xd3, 0xe0, 0x7a, + 0x0c, 0x63, 0x73, 0xdb, 0x18, 0x9b, 0x57, 0xfb, 0x0e, 0x08, 0x91, 0x3b, 0x40, 0xf7, 0x12, 0x03, + 0x74, 0xa5, 0x7f, 0x92, 0xc5, 0xa3, 0xf4, 0xfd, 0x32, 0x5c, 0xc8, 0xac, 0x17, 0x2b, 0xb7, 0x57, + 0x0c, 0xe5, 0xf6, 0x6b, 0x09, 0xe5, 0xb6, 0x5d, 0x5c, 0xfb, 0xc9, 0x68, 0xbb, 0x45, 0x60, 0x04, + 0x16, 0xde, 0xe5, 0x31, 0x35, 0xdd, 0x46, 0x60, 0x04, 0x45, 0x08, 0x9b, 0x74, 0x7f, 0x98, 0x34, + 0xdc, 0xff, 0x83, 0x05, 0x67, 0x33, 0xe7, 0xe6, 0x18, 0xf4, 0x8c, 0xeb, 0xa6, 0x9e, 0xf1, 0xa5, + 0xbe, 0x57, 0x6b, 0x8e, 0xe2, 0xf1, 0xbb, 0x43, 0x39, 0xdf, 0xc2, 0xd4, 0x1f, 0xb7, 0x61, 0xcc, + 0x69, 0x34, 0x48, 0x18, 0xae, 0xb1, 0x54, 0x13, 0xdc, 0xf6, 0xfa, 0x2a, 0xbb, 0x9c, 0xc6, 0xc5, + 0x87, 0xfb, 0xd5, 0xd9, 0x24, 0x89, 0x18, 0x8c, 0x75, 0x0a, 0xe8, 0xeb, 0x30, 0x12, 0xca, 0x24, + 0xbf, 0x03, 0x8f, 0x9f, 0xe4, 0x97, 0x49, 0x92, 0x4a, 0xbd, 0xa3, 0x48, 0xa2, 0x3f, 0xa7, 0x87, + 0xf7, 0x2a, 0x50, 0x6c, 0xf2, 0x4e, 0x3e, 0x46, 0x90, 0x2f, 0xf3, 0x39, 0x7c, 0xb9, 0xaf, 0xe7, + 0xf0, 0xef, 0xc1, 0x74, 0xc8, 0xc3, 0xe5, 0xc6, 0x2e, 0x32, 0x7c, 0x2d, 0xb2, 0x88, 0x83, 0xf5, + 0x04, 0x0c, 0xa7, 0xb0, 0xd1, 0x8a, 0x6c, 0x95, 0x39, 0x43, 0xf1, 0xe5, 0x79, 0x29, 0x6e, 0x51, + 0x38, 0x44, 0x9d, 0x4c, 0x4e, 0x02, 0x1b, 0x7e, 0xad, 0x26, 0xfa, 0x3a, 0x00, 0x5d, 0x44, 0x42, + 0x85, 0x33, 0x9c, 0xcf, 0x42, 0x29, 0x6f, 0x69, 0x66, 0xbe, 0xc0, 0x60, 0x11, 0x0d, 0x96, 0x14, + 0x11, 0xac, 0x11, 0x44, 0x0e, 0x4c, 0xc4, 0xff, 0x30, 0xd9, 0x2c, 0x0a, 0xb0, 0xc6, 0x5a, 0x48, + 0x12, 0x67, 0xe6, 0x8d, 0x25, 0x9d, 0x04, 0x36, 0x29, 0xa2, 0xaf, 0xc1, 0xd9, 0xdd, 0x5c, 0xbf, + 0x23, 0x2e, 0x4b, 0x9e, 0x3f, 0xd8, 0xaf, 0x9e, 0xcd, 0xf7, 0x36, 0xca, 0xaf, 0x6f, 0xff, 0x8f, + 0x00, 0xcf, 0x14, 0x70, 0x7a, 0x34, 0x6f, 0xfa, 0x0c, 0xbc, 0x9c, 0xd4, 0xab, 0xcc, 0x66, 0x56, + 0x36, 0x14, 0x2d, 0x89, 0x0d, 0x55, 0xfa, 0xd8, 0x1b, 0xea, 0xa7, 0x2c, 0xed, 0x9a, 0xc5, 0x3d, + 0xca, 0xbf, 0x74, 0xc4, 0x13, 0xec, 0x09, 0xaa, 0xc0, 0x36, 0x33, 0xf4, 0x48, 0xaf, 0xf5, 0xdd, + 0x9d, 0xfe, 0x15, 0x4b, 0xbf, 0x9a, 0x9d, 0x60, 0x80, 0xab, 0x98, 0xae, 0x1f, 0xf5, 0xfb, 0x8f, + 0x2b, 0xd9, 0xc0, 0xef, 0x5b, 0x70, 0x36, 0x55, 0xcc, 0xfb, 0x40, 0x42, 0x11, 0xce, 0x70, 0xfd, + 0x63, 0x77, 0x5e, 0x12, 0xe4, 0xdf, 0x70, 0x43, 0x7c, 0xc3, 0xd9, 0x5c, 0xbc, 0x64, 0xd7, 0x7f, + 0xf2, 0x5f, 0x55, 0x4f, 0xb0, 0x06, 0x4c, 0x44, 0x9c, 0xdf, 0x75, 0xd4, 0x81, 0x8b, 0x8d, 0x6e, + 0x10, 0xc4, 0x8b, 0x35, 0x63, 0x73, 0xf2, 0xdb, 0xe2, 0xf3, 0x07, 0xfb, 0xd5, 0x8b, 0x8b, 0x3d, + 0x70, 0x71, 0x4f, 0x6a, 0xc8, 0x03, 0xd4, 0x4e, 0x79, 0xf7, 0x31, 0x06, 0x90, 0xa3, 0x05, 0x4a, + 0xfb, 0x02, 0x72, 0x3f, 0xdd, 0x0c, 0x1f, 0xc1, 0x0c, 0xca, 0xc7, 0xab, 0xbb, 0xf9, 0xc1, 0x64, + 0x33, 0x98, 0xbd, 0x05, 0x17, 0x8a, 0x17, 0xd3, 0x91, 0x42, 0x50, 0xfc, 0x9e, 0x05, 0xe7, 0x0b, + 0x43, 0xb3, 0xfd, 0x19, 0xbc, 0x2c, 0xd8, 0xdf, 0xb6, 0xe0, 0xd9, 0xcc, 0x1a, 0xc9, 0xc7, 0x83, + 0x0d, 0x5a, 0xa8, 0x39, 0xc3, 0xc6, 0x41, 0x8a, 0x24, 0x00, 0xc7, 0x38, 0x86, 0xbf, 0x68, 0xa9, + 0xa7, 0xbf, 0xe8, 0x3f, 0xb5, 0x20, 0x75, 0xd4, 0x1f, 0x83, 0xe4, 0xb9, 0x6a, 0x4a, 0x9e, 0xcf, + 0xf7, 0x33, 0x9a, 0x39, 0x42, 0xe7, 0xbf, 0x9d, 0x82, 0xd3, 0x39, 0x2f, 0xc8, 0x77, 0x61, 0x66, + 0xab, 0x41, 0xcc, 0x90, 0x21, 0x45, 0xd1, 0xff, 0x0a, 0xe3, 0x8b, 0x2c, 0x9c, 0x3a, 0xd8, 0xaf, + 0xce, 0xa4, 0x50, 0x70, 0xba, 0x09, 0xf4, 0x6d, 0x0b, 0x4e, 0x3a, 0x0f, 0xc2, 0x65, 0x7a, 0x83, + 0x70, 0x1b, 0x0b, 0x2d, 0xbf, 0xb1, 0x43, 0x05, 0x33, 0xb9, 0xad, 0xde, 0xc8, 0x54, 0x85, 0xdf, + 0xab, 0xa7, 0xf0, 0x8d, 0xe6, 0x2b, 0x07, 0xfb, 0xd5, 0x93, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x84, + 0x45, 0x0e, 0x3f, 0x27, 0xda, 0x2e, 0x0a, 0x6a, 0x93, 0xf5, 0xd4, 0x9f, 0x8b, 0xc4, 0x12, 0x82, + 0x15, 0x1d, 0xf4, 0x4d, 0x18, 0xdd, 0x92, 0xf1, 0x2b, 0x32, 0x44, 0xee, 0x78, 0x20, 0x8b, 0xa3, + 0x7a, 0x70, 0x07, 0x1c, 0x85, 0x84, 0x63, 0xa2, 0xe8, 0x5d, 0x28, 0x7b, 0x9b, 0x61, 0x51, 0x08, + 0xe9, 0x84, 0xa7, 0x35, 0x8f, 0x76, 0xb5, 0xbe, 0x52, 0xc7, 0xb4, 0x22, 0xba, 0x01, 0xe5, 0xe0, + 0x7e, 0x53, 0xd8, 0x71, 0x32, 0x37, 0x29, 0x5e, 0x58, 0xca, 0xe9, 0x15, 0xa3, 0x84, 0x17, 0x96, + 0x30, 0x25, 0x81, 0x6a, 0x30, 0xc8, 0x9e, 0x5d, 0x0b, 0xd1, 0x36, 0xf3, 0x2a, 0x5f, 0x10, 0xbe, + 0x80, 0xbf, 0x87, 0x64, 0x08, 0x98, 0x13, 0x42, 0x1b, 0x30, 0xd4, 0x70, 0xbd, 0x26, 0x09, 0x84, + 0x2c, 0xfb, 0xb9, 0x4c, 0x8b, 0x0d, 0xc3, 0xc8, 0xa1, 0xc9, 0x0d, 0x18, 0x0c, 0x03, 0x0b, 0x5a, + 0x8c, 0x2a, 0xe9, 0x6c, 0x6f, 0xca, 0x13, 0x2b, 0x9b, 0x2a, 0xe9, 0x6c, 0xaf, 0xd4, 0x0b, 0xa9, + 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xb7, 0xa0, 0xb4, 0xd9, 0x10, 0x4f, 0xaa, 0x33, 0xd5, 0x9b, 0x66, + 0xc0, 0xb2, 0x85, 0xa1, 0x83, 0xfd, 0x6a, 0x69, 0x65, 0x11, 0x97, 0x36, 0x1b, 0x68, 0x1d, 0x86, + 0x37, 0x79, 0xbc, 0x20, 0xa1, 0x1f, 0x7d, 0x31, 0x3b, 0x94, 0x51, 0x2a, 0xa4, 0x10, 0x7f, 0xdb, + 0x2a, 0x00, 0x58, 0x12, 0x61, 0x09, 0xcf, 0x54, 0xdc, 0x23, 0x11, 0x29, 0x76, 0xee, 0x68, 0xb1, + 0xaa, 0x44, 0xa0, 0x71, 0x45, 0x05, 0x6b, 0x14, 0xe9, 0xaa, 0x76, 0x1e, 0x75, 0x03, 0x96, 0x11, + 0x45, 0x18, 0x66, 0x32, 0x57, 0xf5, 0xbc, 0x44, 0x2a, 0x5a, 0xd5, 0x0a, 0x09, 0xc7, 0x44, 0xd1, + 0x0e, 0x4c, 0xec, 0x86, 0x9d, 0x6d, 0x22, 0xb7, 0x34, 0x8b, 0x30, 0x98, 0x23, 0xcd, 0xde, 0x15, + 0x88, 0x6e, 0x10, 0x75, 0x9d, 0x56, 0x8a, 0x0b, 0xb1, 0x6b, 0xcd, 0x5d, 0x9d, 0x18, 0x36, 0x69, + 0xd3, 0xe1, 0xff, 0xa8, 0xeb, 0xdf, 0xdf, 0x8b, 0x88, 0x08, 0xf0, 0x9a, 0x39, 0xfc, 0x1f, 0x70, + 0x94, 0xf4, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xd0, 0x5d, 0x31, 0x3c, 0x8c, 0x7b, 0x4e, 0xe7, 0x07, + 0xc2, 0x9f, 0x97, 0x48, 0x39, 0x83, 0xc2, 0xb8, 0x65, 0x4c, 0x8a, 0x71, 0xc9, 0xce, 0xb6, 0x1f, + 0xf9, 0x5e, 0x82, 0x43, 0xcf, 0xe4, 0x73, 0xc9, 0x5a, 0x06, 0x7e, 0x9a, 0x4b, 0x66, 0x61, 0xe1, + 0xcc, 0xb6, 0x50, 0x13, 0x26, 0x3b, 0x7e, 0x10, 0x3d, 0xf0, 0x03, 0xb9, 0xbe, 0x50, 0x81, 0xa2, + 0xd4, 0xc0, 0x14, 0x2d, 0x32, 0xb7, 0x20, 0x13, 0x82, 0x13, 0x34, 0xd1, 0x97, 0x61, 0x38, 0x6c, + 0x38, 0x2d, 0xb2, 0x7a, 0xbb, 0x72, 0x22, 0xff, 0xf8, 0xa9, 0x73, 0x94, 0x9c, 0xd5, 0xc5, 0xc3, + 0x3d, 0x71, 0x14, 0x2c, 0xc9, 0xa1, 0x15, 0x18, 0x64, 0x39, 0xef, 0x59, 0x34, 0xe2, 0x9c, 0x78, + 0xfe, 0xa9, 0x47, 0x3d, 0x9c, 0x37, 0xb1, 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0x34, 0x05, 0x7e, + 0x58, 0x39, 0x95, 0xbf, 0x07, 0x84, 0x82, 0xe1, 0x76, 0xbd, 0x68, 0x0f, 0x28, 0x24, 0x1c, 0x13, + 0xa5, 0x9c, 0x99, 0x72, 0xd3, 0xd3, 0x05, 0x0e, 0x9b, 0xb9, 0xbc, 0x94, 0x71, 0x66, 0xca, 0x49, + 0x29, 0x09, 0xfb, 0x37, 0x47, 0xd2, 0x32, 0x0b, 0xd3, 0x30, 0xfd, 0xc7, 0x56, 0xca, 0x63, 0xe3, + 0xf3, 0xfd, 0x2a, 0xbc, 0x9f, 0xe0, 0xc5, 0xf5, 0xdb, 0x16, 0x9c, 0xee, 0x64, 0x7e, 0x88, 0x10, + 0x00, 0xfa, 0xd3, 0x9b, 0xf3, 0x4f, 0x57, 0x91, 0xab, 0xb3, 0xe1, 0x38, 0xa7, 0xa5, 0xa4, 0x72, + 0xa0, 0xfc, 0xb1, 0x95, 0x03, 0x6b, 0x30, 0xd2, 0xe0, 0x37, 0x39, 0x99, 0x3c, 0xa2, 0xaf, 0xb8, + 0xab, 0xdc, 0x4e, 0x2b, 0x2a, 0x62, 0x45, 0x02, 0xfd, 0xb4, 0x05, 0xe7, 0x93, 0x5d, 0xc7, 0x84, + 0x81, 0x85, 0xbb, 0x26, 0x57, 0x6b, 0xad, 0x88, 0xef, 0x4f, 0xc9, 0xff, 0x06, 0xf2, 0x61, 0x2f, + 0x04, 0x5c, 0xdc, 0x18, 0x5a, 0xca, 0xd0, 0xab, 0x0d, 0x99, 0x36, 0xc9, 0x3e, 0x74, 0x6b, 0x6f, + 0xc0, 0x78, 0xdb, 0xef, 0x7a, 0x91, 0xf0, 0xba, 0x14, 0xae, 0x5b, 0xcc, 0x65, 0x69, 0x4d, 0x2b, + 0xc7, 0x06, 0x56, 0x42, 0x23, 0x37, 0xf2, 0xd8, 0x1a, 0xb9, 0x0f, 0x61, 0xdc, 0xd3, 0x1e, 0x24, + 0x14, 0xdd, 0x60, 0x85, 0x76, 0x51, 0xc3, 0xe6, 0xbd, 0xd4, 0x4b, 0xb0, 0x41, 0xad, 0x58, 0x5b, + 0x06, 0x1f, 0x4f, 0x5b, 0x76, 0xac, 0x57, 0x62, 0xfb, 0xef, 0x95, 0x32, 0x6e, 0x0c, 0x5c, 0x2b, + 0xf7, 0x8e, 0xa9, 0x95, 0xbb, 0x94, 0xd4, 0xca, 0xa5, 0x4c, 0x55, 0x86, 0x42, 0xae, 0xff, 0x0c, + 0xa6, 0x7d, 0xc7, 0xd2, 0xfe, 0x0b, 0x16, 0x9c, 0x61, 0xb6, 0x0f, 0xda, 0xc0, 0xc7, 0xb6, 0x77, + 0x30, 0x87, 0xd8, 0x5b, 0xd9, 0xe4, 0x70, 0x5e, 0x3b, 0x76, 0x0b, 0x2e, 0xf6, 0x3a, 0x77, 0x99, + 0x7f, 0x71, 0x53, 0xb9, 0x57, 0xc4, 0xfe, 0xc5, 0xcd, 0xd5, 0x25, 0xcc, 0x20, 0xfd, 0x86, 0x5d, + 0xb4, 0xff, 0x4f, 0x0b, 0xca, 0x35, 0xbf, 0x79, 0x0c, 0x37, 0xfa, 0x2f, 0x19, 0x37, 0xfa, 0x67, + 0xb2, 0x4f, 0xfc, 0x66, 0xae, 0xb1, 0x6f, 0x39, 0x61, 0xec, 0x3b, 0x9f, 0x47, 0xa0, 0xd8, 0xb4, + 0xf7, 0xb7, 0xcb, 0x30, 0x56, 0xf3, 0x9b, 0x6a, 0x9f, 0xfd, 0x77, 0x8f, 0xf3, 0x8c, 0x28, 0x37, + 0x67, 0x99, 0x46, 0x99, 0xf9, 0x13, 0xcb, 0xa8, 0x17, 0x7f, 0xc6, 0x5e, 0x13, 0xdd, 0x23, 0xee, + 0xd6, 0x76, 0x44, 0x9a, 0xc9, 0xcf, 0x39, 0xbe, 0xd7, 0x44, 0x7f, 0x58, 0x86, 0xa9, 0x44, 0xeb, + 0xa8, 0x05, 0x13, 0x2d, 0xdd, 0x94, 0x24, 0xd6, 0xe9, 0x63, 0x59, 0xa1, 0xc4, 0x6b, 0x0c, 0xad, + 0x08, 0x9b, 0xc4, 0xd1, 0x1c, 0x80, 0xa7, 0xfb, 0xa4, 0xab, 0x98, 0xd0, 0x9a, 0x3f, 0xba, 0x86, + 0x81, 0xde, 0x84, 0xb1, 0xc8, 0xef, 0xf8, 0x2d, 0x7f, 0x6b, 0xef, 0xa6, 0x8a, 0x8f, 0xac, 0x5c, + 0x96, 0x37, 0x62, 0x10, 0xd6, 0xf1, 0xd0, 0x43, 0x98, 0x51, 0x44, 0xea, 0x4f, 0xc0, 0xbc, 0xc6, + 0xd4, 0x26, 0xeb, 0x49, 0x8a, 0x38, 0xdd, 0x08, 0x7a, 0x0b, 0x26, 0x99, 0xef, 0x34, 0xab, 0x7f, + 0x93, 0xec, 0xc9, 0xe0, 0xd2, 0x4c, 0xc2, 0x5e, 0x33, 0x20, 0x38, 0x81, 0x89, 0x16, 0x61, 0xa6, + 0xed, 0x86, 0x89, 0xea, 0x43, 0xac, 0x3a, 0xeb, 0xc0, 0x5a, 0x12, 0x88, 0xd3, 0xf8, 0xf6, 0x2f, + 0x88, 0x39, 0xf6, 0x22, 0xf7, 0xd3, 0xed, 0xf8, 0xc9, 0xde, 0x8e, 0xdf, 0xb7, 0x60, 0x9a, 0xb6, + 0xce, 0x1c, 0x42, 0xa5, 0x20, 0xa5, 0xd2, 0x8f, 0x58, 0x05, 0xe9, 0x47, 0x2e, 0x51, 0xb6, 0xdd, + 0xf4, 0xbb, 0x91, 0xd0, 0x8e, 0x6a, 0x7c, 0x99, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x08, 0xc4, + 0xab, 0x7b, 0x1d, 0x8f, 0x04, 0x01, 0x16, 0x50, 0x99, 0x9d, 0x64, 0x20, 0x3b, 0x3b, 0x09, 0x0f, + 0x32, 0x2f, 0xfc, 0xe8, 0x84, 0x48, 0xab, 0x05, 0x99, 0x97, 0x0e, 0x76, 0x31, 0x8e, 0xfd, 0xd7, + 0xca, 0x50, 0xa9, 0xf9, 0xcd, 0x45, 0x12, 0x44, 0xee, 0xa6, 0xdb, 0x70, 0x22, 0xa2, 0xe5, 0xdb, + 0x7d, 0x0d, 0x80, 0x3d, 0x22, 0x0b, 0xb2, 0x22, 0xa8, 0xd7, 0x15, 0x04, 0x6b, 0x58, 0x54, 0x2a, + 0xd9, 0x21, 0x7b, 0xda, 0xc9, 0xab, 0xa4, 0x92, 0x9b, 0xbc, 0x18, 0x4b, 0x38, 0xba, 0xc5, 0x42, + 0x19, 0x2d, 0x3f, 0xec, 0xb8, 0x01, 0xcf, 0x4c, 0x4e, 0x1a, 0xbe, 0xd7, 0x0c, 0x45, 0xe0, 0xb7, + 0x8a, 0x08, 0x44, 0x94, 0x82, 0xe3, 0xcc, 0x5a, 0xa8, 0x06, 0x27, 0x1b, 0x01, 0x69, 0x12, 0x2f, + 0x72, 0x9d, 0xd6, 0x42, 0xd7, 0x6b, 0xb6, 0x78, 0x4a, 0x9e, 0x01, 0x23, 0x83, 0xe8, 0xc9, 0xc5, + 0x0c, 0x1c, 0x9c, 0x59, 0x53, 0x7c, 0x0a, 0x23, 0x32, 0x98, 0xfa, 0x14, 0x56, 0x4f, 0xc2, 0x59, + 0xe3, 0xf1, 0x10, 0x2e, 0x6e, 0x3b, 0xae, 0xc7, 0xea, 0x0d, 0x25, 0x1a, 0xcf, 0xc0, 0xc1, 0x99, + 0x35, 0xed, 0x3f, 0x2d, 0xc3, 0x38, 0x9d, 0x18, 0xe5, 0x71, 0xf3, 0x86, 0xe1, 0x71, 0x73, 0x31, + 0xe1, 0x71, 0x33, 0xad, 0xe3, 0x6a, 0xfe, 0x35, 0xef, 0x03, 0xf2, 0x45, 0x52, 0x82, 0xeb, 0xc4, + 0x23, 0x7c, 0xc8, 0x98, 0x92, 0xb1, 0x1c, 0xfb, 0xa3, 0xdc, 0x4e, 0x61, 0xe0, 0x8c, 0x5a, 0x9f, + 0xfa, 0xea, 0x1c, 0xaf, 0xaf, 0xce, 0x6f, 0x59, 0x6c, 0x05, 0x2c, 0xad, 0xd7, 0xb9, 0x13, 0x39, + 0xba, 0x0a, 0x63, 0xec, 0x18, 0x63, 0xb1, 0x3c, 0xa4, 0x4b, 0x0b, 0xcb, 0x6e, 0xbb, 0x1e, 0x17, + 0x63, 0x1d, 0x07, 0x5d, 0x86, 0x91, 0x90, 0x38, 0x41, 0x63, 0x5b, 0x9d, 0xe1, 0xc2, 0xff, 0x84, + 0x97, 0x61, 0x05, 0x45, 0x1f, 0xc4, 0x11, 0xe1, 0xcb, 0xf9, 0x1e, 0xe9, 0x7a, 0x7f, 0x38, 0x1f, + 0xcc, 0x0f, 0x03, 0x6f, 0xdf, 0x03, 0x94, 0xc6, 0xef, 0xe3, 0x89, 0x5f, 0xd5, 0x8c, 0x59, 0x3c, + 0x9a, 0x8a, 0x57, 0xfc, 0xef, 0x2d, 0x98, 0xac, 0xf9, 0x4d, 0xca, 0x9f, 0x7f, 0x98, 0x98, 0xb1, + 0x9e, 0xc1, 0x63, 0xa8, 0x20, 0x83, 0xc7, 0x81, 0x05, 0x17, 0xd8, 0xe7, 0x47, 0xc4, 0x6b, 0xc6, + 0x06, 0x4f, 0xdd, 0xdf, 0xe3, 0x01, 0x4c, 0x05, 0x3c, 0x7c, 0xd7, 0x9a, 0xd3, 0xe9, 0xb8, 0xde, + 0x96, 0x7c, 0xdf, 0xf6, 0x46, 0xe1, 0xbb, 0x8d, 0x24, 0x49, 0x11, 0x02, 0x4c, 0x77, 0x54, 0x35, + 0x88, 0xe2, 0x64, 0x2b, 0x3c, 0x2b, 0x8d, 0xd6, 0x1f, 0x2d, 0x41, 0xa5, 0x96, 0x95, 0x26, 0x81, + 0x80, 0xd3, 0x75, 0xec, 0xe7, 0x60, 0xb0, 0xe6, 0x37, 0x7b, 0x04, 0x8f, 0xfe, 0x3b, 0x16, 0x0c, + 0xd7, 0xfc, 0xe6, 0x31, 0x98, 0x10, 0xdf, 0x31, 0x4d, 0x88, 0x67, 0x72, 0x36, 0x47, 0x8e, 0xd5, + 0xf0, 0x9f, 0x0d, 0xc0, 0x04, 0xed, 0xa7, 0xbf, 0x25, 0xd7, 0xab, 0xb1, 0x36, 0xac, 0x3e, 0xd6, + 0x06, 0xbd, 0xd0, 0xfa, 0xad, 0x96, 0xff, 0x20, 0xb9, 0x76, 0x57, 0x58, 0x29, 0x16, 0x50, 0xf4, + 0x0a, 0x8c, 0x74, 0x02, 0xb2, 0xeb, 0xfa, 0xe2, 0xa6, 0xa8, 0x19, 0x64, 0x6b, 0xa2, 0x1c, 0x2b, + 0x0c, 0xf4, 0x06, 0x8c, 0x87, 0xae, 0x47, 0xa5, 0x62, 0x7e, 0xf4, 0x0e, 0xb0, 0x83, 0x81, 0xe7, + 0xd2, 0xd3, 0xca, 0xb1, 0x81, 0x85, 0xee, 0xc1, 0x28, 0xfb, 0xcf, 0x78, 0xeb, 0xe0, 0x91, 0x79, + 0xab, 0x48, 0x94, 0x2e, 0x08, 0xe0, 0x98, 0x16, 0x15, 0x38, 0x22, 0x99, 0x8f, 0x2a, 0x14, 0x41, + 0x84, 0x95, 0xc0, 0xa1, 0x32, 0x55, 0x85, 0x58, 0xc3, 0x42, 0x2f, 0xc3, 0x68, 0xe4, 0xb8, 0xad, + 0x5b, 0xae, 0xc7, 0x3c, 0x51, 0x68, 0xff, 0x45, 0xbe, 0x72, 0x51, 0x88, 0x63, 0x38, 0xbd, 0xd5, + 0xb0, 0xd8, 0x6a, 0x0b, 0x7b, 0x91, 0xc8, 0xa2, 0x59, 0xe6, 0xb7, 0x9a, 0x5b, 0xaa, 0x14, 0x6b, + 0x18, 0x68, 0x1b, 0xce, 0xb9, 0x1e, 0xcb, 0x3b, 0x47, 0xea, 0x3b, 0x6e, 0x67, 0xe3, 0x56, 0xfd, + 0x2e, 0x09, 0xdc, 0xcd, 0xbd, 0x05, 0xa7, 0xb1, 0x43, 0xbc, 0x26, 0x53, 0x7a, 0x8d, 0x2c, 0x3c, + 0x2f, 0xba, 0x78, 0x6e, 0xb5, 0x00, 0x17, 0x17, 0x52, 0x42, 0x36, 0xe5, 0x39, 0x01, 0x71, 0xda, + 0x42, 0xbb, 0xc5, 0x73, 0x56, 0xb1, 0x12, 0x2c, 0x20, 0xf6, 0xeb, 0x6c, 0x4f, 0xdc, 0xae, 0xa3, + 0xcf, 0x1a, 0x3c, 0xf4, 0xb4, 0xce, 0x43, 0x0f, 0xf7, 0xab, 0x43, 0xb7, 0xeb, 0x5a, 0x9c, 0xad, + 0x6b, 0x70, 0xaa, 0xe6, 0x37, 0x6b, 0x7e, 0x10, 0xad, 0xf8, 0xc1, 0x03, 0x27, 0x68, 0xca, 0x25, + 0x58, 0x95, 0x91, 0xc6, 0x28, 0x67, 0x18, 0xe4, 0x6c, 0xd6, 0x88, 0x22, 0xf6, 0x3a, 0xbb, 0x9f, + 0x1c, 0xf1, 0x61, 0x77, 0x83, 0x49, 0xca, 0x2a, 0xbb, 0xe3, 0x75, 0x27, 0x22, 0xe8, 0x36, 0x4c, + 0x34, 0x74, 0xd9, 0x44, 0x54, 0x7f, 0x49, 0x9e, 0xe8, 0x86, 0xe0, 0x92, 0x29, 0xcc, 0x98, 0xf5, + 0xed, 0xdf, 0xb7, 0x44, 0x2b, 0x1a, 0xd7, 0xe8, 0xe3, 0x60, 0x59, 0xcc, 0x62, 0x4e, 0xfc, 0xa6, + 0x7a, 0xaa, 0x5f, 0xc6, 0x84, 0xbe, 0x06, 0x67, 0x8d, 0x42, 0xe9, 0x14, 0xa2, 0xe5, 0xdf, 0x67, + 0x9a, 0x49, 0x9c, 0x87, 0x84, 0xf3, 0xeb, 0xdb, 0x3f, 0x06, 0xa7, 0x93, 0xdf, 0x25, 0x38, 0xfa, + 0x63, 0x7e, 0x5d, 0xe9, 0x68, 0x5f, 0x67, 0xbf, 0x09, 0x33, 0x35, 0x5f, 0x8b, 0xa2, 0xc2, 0xe6, + 0xaf, 0x77, 0x30, 0xb7, 0x5f, 0x1e, 0x61, 0x67, 0x7d, 0x22, 0x65, 0x23, 0xfa, 0x06, 0x4c, 0x86, + 0x84, 0x45, 0x30, 0x94, 0x3a, 0xea, 0x82, 0xa8, 0x0c, 0xf5, 0x65, 0x1d, 0x93, 0xdf, 0xc3, 0xcd, + 0x32, 0x9c, 0xa0, 0x86, 0xda, 0x30, 0xf9, 0xc0, 0xf5, 0x9a, 0xfe, 0x83, 0x50, 0xd2, 0x1f, 0xc9, + 0x37, 0x78, 0xdd, 0xe3, 0x98, 0x89, 0x3e, 0x1a, 0xcd, 0xdd, 0x33, 0x88, 0xe1, 0x04, 0x71, 0xca, + 0x6a, 0x82, 0xae, 0x37, 0x1f, 0xde, 0x09, 0x49, 0x20, 0xe2, 0x2b, 0x32, 0x56, 0x83, 0x65, 0x21, + 0x8e, 0xe1, 0x94, 0xd5, 0xb0, 0x3f, 0x2c, 0xac, 0x03, 0xe3, 0x65, 0x82, 0xd5, 0x60, 0x55, 0x8a, + 0x35, 0x0c, 0xca, 0x8a, 0xd9, 0xbf, 0x75, 0xdf, 0xc3, 0xbe, 0x1f, 0x49, 0xe6, 0xcd, 0xb2, 0xea, + 0x6a, 0xe5, 0xd8, 0xc0, 0xca, 0x89, 0xe6, 0x38, 0x70, 0xd4, 0x68, 0x8e, 0x28, 0x2a, 0x88, 0x64, + 0xc1, 0xe3, 0x91, 0x5f, 0x2b, 0x8a, 0x64, 0x71, 0xf8, 0x58, 0x51, 0x2e, 0xa8, 0xc0, 0xb3, 0x29, + 0x06, 0x68, 0x90, 0x87, 0xab, 0x64, 0x26, 0xf9, 0x3a, 0x1f, 0x1d, 0x09, 0x43, 0xcb, 0x30, 0x1c, + 0xee, 0x85, 0x8d, 0xa8, 0x15, 0x16, 0x65, 0x4e, 0xae, 0x33, 0x94, 0x58, 0x1e, 0xe5, 0xff, 0x43, + 0x2c, 0xeb, 0xa2, 0x06, 0x9c, 0x10, 0x14, 0x17, 0xb7, 0x1d, 0x4f, 0x65, 0x56, 0xe5, 0xbe, 0xb7, + 0x57, 0x0f, 0xf6, 0xab, 0x27, 0x44, 0xcb, 0x3a, 0xf8, 0x70, 0xbf, 0x4a, 0xb7, 0x64, 0x06, 0x04, + 0x67, 0x51, 0xe3, 0x4b, 0xbe, 0xd1, 0xf0, 0xdb, 0x9d, 0x5a, 0xe0, 0x6f, 0xba, 0x2d, 0x52, 0xe4, + 0xd6, 0x50, 0x37, 0x30, 0xc5, 0x92, 0x37, 0xca, 0x70, 0x82, 0x1a, 0xba, 0x0f, 0x53, 0x4e, 0xa7, + 0x33, 0x1f, 0xb4, 0xfd, 0x40, 0x36, 0x30, 0x96, 0x6f, 0x1f, 0x9b, 0x37, 0x51, 0x79, 0x62, 0xd5, + 0x44, 0x21, 0x4e, 0x12, 0xa4, 0x03, 0x25, 0x36, 0x9a, 0x31, 0x50, 0x13, 0xf1, 0x40, 0x89, 0x7d, + 0x99, 0x31, 0x50, 0x19, 0x10, 0x9c, 0x45, 0xcd, 0xfe, 0xf3, 0xec, 0x76, 0xc3, 0xa2, 0x9d, 0xb3, + 0x47, 0x6e, 0x6d, 0x98, 0xe8, 0x30, 0xb6, 0x2f, 0x92, 0x1e, 0x0a, 0x56, 0xf1, 0x46, 0x9f, 0x6a, + 0xf8, 0x07, 0x2c, 0xab, 0xb3, 0xe1, 0x8e, 0x5d, 0xd3, 0xc9, 0x61, 0x93, 0xba, 0xfd, 0xaf, 0x67, + 0x99, 0xe8, 0x58, 0xe7, 0xba, 0xf5, 0x61, 0xf1, 0xe4, 0x57, 0x48, 0xc9, 0xb3, 0xf9, 0x56, 0xac, + 0x78, 0x7d, 0x89, 0x67, 0xc3, 0x58, 0xd6, 0x45, 0x5f, 0x87, 0x49, 0xd7, 0x73, 0xe3, 0x24, 0xeb, + 0x61, 0xe5, 0x64, 0x7e, 0x2c, 0x39, 0x85, 0xa5, 0x27, 0x44, 0xd5, 0x2b, 0xe3, 0x04, 0x31, 0xf4, + 0x01, 0xf3, 0x50, 0x96, 0xa4, 0x4b, 0xfd, 0x90, 0xd6, 0x9d, 0x91, 0x25, 0x59, 0x8d, 0x08, 0xea, + 0xc2, 0x89, 0x74, 0xb2, 0xf9, 0xb0, 0x62, 0xe7, 0x5f, 0x00, 0xd3, 0xf9, 0xe2, 0xe3, 0xcc, 0x95, + 0x69, 0x58, 0x88, 0xb3, 0xe8, 0xa3, 0x5b, 0xc9, 0x54, 0xe0, 0x65, 0xc3, 0xfe, 0x95, 0x4a, 0x07, + 0x3e, 0x51, 0x98, 0x05, 0x7c, 0x0b, 0xce, 0x6b, 0x79, 0x8d, 0xaf, 0x07, 0x0e, 0xf3, 0x90, 0x73, + 0xd9, 0x69, 0xa4, 0x09, 0xb5, 0xcf, 0x1e, 0xec, 0x57, 0xcf, 0x6f, 0x14, 0x21, 0xe2, 0x62, 0x3a, + 0xe8, 0x36, 0x9c, 0xe2, 0x91, 0x90, 0x96, 0x88, 0xd3, 0x6c, 0xb9, 0x9e, 0x92, 0x9a, 0x39, 0xef, + 0x3a, 0x7b, 0xb0, 0x5f, 0x3d, 0x35, 0x9f, 0x85, 0x80, 0xb3, 0xeb, 0xa1, 0x77, 0x60, 0xb4, 0xe9, + 0x49, 0x2e, 0x3b, 0x64, 0xa4, 0x8e, 0x1e, 0x5d, 0x5a, 0xaf, 0xab, 0xef, 0x8f, 0xff, 0xe0, 0xb8, + 0x02, 0xda, 0xe2, 0x06, 0x58, 0xa5, 0x35, 0x1f, 0x4e, 0x05, 0xc8, 0x4d, 0x1a, 0x96, 0x8c, 0xd0, + 0x22, 0xdc, 0xf3, 0x40, 0x3d, 0x3f, 0x35, 0xa2, 0x8e, 0x18, 0x84, 0xd1, 0xfb, 0x80, 0x44, 0xbe, + 0xaf, 0xf9, 0x06, 0xcb, 0xa8, 0xa9, 0x79, 0x45, 0x2b, 0x3d, 0x49, 0x3d, 0x85, 0x81, 0x33, 0x6a, + 0xa1, 0x1b, 0x94, 0x3d, 0xea, 0xa5, 0x82, 0xfd, 0x4a, 0x7d, 0x56, 0x65, 0x89, 0x74, 0x02, 0xc2, + 0x1c, 0x79, 0x4d, 0x8a, 0x38, 0x51, 0x0f, 0x35, 0xe1, 0x9c, 0xd3, 0x8d, 0x7c, 0x66, 0xdb, 0x36, + 0x51, 0x37, 0xfc, 0x1d, 0xe2, 0x31, 0xb7, 0x92, 0x11, 0x16, 0x78, 0xf7, 0xdc, 0x7c, 0x01, 0x1e, + 0x2e, 0xa4, 0x42, 0xaf, 0x53, 0x74, 0x2c, 0x34, 0xb3, 0xb3, 0x11, 0x25, 0x81, 0xfb, 0x62, 0x48, + 0x0c, 0xf4, 0x26, 0x8c, 0x6d, 0xfb, 0x61, 0xb4, 0x4e, 0xa2, 0x07, 0x7e, 0xb0, 0x23, 0x12, 0x8c, + 0xc4, 0x49, 0x9d, 0x62, 0x10, 0xd6, 0xf1, 0xd0, 0x4b, 0x30, 0xcc, 0x9c, 0x1e, 0x57, 0x97, 0xd8, + 0x59, 0x3b, 0x12, 0xf3, 0x98, 0x1b, 0xbc, 0x18, 0x4b, 0xb8, 0x44, 0x5d, 0xad, 0x2d, 0x32, 0x76, + 0x9c, 0x40, 0x5d, 0xad, 0x2d, 0x62, 0x09, 0xa7, 0xcb, 0x35, 0xdc, 0x76, 0x02, 0x52, 0x0b, 0xfc, + 0x06, 0x09, 0xb5, 0x54, 0x62, 0xcf, 0xf0, 0xf4, 0x29, 0x74, 0xb9, 0xd6, 0xb3, 0x10, 0x70, 0x76, + 0x3d, 0x44, 0xd2, 0x39, 0xbd, 0x27, 0xf3, 0x8d, 0xfe, 0x69, 0x71, 0xb0, 0xcf, 0xb4, 0xde, 0x1e, + 0x4c, 0xab, 0x6c, 0xe2, 0x3c, 0x61, 0x4a, 0x58, 0x99, 0xca, 0xcf, 0xe9, 0x9f, 0xf9, 0xd6, 0x47, + 0xb9, 0x51, 0xac, 0x26, 0x28, 0xe1, 0x14, 0x6d, 0x23, 0xb2, 0xf3, 0x74, 0xcf, 0xc8, 0xce, 0x57, + 0x60, 0x34, 0xec, 0xde, 0x6f, 0xfa, 0x6d, 0xc7, 0xf5, 0x98, 0xef, 0x98, 0x76, 0x71, 0xaf, 0x4b, + 0x00, 0x8e, 0x71, 0xd0, 0x0a, 0x8c, 0x38, 0xd2, 0x47, 0x02, 0xe5, 0x07, 0xad, 0x54, 0x9e, 0x11, + 0x3c, 0x8e, 0x9b, 0xf4, 0x8a, 0x50, 0x75, 0xd1, 0xdb, 0x30, 0x21, 0x02, 0xe3, 0x08, 0x7d, 0xfc, + 0x09, 0xf3, 0x29, 0x7f, 0x5d, 0x07, 0x62, 0x13, 0x17, 0xdd, 0x81, 0xb1, 0xc8, 0x6f, 0x09, 0x45, + 0x6e, 0x58, 0x39, 0x9d, 0x1f, 0x5b, 0x7a, 0x43, 0xa1, 0xe9, 0xd6, 0x3b, 0x55, 0x15, 0xeb, 0x74, + 0xd0, 0x06, 0x5f, 0xef, 0x2c, 0x71, 0x18, 0x09, 0x2b, 0x67, 0xf2, 0xcf, 0x24, 0x95, 0x5f, 0xcc, + 0xdc, 0x0e, 0xa2, 0x26, 0xd6, 0xc9, 0xa0, 0xeb, 0x30, 0xd3, 0x09, 0x5c, 0x9f, 0xad, 0x09, 0xe5, + 0xf3, 0x51, 0x31, 0x75, 0x48, 0xb5, 0x24, 0x02, 0x4e, 0xd7, 0x61, 0x71, 0x8d, 0x44, 0x61, 0xe5, + 0x2c, 0x4f, 0x75, 0xc8, 0xf5, 0x20, 0xbc, 0x0c, 0x2b, 0x28, 0x5a, 0x63, 0x9c, 0x98, 0xeb, 0x29, + 0x2b, 0xb3, 0xf9, 0xd1, 0x32, 0x74, 0x7d, 0x26, 0x97, 0xfd, 0xd5, 0x5f, 0x1c, 0x53, 0x40, 0x4d, + 0x98, 0x0c, 0xf4, 0x1b, 0x70, 0x58, 0x39, 0x57, 0xe0, 0x79, 0x9e, 0xb8, 0x2e, 0xc7, 0x02, 0x81, + 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x1e, 0x4c, 0x8b, 0xa0, 0x1f, 0xf1, 0x30, 0x9d, 0x8f, 0x5f, + 0xe7, 0xe1, 0x04, 0x0c, 0xa7, 0xb0, 0x79, 0xaa, 0x41, 0xe7, 0x7e, 0x8b, 0x08, 0xd6, 0x77, 0xcb, + 0xf5, 0x76, 0xc2, 0xca, 0x05, 0xc6, 0x1f, 0x44, 0xaa, 0xc1, 0x24, 0x14, 0x67, 0xd4, 0x40, 0x1b, + 0x30, 0xdd, 0x09, 0x08, 0x69, 0xb3, 0x7b, 0x92, 0x38, 0xcf, 0xaa, 0x3c, 0xac, 0x17, 0xed, 0x49, + 0x2d, 0x01, 0x3b, 0xcc, 0x28, 0xc3, 0x29, 0x0a, 0xe8, 0x01, 0x8c, 0xf8, 0xbb, 0x24, 0xd8, 0x26, + 0x4e, 0xb3, 0x72, 0xb1, 0xe0, 0xcd, 0xa8, 0x38, 0xdc, 0x6e, 0x0b, 0xdc, 0x84, 0x4b, 0x9d, 0x2c, + 0xee, 0xed, 0x52, 0x27, 0x1b, 0x43, 0xff, 0x89, 0x05, 0x67, 0xa5, 0x91, 0xba, 0xde, 0xa1, 0xa3, + 0xbe, 0xe8, 0x7b, 0x61, 0x14, 0xf0, 0x40, 0x54, 0xcf, 0xe6, 0x07, 0x67, 0xda, 0xc8, 0xa9, 0xa4, + 0x4c, 0x25, 0x67, 0xf3, 0x30, 0x42, 0x9c, 0xdf, 0x22, 0xbd, 0xd9, 0x87, 0x24, 0x92, 0xcc, 0x68, + 0x3e, 0x5c, 0xf9, 0x60, 0x69, 0xbd, 0xf2, 0x1c, 0x8f, 0xa2, 0x45, 0x37, 0x43, 0x3d, 0x09, 0xc4, + 0x69, 0x7c, 0x74, 0x15, 0x4a, 0x7e, 0x58, 0x79, 0x9e, 0xad, 0xed, 0xb3, 0x39, 0xe3, 0x78, 0xbb, + 0xce, 0x5d, 0xab, 0x6f, 0xd7, 0x71, 0xc9, 0x0f, 0x65, 0xba, 0x3f, 0x7a, 0x9d, 0x0d, 0x2b, 0x2f, + 0x70, 0xc5, 0xba, 0x4c, 0xf7, 0xc7, 0x0a, 0x71, 0x0c, 0x47, 0xdb, 0x30, 0x15, 0x1a, 0x6a, 0x83, + 0xb0, 0x72, 0x89, 0x8d, 0xd4, 0x0b, 0x79, 0x93, 0x66, 0x60, 0x6b, 0x79, 0xb8, 0x4c, 0x2a, 0x38, + 0x49, 0x96, 0xef, 0x2e, 0x4d, 0x71, 0x11, 0x56, 0x5e, 0xec, 0xb1, 0xbb, 0x34, 0x64, 0x7d, 0x77, + 0xe9, 0x34, 0x70, 0x82, 0x26, 0xba, 0xa3, 0x3f, 0xc8, 0xbd, 0x9c, 0xef, 0xa6, 0x9b, 0xf9, 0x14, + 0x77, 0x22, 0xf7, 0x19, 0xee, 0x7b, 0x30, 0x2d, 0xcf, 0x12, 0xba, 0x32, 0x03, 0xb7, 0x49, 0x2a, + 0x2f, 0xc5, 0x9b, 0xf6, 0x46, 0x02, 0x86, 0x53, 0xd8, 0xb3, 0x3f, 0x02, 0x33, 0x29, 0x39, 0xee, + 0x28, 0xef, 0x9b, 0x66, 0x77, 0x60, 0xc2, 0xd8, 0x2b, 0x4f, 0xd7, 0xfd, 0x6d, 0x0c, 0x46, 0x95, + 0x5b, 0x52, 0x8e, 0x39, 0x72, 0xe6, 0xb1, 0xcc, 0x91, 0x57, 0x4c, 0xef, 0xb9, 0xb3, 0x49, 0xef, + 0xb9, 0x91, 0x9a, 0xdf, 0x34, 0x1c, 0xe6, 0x36, 0x32, 0x22, 0x60, 0xe7, 0x71, 0xf9, 0xfe, 0x1f, + 0x74, 0x6a, 0x16, 0xbd, 0x72, 0xdf, 0x6e, 0x78, 0x03, 0x85, 0x46, 0xc2, 0xeb, 0x30, 0xe3, 0xf9, + 0xec, 0x22, 0x42, 0x9a, 0x52, 0xca, 0x64, 0xc2, 0xe4, 0xa8, 0x1e, 0xa1, 0x31, 0x81, 0x80, 0xd3, + 0x75, 0x68, 0x83, 0x5c, 0x1a, 0x4c, 0x5a, 0x25, 0xb9, 0xb0, 0x88, 0x05, 0x94, 0x5e, 0x80, 0xf9, + 0xaf, 0xb0, 0x32, 0x9d, 0x7f, 0x01, 0xe6, 0x95, 0x92, 0x12, 0x67, 0x28, 0x25, 0x4e, 0x66, 0x84, + 0xeb, 0xf8, 0xcd, 0xd5, 0x9a, 0xb8, 0xcb, 0x68, 0xb9, 0x29, 0x9a, 0xab, 0x35, 0xcc, 0x61, 0x68, + 0x1e, 0x86, 0xd8, 0x0f, 0x19, 0xf9, 0x2a, 0x8f, 0x17, 0xad, 0xd6, 0xb4, 0x9c, 0xca, 0xac, 0x02, + 0x16, 0x15, 0x99, 0xfd, 0x81, 0x5e, 0x00, 0x99, 0xfd, 0x61, 0xf8, 0x31, 0xed, 0x0f, 0x92, 0x00, + 0x8e, 0x69, 0xa1, 0x87, 0x70, 0xca, 0xb8, 0x74, 0xab, 0x17, 0xae, 0x90, 0xef, 0x64, 0x93, 0x40, + 0x5e, 0x38, 0x2f, 0x3a, 0x7d, 0x6a, 0x35, 0x8b, 0x12, 0xce, 0x6e, 0x00, 0xb5, 0x60, 0xa6, 0x91, + 0x6a, 0x75, 0xa4, 0xff, 0x56, 0xd5, 0xba, 0x48, 0xb7, 0x98, 0x26, 0x8c, 0xde, 0x86, 0x91, 0x8f, + 0x7c, 0xee, 0x10, 0x2b, 0xee, 0x5f, 0x32, 0x3e, 0xd3, 0xc8, 0x07, 0xb7, 0xeb, 0xac, 0xfc, 0x70, + 0xbf, 0x3a, 0x56, 0xf3, 0x9b, 0xf2, 0x2f, 0x56, 0x15, 0xd0, 0x5f, 0xb2, 0x60, 0x36, 0x7d, 0xab, + 0x57, 0x9d, 0x9e, 0xe8, 0xbf, 0xd3, 0xb6, 0x68, 0x74, 0x76, 0x39, 0x97, 0x1c, 0x2e, 0x68, 0x0a, + 0x7d, 0x91, 0xee, 0xa7, 0xd0, 0x7d, 0xc4, 0x5f, 0xb8, 0x68, 0x0e, 0x09, 0x98, 0x95, 0x1e, 0xee, + 0x57, 0xa7, 0x38, 0xfb, 0x77, 0x1f, 0xa9, 0x2c, 0x1a, 0xbc, 0x02, 0xfa, 0x31, 0x38, 0x15, 0xa4, + 0xb5, 0xec, 0x44, 0xde, 0x34, 0x3e, 0xdb, 0xcf, 0x51, 0x92, 0x9c, 0x70, 0x9c, 0x45, 0x10, 0x67, + 0xb7, 0x83, 0xfe, 0xaa, 0x05, 0xcf, 0x90, 0x7c, 0x0b, 0xae, 0xb8, 0x2a, 0xbc, 0x96, 0xd3, 0x8f, + 0x02, 0xdb, 0x2f, 0x4b, 0x30, 0xf0, 0x4c, 0x01, 0x02, 0x2e, 0x6a, 0xd7, 0xfe, 0xc7, 0x16, 0xb3, + 0xfa, 0x08, 0x54, 0x12, 0x76, 0x5b, 0xd1, 0x31, 0x38, 0xc7, 0x2e, 0x1b, 0xae, 0x25, 0x8f, 0xed, + 0xdd, 0xfa, 0xdf, 0x5a, 0xcc, 0xbb, 0xf5, 0x18, 0xdf, 0xe9, 0x7e, 0x00, 0x23, 0x91, 0x68, 0x4d, + 0x74, 0x3d, 0xcf, 0x13, 0x4f, 0x76, 0x8a, 0x79, 0xf8, 0xaa, 0x1b, 0xa6, 0x2c, 0xc5, 0x8a, 0x8c, + 0xfd, 0x5f, 0xf1, 0x19, 0x90, 0x90, 0x63, 0x30, 0x6e, 0x2f, 0x99, 0xc6, 0xed, 0x6a, 0x8f, 0x2f, + 0xc8, 0x31, 0x72, 0xff, 0x03, 0xb3, 0xdf, 0x4c, 0xb3, 0xfa, 0x49, 0x77, 0xab, 0xb6, 0xbf, 0x6b, + 0x01, 0xc4, 0xe9, 0x94, 0xfa, 0x48, 0x8c, 0x7f, 0x8d, 0xde, 0x29, 0xfd, 0xc8, 0x6f, 0xf8, 0x2d, + 0x61, 0x5c, 0x3b, 0x17, 0xdb, 0xd7, 0x79, 0xf9, 0xa1, 0xf6, 0x1b, 0x2b, 0x6c, 0x54, 0x95, 0xf1, + 0xcd, 0xcb, 0xb1, 0x5b, 0x8b, 0x11, 0xdb, 0xfc, 0x67, 0x2c, 0x38, 0x99, 0xf5, 0xe8, 0x0b, 0xbd, + 0x02, 0x23, 0x5c, 0xc7, 0xac, 0x5c, 0xde, 0xd5, 0x6c, 0xde, 0x15, 0xe5, 0x58, 0x61, 0xf4, 0xeb, + 0xfa, 0x7e, 0xc4, 0x54, 0x3f, 0xb7, 0x61, 0xa2, 0x16, 0x10, 0x4d, 0xee, 0x79, 0x37, 0xce, 0x42, + 0x36, 0xba, 0xf0, 0xca, 0x91, 0x23, 0xa9, 0xd9, 0xbf, 0x54, 0x82, 0x93, 0xdc, 0x71, 0x73, 0x7e, + 0xd7, 0x77, 0x9b, 0x35, 0xbf, 0x29, 0x9e, 0xea, 0x7f, 0x15, 0xc6, 0x3b, 0x9a, 0x61, 0xa0, 0x28, + 0x6d, 0x85, 0x6e, 0x40, 0x88, 0x55, 0x99, 0x7a, 0x29, 0x36, 0x68, 0xa1, 0x26, 0x8c, 0x93, 0x5d, + 0xb7, 0xa1, 0x1c, 0xc3, 0x4a, 0x47, 0x16, 0x1e, 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0xed, + 0xfb, 0xb9, 0x85, 0x26, 0x3a, 0x0e, 0xf4, 0x70, 0x06, 0xfb, 0x59, 0x0b, 0xce, 0xe4, 0x24, 0xb9, + 0xa0, 0xcd, 0x3d, 0x60, 0x2e, 0xb2, 0x62, 0xd9, 0xaa, 0xe6, 0xb8, 0xe3, 0x2c, 0x16, 0x50, 0xf4, + 0x65, 0x80, 0x4e, 0x9c, 0x1a, 0xb8, 0x47, 0x36, 0x00, 0x23, 0x2e, 0xb8, 0x16, 0xe2, 0x59, 0x65, + 0x10, 0xd6, 0x68, 0xd9, 0x3f, 0x33, 0x00, 0x83, 0xcc, 0x07, 0x0f, 0xd5, 0x60, 0x78, 0x9b, 0x47, + 0x20, 0x2d, 0x9c, 0x37, 0x8a, 0x2b, 0x43, 0x9a, 0xc6, 0xf3, 0xa6, 0x95, 0x62, 0x49, 0x06, 0xad, + 0xc1, 0x09, 0x9e, 0xf6, 0xb8, 0xb5, 0x44, 0x5a, 0xce, 0x9e, 0xd4, 0xb9, 0x97, 0xd8, 0xa7, 0x2a, + 0xdb, 0xc3, 0x6a, 0x1a, 0x05, 0x67, 0xd5, 0x43, 0xef, 0xc2, 0x64, 0xe4, 0xb6, 0x89, 0xdf, 0x8d, + 0x4c, 0x77, 0x53, 0x75, 0x2d, 0xdc, 0x30, 0xa0, 0x38, 0x81, 0x8d, 0xde, 0x86, 0x89, 0x4e, 0xca, + 0xba, 0x30, 0x18, 0xab, 0xe1, 0x4c, 0x8b, 0x82, 0x89, 0xcb, 0xde, 0x7d, 0x75, 0xd9, 0x2b, 0xb7, + 0x8d, 0xed, 0x80, 0x84, 0xdb, 0x7e, 0xab, 0xc9, 0x24, 0xf3, 0x41, 0xed, 0xdd, 0x57, 0x02, 0x8e, + 0x53, 0x35, 0x28, 0x95, 0x4d, 0xc7, 0x6d, 0x75, 0x03, 0x12, 0x53, 0x19, 0x32, 0xa9, 0xac, 0x24, + 0xe0, 0x38, 0x55, 0xa3, 0xb7, 0xd9, 0x64, 0xf8, 0xc9, 0x98, 0x4d, 0xec, 0xbf, 0x5b, 0x02, 0x63, + 0x6a, 0x7f, 0x88, 0xb3, 0x18, 0xbf, 0x03, 0x03, 0x5b, 0x41, 0xa7, 0x21, 0xfc, 0x4d, 0x33, 0xbf, + 0xec, 0x3a, 0xae, 0x2d, 0xea, 0x5f, 0x46, 0xff, 0x63, 0x56, 0x8b, 0xee, 0xf1, 0x53, 0xc2, 0xfb, + 0x5a, 0x06, 0x29, 0x56, 0xcf, 0x2b, 0x87, 0xa5, 0x26, 0xa2, 0x20, 0x9c, 0xbf, 0x78, 0x23, 0xa6, + 0xfc, 0xb7, 0x35, 0x53, 0xb8, 0xd0, 0x43, 0x48, 0x2a, 0xe8, 0x2a, 0x8c, 0x89, 0xc4, 0xb2, 0xec, + 0x15, 0x20, 0xdf, 0x4c, 0xcc, 0x95, 0x74, 0x29, 0x2e, 0xc6, 0x3a, 0x8e, 0xfd, 0x97, 0x4b, 0x70, + 0x22, 0xe3, 0x19, 0x37, 0x3f, 0x46, 0xb6, 0xdc, 0x30, 0x0a, 0xf6, 0x92, 0x87, 0x13, 0x16, 0xe5, + 0x58, 0x61, 0x50, 0x5e, 0xc5, 0x0f, 0xaa, 0xe4, 0xe1, 0x24, 0x9e, 0x49, 0x0a, 0xe8, 0xd1, 0x0e, + 0x27, 0x7a, 0x6c, 0x77, 0x43, 0x22, 0x33, 0x87, 0xa8, 0x63, 0x9b, 0xb9, 0x64, 0x30, 0x08, 0xbd, + 0x9a, 0x6e, 0x29, 0x3f, 0x03, 0xed, 0x6a, 0xca, 0x3d, 0x0d, 0x38, 0x8c, 0x76, 0x2e, 0x22, 0x9e, + 0xe3, 0x45, 0xe2, 0x02, 0x1b, 0x47, 0x94, 0x67, 0xa5, 0x58, 0x40, 0xed, 0xef, 0x95, 0xe1, 0x6c, + 0x6e, 0x60, 0x07, 0xda, 0xf5, 0xb6, 0xef, 0xb9, 0x91, 0xaf, 0x7c, 0x74, 0x79, 0x14, 0x79, 0xd2, + 0xd9, 0x5e, 0x13, 0xe5, 0x58, 0x61, 0xa0, 0x4b, 0x30, 0xc8, 0x2c, 0x12, 0xc9, 0xa4, 0x92, 0x78, + 0x61, 0x89, 0xc7, 0xd8, 0xe5, 0x60, 0xed, 0x54, 0x2f, 0x17, 0x9e, 0xea, 0xcf, 0x51, 0x09, 0xc6, + 0x6f, 0x25, 0x0f, 0x14, 0xda, 0x5d, 0xdf, 0x6f, 0x61, 0x06, 0x44, 0x2f, 0x88, 0xf1, 0x4a, 0x38, + 0xa5, 0x62, 0xa7, 0xe9, 0x87, 0xda, 0xa0, 0x71, 0x07, 0xf8, 0xc0, 0xf5, 0xb6, 0x92, 0xce, 0xca, + 0x37, 0x79, 0x31, 0x96, 0x70, 0xba, 0x97, 0xe2, 0xdc, 0xf8, 0xc3, 0xf9, 0x7b, 0x49, 0x65, 0xc0, + 0xef, 0x99, 0x16, 0x5f, 0x5f, 0x01, 0x23, 0x3d, 0xc5, 0x93, 0x9f, 0x2a, 0xc3, 0x14, 0x5e, 0x58, + 0xfa, 0x74, 0x22, 0xee, 0xa4, 0x27, 0xa2, 0x7f, 0xb3, 0xd9, 0x93, 0x9a, 0x8d, 0x7f, 0x68, 0xc1, + 0x14, 0x4b, 0x6f, 0x2b, 0xa2, 0x32, 0xb9, 0xbe, 0x77, 0x0c, 0x57, 0x81, 0xe7, 0x60, 0x30, 0xa0, + 0x8d, 0x8a, 0x19, 0x54, 0x7b, 0x9c, 0xf5, 0x04, 0x73, 0x18, 0x3a, 0x07, 0x03, 0xac, 0x0b, 0x74, + 0xf2, 0xc6, 0x39, 0x0b, 0x5e, 0x72, 0x22, 0x07, 0xb3, 0x52, 0x16, 0x1f, 0x16, 0x93, 0x4e, 0xcb, + 0xe5, 0x9d, 0x8e, 0xfd, 0x45, 0x3e, 0x19, 0x21, 0x9f, 0x32, 0xbb, 0xf6, 0xf1, 0xe2, 0xc3, 0x66, + 0x93, 0x2c, 0xbe, 0x66, 0xff, 0x71, 0x09, 0x2e, 0x64, 0xd6, 0xeb, 0x3b, 0x3e, 0x6c, 0x71, 0xed, + 0xa7, 0x99, 0x0c, 0xb3, 0x7c, 0x8c, 0x4f, 0x41, 0x06, 0xfa, 0x95, 0xfe, 0x07, 0xfb, 0x08, 0xdb, + 0x9a, 0x39, 0x64, 0x9f, 0x90, 0xb0, 0xad, 0x99, 0x7d, 0xcb, 0x51, 0x13, 0xfc, 0x69, 0x29, 0xe7, + 0x5b, 0x98, 0xc2, 0xe0, 0x32, 0xe5, 0x33, 0x0c, 0x18, 0xca, 0x4b, 0x38, 0xe7, 0x31, 0xbc, 0x0c, + 0x2b, 0x28, 0x9a, 0x87, 0xa9, 0xb6, 0xeb, 0x51, 0xe6, 0xb3, 0x67, 0x8a, 0xe2, 0xca, 0x90, 0xb4, + 0x66, 0x82, 0x71, 0x12, 0x1f, 0xb9, 0x5a, 0x48, 0x57, 0xfe, 0x75, 0x6f, 0x1f, 0x69, 0xd7, 0xcd, + 0x99, 0xbe, 0x34, 0x6a, 0x14, 0x33, 0xc2, 0xbb, 0xae, 0x69, 0x7a, 0xa2, 0x72, 0xff, 0x7a, 0xa2, + 0xf1, 0x6c, 0x1d, 0xd1, 0xec, 0xdb, 0x30, 0xf1, 0xd8, 0xf6, 0x1f, 0xfb, 0xfb, 0x65, 0x78, 0xa6, + 0x60, 0xdb, 0x73, 0x5e, 0x6f, 0xcc, 0x81, 0xc6, 0xeb, 0x53, 0xf3, 0x50, 0x83, 0x93, 0x9b, 0xdd, + 0x56, 0x6b, 0x8f, 0x3d, 0x6c, 0x25, 0x4d, 0x89, 0x21, 0x64, 0x4a, 0xf5, 0xf4, 0x6d, 0x25, 0x03, + 0x07, 0x67, 0xd6, 0xa4, 0x57, 0x2c, 0x7a, 0x92, 0xec, 0x29, 0x52, 0x89, 0x2b, 0x16, 0xd6, 0x81, + 0xd8, 0xc4, 0x45, 0xd7, 0x61, 0xc6, 0xd9, 0x75, 0x5c, 0x9e, 0x4c, 0x48, 0x12, 0xe0, 0x77, 0x2c, + 0xa5, 0x23, 0x9f, 0x4f, 0x22, 0xe0, 0x74, 0x9d, 0x1c, 0x53, 0x55, 0xf9, 0xb1, 0x4c, 0x55, 0x66, + 0x70, 0xd1, 0xa1, 0xfc, 0xe0, 0xa2, 0xc5, 0x7c, 0xb1, 0x67, 0x1e, 0xd6, 0x0f, 0x61, 0xe2, 0xa8, + 0x3e, 0xf1, 0x2f, 0xc1, 0xb0, 0x78, 0xc3, 0x93, 0x7c, 0xaf, 0x29, 0xf3, 0xff, 0x4b, 0xb8, 0xfd, + 0xbf, 0x5a, 0xa0, 0x74, 0xdc, 0x66, 0x1e, 0x81, 0xb7, 0x99, 0x83, 0x3f, 0xd7, 0xce, 0x6b, 0x6f, + 0x45, 0x4f, 0x69, 0x0e, 0xfe, 0x31, 0x10, 0x9b, 0xb8, 0x7c, 0xb9, 0x85, 0x71, 0xc4, 0x1a, 0xe3, + 0x02, 0x21, 0x6c, 0xab, 0x0a, 0x03, 0x7d, 0x05, 0x86, 0x9b, 0xee, 0xae, 0x1b, 0x0a, 0x3d, 0xda, + 0x91, 0x6d, 0x93, 0xf1, 0xf7, 0x2d, 0x71, 0x32, 0x58, 0xd2, 0xb3, 0xff, 0x8a, 0x05, 0xca, 0x28, + 0x7c, 0x83, 0x38, 0xad, 0x68, 0x1b, 0xbd, 0x07, 0x20, 0x29, 0x28, 0xdd, 0x9b, 0x74, 0x55, 0x03, + 0xac, 0x20, 0x87, 0xc6, 0x3f, 0xac, 0xd5, 0x41, 0xef, 0xc2, 0xd0, 0x36, 0xa3, 0x25, 0xbe, 0xed, + 0x92, 0x32, 0xc1, 0xb1, 0xd2, 0xc3, 0xfd, 0xea, 0x49, 0xb3, 0x4d, 0x79, 0x8a, 0xf1, 0x5a, 0xf6, + 0x4f, 0x95, 0xe2, 0x39, 0xfd, 0xa0, 0xeb, 0x47, 0xce, 0x31, 0x48, 0x22, 0xd7, 0x0d, 0x49, 0xe4, + 0x85, 0x22, 0xab, 0x37, 0xeb, 0x52, 0xae, 0x04, 0x72, 0x3b, 0x21, 0x81, 0xbc, 0xd8, 0x9b, 0x54, + 0xb1, 0xe4, 0xf1, 0x5f, 0x5b, 0x30, 0x63, 0xe0, 0x1f, 0xc3, 0x01, 0xb8, 0x62, 0x1e, 0x80, 0xcf, + 0xf6, 0xfc, 0x86, 0x9c, 0x83, 0xef, 0x27, 0xca, 0x89, 0xbe, 0xb3, 0x03, 0xef, 0x23, 0x18, 0xd8, + 0x76, 0x82, 0xa6, 0xb8, 0xd7, 0x5f, 0xe9, 0x6b, 0xac, 0xe7, 0x6e, 0x38, 0x81, 0x70, 0x73, 0x79, + 0x45, 0x8e, 0x3a, 0x2d, 0xea, 0xe9, 0xe2, 0xc2, 0x9a, 0x42, 0xd7, 0x60, 0x28, 0x6c, 0xf8, 0x1d, + 0xf5, 0x24, 0xf4, 0x22, 0x1b, 0x68, 0x56, 0x72, 0xb8, 0x5f, 0x45, 0x66, 0x73, 0xb4, 0x18, 0x0b, + 0x7c, 0xf4, 0x55, 0x98, 0x60, 0xbf, 0x94, 0xcf, 0x69, 0x39, 0x5f, 0x03, 0x53, 0xd7, 0x11, 0xb9, + 0x43, 0xb6, 0x51, 0x84, 0x4d, 0x52, 0xb3, 0x5b, 0x30, 0xaa, 0x3e, 0xeb, 0xa9, 0x7a, 0x24, 0xfc, + 0x8b, 0x32, 0x9c, 0xc8, 0x58, 0x73, 0x28, 0x34, 0x66, 0xe2, 0x6a, 0x9f, 0x4b, 0xf5, 0x63, 0xce, + 0x45, 0xc8, 0x2e, 0x80, 0x4d, 0xb1, 0xb6, 0xfa, 0x6e, 0xf4, 0x4e, 0x48, 0x92, 0x8d, 0xd2, 0xa2, + 0xde, 0x8d, 0xd2, 0xc6, 0x8e, 0x6d, 0xa8, 0x69, 0x43, 0xaa, 0xa7, 0x4f, 0x75, 0x4e, 0x7f, 0x6b, + 0x00, 0x4e, 0x66, 0x39, 0xe2, 0xa0, 0x1f, 0x85, 0x21, 0xf6, 0x9c, 0xaf, 0xf0, 0xfd, 0x6b, 0x56, + 0xcd, 0x39, 0xf6, 0x22, 0x50, 0x84, 0xa2, 0x9e, 0x93, 0xec, 0x88, 0x17, 0xf6, 0x1c, 0x66, 0xd1, + 0x26, 0x0b, 0x11, 0x27, 0x4e, 0x4f, 0xc9, 0x3e, 0x3e, 0xdf, 0x77, 0x07, 0xc4, 0xf9, 0x1b, 0x26, + 0xfc, 0xd9, 0x64, 0x71, 0x6f, 0x7f, 0x36, 0xd9, 0x32, 0x5a, 0x85, 0xa1, 0x06, 0x77, 0x94, 0x2a, + 0xf7, 0x66, 0x61, 0xdc, 0x4b, 0x4a, 0x31, 0x60, 0xe1, 0x1d, 0x25, 0x08, 0xcc, 0xba, 0x30, 0xa6, + 0x0d, 0xcc, 0x53, 0x5d, 0x3c, 0x3b, 0xf4, 0xe0, 0xd3, 0x86, 0xe0, 0xa9, 0x2e, 0xa0, 0xbf, 0xae, + 0x9d, 0xfd, 0x82, 0x1f, 0x7c, 0xce, 0x90, 0x9d, 0xce, 0x25, 0x1e, 0x59, 0x26, 0xf6, 0x15, 0x93, + 0xa5, 0xea, 0x66, 0x0e, 0x87, 0xdc, 0x44, 0x74, 0xe6, 0x81, 0x5f, 0x9c, 0xb7, 0xc1, 0xfe, 0x59, + 0x0b, 0x12, 0xcf, 0xe0, 0x94, 0xba, 0xd3, 0xca, 0x55, 0x77, 0x5e, 0x84, 0x81, 0xc0, 0x6f, 0x49, + 0x79, 0x4a, 0x61, 0x60, 0xbf, 0x45, 0x30, 0x83, 0x50, 0x8c, 0x28, 0x56, 0x62, 0x8d, 0xeb, 0x17, + 0x74, 0x71, 0xf5, 0x7e, 0x0e, 0x06, 0x5b, 0x64, 0x97, 0xb4, 0x92, 0xf9, 0x98, 0x6f, 0xd1, 0x42, + 0xcc, 0x61, 0xf6, 0x3f, 0x1c, 0x80, 0xf3, 0x85, 0x91, 0x24, 0xa9, 0x80, 0xb9, 0xe5, 0x44, 0xe4, + 0x81, 0xb3, 0x97, 0xcc, 0x43, 0x7a, 0x9d, 0x17, 0x63, 0x09, 0x67, 0xef, 0xee, 0x79, 0x6e, 0xad, + 0x84, 0x72, 0x58, 0xa4, 0xd4, 0x12, 0x50, 0x53, 0xd9, 0x58, 0x7e, 0x12, 0xca, 0xc6, 0xd7, 0x00, + 0xc2, 0xb0, 0xc5, 0xbd, 0x5d, 0x9b, 0xe2, 0x41, 0x7f, 0x1c, 0xe9, 0xa4, 0x7e, 0x4b, 0x40, 0xb0, + 0x86, 0x85, 0x96, 0x60, 0xba, 0x13, 0xf8, 0x11, 0xd7, 0xb5, 0x2f, 0x71, 0x87, 0xf0, 0x41, 0x33, + 0x88, 0x5f, 0x2d, 0x01, 0xc7, 0xa9, 0x1a, 0xe8, 0x4d, 0x18, 0x13, 0x81, 0xfd, 0x6a, 0xbe, 0xdf, + 0x12, 0xea, 0x3d, 0xe5, 0x23, 0x5d, 0x8f, 0x41, 0x58, 0xc7, 0xd3, 0xaa, 0x31, 0x05, 0xfe, 0x70, + 0x66, 0x35, 0xae, 0xc4, 0xd7, 0xf0, 0x12, 0x49, 0x40, 0x46, 0xfa, 0x4a, 0x02, 0x12, 0x2b, 0x3c, + 0x47, 0xfb, 0xb6, 0x27, 0x43, 0x4f, 0x15, 0xe1, 0xaf, 0x0c, 0xc0, 0x09, 0xb1, 0x70, 0x9e, 0xf6, + 0x72, 0xb9, 0x93, 0x5e, 0x2e, 0x4f, 0x42, 0x25, 0xfa, 0xe9, 0x9a, 0x39, 0xee, 0x35, 0xf3, 0xd3, + 0x16, 0x98, 0x32, 0x24, 0xfa, 0x8f, 0x72, 0x13, 0x39, 0xbf, 0x99, 0x2b, 0x93, 0xc6, 0x19, 0x02, + 0x3e, 0x5e, 0x4a, 0x67, 0xfb, 0x7f, 0xb6, 0xe0, 0xd9, 0x9e, 0x14, 0xd1, 0x32, 0x8c, 0x32, 0x41, + 0x57, 0xbb, 0x17, 0xbf, 0xa8, 0x1e, 0x8c, 0x48, 0x40, 0x8e, 0xdc, 0x1d, 0xd7, 0x44, 0xcb, 0xa9, + 0x8c, 0xd9, 0x2f, 0x65, 0x64, 0xcc, 0x3e, 0x65, 0x0c, 0xcf, 0x63, 0xa6, 0xcc, 0xfe, 0x49, 0x7a, + 0xe2, 0x98, 0xaf, 0x4e, 0x3f, 0x6f, 0xa8, 0x73, 0xed, 0x84, 0x3a, 0x17, 0x99, 0xd8, 0xda, 0x19, + 0xf2, 0x1e, 0x4c, 0xb3, 0x88, 0xbf, 0xec, 0xf9, 0x92, 0x78, 0xae, 0x5a, 0x8a, 0xbd, 0x9d, 0x6f, + 0x25, 0x60, 0x38, 0x85, 0x6d, 0xff, 0x9b, 0x32, 0x0c, 0xf1, 0xed, 0x77, 0x0c, 0x17, 0xdf, 0x97, + 0x61, 0xd4, 0x6d, 0xb7, 0xbb, 0x3c, 0x09, 0xf2, 0x60, 0xec, 0xf0, 0xbe, 0x2a, 0x0b, 0x71, 0x0c, + 0x47, 0x2b, 0xc2, 0x92, 0x50, 0x90, 0x54, 0x80, 0x77, 0x7c, 0x6e, 0xc9, 0x89, 0x1c, 0x2e, 0xc5, + 0xa9, 0x73, 0x36, 0xb6, 0x39, 0xa0, 0x6f, 0x00, 0x84, 0x51, 0xe0, 0x7a, 0x5b, 0xb4, 0x4c, 0x64, + 0x9e, 0xf9, 0x6c, 0x01, 0xb5, 0xba, 0x42, 0xe6, 0x34, 0x63, 0x9e, 0xa3, 0x00, 0x58, 0xa3, 0x88, + 0xe6, 0x8c, 0x93, 0x7e, 0x36, 0x31, 0x77, 0xc0, 0xa9, 0xc6, 0x73, 0x36, 0xfb, 0x05, 0x18, 0x55, + 0xc4, 0x7b, 0xe9, 0x15, 0xc7, 0x75, 0x81, 0xed, 0x4b, 0x30, 0x95, 0xe8, 0xdb, 0x91, 0xd4, 0x92, + 0xbf, 0x6e, 0xc1, 0x14, 0xef, 0xcc, 0xb2, 0xb7, 0x2b, 0x4e, 0x83, 0x47, 0x70, 0xb2, 0x95, 0xc1, + 0x95, 0xc5, 0xf4, 0xf7, 0xcf, 0xc5, 0x95, 0x1a, 0x32, 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0x97, 0xe9, + 0x8e, 0xa3, 0x5c, 0xd7, 0x69, 0x89, 0x98, 0x2b, 0xe3, 0x7c, 0xb7, 0xf1, 0x32, 0xac, 0xa0, 0xf6, + 0x1f, 0x58, 0x30, 0xc3, 0x7b, 0x7e, 0x93, 0xec, 0x29, 0xde, 0xf4, 0x83, 0xec, 0xbb, 0x48, 0xbf, + 0x5f, 0xca, 0x49, 0xbf, 0xaf, 0x7f, 0x5a, 0xb9, 0xf0, 0xd3, 0x7e, 0xc9, 0x02, 0xb1, 0x42, 0x8e, + 0x41, 0xd3, 0xf2, 0x23, 0xa6, 0xa6, 0x65, 0x36, 0x7f, 0x13, 0xe4, 0xa8, 0x58, 0xfe, 0xbd, 0x05, + 0xd3, 0x1c, 0x41, 0x8b, 0x62, 0xf7, 0x83, 0x9c, 0x87, 0x05, 0xf3, 0x8b, 0x32, 0xdd, 0x5a, 0x6f, + 0x92, 0xbd, 0x0d, 0xbf, 0xe6, 0x44, 0xdb, 0xd9, 0x1f, 0x65, 0x4c, 0xd6, 0x40, 0xe1, 0x64, 0x35, + 0xe5, 0x06, 0x32, 0x12, 0xad, 0xf6, 0x50, 0x00, 0x1f, 0x35, 0xd1, 0xaa, 0xfd, 0x47, 0x16, 0x20, + 0xde, 0x8c, 0x21, 0xb8, 0x51, 0x71, 0x88, 0x95, 0x66, 0x06, 0x0b, 0x54, 0x10, 0xac, 0x61, 0x3d, + 0x91, 0xe1, 0x49, 0xb8, 0xb2, 0x94, 0x7b, 0xbb, 0xb2, 0x1c, 0x61, 0x44, 0x7f, 0x69, 0x18, 0x92, + 0x0f, 0x56, 0xd1, 0x5d, 0x18, 0x6f, 0x38, 0x1d, 0xe7, 0xbe, 0xdb, 0x72, 0x23, 0x97, 0x84, 0x45, + 0x7e, 0x6e, 0x8b, 0x1a, 0x9e, 0x70, 0x3e, 0xd0, 0x4a, 0xb0, 0x41, 0x07, 0xcd, 0x01, 0x74, 0x02, + 0x77, 0xd7, 0x6d, 0x91, 0x2d, 0xa6, 0x10, 0x62, 0x51, 0x9e, 0xb8, 0xd3, 0x9d, 0x2c, 0xc5, 0x1a, + 0x46, 0x46, 0x70, 0x95, 0xf2, 0x53, 0x0e, 0xae, 0x02, 0xc7, 0x16, 0x5c, 0x65, 0xe0, 0x48, 0xc1, + 0x55, 0x46, 0x8e, 0x1c, 0x5c, 0x65, 0xb0, 0xaf, 0xe0, 0x2a, 0x18, 0x4e, 0x4b, 0xd9, 0x93, 0xfe, + 0x5f, 0x71, 0x5b, 0x44, 0x5c, 0x38, 0x78, 0x68, 0xaa, 0xd9, 0x83, 0xfd, 0xea, 0x69, 0x9c, 0x89, + 0x81, 0x73, 0x6a, 0xa2, 0x2f, 0x43, 0xc5, 0x69, 0xb5, 0xfc, 0x07, 0x6a, 0x52, 0x97, 0xc3, 0x86, + 0xd3, 0x8a, 0xc3, 0x32, 0x8e, 0x2c, 0x9c, 0x3b, 0xd8, 0xaf, 0x56, 0xe6, 0x73, 0x70, 0x70, 0x6e, + 0x6d, 0xf4, 0x0e, 0x8c, 0x76, 0x02, 0xbf, 0xb1, 0xa6, 0xbd, 0xaa, 0xbf, 0x40, 0x07, 0xb0, 0x26, + 0x0b, 0x0f, 0xf7, 0xab, 0x13, 0xea, 0x0f, 0x3b, 0xf0, 0xe3, 0x0a, 0x19, 0x71, 0x4b, 0xc6, 0x9e, + 0x76, 0xdc, 0x92, 0xf1, 0x27, 0x1c, 0xb7, 0xc4, 0xde, 0x81, 0x13, 0x75, 0x12, 0xb8, 0x4e, 0xcb, + 0x7d, 0x44, 0x65, 0x72, 0xc9, 0x03, 0x37, 0x60, 0x34, 0x48, 0x70, 0xfd, 0xbe, 0x92, 0x09, 0x68, + 0x7a, 0x19, 0xc9, 0xe5, 0x63, 0x42, 0xf6, 0xff, 0x6b, 0xc1, 0xb0, 0x78, 0x04, 0x7b, 0x0c, 0x92, + 0xe9, 0xbc, 0x61, 0x92, 0xa9, 0x66, 0x4f, 0x0a, 0xeb, 0x4c, 0xae, 0x31, 0x66, 0x35, 0x61, 0x8c, + 0x79, 0xb6, 0x88, 0x48, 0xb1, 0x19, 0xe6, 0x3f, 0x2b, 0xd3, 0x1b, 0x82, 0x11, 0x8e, 0xe1, 0xe9, + 0x0f, 0xc1, 0x3a, 0x0c, 0x87, 0x22, 0x1c, 0x40, 0x29, 0xff, 0x8d, 0x51, 0x72, 0x12, 0x63, 0x1f, + 0x48, 0x11, 0x00, 0x40, 0x12, 0xc9, 0x8c, 0x33, 0x50, 0x7e, 0x8a, 0x71, 0x06, 0x7a, 0x05, 0xac, + 0x18, 0x78, 0x12, 0x01, 0x2b, 0xec, 0xdf, 0x60, 0xa7, 0xb3, 0x5e, 0x7e, 0x0c, 0x82, 0xdb, 0x75, + 0xf3, 0x1c, 0xb7, 0x0b, 0x56, 0x96, 0xe8, 0x54, 0x8e, 0x00, 0xf7, 0x6b, 0x16, 0x9c, 0xcf, 0xf8, + 0x2a, 0x4d, 0x9a, 0x7b, 0x05, 0x46, 0x9c, 0x6e, 0xd3, 0x55, 0x7b, 0x59, 0xb3, 0x16, 0xcf, 0x8b, + 0x72, 0xac, 0x30, 0xd0, 0x22, 0xcc, 0x90, 0x54, 0x7c, 0x61, 0x1e, 0xb9, 0x8b, 0xbd, 0x9c, 0x4e, + 0x07, 0x17, 0x4e, 0xe3, 0xab, 0xa0, 0x77, 0xe5, 0xdc, 0xa0, 0x77, 0x7f, 0xcf, 0x82, 0x31, 0xf5, + 0x20, 0xfe, 0xa9, 0x8f, 0xf6, 0x7b, 0xe6, 0x68, 0x3f, 0x53, 0x30, 0xda, 0x39, 0xc3, 0xfc, 0x7b, + 0x25, 0xd5, 0xdf, 0x9a, 0x1f, 0x44, 0x7d, 0x48, 0x89, 0x8f, 0xff, 0xec, 0xe5, 0x2a, 0x8c, 0x39, + 0x9d, 0x8e, 0x04, 0x48, 0xff, 0x45, 0x96, 0x1a, 0x26, 0x2e, 0xc6, 0x3a, 0x8e, 0x7a, 0x85, 0x53, + 0xce, 0x7d, 0x85, 0xd3, 0x04, 0x88, 0x9c, 0x60, 0x8b, 0x44, 0xb4, 0x4c, 0xb8, 0x5b, 0xe7, 0xf3, + 0x9b, 0x6e, 0xe4, 0xb6, 0xe6, 0x5c, 0x2f, 0x0a, 0xa3, 0x60, 0x6e, 0xd5, 0x8b, 0x6e, 0x07, 0xfc, + 0x9a, 0xaa, 0x85, 0x96, 0x54, 0xb4, 0xb0, 0x46, 0x57, 0x06, 0x7f, 0x61, 0x6d, 0x0c, 0x9a, 0x8e, + 0x30, 0xeb, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x0b, 0xec, 0xf4, 0x61, 0x63, 0x7a, 0xb4, 0x90, 0x89, + 0x7f, 0x3c, 0xae, 0x66, 0x83, 0x99, 0x84, 0x97, 0xf4, 0xc0, 0x8c, 0xc5, 0xcc, 0x9e, 0x36, 0xac, + 0xbf, 0xb3, 0x8d, 0xa3, 0x37, 0xa2, 0xaf, 0xa5, 0x9c, 0x9b, 0x5e, 0xed, 0x71, 0x6a, 0x1c, 0xc1, + 0x9d, 0x89, 0xe5, 0x89, 0x64, 0x59, 0xf4, 0x56, 0x6b, 0x62, 0x5f, 0x68, 0x79, 0x22, 0x05, 0x00, + 0xc7, 0x38, 0x54, 0x60, 0x53, 0x7f, 0xc2, 0x0a, 0x8a, 0xd3, 0x09, 0x28, 0xec, 0x10, 0x6b, 0x18, + 0xe8, 0x8a, 0x50, 0x5a, 0x70, 0xdb, 0xc3, 0x33, 0x09, 0xa5, 0x85, 0x1c, 0x2e, 0x4d, 0xd3, 0x74, + 0x15, 0xc6, 0xc8, 0xc3, 0x88, 0x04, 0x9e, 0xd3, 0xa2, 0x2d, 0x0c, 0xc6, 0xc1, 0x91, 0x97, 0xe3, + 0x62, 0xac, 0xe3, 0xa0, 0x0d, 0x98, 0x0a, 0xb9, 0x2e, 0x4f, 0x25, 0xb1, 0xe1, 0x3a, 0xd1, 0xcf, + 0xaa, 0x50, 0x04, 0x26, 0xf8, 0x90, 0x15, 0x71, 0xee, 0x24, 0x03, 0xb4, 0x24, 0x49, 0xa0, 0x77, + 0x61, 0xb2, 0xe5, 0x3b, 0xcd, 0x05, 0xa7, 0xe5, 0x78, 0x0d, 0x36, 0x3e, 0x23, 0x46, 0x94, 0xce, + 0xc9, 0x5b, 0x06, 0x14, 0x27, 0xb0, 0xa9, 0x80, 0xa8, 0x97, 0x88, 0xc4, 0x4b, 0x8e, 0xb7, 0x45, + 0xc2, 0xca, 0x28, 0xfb, 0x2a, 0x26, 0x20, 0xde, 0xca, 0xc1, 0xc1, 0xb9, 0xb5, 0xd1, 0x35, 0x18, + 0x97, 0x9f, 0xaf, 0xc5, 0x33, 0x8a, 0x1f, 0x34, 0x69, 0x30, 0x6c, 0x60, 0xa2, 0x10, 0x4e, 0xc9, + 0xff, 0x1b, 0x81, 0xb3, 0xb9, 0xe9, 0x36, 0x44, 0x90, 0x0f, 0xfe, 0x28, 0xfd, 0x4b, 0xf2, 0x05, + 0xec, 0x72, 0x16, 0xd2, 0xe1, 0x7e, 0xf5, 0x9c, 0x18, 0xb5, 0x4c, 0x38, 0xce, 0xa6, 0x8d, 0xd6, + 0xe0, 0x04, 0xf7, 0x81, 0x59, 0xdc, 0x26, 0x8d, 0x1d, 0xb9, 0xe1, 0x98, 0xd4, 0xa8, 0x3d, 0xfc, + 0xb9, 0x91, 0x46, 0xc1, 0x59, 0xf5, 0xd0, 0x87, 0x50, 0xe9, 0x74, 0xef, 0xb7, 0xdc, 0x70, 0x7b, + 0xdd, 0x8f, 0x98, 0x0b, 0xd9, 0x7c, 0xb3, 0x19, 0x90, 0x90, 0xbf, 0x59, 0x66, 0x47, 0xaf, 0x8c, + 0x41, 0x55, 0xcb, 0xc1, 0xc3, 0xb9, 0x14, 0xd0, 0x23, 0x38, 0x95, 0x58, 0x08, 0x22, 0x98, 0xcc, + 0x64, 0x7e, 0x0a, 0xbb, 0x7a, 0x56, 0x05, 0x11, 0x97, 0x29, 0x0b, 0x84, 0xb3, 0x9b, 0x40, 0x6f, + 0x01, 0xb8, 0x9d, 0x15, 0xa7, 0xed, 0xb6, 0xe8, 0x75, 0xf4, 0x04, 0x5b, 0x23, 0xf4, 0x6a, 0x02, + 0xab, 0x35, 0x59, 0x4a, 0x79, 0xb3, 0xf8, 0xb7, 0x87, 0x35, 0x6c, 0x74, 0x0b, 0x26, 0xc5, 0xbf, + 0x3d, 0x31, 0xa5, 0x33, 0x2a, 0xdb, 0xf1, 0xa4, 0xac, 0xa1, 0xe6, 0x31, 0x51, 0x82, 0x13, 0x75, + 0xd1, 0x16, 0x9c, 0x97, 0xa9, 0x96, 0xf5, 0xf5, 0x29, 0xe7, 0x20, 0x64, 0x79, 0xe3, 0x46, 0xf8, + 0x9b, 0xa2, 0xf9, 0x22, 0x44, 0x5c, 0x4c, 0x87, 0x9e, 0xeb, 0xfa, 0x32, 0xe7, 0x2f, 0xd9, 0x4f, + 0xc5, 0xb1, 0x4e, 0x6f, 0x25, 0x81, 0x38, 0x8d, 0x8f, 0x7c, 0x38, 0xe5, 0x7a, 0x59, 0xab, 0xfa, + 0x34, 0x23, 0xf4, 0x45, 0xfe, 0x88, 0xbf, 0x78, 0x45, 0x67, 0xc2, 0x71, 0x36, 0x5d, 0xb4, 0x0a, + 0x27, 0x22, 0x5e, 0xb0, 0xe4, 0x86, 0x3c, 0x2d, 0x15, 0xbd, 0xf6, 0x9d, 0x61, 0xcd, 0x9d, 0xa1, + 0xab, 0x79, 0x23, 0x0d, 0xc6, 0x59, 0x75, 0x3e, 0x9e, 0x03, 0xe8, 0xef, 0x5b, 0xb4, 0xb6, 0x26, + 0xe8, 0xa3, 0x6f, 0xc2, 0xb8, 0x3e, 0x3e, 0x42, 0x68, 0xb9, 0x94, 0x2d, 0x07, 0x6b, 0xec, 0x85, + 0x5f, 0x13, 0x14, 0x0b, 0xd1, 0x61, 0xd8, 0xa0, 0x88, 0x1a, 0x19, 0xc1, 0x37, 0xae, 0xf4, 0x27, + 0x14, 0xf5, 0xef, 0xff, 0x48, 0x20, 0x7b, 0xe7, 0xa0, 0x5b, 0x30, 0xd2, 0x68, 0xb9, 0xc4, 0x8b, + 0x56, 0x6b, 0x45, 0x21, 0x68, 0x17, 0x05, 0x8e, 0xd8, 0x8a, 0x22, 0x9b, 0x1c, 0x2f, 0xc3, 0x8a, + 0x82, 0x7d, 0x0d, 0xc6, 0xea, 0x2d, 0x42, 0x3a, 0xfc, 0x1d, 0x17, 0x7a, 0x89, 0x5d, 0x4c, 0x98, + 0x68, 0x69, 0x31, 0xd1, 0x52, 0xbf, 0x73, 0x30, 0xa1, 0x52, 0xc2, 0xed, 0xdf, 0x2e, 0x41, 0xb5, + 0x47, 0x52, 0xc3, 0x84, 0xbd, 0xcd, 0xea, 0xcb, 0xde, 0x36, 0x0f, 0x53, 0xf1, 0x3f, 0x5d, 0x95, + 0xa7, 0x9c, 0xa1, 0xef, 0x9a, 0x60, 0x9c, 0xc4, 0xef, 0xfb, 0x5d, 0x8b, 0x6e, 0xb2, 0x1b, 0xe8, + 0xf9, 0x32, 0xcb, 0x30, 0xd5, 0x0f, 0xf6, 0x7f, 0xf7, 0xce, 0x35, 0xbb, 0xda, 0xbf, 0x51, 0x82, + 0x53, 0x6a, 0x08, 0x7f, 0x78, 0x07, 0xee, 0x4e, 0x7a, 0xe0, 0x9e, 0x80, 0xd1, 0xda, 0xbe, 0x0d, + 0x43, 0x3c, 0x2e, 0x6e, 0x1f, 0x32, 0xff, 0x73, 0x66, 0x1e, 0x06, 0x25, 0x66, 0x1a, 0xb9, 0x18, + 0xfe, 0x92, 0x05, 0x53, 0x89, 0x07, 0x92, 0x08, 0x6b, 0xaf, 0xe8, 0x1f, 0x47, 0x2e, 0xcf, 0x92, + 0xf8, 0x2f, 0xc2, 0xc0, 0xb6, 0xaf, 0x9c, 0x94, 0x15, 0xc6, 0x0d, 0x3f, 0x8c, 0x30, 0x83, 0xd8, + 0xff, 0xd2, 0x82, 0xc1, 0x0d, 0xc7, 0xf5, 0x22, 0x69, 0xfd, 0xb0, 0x72, 0xac, 0x1f, 0xfd, 0x7c, + 0x17, 0x7a, 0x13, 0x86, 0xc8, 0xe6, 0x26, 0x69, 0x44, 0x62, 0x56, 0x65, 0x94, 0x8f, 0xa1, 0x65, + 0x56, 0x4a, 0x85, 0x50, 0xd6, 0x18, 0xff, 0x8b, 0x05, 0x32, 0xba, 0x07, 0xa3, 0x91, 0xdb, 0x26, + 0xf3, 0xcd, 0xa6, 0xf0, 0x09, 0x78, 0x8c, 0xd0, 0x34, 0x1b, 0x92, 0x00, 0x8e, 0x69, 0xd9, 0xdf, + 0x2b, 0x01, 0xc4, 0x71, 0xf8, 0x7a, 0x7d, 0xe2, 0x42, 0xca, 0x5a, 0x7c, 0x29, 0xc3, 0x5a, 0x8c, + 0x62, 0x82, 0x19, 0xa6, 0x62, 0x35, 0x4c, 0xe5, 0xbe, 0x86, 0x69, 0xe0, 0x28, 0xc3, 0xb4, 0x08, + 0x33, 0x71, 0x1c, 0x41, 0x33, 0x8c, 0x2a, 0x3b, 0xbf, 0x37, 0x92, 0x40, 0x9c, 0xc6, 0xb7, 0x09, + 0x5c, 0x54, 0xe1, 0xd4, 0xc4, 0x59, 0xc8, 0x9e, 0x12, 0xe8, 0xd6, 0xf7, 0x1e, 0xe3, 0x14, 0x9b, + 0xc3, 0x4b, 0xb9, 0xe6, 0xf0, 0xbf, 0x69, 0xc1, 0xc9, 0x64, 0x3b, 0xec, 0xdd, 0xfd, 0x77, 0x2d, + 0x38, 0x15, 0xe7, 0xf4, 0x4a, 0xbb, 0x20, 0xbc, 0x51, 0x18, 0x22, 0x2e, 0xa7, 0xc7, 0x71, 0x38, + 0x99, 0xb5, 0x2c, 0xd2, 0x38, 0xbb, 0x45, 0xfb, 0xff, 0x19, 0x80, 0x4a, 0x5e, 0x6c, 0x39, 0xf6, + 0xd2, 0xc8, 0x79, 0x58, 0xdf, 0x21, 0x0f, 0xc4, 0x7b, 0x8e, 0xf8, 0xa5, 0x11, 0x2f, 0xc6, 0x12, + 0x9e, 0x4c, 0xe3, 0x56, 0xea, 0x33, 0x8d, 0xdb, 0x36, 0xcc, 0x3c, 0xd8, 0x26, 0xde, 0x1d, 0x2f, + 0x74, 0x22, 0x37, 0xdc, 0x74, 0x99, 0x01, 0x9d, 0xaf, 0x9b, 0xb7, 0xe4, 0xab, 0x8b, 0x7b, 0x49, + 0x84, 0xc3, 0xfd, 0xea, 0x79, 0xa3, 0x20, 0xee, 0x32, 0x67, 0x24, 0x38, 0x4d, 0x34, 0x9d, 0x05, + 0x6f, 0xe0, 0x29, 0x67, 0xc1, 0x6b, 0xbb, 0xc2, 0xed, 0x46, 0x3e, 0x23, 0x61, 0xd7, 0xd6, 0x35, + 0x55, 0x8a, 0x35, 0x0c, 0xf4, 0x75, 0x40, 0x7a, 0x1a, 0x53, 0x23, 0xb4, 0xef, 0xab, 0x07, 0xfb, + 0x55, 0xb4, 0x9e, 0x82, 0x1e, 0xee, 0x57, 0x4f, 0xd0, 0xd2, 0x55, 0x8f, 0x5e, 0x7f, 0xe3, 0x78, + 0x88, 0x19, 0x84, 0xd0, 0x3d, 0x98, 0xa6, 0xa5, 0x6c, 0x47, 0xc9, 0xb8, 0xc1, 0xfc, 0xca, 0xfa, + 0xf2, 0xc1, 0x7e, 0x75, 0x7a, 0x3d, 0x01, 0xcb, 0x23, 0x9d, 0x22, 0x92, 0x91, 0x0c, 0x6f, 0xa4, + 0xdf, 0x64, 0x78, 0xf6, 0x77, 0x2d, 0x38, 0x4b, 0x0f, 0xb8, 0xe6, 0xad, 0x1c, 0x2b, 0xba, 0xd3, + 0x71, 0xb9, 0x9d, 0x46, 0x1c, 0x35, 0x4c, 0x57, 0x57, 0x5b, 0xe5, 0x56, 0x1a, 0x05, 0xa5, 0x1c, + 0x7e, 0xc7, 0xf5, 0x9a, 0x49, 0x0e, 0x7f, 0xd3, 0xf5, 0x9a, 0x98, 0x41, 0xd4, 0x91, 0x55, 0xce, + 0xcd, 0x43, 0xf0, 0x2b, 0x74, 0xaf, 0xd2, 0xbe, 0xfc, 0x40, 0xbb, 0x81, 0x5e, 0xd6, 0x6d, 0xaa, + 0xc2, 0x7d, 0x32, 0xd7, 0x9e, 0xfa, 0x1d, 0x0b, 0xc4, 0xeb, 0xf7, 0x3e, 0xce, 0xe4, 0xaf, 0xc2, + 0xf8, 0x6e, 0x3a, 0xc5, 0xf3, 0xc5, 0xfc, 0x70, 0x00, 0x22, 0xb1, 0xb3, 0x12, 0xd1, 0x8d, 0x74, + 0xce, 0x06, 0x2d, 0xbb, 0x09, 0x02, 0xba, 0x44, 0x98, 0x55, 0xa3, 0x77, 0x6f, 0x5e, 0x03, 0x68, + 0x32, 0x5c, 0x96, 0xec, 0xac, 0x64, 0x4a, 0x5c, 0x4b, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x17, 0xca, + 0x30, 0x26, 0x53, 0x0a, 0x77, 0xbd, 0x7e, 0x74, 0x8f, 0xba, 0xe0, 0x54, 0xea, 0x29, 0x38, 0x7d, + 0x08, 0x33, 0x01, 0x69, 0x74, 0x83, 0xd0, 0xdd, 0x25, 0x12, 0x2c, 0x36, 0xc9, 0x1c, 0x4f, 0x83, + 0x91, 0x00, 0x1e, 0xb2, 0xd0, 0x5d, 0x89, 0x42, 0x66, 0x34, 0x4e, 0x13, 0x42, 0x57, 0x60, 0x94, + 0xa9, 0xde, 0x6b, 0xb1, 0x42, 0x58, 0x29, 0xbe, 0xd6, 0x24, 0x00, 0xc7, 0x38, 0xec, 0x72, 0xd0, + 0xbd, 0xaf, 0x65, 0xa2, 0x8b, 0x2f, 0x07, 0xbc, 0x18, 0x4b, 0x38, 0xfa, 0x32, 0x4c, 0xf3, 0x7a, + 0x81, 0xdf, 0x71, 0xb6, 0xb8, 0x49, 0x70, 0x50, 0x85, 0xd7, 0x99, 0x5e, 0x4b, 0xc0, 0x0e, 0xf7, + 0xab, 0x27, 0x93, 0x65, 0xac, 0xdb, 0x29, 0x2a, 0xcc, 0xf3, 0x8f, 0x37, 0x42, 0xcf, 0x8c, 0x94, + 0xc3, 0x60, 0x0c, 0xc2, 0x3a, 0x9e, 0xfd, 0x27, 0x16, 0xcc, 0x68, 0x53, 0xd5, 0x77, 0x26, 0x12, + 0x63, 0x90, 0x4a, 0x7d, 0x0c, 0xd2, 0xd1, 0xa2, 0x3d, 0x64, 0xce, 0xf0, 0xc0, 0x13, 0x9a, 0x61, + 0xfb, 0x9b, 0x80, 0xd2, 0xf9, 0xaa, 0xd1, 0xfb, 0xdc, 0x91, 0xdf, 0x0d, 0x48, 0xb3, 0xc8, 0xe0, + 0xaf, 0x47, 0xce, 0x91, 0x2f, 0x57, 0x79, 0x2d, 0xac, 0xea, 0xdb, 0x7f, 0x32, 0x00, 0xd3, 0xc9, + 0x58, 0x1d, 0xe8, 0x06, 0x0c, 0x71, 0x29, 0x5d, 0x90, 0x2f, 0xf0, 0x27, 0xd3, 0x22, 0x7c, 0xf0, + 0x2c, 0x41, 0x5c, 0xba, 0x17, 0xf5, 0xd1, 0x87, 0x30, 0xd6, 0xf4, 0x1f, 0x78, 0x0f, 0x9c, 0xa0, + 0x39, 0x5f, 0x5b, 0x15, 0x1c, 0x22, 0x53, 0x01, 0xb5, 0x14, 0xa3, 0xe9, 0x51, 0x43, 0x98, 0xef, + 0x44, 0x0c, 0xc2, 0x3a, 0x39, 0xb4, 0xc1, 0x12, 0x57, 0x6d, 0xba, 0x5b, 0x6b, 0x4e, 0xa7, 0xe8, + 0x55, 0xd7, 0xa2, 0x44, 0xd2, 0x28, 0x4f, 0x88, 0xec, 0x56, 0x1c, 0x80, 0x63, 0x42, 0xe8, 0x47, + 0xe1, 0x44, 0x98, 0x63, 0x12, 0xcb, 0x71, 0x38, 0x28, 0xb4, 0x12, 0x71, 0x65, 0x4a, 0x96, 0xf1, + 0x2c, 0xab, 0x19, 0xf4, 0x10, 0x90, 0x50, 0x3d, 0x6f, 0x04, 0xdd, 0x30, 0xe2, 0x29, 0x20, 0xc5, + 0xa5, 0xeb, 0x73, 0xd9, 0x7a, 0x82, 0x24, 0xb6, 0xd6, 0x36, 0x0b, 0x9c, 0x9c, 0xc6, 0xc0, 0x19, + 0x6d, 0xa0, 0x6d, 0x98, 0xec, 0x18, 0xd9, 0x37, 0xd9, 0xde, 0xcc, 0x89, 0x2e, 0x9c, 0x97, 0xa7, + 0x93, 0x9f, 0xd2, 0x26, 0x14, 0x27, 0xe8, 0xda, 0xdf, 0x19, 0x80, 0x59, 0x99, 0x8a, 0x3e, 0xe3, + 0x9d, 0xcc, 0xb7, 0xad, 0xc4, 0x43, 0x99, 0xb7, 0xf2, 0x8f, 0x94, 0xa7, 0xf6, 0x5c, 0xe6, 0x27, + 0xd3, 0xcf, 0x65, 0xde, 0x39, 0x62, 0x37, 0x9e, 0xd8, 0xa3, 0x99, 0x1f, 0xda, 0x97, 0x2e, 0x07, + 0x27, 0xc1, 0x10, 0x02, 0x10, 0xe6, 0xf1, 0xef, 0x6b, 0xd2, 0x48, 0x95, 0xa3, 0x68, 0xb8, 0x21, + 0x70, 0x0c, 0xb1, 0x62, 0x5c, 0x46, 0xc9, 0x67, 0x1c, 0x5d, 0xd1, 0xa1, 0x34, 0x49, 0xbb, 0x13, + 0xed, 0x2d, 0xb9, 0x81, 0xe8, 0x71, 0x26, 0xcd, 0x65, 0x81, 0x93, 0xa6, 0x29, 0x21, 0x58, 0xd1, + 0x41, 0xbb, 0x30, 0xb3, 0xc5, 0x62, 0x4b, 0x69, 0x59, 0xe1, 0x05, 0x07, 0xca, 0xe4, 0x10, 0xd7, + 0x17, 0x97, 0xf3, 0x53, 0xc8, 0xf3, 0x6b, 0x66, 0x0a, 0x05, 0xa7, 0x9b, 0xa0, 0x5b, 0xe3, 0xa4, + 0xf3, 0x20, 0x5c, 0x6e, 0x39, 0x61, 0xe4, 0x36, 0x16, 0x5a, 0x7e, 0x63, 0xa7, 0x1e, 0xf9, 0x81, + 0xcc, 0x2a, 0x9a, 0x79, 0xcb, 0x9b, 0xbf, 0x57, 0x4f, 0xe1, 0x1b, 0xcd, 0xb3, 0xec, 0xb6, 0x59, + 0x58, 0x38, 0xb3, 0x2d, 0xb4, 0x0e, 0xc3, 0x5b, 0x6e, 0x84, 0x49, 0xc7, 0x17, 0x7c, 0x29, 0x93, + 0xe9, 0x5e, 0xe7, 0x28, 0x46, 0x4b, 0x2c, 0xf6, 0x95, 0x00, 0x60, 0x49, 0x04, 0xbd, 0xaf, 0x8e, + 0x9b, 0xa1, 0x7c, 0x55, 0x6f, 0xda, 0xcb, 0x2f, 0xf3, 0xc0, 0x79, 0x17, 0xca, 0xde, 0x66, 0x58, + 0x14, 0xf5, 0x67, 0x7d, 0xc5, 0xd0, 0xd4, 0x2d, 0x0c, 0xd3, 0x4b, 0xf8, 0xfa, 0x4a, 0x1d, 0xd3, + 0x8a, 0xec, 0x81, 0x6d, 0xd8, 0x08, 0x5d, 0x91, 0xbc, 0x2b, 0xf3, 0xbd, 0xf1, 0x6a, 0x7d, 0xb1, + 0xbe, 0x6a, 0xd0, 0x60, 0xf1, 0x13, 0x59, 0x31, 0xe6, 0xd5, 0xd1, 0x5d, 0x18, 0xdd, 0xe2, 0x2c, + 0x76, 0x93, 0x87, 0xb5, 0xcd, 0x39, 0xf6, 0xae, 0x4b, 0x24, 0x83, 0x1e, 0x3b, 0x9c, 0x14, 0x08, + 0xc7, 0xa4, 0xd0, 0x77, 0x2c, 0x38, 0xd5, 0x49, 0xe8, 0x6a, 0xd9, 0xb3, 0x38, 0xe1, 0x10, 0x97, + 0xf9, 0xd4, 0xa0, 0x96, 0x55, 0xc1, 0x68, 0x90, 0x19, 0x7a, 0x32, 0xd1, 0x70, 0x76, 0x73, 0x74, + 0xa0, 0x83, 0xfb, 0xcd, 0xa2, 0x7c, 0x4f, 0x89, 0x10, 0x48, 0x7c, 0xa0, 0xf1, 0xc2, 0x12, 0xa6, + 0x15, 0xd1, 0x06, 0xc0, 0x66, 0x8b, 0x88, 0xd8, 0x92, 0xc2, 0xfd, 0x2a, 0x53, 0xce, 0x58, 0x51, + 0x58, 0x82, 0x0e, 0xbb, 0xf3, 0xc6, 0xa5, 0x58, 0xa3, 0x43, 0x97, 0x52, 0xc3, 0xf5, 0x9a, 0x24, + 0x60, 0x66, 0xb4, 0x9c, 0xa5, 0xb4, 0xc8, 0x30, 0xd2, 0x4b, 0x89, 0x97, 0x63, 0x41, 0x81, 0xd1, + 0x22, 0x9d, 0xed, 0xcd, 0xb0, 0x28, 0xb3, 0xc8, 0x22, 0xe9, 0x6c, 0x27, 0x16, 0x14, 0xa7, 0xc5, + 0xca, 0xb1, 0xa0, 0x40, 0xb7, 0xcc, 0x26, 0xdd, 0x40, 0x24, 0xa8, 0x4c, 0xe5, 0x6f, 0x99, 0x15, + 0x8e, 0x92, 0xde, 0x32, 0x02, 0x80, 0x25, 0x11, 0xf4, 0x0d, 0x53, 0xae, 0x9a, 0x66, 0x34, 0x5f, + 0xee, 0x21, 0x57, 0x19, 0x74, 0x8b, 0x25, 0xab, 0xb7, 0xa0, 0xb4, 0xd9, 0x60, 0xe6, 0xb7, 0x1c, + 0xeb, 0xc4, 0xca, 0xa2, 0x41, 0x8d, 0x45, 0xea, 0x5f, 0x59, 0xc4, 0xa5, 0xcd, 0x06, 0x5d, 0xfa, + 0xce, 0xa3, 0x6e, 0x40, 0x56, 0xdc, 0x16, 0x11, 0xa1, 0x83, 0x33, 0x97, 0xfe, 0xbc, 0x44, 0x4a, + 0x2f, 0x7d, 0x05, 0xc2, 0x31, 0x29, 0x4a, 0x37, 0x96, 0xf6, 0x4e, 0xe4, 0xd3, 0x55, 0x42, 0x5d, + 0x9a, 0x6e, 0xa6, 0xbc, 0xb7, 0x03, 0x13, 0xbb, 0x61, 0x67, 0x9b, 0x48, 0xae, 0xc8, 0x0c, 0x83, + 0x39, 0x31, 0x31, 0xee, 0x0a, 0x44, 0x37, 0x88, 0xba, 0x4e, 0x2b, 0xc5, 0xc8, 0x99, 0x12, 0xe7, + 0xae, 0x4e, 0x0c, 0x9b, 0xb4, 0xe9, 0x42, 0xf8, 0x88, 0x07, 0xae, 0x63, 0x26, 0xc2, 0x9c, 0x85, + 0x90, 0x11, 0xdb, 0x8e, 0x2f, 0x04, 0x01, 0xc0, 0x92, 0x88, 0x1a, 0x6c, 0x76, 0x00, 0x9d, 0xee, + 0x31, 0xd8, 0xa9, 0xfe, 0xc6, 0x83, 0xcd, 0x0e, 0x9c, 0x98, 0x14, 0x3b, 0x68, 0x3a, 0xdb, 0x7e, + 0xe4, 0x7b, 0x89, 0x43, 0xee, 0x4c, 0xfe, 0x41, 0x53, 0xcb, 0xc0, 0x4f, 0x1f, 0x34, 0x59, 0x58, + 0x38, 0xb3, 0x2d, 0xfa, 0x71, 0x1d, 0x19, 0x83, 0x50, 0x64, 0x42, 0x79, 0x29, 0x27, 0x84, 0x67, + 0x3a, 0x50, 0x21, 0xff, 0x38, 0x05, 0xc2, 0x31, 0x29, 0xd4, 0xa4, 0x92, 0xae, 0x1e, 0xdb, 0x96, + 0x65, 0x74, 0xc9, 0x91, 0x0b, 0xb2, 0xa2, 0xe0, 0x4a, 0x29, 0x57, 0x87, 0xe0, 0x04, 0x4d, 0xe6, + 0x23, 0xc8, 0x1f, 0x15, 0xb2, 0x84, 0x2f, 0x39, 0x53, 0x9d, 0xf1, 0xee, 0x90, 0x4f, 0xb5, 0x00, + 0x60, 0x49, 0x84, 0x8e, 0x86, 0x78, 0x0a, 0xe7, 0x87, 0x2c, 0x6f, 0x52, 0x9e, 0x29, 0x3f, 0xcb, + 0x20, 0x25, 0x03, 0xcd, 0x0b, 0x10, 0x8e, 0x49, 0x51, 0x4e, 0x4e, 0x0f, 0xbc, 0x73, 0xf9, 0x9c, + 0x3c, 0x79, 0xdc, 0x31, 0x4e, 0x4e, 0x0f, 0xbb, 0xb2, 0x38, 0xea, 0x54, 0x5c, 0x74, 0x96, 0xf3, + 0x25, 0xa7, 0x5f, 0x2a, 0xb0, 0x7a, 0xba, 0x5f, 0x0a, 0x84, 0x63, 0x52, 0xec, 0x28, 0x66, 0x41, + 0xf0, 0x2e, 0x14, 0x1c, 0xc5, 0x14, 0x21, 0xe3, 0x28, 0xd6, 0x82, 0xe4, 0xd9, 0x7f, 0xb9, 0x04, + 0x17, 0x8a, 0xf7, 0x6d, 0x6c, 0xad, 0xab, 0xc5, 0xde, 0x51, 0x09, 0x6b, 0x1d, 0xd7, 0x1d, 0xc5, + 0x58, 0x7d, 0x87, 0x36, 0xbe, 0x0e, 0x33, 0xea, 0xe1, 0x63, 0xcb, 0x6d, 0xec, 0x69, 0x89, 0x5e, + 0x55, 0x10, 0xa0, 0x7a, 0x12, 0x01, 0xa7, 0xeb, 0xa0, 0x79, 0x98, 0x32, 0x0a, 0x57, 0x97, 0x84, + 0xa2, 0x21, 0xce, 0x56, 0x62, 0x82, 0x71, 0x12, 0xdf, 0xfe, 0x45, 0x0b, 0xce, 0xf0, 0x40, 0xbc, + 0xa4, 0x59, 0xf3, 0x9b, 0x52, 0xa3, 0x70, 0xa4, 0xc8, 0xbd, 0x9b, 0x30, 0xd5, 0x31, 0xab, 0xf6, + 0x08, 0x36, 0xae, 0xa3, 0xc6, 0x7d, 0x4d, 0x00, 0x70, 0x92, 0xa8, 0xfd, 0xf3, 0x25, 0x38, 0x5f, + 0xe8, 0xc9, 0x8f, 0x30, 0x9c, 0xde, 0x6a, 0x87, 0xce, 0x62, 0x40, 0x9a, 0xc4, 0x8b, 0x5c, 0xa7, + 0x55, 0xef, 0x90, 0x86, 0x66, 0x6f, 0x65, 0x2e, 0xf1, 0xd7, 0xd7, 0xea, 0xf3, 0x69, 0x0c, 0x9c, + 0x53, 0x13, 0xad, 0x00, 0x4a, 0x43, 0xc4, 0x0c, 0xb3, 0xcb, 0x74, 0x9a, 0x1e, 0xce, 0xa8, 0x81, + 0xbe, 0x00, 0x13, 0xea, 0x85, 0x80, 0x36, 0xe3, 0xec, 0x80, 0xc0, 0x3a, 0x00, 0x9b, 0x78, 0xe8, + 0x2a, 0x4f, 0x63, 0x25, 0x12, 0x9e, 0x09, 0xe3, 0xec, 0x94, 0xcc, 0x51, 0x25, 0x8a, 0xb1, 0x8e, + 0xb3, 0x70, 0xed, 0x77, 0xfe, 0xf0, 0xc2, 0x67, 0x7e, 0xf7, 0x0f, 0x2f, 0x7c, 0xe6, 0x0f, 0xfe, + 0xf0, 0xc2, 0x67, 0x7e, 0xfc, 0xe0, 0x82, 0xf5, 0x3b, 0x07, 0x17, 0xac, 0xdf, 0x3d, 0xb8, 0x60, + 0xfd, 0xc1, 0xc1, 0x05, 0xeb, 0x7f, 0x3b, 0xb8, 0x60, 0x7d, 0xef, 0x7f, 0xbf, 0xf0, 0x99, 0xaf, + 0xa2, 0x38, 0x16, 0xf6, 0x15, 0x3a, 0x3b, 0x57, 0x76, 0xaf, 0xfe, 0x87, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xba, 0xfb, 0xfc, 0xdd, 0x18, 0x2e, 0x01, 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -9346,6 +9549,22 @@ func (m *Container) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.RestartPolicyRules) > 0 { + for iNdEx := len(m.RestartPolicyRules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RestartPolicyRules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + } if m.RestartPolicy != nil { i -= len(*m.RestartPolicy) copy(dAtA[i:], *m.RestartPolicy) @@ -9600,6 +9819,44 @@ func (m *Container) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ContainerExtendedResourceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerExtendedResourceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerExtendedResourceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.RequestName) + copy(dAtA[i:], m.RequestName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.RequestName))) + i-- + dAtA[i] = 0x1a + i -= len(m.ResourceName) + copy(dAtA[i:], m.ResourceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceName))) + i-- + dAtA[i] = 0x12 + i -= len(m.ContainerName) + copy(dAtA[i:], m.ContainerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContainerName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ContainerImage) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9712,6 +9969,81 @@ func (m *ContainerResizePolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ContainerRestartRule) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerRestartRule) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerRestartRule) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExitCodes != nil { + { + size, err := m.ExitCodes.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ContainerRestartRuleOnExitCodes) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerRestartRuleOnExitCodes) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerRestartRuleOnExitCodes) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Values) > 0 { + for iNdEx := len(m.Values) - 1; iNdEx >= 0; iNdEx-- { + i = encodeVarintGenerated(dAtA, i, uint64(m.Values[iNdEx])) + i-- + dAtA[i] = 0x10 + } + } + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ContainerState) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10681,6 +11013,18 @@ func (m *EnvVarSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.FileKeyRef != nil { + { + size, err := m.FileKeyRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.SecretKeyRef != nil { { size, err := m.SecretKeyRef.MarshalToSizedBuffer(dAtA[:i]) @@ -10790,6 +11134,22 @@ func (m *EphemeralContainerCommon) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if len(m.RestartPolicyRules) > 0 { + for iNdEx := len(m.RestartPolicyRules) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RestartPolicyRules[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + } if m.RestartPolicy != nil { i -= len(*m.RestartPolicy) copy(dAtA[i:], *m.RestartPolicy) @@ -11426,6 +11786,54 @@ func (m *FCVolumeSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *FileKeySelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FileKeySelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *FileKeySelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Optional != nil { + i-- + if *m.Optional { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0x1a + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x12 + i -= len(m.VolumeName) + copy(dAtA[i:], m.VolumeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *FlexPersistentVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -15791,6 +16199,59 @@ func (m *PodAttachOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PodCertificateProjection) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodCertificateProjection) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodCertificateProjection) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.CertificateChainPath) + copy(dAtA[i:], m.CertificateChainPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CertificateChainPath))) + i-- + dAtA[i] = 0x32 + i -= len(m.KeyPath) + copy(dAtA[i:], m.KeyPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.KeyPath))) + i-- + dAtA[i] = 0x2a + i -= len(m.CredentialBundlePath) + copy(dAtA[i:], m.CredentialBundlePath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CredentialBundlePath))) + i-- + dAtA[i] = 0x22 + if m.MaxExpirationSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxExpirationSeconds)) + i-- + dAtA[i] = 0x18 + } + i -= len(m.KeyType) + copy(dAtA[i:], m.KeyType) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.KeyType))) + i-- + dAtA[i] = 0x12 + i -= len(m.SignerName) + copy(dAtA[i:], m.SignerName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.SignerName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *PodCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -16016,6 +16477,48 @@ func (m *PodExecOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PodExtendedResourceClaimStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodExtendedResourceClaimStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PodExtendedResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.ResourceClaimName) + copy(dAtA[i:], m.ResourceClaimName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceClaimName))) + i-- + dAtA[i] = 0x12 + if len(m.RequestMappings) > 0 { + for iNdEx := len(m.RequestMappings) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RequestMappings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *PodIP) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -16597,6 +17100,15 @@ func (m *PodSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.HostnameOverride != nil { + i -= len(*m.HostnameOverride) + copy(dAtA[i:], *m.HostnameOverride) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.HostnameOverride))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xca + } if m.Resources != nil { { size, err := m.Resources.MarshalToSizedBuffer(dAtA[:i]) @@ -17085,6 +17597,20 @@ func (m *PodStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.ExtendedResourceClaimStatus != nil { + { + size, err := m.ExtendedResourceClaimStatus.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } i = encodeVarintGenerated(dAtA, i, uint64(m.ObservedGeneration)) i-- dAtA[i] = 0x1 @@ -21108,6 +21634,18 @@ func (m *VolumeProjection) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PodCertificate != nil { + { + size, err := m.PodCertificate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.ClusterTrustBundle != nil { { size, err := m.ClusterTrustBundle.MarshalToSizedBuffer(dAtA[:i]) @@ -22471,6 +23009,27 @@ func (m *Container) Size() (n int) { l = len(*m.RestartPolicy) n += 2 + l + sovGenerated(uint64(l)) } + if len(m.RestartPolicyRules) > 0 { + for _, e := range m.RestartPolicyRules { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ContainerExtendedResourceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ContainerName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ResourceName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.RequestName) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -22520,6 +23079,37 @@ func (m *ContainerResizePolicy) Size() (n int) { return n } +func (m *ContainerRestartRule) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + n += 1 + l + sovGenerated(uint64(l)) + if m.ExitCodes != nil { + l = m.ExitCodes.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *ContainerRestartRuleOnExitCodes) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Values) > 0 { + for _, e := range m.Values { + n += 1 + sovGenerated(uint64(e)) + } + } + return n +} + func (m *ContainerState) Size() (n int) { if m == nil { return 0 @@ -22896,6 +23486,10 @@ func (m *EnvVarSource) Size() (n int) { l = m.SecretKeyRef.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.FileKeyRef != nil { + l = m.FileKeyRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -23007,6 +23601,12 @@ func (m *EphemeralContainerCommon) Size() (n int) { l = len(*m.RestartPolicy) n += 2 + l + sovGenerated(uint64(l)) } + if len(m.RestartPolicyRules) > 0 { + for _, e := range m.RestartPolicyRules { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -23149,6 +23749,24 @@ func (m *FCVolumeSource) Size() (n int) { return n } +func (m *FileKeySelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.VolumeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Path) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + if m.Optional != nil { + n += 2 + } + return n +} + func (m *FlexPersistentVolumeSource) Size() (n int) { if m == nil { return 0 @@ -24752,6 +25370,28 @@ func (m *PodAttachOptions) Size() (n int) { return n } +func (m *PodCertificateProjection) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SignerName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.KeyType) + n += 1 + l + sovGenerated(uint64(l)) + if m.MaxExpirationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.MaxExpirationSeconds)) + } + l = len(m.CredentialBundlePath) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.KeyPath) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.CertificateChainPath) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PodCondition) Size() (n int) { if m == nil { return 0 @@ -24837,6 +25477,23 @@ func (m *PodExecOptions) Size() (n int) { return n } +func (m *PodExtendedResourceClaimStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.RequestMappings) > 0 { + for _, e := range m.RequestMappings { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.ResourceClaimName) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PodIP) Size() (n int) { if m == nil { return 0 @@ -25224,6 +25881,10 @@ func (m *PodSpec) Size() (n int) { l = m.Resources.Size() n += 2 + l + sovGenerated(uint64(l)) } + if m.HostnameOverride != nil { + l = len(*m.HostnameOverride) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -25296,6 +25957,10 @@ func (m *PodStatus) Size() (n int) { } } n += 2 + sovGenerated(uint64(m.ObservedGeneration)) + if m.ExtendedResourceClaimStatus != nil { + l = m.ExtendedResourceClaimStatus.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -26751,6 +27416,10 @@ func (m *VolumeProjection) Size() (n int) { l = m.ClusterTrustBundle.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.PodCertificate != nil { + l = m.PodCertificate.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -27426,6 +28095,11 @@ func (this *Container) String() string { repeatedStringForResizePolicy += strings.Replace(strings.Replace(f.String(), "ContainerResizePolicy", "ContainerResizePolicy", 1), `&`, ``, 1) + "," } repeatedStringForResizePolicy += "}" + repeatedStringForRestartPolicyRules := "[]ContainerRestartRule{" + for _, f := range this.RestartPolicyRules { + repeatedStringForRestartPolicyRules += strings.Replace(strings.Replace(f.String(), "ContainerRestartRule", "ContainerRestartRule", 1), `&`, ``, 1) + "," + } + repeatedStringForRestartPolicyRules += "}" s := strings.Join([]string{`&Container{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Image:` + fmt.Sprintf("%v", this.Image) + `,`, @@ -27451,6 +28125,19 @@ func (this *Container) String() string { `StartupProbe:` + strings.Replace(this.StartupProbe.String(), "Probe", "Probe", 1) + `,`, `ResizePolicy:` + repeatedStringForResizePolicy + `,`, `RestartPolicy:` + valueToStringGenerated(this.RestartPolicy) + `,`, + `RestartPolicyRules:` + repeatedStringForRestartPolicyRules + `,`, + `}`, + }, "") + return s +} +func (this *ContainerExtendedResourceRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerExtendedResourceRequest{`, + `ContainerName:` + fmt.Sprintf("%v", this.ContainerName) + `,`, + `ResourceName:` + fmt.Sprintf("%v", this.ResourceName) + `,`, + `RequestName:` + fmt.Sprintf("%v", this.RequestName) + `,`, `}`, }, "") return s @@ -27491,6 +28178,28 @@ func (this *ContainerResizePolicy) String() string { }, "") return s } +func (this *ContainerRestartRule) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerRestartRule{`, + `Action:` + fmt.Sprintf("%v", this.Action) + `,`, + `ExitCodes:` + strings.Replace(this.ExitCodes.String(), "ContainerRestartRuleOnExitCodes", "ContainerRestartRuleOnExitCodes", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerRestartRuleOnExitCodes) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerRestartRuleOnExitCodes{`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Values:` + fmt.Sprintf("%v", this.Values) + `,`, + `}`, + }, "") + return s +} func (this *ContainerState) String() string { if this == nil { return "nil" @@ -27777,6 +28486,7 @@ func (this *EnvVarSource) String() string { `ResourceFieldRef:` + strings.Replace(this.ResourceFieldRef.String(), "ResourceFieldSelector", "ResourceFieldSelector", 1) + `,`, `ConfigMapKeyRef:` + strings.Replace(this.ConfigMapKeyRef.String(), "ConfigMapKeySelector", "ConfigMapKeySelector", 1) + `,`, `SecretKeyRef:` + strings.Replace(this.SecretKeyRef.String(), "SecretKeySelector", "SecretKeySelector", 1) + `,`, + `FileKeyRef:` + strings.Replace(this.FileKeyRef.String(), "FileKeySelector", "FileKeySelector", 1) + `,`, `}`, }, "") return s @@ -27826,6 +28536,11 @@ func (this *EphemeralContainerCommon) String() string { repeatedStringForResizePolicy += strings.Replace(strings.Replace(f.String(), "ContainerResizePolicy", "ContainerResizePolicy", 1), `&`, ``, 1) + "," } repeatedStringForResizePolicy += "}" + repeatedStringForRestartPolicyRules := "[]ContainerRestartRule{" + for _, f := range this.RestartPolicyRules { + repeatedStringForRestartPolicyRules += strings.Replace(strings.Replace(f.String(), "ContainerRestartRule", "ContainerRestartRule", 1), `&`, ``, 1) + "," + } + repeatedStringForRestartPolicyRules += "}" s := strings.Join([]string{`&EphemeralContainerCommon{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Image:` + fmt.Sprintf("%v", this.Image) + `,`, @@ -27851,6 +28566,7 @@ func (this *EphemeralContainerCommon) String() string { `StartupProbe:` + strings.Replace(this.StartupProbe.String(), "Probe", "Probe", 1) + `,`, `ResizePolicy:` + repeatedStringForResizePolicy + `,`, `RestartPolicy:` + valueToStringGenerated(this.RestartPolicy) + `,`, + `RestartPolicyRules:` + repeatedStringForRestartPolicyRules + `,`, `}`, }, "") return s @@ -27951,6 +28667,19 @@ func (this *FCVolumeSource) String() string { }, "") return s } +func (this *FileKeySelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FileKeySelector{`, + `VolumeName:` + fmt.Sprintf("%v", this.VolumeName) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Optional:` + valueToStringGenerated(this.Optional) + `,`, + `}`, + }, "") + return s +} func (this *FlexPersistentVolumeSource) String() string { if this == nil { return "nil" @@ -29169,6 +29898,21 @@ func (this *PodAttachOptions) String() string { }, "") return s } +func (this *PodCertificateProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodCertificateProjection{`, + `SignerName:` + fmt.Sprintf("%v", this.SignerName) + `,`, + `KeyType:` + fmt.Sprintf("%v", this.KeyType) + `,`, + `MaxExpirationSeconds:` + valueToStringGenerated(this.MaxExpirationSeconds) + `,`, + `CredentialBundlePath:` + fmt.Sprintf("%v", this.CredentialBundlePath) + `,`, + `KeyPath:` + fmt.Sprintf("%v", this.KeyPath) + `,`, + `CertificateChainPath:` + fmt.Sprintf("%v", this.CertificateChainPath) + `,`, + `}`, + }, "") + return s +} func (this *PodCondition) String() string { if this == nil { return "nil" @@ -29228,6 +29972,22 @@ func (this *PodExecOptions) String() string { }, "") return s } +func (this *PodExtendedResourceClaimStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForRequestMappings := "[]ContainerExtendedResourceRequest{" + for _, f := range this.RequestMappings { + repeatedStringForRequestMappings += strings.Replace(strings.Replace(f.String(), "ContainerExtendedResourceRequest", "ContainerExtendedResourceRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForRequestMappings += "}" + s := strings.Join([]string{`&PodExtendedResourceClaimStatus{`, + `RequestMappings:` + repeatedStringForRequestMappings + `,`, + `ResourceClaimName:` + fmt.Sprintf("%v", this.ResourceClaimName) + `,`, + `}`, + }, "") + return s +} func (this *PodIP) String() string { if this == nil { return "nil" @@ -29503,6 +30263,7 @@ func (this *PodSpec) String() string { `SchedulingGates:` + repeatedStringForSchedulingGates + `,`, `ResourceClaims:` + repeatedStringForResourceClaims + `,`, `Resources:` + strings.Replace(this.Resources.String(), "ResourceRequirements", "ResourceRequirements", 1) + `,`, + `HostnameOverride:` + valueToStringGenerated(this.HostnameOverride) + `,`, `}`, }, "") return s @@ -29564,6 +30325,7 @@ func (this *PodStatus) String() string { `ResourceClaimStatuses:` + repeatedStringForResourceClaimStatuses + `,`, `HostIPs:` + repeatedStringForHostIPs + `,`, `ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`, + `ExtendedResourceClaimStatus:` + strings.Replace(this.ExtendedResourceClaimStatus.String(), "PodExtendedResourceClaimStatus", "PodExtendedResourceClaimStatus", 1) + `,`, `}`, }, "") return s @@ -30673,6 +31435,7 @@ func (this *VolumeProjection) String() string { `ConfigMap:` + strings.Replace(this.ConfigMap.String(), "ConfigMapProjection", "ConfigMapProjection", 1) + `,`, `ServiceAccountToken:` + strings.Replace(this.ServiceAccountToken.String(), "ServiceAccountTokenProjection", "ServiceAccountTokenProjection", 1) + `,`, `ClusterTrustBundle:` + strings.Replace(this.ClusterTrustBundle.String(), "ClusterTrustBundleProjection", "ClusterTrustBundleProjection", 1) + `,`, + `PodCertificate:` + strings.Replace(this.PodCertificate.String(), "PodCertificateProjection", "PodCertificateProjection", 1) + `,`, `}`, }, "") return s @@ -36465,61 +37228,11 @@ func (m *Container) Unmarshal(dAtA []byte) error { s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) m.RestartPolicy = &s iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ContainerImage) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ContainerImage: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerImage: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Names", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicyRules", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36529,43 +37242,26 @@ func (m *ContainerImage) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Names = append(m.Names, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SizeBytes", wireType) - } - m.SizeBytes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SizeBytes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + m.RestartPolicyRules = append(m.RestartPolicyRules, ContainerRestartRule{}) + if err := m.RestartPolicyRules[len(m.RestartPolicyRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -36587,7 +37283,7 @@ func (m *ContainerImage) Unmarshal(dAtA []byte) error { } return nil } -func (m *ContainerPort) Unmarshal(dAtA []byte) error { +func (m *ContainerExtendedResourceRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36610,15 +37306,15 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ContainerPort: wiretype end group for non-group") + return fmt.Errorf("proto: ContainerExtendedResourceRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerPort: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContainerExtendedResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContainerName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36646,49 +37342,11 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.ContainerName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostPort", wireType) - } - m.HostPort = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HostPort |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ContainerPort", wireType) - } - m.ContainerPort = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ContainerPort |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36716,11 +37374,11 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Protocol = Protocol(dAtA[iNdEx:postIndex]) + m.ResourceName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HostIP", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RequestName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36748,7 +37406,7 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.HostIP = string(dAtA[iNdEx:postIndex]) + m.RequestName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -36771,7 +37429,7 @@ func (m *ContainerPort) Unmarshal(dAtA []byte) error { } return nil } -func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { +func (m *ContainerImage) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -36794,15 +37452,15 @@ func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ContainerResizePolicy: wiretype end group for non-group") + return fmt.Errorf("proto: ContainerImage: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerResizePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContainerImage: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Names", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -36830,13 +37488,13 @@ func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceName = ResourceName(dAtA[iNdEx:postIndex]) + m.Names = append(m.Names, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SizeBytes", wireType) } - var stringLen uint64 + m.SizeBytes = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -36846,24 +37504,585 @@ func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.SizeBytes |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RestartPolicy = ResourceResizeRestartPolicy(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerPort) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerPort: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerPort: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostPort", wireType) + } + m.HostPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HostPort |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerPort", wireType) + } + m.ContainerPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContainerPort |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Protocol = Protocol(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostIP", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HostIP = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerResizePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerResizePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerResizePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceName = ResourceName(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RestartPolicy = ResourceResizeRestartPolicy(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerRestartRule) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerRestartRule: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerRestartRule: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = ContainerRestartRuleAction(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitCodes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExitCodes == nil { + m.ExitCodes = &ContainerRestartRuleOnExitCodes{} + } + if err := m.ExitCodes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerRestartRuleOnExitCodes) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerRestartRuleOnExitCodes: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerRestartRuleOnExitCodes: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operator = ContainerRestartRuleOnExitCodesOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Values = append(m.Values, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Values) == 0 { + m.Values = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Values = append(m.Values, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -38790,13 +40009,196 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.IP = string(dAtA[iNdEx:postIndex]) + m.IP = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TargetRef == nil { + m.TargetRef = &ObjectReference{} + } + if err := m.TargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EndpointPort) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EndpointPort: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EndpointPort: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TargetRef", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) } - var msglen int + m.Port = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -38806,31 +40208,14 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.Port |= int32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TargetRef == nil { - m.TargetRef = &ObjectReference{} - } - if err := m.TargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -38858,11 +40243,11 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Hostname = string(dAtA[iNdEx:postIndex]) + m.Protocol = Protocol(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppProtocol", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -38891,7 +40276,7 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.NodeName = &s + m.AppProtocol = &s iNdEx = postIndex default: iNdEx = preIndex @@ -38914,7 +40299,7 @@ func (m *EndpointAddress) Unmarshal(dAtA []byte) error { } return nil } -func (m *EndpointPort) Unmarshal(dAtA []byte) error { +func (m *EndpointSubset) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -38937,17 +40322,17 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EndpointPort: wiretype end group for non-group") + return fmt.Errorf("proto: EndpointSubset: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointPort: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EndpointSubset: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -38957,48 +40342,31 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Addresses = append(m.Addresses, EndpointAddress{}) + if err := m.Addresses[len(m.Addresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) - } - m.Port = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Port |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NotReadyAddresses", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -39008,29 +40376,31 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Protocol = Protocol(dAtA[iNdEx:postIndex]) + m.NotReadyAddresses = append(m.NotReadyAddresses, EndpointAddress{}) + if err := m.NotReadyAddresses[len(m.NotReadyAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppProtocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -39040,24 +40410,25 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.AppProtocol = &s + m.Ports = append(m.Ports, EndpointPort{}) + if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -39080,7 +40451,7 @@ func (m *EndpointPort) Unmarshal(dAtA []byte) error { } return nil } -func (m *EndpointSubset) Unmarshal(dAtA []byte) error { +func (m *Endpoints) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39103,15 +40474,15 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EndpointSubset: wiretype end group for non-group") + return fmt.Errorf("proto: Endpoints: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointSubset: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Endpoints: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Addresses", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39138,48 +40509,13 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Addresses = append(m.Addresses, EndpointAddress{}) - if err := m.Addresses[len(m.Addresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NotReadyAddresses", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NotReadyAddresses = append(m.NotReadyAddresses, EndpointAddress{}) - if err := m.NotReadyAddresses[len(m.NotReadyAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Subsets", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39206,8 +40542,8 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Ports = append(m.Ports, EndpointPort{}) - if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Subsets = append(m.Subsets, EndpointSubset{}) + if err := m.Subsets[len(m.Subsets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39232,7 +40568,7 @@ func (m *EndpointSubset) Unmarshal(dAtA []byte) error { } return nil } -func (m *Endpoints) Unmarshal(dAtA []byte) error { +func (m *EndpointsList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39255,15 +40591,15 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Endpoints: wiretype end group for non-group") + return fmt.Errorf("proto: EndpointsList: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Endpoints: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EndpointsList: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39290,13 +40626,13 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Subsets", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39323,8 +40659,8 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Subsets = append(m.Subsets, EndpointSubset{}) - if err := m.Subsets[len(m.Subsets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Items = append(m.Items, Endpoints{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39349,7 +40685,7 @@ func (m *Endpoints) Unmarshal(dAtA []byte) error { } return nil } -func (m *EndpointsList) Unmarshal(dAtA []byte) error { +func (m *EnvFromSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39372,15 +40708,47 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EndpointsList: wiretype end group for non-group") + return fmt.Errorf("proto: EnvFromSource: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EndpointsList: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvFromSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Prefix = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39407,13 +40775,16 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.ConfigMapRef == nil { + m.ConfigMapRef = &ConfigMapEnvSource{} + } + if err := m.ConfigMapRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39440,8 +40811,10 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Items = append(m.Items, Endpoints{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.SecretRef == nil { + m.SecretRef = &SecretEnvSource{} + } + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39466,7 +40839,7 @@ func (m *EndpointsList) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvFromSource) Unmarshal(dAtA []byte) error { +func (m *EnvVar) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39489,15 +40862,15 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvFromSource: wiretype end group for non-group") + return fmt.Errorf("proto: EnvVar: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvFromSource: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvVar: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -39525,13 +40898,13 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Prefix = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -39541,31 +40914,27 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConfigMapRef == nil { - m.ConfigMapRef = &ConfigMapEnvSource{} - } - if err := m.ConfigMapRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValueFrom", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39592,10 +40961,10 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SecretRef == nil { - m.SecretRef = &SecretEnvSource{} + if m.ValueFrom == nil { + m.ValueFrom = &EnvVarSource{} } - if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ValueFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -39620,7 +40989,7 @@ func (m *EnvFromSource) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvVar) Unmarshal(dAtA []byte) error { +func (m *EnvVarSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -39643,79 +41012,15 @@ func (m *EnvVar) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvVar: wiretype end group for non-group") + return fmt.Errorf("proto: EnvVarSource: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvVar: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvVarSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValueFrom", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39742,66 +41047,16 @@ func (m *EnvVar) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ValueFrom == nil { - m.ValueFrom = &EnvVarSource{} + if m.FieldRef == nil { + m.FieldRef = &ObjectFieldSelector{} } - if err := m.ValueFrom.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.FieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvVarSource) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EnvVarSource: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvVarSource: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FieldRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceFieldRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39828,16 +41083,16 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.FieldRef == nil { - m.FieldRef = &ObjectFieldSelector{} + if m.ResourceFieldRef == nil { + m.ResourceFieldRef = &ResourceFieldSelector{} } - if err := m.FieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceFieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceFieldRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapKeyRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39864,16 +41119,16 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ResourceFieldRef == nil { - m.ResourceFieldRef = &ResourceFieldSelector{} + if m.ConfigMapKeyRef == nil { + m.ConfigMapKeyRef = &ConfigMapKeySelector{} } - if err := m.ResourceFieldRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConfigMapKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapKeyRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SecretKeyRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39900,16 +41155,16 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConfigMapKeyRef == nil { - m.ConfigMapKeyRef = &ConfigMapKeySelector{} + if m.SecretKeyRef == nil { + m.SecretKeyRef = &SecretKeySelector{} } - if err := m.ConfigMapKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SecretKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretKeyRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FileKeyRef", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -39936,10 +41191,10 @@ func (m *EnvVarSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SecretKeyRef == nil { - m.SecretKeyRef = &SecretKeySelector{} + if m.FileKeyRef == nil { + m.FileKeyRef = &FileKeySelector{} } - if err := m.SecretKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.FileKeyRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -40700,46 +41955,116 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EnvFrom = append(m.EnvFrom, EnvFromSource{}) - if err := m.EnvFrom[len(m.EnvFrom)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 20: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TerminationMessagePolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated + m.EnvFrom = append(m.EnvFrom, EnvFromSource{}) + if err := m.EnvFrom[len(m.EnvFrom)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TerminationMessagePolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TerminationMessagePolicy = TerminationMessagePolicy(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeDevices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeDevices = append(m.VolumeDevices, VolumeDevice{}) + if err := m.VolumeDevices[len(m.VolumeDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartupProbe", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StartupProbe == nil { + m.StartupProbe = &Probe{} } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.StartupProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.TerminationMessagePolicy = TerminationMessagePolicy(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 21: + case 23: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VolumeDevices", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResizePolicy", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -40766,16 +42091,16 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeDevices = append(m.VolumeDevices, VolumeDevice{}) - if err := m.VolumeDevices[len(m.VolumeDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.ResizePolicy = append(m.ResizePolicy, ContainerResizePolicy{}) + if err := m.ResizePolicy[len(m.ResizePolicy)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 22: + case 24: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartupProbe", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40785,31 +42110,28 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.StartupProbe == nil { - m.StartupProbe = &Probe{} - } - if err := m.StartupProbe.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) + m.RestartPolicy = &s iNdEx = postIndex - case 23: + case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResizePolicy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicyRules", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -40836,44 +42158,11 @@ func (m *EphemeralContainerCommon) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResizePolicy = append(m.ResizePolicy, ContainerResizePolicy{}) - if err := m.ResizePolicy[len(m.ResizePolicy)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.RestartPolicyRules = append(m.RestartPolicyRules, ContainerRestartRule{}) + if err := m.RestartPolicyRules[len(m.RestartPolicyRules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 24: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RestartPolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := ContainerRestartPolicy(dAtA[iNdEx:postIndex]) - m.RestartPolicy = &s - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -42113,6 +43402,173 @@ func (m *FCVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *FileKeySelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FileKeySelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileKeySelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Optional", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Optional = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *FlexPersistentVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -55916,17 +57372,297 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PodAntiAffinity: wiretype end group for non-group") + return fmt.Errorf("proto: PodAntiAffinity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodAntiAffinity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequiredDuringSchedulingIgnoredDuringExecution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequiredDuringSchedulingIgnoredDuringExecution = append(m.RequiredDuringSchedulingIgnoredDuringExecution, PodAffinityTerm{}) + if err := m.RequiredDuringSchedulingIgnoredDuringExecution[len(m.RequiredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreferredDuringSchedulingIgnoredDuringExecution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PreferredDuringSchedulingIgnoredDuringExecution = append(m.PreferredDuringSchedulingIgnoredDuringExecution, WeightedPodAffinityTerm{}) + if err := m.PreferredDuringSchedulingIgnoredDuringExecution[len(m.PreferredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodAttachOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodAttachOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdin = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdout = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stderr = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TTY = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Container = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodCertificateProjection) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodCertificateProjection: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PodAntiAffinity: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PodCertificateProjection: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RequiredDuringSchedulingIgnoredDuringExecution", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SignerName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -55936,31 +57672,29 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.RequiredDuringSchedulingIgnoredDuringExecution = append(m.RequiredDuringSchedulingIgnoredDuringExecution, PodAffinityTerm{}) - if err := m.RequiredDuringSchedulingIgnoredDuringExecution[len(m.RequiredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.SignerName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PreferredDuringSchedulingIgnoredDuringExecution", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeyType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -55970,81 +57704,29 @@ func (m *PodAntiAffinity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.PreferredDuringSchedulingIgnoredDuringExecution = append(m.PreferredDuringSchedulingIgnoredDuringExecution, WeightedPodAffinityTerm{}) - if err := m.PreferredDuringSchedulingIgnoredDuringExecution[len(m.PreferredDuringSchedulingIgnoredDuringExecution)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.KeyType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PodAttachOptions: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PodAttachOptions: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MaxExpirationSeconds", wireType) } - var v int + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56054,17 +57736,17 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + v |= int32(b&0x7F) << shift if b < 0x80 { break } } - m.Stdin = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) + m.MaxExpirationSeconds = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CredentialBundlePath", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56074,37 +57756,29 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.Stdout = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated } - m.Stderr = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) + if postIndex > l { + return io.ErrUnexpectedEOF } - var v int + m.CredentialBundlePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KeyPath", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56114,15 +57788,27 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.TTY = bool(v != 0) - case 5: + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KeyPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CertificateChainPath", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56150,7 +57836,7 @@ func (m *PodAttachOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Container = string(dAtA[iNdEx:postIndex]) + m.CertificateChainPath = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -56607,15 +58293,210 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PodDNSConfigOption: wiretype end group for non-group") + return fmt.Errorf("proto: PodDNSConfigOption: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodDNSConfigOption: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodExecOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodExecOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PodDNSConfigOption: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PodExecOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdin = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stdout = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Stderr = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TTY = bool(v != 0) + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56643,11 +58524,11 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Container = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56675,8 +58556,7 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.Value = &s + m.Command = append(m.Command, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -56699,7 +58579,7 @@ func (m *PodDNSConfigOption) Unmarshal(dAtA []byte) error { } return nil } -func (m *PodExecOptions) Unmarshal(dAtA []byte) error { +func (m *PodExtendedResourceClaimStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -56722,97 +58602,17 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PodExecOptions: wiretype end group for non-group") + return fmt.Errorf("proto: PodExtendedResourceClaimStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PodExecOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PodExtendedResourceClaimStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdin", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Stdin = bool(v != 0) - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stdout", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Stdout = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Stderr", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Stderr = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TTY", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.TTY = bool(v != 0) - case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RequestMappings", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -56822,27 +58622,29 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - m.Container = string(dAtA[iNdEx:postIndex]) + m.RequestMappings = append(m.RequestMappings, ContainerExtendedResourceRequest{}) + if err := m.RequestMappings[len(m.RequestMappings)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceClaimName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -56870,7 +58672,7 @@ func (m *PodExecOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Command = append(m.Command, string(dAtA[iNdEx:postIndex])) + m.ResourceClaimName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -60088,6 +61890,39 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 41: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostnameOverride", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.HostnameOverride = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -60687,6 +62522,42 @@ func (m *PodStatus) Unmarshal(dAtA []byte) error { break } } + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtendedResourceClaimStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExtendedResourceClaimStatus == nil { + m.ExtendedResourceClaimStatus = &PodExtendedResourceClaimStatus{} + } + if err := m.ExtendedResourceClaimStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -73489,6 +75360,42 @@ func (m *VolumeProjection) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PodCertificate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PodCertificate == nil { + m.PodCertificate = &PodCertificateProjection{} + } + if err := m.PodCertificate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 9b48fb1c39..fb26953147 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -737,8 +737,8 @@ message Container { repeated ContainerPort ports = 6; // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -768,10 +768,10 @@ message Container { repeated ContainerResizePolicy resizePolicy = 23; // RestartPolicy defines the restart behavior of individual containers in a pod. - // This field may only be set for init containers, and the only allowed value is "Always". - // For non-init containers or when this field is not specified, + // This overrides the pod-level restart policy. When this field is not specified, // the restart behavior is defined by the Pod's restart policy and the container type. - // Setting the RestartPolicy as "Always" for the init container will have the following effect: + // Additionally, setting the RestartPolicy as "Always" for the init container will + // have the following effect: // this init container will be continually restarted on // exit until all regular containers have terminated. Once all regular // containers have completed, all init containers with restartPolicy "Always" @@ -786,6 +786,22 @@ message Container { // +optional optional string restartPolicy = 24; + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. The rules are evaluated in + // order. Once a rule matches a container exit condition, the remaining + // rules are ignored. If no rule matches the container exit condition, + // the Container-level restart policy determines the whether the container + // is restarted or not. Constraints on the rules: + // - At most 20 rules are allowed. + // - Rules can have the same action. + // - Identical rules are not forbidden in validations. + // When rules are specified, container MUST set RestartPolicy explicitly + // even it if matches the Pod's RestartPolicy. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + repeated ContainerRestartRule restartPolicyRules = 25; + // Pod volumes to mount into the container's filesystem. // Cannot be updated. // +optional @@ -888,6 +904,19 @@ message Container { optional bool tty = 18; } +// ContainerExtendedResourceRequest has the mapping of container name, +// extended resource name to the device request name. +message ContainerExtendedResourceRequest { + // The name of the container requesting resources. + optional string containerName = 1; + + // The name of the extended resource in that container which gets backed by DRA. + optional string resourceName = 2; + + // The name of the request in the special ResourceClaim which corresponds to the extended resource. + optional string requestName = 3; +} + // Describe a container image message ContainerImage { // Names by which this image is known. @@ -942,6 +971,39 @@ message ContainerResizePolicy { optional string restartPolicy = 2; } +// ContainerRestartRule describes how a container exit is handled. +message ContainerRestartRule { + // Specifies the action taken on a container exit if the requirements + // are satisfied. The only possible value is "Restart" to restart the + // container. + // +required + optional string action = 1; + + // Represents the exit codes to check on container exits. + // +optional + // +oneOf=when + optional ContainerRestartRuleOnExitCodes exitCodes = 2; +} + +// ContainerRestartRuleOnExitCodes describes the condition +// for handling an exited container based on its exit codes. +message ContainerRestartRuleOnExitCodes { + // Represents the relationship between the container exit code(s) and the + // specified values. Possible values are: + // - In: the requirement is satisfied if the container exit code is in the + // set of specified values. + // - NotIn: the requirement is satisfied if the container exit code is + // not in the set of specified values. + // +required + optional string operator = 1; + + // Specifies the set of values to check for container exit codes. + // At most 255 elements are allowed. + // +optional + // +listType=set + repeated int32 values = 2; +} + // ContainerState holds a possible state of container. // Only one of its members may be specified. // If none of them is specified, the default one is ContainerStateWaiting. @@ -1344,7 +1406,8 @@ message EndpointsList { // EnvFromSource represents the source of a set of ConfigMaps or Secrets message EnvFromSource { - // Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + // Optional text to prepend to the name of each environment variable. + // May consist of any printable ASCII characters except '='. // +optional optional string prefix = 1; @@ -1359,7 +1422,8 @@ message EnvFromSource { // EnvVar represents an environment variable present in a Container. message EnvVar { - // Name of the environment variable. Must be a C_IDENTIFIER. + // Name of the environment variable. + // May consist of any printable ASCII characters except '='. optional string name = 1; // Variable references $(VAR_NAME) are expanded @@ -1398,6 +1462,13 @@ message EnvVarSource { // Selects a key of a secret in the pod's namespace // +optional optional SecretKeySelector secretKeyRef = 4; + + // FileKeyRef selects a key of the env file. + // Requires the EnvFiles feature gate to be enabled. + // + // +featureGate=EnvFiles + // +optional + optional FileKeySelector fileKeyRef = 5; } // An EphemeralContainer is a temporary container that you may add to an existing Pod for @@ -1479,8 +1550,8 @@ message EphemeralContainerCommon { repeated ContainerPort ports = 6; // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -1510,12 +1581,19 @@ message EphemeralContainerCommon { // Restart policy for the container to manage the restart behavior of each // container within a pod. - // This may only be set for init containers. You cannot set this field on - // ephemeral containers. + // You cannot set this field on ephemeral containers. // +featureGate=SidecarContainers // +optional optional string restartPolicy = 24; + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. You cannot set this field on + // ephemeral containers. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + repeated ContainerRestartRule restartPolicyRules = 25; + // Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. // Cannot be updated. // +optional @@ -1776,6 +1854,36 @@ message FCVolumeSource { repeated string wwids = 5; } +// FileKeySelector selects a key of the env file. +// +structType=atomic +message FileKeySelector { + // The name of the volume mount containing the env file. + // +required + optional string volumeName = 1; + + // The path within the volume from which to select the file. + // Must be relative and may not contain the '..' path or start with '..'. + // +required + optional string path = 2; + + // The key within the env file. An invalid key will prevent the pod from starting. + // The keys defined within a source may consist of any printable ASCII characters except '='. + // During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + // +required + optional string key = 3; + + // Specify whether the file or its key must be defined. If the file or key + // does not exist, then the env var is not published. + // If optional is set to true and the specified key does not exist, + // the environment variable will not be set in the Pod's containers. + // + // If optional is set to false and the specified key does not exist, + // an error will be returned during Pod creation. + // +optional + // +default=false + optional bool optional = 4; +} + // FlexPersistentVolumeSource represents a generic persistent volume resource that is // provisioned/attached using an exec based plugin. message FlexPersistentVolumeSource { @@ -1949,7 +2057,6 @@ message GlusterfsPersistentVolumeSource { // Glusterfs volumes do not support ownership management or SELinux relabeling. message GlusterfsVolumeSource { // endpoints is the endpoint name that details Glusterfs topology. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod optional string endpoints = 1; // path is the Glusterfs volume path. @@ -3160,15 +3267,13 @@ message PersistentVolumeClaimSpec { // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. // If specified, the CSI driver will create or update the volume with the attributes defined // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - // will be set by the persistentvolume controller if it exists. + // it can be changed after the claim is created. An empty string or nil value indicates that no + // VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + // this field can be reset to its previous value (including nil) to cancel the modification. // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource // exists. // More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - // (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). // +featureGate=VolumeAttributesClass // +optional optional string volumeAttributesClassName = 9; @@ -3267,14 +3372,12 @@ message PersistentVolumeClaimStatus { // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional optional string currentVolumeAttributesClassName = 8; // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. // When this is unset, there is no ModifyVolume operation being attempted. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional optional ModifyVolumeStatus modifyVolumeStatus = 9; @@ -3515,7 +3618,6 @@ message PersistentVolumeSpec { // after a volume has been updated successfully to a new class. // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound // PersistentVolumeClaims during the binding process. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional optional string volumeAttributesClassName = 10; @@ -3684,8 +3786,8 @@ message PodAntiAffinity { // most preferred is the one with the greatest sum of weights, i.e. // for each node that meets all of the scheduling requirements (resource // request, requiredDuringScheduling anti-affinity expressions, etc.), - // compute a sum by iterating through the elements of this field and adding - // "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + // compute a sum by iterating through the elements of this field and subtracting + // "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the // node(s) with the highest sum are the most preferred. // +optional // +listType=atomic @@ -3725,6 +3827,79 @@ message PodAttachOptions { optional string container = 5; } +// PodCertificateProjection provides a private key and X.509 certificate in the +// pod filesystem. +message PodCertificateProjection { + // Kubelet's generated CSRs will be addressed to this signer. + // + // +required + optional string signerName = 1; + + // The type of keypair Kubelet will generate for the pod. + // + // Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + // "ECDSAP521", and "ED25519". + // + // +required + optional string keyType = 2; + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // Kubelet copies this value verbatim into the PodCertificateRequests it + // generates for this projection. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + optional int32 maxExpirationSeconds = 3; + + // Write the credential bundle at this path in the projected volume. + // + // The credential bundle is a single file that contains multiple PEM blocks. + // The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + // key. + // + // The remaining blocks are CERTIFICATE blocks, containing the issued + // certificate chain from the signer (leaf and any intermediates). + // + // Using credentialBundlePath lets your Pod's application code make a single + // atomic read that retrieves a consistent key and certificate chain. If you + // project them to separate files, your application code will need to + // additionally check that the leaf certificate was issued to the key. + // + // +optional + optional string credentialBundlePath = 4; + + // Write the key at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + optional string keyPath = 5; + + // Write the certificate chain at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + optional string certificateChainPath = 6; +} + // PodCondition contains details for the current condition of this pod. message PodCondition { // Type is the type of the condition. @@ -3829,6 +4004,20 @@ message PodExecOptions { repeated string command = 6; } +// PodExtendedResourceClaimStatus is stored in the PodStatus for the extended +// resource requests backed by DRA. It stores the generated name for +// the corresponding special ResourceClaim created by the scheduler. +message PodExtendedResourceClaimStatus { + // RequestMappings identifies the mapping of to device request + // in the generated ResourceClaim. + // +listType=atomic + repeated ContainerExtendedResourceRequest requestMappings = 1; + + // ResourceClaimName is the name of the ResourceClaim that was + // generated for the Pod in the namespace of the Pod. + optional string resourceClaimName = 2; +} + // PodIP represents a single IP address allocated to the pod. message PodIP { // IP is the IP address assigned to the pod @@ -4269,7 +4458,9 @@ message PodSpec { optional string nodeName = 10; // Host networking requested for this pod. Use the host's network namespace. - // If this option is set, the ports that will be used must be specified. + // When using HostNetwork you should specify ports so the scheduler is aware. + // When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + // and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. // Default to false. // +k8s:conversion-gen=false // +optional @@ -4434,6 +4625,7 @@ message PodSpec { // - spec.hostPID // - spec.hostIPC // - spec.hostUsers + // - spec.resources // - spec.securityContext.appArmorProfile // - spec.securityContext.seLinuxOptions // - spec.securityContext.seccompProfile @@ -4504,7 +4696,7 @@ message PodSpec { // Resources is the total amount of CPU and Memory resources required by all // containers in the pod. It supports specifying Requests and Limits for - // "cpu" and "memory" resource names only. ResourceClaims are not supported. + // "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. // // This field enables fine-grained control over resource allocation for the // entire pod, allowing resource sharing among containers in a pod. @@ -4516,6 +4708,21 @@ message PodSpec { // +featureGate=PodLevelResources // +optional optional ResourceRequirements resources = 40; + + // HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + // This field only specifies the pod's hostname and does not affect its DNS records. + // When this field is set to a non-empty string: + // - It takes precedence over the values set in `hostname` and `subdomain`. + // - The Pod's hostname will be set to this value. + // - `setHostnameAsFQDN` must be nil or set to false. + // - `hostNetwork` must be set to false. + // + // This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + // Requires the HostnameOverride feature gate to be enabled. + // + // +featureGate=HostnameOverride + // +optional + optional string hostnameOverride = 41; } // PodStatus represents information about the status of a pod. Status may trail the actual @@ -4674,6 +4881,11 @@ message PodStatus { // +featureGate=DynamicResourceAllocation // +optional repeated PodResourceClaimStatus resourceClaimStatuses = 15; + + // Status of extended resource claim backed by DRA. + // +featureGate=DRAExtendedResource + // +optional + optional PodExtendedResourceClaimStatus extendedResourceClaimStatus = 18; } // PodStatusResult is a wrapper for PodStatus returned by kubelet that can be encode/decoded @@ -5298,7 +5510,7 @@ message ResourceRequirements { // Claims lists the names of resources, defined in spec.resourceClaims, // that are used by this container. // - // This is an alpha field and requires enabling the + // This field depends on the // DynamicResourceAllocation feature gate. // // This field is immutable. It can only be set for containers. @@ -6301,7 +6513,6 @@ message Taint { optional string effect = 3; // TimeAdded represents the time at which the taint was added. - // It is only written for NoExecute taints. // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time timeAdded = 4; } @@ -6682,6 +6893,44 @@ message VolumeProjection { // +featureGate=ClusterTrustBundleProjection // +optional optional ClusterTrustBundleProjection clusterTrustBundle = 5; + + // Projects an auto-rotating credential bundle (private key and certificate + // chain) that the pod can use either as a TLS client or server. + // + // Kubelet generates a private key and uses it to send a + // PodCertificateRequest to the named signer. Once the signer approves the + // request and issues a certificate chain, Kubelet writes the key and + // certificate chain to the pod filesystem. The pod does not start until + // certificates have been issued for each podCertificate projected volume + // source in its spec. + // + // Kubelet will begin trying to rotate the certificate at the time indicated + // by the signer using the PodCertificateRequest.Status.BeginRefreshAt + // timestamp. + // + // Kubelet can write a single file, indicated by the credentialBundlePath + // field, or separate files, indicated by the keyPath and + // certificateChainPath fields. + // + // The credential bundle is a single file in PEM format. The first PEM + // entry is the private key (in PKCS#8 format), and the remaining PEM + // entries are the certificate chain issued by the signer (typically, + // signers will return their certificate chain in leaf-to-root order). + // + // Prefer using the credential bundle format, since your application code + // can read it atomically. If you use keyPath and certificateChainPath, + // your application must make two separate file reads. If these coincide + // with a certificate rotation, it is possible that the private key and leaf + // certificate you read may not correspond to each other. Your application + // will need to check for this condition, and re-read until they are + // consistent. + // + // The named signer controls chooses the format of the certificate it + // issues; consult the signer implementation's documentation to learn how to + // use the certificates it issues. + // + // +featureGate=PodCertificateProjection +optional + optional PodCertificateProjection podCertificate = 6; } // VolumeResourceRequirements describes the storage resource requirements for a volume. @@ -6753,13 +7002,12 @@ message VolumeSource { // iscsi represents an ISCSI Disk resource that is attached to a // kubelet's host machine and then exposed to the pod. - // More info: https://examples.k8s.io/volumes/iscsi/README.md + // More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi // +optional optional ISCSIVolumeSource iscsi = 8; // glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. // Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md // +optional optional GlusterfsVolumeSource glusterfs = 9; @@ -6771,7 +7019,6 @@ message VolumeSource { // rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. // Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - // More info: https://examples.k8s.io/volumes/rbd/README.md // +optional optional RBDVolumeSource rbd = 11; diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index f7641e485a..08b6d351cc 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -91,12 +91,11 @@ type VolumeSource struct { NFS *NFSVolumeSource `json:"nfs,omitempty" protobuf:"bytes,7,opt,name=nfs"` // iscsi represents an ISCSI Disk resource that is attached to a // kubelet's host machine and then exposed to the pod. - // More info: https://examples.k8s.io/volumes/iscsi/README.md + // More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi // +optional ISCSI *ISCSIVolumeSource `json:"iscsi,omitempty" protobuf:"bytes,8,opt,name=iscsi"` // glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. // Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md // +optional Glusterfs *GlusterfsVolumeSource `json:"glusterfs,omitempty" protobuf:"bytes,9,opt,name=glusterfs"` // persistentVolumeClaimVolumeSource represents a reference to a @@ -106,7 +105,6 @@ type VolumeSource struct { PersistentVolumeClaim *PersistentVolumeClaimVolumeSource `json:"persistentVolumeClaim,omitempty" protobuf:"bytes,10,opt,name=persistentVolumeClaim"` // rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. // Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. - // More info: https://examples.k8s.io/volumes/rbd/README.md // +optional RBD *RBDVolumeSource `json:"rbd,omitempty" protobuf:"bytes,11,opt,name=rbd"` // flexVolume represents a generic volume resource that is @@ -437,7 +435,6 @@ type PersistentVolumeSpec struct { // after a volume has been updated successfully to a new class. // For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound // PersistentVolumeClaims during the binding process. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty" protobuf:"bytes,10,opt,name=volumeAttributesClassName"` @@ -616,15 +613,13 @@ type PersistentVolumeClaimSpec struct { // volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. // If specified, the CSI driver will create or update the volume with the attributes defined // in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, - // it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass - // will be applied to the claim but it's not allowed to reset this field to empty string once it is set. - // If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass - // will be set by the persistentvolume controller if it exists. + // it can be changed after the claim is created. An empty string or nil value indicates that no + // VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, + // this field can be reset to its previous value (including nil) to cancel the modification. // If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be // set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource // exists. // More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ - // (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default). // +featureGate=VolumeAttributesClass // +optional VolumeAttributesClassName *string `json:"volumeAttributesClassName,omitempty" protobuf:"bytes,9,opt,name=volumeAttributesClassName"` @@ -851,13 +846,11 @@ type PersistentVolumeClaimStatus struct { AllocatedResourceStatuses map[ResourceName]ClaimResourceStatus `json:"allocatedResourceStatuses,omitempty" protobuf:"bytes,7,rep,name=allocatedResourceStatuses"` // currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. // When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional CurrentVolumeAttributesClassName *string `json:"currentVolumeAttributesClassName,omitempty" protobuf:"bytes,8,opt,name=currentVolumeAttributesClassName"` // ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. // When this is unset, there is no ModifyVolume operation being attempted. - // This is a beta field and requires enabling VolumeAttributesClass feature (off by default). // +featureGate=VolumeAttributesClass // +optional ModifyVolumeStatus *ModifyVolumeStatus `json:"modifyVolumeStatus,omitempty" protobuf:"bytes,9,opt,name=modifyVolumeStatus"` @@ -972,7 +965,6 @@ type EmptyDirVolumeSource struct { // Glusterfs volumes do not support ownership management or SELinux relabeling. type GlusterfsVolumeSource struct { // endpoints is the endpoint name that details Glusterfs topology. - // More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod EndpointsName string `json:"endpoints" protobuf:"bytes,1,opt,name=endpoints"` // path is the Glusterfs volume path. @@ -1993,6 +1985,79 @@ type ClusterTrustBundleProjection struct { Path string `json:"path" protobuf:"bytes,4,rep,name=path"` } +// PodCertificateProjection provides a private key and X.509 certificate in the +// pod filesystem. +type PodCertificateProjection struct { + // Kubelet's generated CSRs will be addressed to this signer. + // + // +required + SignerName string `json:"signerName,omitempty" protobuf:"bytes,1,rep,name=signerName"` + + // The type of keypair Kubelet will generate for the pod. + // + // Valid values are "RSA3072", "RSA4096", "ECDSAP256", "ECDSAP384", + // "ECDSAP521", and "ED25519". + // + // +required + KeyType string `json:"keyType,omitempty" protobuf:"bytes,2,rep,name=keyType"` + + // maxExpirationSeconds is the maximum lifetime permitted for the + // certificate. + // + // Kubelet copies this value verbatim into the PodCertificateRequests it + // generates for this projection. + // + // If omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver + // will reject values shorter than 3600 (1 hour). The maximum allowable + // value is 7862400 (91 days). + // + // The signer implementation is then free to issue a certificate with any + // lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 + // seconds (1 hour). This constraint is enforced by kube-apiserver. + // `kubernetes.io` signers will never issue certificates with a lifetime + // longer than 24 hours. + // + // +optional + MaxExpirationSeconds *int32 `json:"maxExpirationSeconds,omitempty" protobuf:"varint,3,opt,name=maxExpirationSeconds"` + + // Write the credential bundle at this path in the projected volume. + // + // The credential bundle is a single file that contains multiple PEM blocks. + // The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private + // key. + // + // The remaining blocks are CERTIFICATE blocks, containing the issued + // certificate chain from the signer (leaf and any intermediates). + // + // Using credentialBundlePath lets your Pod's application code make a single + // atomic read that retrieves a consistent key and certificate chain. If you + // project them to separate files, your application code will need to + // additionally check that the leaf certificate was issued to the key. + // + // +optional + CredentialBundlePath string `json:"credentialBundlePath,omitempty" protobuf:"bytes,4,rep,name=credentialBundlePath"` + + // Write the key at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + KeyPath string `json:"keyPath,omitempty" protobuf:"bytes,5,rep,name=keyPath"` + + // Write the certificate chain at this path in the projected volume. + // + // Most applications should use credentialBundlePath. When using keyPath + // and certificateChainPath, your application needs to check that the key + // and leaf certificate are consistent, because it is possible to read the + // files mid-rotation. + // + // +optional + CertificateChainPath string `json:"certificateChainPath,omitempty" protobuf:"bytes,6,rep,name=certificateChainPath"` +} + // Represents a projected volume source type ProjectedVolumeSource struct { // sources is the list of volume projections. Each entry in this list @@ -2043,6 +2108,44 @@ type VolumeProjection struct { // +featureGate=ClusterTrustBundleProjection // +optional ClusterTrustBundle *ClusterTrustBundleProjection `json:"clusterTrustBundle,omitempty" protobuf:"bytes,5,opt,name=clusterTrustBundle"` + + // Projects an auto-rotating credential bundle (private key and certificate + // chain) that the pod can use either as a TLS client or server. + // + // Kubelet generates a private key and uses it to send a + // PodCertificateRequest to the named signer. Once the signer approves the + // request and issues a certificate chain, Kubelet writes the key and + // certificate chain to the pod filesystem. The pod does not start until + // certificates have been issued for each podCertificate projected volume + // source in its spec. + // + // Kubelet will begin trying to rotate the certificate at the time indicated + // by the signer using the PodCertificateRequest.Status.BeginRefreshAt + // timestamp. + // + // Kubelet can write a single file, indicated by the credentialBundlePath + // field, or separate files, indicated by the keyPath and + // certificateChainPath fields. + // + // The credential bundle is a single file in PEM format. The first PEM + // entry is the private key (in PKCS#8 format), and the remaining PEM + // entries are the certificate chain issued by the signer (typically, + // signers will return their certificate chain in leaf-to-root order). + // + // Prefer using the credential bundle format, since your application code + // can read it atomically. If you use keyPath and certificateChainPath, + // your application must make two separate file reads. If these coincide + // with a certificate rotation, it is possible that the private key and leaf + // certificate you read may not correspond to each other. Your application + // will need to check for this condition, and re-read until they are + // consistent. + // + // The named signer controls chooses the format of the certificate it + // issues; consult the signer implementation's documentation to learn how to + // use the certificates it issues. + // + // +featureGate=PodCertificateProjection +optional + PodCertificate *PodCertificateProjection `json:"podCertificate,omitempty" protobuf:"bytes,6,opt,name=podCertificate"` } const ( @@ -2351,7 +2454,8 @@ type VolumeDevice struct { // EnvVar represents an environment variable present in a Container. type EnvVar struct { - // Name of the environment variable. Must be a C_IDENTIFIER. + // Name of the environment variable. + // May consist of any printable ASCII characters except '='. Name string `json:"name" protobuf:"bytes,1,opt,name=name"` // Optional: no more than one of the following may be specified. @@ -2388,6 +2492,39 @@ type EnvVarSource struct { // Selects a key of a secret in the pod's namespace // +optional SecretKeyRef *SecretKeySelector `json:"secretKeyRef,omitempty" protobuf:"bytes,4,opt,name=secretKeyRef"` + // FileKeyRef selects a key of the env file. + // Requires the EnvFiles feature gate to be enabled. + // + // +featureGate=EnvFiles + // +optional + FileKeyRef *FileKeySelector `json:"fileKeyRef,omitempty" protobuf:"bytes,5,opt,name=fileKeyRef"` +} + +// FileKeySelector selects a key of the env file. +// +structType=atomic +type FileKeySelector struct { + // The name of the volume mount containing the env file. + // +required + VolumeName string `json:"volumeName" protobuf:"bytes,1,opt,name=volumeName"` + // The path within the volume from which to select the file. + // Must be relative and may not contain the '..' path or start with '..'. + // +required + Path string `json:"path" protobuf:"bytes,2,opt,name=path"` + // The key within the env file. An invalid key will prevent the pod from starting. + // The keys defined within a source may consist of any printable ASCII characters except '='. + // During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters. + // +required + Key string `json:"key" protobuf:"bytes,3,opt,name=key"` + // Specify whether the file or its key must be defined. If the file or key + // does not exist, then the env var is not published. + // If optional is set to true and the specified key does not exist, + // the environment variable will not be set in the Pod's containers. + // + // If optional is set to false and the specified key does not exist, + // an error will be returned during Pod creation. + // +optional + // +default=false + Optional *bool `json:"optional,omitempty" protobuf:"varint,4,opt,name=optional"` } // ObjectFieldSelector selects an APIVersioned field of an object. @@ -2439,7 +2576,8 @@ type SecretKeySelector struct { // EnvFromSource represents the source of a set of ConfigMaps or Secrets type EnvFromSource struct { - // Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER. + // Optional text to prepend to the name of each environment variable. + // May consist of any printable ASCII characters except '='. // +optional Prefix string `json:"prefix,omitempty" protobuf:"bytes,1,opt,name=prefix"` // The ConfigMap to select from @@ -2697,7 +2835,7 @@ type ResourceRequirements struct { // Claims lists the names of resources, defined in spec.resourceClaims, // that are used by this container. // - // This is an alpha field and requires enabling the + // This field depends on the // DynamicResourceAllocation feature gate. // // This field is immutable. It can only be set for containers. @@ -2805,8 +2943,8 @@ type Container struct { // +listMapKey=protocol Ports []ContainerPort `json:"ports,omitempty" patchStrategy:"merge" patchMergeKey:"containerPort" protobuf:"bytes,6,rep,name=ports"` // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -2832,10 +2970,10 @@ type Container struct { // +listType=atomic ResizePolicy []ContainerResizePolicy `json:"resizePolicy,omitempty" protobuf:"bytes,23,rep,name=resizePolicy"` // RestartPolicy defines the restart behavior of individual containers in a pod. - // This field may only be set for init containers, and the only allowed value is "Always". - // For non-init containers or when this field is not specified, + // This overrides the pod-level restart policy. When this field is not specified, // the restart behavior is defined by the Pod's restart policy and the container type. - // Setting the RestartPolicy as "Always" for the init container will have the following effect: + // Additionally, setting the RestartPolicy as "Always" for the init container will + // have the following effect: // this init container will be continually restarted on // exit until all regular containers have terminated. Once all regular // containers have completed, all init containers with restartPolicy "Always" @@ -2849,6 +2987,21 @@ type Container struct { // +featureGate=SidecarContainers // +optional RestartPolicy *ContainerRestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,24,opt,name=restartPolicy,casttype=ContainerRestartPolicy"` + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. The rules are evaluated in + // order. Once a rule matches a container exit condition, the remaining + // rules are ignored. If no rule matches the container exit condition, + // the Container-level restart policy determines the whether the container + // is restarted or not. Constraints on the rules: + // - At most 20 rules are allowed. + // - Rules can have the same action. + // - Identical rules are not forbidden in validations. + // When rules are specified, container MUST set RestartPolicy explicitly + // even it if matches the Pod's RestartPolicy. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + RestartPolicyRules []ContainerRestartRule `json:"restartPolicyRules,omitempty" protobuf:"bytes,25,rep,name=restartPolicyRules"` // Pod volumes to mount into the container's filesystem. // Cannot be updated. // +optional @@ -3478,11 +3631,64 @@ const ( ) // ContainerRestartPolicy is the restart policy for a single container. -// This may only be set for init containers and only allowed value is "Always". +// The only allowed values are "Always", "Never", and "OnFailure". type ContainerRestartPolicy string const ( - ContainerRestartPolicyAlways ContainerRestartPolicy = "Always" + ContainerRestartPolicyAlways ContainerRestartPolicy = "Always" + ContainerRestartPolicyNever ContainerRestartPolicy = "Never" + ContainerRestartPolicyOnFailure ContainerRestartPolicy = "OnFailure" +) + +// ContainerRestartRule describes how a container exit is handled. +type ContainerRestartRule struct { + // Specifies the action taken on a container exit if the requirements + // are satisfied. The only possible value is "Restart" to restart the + // container. + // +required + Action ContainerRestartRuleAction `json:"action,omitempty" proto:"bytes,1,opt,name=action" protobuf:"bytes,1,opt,name=action,casttype=ContainerRestartRuleAction"` + + // Represents the exit codes to check on container exits. + // +optional + // +oneOf=when + ExitCodes *ContainerRestartRuleOnExitCodes `json:"exitCodes,omitempty" proto:"bytes,2,opt,name=exitCodes" protobuf:"bytes,2,opt,name=exitCodes"` +} + +// ContainerRestartRuleAction describes the action to take when the +// container exits. +type ContainerRestartRuleAction string + +// The only valid action is Restart. +const ( + ContainerRestartRuleActionRestart ContainerRestartRuleAction = "Restart" +) + +// ContainerRestartRuleOnExitCodes describes the condition +// for handling an exited container based on its exit codes. +type ContainerRestartRuleOnExitCodes struct { + // Represents the relationship between the container exit code(s) and the + // specified values. Possible values are: + // - In: the requirement is satisfied if the container exit code is in the + // set of specified values. + // - NotIn: the requirement is satisfied if the container exit code is + // not in the set of specified values. + // +required + Operator ContainerRestartRuleOnExitCodesOperator `json:"operator,omitempty" proto:"bytes,1,opt,name=operator" protobuf:"bytes,1,opt,name=operator,casttype=ContainerRestartRuleOnExitCodesOperator"` + + // Specifies the set of values to check for container exit codes. + // At most 255 elements are allowed. + // +optional + // +listType=set + Values []int32 `json:"values,omitempty" proto:"varint,2,rep,name=values" protobuf:"varint,2,rep,name=values"` +} + +// ContainerRestartRuleOnExitCodesOperator describes the operator +// to take for the exit codes. +type ContainerRestartRuleOnExitCodesOperator string + +const ( + ContainerRestartRuleOnExitCodesOpIn ContainerRestartRuleOnExitCodesOperator = "In" + ContainerRestartRuleOnExitCodesOpNotIn ContainerRestartRuleOnExitCodesOperator = "NotIn" ) // DNSPolicy defines how a pod's DNS will be configured. @@ -3678,8 +3884,8 @@ type PodAntiAffinity struct { // most preferred is the one with the greatest sum of weights, i.e. // for each node that meets all of the scheduling requirements (resource // request, requiredDuringScheduling anti-affinity expressions, etc.), - // compute a sum by iterating through the elements of this field and adding - // "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the + // compute a sum by iterating through the elements of this field and subtracting + // "weight" from the sum if the node has pods which matches the corresponding podAffinityTerm; the // node(s) with the highest sum are the most preferred. // +optional // +listType=atomic @@ -3806,7 +4012,6 @@ type Taint struct { // Valid effects are NoSchedule, PreferNoSchedule and NoExecute. Effect TaintEffect `json:"effect" protobuf:"bytes,3,opt,name=effect,casttype=TaintEffect"` // TimeAdded represents the time at which the taint was added. - // It is only written for NoExecute taints. // +optional TimeAdded *metav1.Time `json:"timeAdded,omitempty" protobuf:"bytes,4,opt,name=timeAdded"` } @@ -3983,7 +4188,9 @@ type PodSpec struct { // +optional NodeName string `json:"nodeName,omitempty" protobuf:"bytes,10,opt,name=nodeName"` // Host networking requested for this pod. Use the host's network namespace. - // If this option is set, the ports that will be used must be specified. + // When using HostNetwork you should specify ports so the scheduler is aware. + // When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, + // and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. // Default to false. // +k8s:conversion-gen=false // +optional @@ -4126,6 +4333,7 @@ type PodSpec struct { // - spec.hostPID // - spec.hostIPC // - spec.hostUsers + // - spec.resources // - spec.securityContext.appArmorProfile // - spec.securityContext.seLinuxOptions // - spec.securityContext.seccompProfile @@ -4194,7 +4402,7 @@ type PodSpec struct { ResourceClaims []PodResourceClaim `json:"resourceClaims,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,39,rep,name=resourceClaims"` // Resources is the total amount of CPU and Memory resources required by all // containers in the pod. It supports specifying Requests and Limits for - // "cpu" and "memory" resource names only. ResourceClaims are not supported. + // "cpu", "memory" and "hugepages-" resource names only. ResourceClaims are not supported. // // This field enables fine-grained control over resource allocation for the // entire pod, allowing resource sharing among containers in a pod. @@ -4206,6 +4414,20 @@ type PodSpec struct { // +featureGate=PodLevelResources // +optional Resources *ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,40,opt,name=resources"` + // HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. + // This field only specifies the pod's hostname and does not affect its DNS records. + // When this field is set to a non-empty string: + // - It takes precedence over the values set in `hostname` and `subdomain`. + // - The Pod's hostname will be set to this value. + // - `setHostnameAsFQDN` must be nil or set to false. + // - `hostNetwork` must be set to false. + // + // This field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. + // Requires the HostnameOverride feature gate to be enabled. + // + // +featureGate=HostnameOverride + // +optional + HostnameOverride *string `json:"hostnameOverride,omitempty" protobuf:"bytes,41,opt,name=hostnameOverride"` } // PodResourceClaim references exactly one ResourceClaim, either directly @@ -4267,6 +4489,31 @@ type PodResourceClaimStatus struct { ResourceClaimName *string `json:"resourceClaimName,omitempty" protobuf:"bytes,2,opt,name=resourceClaimName"` } +// PodExtendedResourceClaimStatus is stored in the PodStatus for the extended +// resource requests backed by DRA. It stores the generated name for +// the corresponding special ResourceClaim created by the scheduler. +type PodExtendedResourceClaimStatus struct { + // RequestMappings identifies the mapping of to device request + // in the generated ResourceClaim. + // +listType=atomic + RequestMappings []ContainerExtendedResourceRequest `json:"requestMappings" protobuf:"bytes,1,rep,name=requestMappings"` + + // ResourceClaimName is the name of the ResourceClaim that was + // generated for the Pod in the namespace of the Pod. + ResourceClaimName string `json:"resourceClaimName" protobuf:"bytes,2,name=resourceClaimName"` +} + +// ContainerExtendedResourceRequest has the mapping of container name, +// extended resource name to the device request name. +type ContainerExtendedResourceRequest struct { + // The name of the container requesting resources. + ContainerName string `json:"containerName" protobuf:"bytes,1,name=containerName"` + // The name of the extended resource in that container which gets backed by DRA. + ResourceName string `json:"resourceName" protobuf:"bytes,2,name=resourceName"` + // The name of the request in the special ResourceClaim which corresponds to the extended resource. + RequestName string `json:"requestName" protobuf:"bytes,3,name=requestName"` +} + // OSName is the set of OS'es that can be used in OS. type OSName string @@ -4799,8 +5046,8 @@ type EphemeralContainerCommon struct { // +listMapKey=protocol Ports []ContainerPort `json:"ports,omitempty" patchStrategy:"merge" patchMergeKey:"containerPort" protobuf:"bytes,6,rep,name=ports"` // List of sources to populate environment variables in the container. - // The keys defined within a source must be a C_IDENTIFIER. All invalid keys - // will be reported as an event when the container is starting. When a key exists in multiple + // The keys defined within a source may consist of any printable ASCII characters except '='. + // When a key exists in multiple // sources, the value associated with the last source will take precedence. // Values defined by an Env with a duplicate key will take precedence. // Cannot be updated. @@ -4826,11 +5073,17 @@ type EphemeralContainerCommon struct { ResizePolicy []ContainerResizePolicy `json:"resizePolicy,omitempty" protobuf:"bytes,23,rep,name=resizePolicy"` // Restart policy for the container to manage the restart behavior of each // container within a pod. - // This may only be set for init containers. You cannot set this field on - // ephemeral containers. + // You cannot set this field on ephemeral containers. // +featureGate=SidecarContainers // +optional RestartPolicy *ContainerRestartPolicy `json:"restartPolicy,omitempty" protobuf:"bytes,24,opt,name=restartPolicy,casttype=ContainerRestartPolicy"` + // Represents a list of rules to be checked to determine if the + // container should be restarted on exit. You cannot set this field on + // ephemeral containers. + // +featureGate=ContainerRestartRules + // +optional + // +listType=atomic + RestartPolicyRules []ContainerRestartRule `json:"restartPolicyRules,omitempty" protobuf:"bytes,25,rep,name=restartPolicyRules"` // Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. // Cannot be updated. // +optional @@ -5091,6 +5344,10 @@ type PodStatus struct { // +featureGate=DynamicResourceAllocation // +optional ResourceClaimStatuses []PodResourceClaimStatus `json:"resourceClaimStatuses,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name" protobuf:"bytes,15,rep,name=resourceClaimStatuses"` + // Status of extended resource claim backed by DRA. + // +featureGate=DRAExtendedResource + // +optional + ExtendedResourceClaimStatus *PodExtendedResourceClaimStatus `json:"extendedResourceClaimStatus,omitempty" protobuf:"bytes,18,opt,name=extendedResourceClaimStatus"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -5311,6 +5568,7 @@ type ReplicationControllerCondition struct { // +genclient:method=UpdateScale,verb=update,subresource=scale,input=k8s.io/api/autoscaling/v1.Scale,result=k8s.io/api/autoscaling/v1.Scale // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:prerelease-lifecycle-gen:introduced=1.0 +// +k8s:supportsSubresource=/scale // ReplicationController represents the configuration of a replication controller. type ReplicationController struct { diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 9e987eefdd..1204307667 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -356,11 +356,12 @@ var map_Container = map[string]string{ "args": "Arguments to the entrypoint. The container image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", "workingDir": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", "ports": "List of ports to expose from the container. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Modifying this array with strategic merge patch may corrupt the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated.", - "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "resizePolicy": "Resources resize policy for the container.", - "restartPolicy": "RestartPolicy defines the restart behavior of individual containers in a pod. This field may only be set for init containers, and the only allowed value is \"Always\". For non-init containers or when this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "restartPolicy": "RestartPolicy defines the restart behavior of individual containers in a pod. This overrides the pod-level restart policy. When this field is not specified, the restart behavior is defined by the Pod's restart policy and the container type. Additionally, setting the RestartPolicy as \"Always\" for the init container will have the following effect: this init container will be continually restarted on exit until all regular containers have terminated. Once all regular containers have completed, all init containers with restartPolicy \"Always\" will be shut down. This lifecycle differs from normal init containers and is often referred to as a \"sidecar\" container. Although this init container still starts in the init container sequence, it does not wait for the container to complete before proceeding to the next init container. Instead, the next init container starts immediately after this init container is started, or after any startupProbe has successfully completed.", + "restartPolicyRules": "Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", @@ -380,6 +381,17 @@ func (Container) SwaggerDoc() map[string]string { return map_Container } +var map_ContainerExtendedResourceRequest = map[string]string{ + "": "ContainerExtendedResourceRequest has the mapping of container name, extended resource name to the device request name.", + "containerName": "The name of the container requesting resources.", + "resourceName": "The name of the extended resource in that container which gets backed by DRA.", + "requestName": "The name of the request in the special ResourceClaim which corresponds to the extended resource.", +} + +func (ContainerExtendedResourceRequest) SwaggerDoc() map[string]string { + return map_ContainerExtendedResourceRequest +} + var map_ContainerImage = map[string]string{ "": "Describe a container image", "names": "Names by which this image is known. e.g. [\"kubernetes.example/hyperkube:v1.0.7\", \"cloud-vendor.registry.example/cloud-vendor/hyperkube:v1.0.7\"]", @@ -413,6 +425,26 @@ func (ContainerResizePolicy) SwaggerDoc() map[string]string { return map_ContainerResizePolicy } +var map_ContainerRestartRule = map[string]string{ + "": "ContainerRestartRule describes how a container exit is handled.", + "action": "Specifies the action taken on a container exit if the requirements are satisfied. The only possible value is \"Restart\" to restart the container.", + "exitCodes": "Represents the exit codes to check on container exits.", +} + +func (ContainerRestartRule) SwaggerDoc() map[string]string { + return map_ContainerRestartRule +} + +var map_ContainerRestartRuleOnExitCodes = map[string]string{ + "": "ContainerRestartRuleOnExitCodes describes the condition for handling an exited container based on its exit codes.", + "operator": "Represents the relationship between the container exit code(s) and the specified values. Possible values are: - In: the requirement is satisfied if the container exit code is in the\n set of specified values.\n- NotIn: the requirement is satisfied if the container exit code is\n not in the set of specified values.", + "values": "Specifies the set of values to check for container exit codes. At most 255 elements are allowed.", +} + +func (ContainerRestartRuleOnExitCodes) SwaggerDoc() map[string]string { + return map_ContainerRestartRuleOnExitCodes +} + var map_ContainerState = map[string]string{ "": "ContainerState holds a possible state of container. Only one of its members may be specified. If none of them is specified, the default one is ContainerStateWaiting.", "waiting": "Details about a waiting container", @@ -597,7 +629,7 @@ func (EndpointsList) SwaggerDoc() map[string]string { var map_EnvFromSource = map[string]string{ "": "EnvFromSource represents the source of a set of ConfigMaps or Secrets", - "prefix": "Optional text to prepend to the name of each environment variable. Must be a C_IDENTIFIER.", + "prefix": "Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.", "configMapRef": "The ConfigMap to select from", "secretRef": "The Secret to select from", } @@ -608,7 +640,7 @@ func (EnvFromSource) SwaggerDoc() map[string]string { var map_EnvVar = map[string]string{ "": "EnvVar represents an environment variable present in a Container.", - "name": "Name of the environment variable. Must be a C_IDENTIFIER.", + "name": "Name of the environment variable. May consist of any printable ASCII characters except '='.", "value": "Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".", "valueFrom": "Source for the environment variable's value. Cannot be used if value is not empty.", } @@ -623,6 +655,7 @@ var map_EnvVarSource = map[string]string{ "resourceFieldRef": "Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.", "configMapKeyRef": "Selects a key of a ConfigMap.", "secretKeyRef": "Selects a key of a secret in the pod's namespace", + "fileKeyRef": "FileKeyRef selects a key of the env file. Requires the EnvFiles feature gate to be enabled.", } func (EnvVarSource) SwaggerDoc() map[string]string { @@ -646,11 +679,12 @@ var map_EphemeralContainerCommon = map[string]string{ "args": "Arguments to the entrypoint. The image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. \"$$(VAR_NAME)\" will produce the string literal \"$(VAR_NAME)\". Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell", "workingDir": "Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.", "ports": "Ports are not allowed for ephemeral containers.", - "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", + "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", "resources": "Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod.", "resizePolicy": "Resources resize policy for the container.", - "restartPolicy": "Restart policy for the container to manage the restart behavior of each container within a pod. This may only be set for init containers. You cannot set this field on ephemeral containers.", + "restartPolicy": "Restart policy for the container to manage the restart behavior of each container within a pod. You cannot set this field on ephemeral containers.", + "restartPolicyRules": "Represents a list of rules to be checked to determine if the container should be restarted on exit. You cannot set this field on ephemeral containers.", "volumeMounts": "Pod volumes to mount into the container's filesystem. Subpath mounts are not allowed for ephemeral containers. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container.", "livenessProbe": "Probes are not allowed for ephemeral containers.", @@ -754,6 +788,18 @@ func (FCVolumeSource) SwaggerDoc() map[string]string { return map_FCVolumeSource } +var map_FileKeySelector = map[string]string{ + "": "FileKeySelector selects a key of the env file.", + "volumeName": "The name of the volume mount containing the env file.", + "path": "The path within the volume from which to select the file. Must be relative and may not contain the '..' path or start with '..'.", + "key": "The key within the env file. An invalid key will prevent the pod from starting. The keys defined within a source may consist of any printable ASCII characters except '='. During Alpha stage of the EnvFiles feature gate, the key size is limited to 128 characters.", + "optional": "Specify whether the file or its key must be defined. If the file or key does not exist, then the env var is not published. If optional is set to true and the specified key does not exist, the environment variable will not be set in the Pod's containers.\n\nIf optional is set to false and the specified key does not exist, an error will be returned during Pod creation.", +} + +func (FileKeySelector) SwaggerDoc() map[string]string { + return map_FileKeySelector +} + var map_FlexPersistentVolumeSource = map[string]string{ "": "FlexPersistentVolumeSource represents a generic persistent volume resource that is provisioned/attached using an exec based plugin.", "driver": "driver is the name of the driver to use for this volume.", @@ -837,7 +883,7 @@ func (GlusterfsPersistentVolumeSource) SwaggerDoc() map[string]string { var map_GlusterfsVolumeSource = map[string]string{ "": "Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.", - "endpoints": "endpoints is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", + "endpoints": "endpoints is the endpoint name that details Glusterfs topology.", "path": "path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", "readOnly": "readOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod", } @@ -1446,7 +1492,7 @@ var map_PersistentVolumeClaimSpec = map[string]string{ "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec.", "dataSource": "dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.", "dataSourceRef": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn't specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn't set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While dataSource ignores disallowed values (dropping them), dataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n* While dataSource only allows local objects, dataSourceRef allows objects\n in any namespaces.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.", - "volumeAttributesClassName": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string value means that no VolumeAttributesClass will be applied to the claim but it's not allowed to reset this field to empty string once it is set. If unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass will be set by the persistentvolume controller if it exists. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/ (Beta) Using this field requires the VolumeAttributesClass feature gate to be enabled (off by default).", + "volumeAttributesClassName": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim. If specified, the CSI driver will create or update the volume with the attributes defined in the corresponding VolumeAttributesClass. This has a different purpose than storageClassName, it can be changed after the claim is created. An empty string or nil value indicates that no VolumeAttributesClass will be applied to the claim. If the claim enters an Infeasible error state, this field can be reset to its previous value (including nil) to cancel the modification. If the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be set to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource exists. More info: https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/", } func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { @@ -1461,8 +1507,8 @@ var map_PersistentVolumeClaimStatus = map[string]string{ "conditions": "conditions is the current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'Resizing'.", "allocatedResources": "allocatedResources tracks the resources allocated to a PVC including its capacity. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nCapacity reported here may be larger than the actual capacity when a volume expansion operation is requested. For storage quota, the larger value from allocatedResources and PVC.spec.resources is used. If allocatedResources is not set, PVC.spec.resources alone is used for quota calculation. If a volume expansion capacity request is lowered, allocatedResources is only lowered if there are no expansion operations in progress and if the actual volume capacity is equal or lower than the requested capacity.\n\nA controller that receives PVC update with previously unknown resourceName should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", "allocatedResourceStatuses": "allocatedResourceStatuses stores status of resource being resized for the given PVC. Key names follow standard Kubernetes label syntax. Valid values are either:\n\t* Un-prefixed keys:\n\t\t- storage - the capacity of the volume.\n\t* Custom resources must use implementation-defined prefixed names such as \"example.com/my-custom-resource\"\nApart from above values - keys that are unprefixed or have kubernetes.io prefix are considered reserved and hence may not be used.\n\nClaimResourceStatus can be in any of following states:\n\t- ControllerResizeInProgress:\n\t\tState set when resize controller starts resizing the volume in control-plane.\n\t- ControllerResizeFailed:\n\t\tState set when resize has failed in resize controller with a terminal error.\n\t- NodeResizePending:\n\t\tState set when resize controller has finished resizing the volume but further resizing of\n\t\tvolume is needed on the node.\n\t- NodeResizeInProgress:\n\t\tState set when kubelet starts resizing the volume.\n\t- NodeResizeFailed:\n\t\tState set when resizing has failed in kubelet with a terminal error. Transient errors don't set\n\t\tNodeResizeFailed.\nFor example: if expanding a PVC for more capacity - this field can be one of the following states:\n\t- pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"ControllerResizeFailed\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizePending\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeInProgress\"\n - pvc.status.allocatedResourceStatus['storage'] = \"NodeResizeFailed\"\nWhen this field is not set, it means that no resize operation is in progress for the given PVC.\n\nA controller that receives PVC update with previously unknown resourceName or ClaimResourceStatus should ignore the update for the purpose it was designed. For example - a controller that only is responsible for resizing capacity of the volume, should ignore PVC updates that change other valid resources associated with PVC.\n\nThis is an alpha field and requires enabling RecoverVolumeExpansionFailure feature.", - "currentVolumeAttributesClassName": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim This is a beta field and requires enabling VolumeAttributesClass feature (off by default).", - "modifyVolumeStatus": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted. This is a beta field and requires enabling VolumeAttributesClass feature (off by default).", + "currentVolumeAttributesClassName": "currentVolumeAttributesClassName is the current name of the VolumeAttributesClass the PVC is using. When unset, there is no VolumeAttributeClass applied to this PersistentVolumeClaim", + "modifyVolumeStatus": "ModifyVolumeStatus represents the status object of ControllerModifyVolume operation. When this is unset, there is no ModifyVolume operation being attempted.", } func (PersistentVolumeClaimStatus) SwaggerDoc() map[string]string { @@ -1539,7 +1585,7 @@ var map_PersistentVolumeSpec = map[string]string{ "mountOptions": "mountOptions is the list of mount options, e.g. [\"ro\", \"soft\"]. Not validated - mount will simply fail if one is invalid. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options", "volumeMode": "volumeMode defines if a volume is intended to be used with a formatted filesystem or to remain in raw block state. Value of Filesystem is implied when not included in spec.", "nodeAffinity": "nodeAffinity defines constraints that limit what nodes this volume can be accessed from. This field influences the scheduling of pods that use this volume.", - "volumeAttributesClassName": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process. This is a beta field and requires enabling VolumeAttributesClass feature (off by default).", + "volumeAttributesClassName": "Name of VolumeAttributesClass to which this persistent volume belongs. Empty value is not allowed. When this field is not set, it indicates that this volume does not belong to any VolumeAttributesClass. This field is mutable and can be changed by the CSI driver after a volume has been updated successfully to a new class. For an unbound PersistentVolume, the volumeAttributesClassName will be matched with unbound PersistentVolumeClaims during the binding process.", } func (PersistentVolumeSpec) SwaggerDoc() map[string]string { @@ -1606,7 +1652,7 @@ func (PodAffinityTerm) SwaggerDoc() map[string]string { var map_PodAntiAffinity = map[string]string{ "": "Pod anti affinity is a group of inter pod anti affinity scheduling rules.", "requiredDuringSchedulingIgnoredDuringExecution": "If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.", - "preferredDuringSchedulingIgnoredDuringExecution": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", + "preferredDuringSchedulingIgnoredDuringExecution": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting \"weight\" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.", } func (PodAntiAffinity) SwaggerDoc() map[string]string { @@ -1626,6 +1672,20 @@ func (PodAttachOptions) SwaggerDoc() map[string]string { return map_PodAttachOptions } +var map_PodCertificateProjection = map[string]string{ + "": "PodCertificateProjection provides a private key and X.509 certificate in the pod filesystem.", + "signerName": "Kubelet's generated CSRs will be addressed to this signer.", + "keyType": "The type of keypair Kubelet will generate for the pod.\n\nValid values are \"RSA3072\", \"RSA4096\", \"ECDSAP256\", \"ECDSAP384\", \"ECDSAP521\", and \"ED25519\".", + "maxExpirationSeconds": "maxExpirationSeconds is the maximum lifetime permitted for the certificate.\n\nKubelet copies this value verbatim into the PodCertificateRequests it generates for this projection.\n\nIf omitted, kube-apiserver will set it to 86400(24 hours). kube-apiserver will reject values shorter than 3600 (1 hour). The maximum allowable value is 7862400 (91 days).\n\nThe signer implementation is then free to issue a certificate with any lifetime *shorter* than MaxExpirationSeconds, but no shorter than 3600 seconds (1 hour). This constraint is enforced by kube-apiserver. `kubernetes.io` signers will never issue certificates with a lifetime longer than 24 hours.", + "credentialBundlePath": "Write the credential bundle at this path in the projected volume.\n\nThe credential bundle is a single file that contains multiple PEM blocks. The first PEM block is a PRIVATE KEY block, containing a PKCS#8 private key.\n\nThe remaining blocks are CERTIFICATE blocks, containing the issued certificate chain from the signer (leaf and any intermediates).\n\nUsing credentialBundlePath lets your Pod's application code make a single atomic read that retrieves a consistent key and certificate chain. If you project them to separate files, your application code will need to additionally check that the leaf certificate was issued to the key.", + "keyPath": "Write the key at this path in the projected volume.\n\nMost applications should use credentialBundlePath. When using keyPath and certificateChainPath, your application needs to check that the key and leaf certificate are consistent, because it is possible to read the files mid-rotation.", + "certificateChainPath": "Write the certificate chain at this path in the projected volume.\n\nMost applications should use credentialBundlePath. When using keyPath and certificateChainPath, your application needs to check that the key and leaf certificate are consistent, because it is possible to read the files mid-rotation.", +} + +func (PodCertificateProjection) SwaggerDoc() map[string]string { + return map_PodCertificateProjection +} + var map_PodCondition = map[string]string{ "": "PodCondition contains details for the current condition of this pod.", "type": "Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", @@ -1676,6 +1736,16 @@ func (PodExecOptions) SwaggerDoc() map[string]string { return map_PodExecOptions } +var map_PodExtendedResourceClaimStatus = map[string]string{ + "": "PodExtendedResourceClaimStatus is stored in the PodStatus for the extended resource requests backed by DRA. It stores the generated name for the corresponding special ResourceClaim created by the scheduler.", + "requestMappings": "RequestMappings identifies the mapping of to device request in the generated ResourceClaim.", + "resourceClaimName": "ResourceClaimName is the name of the ResourceClaim that was generated for the Pod in the namespace of the Pod.", +} + +func (PodExtendedResourceClaimStatus) SwaggerDoc() map[string]string { + return map_PodExtendedResourceClaimStatus +} + var map_PodIP = map[string]string{ "": "PodIP represents a single IP address allocated to the pod.", "ip": "IP is the IP address assigned to the pod", @@ -1824,7 +1894,7 @@ var map_PodSpec = map[string]string{ "serviceAccount": "DeprecatedServiceAccount is a deprecated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.", "automountServiceAccountToken": "AutomountServiceAccountToken indicates whether a service account token should be automatically mounted.", "nodeName": "NodeName indicates in which node this pod is scheduled. If empty, this pod is a candidate for scheduling by the scheduler defined in schedulerName. Once this field is set, the kubelet for this node becomes responsible for the lifecycle of this pod. This field should not be used to express a desire for the pod to be scheduled on a specific node. https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename", - "hostNetwork": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", + "hostNetwork": "Host networking requested for this pod. Use the host's network namespace. When using HostNetwork you should specify ports so the scheduler is aware. When `hostNetwork` is true, specified `hostPort` fields in port definitions must match `containerPort`, and unspecified `hostPort` fields in port definitions are defaulted to match `containerPort`. Default to false.", "hostPID": "Use the host's pid namespace. Optional: Default to false.", "hostIPC": "Use the host's ipc namespace. Optional: Default to false.", "shareProcessNamespace": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.", @@ -1846,11 +1916,12 @@ var map_PodSpec = map[string]string{ "overhead": "Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/688-pod-overhead/README.md", "topologySpreadConstraints": "TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed.", "setHostnameAsFQDN": "If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false.", - "os": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", + "os": "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set.\n\nIf the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions\n\nIf the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.resources - spec.securityContext.appArmorProfile - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.securityContext.supplementalGroupsPolicy - spec.containers[*].securityContext.appArmorProfile - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup", "hostUsers": "Use the host's user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.", "schedulingGates": "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the scheduler will not attempt to schedule the pod.\n\nSchedulingGates can only be set at pod creation time, and be removed only afterwards.", "resourceClaims": "ResourceClaims defines which ResourceClaims must be allocated and reserved before the Pod is allowed to start. The resources will be made available to those containers which consume them by name.\n\nThis is an alpha field and requires enabling the DynamicResourceAllocation feature gate.\n\nThis field is immutable.", - "resources": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\" and \"memory\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "resources": "Resources is the total amount of CPU and Memory resources required by all containers in the pod. It supports specifying Requests and Limits for \"cpu\", \"memory\" and \"hugepages-\" resource names only. ResourceClaims are not supported.\n\nThis field enables fine-grained control over resource allocation for the entire pod, allowing resource sharing among containers in a pod.\n\nThis is an alpha field and requires enabling the PodLevelResources feature gate.", + "hostnameOverride": "HostnameOverride specifies an explicit override for the pod's hostname as perceived by the pod. This field only specifies the pod's hostname and does not affect its DNS records. When this field is set to a non-empty string: - It takes precedence over the values set in `hostname` and `subdomain`. - The Pod's hostname will be set to this value. - `setHostnameAsFQDN` must be nil or set to false. - `hostNetwork` must be set to false.\n\nThis field must be a valid DNS subdomain as defined in RFC 1123 and contain at most 64 characters. Requires the HostnameOverride feature gate to be enabled.", } func (PodSpec) SwaggerDoc() map[string]string { @@ -1858,24 +1929,25 @@ func (PodSpec) SwaggerDoc() map[string]string { } var map_PodStatus = map[string]string{ - "": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", - "observedGeneration": "If set, this represents the .metadata.generation that the pod status was set based upon. This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.", - "phase": "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", - "conditions": "Current service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", - "message": "A human readable message indicating details about why the pod is in this condition.", - "reason": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", - "nominatedNodeName": "nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.", - "hostIP": "hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will not be updated even if there is a node is assigned to pod", - "hostIPs": "hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must match the hostIP field. This list is empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will not be updated even if there is a node is assigned to this pod.", - "podIP": "podIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", - "podIPs": "podIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.", - "startTime": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod.", - "initContainerStatuses": "Statuses of init containers in this pod. The most recent successful non-restartable init container will have ready = true, the most recently started container will have startTime set. Each init container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-and-container-status", - "containerStatuses": "Statuses of containers in this pod. Each container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", - "qosClass": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/#quality-of-service-classes", - "ephemeralContainerStatuses": "Statuses for any ephemeral containers that have run in this pod. Each ephemeral container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", - "resize": "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\" Deprecated: Resize status is moved to two pod conditions PodResizePending and PodResizeInProgress. PodResizePending will track states where the spec has been resized, but the Kubelet has not yet allocated the resources. PodResizeInProgress will track in-progress resizes, and should be present whenever allocated resources != acknowledged resources.", - "resourceClaimStatuses": "Status of resource claims.", + "": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", + "observedGeneration": "If set, this represents the .metadata.generation that the pod status was set based upon. This is an alpha field. Enable PodObservedGenerationTracking to be able to use this field.", + "phase": "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", + "conditions": "Current service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + "message": "A human readable message indicating details about why the pod is in this condition.", + "reason": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", + "nominatedNodeName": "nominatedNodeName is set only when this pod preempts other pods on the node, but it cannot be scheduled right away as preemption victims receive their graceful termination periods. This field does not guarantee that the pod will be scheduled on this node. Scheduler may decide to place the pod elsewhere if other nodes become available sooner. Scheduler may also decide to give the resources on this node to a higher priority pod that is created after preemption. As a result, this field may be different than PodSpec.nodeName when the pod is scheduled.", + "hostIP": "hostIP holds the IP address of the host to which the pod is assigned. Empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns mean that HostIP will not be updated even if there is a node is assigned to pod", + "hostIPs": "hostIPs holds the IP addresses allocated to the host. If this field is specified, the first entry must match the hostIP field. This list is empty if the pod has not started yet. A pod can be assigned to a node that has a problem in kubelet which in turns means that HostIPs will not be updated even if there is a node is assigned to this pod.", + "podIP": "podIP address allocated to the pod. Routable at least within the cluster. Empty if not yet allocated.", + "podIPs": "podIPs holds the IP addresses allocated to the pod. If this field is specified, the 0th entry must match the podIP field. Pods may be allocated at most 1 value for each of IPv4 and IPv6. This list is empty if no IPs have been allocated yet.", + "startTime": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod.", + "initContainerStatuses": "Statuses of init containers in this pod. The most recent successful non-restartable init container will have ready = true, the most recently started container will have startTime set. Each init container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-and-container-status", + "containerStatuses": "Statuses of containers in this pod. Each container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", + "qosClass": "The Quality of Service (QOS) classification assigned to the pod based on resource requirements See PodQOSClass type for available QOS classes More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/#quality-of-service-classes", + "ephemeralContainerStatuses": "Statuses for any ephemeral containers that have run in this pod. Each ephemeral container in the pod should have at most one status in this list, and all statuses should be for containers in the pod. However this is not enforced. If a status for a non-existent container is present in the list, or the list has duplicate names, the behavior of various Kubernetes components is not defined and those statuses might be ignored. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-and-container-status", + "resize": "Status of resources resize desired for pod's containers. It is empty if no resources resize is pending. Any changes to container resources will automatically set this to \"Proposed\" Deprecated: Resize status is moved to two pod conditions PodResizePending and PodResizeInProgress. PodResizePending will track states where the spec has been resized, but the Kubelet has not yet allocated the resources. PodResizeInProgress will track in-progress resizes, and should be present whenever allocated resources != acknowledged resources.", + "resourceClaimStatuses": "Status of resource claims.", + "extendedResourceClaimStatus": "Status of extended resource claim backed by DRA.", } func (PodStatus) SwaggerDoc() map[string]string { @@ -2205,7 +2277,7 @@ var map_ResourceRequirements = map[string]string{ "": "ResourceRequirements describes the compute resource requirements.", "limits": "Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", "requests": "Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/", - "claims": "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.\n\nThis is an alpha field and requires enabling the DynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.", + "claims": "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container.\n\nThis field depends on the DynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.", } func (ResourceRequirements) SwaggerDoc() map[string]string { @@ -2587,7 +2659,7 @@ var map_Taint = map[string]string{ "key": "Required. The taint key to be applied to a node.", "value": "The taint value corresponding to the taint key.", "effect": "Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute.", - "timeAdded": "TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints.", + "timeAdded": "TimeAdded represents the time at which the taint was added.", } func (Taint) SwaggerDoc() map[string]string { @@ -2727,6 +2799,7 @@ var map_VolumeProjection = map[string]string{ "configMap": "configMap information about the configMap data to project", "serviceAccountToken": "serviceAccountToken is information about the serviceAccountToken data to project", "clusterTrustBundle": "ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field of ClusterTrustBundle objects in an auto-updating file.\n\nAlpha, gated by the ClusterTrustBundleProjection feature gate.\n\nClusterTrustBundle objects can either be selected by name, or by the combination of signer name and a label selector.\n\nKubelet performs aggressive normalization of the PEM contents written into the pod filesystem. Esoteric PEM features such as inter-block comments and block headers are stripped. Certificates are deduplicated. The ordering of certificates within the file is arbitrary, and Kubelet may change the order over time.", + "podCertificate": "Projects an auto-rotating credential bundle (private key and certificate chain) that the pod can use either as a TLS client or server.\n\nKubelet generates a private key and uses it to send a PodCertificateRequest to the named signer. Once the signer approves the request and issues a certificate chain, Kubelet writes the key and certificate chain to the pod filesystem. The pod does not start until certificates have been issued for each podCertificate projected volume source in its spec.\n\nKubelet will begin trying to rotate the certificate at the time indicated by the signer using the PodCertificateRequest.Status.BeginRefreshAt timestamp.\n\nKubelet can write a single file, indicated by the credentialBundlePath field, or separate files, indicated by the keyPath and certificateChainPath fields.\n\nThe credential bundle is a single file in PEM format. The first PEM entry is the private key (in PKCS#8 format), and the remaining PEM entries are the certificate chain issued by the signer (typically, signers will return their certificate chain in leaf-to-root order).\n\nPrefer using the credential bundle format, since your application code can read it atomically. If you use keyPath and certificateChainPath, your application must make two separate file reads. If these coincide with a certificate rotation, it is possible that the private key and leaf certificate you read may not correspond to each other. Your application will need to check for this condition, and re-read until they are consistent.\n\nThe named signer controls chooses the format of the certificate it issues; consult the signer implementation's documentation to learn how to use the certificates it issues.", } func (VolumeProjection) SwaggerDoc() map[string]string { @@ -2752,10 +2825,10 @@ var map_VolumeSource = map[string]string{ "gitRepo": "gitRepo represents a git repository at a particular revision. Deprecated: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", "secret": "secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret", "nfs": "nfs represents an NFS mount on the host that shares a pod's lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", - "iscsi": "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md", - "glusterfs": "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported. More info: https://examples.k8s.io/volumes/glusterfs/README.md", + "iscsi": "iscsi represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes/#iscsi", + "glusterfs": "glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. Deprecated: Glusterfs is deprecated and the in-tree glusterfs type is no longer supported.", "persistentVolumeClaim": "persistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims", - "rbd": "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported. More info: https://examples.k8s.io/volumes/rbd/README.md", + "rbd": "rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. Deprecated: RBD is deprecated and the in-tree rbd type is no longer supported.", "flexVolume": "flexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. Deprecated: FlexVolume is deprecated. Consider using a CSIDriver instead.", "cinder": "cinder represents a cinder volume attached and mounted on kubelets host machine. Deprecated: Cinder is deprecated. All operations for the in-tree cinder type are redirected to the cinder.csi.openstack.org CSI driver. More info: https://examples.k8s.io/mysql-cinder-pd/README.md", "cephfs": "cephFS represents a Ceph FS mount on the host that shares a pod's lifetime. Deprecated: CephFS is deprecated and the in-tree cephfs type is no longer supported.", diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index 619c525427..bcd91bd019 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -829,6 +829,13 @@ func (in *Container) DeepCopyInto(out *Container) { *out = new(ContainerRestartPolicy) **out = **in } + if in.RestartPolicyRules != nil { + in, out := &in.RestartPolicyRules, &out.RestartPolicyRules + *out = make([]ContainerRestartRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts *out = make([]VolumeMount, len(*in)) @@ -879,6 +886,22 @@ func (in *Container) DeepCopy() *Container { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerExtendedResourceRequest) DeepCopyInto(out *ContainerExtendedResourceRequest) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerExtendedResourceRequest. +func (in *ContainerExtendedResourceRequest) DeepCopy() *ContainerExtendedResourceRequest { + if in == nil { + return nil + } + out := new(ContainerExtendedResourceRequest) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContainerImage) DeepCopyInto(out *ContainerImage) { *out = *in @@ -932,6 +955,48 @@ func (in *ContainerResizePolicy) DeepCopy() *ContainerResizePolicy { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerRestartRule) DeepCopyInto(out *ContainerRestartRule) { + *out = *in + if in.ExitCodes != nil { + in, out := &in.ExitCodes, &out.ExitCodes + *out = new(ContainerRestartRuleOnExitCodes) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerRestartRule. +func (in *ContainerRestartRule) DeepCopy() *ContainerRestartRule { + if in == nil { + return nil + } + out := new(ContainerRestartRule) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerRestartRuleOnExitCodes) DeepCopyInto(out *ContainerRestartRuleOnExitCodes) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]int32, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerRestartRuleOnExitCodes. +func (in *ContainerRestartRuleOnExitCodes) DeepCopy() *ContainerRestartRuleOnExitCodes { + if in == nil { + return nil + } + out := new(ContainerRestartRuleOnExitCodes) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContainerState) DeepCopyInto(out *ContainerState) { *out = *in @@ -1433,6 +1498,11 @@ func (in *EnvVarSource) DeepCopyInto(out *EnvVarSource) { *out = new(SecretKeySelector) (*in).DeepCopyInto(*out) } + if in.FileKeyRef != nil { + in, out := &in.FileKeyRef, &out.FileKeyRef + *out = new(FileKeySelector) + (*in).DeepCopyInto(*out) + } return } @@ -1506,6 +1576,13 @@ func (in *EphemeralContainerCommon) DeepCopyInto(out *EphemeralContainerCommon) *out = new(ContainerRestartPolicy) **out = **in } + if in.RestartPolicyRules != nil { + in, out := &in.RestartPolicyRules, &out.RestartPolicyRules + *out = make([]ContainerRestartRule, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts *out = make([]VolumeMount, len(*in)) @@ -1736,6 +1813,27 @@ func (in *FCVolumeSource) DeepCopy() *FCVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FileKeySelector) DeepCopyInto(out *FileKeySelector) { + *out = *in + if in.Optional != nil { + in, out := &in.Optional, &out.Optional + *out = new(bool) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FileKeySelector. +func (in *FileKeySelector) DeepCopy() *FileKeySelector { + if in == nil { + return nil + } + out := new(FileKeySelector) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FlexPersistentVolumeSource) DeepCopyInto(out *FlexPersistentVolumeSource) { *out = *in @@ -3797,6 +3895,27 @@ func (in *PodAttachOptions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodCertificateProjection) DeepCopyInto(out *PodCertificateProjection) { + *out = *in + if in.MaxExpirationSeconds != nil { + in, out := &in.MaxExpirationSeconds, &out.MaxExpirationSeconds + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodCertificateProjection. +func (in *PodCertificateProjection) DeepCopy() *PodCertificateProjection { + if in == nil { + return nil + } + out := new(PodCertificateProjection) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodCondition) DeepCopyInto(out *PodCondition) { *out = *in @@ -3899,6 +4018,27 @@ func (in *PodExecOptions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodExtendedResourceClaimStatus) DeepCopyInto(out *PodExtendedResourceClaimStatus) { + *out = *in + if in.RequestMappings != nil { + in, out := &in.RequestMappings, &out.RequestMappings + *out = make([]ContainerExtendedResourceRequest, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodExtendedResourceClaimStatus. +func (in *PodExtendedResourceClaimStatus) DeepCopy() *PodExtendedResourceClaimStatus { + if in == nil { + return nil + } + out := new(PodExtendedResourceClaimStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodIP) DeepCopyInto(out *PodIP) { *out = *in @@ -4412,6 +4552,11 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { *out = new(ResourceRequirements) (*in).DeepCopyInto(*out) } + if in.HostnameOverride != nil { + in, out := &in.HostnameOverride, &out.HostnameOverride + *out = new(string) + **out = **in + } return } @@ -4477,6 +4622,11 @@ func (in *PodStatus) DeepCopyInto(out *PodStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.ExtendedResourceClaimStatus != nil { + in, out := &in.ExtendedResourceClaimStatus, &out.ExtendedResourceClaimStatus + *out = new(PodExtendedResourceClaimStatus) + (*in).DeepCopyInto(*out) + } return } @@ -6412,6 +6562,11 @@ func (in *VolumeProjection) DeepCopyInto(out *VolumeProjection) { *out = new(ClusterTrustBundleProjection) (*in).DeepCopyInto(*out) } + if in.PodCertificate != nil { + in, out := &in.PodCertificate, &out.PodCertificate + *out = new(PodCertificateProjection) + (*in).DeepCopyInto(*out) + } return } diff --git a/vendor/k8s.io/api/extensions/v1beta1/doc.go b/vendor/k8s.io/api/extensions/v1beta1/doc.go index 7770fab5d2..be710973cb 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/doc.go +++ b/vendor/k8s.io/api/extensions/v1beta1/doc.go @@ -18,5 +18,7 @@ limitations under the License. // +k8s:protobuf-gen=package // +k8s:openapi-gen=true // +k8s:prerelease-lifecycle-gen=true +// +k8s:validation-gen=TypeMeta +// +k8s:validation-gen-input=k8s.io/api/extensions/v1beta1 package v1beta1 diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/vendor/k8s.io/api/extensions/v1beta1/generated.proto index 70fcec0cc5..fed0b4835d 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -980,7 +980,7 @@ message RollingUpdateDaemonSet { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may @@ -1039,6 +1039,9 @@ message Scale { message ScaleSpec { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 optional int32 replicas = 1; } diff --git a/vendor/k8s.io/api/extensions/v1beta1/types.go b/vendor/k8s.io/api/extensions/v1beta1/types.go index b80a7a7e16..c7b50e0590 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -27,6 +27,9 @@ import ( type ScaleSpec struct { // desired number of instances for the scaled object. // +optional + // +k8s:optional + // +default=0 + // +k8s:minimum=0 Replicas int32 `json:"replicas,omitempty" protobuf:"varint,1,opt,name=replicas"` } @@ -54,6 +57,7 @@ type ScaleStatus struct { // +k8s:prerelease-lifecycle-gen:introduced=1.1 // +k8s:prerelease-lifecycle-gen:deprecated=1.2 // +k8s:prerelease-lifecycle-gen:removed=1.16 +// +k8s:isSubresource=/scale // represents a scaling request for a resource. type Scale struct { @@ -398,7 +402,7 @@ type RollingUpdateDaemonSet struct { // pod is available (Ready for at least minReadySeconds) the old DaemonSet pod // on that node is marked deleted. If the old pod becomes unavailable for any // reason (Ready transitions to false, is evicted, or is drained) an updated - // pod is immediatedly created on that node without considering surge limits. + // pod is immediately created on that node without considering surge limits. // Allowing surge implies the possibility that the resources consumed by the // daemonset on any given node can double if the readiness check fails, and // so resource intensive daemonsets should take into account that they may diff --git a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 923fab3aa1..8a158233ef 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -482,7 +482,7 @@ func (RollbackConfig) SwaggerDoc() map[string]string { var map_RollingUpdateDaemonSet = map[string]string{ "": "Spec to control the desired behavior of daemon set rolling update.", "maxUnavailable": "The maximum number of DaemonSet pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of total number of DaemonSet pods at the start of the update (ex: 10%). Absolute number is calculated from percentage by rounding up. This cannot be 0 if MaxSurge is 0 Default value is 1. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their pods stopped for an update at any given time. The update starts by stopping at most 30% of those DaemonSet pods and then brings up new DaemonSet pods in their place. Once the new pods are available, it then proceeds onto other DaemonSet pods, thus ensuring that at least 70% of original number of DaemonSet pods are available at all times during the update.", - "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediatedly created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", + "maxSurge": "The maximum number of nodes with an existing available DaemonSet pod that can have an updated DaemonSet pod during during an update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up to a minimum of 1. Default value is 0. Example: when this is set to 30%, at most 30% of the total number of nodes that should be running the daemon pod (i.e. status.desiredNumberScheduled) can have their a new pod created before the old pod is marked as deleted. The update starts by launching new pods on 30% of nodes. Once an updated pod is available (Ready for at least minReadySeconds) the old DaemonSet pod on that node is marked deleted. If the old pod becomes unavailable for any reason (Ready transitions to false, is evicted, or is drained) an updated pod is immediately created on that node without considering surge limits. Allowing surge implies the possibility that the resources consumed by the daemonset on any given node can double if the readiness check fails, and so resource intensive daemonsets should take into account that they may cause evictions during disruption. This is an alpha field and requires enabling DaemonSetUpdateSurge feature gate.", } func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.validations.go b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.validations.go new file mode 100644 index 0000000000..6d2a1666ae --- /dev/null +++ b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.validations.go @@ -0,0 +1,78 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by validation-gen. DO NOT EDIT. + +package v1beta1 + +import ( + context "context" + fmt "fmt" + + operation "k8s.io/apimachinery/pkg/api/operation" + safe "k8s.io/apimachinery/pkg/api/safe" + validate "k8s.io/apimachinery/pkg/api/validate" + runtime "k8s.io/apimachinery/pkg/runtime" + field "k8s.io/apimachinery/pkg/util/validation/field" +) + +func init() { localSchemeBuilder.Register(RegisterValidations) } + +// RegisterValidations adds validation functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterValidations(scheme *runtime.Scheme) error { + scheme.AddValidationFunc((*Scale)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList { + switch op.Request.SubresourcePath() { + case "/scale": + return Validate_Scale(ctx, op, nil /* fldPath */, obj.(*Scale), safe.Cast[*Scale](oldObj)) + } + return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))} + }) + return nil +} + +func Validate_Scale(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Scale) (errs field.ErrorList) { + // field Scale.TypeMeta has no validation + // field Scale.ObjectMeta has no validation + + // field Scale.Spec + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *ScaleSpec) (errs field.ErrorList) { + errs = append(errs, Validate_ScaleSpec(ctx, op, fldPath, obj, oldObj)...) + return + }(fldPath.Child("spec"), &obj.Spec, safe.Field(oldObj, func(oldObj *Scale) *ScaleSpec { return &oldObj.Spec }))...) + + // field Scale.Status has no validation + return errs +} + +func Validate_ScaleSpec(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ScaleSpec) (errs field.ErrorList) { + // field ScaleSpec.Replicas + errs = append(errs, + func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) { + // optional value-type fields with zero-value defaults are purely documentation + if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) { + return nil // no changes + } + errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...) + return + }(fldPath.Child("replicas"), &obj.Replicas, safe.Field(oldObj, func(oldObj *ScaleSpec) *int32 { return &oldObj.Replicas }))...) + + return errs +} diff --git a/vendor/k8s.io/api/networking/v1/generated.proto b/vendor/k8s.io/api/networking/v1/generated.proto index e3e3e9215e..16a2792aa6 100644 --- a/vendor/k8s.io/api/networking/v1/generated.proto +++ b/vendor/k8s.io/api/networking/v1/generated.proto @@ -534,11 +534,12 @@ message NetworkPolicyPort { // NetworkPolicySpec provides the specification of a NetworkPolicy message NetworkPolicySpec { // podSelector selects the pods to which this NetworkPolicy object applies. - // The array of ingress rules is applied to any pods selected by this field. + // The array of rules is applied to any pods selected by this field. An empty + // selector matches all pods in the policy's namespace. // Multiple network policies can select the same set of pods. In this case, // the ingress rules for each are combined additively. - // This field is NOT optional and follows standard label selector semantics. - // An empty podSelector matches all pods in this namespace. + // This field is optional. If it is not specified, it defaults to an empty selector. + // +optional optional .k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector podSelector = 1; // ingress is a list of ingress rules to be applied to the selected pods. diff --git a/vendor/k8s.io/api/networking/v1/types.go b/vendor/k8s.io/api/networking/v1/types.go index 216647ceeb..7d9a4fc94c 100644 --- a/vendor/k8s.io/api/networking/v1/types.go +++ b/vendor/k8s.io/api/networking/v1/types.go @@ -60,11 +60,12 @@ const ( // NetworkPolicySpec provides the specification of a NetworkPolicy type NetworkPolicySpec struct { // podSelector selects the pods to which this NetworkPolicy object applies. - // The array of ingress rules is applied to any pods selected by this field. + // The array of rules is applied to any pods selected by this field. An empty + // selector matches all pods in the policy's namespace. // Multiple network policies can select the same set of pods. In this case, // the ingress rules for each are combined additively. - // This field is NOT optional and follows standard label selector semantics. - // An empty podSelector matches all pods in this namespace. + // This field is optional. If it is not specified, it defaults to an empty selector. + // +optional PodSelector metav1.LabelSelector `json:"podSelector" protobuf:"bytes,1,opt,name=podSelector"` // ingress is a list of ingress rules to be applied to the selected pods. diff --git a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index 0e294848ba..6210bb7a5a 100644 --- a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -313,7 +313,7 @@ func (NetworkPolicyPort) SwaggerDoc() map[string]string { var map_NetworkPolicySpec = map[string]string{ "": "NetworkPolicySpec provides the specification of a NetworkPolicy", - "podSelector": "podSelector selects the pods to which this NetworkPolicy object applies. The array of ingress rules is applied to any pods selected by this field. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is NOT optional and follows standard label selector semantics. An empty podSelector matches all pods in this namespace.", + "podSelector": "podSelector selects the pods to which this NetworkPolicy object applies. The array of rules is applied to any pods selected by this field. An empty selector matches all pods in the policy's namespace. Multiple network policies can select the same set of pods. In this case, the ingress rules for each are combined additively. This field is optional. If it is not specified, it defaults to an empty selector.", "ingress": "ingress is a list of ingress rules to be applied to the selected pods. Traffic is allowed to a pod if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic source is the pod's local node, OR if the traffic matches at least one ingress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy does not allow any traffic (and serves solely to ensure that the pods it selects are isolated by default)", "egress": "egress is a list of egress rules to be applied to the selected pods. Outgoing traffic is allowed if there are no NetworkPolicies selecting the pod (and cluster policy otherwise allows the traffic), OR if the traffic matches at least one egress rule across all of the NetworkPolicy objects whose podSelector matches the pod. If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). This field is beta-level in 1.8", "policyTypes": "policyTypes is a list of rule types that the NetworkPolicy relates to. Valid options are [\"Ingress\"], [\"Egress\"], or [\"Ingress\", \"Egress\"]. If this field is not specified, it will default based on the existence of ingress or egress rules; policies that contain an egress section are assumed to affect egress, and all policies (whether or not they contain an ingress section) are assumed to affect ingress. If you want to write an egress-only policy, you must explicitly specify policyTypes [ \"Egress\" ]. Likewise, if you want to write a policy that specifies that no egress is allowed, you must specify a policyTypes value that include \"Egress\" (since such a policy would not include an egress section and would otherwise default to just [ \"Ingress\" ]). This field is beta-level in 1.8", diff --git a/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go b/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go deleted file mode 100644 index 0d42034837..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/generated.pb.go +++ /dev/null @@ -1,1929 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: k8s.io/api/networking/v1alpha1/generated.proto - -package v1alpha1 - -import ( - fmt "fmt" - - io "io" - - proto "github.com/gogo/protobuf/proto" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - math "math" - math_bits "math/bits" - reflect "reflect" - strings "strings" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -func (m *IPAddress) Reset() { *m = IPAddress{} } -func (*IPAddress) ProtoMessage() {} -func (*IPAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{0} -} -func (m *IPAddress) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IPAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *IPAddress) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAddress.Merge(m, src) -} -func (m *IPAddress) XXX_Size() int { - return m.Size() -} -func (m *IPAddress) XXX_DiscardUnknown() { - xxx_messageInfo_IPAddress.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAddress proto.InternalMessageInfo - -func (m *IPAddressList) Reset() { *m = IPAddressList{} } -func (*IPAddressList) ProtoMessage() {} -func (*IPAddressList) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{1} -} -func (m *IPAddressList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IPAddressList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *IPAddressList) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAddressList.Merge(m, src) -} -func (m *IPAddressList) XXX_Size() int { - return m.Size() -} -func (m *IPAddressList) XXX_DiscardUnknown() { - xxx_messageInfo_IPAddressList.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAddressList proto.InternalMessageInfo - -func (m *IPAddressSpec) Reset() { *m = IPAddressSpec{} } -func (*IPAddressSpec) ProtoMessage() {} -func (*IPAddressSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{2} -} -func (m *IPAddressSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *IPAddressSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *IPAddressSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAddressSpec.Merge(m, src) -} -func (m *IPAddressSpec) XXX_Size() int { - return m.Size() -} -func (m *IPAddressSpec) XXX_DiscardUnknown() { - xxx_messageInfo_IPAddressSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAddressSpec proto.InternalMessageInfo - -func (m *ParentReference) Reset() { *m = ParentReference{} } -func (*ParentReference) ProtoMessage() {} -func (*ParentReference) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{3} -} -func (m *ParentReference) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ParentReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ParentReference) XXX_Merge(src proto.Message) { - xxx_messageInfo_ParentReference.Merge(m, src) -} -func (m *ParentReference) XXX_Size() int { - return m.Size() -} -func (m *ParentReference) XXX_DiscardUnknown() { - xxx_messageInfo_ParentReference.DiscardUnknown(m) -} - -var xxx_messageInfo_ParentReference proto.InternalMessageInfo - -func (m *ServiceCIDR) Reset() { *m = ServiceCIDR{} } -func (*ServiceCIDR) ProtoMessage() {} -func (*ServiceCIDR) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{4} -} -func (m *ServiceCIDR) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDR) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDR) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDR.Merge(m, src) -} -func (m *ServiceCIDR) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDR) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDR.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDR proto.InternalMessageInfo - -func (m *ServiceCIDRList) Reset() { *m = ServiceCIDRList{} } -func (*ServiceCIDRList) ProtoMessage() {} -func (*ServiceCIDRList) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{5} -} -func (m *ServiceCIDRList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDRList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDRList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDRList.Merge(m, src) -} -func (m *ServiceCIDRList) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDRList) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDRList.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDRList proto.InternalMessageInfo - -func (m *ServiceCIDRSpec) Reset() { *m = ServiceCIDRSpec{} } -func (*ServiceCIDRSpec) ProtoMessage() {} -func (*ServiceCIDRSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{6} -} -func (m *ServiceCIDRSpec) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDRSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDRSpec) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDRSpec.Merge(m, src) -} -func (m *ServiceCIDRSpec) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDRSpec) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDRSpec.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDRSpec proto.InternalMessageInfo - -func (m *ServiceCIDRStatus) Reset() { *m = ServiceCIDRStatus{} } -func (*ServiceCIDRStatus) ProtoMessage() {} -func (*ServiceCIDRStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_c1cb39e7b48ce50d, []int{7} -} -func (m *ServiceCIDRStatus) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ServiceCIDRStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *ServiceCIDRStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceCIDRStatus.Merge(m, src) -} -func (m *ServiceCIDRStatus) XXX_Size() int { - return m.Size() -} -func (m *ServiceCIDRStatus) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceCIDRStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceCIDRStatus proto.InternalMessageInfo - -func init() { - proto.RegisterType((*IPAddress)(nil), "k8s.io.api.networking.v1alpha1.IPAddress") - proto.RegisterType((*IPAddressList)(nil), "k8s.io.api.networking.v1alpha1.IPAddressList") - proto.RegisterType((*IPAddressSpec)(nil), "k8s.io.api.networking.v1alpha1.IPAddressSpec") - proto.RegisterType((*ParentReference)(nil), "k8s.io.api.networking.v1alpha1.ParentReference") - proto.RegisterType((*ServiceCIDR)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDR") - proto.RegisterType((*ServiceCIDRList)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDRList") - proto.RegisterType((*ServiceCIDRSpec)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDRSpec") - proto.RegisterType((*ServiceCIDRStatus)(nil), "k8s.io.api.networking.v1alpha1.ServiceCIDRStatus") -} - -func init() { - proto.RegisterFile("k8s.io/api/networking/v1alpha1/generated.proto", fileDescriptor_c1cb39e7b48ce50d) -} - -var fileDescriptor_c1cb39e7b48ce50d = []byte{ - // 634 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcd, 0x6e, 0xd3, 0x4a, - 0x18, 0x8d, 0xdb, 0xa4, 0xaa, 0x27, 0xb7, 0xb7, 0xb7, 0x5e, 0x45, 0x5d, 0x38, 0x91, 0xef, 0xa6, - 0x08, 0x3a, 0x26, 0x11, 0x42, 0x6c, 0x71, 0x2b, 0xa1, 0x4a, 0xd0, 0x96, 0xe9, 0x0a, 0xd4, 0x05, - 0xd3, 0xc9, 0x57, 0x67, 0x08, 0xfe, 0xd1, 0xcc, 0x24, 0xc0, 0x8e, 0x47, 0xe0, 0x05, 0x78, 0x0e, - 0x56, 0x20, 0xb1, 0xeb, 0xb2, 0xcb, 0xae, 0x2a, 0x6a, 0x5e, 0x04, 0xcd, 0xd8, 0xb1, 0x93, 0x46, - 0xfd, 0xdb, 0x74, 0xe7, 0xef, 0xcc, 0x39, 0x67, 0xbe, 0xf3, 0xcd, 0x8c, 0x8c, 0xf0, 0xf0, 0x99, - 0xc4, 0x3c, 0xf1, 0x69, 0xca, 0xfd, 0x18, 0xd4, 0xc7, 0x44, 0x0c, 0x79, 0x1c, 0xfa, 0xe3, 0x2e, - 0xfd, 0x90, 0x0e, 0x68, 0xd7, 0x0f, 0x21, 0x06, 0x41, 0x15, 0xf4, 0x71, 0x2a, 0x12, 0x95, 0x38, - 0x6e, 0xce, 0xc7, 0x34, 0xe5, 0xb8, 0xe2, 0xe3, 0x09, 0x7f, 0x7d, 0x33, 0xe4, 0x6a, 0x30, 0x3a, - 0xc2, 0x2c, 0x89, 0xfc, 0x30, 0x09, 0x13, 0xdf, 0xc8, 0x8e, 0x46, 0xc7, 0xa6, 0x32, 0x85, 0xf9, - 0xca, 0xed, 0xd6, 0x9f, 0x54, 0xdb, 0x47, 0x94, 0x0d, 0x78, 0x0c, 0xe2, 0xb3, 0x9f, 0x0e, 0x43, - 0x0d, 0x48, 0x3f, 0x02, 0x45, 0xfd, 0xf1, 0x5c, 0x13, 0xeb, 0xfe, 0x55, 0x2a, 0x31, 0x8a, 0x15, - 0x8f, 0x60, 0x4e, 0xf0, 0xf4, 0x26, 0x81, 0x64, 0x03, 0x88, 0xe8, 0x65, 0x9d, 0xf7, 0xd3, 0x42, - 0xf6, 0xce, 0xfe, 0xf3, 0x7e, 0x5f, 0x80, 0x94, 0xce, 0x3b, 0xb4, 0xac, 0x3b, 0xea, 0x53, 0x45, - 0x5b, 0x56, 0xc7, 0xda, 0x68, 0xf6, 0x1e, 0xe3, 0x6a, 0x1c, 0xa5, 0x31, 0x4e, 0x87, 0xa1, 0x06, - 0x24, 0xd6, 0x6c, 0x3c, 0xee, 0xe2, 0xbd, 0xa3, 0xf7, 0xc0, 0xd4, 0x2b, 0x50, 0x34, 0x70, 0x4e, - 0xce, 0xdb, 0xb5, 0xec, 0xbc, 0x8d, 0x2a, 0x8c, 0x94, 0xae, 0xce, 0x1e, 0xaa, 0xcb, 0x14, 0x58, - 0x6b, 0xc1, 0xb8, 0x6f, 0xe2, 0xeb, 0x87, 0x8d, 0xcb, 0xd6, 0x0e, 0x52, 0x60, 0xc1, 0x3f, 0x85, - 0x75, 0x5d, 0x57, 0xc4, 0x18, 0x79, 0x3f, 0x2c, 0xb4, 0x52, 0xb2, 0x5e, 0x72, 0xa9, 0x9c, 0xc3, - 0xb9, 0x10, 0xf8, 0x76, 0x21, 0xb4, 0xda, 0x44, 0xf8, 0xaf, 0xd8, 0x67, 0x79, 0x82, 0x4c, 0x05, - 0xd8, 0x45, 0x0d, 0xae, 0x20, 0x92, 0xad, 0x85, 0xce, 0xe2, 0x46, 0xb3, 0xf7, 0xe0, 0xd6, 0x09, - 0x82, 0x95, 0xc2, 0xb5, 0xb1, 0xa3, 0xf5, 0x24, 0xb7, 0xf1, 0xa2, 0xa9, 0xf6, 0x75, 0x2c, 0xe7, - 0x10, 0xd9, 0x29, 0x15, 0x10, 0x2b, 0x02, 0xc7, 0x45, 0xff, 0xfe, 0x4d, 0x9b, 0xec, 0x4f, 0x04, - 0x20, 0x20, 0x66, 0x10, 0xac, 0x64, 0xe7, 0x6d, 0xbb, 0x04, 0x49, 0x65, 0xe8, 0x7d, 0xb7, 0xd0, - 0xea, 0x25, 0xb6, 0xf3, 0x3f, 0x6a, 0x84, 0x22, 0x19, 0xa5, 0x66, 0x37, 0xbb, 0xea, 0xf3, 0x85, - 0x06, 0x49, 0xbe, 0xe6, 0x3c, 0x42, 0xcb, 0x02, 0x64, 0x32, 0x12, 0x0c, 0xcc, 0xe1, 0xd9, 0xd5, - 0x94, 0x48, 0x81, 0x93, 0x92, 0xe1, 0xf8, 0xc8, 0x8e, 0x69, 0x04, 0x32, 0xa5, 0x0c, 0x5a, 0x8b, - 0x86, 0xbe, 0x56, 0xd0, 0xed, 0xdd, 0xc9, 0x02, 0xa9, 0x38, 0x4e, 0x07, 0xd5, 0x75, 0xd1, 0xaa, - 0x1b, 0x6e, 0x79, 0xd0, 0x9a, 0x4b, 0xcc, 0x8a, 0xf7, 0x6d, 0x01, 0x35, 0x0f, 0x40, 0x8c, 0x39, - 0x83, 0xad, 0x9d, 0x6d, 0x72, 0x0f, 0x77, 0xf5, 0xf5, 0xcc, 0x5d, 0xbd, 0xf1, 0x10, 0xa6, 0x9a, - 0xbb, 0xea, 0xb6, 0x3a, 0x6f, 0xd0, 0x92, 0x54, 0x54, 0x8d, 0xa4, 0x19, 0x4a, 0xb3, 0xd7, 0xbd, - 0x8b, 0xa9, 0x11, 0x06, 0xff, 0x16, 0xb6, 0x4b, 0x79, 0x4d, 0x0a, 0x43, 0xef, 0x97, 0x85, 0x56, - 0xa7, 0xd8, 0xf7, 0xf0, 0x14, 0xf6, 0x67, 0x9f, 0xc2, 0xc3, 0x3b, 0x64, 0xb9, 0xe2, 0x31, 0xf4, - 0x66, 0x22, 0x98, 0xe7, 0xd0, 0x46, 0x0d, 0xc6, 0xfb, 0x42, 0xb6, 0xac, 0xce, 0xe2, 0x86, 0x1d, - 0xd8, 0x5a, 0xa3, 0x17, 0x25, 0xc9, 0x71, 0xef, 0x13, 0x5a, 0x9b, 0x1b, 0x92, 0xc3, 0x10, 0x62, - 0x49, 0xdc, 0xe7, 0x8a, 0x27, 0x71, 0x2e, 0x9d, 0x3d, 0xc0, 0x6b, 0xa2, 0x6f, 0x4d, 0x74, 0xd5, - 0xed, 0x28, 0x21, 0x49, 0xa6, 0x6c, 0x83, 0xed, 0x93, 0x0b, 0xb7, 0x76, 0x7a, 0xe1, 0xd6, 0xce, - 0x2e, 0xdc, 0xda, 0x97, 0xcc, 0xb5, 0x4e, 0x32, 0xd7, 0x3a, 0xcd, 0x5c, 0xeb, 0x2c, 0x73, 0xad, - 0xdf, 0x99, 0x6b, 0x7d, 0xfd, 0xe3, 0xd6, 0xde, 0xba, 0xd7, 0xff, 0x7f, 0xfe, 0x06, 0x00, 0x00, - 0xff, 0xff, 0xb1, 0xd0, 0x33, 0x02, 0xa0, 0x06, 0x00, 0x00, -} - -func (m *IPAddress) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IPAddress) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IPAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *IPAddressList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IPAddressList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IPAddressList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *IPAddressSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *IPAddressSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *IPAddressSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.ParentRef != nil { - { - size, err := m.ParentRef.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ParentReference) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ParentReference) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ParentReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0x22 - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0x1a - i -= len(m.Resource) - copy(dAtA[i:], m.Resource) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resource))) - i-- - dAtA[i] = 0x12 - i -= len(m.Group) - copy(dAtA[i:], m.Group) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Group))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceCIDR) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDR) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDR) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceCIDRList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDRList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDRList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Items) > 0 { - for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ServiceCIDRSpec) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDRSpec) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDRSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.CIDRs) > 0 { - for iNdEx := len(m.CIDRs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.CIDRs[iNdEx]) - copy(dAtA[i:], m.CIDRs[iNdEx]) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.CIDRs[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ServiceCIDRStatus) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ServiceCIDRStatus) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ServiceCIDRStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Conditions) > 0 { - for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - offset -= sovGenerated(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *IPAddress) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *IPAddressList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *IPAddressSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ParentRef != nil { - l = m.ParentRef.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *ParentReference) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Group) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Resource) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ServiceCIDR) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *ServiceCIDRList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ServiceCIDRSpec) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.CIDRs) > 0 { - for _, s := range m.CIDRs { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *ServiceCIDRStatus) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Conditions) > 0 { - for _, e := range m.Conditions { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func sovGenerated(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *IPAddress) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&IPAddress{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "IPAddressSpec", "IPAddressSpec", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *IPAddressList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]IPAddress{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "IPAddress", "IPAddress", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&IPAddressList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *IPAddressSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&IPAddressSpec{`, - `ParentRef:` + strings.Replace(this.ParentRef.String(), "ParentReference", "ParentReference", 1) + `,`, - `}`, - }, "") - return s -} -func (this *ParentReference) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ParentReference{`, - `Group:` + fmt.Sprintf("%v", this.Group) + `,`, - `Resource:` + fmt.Sprintf("%v", this.Resource) + `,`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDR) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ServiceCIDR{`, - `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ServiceCIDRSpec", "ServiceCIDRSpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ServiceCIDRStatus", "ServiceCIDRStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDRList) String() string { - if this == nil { - return "nil" - } - repeatedStringForItems := "[]ServiceCIDR{" - for _, f := range this.Items { - repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ServiceCIDR", "ServiceCIDR", 1), `&`, ``, 1) + "," - } - repeatedStringForItems += "}" - s := strings.Join([]string{`&ServiceCIDRList{`, - `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + repeatedStringForItems + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDRSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ServiceCIDRSpec{`, - `CIDRs:` + fmt.Sprintf("%v", this.CIDRs) + `,`, - `}`, - }, "") - return s -} -func (this *ServiceCIDRStatus) String() string { - if this == nil { - return "nil" - } - repeatedStringForConditions := "[]Condition{" - for _, f := range this.Conditions { - repeatedStringForConditions += fmt.Sprintf("%v", f) + "," - } - repeatedStringForConditions += "}" - s := strings.Join([]string{`&ServiceCIDRStatus{`, - `Conditions:` + repeatedStringForConditions + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *IPAddress) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IPAddress: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IPAddress: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *IPAddressList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IPAddressList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IPAddressList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, IPAddress{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *IPAddressSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: IPAddressSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IPAddressSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ParentRef", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ParentRef == nil { - m.ParentRef = &ParentReference{} - } - if err := m.ParentRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ParentReference) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ParentReference: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ParentReference: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Group = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Resource = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDR) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDR: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDR: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDRList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDRList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDRList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, ServiceCIDR{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDRSpec) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDRSpec: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDRSpec: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CIDRs", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CIDRs = append(m.CIDRs, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ServiceCIDRStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ServiceCIDRStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ServiceCIDRStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Conditions = append(m.Conditions, v1.Condition{}) - if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenerated(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenerated - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenerated - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenerated - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") -) diff --git a/vendor/k8s.io/api/networking/v1alpha1/generated.proto b/vendor/k8s.io/api/networking/v1alpha1/generated.proto deleted file mode 100644 index 80ec6af735..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/generated.proto +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - - -// This file was autogenerated by go-to-protobuf. Do not edit it manually! - -syntax = "proto2"; - -package k8s.io.api.networking.v1alpha1; - -import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; - -// Package-wide variables from generator "generated". -option go_package = "k8s.io/api/networking/v1alpha1"; - -// IPAddress represents a single IP of a single IP Family. The object is designed to be used by APIs -// that operate on IP addresses. The object is used by the Service core API for allocation of IP addresses. -// An IP address can be represented in different formats, to guarantee the uniqueness of the IP, -// the name of the object is the IP address in canonical format, four decimal digits separated -// by dots suppressing leading zeros for IPv4 and the representation defined by RFC 5952 for IPv6. -// Valid: 192.168.1.5 or 2001:db8::1 or 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 -// Invalid: 10.01.2.3 or 2001:db8:0:0:0::1 -message IPAddress { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // spec is the desired state of the IPAddress. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional IPAddressSpec spec = 2; -} - -// IPAddressList contains a list of IPAddress. -message IPAddressList { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // items is the list of IPAddresses. - repeated IPAddress items = 2; -} - -// IPAddressSpec describe the attributes in an IP Address. -message IPAddressSpec { - // ParentRef references the resource that an IPAddress is attached to. - // An IPAddress must reference a parent object. - // +required - optional ParentReference parentRef = 1; -} - -// ParentReference describes a reference to a parent object. -message ParentReference { - // Group is the group of the object being referenced. - // +optional - optional string group = 1; - - // Resource is the resource of the object being referenced. - // +required - optional string resource = 2; - - // Namespace is the namespace of the object being referenced. - // +optional - optional string namespace = 3; - - // Name is the name of the object being referenced. - // +required - optional string name = 4; -} - -// ServiceCIDR defines a range of IP addresses using CIDR format (e.g. 192.168.0.0/24 or 2001:db2::/64). -// This range is used to allocate ClusterIPs to Service objects. -message ServiceCIDR { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // spec is the desired state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional ServiceCIDRSpec spec = 2; - - // status represents the current state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - optional ServiceCIDRStatus status = 3; -} - -// ServiceCIDRList contains a list of ServiceCIDR objects. -message ServiceCIDRList { - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // items is the list of ServiceCIDRs. - repeated ServiceCIDR items = 2; -} - -// ServiceCIDRSpec define the CIDRs the user wants to use for allocating ClusterIPs for Services. -message ServiceCIDRSpec { - // CIDRs defines the IP blocks in CIDR notation (e.g. "192.168.0.0/24" or "2001:db8::/64") - // from which to assign service cluster IPs. Max of two CIDRs is allowed, one of each IP family. - // The network address of each CIDR, the address that identifies the subnet of a host, is reserved - // and will not be allocated. The broadcast address for IPv4 CIDRs is also reserved and will not be - // allocated. - // This field is immutable. - // +optional - // +listType=atomic - repeated string cidrs = 1; -} - -// ServiceCIDRStatus describes the current state of the ServiceCIDR. -message ServiceCIDRStatus { - // conditions holds an array of metav1.Condition that describe the state of the ServiceCIDR. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 1; -} - diff --git a/vendor/k8s.io/api/networking/v1alpha1/types.go b/vendor/k8s.io/api/networking/v1alpha1/types.go deleted file mode 100644 index 0e454f0263..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/types.go +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright 2022 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// IPAddress represents a single IP of a single IP Family. The object is designed to be used by APIs -// that operate on IP addresses. The object is used by the Service core API for allocation of IP addresses. -// An IP address can be represented in different formats, to guarantee the uniqueness of the IP, -// the name of the object is the IP address in canonical format, four decimal digits separated -// by dots suppressing leading zeros for IPv4 and the representation defined by RFC 5952 for IPv6. -// Valid: 192.168.1.5 or 2001:db8::1 or 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 -// Invalid: 10.01.2.3 or 2001:db8:0:0:0::1 -type IPAddress struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // spec is the desired state of the IPAddress. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Spec IPAddressSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` -} - -// IPAddressSpec describe the attributes in an IP Address. -type IPAddressSpec struct { - // ParentRef references the resource that an IPAddress is attached to. - // An IPAddress must reference a parent object. - // +required - ParentRef *ParentReference `json:"parentRef,omitempty" protobuf:"bytes,1,opt,name=parentRef"` -} - -// ParentReference describes a reference to a parent object. -type ParentReference struct { - // Group is the group of the object being referenced. - // +optional - Group string `json:"group,omitempty" protobuf:"bytes,1,opt,name=group"` - // Resource is the resource of the object being referenced. - // +required - Resource string `json:"resource,omitempty" protobuf:"bytes,2,opt,name=resource"` - // Namespace is the namespace of the object being referenced. - // +optional - Namespace string `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"` - // Name is the name of the object being referenced. - // +required - Name string `json:"name,omitempty" protobuf:"bytes,4,opt,name=name"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// IPAddressList contains a list of IPAddress. -type IPAddressList struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // items is the list of IPAddresses. - Items []IPAddress `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// +genclient -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// ServiceCIDR defines a range of IP addresses using CIDR format (e.g. 192.168.0.0/24 or 2001:db2::/64). -// This range is used to allocate ClusterIPs to Service objects. -type ServiceCIDR struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // spec is the desired state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Spec ServiceCIDRSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` - // status represents the current state of the ServiceCIDR. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status - // +optional - Status ServiceCIDRStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` -} - -// ServiceCIDRSpec define the CIDRs the user wants to use for allocating ClusterIPs for Services. -type ServiceCIDRSpec struct { - // CIDRs defines the IP blocks in CIDR notation (e.g. "192.168.0.0/24" or "2001:db8::/64") - // from which to assign service cluster IPs. Max of two CIDRs is allowed, one of each IP family. - // The network address of each CIDR, the address that identifies the subnet of a host, is reserved - // and will not be allocated. The broadcast address for IPv4 CIDRs is also reserved and will not be - // allocated. - // This field is immutable. - // +optional - // +listType=atomic - CIDRs []string `json:"cidrs,omitempty" protobuf:"bytes,1,opt,name=cidrs"` -} - -const ( - // ServiceCIDRConditionReady represents status of a ServiceCIDR that is ready to be used by the - // apiserver to allocate ClusterIPs for Services. - ServiceCIDRConditionReady = "Ready" - // ServiceCIDRReasonTerminating represents a reason where a ServiceCIDR is not ready because it is - // being deleted. - ServiceCIDRReasonTerminating = "Terminating" -) - -// ServiceCIDRStatus describes the current state of the ServiceCIDR. -type ServiceCIDRStatus struct { - // conditions holds an array of metav1.Condition that describe the state of the ServiceCIDR. - // Current service state - // +optional - // +patchMergeKey=type - // +patchStrategy=merge - // +listType=map - // +listMapKey=type - Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// +k8s:prerelease-lifecycle-gen:introduced=1.27 - -// ServiceCIDRList contains a list of ServiceCIDR objects. -type ServiceCIDRList struct { - metav1.TypeMeta `json:",inline"` - // Standard object's metadata. - // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata - // +optional - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // items is the list of ServiceCIDRs. - Items []ServiceCIDR `json:"items" protobuf:"bytes,2,rep,name=items"` -} diff --git a/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go deleted file mode 100644 index 4c8eb57a7a..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -// This file contains a collection of methods that can be used from go-restful to -// generate Swagger API documentation for its models. Please read this PR for more -// information on the implementation: https://github.com/emicklei/go-restful/pull/215 -// -// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if -// they are on one line! For multiple line or blocks that you want to ignore use ---. -// Any context after a --- is ignored. -// -// Those methods can be generated by using hack/update-codegen.sh - -// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. -var map_IPAddress = map[string]string{ - "": "IPAddress represents a single IP of a single IP Family. The object is designed to be used by APIs that operate on IP addresses. The object is used by the Service core API for allocation of IP addresses. An IP address can be represented in different formats, to guarantee the uniqueness of the IP, the name of the object is the IP address in canonical format, four decimal digits separated by dots suppressing leading zeros for IPv4 and the representation defined by RFC 5952 for IPv6. Valid: 192.168.1.5 or 2001:db8::1 or 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 Invalid: 10.01.2.3 or 2001:db8:0:0:0::1", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "spec": "spec is the desired state of the IPAddress. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (IPAddress) SwaggerDoc() map[string]string { - return map_IPAddress -} - -var map_IPAddressList = map[string]string{ - "": "IPAddressList contains a list of IPAddress.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "items": "items is the list of IPAddresses.", -} - -func (IPAddressList) SwaggerDoc() map[string]string { - return map_IPAddressList -} - -var map_IPAddressSpec = map[string]string{ - "": "IPAddressSpec describe the attributes in an IP Address.", - "parentRef": "ParentRef references the resource that an IPAddress is attached to. An IPAddress must reference a parent object.", -} - -func (IPAddressSpec) SwaggerDoc() map[string]string { - return map_IPAddressSpec -} - -var map_ParentReference = map[string]string{ - "": "ParentReference describes a reference to a parent object.", - "group": "Group is the group of the object being referenced.", - "resource": "Resource is the resource of the object being referenced.", - "namespace": "Namespace is the namespace of the object being referenced.", - "name": "Name is the name of the object being referenced.", -} - -func (ParentReference) SwaggerDoc() map[string]string { - return map_ParentReference -} - -var map_ServiceCIDR = map[string]string{ - "": "ServiceCIDR defines a range of IP addresses using CIDR format (e.g. 192.168.0.0/24 or 2001:db2::/64). This range is used to allocate ClusterIPs to Service objects.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "spec": "spec is the desired state of the ServiceCIDR. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", - "status": "status represents the current state of the ServiceCIDR. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status", -} - -func (ServiceCIDR) SwaggerDoc() map[string]string { - return map_ServiceCIDR -} - -var map_ServiceCIDRList = map[string]string{ - "": "ServiceCIDRList contains a list of ServiceCIDR objects.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "items": "items is the list of ServiceCIDRs.", -} - -func (ServiceCIDRList) SwaggerDoc() map[string]string { - return map_ServiceCIDRList -} - -var map_ServiceCIDRSpec = map[string]string{ - "": "ServiceCIDRSpec define the CIDRs the user wants to use for allocating ClusterIPs for Services.", - "cidrs": "CIDRs defines the IP blocks in CIDR notation (e.g. \"192.168.0.0/24\" or \"2001:db8::/64\") from which to assign service cluster IPs. Max of two CIDRs is allowed, one of each IP family. The network address of each CIDR, the address that identifies the subnet of a host, is reserved and will not be allocated. The broadcast address for IPv4 CIDRs is also reserved and will not be allocated. This field is immutable.", -} - -func (ServiceCIDRSpec) SwaggerDoc() map[string]string { - return map_ServiceCIDRSpec -} - -var map_ServiceCIDRStatus = map[string]string{ - "": "ServiceCIDRStatus describes the current state of the ServiceCIDR.", - "conditions": "conditions holds an array of metav1.Condition that describe the state of the ServiceCIDR. Current service state", -} - -func (ServiceCIDRStatus) SwaggerDoc() map[string]string { - return map_ServiceCIDRStatus -} - -// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go b/vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go deleted file mode 100644 index 5f9c23f708..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2023 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -const ( - - // TODO: Use IPFamily as field with a field selector,And the value is set based on - // the name at create time and immutable. - // LabelIPAddressFamily is used to indicate the IP family of a Kubernetes IPAddress. - // This label simplify dual-stack client operations allowing to obtain the list of - // IP addresses filtered by family. - LabelIPAddressFamily = "ipaddress.kubernetes.io/ip-family" - // LabelManagedBy is used to indicate the controller or entity that manages - // an IPAddress. This label aims to enable different IPAddress - // objects to be managed by different controllers or entities within the - // same cluster. It is highly recommended to configure this label for all - // IPAddress objects. - LabelManagedBy = "ipaddress.kubernetes.io/managed-by" -) diff --git a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 5c8f697ba3..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,229 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPAddress) DeepCopyInto(out *IPAddress) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddress. -func (in *IPAddress) DeepCopy() *IPAddress { - if in == nil { - return nil - } - out := new(IPAddress) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *IPAddress) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPAddressList) DeepCopyInto(out *IPAddressList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]IPAddress, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressList. -func (in *IPAddressList) DeepCopy() *IPAddressList { - if in == nil { - return nil - } - out := new(IPAddressList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *IPAddressList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPAddressSpec) DeepCopyInto(out *IPAddressSpec) { - *out = *in - if in.ParentRef != nil { - in, out := &in.ParentRef, &out.ParentRef - *out = new(ParentReference) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAddressSpec. -func (in *IPAddressSpec) DeepCopy() *IPAddressSpec { - if in == nil { - return nil - } - out := new(IPAddressSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ParentReference) DeepCopyInto(out *ParentReference) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParentReference. -func (in *ParentReference) DeepCopy() *ParentReference { - if in == nil { - return nil - } - out := new(ParentReference) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDR) DeepCopyInto(out *ServiceCIDR) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDR. -func (in *ServiceCIDR) DeepCopy() *ServiceCIDR { - if in == nil { - return nil - } - out := new(ServiceCIDR) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ServiceCIDR) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDRList) DeepCopyInto(out *ServiceCIDRList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ServiceCIDR, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDRList. -func (in *ServiceCIDRList) DeepCopy() *ServiceCIDRList { - if in == nil { - return nil - } - out := new(ServiceCIDRList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ServiceCIDRList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDRSpec) DeepCopyInto(out *ServiceCIDRSpec) { - *out = *in - if in.CIDRs != nil { - in, out := &in.CIDRs, &out.CIDRs - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDRSpec. -func (in *ServiceCIDRSpec) DeepCopy() *ServiceCIDRSpec { - if in == nil { - return nil - } - out := new(ServiceCIDRSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceCIDRStatus) DeepCopyInto(out *ServiceCIDRStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceCIDRStatus. -func (in *ServiceCIDRStatus) DeepCopy() *ServiceCIDRStatus { - if in == nil { - return nil - } - out := new(ServiceCIDRStatus) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go b/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go deleted file mode 100644 index 714e7b6253..0000000000 --- a/vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go +++ /dev/null @@ -1,94 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by prerelease-lifecycle-gen. DO NOT EDIT. - -package v1alpha1 - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *IPAddress) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *IPAddress) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *IPAddress) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *IPAddressList) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *IPAddressList) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *IPAddressList) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *ServiceCIDR) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *ServiceCIDR) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *ServiceCIDR) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} - -// APILifecycleIntroduced is an autogenerated function, returning the release in which the API struct was introduced as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:introduced" tags in types.go. -func (in *ServiceCIDRList) APILifecycleIntroduced() (major, minor int) { - return 1, 27 -} - -// APILifecycleDeprecated is an autogenerated function, returning the release in which the API struct was or will be deprecated as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:deprecated" tags in types.go or "k8s:prerelease-lifecycle-gen:introduced" plus three minor. -func (in *ServiceCIDRList) APILifecycleDeprecated() (major, minor int) { - return 1, 30 -} - -// APILifecycleRemoved is an autogenerated function, returning the release in which the API is no longer served as int versions of major and minor for comparison. -// It is controlled by "k8s:prerelease-lifecycle-gen:removed" tags in types.go or "k8s:prerelease-lifecycle-gen:deprecated" plus three minor. -func (in *ServiceCIDRList) APILifecycleRemoved() (major, minor int) { - return 1, 33 -} diff --git a/vendor/k8s.io/api/resource/v1/devicetaint.go b/vendor/k8s.io/api/resource/v1/devicetaint.go new file mode 100644 index 0000000000..a5c2e20a6e --- /dev/null +++ b/vendor/k8s.io/api/resource/v1/devicetaint.go @@ -0,0 +1,35 @@ +/* +Copyright 2025 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import "fmt" + +var _ fmt.Stringer = DeviceTaint{} + +// String converts to a string in the format '=:', '=:', ':', or ''. +func (t DeviceTaint) String() string { + if len(t.Effect) == 0 { + if len(t.Value) == 0 { + return fmt.Sprintf("%v", t.Key) + } + return fmt.Sprintf("%v=%v:", t.Key, t.Value) + } + if len(t.Value) == 0 { + return fmt.Sprintf("%v:%v", t.Key, t.Effect) + } + return fmt.Sprintf("%v=%v:%v", t.Key, t.Value, t.Effect) +} diff --git a/vendor/k8s.io/api/networking/v1alpha1/doc.go b/vendor/k8s.io/api/resource/v1/doc.go similarity index 83% rename from vendor/k8s.io/api/networking/v1alpha1/doc.go rename to vendor/k8s.io/api/resource/v1/doc.go index 55264ae707..c94ca75ddc 100644 --- a/vendor/k8s.io/api/networking/v1alpha1/doc.go +++ b/vendor/k8s.io/api/resource/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2022 The Kubernetes Authors. +Copyright 2025 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,10 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ +// +k8s:openapi-gen=true // +k8s:deepcopy-gen=package // +k8s:protobuf-gen=package -// +k8s:openapi-gen=true // +k8s:prerelease-lifecycle-gen=true -// +groupName=networking.k8s.io +// +groupName=resource.k8s.io -package v1alpha1 +// Package v1 is the v1 version of the resource API. +package v1 diff --git a/vendor/k8s.io/api/resource/v1/generated.pb.go b/vendor/k8s.io/api/resource/v1/generated.pb.go new file mode 100644 index 0000000000..5695e2c7e0 --- /dev/null +++ b/vendor/k8s.io/api/resource/v1/generated.pb.go @@ -0,0 +1,12777 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: k8s.io/api/resource/v1/generated.proto + +package v1 + +import ( + fmt "fmt" + + io "io" + + proto "github.com/gogo/protobuf/proto" + github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + v11 "k8s.io/api/core/v1" + resource "k8s.io/apimachinery/pkg/api/resource" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" + + k8s_io_apimachinery_pkg_types "k8s.io/apimachinery/pkg/types" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func (m *AllocatedDeviceStatus) Reset() { *m = AllocatedDeviceStatus{} } +func (*AllocatedDeviceStatus) ProtoMessage() {} +func (*AllocatedDeviceStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{0} +} +func (m *AllocatedDeviceStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocatedDeviceStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AllocatedDeviceStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocatedDeviceStatus.Merge(m, src) +} +func (m *AllocatedDeviceStatus) XXX_Size() int { + return m.Size() +} +func (m *AllocatedDeviceStatus) XXX_DiscardUnknown() { + xxx_messageInfo_AllocatedDeviceStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocatedDeviceStatus proto.InternalMessageInfo + +func (m *AllocationResult) Reset() { *m = AllocationResult{} } +func (*AllocationResult) ProtoMessage() {} +func (*AllocationResult) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{1} +} +func (m *AllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_AllocationResult.Merge(m, src) +} +func (m *AllocationResult) XXX_Size() int { + return m.Size() +} +func (m *AllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_AllocationResult.DiscardUnknown(m) +} + +var xxx_messageInfo_AllocationResult proto.InternalMessageInfo + +func (m *CELDeviceSelector) Reset() { *m = CELDeviceSelector{} } +func (*CELDeviceSelector) ProtoMessage() {} +func (*CELDeviceSelector) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{2} +} +func (m *CELDeviceSelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CELDeviceSelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CELDeviceSelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_CELDeviceSelector.Merge(m, src) +} +func (m *CELDeviceSelector) XXX_Size() int { + return m.Size() +} +func (m *CELDeviceSelector) XXX_DiscardUnknown() { + xxx_messageInfo_CELDeviceSelector.DiscardUnknown(m) +} + +var xxx_messageInfo_CELDeviceSelector proto.InternalMessageInfo + +func (m *CapacityRequestPolicy) Reset() { *m = CapacityRequestPolicy{} } +func (*CapacityRequestPolicy) ProtoMessage() {} +func (*CapacityRequestPolicy) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{3} +} +func (m *CapacityRequestPolicy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CapacityRequestPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CapacityRequestPolicy) XXX_Merge(src proto.Message) { + xxx_messageInfo_CapacityRequestPolicy.Merge(m, src) +} +func (m *CapacityRequestPolicy) XXX_Size() int { + return m.Size() +} +func (m *CapacityRequestPolicy) XXX_DiscardUnknown() { + xxx_messageInfo_CapacityRequestPolicy.DiscardUnknown(m) +} + +var xxx_messageInfo_CapacityRequestPolicy proto.InternalMessageInfo + +func (m *CapacityRequestPolicyRange) Reset() { *m = CapacityRequestPolicyRange{} } +func (*CapacityRequestPolicyRange) ProtoMessage() {} +func (*CapacityRequestPolicyRange) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{4} +} +func (m *CapacityRequestPolicyRange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CapacityRequestPolicyRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CapacityRequestPolicyRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_CapacityRequestPolicyRange.Merge(m, src) +} +func (m *CapacityRequestPolicyRange) XXX_Size() int { + return m.Size() +} +func (m *CapacityRequestPolicyRange) XXX_DiscardUnknown() { + xxx_messageInfo_CapacityRequestPolicyRange.DiscardUnknown(m) +} + +var xxx_messageInfo_CapacityRequestPolicyRange proto.InternalMessageInfo + +func (m *CapacityRequirements) Reset() { *m = CapacityRequirements{} } +func (*CapacityRequirements) ProtoMessage() {} +func (*CapacityRequirements) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{5} +} +func (m *CapacityRequirements) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CapacityRequirements) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CapacityRequirements) XXX_Merge(src proto.Message) { + xxx_messageInfo_CapacityRequirements.Merge(m, src) +} +func (m *CapacityRequirements) XXX_Size() int { + return m.Size() +} +func (m *CapacityRequirements) XXX_DiscardUnknown() { + xxx_messageInfo_CapacityRequirements.DiscardUnknown(m) +} + +var xxx_messageInfo_CapacityRequirements proto.InternalMessageInfo + +func (m *Counter) Reset() { *m = Counter{} } +func (*Counter) ProtoMessage() {} +func (*Counter) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{6} +} +func (m *Counter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Counter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Counter.Merge(m, src) +} +func (m *Counter) XXX_Size() int { + return m.Size() +} +func (m *Counter) XXX_DiscardUnknown() { + xxx_messageInfo_Counter.DiscardUnknown(m) +} + +var xxx_messageInfo_Counter proto.InternalMessageInfo + +func (m *CounterSet) Reset() { *m = CounterSet{} } +func (*CounterSet) ProtoMessage() {} +func (*CounterSet) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{7} +} +func (m *CounterSet) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CounterSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CounterSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_CounterSet.Merge(m, src) +} +func (m *CounterSet) XXX_Size() int { + return m.Size() +} +func (m *CounterSet) XXX_DiscardUnknown() { + xxx_messageInfo_CounterSet.DiscardUnknown(m) +} + +var xxx_messageInfo_CounterSet proto.InternalMessageInfo + +func (m *Device) Reset() { *m = Device{} } +func (*Device) ProtoMessage() {} +func (*Device) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{8} +} +func (m *Device) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Device) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Device) XXX_Merge(src proto.Message) { + xxx_messageInfo_Device.Merge(m, src) +} +func (m *Device) XXX_Size() int { + return m.Size() +} +func (m *Device) XXX_DiscardUnknown() { + xxx_messageInfo_Device.DiscardUnknown(m) +} + +var xxx_messageInfo_Device proto.InternalMessageInfo + +func (m *DeviceAllocationConfiguration) Reset() { *m = DeviceAllocationConfiguration{} } +func (*DeviceAllocationConfiguration) ProtoMessage() {} +func (*DeviceAllocationConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{9} +} +func (m *DeviceAllocationConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceAllocationConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceAllocationConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAllocationConfiguration.Merge(m, src) +} +func (m *DeviceAllocationConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceAllocationConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAllocationConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceAllocationConfiguration proto.InternalMessageInfo + +func (m *DeviceAllocationResult) Reset() { *m = DeviceAllocationResult{} } +func (*DeviceAllocationResult) ProtoMessage() {} +func (*DeviceAllocationResult) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{10} +} +func (m *DeviceAllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceAllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAllocationResult.Merge(m, src) +} +func (m *DeviceAllocationResult) XXX_Size() int { + return m.Size() +} +func (m *DeviceAllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAllocationResult.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceAllocationResult proto.InternalMessageInfo + +func (m *DeviceAttribute) Reset() { *m = DeviceAttribute{} } +func (*DeviceAttribute) ProtoMessage() {} +func (*DeviceAttribute) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{11} +} +func (m *DeviceAttribute) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceAttribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceAttribute) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceAttribute.Merge(m, src) +} +func (m *DeviceAttribute) XXX_Size() int { + return m.Size() +} +func (m *DeviceAttribute) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceAttribute.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceAttribute proto.InternalMessageInfo + +func (m *DeviceCapacity) Reset() { *m = DeviceCapacity{} } +func (*DeviceCapacity) ProtoMessage() {} +func (*DeviceCapacity) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{12} +} +func (m *DeviceCapacity) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceCapacity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceCapacity) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceCapacity.Merge(m, src) +} +func (m *DeviceCapacity) XXX_Size() int { + return m.Size() +} +func (m *DeviceCapacity) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceCapacity.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceCapacity proto.InternalMessageInfo + +func (m *DeviceClaim) Reset() { *m = DeviceClaim{} } +func (*DeviceClaim) ProtoMessage() {} +func (*DeviceClaim) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{13} +} +func (m *DeviceClaim) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClaim) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClaim) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClaim.Merge(m, src) +} +func (m *DeviceClaim) XXX_Size() int { + return m.Size() +} +func (m *DeviceClaim) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClaim.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClaim proto.InternalMessageInfo + +func (m *DeviceClaimConfiguration) Reset() { *m = DeviceClaimConfiguration{} } +func (*DeviceClaimConfiguration) ProtoMessage() {} +func (*DeviceClaimConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{14} +} +func (m *DeviceClaimConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClaimConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClaimConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClaimConfiguration.Merge(m, src) +} +func (m *DeviceClaimConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceClaimConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClaimConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClaimConfiguration proto.InternalMessageInfo + +func (m *DeviceClass) Reset() { *m = DeviceClass{} } +func (*DeviceClass) ProtoMessage() {} +func (*DeviceClass) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{15} +} +func (m *DeviceClass) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClass) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClass) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClass.Merge(m, src) +} +func (m *DeviceClass) XXX_Size() int { + return m.Size() +} +func (m *DeviceClass) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClass.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClass proto.InternalMessageInfo + +func (m *DeviceClassConfiguration) Reset() { *m = DeviceClassConfiguration{} } +func (*DeviceClassConfiguration) ProtoMessage() {} +func (*DeviceClassConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{16} +} +func (m *DeviceClassConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClassConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClassConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassConfiguration.Merge(m, src) +} +func (m *DeviceClassConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceClassConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClassConfiguration proto.InternalMessageInfo + +func (m *DeviceClassList) Reset() { *m = DeviceClassList{} } +func (*DeviceClassList) ProtoMessage() {} +func (*DeviceClassList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{17} +} +func (m *DeviceClassList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClassList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClassList) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassList.Merge(m, src) +} +func (m *DeviceClassList) XXX_Size() int { + return m.Size() +} +func (m *DeviceClassList) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassList.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClassList proto.InternalMessageInfo + +func (m *DeviceClassSpec) Reset() { *m = DeviceClassSpec{} } +func (*DeviceClassSpec) ProtoMessage() {} +func (*DeviceClassSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{18} +} +func (m *DeviceClassSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceClassSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceClassSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceClassSpec.Merge(m, src) +} +func (m *DeviceClassSpec) XXX_Size() int { + return m.Size() +} +func (m *DeviceClassSpec) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceClassSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceClassSpec proto.InternalMessageInfo + +func (m *DeviceConfiguration) Reset() { *m = DeviceConfiguration{} } +func (*DeviceConfiguration) ProtoMessage() {} +func (*DeviceConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{19} +} +func (m *DeviceConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceConfiguration.Merge(m, src) +} +func (m *DeviceConfiguration) XXX_Size() int { + return m.Size() +} +func (m *DeviceConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceConfiguration proto.InternalMessageInfo + +func (m *DeviceConstraint) Reset() { *m = DeviceConstraint{} } +func (*DeviceConstraint) ProtoMessage() {} +func (*DeviceConstraint) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{20} +} +func (m *DeviceConstraint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceConstraint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceConstraint) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceConstraint.Merge(m, src) +} +func (m *DeviceConstraint) XXX_Size() int { + return m.Size() +} +func (m *DeviceConstraint) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceConstraint.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceConstraint proto.InternalMessageInfo + +func (m *DeviceCounterConsumption) Reset() { *m = DeviceCounterConsumption{} } +func (*DeviceCounterConsumption) ProtoMessage() {} +func (*DeviceCounterConsumption) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{21} +} +func (m *DeviceCounterConsumption) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceCounterConsumption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceCounterConsumption) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceCounterConsumption.Merge(m, src) +} +func (m *DeviceCounterConsumption) XXX_Size() int { + return m.Size() +} +func (m *DeviceCounterConsumption) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceCounterConsumption.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceCounterConsumption proto.InternalMessageInfo + +func (m *DeviceRequest) Reset() { *m = DeviceRequest{} } +func (*DeviceRequest) ProtoMessage() {} +func (*DeviceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{22} +} +func (m *DeviceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceRequest.Merge(m, src) +} +func (m *DeviceRequest) XXX_Size() int { + return m.Size() +} +func (m *DeviceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceRequest proto.InternalMessageInfo + +func (m *DeviceRequestAllocationResult) Reset() { *m = DeviceRequestAllocationResult{} } +func (*DeviceRequestAllocationResult) ProtoMessage() {} +func (*DeviceRequestAllocationResult) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{23} +} +func (m *DeviceRequestAllocationResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceRequestAllocationResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceRequestAllocationResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceRequestAllocationResult.Merge(m, src) +} +func (m *DeviceRequestAllocationResult) XXX_Size() int { + return m.Size() +} +func (m *DeviceRequestAllocationResult) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceRequestAllocationResult.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceRequestAllocationResult proto.InternalMessageInfo + +func (m *DeviceSelector) Reset() { *m = DeviceSelector{} } +func (*DeviceSelector) ProtoMessage() {} +func (*DeviceSelector) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{24} +} +func (m *DeviceSelector) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceSelector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceSelector) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSelector.Merge(m, src) +} +func (m *DeviceSelector) XXX_Size() int { + return m.Size() +} +func (m *DeviceSelector) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSelector.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSelector proto.InternalMessageInfo + +func (m *DeviceSubRequest) Reset() { *m = DeviceSubRequest{} } +func (*DeviceSubRequest) ProtoMessage() {} +func (*DeviceSubRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{25} +} +func (m *DeviceSubRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceSubRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceSubRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceSubRequest.Merge(m, src) +} +func (m *DeviceSubRequest) XXX_Size() int { + return m.Size() +} +func (m *DeviceSubRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceSubRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceSubRequest proto.InternalMessageInfo + +func (m *DeviceTaint) Reset() { *m = DeviceTaint{} } +func (*DeviceTaint) ProtoMessage() {} +func (*DeviceTaint) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{26} +} +func (m *DeviceTaint) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceTaint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceTaint) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceTaint.Merge(m, src) +} +func (m *DeviceTaint) XXX_Size() int { + return m.Size() +} +func (m *DeviceTaint) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceTaint.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceTaint proto.InternalMessageInfo + +func (m *DeviceToleration) Reset() { *m = DeviceToleration{} } +func (*DeviceToleration) ProtoMessage() {} +func (*DeviceToleration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{27} +} +func (m *DeviceToleration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceToleration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DeviceToleration) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceToleration.Merge(m, src) +} +func (m *DeviceToleration) XXX_Size() int { + return m.Size() +} +func (m *DeviceToleration) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceToleration.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceToleration proto.InternalMessageInfo + +func (m *ExactDeviceRequest) Reset() { *m = ExactDeviceRequest{} } +func (*ExactDeviceRequest) ProtoMessage() {} +func (*ExactDeviceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{28} +} +func (m *ExactDeviceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExactDeviceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ExactDeviceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExactDeviceRequest.Merge(m, src) +} +func (m *ExactDeviceRequest) XXX_Size() int { + return m.Size() +} +func (m *ExactDeviceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ExactDeviceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ExactDeviceRequest proto.InternalMessageInfo + +func (m *NetworkDeviceData) Reset() { *m = NetworkDeviceData{} } +func (*NetworkDeviceData) ProtoMessage() {} +func (*NetworkDeviceData) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{29} +} +func (m *NetworkDeviceData) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NetworkDeviceData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *NetworkDeviceData) XXX_Merge(src proto.Message) { + xxx_messageInfo_NetworkDeviceData.Merge(m, src) +} +func (m *NetworkDeviceData) XXX_Size() int { + return m.Size() +} +func (m *NetworkDeviceData) XXX_DiscardUnknown() { + xxx_messageInfo_NetworkDeviceData.DiscardUnknown(m) +} + +var xxx_messageInfo_NetworkDeviceData proto.InternalMessageInfo + +func (m *OpaqueDeviceConfiguration) Reset() { *m = OpaqueDeviceConfiguration{} } +func (*OpaqueDeviceConfiguration) ProtoMessage() {} +func (*OpaqueDeviceConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{30} +} +func (m *OpaqueDeviceConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OpaqueDeviceConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *OpaqueDeviceConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_OpaqueDeviceConfiguration.Merge(m, src) +} +func (m *OpaqueDeviceConfiguration) XXX_Size() int { + return m.Size() +} +func (m *OpaqueDeviceConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_OpaqueDeviceConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_OpaqueDeviceConfiguration proto.InternalMessageInfo + +func (m *ResourceClaim) Reset() { *m = ResourceClaim{} } +func (*ResourceClaim) ProtoMessage() {} +func (*ResourceClaim) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{31} +} +func (m *ResourceClaim) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaim) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaim) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaim.Merge(m, src) +} +func (m *ResourceClaim) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaim) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaim.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaim proto.InternalMessageInfo + +func (m *ResourceClaimConsumerReference) Reset() { *m = ResourceClaimConsumerReference{} } +func (*ResourceClaimConsumerReference) ProtoMessage() {} +func (*ResourceClaimConsumerReference) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{32} +} +func (m *ResourceClaimConsumerReference) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimConsumerReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimConsumerReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimConsumerReference.Merge(m, src) +} +func (m *ResourceClaimConsumerReference) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimConsumerReference) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimConsumerReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimConsumerReference proto.InternalMessageInfo + +func (m *ResourceClaimList) Reset() { *m = ResourceClaimList{} } +func (*ResourceClaimList) ProtoMessage() {} +func (*ResourceClaimList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{33} +} +func (m *ResourceClaimList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimList.Merge(m, src) +} +func (m *ResourceClaimList) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimList) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimList.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimList proto.InternalMessageInfo + +func (m *ResourceClaimSpec) Reset() { *m = ResourceClaimSpec{} } +func (*ResourceClaimSpec) ProtoMessage() {} +func (*ResourceClaimSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{34} +} +func (m *ResourceClaimSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimSpec.Merge(m, src) +} +func (m *ResourceClaimSpec) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimSpec proto.InternalMessageInfo + +func (m *ResourceClaimStatus) Reset() { *m = ResourceClaimStatus{} } +func (*ResourceClaimStatus) ProtoMessage() {} +func (*ResourceClaimStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{35} +} +func (m *ResourceClaimStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimStatus.Merge(m, src) +} +func (m *ResourceClaimStatus) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimStatus) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimStatus proto.InternalMessageInfo + +func (m *ResourceClaimTemplate) Reset() { *m = ResourceClaimTemplate{} } +func (*ResourceClaimTemplate) ProtoMessage() {} +func (*ResourceClaimTemplate) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{36} +} +func (m *ResourceClaimTemplate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimTemplate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimTemplate.Merge(m, src) +} +func (m *ResourceClaimTemplate) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimTemplate) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimTemplate.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimTemplate proto.InternalMessageInfo + +func (m *ResourceClaimTemplateList) Reset() { *m = ResourceClaimTemplateList{} } +func (*ResourceClaimTemplateList) ProtoMessage() {} +func (*ResourceClaimTemplateList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{37} +} +func (m *ResourceClaimTemplateList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimTemplateList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimTemplateList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimTemplateList.Merge(m, src) +} +func (m *ResourceClaimTemplateList) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimTemplateList) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimTemplateList.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimTemplateList proto.InternalMessageInfo + +func (m *ResourceClaimTemplateSpec) Reset() { *m = ResourceClaimTemplateSpec{} } +func (*ResourceClaimTemplateSpec) ProtoMessage() {} +func (*ResourceClaimTemplateSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{38} +} +func (m *ResourceClaimTemplateSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceClaimTemplateSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceClaimTemplateSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceClaimTemplateSpec.Merge(m, src) +} +func (m *ResourceClaimTemplateSpec) XXX_Size() int { + return m.Size() +} +func (m *ResourceClaimTemplateSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceClaimTemplateSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceClaimTemplateSpec proto.InternalMessageInfo + +func (m *ResourcePool) Reset() { *m = ResourcePool{} } +func (*ResourcePool) ProtoMessage() {} +func (*ResourcePool) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{39} +} +func (m *ResourcePool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourcePool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourcePool) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourcePool.Merge(m, src) +} +func (m *ResourcePool) XXX_Size() int { + return m.Size() +} +func (m *ResourcePool) XXX_DiscardUnknown() { + xxx_messageInfo_ResourcePool.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourcePool proto.InternalMessageInfo + +func (m *ResourceSlice) Reset() { *m = ResourceSlice{} } +func (*ResourceSlice) ProtoMessage() {} +func (*ResourceSlice) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{40} +} +func (m *ResourceSlice) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceSlice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceSlice) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSlice.Merge(m, src) +} +func (m *ResourceSlice) XXX_Size() int { + return m.Size() +} +func (m *ResourceSlice) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSlice.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceSlice proto.InternalMessageInfo + +func (m *ResourceSliceList) Reset() { *m = ResourceSliceList{} } +func (*ResourceSliceList) ProtoMessage() {} +func (*ResourceSliceList) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{41} +} +func (m *ResourceSliceList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceSliceList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceSliceList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSliceList.Merge(m, src) +} +func (m *ResourceSliceList) XXX_Size() int { + return m.Size() +} +func (m *ResourceSliceList) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSliceList.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceSliceList proto.InternalMessageInfo + +func (m *ResourceSliceSpec) Reset() { *m = ResourceSliceSpec{} } +func (*ResourceSliceSpec) ProtoMessage() {} +func (*ResourceSliceSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_f4fc532aec02d243, []int{42} +} +func (m *ResourceSliceSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResourceSliceSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ResourceSliceSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResourceSliceSpec.Merge(m, src) +} +func (m *ResourceSliceSpec) XXX_Size() int { + return m.Size() +} +func (m *ResourceSliceSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ResourceSliceSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ResourceSliceSpec proto.InternalMessageInfo + +func init() { + proto.RegisterType((*AllocatedDeviceStatus)(nil), "k8s.io.api.resource.v1.AllocatedDeviceStatus") + proto.RegisterType((*AllocationResult)(nil), "k8s.io.api.resource.v1.AllocationResult") + proto.RegisterType((*CELDeviceSelector)(nil), "k8s.io.api.resource.v1.CELDeviceSelector") + proto.RegisterType((*CapacityRequestPolicy)(nil), "k8s.io.api.resource.v1.CapacityRequestPolicy") + proto.RegisterType((*CapacityRequestPolicyRange)(nil), "k8s.io.api.resource.v1.CapacityRequestPolicyRange") + proto.RegisterType((*CapacityRequirements)(nil), "k8s.io.api.resource.v1.CapacityRequirements") + proto.RegisterMapType((map[QualifiedName]resource.Quantity)(nil), "k8s.io.api.resource.v1.CapacityRequirements.RequestsEntry") + proto.RegisterType((*Counter)(nil), "k8s.io.api.resource.v1.Counter") + proto.RegisterType((*CounterSet)(nil), "k8s.io.api.resource.v1.CounterSet") + proto.RegisterMapType((map[string]Counter)(nil), "k8s.io.api.resource.v1.CounterSet.CountersEntry") + proto.RegisterType((*Device)(nil), "k8s.io.api.resource.v1.Device") + proto.RegisterMapType((map[QualifiedName]DeviceAttribute)(nil), "k8s.io.api.resource.v1.Device.AttributesEntry") + proto.RegisterMapType((map[QualifiedName]DeviceCapacity)(nil), "k8s.io.api.resource.v1.Device.CapacityEntry") + proto.RegisterType((*DeviceAllocationConfiguration)(nil), "k8s.io.api.resource.v1.DeviceAllocationConfiguration") + proto.RegisterType((*DeviceAllocationResult)(nil), "k8s.io.api.resource.v1.DeviceAllocationResult") + proto.RegisterType((*DeviceAttribute)(nil), "k8s.io.api.resource.v1.DeviceAttribute") + proto.RegisterType((*DeviceCapacity)(nil), "k8s.io.api.resource.v1.DeviceCapacity") + proto.RegisterType((*DeviceClaim)(nil), "k8s.io.api.resource.v1.DeviceClaim") + proto.RegisterType((*DeviceClaimConfiguration)(nil), "k8s.io.api.resource.v1.DeviceClaimConfiguration") + proto.RegisterType((*DeviceClass)(nil), "k8s.io.api.resource.v1.DeviceClass") + proto.RegisterType((*DeviceClassConfiguration)(nil), "k8s.io.api.resource.v1.DeviceClassConfiguration") + proto.RegisterType((*DeviceClassList)(nil), "k8s.io.api.resource.v1.DeviceClassList") + proto.RegisterType((*DeviceClassSpec)(nil), "k8s.io.api.resource.v1.DeviceClassSpec") + proto.RegisterType((*DeviceConfiguration)(nil), "k8s.io.api.resource.v1.DeviceConfiguration") + proto.RegisterType((*DeviceConstraint)(nil), "k8s.io.api.resource.v1.DeviceConstraint") + proto.RegisterType((*DeviceCounterConsumption)(nil), "k8s.io.api.resource.v1.DeviceCounterConsumption") + proto.RegisterMapType((map[string]Counter)(nil), "k8s.io.api.resource.v1.DeviceCounterConsumption.CountersEntry") + proto.RegisterType((*DeviceRequest)(nil), "k8s.io.api.resource.v1.DeviceRequest") + proto.RegisterType((*DeviceRequestAllocationResult)(nil), "k8s.io.api.resource.v1.DeviceRequestAllocationResult") + proto.RegisterMapType((map[QualifiedName]resource.Quantity)(nil), "k8s.io.api.resource.v1.DeviceRequestAllocationResult.ConsumedCapacityEntry") + proto.RegisterType((*DeviceSelector)(nil), "k8s.io.api.resource.v1.DeviceSelector") + proto.RegisterType((*DeviceSubRequest)(nil), "k8s.io.api.resource.v1.DeviceSubRequest") + proto.RegisterType((*DeviceTaint)(nil), "k8s.io.api.resource.v1.DeviceTaint") + proto.RegisterType((*DeviceToleration)(nil), "k8s.io.api.resource.v1.DeviceToleration") + proto.RegisterType((*ExactDeviceRequest)(nil), "k8s.io.api.resource.v1.ExactDeviceRequest") + proto.RegisterType((*NetworkDeviceData)(nil), "k8s.io.api.resource.v1.NetworkDeviceData") + proto.RegisterType((*OpaqueDeviceConfiguration)(nil), "k8s.io.api.resource.v1.OpaqueDeviceConfiguration") + proto.RegisterType((*ResourceClaim)(nil), "k8s.io.api.resource.v1.ResourceClaim") + proto.RegisterType((*ResourceClaimConsumerReference)(nil), "k8s.io.api.resource.v1.ResourceClaimConsumerReference") + proto.RegisterType((*ResourceClaimList)(nil), "k8s.io.api.resource.v1.ResourceClaimList") + proto.RegisterType((*ResourceClaimSpec)(nil), "k8s.io.api.resource.v1.ResourceClaimSpec") + proto.RegisterType((*ResourceClaimStatus)(nil), "k8s.io.api.resource.v1.ResourceClaimStatus") + proto.RegisterType((*ResourceClaimTemplate)(nil), "k8s.io.api.resource.v1.ResourceClaimTemplate") + proto.RegisterType((*ResourceClaimTemplateList)(nil), "k8s.io.api.resource.v1.ResourceClaimTemplateList") + proto.RegisterType((*ResourceClaimTemplateSpec)(nil), "k8s.io.api.resource.v1.ResourceClaimTemplateSpec") + proto.RegisterType((*ResourcePool)(nil), "k8s.io.api.resource.v1.ResourcePool") + proto.RegisterType((*ResourceSlice)(nil), "k8s.io.api.resource.v1.ResourceSlice") + proto.RegisterType((*ResourceSliceList)(nil), "k8s.io.api.resource.v1.ResourceSliceList") + proto.RegisterType((*ResourceSliceSpec)(nil), "k8s.io.api.resource.v1.ResourceSliceSpec") +} + +func init() { + proto.RegisterFile("k8s.io/api/resource/v1/generated.proto", fileDescriptor_f4fc532aec02d243) +} + +var fileDescriptor_f4fc532aec02d243 = []byte{ + // 3028 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x6c, 0x24, 0x47, + 0xf5, 0x77, 0xcf, 0xcc, 0x8e, 0xc7, 0x6f, 0x6c, 0xaf, 0x5d, 0xbb, 0xeb, 0x4c, 0xfc, 0xff, 0xc7, + 0xe3, 0xf4, 0x92, 0xc4, 0x49, 0x76, 0xc7, 0x6b, 0x8b, 0x44, 0x51, 0x12, 0x10, 0x1e, 0xdb, 0x9b, + 0x38, 0xfb, 0x11, 0xa7, 0xc6, 0x6b, 0x36, 0x28, 0x84, 0xb4, 0x7b, 0xca, 0x76, 0xe3, 0x9e, 0xee, + 0x49, 0x77, 0x8d, 0x77, 0xcd, 0x29, 0xe2, 0x00, 0x57, 0x04, 0x12, 0x02, 0x24, 0x24, 0x94, 0x03, + 0x12, 0x17, 0x84, 0x38, 0x11, 0x04, 0x28, 0xc7, 0x08, 0x29, 0x28, 0x17, 0xa4, 0x20, 0xa1, 0x81, + 0x1d, 0x4e, 0x48, 0x08, 0x89, 0x0b, 0x07, 0x1f, 0x10, 0xaa, 0xea, 0xaa, 0xfe, 0x9a, 0x6e, 0x4f, + 0xdb, 0x59, 0xaf, 0x96, 0x9b, 0xe7, 0xd5, 0x7b, 0xbf, 0xaa, 0x7a, 0xf5, 0xbe, 0xea, 0x75, 0x19, + 0x9e, 0xdc, 0x7b, 0xc1, 0xad, 0x19, 0xf6, 0xbc, 0xd6, 0x36, 0xe6, 0x1d, 0xe2, 0xda, 0x1d, 0x47, + 0x27, 0xf3, 0xfb, 0x0b, 0xf3, 0x3b, 0xc4, 0x22, 0x8e, 0x46, 0x49, 0xb3, 0xd6, 0x76, 0x6c, 0x6a, + 0xa3, 0x29, 0x8f, 0xaf, 0xa6, 0xb5, 0x8d, 0x9a, 0xe4, 0xab, 0xed, 0x2f, 0x4c, 0x5f, 0xde, 0x31, + 0xe8, 0x6e, 0x67, 0xab, 0xa6, 0xdb, 0xad, 0xf9, 0x1d, 0x7b, 0xc7, 0x9e, 0xe7, 0xec, 0x5b, 0x9d, + 0x6d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0x79, 0x30, 0xd3, 0x6a, 0x68, 0x3a, 0xdd, 0x76, 0x92, 0xa6, + 0x9a, 0xfe, 0x7c, 0xc0, 0xd3, 0xd2, 0xf4, 0x5d, 0xc3, 0x22, 0xce, 0xc1, 0x7c, 0x7b, 0x6f, 0x27, + 0xba, 0xc6, 0xe3, 0x48, 0xb9, 0xf3, 0x2d, 0x42, 0xb5, 0xa4, 0xb9, 0xe6, 0xd3, 0xa4, 0x9c, 0x8e, + 0x45, 0x8d, 0x56, 0xff, 0x34, 0xcf, 0x0f, 0x12, 0x70, 0xf5, 0x5d, 0xd2, 0xd2, 0xe2, 0x72, 0xea, + 0x87, 0x79, 0xb8, 0xb0, 0x64, 0x9a, 0xb6, 0xce, 0x68, 0x2b, 0x64, 0xdf, 0xd0, 0x49, 0x83, 0x6a, + 0xb4, 0xe3, 0xa2, 0x27, 0xa1, 0xd8, 0x74, 0x8c, 0x7d, 0xe2, 0x54, 0x94, 0x59, 0x65, 0x6e, 0xa4, + 0x3e, 0xfe, 0x51, 0xb7, 0x3a, 0xd4, 0xeb, 0x56, 0x8b, 0x2b, 0x9c, 0x8a, 0xc5, 0x28, 0x9a, 0x85, + 0x42, 0xdb, 0xb6, 0xcd, 0x4a, 0x8e, 0x73, 0x8d, 0x0a, 0xae, 0xc2, 0xba, 0x6d, 0x9b, 0x98, 0x8f, + 0x70, 0x24, 0x8e, 0x5c, 0xc9, 0xc7, 0x90, 0x38, 0x15, 0x8b, 0x51, 0xf4, 0x04, 0x0c, 0xbb, 0xbb, + 0x9a, 0x43, 0xd6, 0x56, 0x2a, 0xc3, 0x9c, 0xb1, 0xdc, 0xeb, 0x56, 0x87, 0x1b, 0x1e, 0x09, 0xcb, + 0x31, 0xa4, 0x03, 0xe8, 0xb6, 0xd5, 0x34, 0xa8, 0x61, 0x5b, 0x6e, 0xa5, 0x30, 0x9b, 0x9f, 0x2b, + 0x2f, 0xce, 0xd7, 0x02, 0x3b, 0xf0, 0xf7, 0x5f, 0x6b, 0xef, 0xed, 0x30, 0x82, 0x5b, 0x63, 0x6a, + 0xae, 0xed, 0x2f, 0xd4, 0x96, 0xa5, 0x5c, 0x1d, 0x89, 0x35, 0x80, 0x4f, 0x72, 0x71, 0x08, 0x16, + 0x5d, 0x83, 0x42, 0x53, 0xa3, 0x5a, 0xe5, 0xcc, 0xac, 0x32, 0x57, 0x5e, 0xbc, 0x9c, 0x0a, 0x2f, + 0xd4, 0x5b, 0xc3, 0xda, 0x9d, 0xd5, 0xbb, 0x94, 0x58, 0x2e, 0x03, 0x2f, 0x31, 0x05, 0xac, 0x68, + 0x54, 0xc3, 0x1c, 0x04, 0xbd, 0x05, 0x65, 0x8b, 0xd0, 0x3b, 0xb6, 0xb3, 0xc7, 0x88, 0x95, 0x22, + 0xc7, 0x7c, 0xba, 0x96, 0x6c, 0xba, 0xb5, 0x9b, 0x82, 0x95, 0x2b, 0x85, 0x09, 0xd4, 0xcf, 0xf6, + 0xba, 0xd5, 0xf2, 0xcd, 0x00, 0x01, 0x87, 0xe1, 0xd4, 0xdf, 0xe4, 0x60, 0x42, 0x1c, 0xa1, 0x61, + 0x5b, 0x98, 0xb8, 0x1d, 0x93, 0xa2, 0x37, 0x61, 0xd8, 0xd3, 0xaa, 0xcb, 0x8f, 0xaf, 0xbc, 0x58, + 0x4b, 0x9b, 0xce, 0x9b, 0x27, 0x0e, 0x50, 0x3f, 0x2b, 0x14, 0x34, 0xec, 0x8d, 0xbb, 0x58, 0xe2, + 0xa1, 0x4d, 0x18, 0xb5, 0xec, 0x26, 0x69, 0x10, 0x93, 0xe8, 0xd4, 0x76, 0xf8, 0xa1, 0x96, 0x17, + 0x67, 0xc3, 0xf8, 0xcc, 0x85, 0xf8, 0x56, 0x42, 0x7c, 0xf5, 0x89, 0x5e, 0xb7, 0x3a, 0x1a, 0xa6, + 0xe0, 0x08, 0x0e, 0xea, 0xc0, 0x39, 0xcd, 0x5f, 0xc5, 0x86, 0xd1, 0x22, 0x2e, 0xd5, 0x5a, 0x6d, + 0x71, 0x02, 0xcf, 0x64, 0x3b, 0x60, 0x26, 0x56, 0x7f, 0xa4, 0xd7, 0xad, 0x9e, 0x5b, 0xea, 0x87, + 0xc2, 0x49, 0xf8, 0xea, 0x2b, 0x30, 0xb9, 0xbc, 0x7a, 0x5d, 0x98, 0xbe, 0x5c, 0xcb, 0x22, 0x00, + 0xb9, 0xdb, 0x76, 0x88, 0xcb, 0xce, 0x53, 0x38, 0x80, 0x6f, 0x32, 0xab, 0xfe, 0x08, 0x0e, 0x71, + 0xa9, 0x1f, 0xe4, 0xe0, 0xc2, 0xb2, 0xd6, 0xd6, 0x74, 0x83, 0x1e, 0x60, 0xf2, 0x6e, 0x87, 0xb8, + 0x74, 0xdd, 0x36, 0x0d, 0xfd, 0x00, 0xdd, 0x62, 0x87, 0xb1, 0xad, 0x75, 0x4c, 0x9a, 0x70, 0x18, + 0x7d, 0xbb, 0x09, 0x4e, 0xe7, 0x8d, 0x8e, 0x66, 0x51, 0x83, 0x1e, 0x78, 0x8e, 0xb0, 0xe2, 0x41, + 0x60, 0x89, 0x85, 0x08, 0x94, 0xf7, 0x35, 0xd3, 0x68, 0x6e, 0x6a, 0x66, 0x87, 0xb8, 0x95, 0x3c, + 0xf7, 0x84, 0xe3, 0x42, 0x9f, 0x13, 0xbb, 0x2a, 0x6f, 0x06, 0x50, 0x38, 0x8c, 0x8b, 0xb6, 0x00, + 0xf8, 0x4f, 0xac, 0x59, 0x3b, 0xa4, 0x52, 0xe0, 0x1b, 0x58, 0x4c, 0xb3, 0xa6, 0x44, 0x05, 0x70, + 0xc9, 0xfa, 0x38, 0xd3, 0xdd, 0xa6, 0x8f, 0x84, 0x43, 0xa8, 0xea, 0x7b, 0x39, 0x98, 0x4e, 0x17, + 0x45, 0x6b, 0x90, 0x6f, 0x19, 0xd6, 0x09, 0x95, 0x37, 0xdc, 0xeb, 0x56, 0xf3, 0x37, 0x0c, 0x0b, + 0x33, 0x0c, 0x0e, 0xa5, 0xdd, 0xe5, 0xd1, 0xea, 0xa4, 0x50, 0xda, 0x5d, 0xcc, 0x30, 0xd0, 0x75, + 0x28, 0xb8, 0x94, 0xb4, 0x85, 0x03, 0x1c, 0x17, 0x8b, 0x07, 0x89, 0x06, 0x25, 0x6d, 0xcc, 0x51, + 0xd4, 0xff, 0x28, 0x70, 0x3e, 0xac, 0x02, 0xc3, 0x21, 0x2d, 0x62, 0x51, 0x17, 0x1d, 0x40, 0xc9, + 0xf1, 0x54, 0xc2, 0x7c, 0x99, 0x9d, 0xf1, 0x8b, 0x59, 0xb4, 0x2f, 0xe5, 0x6b, 0x42, 0x9f, 0xee, + 0xaa, 0x45, 0x9d, 0x83, 0xfa, 0xe3, 0xe2, 0xbc, 0x4b, 0x92, 0xfc, 0xcd, 0xbf, 0x54, 0xc7, 0xde, + 0xe8, 0x68, 0xa6, 0xb1, 0x6d, 0x90, 0xe6, 0x4d, 0xad, 0x45, 0xb0, 0x3f, 0xdd, 0xf4, 0x1e, 0x8c, + 0x45, 0xa4, 0xd1, 0x04, 0xe4, 0xf7, 0xc8, 0x81, 0xe7, 0x10, 0x98, 0xfd, 0x89, 0x56, 0xe0, 0xcc, + 0x3e, 0xb3, 0x93, 0x93, 0x69, 0x14, 0x7b, 0xc2, 0x2f, 0xe6, 0x5e, 0x50, 0xd4, 0xb7, 0x61, 0x78, + 0xd9, 0xee, 0x58, 0x94, 0x38, 0xa8, 0x21, 0x41, 0x4f, 0x76, 0xe2, 0x63, 0x62, 0x8f, 0x67, 0xb8, + 0x05, 0x8b, 0x39, 0xd4, 0x7f, 0x28, 0x00, 0x62, 0x82, 0x06, 0xa1, 0x2c, 0x6f, 0x59, 0x5a, 0x8b, + 0x08, 0xe7, 0xf6, 0xf3, 0x16, 0xd7, 0x00, 0x1f, 0x41, 0x6f, 0x43, 0x49, 0xf7, 0xf8, 0xdd, 0x4a, + 0x8e, 0x2b, 0xfe, 0x4a, 0xaa, 0xe2, 0x7d, 0x5c, 0xf9, 0xa7, 0x50, 0xf7, 0x84, 0x54, 0xb7, 0x24, + 0x63, 0x1f, 0x73, 0xfa, 0x2d, 0x18, 0x8b, 0x30, 0x27, 0x68, 0xf7, 0xb9, 0xa8, 0x76, 0xab, 0x03, + 0xe6, 0x0f, 0xab, 0xf3, 0xdf, 0x25, 0x10, 0x09, 0x36, 0xc3, 0x56, 0x5d, 0x00, 0x8d, 0x52, 0xc7, + 0xd8, 0xea, 0x50, 0x22, 0x37, 0x3b, 0x20, 0x63, 0xd4, 0x96, 0x7c, 0x01, 0x6f, 0xab, 0x17, 0x65, + 0x7c, 0x0c, 0x06, 0xfa, 0x6d, 0x2b, 0x34, 0x0d, 0xda, 0x83, 0x92, 0x2e, 0x0c, 0x56, 0x04, 0xaf, + 0x4b, 0x03, 0xa6, 0x94, 0xf6, 0x1d, 0x33, 0x65, 0x49, 0x4e, 0x30, 0x65, 0x39, 0x01, 0xda, 0x87, + 0x09, 0xdd, 0xb6, 0xdc, 0x4e, 0x8b, 0xb8, 0x52, 0xe9, 0xa2, 0x76, 0xb8, 0x72, 0xf4, 0xa4, 0x82, + 0x7b, 0x99, 0x0b, 0xb7, 0x79, 0xf1, 0x50, 0x11, 0x13, 0x4f, 0x2c, 0xc7, 0x10, 0x71, 0xdf, 0x1c, + 0x68, 0x0e, 0x4a, 0x2c, 0xcb, 0xb1, 0xd5, 0xf0, 0x54, 0x36, 0x52, 0x1f, 0x65, 0x4b, 0xbe, 0x29, + 0x68, 0xd8, 0x1f, 0xed, 0xcb, 0xab, 0xc5, 0xfb, 0x94, 0x57, 0xe7, 0xa0, 0xa4, 0x99, 0x26, 0x63, + 0x70, 0x79, 0x5d, 0x55, 0xf2, 0x56, 0xb0, 0x24, 0x68, 0xd8, 0x1f, 0x45, 0xd7, 0xa0, 0x48, 0x35, + 0xc3, 0xa2, 0x6e, 0xa5, 0xc4, 0x35, 0x73, 0xf1, 0x68, 0xcd, 0x6c, 0x30, 0xde, 0xa0, 0x9a, 0xe3, + 0x3f, 0x5d, 0x2c, 0x20, 0xd0, 0x02, 0x94, 0xb7, 0x0c, 0xab, 0xe9, 0x6e, 0xd8, 0x0c, 0xbc, 0x32, + 0xc2, 0x67, 0xe6, 0x95, 0x4c, 0x3d, 0x20, 0xe3, 0x30, 0x0f, 0x5a, 0x86, 0x49, 0xf6, 0xd3, 0xb0, + 0x76, 0x82, 0xaa, 0xac, 0x02, 0xb3, 0xf9, 0xb9, 0x91, 0xfa, 0x85, 0x5e, 0xb7, 0x3a, 0x59, 0x8f, + 0x0f, 0xe2, 0x7e, 0x7e, 0x74, 0x1b, 0x2a, 0x82, 0x78, 0x55, 0x33, 0xcc, 0x8e, 0x43, 0x42, 0x58, + 0x65, 0x8e, 0xf5, 0xff, 0xbd, 0x6e, 0xb5, 0x52, 0x4f, 0xe1, 0xc1, 0xa9, 0xd2, 0x0c, 0x99, 0x15, + 0x10, 0x77, 0x6e, 0x74, 0x4c, 0x6a, 0xb4, 0xcd, 0x50, 0xcd, 0xe4, 0x56, 0x46, 0xf9, 0xf6, 0x38, + 0xf2, 0x52, 0x0a, 0x0f, 0x4e, 0x95, 0x9e, 0xde, 0x86, 0xb3, 0x31, 0x6f, 0x4a, 0x88, 0x05, 0x5f, + 0x88, 0xc6, 0x82, 0xa7, 0x06, 0x14, 0x74, 0x12, 0x2f, 0x14, 0x13, 0xa6, 0x75, 0x18, 0x8b, 0xb8, + 0x50, 0xc2, 0x2c, 0x2f, 0x47, 0x67, 0x79, 0x72, 0x80, 0x73, 0xc8, 0x84, 0x13, 0x0a, 0x3c, 0xdf, + 0xce, 0xc1, 0x63, 0xf1, 0xa2, 0x72, 0xd9, 0xb6, 0xb6, 0x8d, 0x9d, 0x8e, 0xc3, 0x7f, 0xa0, 0x2f, + 0x41, 0xd1, 0x03, 0x12, 0x11, 0x69, 0x4e, 0x9a, 0x50, 0x83, 0x53, 0x0f, 0xbb, 0xd5, 0xa9, 0xb8, + 0xa8, 0x37, 0x82, 0x85, 0x1c, 0xb3, 0x69, 0x3f, 0x27, 0xe6, 0xf8, 0xa1, 0x8e, 0x86, 0x73, 0x5a, + 0x90, 0xc2, 0xd0, 0x37, 0xe0, 0x5c, 0x53, 0xf8, 0x71, 0x68, 0x09, 0x22, 0x67, 0x3f, 0x3b, 0xc8, + 0xf5, 0x43, 0x22, 0xf5, 0xff, 0x13, 0xab, 0x3c, 0x97, 0x30, 0x88, 0x93, 0x26, 0x51, 0xff, 0xa4, + 0xc0, 0x54, 0x72, 0x79, 0x8d, 0xde, 0x81, 0x61, 0x87, 0xff, 0x25, 0x73, 0xfa, 0x73, 0x47, 0x2f, + 0x45, 0xec, 0x2c, 0xbd, 0x4c, 0xf7, 0x7e, 0xbb, 0x58, 0xc2, 0xa2, 0xaf, 0x42, 0x51, 0xe7, 0xab, + 0x11, 0xe1, 0xfc, 0xb9, 0xac, 0x17, 0x80, 0xe8, 0xae, 0x7d, 0xf7, 0xf6, 0xc8, 0x58, 0x80, 0xaa, + 0x3f, 0x53, 0xe0, 0x6c, 0xcc, 0xd2, 0xd0, 0x0c, 0xe4, 0x0d, 0x8b, 0x72, 0xcb, 0xc9, 0x7b, 0x07, + 0xb2, 0x66, 0x51, 0x2f, 0x07, 0xb3, 0x01, 0xf4, 0x38, 0x14, 0xb6, 0xd8, 0x55, 0x31, 0xcf, 0x9d, + 0x65, 0xac, 0xd7, 0xad, 0x8e, 0xd4, 0x6d, 0xdb, 0xf4, 0x38, 0xf8, 0x10, 0x7a, 0x0a, 0x8a, 0x2e, + 0x75, 0x0c, 0x6b, 0x87, 0x17, 0x9a, 0x23, 0x5e, 0xc0, 0x68, 0x70, 0x8a, 0xc7, 0x26, 0x86, 0xd1, + 0x33, 0x30, 0xbc, 0x4f, 0x1c, 0x5e, 0x9e, 0x7b, 0x61, 0x95, 0x87, 0xc1, 0x4d, 0x8f, 0xe4, 0xb1, + 0x4a, 0x06, 0xf5, 0x63, 0x05, 0xc6, 0xa3, 0xf6, 0x7a, 0x2a, 0x15, 0x06, 0xda, 0x86, 0x31, 0x27, + 0x5c, 0xbc, 0x0a, 0x1f, 0xba, 0x7c, 0xac, 0x62, 0xb9, 0x3e, 0xd9, 0xeb, 0x56, 0xc7, 0xa2, 0x45, + 0x70, 0x14, 0x56, 0xfd, 0x71, 0x0e, 0xca, 0x62, 0x3f, 0xa6, 0x66, 0xb4, 0x50, 0xa3, 0xaf, 0x42, + 0x7c, 0x22, 0x93, 0x35, 0x05, 0xd5, 0x49, 0x82, 0xe3, 0x7c, 0x0d, 0xca, 0x2c, 0x99, 0x51, 0xc7, + 0xcb, 0x08, 0x9e, 0x11, 0xcd, 0x0d, 0x74, 0x18, 0x21, 0x10, 0xdc, 0x2b, 0x02, 0x9a, 0x8b, 0xc3, + 0x88, 0xe8, 0xb6, 0x6f, 0xa0, 0xf9, 0x4c, 0x79, 0x98, 0x6d, 0x35, 0x9b, 0x6d, 0x7e, 0xa8, 0x40, + 0x25, 0x4d, 0x28, 0x12, 0x3a, 0x94, 0x93, 0x84, 0x8e, 0xdc, 0x83, 0x08, 0x1d, 0xbf, 0x56, 0x42, + 0x47, 0xec, 0xba, 0xe8, 0x1d, 0x28, 0xb1, 0x3b, 0x2e, 0xef, 0x49, 0x78, 0x26, 0x7b, 0x25, 0xdb, + 0x8d, 0xf8, 0xf5, 0xad, 0xaf, 0x13, 0x9d, 0xde, 0x20, 0x54, 0x0b, 0x2e, 0xb0, 0x01, 0x0d, 0xfb, + 0xa8, 0x68, 0x0d, 0x0a, 0x6e, 0x9b, 0xe8, 0xd9, 0xb2, 0x0b, 0x5f, 0x54, 0xa3, 0x4d, 0xf4, 0xa0, + 0x9a, 0x64, 0xbf, 0x30, 0x87, 0x50, 0xbf, 0x1f, 0xd6, 0xbf, 0xeb, 0x46, 0xf5, 0x9f, 0xa2, 0x55, + 0xe5, 0x41, 0x68, 0xf5, 0x03, 0x3f, 0x68, 0xf1, 0x85, 0x5d, 0x37, 0x5c, 0x8a, 0xde, 0xea, 0xd3, + 0x6c, 0x2d, 0x9b, 0x66, 0x99, 0x34, 0xd7, 0xab, 0xef, 0x45, 0x92, 0x12, 0xd2, 0xea, 0xab, 0x70, + 0xc6, 0xa0, 0xa4, 0x25, 0xfd, 0xe7, 0x62, 0x06, 0xb5, 0x06, 0xc1, 0x65, 0x8d, 0x49, 0x62, 0x0f, + 0x40, 0xfd, 0x6e, 0x2e, 0xb2, 0x76, 0xa6, 0x6e, 0xf4, 0x65, 0x18, 0x71, 0x45, 0x99, 0x27, 0x3d, + 0x7f, 0x40, 0xc2, 0xf6, 0xab, 0xc6, 0x49, 0x31, 0xc9, 0x88, 0xa4, 0xb8, 0x38, 0xc0, 0x0a, 0xf9, + 0x66, 0x2e, 0xa3, 0x6f, 0xc6, 0x8e, 0x39, 0xcd, 0x37, 0xd1, 0x75, 0x38, 0x4f, 0xee, 0x52, 0x62, + 0x35, 0x49, 0x13, 0x0b, 0x1c, 0x5e, 0x1b, 0x7b, 0xe1, 0xbe, 0xd2, 0xeb, 0x56, 0xcf, 0xaf, 0x26, + 0x8c, 0xe3, 0x44, 0x29, 0xd5, 0x84, 0xa4, 0xc3, 0x47, 0xb7, 0xa0, 0x68, 0xb7, 0xb5, 0x77, 0xfd, + 0xf0, 0xbe, 0x90, 0xb6, 0xfc, 0xd7, 0x39, 0x57, 0x92, 0x71, 0x01, 0x5b, 0xbb, 0x37, 0x8c, 0x05, + 0x98, 0xfa, 0x77, 0x05, 0x26, 0xe2, 0x81, 0xee, 0x18, 0xf1, 0x64, 0x1d, 0xc6, 0x5b, 0x1a, 0xd5, + 0x77, 0xfd, 0x84, 0x29, 0x7a, 0xa6, 0x73, 0xbd, 0x6e, 0x75, 0xfc, 0x46, 0x64, 0xe4, 0xb0, 0x5b, + 0x45, 0x57, 0x3b, 0xa6, 0x79, 0x10, 0xbd, 0xce, 0xc4, 0xe4, 0xd1, 0x9b, 0x30, 0xd9, 0x34, 0x5c, + 0x6a, 0x58, 0x3a, 0x0d, 0x40, 0xbd, 0x26, 0xeb, 0xb3, 0xac, 0x60, 0x5e, 0x89, 0x0f, 0xa6, 0xe0, + 0xf6, 0xa3, 0xa8, 0x3f, 0xca, 0xf9, 0x3e, 0xdc, 0x77, 0x01, 0x42, 0x8b, 0x00, 0xba, 0x7f, 0xe3, + 0x8d, 0xb7, 0xc7, 0x82, 0xbb, 0x30, 0x0e, 0x71, 0x21, 0xb3, 0xef, 0x36, 0xfd, 0xc5, 0xe3, 0x5e, + 0xbc, 0x1e, 0x9a, 0xbb, 0xf5, 0x3f, 0x15, 0x18, 0x8b, 0x64, 0xd2, 0x0c, 0x57, 0xec, 0x37, 0x60, + 0x98, 0xdc, 0xd5, 0x74, 0x6a, 0xca, 0xb2, 0xe0, 0x99, 0xb4, 0x09, 0x57, 0x19, 0x5b, 0x34, 0x51, + 0xf3, 0x06, 0xe0, 0xaa, 0x27, 0x8e, 0x25, 0x0e, 0xda, 0x85, 0xf1, 0x6d, 0xc3, 0x71, 0xe9, 0xd2, + 0xbe, 0x66, 0x98, 0xda, 0x96, 0x49, 0x44, 0x26, 0x1d, 0x90, 0xa5, 0x1b, 0x9d, 0x2d, 0x89, 0x3b, + 0x25, 0x16, 0x3a, 0x7e, 0x35, 0x82, 0x83, 0x63, 0xb8, 0xea, 0x1f, 0x8b, 0xb2, 0xa6, 0x4f, 0x29, + 0x44, 0xd1, 0xd3, 0xac, 0xa0, 0xe5, 0x43, 0x42, 0x07, 0xa1, 0xca, 0x94, 0x93, 0xb1, 0x1c, 0x0f, + 0x7d, 0x59, 0xc8, 0x65, 0xfa, 0xb2, 0x90, 0xcf, 0xf0, 0x65, 0xa1, 0x70, 0xe4, 0x97, 0x85, 0x05, + 0x28, 0x6b, 0xcd, 0x96, 0x61, 0x2d, 0xe9, 0x3a, 0x71, 0x5d, 0x5e, 0x30, 0x8a, 0xbb, 0xe8, 0x52, + 0x40, 0xc6, 0x61, 0x1e, 0x56, 0xfe, 0x50, 0xdb, 0x24, 0x8e, 0xb8, 0xdf, 0x15, 0xb3, 0x28, 0x76, + 0xc3, 0x17, 0x08, 0xca, 0x9f, 0x80, 0xe6, 0xe2, 0x30, 0x62, 0xf2, 0x65, 0x77, 0xf8, 0x3e, 0x5e, + 0x76, 0x4b, 0x9f, 0xe9, 0xb2, 0xfb, 0x5a, 0xf0, 0x31, 0x66, 0x84, 0xeb, 0xf6, 0x4a, 0xe8, 0x63, + 0xcc, 0x61, 0xb7, 0xfa, 0x78, 0xda, 0x07, 0x27, 0x7a, 0xd0, 0x26, 0x6e, 0xed, 0x56, 0xf8, 0x8b, + 0xcd, 0xfb, 0x8a, 0xdf, 0x7c, 0x69, 0xca, 0x9a, 0x97, 0xdf, 0xeb, 0xcb, 0x8b, 0xd7, 0x4e, 0x74, + 0xed, 0xa9, 0x2d, 0xc7, 0xd0, 0xbc, 0x80, 0xf0, 0x74, 0xac, 0x2f, 0xd3, 0x4c, 0x6f, 0x0c, 0xf5, + 0xad, 0x67, 0xda, 0x85, 0x0b, 0x89, 0xa8, 0xa7, 0xda, 0xf3, 0xdc, 0x94, 0x17, 0x13, 0xbf, 0x5b, + 0xb3, 0x02, 0x79, 0x9d, 0x98, 0x22, 0x6f, 0xa5, 0x7e, 0x23, 0xea, 0xfb, 0x62, 0xe1, 0xb5, 0xa6, + 0x97, 0x57, 0xaf, 0x63, 0x26, 0xae, 0x7e, 0xab, 0x20, 0x33, 0x55, 0xe0, 0xec, 0x19, 0x62, 0xd4, + 0x12, 0x9c, 0x6d, 0x06, 0x09, 0x9d, 0xe7, 0x65, 0xcf, 0x45, 0x1f, 0x11, 0xcc, 0xe1, 0x0a, 0x84, + 0xcb, 0xc5, 0xf9, 0xa3, 0x25, 0x49, 0xfe, 0x3e, 0x96, 0x24, 0x9b, 0x30, 0x1e, 0x7c, 0xbe, 0xb9, + 0x61, 0x37, 0xa5, 0xcf, 0xd7, 0x64, 0x08, 0x5b, 0x8a, 0x8c, 0x1e, 0x76, 0xab, 0xe7, 0xe3, 0x37, + 0x5b, 0x46, 0xc7, 0x31, 0x14, 0x74, 0x11, 0xce, 0xf0, 0xac, 0xc1, 0xa3, 0x42, 0x3e, 0x28, 0xbe, + 0x78, 0xd8, 0xc7, 0xde, 0xd8, 0xe9, 0x47, 0x83, 0xcd, 0x50, 0x2f, 0x74, 0x98, 0x9f, 0xfd, 0xa5, + 0xe3, 0x34, 0xf9, 0xbd, 0x9a, 0xc3, 0x1f, 0xf1, 0xb1, 0xd4, 0x7f, 0xf9, 0xf7, 0x08, 0xde, 0x9e, + 0x43, 0x8f, 0x85, 0x8c, 0xb9, 0x5e, 0x16, 0xcb, 0xca, 0x5f, 0x23, 0x07, 0x9e, 0x65, 0x5f, 0x0c, + 0x5b, 0xf6, 0x48, 0xca, 0x35, 0xf7, 0x25, 0x28, 0x92, 0xed, 0x6d, 0xa2, 0x53, 0x11, 0x99, 0x65, + 0xe3, 0xb7, 0xb8, 0xca, 0xa9, 0x87, 0xac, 0xf0, 0x08, 0xa6, 0xf4, 0x88, 0x58, 0x88, 0x30, 0xfb, + 0xa0, 0x46, 0x8b, 0x2c, 0x35, 0x9b, 0xa4, 0x29, 0x3e, 0x26, 0x1d, 0xe7, 0xdb, 0x1e, 0x6f, 0x1a, + 0x6c, 0x48, 0x00, 0x1c, 0x60, 0xbd, 0x58, 0xfa, 0xc1, 0x4f, 0xaa, 0x43, 0xef, 0xfd, 0x79, 0x76, + 0x48, 0x7d, 0x3f, 0x27, 0x8d, 0x3f, 0x50, 0xf7, 0xa0, 0x8d, 0xbf, 0x0a, 0x25, 0xbb, 0xcd, 0x78, + 0x6d, 0x99, 0x95, 0x2e, 0xc9, 0xea, 0xe2, 0x75, 0x41, 0x3f, 0xec, 0x56, 0x2b, 0x71, 0x58, 0x39, + 0x86, 0x7d, 0xe9, 0x40, 0x85, 0xf9, 0x4c, 0x2a, 0x2c, 0x1c, 0x5f, 0x85, 0xcb, 0x30, 0x19, 0x98, + 0x4e, 0x83, 0xe8, 0xb6, 0xd5, 0x74, 0x85, 0xf5, 0xf2, 0xcc, 0xb1, 0x11, 0x1f, 0xc4, 0xfd, 0xfc, + 0xea, 0x0f, 0x0b, 0x80, 0xfa, 0x0b, 0x8d, 0xa4, 0x08, 0xa0, 0x7c, 0x96, 0x08, 0x90, 0x3b, 0xd5, + 0x08, 0x90, 0xbf, 0xbf, 0x11, 0xa0, 0x70, 0x44, 0x04, 0x78, 0x18, 0x4b, 0x88, 0xd3, 0x0a, 0x1a, + 0x3f, 0x57, 0x60, 0xb2, 0xef, 0x15, 0x02, 0x7a, 0x09, 0xc6, 0x0c, 0x56, 0x08, 0x6f, 0x6b, 0xe2, + 0xca, 0xe6, 0x19, 0xc6, 0x05, 0xb1, 0xcc, 0xb1, 0xb5, 0xf0, 0x20, 0x8e, 0xf2, 0xa2, 0x47, 0x21, + 0x6f, 0xb4, 0x65, 0xaf, 0x96, 0xe7, 0xaa, 0xb5, 0x75, 0x17, 0x33, 0x1a, 0x33, 0xb9, 0x5d, 0xcd, + 0x69, 0xde, 0xd1, 0x1c, 0xe6, 0xc9, 0x0e, 0xd3, 0x6e, 0x3e, 0x6a, 0x72, 0xaf, 0x46, 0x87, 0x71, + 0x9c, 0x5f, 0xfd, 0xa9, 0x02, 0x8f, 0xa6, 0x5e, 0xe5, 0x32, 0xbf, 0x64, 0xd1, 0x00, 0xda, 0x9a, + 0xa3, 0xb5, 0x88, 0xb8, 0xa3, 0x9c, 0xe0, 0xe5, 0x87, 0x7f, 0x09, 0x5a, 0xf7, 0x81, 0x70, 0x08, + 0x54, 0xfd, 0x5e, 0x0e, 0xc6, 0xe4, 0x05, 0xd6, 0xeb, 0xdd, 0x9d, 0x7e, 0x63, 0xe7, 0x5a, 0xa4, + 0xb1, 0x93, 0x5a, 0x52, 0x44, 0x96, 0x95, 0xd6, 0xda, 0x41, 0x0d, 0x28, 0xba, 0xfc, 0x7d, 0xd0, + 0xa0, 0x0e, 0x7a, 0x14, 0x8e, 0x8b, 0x04, 0x8a, 0xf7, 0x7e, 0x63, 0x01, 0xa5, 0xf6, 0x14, 0x98, + 0x89, 0xf0, 0x8b, 0x42, 0xcc, 0xc1, 0x64, 0x9b, 0x38, 0xc4, 0xd2, 0x09, 0xba, 0x04, 0x25, 0xad, + 0x6d, 0xbc, 0xe2, 0xd8, 0x9d, 0xb6, 0x38, 0x45, 0xff, 0xf6, 0xb7, 0xb4, 0xbe, 0xc6, 0xe9, 0xd8, + 0xe7, 0x60, 0xdc, 0x72, 0x2d, 0xc2, 0x96, 0x42, 0x9d, 0x4e, 0x8f, 0x8e, 0x7d, 0x0e, 0xbf, 0x2e, + 0x2a, 0xa4, 0xd6, 0x45, 0x75, 0xc8, 0x77, 0x8c, 0xa6, 0x68, 0x34, 0x5f, 0x91, 0xc9, 0xe3, 0x56, + 0xd6, 0x42, 0x98, 0x09, 0xab, 0xbf, 0x55, 0x60, 0x32, 0xb2, 0xc9, 0x07, 0xd0, 0x7d, 0x7a, 0x2d, + 0xda, 0x7d, 0x7a, 0x22, 0xd3, 0x61, 0xa5, 0xf4, 0x9f, 0xf4, 0xd8, 0xf2, 0x79, 0x03, 0xea, 0x66, + 0xfc, 0x99, 0xd1, 0xc5, 0x0c, 0x4d, 0xdc, 0xf4, 0xb7, 0x45, 0xea, 0xaf, 0x72, 0x70, 0x2e, 0xc1, + 0x72, 0xd0, 0x6d, 0x80, 0x20, 0x68, 0x8b, 0xa9, 0x52, 0x23, 0x69, 0xdf, 0x47, 0x12, 0xfe, 0xf2, + 0x24, 0x44, 0x0d, 0x61, 0xa1, 0x16, 0x94, 0x1d, 0xe2, 0x12, 0x67, 0x9f, 0x34, 0xaf, 0xf2, 0xdc, + 0xcf, 0x14, 0xf5, 0x7c, 0x26, 0x45, 0xf5, 0x59, 0x69, 0x10, 0xb2, 0x71, 0x00, 0x89, 0xc3, 0xf8, + 0xe8, 0x76, 0xa0, 0x30, 0xef, 0xeb, 0xf3, 0xe5, 0x01, 0xbb, 0x88, 0xbe, 0xca, 0x3b, 0x42, 0x75, + 0x7f, 0x50, 0xe0, 0x42, 0x64, 0x79, 0x1b, 0xa4, 0xd5, 0x36, 0x35, 0x4a, 0x1e, 0x40, 0x88, 0x69, + 0x44, 0x42, 0xcc, 0x42, 0x26, 0xed, 0xc9, 0xe5, 0xa5, 0x76, 0x91, 0x3f, 0x56, 0xe0, 0xd1, 0x44, + 0x89, 0x07, 0xe0, 0x38, 0x38, 0xea, 0x38, 0x97, 0x8f, 0xb5, 0xa3, 0x14, 0x07, 0xfa, 0x7d, 0xda, + 0x7e, 0xb8, 0x27, 0xfd, 0x6f, 0xe5, 0x01, 0xf5, 0x17, 0x0a, 0x8c, 0x4a, 0xce, 0x75, 0xdb, 0x36, + 0x33, 0x5c, 0x2e, 0x17, 0x01, 0xc4, 0xeb, 0x53, 0xf9, 0x15, 0x25, 0x1f, 0xac, 0xf8, 0x15, 0x7f, + 0x04, 0x87, 0xb8, 0xd0, 0x6b, 0x80, 0xe4, 0xda, 0x1a, 0xa6, 0xec, 0x09, 0xf2, 0x90, 0x9e, 0xaf, + 0x4f, 0x0b, 0x59, 0x84, 0xfb, 0x38, 0x70, 0x82, 0x94, 0xfa, 0x3b, 0x25, 0xc8, 0xbd, 0x9c, 0xfc, + 0xf0, 0xe9, 0x9c, 0x2f, 0x2b, 0x55, 0xe7, 0xe1, 0x0c, 0xc2, 0x39, 0x1f, 0xc2, 0x0c, 0xc2, 0xd7, + 0x95, 0xe2, 0x00, 0xbf, 0x2c, 0xc4, 0xd6, 0xcf, 0x0d, 0x3f, 0x6b, 0x75, 0x76, 0x35, 0xf4, 0xce, + 0xb8, 0xbc, 0xf8, 0xb9, 0x41, 0x0b, 0x61, 0x46, 0x99, 0xd8, 0x33, 0x0c, 0x3f, 0xc8, 0xc9, 0x1f, + 0xeb, 0x41, 0x4e, 0xe1, 0x14, 0x1e, 0xe4, 0x9c, 0x39, 0xf2, 0x41, 0xce, 0x5a, 0x90, 0x2d, 0xbc, + 0xdb, 0xc3, 0xcc, 0xd1, 0xe9, 0xf5, 0x88, 0x57, 0xbb, 0x18, 0xa6, 0xda, 0xc4, 0xf1, 0xc8, 0xc1, + 0xda, 0x98, 0x27, 0x7a, 0x6f, 0x82, 0xa6, 0x7b, 0xdd, 0xea, 0xd4, 0x7a, 0x22, 0x07, 0x4e, 0x91, + 0x44, 0x5b, 0x30, 0xce, 0x5b, 0x7c, 0x4d, 0xff, 0x45, 0x95, 0xf7, 0x6e, 0x48, 0x1d, 0xfc, 0x4c, + 0x2e, 0xe8, 0x3c, 0x37, 0x22, 0x08, 0x38, 0x86, 0x58, 0x7f, 0xf9, 0xa3, 0x7b, 0x33, 0x43, 0x9f, + 0xdc, 0x9b, 0x19, 0xfa, 0xf4, 0xde, 0xcc, 0xd0, 0x7b, 0xbd, 0x19, 0xe5, 0xa3, 0xde, 0x8c, 0xf2, + 0x49, 0x6f, 0x46, 0xf9, 0xb4, 0x37, 0xa3, 0xfc, 0xb5, 0x37, 0xa3, 0x7c, 0xe7, 0x6f, 0x33, 0x43, + 0x5f, 0x99, 0x4a, 0xfe, 0x77, 0x81, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x0c, 0xec, 0x16, + 0x47, 0x30, 0x00, 0x00, +} + +func (m *AllocatedDeviceStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocatedDeviceStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocatedDeviceStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ShareID != nil { + i -= len(*m.ShareID) + copy(dAtA[i:], *m.ShareID) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ShareID))) + i-- + dAtA[i] = 0x3a + } + if m.NetworkData != nil { + { + size, err := m.NetworkData.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Conditions) > 0 { + for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Conditions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x1a + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *AllocationResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AllocationTimestamp != nil { + { + size, err := m.AllocationTimestamp.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Devices.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CELDeviceSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CELDeviceSelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CELDeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CapacityRequestPolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapacityRequestPolicy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CapacityRequestPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ValidRange != nil { + { + size, err := m.ValidRange.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.ValidValues) > 0 { + for iNdEx := len(m.ValidValues) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ValidValues[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.Default != nil { + { + size, err := m.Default.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CapacityRequestPolicyRange) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapacityRequestPolicyRange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CapacityRequestPolicyRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Step != nil { + { + size, err := m.Step.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Max != nil { + { + size, err := m.Max.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Min != nil { + { + size, err := m.Min.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CapacityRequirements) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapacityRequirements) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CapacityRequirements) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Requests) > 0 { + keysForRequests := make([]string, 0, len(m.Requests)) + for k := range m.Requests { + keysForRequests = append(keysForRequests, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForRequests) + for iNdEx := len(keysForRequests) - 1; iNdEx >= 0; iNdEx-- { + v := m.Requests[QualifiedName(keysForRequests[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForRequests[iNdEx]) + copy(dAtA[i:], keysForRequests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForRequests[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Counter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Counter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Counter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *CounterSet) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CounterSet) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CounterSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Counters) > 0 { + keysForCounters := make([]string, 0, len(m.Counters)) + for k := range m.Counters { + keysForCounters = append(keysForCounters, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + for iNdEx := len(keysForCounters) - 1; iNdEx >= 0; iNdEx-- { + v := m.Counters[string(keysForCounters[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCounters[iNdEx]) + copy(dAtA[i:], keysForCounters[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCounters[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Device) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Device) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Device) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AllowMultipleAllocations != nil { + i-- + if *m.AllowMultipleAllocations { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } + if len(m.BindingFailureConditions) > 0 { + for iNdEx := len(m.BindingFailureConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingFailureConditions[iNdEx]) + copy(dAtA[i:], m.BindingFailureConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingFailureConditions[iNdEx]))) + i-- + dAtA[i] = 0x5a + } + } + if len(m.BindingConditions) > 0 { + for iNdEx := len(m.BindingConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingConditions[iNdEx]) + copy(dAtA[i:], m.BindingConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingConditions[iNdEx]))) + i-- + dAtA[i] = 0x52 + } + } + if m.BindsToNode != nil { + i-- + if *m.BindsToNode { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x48 + } + if len(m.Taints) > 0 { + for iNdEx := len(m.Taints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Taints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + } + if m.AllNodes != nil { + i-- + if *m.AllNodes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.NodeName != nil { + i -= len(*m.NodeName) + copy(dAtA[i:], *m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeName))) + i-- + dAtA[i] = 0x2a + } + if len(m.ConsumesCounters) > 0 { + for iNdEx := len(m.ConsumesCounters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ConsumesCounters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.Capacity) > 0 { + keysForCapacity := make([]string, 0, len(m.Capacity)) + for k := range m.Capacity { + keysForCapacity = append(keysForCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCapacity) + for iNdEx := len(keysForCapacity) - 1; iNdEx >= 0; iNdEx-- { + v := m.Capacity[QualifiedName(keysForCapacity[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCapacity[iNdEx]) + copy(dAtA[i:], keysForCapacity[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCapacity[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Attributes) > 0 { + keysForAttributes := make([]string, 0, len(m.Attributes)) + for k := range m.Attributes { + keysForAttributes = append(keysForAttributes, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAttributes) + for iNdEx := len(keysForAttributes) - 1; iNdEx >= 0; iNdEx-- { + v := m.Attributes[QualifiedName(keysForAttributes[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForAttributes[iNdEx]) + copy(dAtA[i:], keysForAttributes[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForAttributes[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceAllocationConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAllocationConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAllocationConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.Source) + copy(dAtA[i:], m.Source) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Source))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceAllocationResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceAttribute) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAttribute) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceAttribute) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.VersionValue != nil { + i -= len(*m.VersionValue) + copy(dAtA[i:], *m.VersionValue) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VersionValue))) + i-- + dAtA[i] = 0x2a + } + if m.StringValue != nil { + i -= len(*m.StringValue) + copy(dAtA[i:], *m.StringValue) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.StringValue))) + i-- + dAtA[i] = 0x22 + } + if m.BoolValue != nil { + i-- + if *m.BoolValue { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.IntValue != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.IntValue)) + i-- + dAtA[i] = 0x10 + } + return len(dAtA) - i, nil +} + +func (m *DeviceCapacity) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceCapacity) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceCapacity) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RequestPolicy != nil { + { + size, err := m.RequestPolicy.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + { + size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClaim) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClaim) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Constraints) > 0 { + for iNdEx := len(m.Constraints) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Constraints[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Requests[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceClaimConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClaimConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClaimConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceClass) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClass) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClass) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClassConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.DeviceConfiguration.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClassList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceClassSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceClassSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceClassSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExtendedResourceName != nil { + i -= len(*m.ExtendedResourceName) + copy(dAtA[i:], *m.ExtendedResourceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ExtendedResourceName))) + i-- + dAtA[i] = 0x22 + } + if len(m.Config) > 0 { + for iNdEx := len(m.Config) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Config[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Opaque != nil { + { + size, err := m.Opaque.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DeviceConstraint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceConstraint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceConstraint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.DistinctAttribute != nil { + i -= len(*m.DistinctAttribute) + copy(dAtA[i:], *m.DistinctAttribute) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.DistinctAttribute))) + i-- + dAtA[i] = 0x1a + } + if m.MatchAttribute != nil { + i -= len(*m.MatchAttribute) + copy(dAtA[i:], *m.MatchAttribute) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.MatchAttribute))) + i-- + dAtA[i] = 0x12 + } + if len(m.Requests) > 0 { + for iNdEx := len(m.Requests) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Requests[iNdEx]) + copy(dAtA[i:], m.Requests[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Requests[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *DeviceCounterConsumption) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceCounterConsumption) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceCounterConsumption) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Counters) > 0 { + keysForCounters := make([]string, 0, len(m.Counters)) + for k := range m.Counters { + keysForCounters = append(keysForCounters, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + for iNdEx := len(keysForCounters) - 1; iNdEx >= 0; iNdEx-- { + v := m.Counters[string(keysForCounters[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForCounters[iNdEx]) + copy(dAtA[i:], keysForCounters[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForCounters[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.CounterSet) + copy(dAtA[i:], m.CounterSet) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CounterSet))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.FirstAvailable) > 0 { + for iNdEx := len(m.FirstAvailable) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FirstAvailable[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.Exactly != nil { + { + size, err := m.Exactly.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceRequestAllocationResult) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceRequestAllocationResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceRequestAllocationResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ConsumedCapacity) > 0 { + keysForConsumedCapacity := make([]string, 0, len(m.ConsumedCapacity)) + for k := range m.ConsumedCapacity { + keysForConsumedCapacity = append(keysForConsumedCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForConsumedCapacity) + for iNdEx := len(keysForConsumedCapacity) - 1; iNdEx >= 0; iNdEx-- { + v := m.ConsumedCapacity[QualifiedName(keysForConsumedCapacity[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForConsumedCapacity[iNdEx]) + copy(dAtA[i:], keysForConsumedCapacity[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForConsumedCapacity[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x52 + } + } + if m.ShareID != nil { + i -= len(*m.ShareID) + copy(dAtA[i:], *m.ShareID) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ShareID))) + i-- + dAtA[i] = 0x4a + } + if len(m.BindingFailureConditions) > 0 { + for iNdEx := len(m.BindingFailureConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingFailureConditions[iNdEx]) + copy(dAtA[i:], m.BindingFailureConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingFailureConditions[iNdEx]))) + i-- + dAtA[i] = 0x42 + } + } + if len(m.BindingConditions) > 0 { + for iNdEx := len(m.BindingConditions) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.BindingConditions[iNdEx]) + copy(dAtA[i:], m.BindingConditions[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.BindingConditions[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } + if len(m.Tolerations) > 0 { + for iNdEx := len(m.Tolerations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tolerations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.AdminAccess != nil { + i-- + if *m.AdminAccess { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + i -= len(m.Device) + copy(dAtA[i:], m.Device) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Device))) + i-- + dAtA[i] = 0x22 + i -= len(m.Pool) + copy(dAtA[i:], m.Pool) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Pool))) + i-- + dAtA[i] = 0x1a + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0x12 + i -= len(m.Request) + copy(dAtA[i:], m.Request) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Request))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceSelector) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceSelector) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CEL != nil { + { + size, err := m.CEL.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *DeviceSubRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceSubRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceSubRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Capacity != nil { + { + size, err := m.Capacity.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.Tolerations) > 0 { + for iNdEx := len(m.Tolerations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tolerations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x28 + i -= len(m.AllocationMode) + copy(dAtA[i:], m.AllocationMode) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AllocationMode))) + i-- + dAtA[i] = 0x22 + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + i -= len(m.DeviceClassName) + copy(dAtA[i:], m.DeviceClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DeviceClassName))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceTaint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceTaint) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceTaint) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TimeAdded != nil { + { + size, err := m.TimeAdded.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + i -= len(m.Effect) + copy(dAtA[i:], m.Effect) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Effect))) + i-- + dAtA[i] = 0x1a + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *DeviceToleration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceToleration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceToleration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TolerationSeconds != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.TolerationSeconds)) + i-- + dAtA[i] = 0x28 + } + i -= len(m.Effect) + copy(dAtA[i:], m.Effect) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Effect))) + i-- + dAtA[i] = 0x22 + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + i -= len(m.Operator) + copy(dAtA[i:], m.Operator) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i-- + dAtA[i] = 0x12 + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ExactDeviceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExactDeviceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExactDeviceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Capacity != nil { + { + size, err := m.Capacity.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.Tolerations) > 0 { + for iNdEx := len(m.Tolerations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tolerations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.AdminAccess != nil { + i-- + if *m.AdminAccess { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x20 + i -= len(m.AllocationMode) + copy(dAtA[i:], m.AllocationMode) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.AllocationMode))) + i-- + dAtA[i] = 0x1a + if len(m.Selectors) > 0 { + for iNdEx := len(m.Selectors) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Selectors[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.DeviceClassName) + copy(dAtA[i:], m.DeviceClassName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DeviceClassName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *NetworkDeviceData) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkDeviceData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NetworkDeviceData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.HardwareAddress) + copy(dAtA[i:], m.HardwareAddress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.HardwareAddress))) + i-- + dAtA[i] = 0x1a + if len(m.IPs) > 0 { + for iNdEx := len(m.IPs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.IPs[iNdEx]) + copy(dAtA[i:], m.IPs[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.IPs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + i -= len(m.InterfaceName) + copy(dAtA[i:], m.InterfaceName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.InterfaceName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *OpaqueDeviceConfiguration) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OpaqueDeviceConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OpaqueDeviceConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Parameters.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaim) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaim) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaim) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimConsumerReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimConsumerReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimConsumerReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.UID) + copy(dAtA[i:], m.UID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.UID))) + i-- + dAtA[i] = 0x2a + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x22 + i -= len(m.Resource) + copy(dAtA[i:], m.Resource) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resource))) + i-- + dAtA[i] = 0x1a + i -= len(m.APIGroup) + copy(dAtA[i:], m.APIGroup) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Devices.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.ReservedFor) > 0 { + for iNdEx := len(m.ReservedFor) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ReservedFor[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Allocation != nil { + { + size, err := m.Allocation.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResourceClaimTemplate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimTemplate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimTemplateList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimTemplateList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimTemplateList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceClaimTemplateSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceClaimTemplateSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceClaimTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourcePool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourcePool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourcePool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceSliceCount)) + i-- + dAtA[i] = 0x18 + i = encodeVarintGenerated(dAtA, i, uint64(m.Generation)) + i-- + dAtA[i] = 0x10 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceSlice) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceSlice) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceSlice) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceSliceList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceSliceList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceSliceList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ResourceSliceSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceSliceSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResourceSliceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SharedCounters) > 0 { + for iNdEx := len(m.SharedCounters) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SharedCounters[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + } + if m.PerDeviceNodeSelection != nil { + i-- + if *m.PerDeviceNodeSelection { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + if m.AllNodes != nil { + i-- + if *m.AllNodes { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x28 + } + if m.NodeSelector != nil { + { + size, err := m.NodeSelector.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.NodeName != nil { + i -= len(*m.NodeName) + copy(dAtA[i:], *m.NodeName) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.NodeName))) + i-- + dAtA[i] = 0x1a + } + { + size, err := m.Pool.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.Driver) + copy(dAtA[i:], m.Driver) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Driver))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *AllocatedDeviceStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Pool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Device) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NetworkData != nil { + l = m.NetworkData.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ShareID != nil { + l = len(*m.ShareID) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *AllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Devices.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AllocationTimestamp != nil { + l = m.AllocationTimestamp.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CELDeviceSelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *CapacityRequestPolicy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Default != nil { + l = m.Default.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ValidValues) > 0 { + for _, e := range m.ValidValues { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.ValidRange != nil { + l = m.ValidRange.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CapacityRequestPolicyRange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Min != nil { + l = m.Min.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Max != nil { + l = m.Max.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Step != nil { + l = m.Step.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CapacityRequirements) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for k, v := range m.Requests { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *Counter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Value.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *CounterSet) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Counters) > 0 { + for k, v := range m.Counters { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *Device) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Attributes) > 0 { + for k, v := range m.Attributes { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.Capacity) > 0 { + for k, v := range m.Capacity { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.ConsumesCounters) > 0 { + for _, e := range m.ConsumesCounters { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.NodeName != nil { + l = len(*m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AllNodes != nil { + n += 2 + } + if len(m.Taints) > 0 { + for _, e := range m.Taints { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.BindsToNode != nil { + n += 2 + } + if len(m.BindingConditions) > 0 { + for _, s := range m.BindingConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.BindingFailureConditions) > 0 { + for _, s := range m.BindingFailureConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.AllowMultipleAllocations != nil { + n += 2 + } + return n +} + +func (m *DeviceAllocationConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Source) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceAllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceAttribute) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.IntValue != nil { + n += 1 + sovGenerated(uint64(*m.IntValue)) + } + if m.BoolValue != nil { + n += 2 + } + if m.StringValue != nil { + l = len(*m.StringValue) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.VersionValue != nil { + l = len(*m.VersionValue) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceCapacity) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Value.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.RequestPolicy != nil { + l = m.RequestPolicy.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceClaim) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, e := range m.Requests { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Constraints) > 0 { + for _, e := range m.Constraints { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceClaimConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClass) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClassConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.DeviceConfiguration.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *DeviceClassList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceClassSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Config) > 0 { + for _, e := range m.Config { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.ExtendedResourceName != nil { + l = len(*m.ExtendedResourceName) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Opaque != nil { + l = m.Opaque.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceConstraint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Requests) > 0 { + for _, s := range m.Requests { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.MatchAttribute != nil { + l = len(*m.MatchAttribute) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.DistinctAttribute != nil { + l = len(*m.DistinctAttribute) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceCounterConsumption) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.CounterSet) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Counters) > 0 { + for k, v := range m.Counters { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *DeviceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Exactly != nil { + l = m.Exactly.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.FirstAvailable) > 0 { + for _, e := range m.FirstAvailable { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *DeviceRequestAllocationResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Request) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Pool) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Device) + n += 1 + l + sovGenerated(uint64(l)) + if m.AdminAccess != nil { + n += 2 + } + if len(m.Tolerations) > 0 { + for _, e := range m.Tolerations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.BindingConditions) > 0 { + for _, s := range m.BindingConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.BindingFailureConditions) > 0 { + for _, s := range m.BindingFailureConditions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.ShareID != nil { + l = len(*m.ShareID) + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ConsumedCapacity) > 0 { + for k, v := range m.ConsumedCapacity { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *DeviceSelector) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CEL != nil { + l = m.CEL.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceSubRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.DeviceClassName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.AllocationMode) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Count)) + if len(m.Tolerations) > 0 { + for _, e := range m.Tolerations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Capacity != nil { + l = m.Capacity.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceTaint) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Value) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Effect) + n += 1 + l + sovGenerated(uint64(l)) + if m.TimeAdded != nil { + l = m.TimeAdded.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *DeviceToleration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Value) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Effect) + n += 1 + l + sovGenerated(uint64(l)) + if m.TolerationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.TolerationSeconds)) + } + return n +} + +func (m *ExactDeviceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DeviceClassName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Selectors) > 0 { + for _, e := range m.Selectors { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.AllocationMode) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Count)) + if m.AdminAccess != nil { + n += 2 + } + if len(m.Tolerations) > 0 { + for _, e := range m.Tolerations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.Capacity != nil { + l = m.Capacity.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *NetworkDeviceData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.InterfaceName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.IPs) > 0 { + for _, s := range m.IPs { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = len(m.HardwareAddress) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *OpaqueDeviceConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Parameters.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaim) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimConsumerReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Resource) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.UID) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceClaimSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Devices.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Allocation != nil { + l = m.Allocation.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.ReservedFor) > 0 { + for _, e := range m.ReservedFor { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceClaimTemplate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceClaimTemplateList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceClaimTemplateSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourcePool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Generation)) + n += 1 + sovGenerated(uint64(m.ResourceSliceCount)) + return n +} + +func (m *ResourceSlice) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceSliceList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ResourceSliceSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Driver) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Pool.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.NodeName != nil { + l = len(*m.NodeName) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.NodeSelector != nil { + l = m.NodeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AllNodes != nil { + n += 2 + } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if m.PerDeviceNodeSelection != nil { + n += 2 + } + if len(m.SharedCounters) > 0 { + for _, e := range m.SharedCounters { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *AllocatedDeviceStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForConditions := "[]Condition{" + for _, f := range this.Conditions { + repeatedStringForConditions += fmt.Sprintf("%v", f) + "," + } + repeatedStringForConditions += "}" + s := strings.Join([]string{`&AllocatedDeviceStatus{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, + `Conditions:` + repeatedStringForConditions + `,`, + `Data:` + strings.Replace(fmt.Sprintf("%v", this.Data), "RawExtension", "runtime.RawExtension", 1) + `,`, + `NetworkData:` + strings.Replace(this.NetworkData.String(), "NetworkDeviceData", "NetworkDeviceData", 1) + `,`, + `ShareID:` + valueToStringGenerated(this.ShareID) + `,`, + `}`, + }, "") + return s +} +func (this *AllocationResult) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AllocationResult{`, + `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceAllocationResult", "DeviceAllocationResult", 1), `&`, ``, 1) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `AllocationTimestamp:` + strings.Replace(fmt.Sprintf("%v", this.AllocationTimestamp), "Time", "v1.Time", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CELDeviceSelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CELDeviceSelector{`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, + `}`, + }, "") + return s +} +func (this *CapacityRequestPolicy) String() string { + if this == nil { + return "nil" + } + repeatedStringForValidValues := "[]Quantity{" + for _, f := range this.ValidValues { + repeatedStringForValidValues += fmt.Sprintf("%v", f) + "," + } + repeatedStringForValidValues += "}" + s := strings.Join([]string{`&CapacityRequestPolicy{`, + `Default:` + strings.Replace(fmt.Sprintf("%v", this.Default), "Quantity", "resource.Quantity", 1) + `,`, + `ValidValues:` + repeatedStringForValidValues + `,`, + `ValidRange:` + strings.Replace(this.ValidRange.String(), "CapacityRequestPolicyRange", "CapacityRequestPolicyRange", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CapacityRequestPolicyRange) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CapacityRequestPolicyRange{`, + `Min:` + strings.Replace(fmt.Sprintf("%v", this.Min), "Quantity", "resource.Quantity", 1) + `,`, + `Max:` + strings.Replace(fmt.Sprintf("%v", this.Max), "Quantity", "resource.Quantity", 1) + `,`, + `Step:` + strings.Replace(fmt.Sprintf("%v", this.Step), "Quantity", "resource.Quantity", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CapacityRequirements) String() string { + if this == nil { + return "nil" + } + keysForRequests := make([]string, 0, len(this.Requests)) + for k := range this.Requests { + keysForRequests = append(keysForRequests, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForRequests) + mapStringForRequests := "map[QualifiedName]resource.Quantity{" + for _, k := range keysForRequests { + mapStringForRequests += fmt.Sprintf("%v: %v,", k, this.Requests[QualifiedName(k)]) + } + mapStringForRequests += "}" + s := strings.Join([]string{`&CapacityRequirements{`, + `Requests:` + mapStringForRequests + `,`, + `}`, + }, "") + return s +} +func (this *Counter) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Counter{`, + `Value:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Value), "Quantity", "resource.Quantity", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CounterSet) String() string { + if this == nil { + return "nil" + } + keysForCounters := make([]string, 0, len(this.Counters)) + for k := range this.Counters { + keysForCounters = append(keysForCounters, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + mapStringForCounters := "map[string]Counter{" + for _, k := range keysForCounters { + mapStringForCounters += fmt.Sprintf("%v: %v,", k, this.Counters[k]) + } + mapStringForCounters += "}" + s := strings.Join([]string{`&CounterSet{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Counters:` + mapStringForCounters + `,`, + `}`, + }, "") + return s +} +func (this *Device) String() string { + if this == nil { + return "nil" + } + repeatedStringForConsumesCounters := "[]DeviceCounterConsumption{" + for _, f := range this.ConsumesCounters { + repeatedStringForConsumesCounters += strings.Replace(strings.Replace(f.String(), "DeviceCounterConsumption", "DeviceCounterConsumption", 1), `&`, ``, 1) + "," + } + repeatedStringForConsumesCounters += "}" + repeatedStringForTaints := "[]DeviceTaint{" + for _, f := range this.Taints { + repeatedStringForTaints += fmt.Sprintf("%v", f) + "," + } + repeatedStringForTaints += "}" + keysForAttributes := make([]string, 0, len(this.Attributes)) + for k := range this.Attributes { + keysForAttributes = append(keysForAttributes, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForAttributes) + mapStringForAttributes := "map[QualifiedName]DeviceAttribute{" + for _, k := range keysForAttributes { + mapStringForAttributes += fmt.Sprintf("%v: %v,", k, this.Attributes[QualifiedName(k)]) + } + mapStringForAttributes += "}" + keysForCapacity := make([]string, 0, len(this.Capacity)) + for k := range this.Capacity { + keysForCapacity = append(keysForCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCapacity) + mapStringForCapacity := "map[QualifiedName]DeviceCapacity{" + for _, k := range keysForCapacity { + mapStringForCapacity += fmt.Sprintf("%v: %v,", k, this.Capacity[QualifiedName(k)]) + } + mapStringForCapacity += "}" + s := strings.Join([]string{`&Device{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Attributes:` + mapStringForAttributes + `,`, + `Capacity:` + mapStringForCapacity + `,`, + `ConsumesCounters:` + repeatedStringForConsumesCounters + `,`, + `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `AllNodes:` + valueToStringGenerated(this.AllNodes) + `,`, + `Taints:` + repeatedStringForTaints + `,`, + `BindsToNode:` + valueToStringGenerated(this.BindsToNode) + `,`, + `BindingConditions:` + fmt.Sprintf("%v", this.BindingConditions) + `,`, + `BindingFailureConditions:` + fmt.Sprintf("%v", this.BindingFailureConditions) + `,`, + `AllowMultipleAllocations:` + valueToStringGenerated(this.AllowMultipleAllocations) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAllocationConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAllocationConfiguration{`, + `Source:` + fmt.Sprintf("%v", this.Source) + `,`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAllocationResult) String() string { + if this == nil { + return "nil" + } + repeatedStringForResults := "[]DeviceRequestAllocationResult{" + for _, f := range this.Results { + repeatedStringForResults += strings.Replace(strings.Replace(f.String(), "DeviceRequestAllocationResult", "DeviceRequestAllocationResult", 1), `&`, ``, 1) + "," + } + repeatedStringForResults += "}" + repeatedStringForConfig := "[]DeviceAllocationConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceAllocationConfiguration", "DeviceAllocationConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceAllocationResult{`, + `Results:` + repeatedStringForResults + `,`, + `Config:` + repeatedStringForConfig + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAttribute) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAttribute{`, + `IntValue:` + valueToStringGenerated(this.IntValue) + `,`, + `BoolValue:` + valueToStringGenerated(this.BoolValue) + `,`, + `StringValue:` + valueToStringGenerated(this.StringValue) + `,`, + `VersionValue:` + valueToStringGenerated(this.VersionValue) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceCapacity) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceCapacity{`, + `Value:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Value), "Quantity", "resource.Quantity", 1), `&`, ``, 1) + `,`, + `RequestPolicy:` + strings.Replace(this.RequestPolicy.String(), "CapacityRequestPolicy", "CapacityRequestPolicy", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClaim) String() string { + if this == nil { + return "nil" + } + repeatedStringForRequests := "[]DeviceRequest{" + for _, f := range this.Requests { + repeatedStringForRequests += strings.Replace(strings.Replace(f.String(), "DeviceRequest", "DeviceRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForRequests += "}" + repeatedStringForConstraints := "[]DeviceConstraint{" + for _, f := range this.Constraints { + repeatedStringForConstraints += strings.Replace(strings.Replace(f.String(), "DeviceConstraint", "DeviceConstraint", 1), `&`, ``, 1) + "," + } + repeatedStringForConstraints += "}" + repeatedStringForConfig := "[]DeviceClaimConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceClaimConfiguration", "DeviceClaimConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceClaim{`, + `Requests:` + repeatedStringForRequests + `,`, + `Constraints:` + repeatedStringForConstraints + `,`, + `Config:` + repeatedStringForConfig + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClaimConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClaimConfiguration{`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClass) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClass{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "DeviceClassSpec", "DeviceClassSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceClassConfiguration{`, + `DeviceConfiguration:` + strings.Replace(strings.Replace(this.DeviceConfiguration.String(), "DeviceConfiguration", "DeviceConfiguration", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]DeviceClass{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "DeviceClass", "DeviceClass", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&DeviceClassList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *DeviceClassSpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForConfig := "[]DeviceClassConfiguration{" + for _, f := range this.Config { + repeatedStringForConfig += strings.Replace(strings.Replace(f.String(), "DeviceClassConfiguration", "DeviceClassConfiguration", 1), `&`, ``, 1) + "," + } + repeatedStringForConfig += "}" + s := strings.Join([]string{`&DeviceClassSpec{`, + `Selectors:` + repeatedStringForSelectors + `,`, + `Config:` + repeatedStringForConfig + `,`, + `ExtendedResourceName:` + valueToStringGenerated(this.ExtendedResourceName) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceConfiguration{`, + `Opaque:` + strings.Replace(this.Opaque.String(), "OpaqueDeviceConfiguration", "OpaqueDeviceConfiguration", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceConstraint) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceConstraint{`, + `Requests:` + fmt.Sprintf("%v", this.Requests) + `,`, + `MatchAttribute:` + valueToStringGenerated(this.MatchAttribute) + `,`, + `DistinctAttribute:` + valueToStringGenerated(this.DistinctAttribute) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceCounterConsumption) String() string { + if this == nil { + return "nil" + } + keysForCounters := make([]string, 0, len(this.Counters)) + for k := range this.Counters { + keysForCounters = append(keysForCounters, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForCounters) + mapStringForCounters := "map[string]Counter{" + for _, k := range keysForCounters { + mapStringForCounters += fmt.Sprintf("%v: %v,", k, this.Counters[k]) + } + mapStringForCounters += "}" + s := strings.Join([]string{`&DeviceCounterConsumption{`, + `CounterSet:` + fmt.Sprintf("%v", this.CounterSet) + `,`, + `Counters:` + mapStringForCounters + `,`, + `}`, + }, "") + return s +} +func (this *DeviceRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForFirstAvailable := "[]DeviceSubRequest{" + for _, f := range this.FirstAvailable { + repeatedStringForFirstAvailable += strings.Replace(strings.Replace(f.String(), "DeviceSubRequest", "DeviceSubRequest", 1), `&`, ``, 1) + "," + } + repeatedStringForFirstAvailable += "}" + s := strings.Join([]string{`&DeviceRequest{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Exactly:` + strings.Replace(this.Exactly.String(), "ExactDeviceRequest", "ExactDeviceRequest", 1) + `,`, + `FirstAvailable:` + repeatedStringForFirstAvailable + `,`, + `}`, + }, "") + return s +} +func (this *DeviceRequestAllocationResult) String() string { + if this == nil { + return "nil" + } + repeatedStringForTolerations := "[]DeviceToleration{" + for _, f := range this.Tolerations { + repeatedStringForTolerations += strings.Replace(strings.Replace(f.String(), "DeviceToleration", "DeviceToleration", 1), `&`, ``, 1) + "," + } + repeatedStringForTolerations += "}" + keysForConsumedCapacity := make([]string, 0, len(this.ConsumedCapacity)) + for k := range this.ConsumedCapacity { + keysForConsumedCapacity = append(keysForConsumedCapacity, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForConsumedCapacity) + mapStringForConsumedCapacity := "map[QualifiedName]resource.Quantity{" + for _, k := range keysForConsumedCapacity { + mapStringForConsumedCapacity += fmt.Sprintf("%v: %v,", k, this.ConsumedCapacity[QualifiedName(k)]) + } + mapStringForConsumedCapacity += "}" + s := strings.Join([]string{`&DeviceRequestAllocationResult{`, + `Request:` + fmt.Sprintf("%v", this.Request) + `,`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + fmt.Sprintf("%v", this.Pool) + `,`, + `Device:` + fmt.Sprintf("%v", this.Device) + `,`, + `AdminAccess:` + valueToStringGenerated(this.AdminAccess) + `,`, + `Tolerations:` + repeatedStringForTolerations + `,`, + `BindingConditions:` + fmt.Sprintf("%v", this.BindingConditions) + `,`, + `BindingFailureConditions:` + fmt.Sprintf("%v", this.BindingFailureConditions) + `,`, + `ShareID:` + valueToStringGenerated(this.ShareID) + `,`, + `ConsumedCapacity:` + mapStringForConsumedCapacity + `,`, + `}`, + }, "") + return s +} +func (this *DeviceSelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceSelector{`, + `CEL:` + strings.Replace(this.CEL.String(), "CELDeviceSelector", "CELDeviceSelector", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceSubRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForTolerations := "[]DeviceToleration{" + for _, f := range this.Tolerations { + repeatedStringForTolerations += strings.Replace(strings.Replace(f.String(), "DeviceToleration", "DeviceToleration", 1), `&`, ``, 1) + "," + } + repeatedStringForTolerations += "}" + s := strings.Join([]string{`&DeviceSubRequest{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `DeviceClassName:` + fmt.Sprintf("%v", this.DeviceClassName) + `,`, + `Selectors:` + repeatedStringForSelectors + `,`, + `AllocationMode:` + fmt.Sprintf("%v", this.AllocationMode) + `,`, + `Count:` + fmt.Sprintf("%v", this.Count) + `,`, + `Tolerations:` + repeatedStringForTolerations + `,`, + `Capacity:` + strings.Replace(this.Capacity.String(), "CapacityRequirements", "CapacityRequirements", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceToleration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceToleration{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `Effect:` + fmt.Sprintf("%v", this.Effect) + `,`, + `TolerationSeconds:` + valueToStringGenerated(this.TolerationSeconds) + `,`, + `}`, + }, "") + return s +} +func (this *ExactDeviceRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForSelectors := "[]DeviceSelector{" + for _, f := range this.Selectors { + repeatedStringForSelectors += strings.Replace(strings.Replace(f.String(), "DeviceSelector", "DeviceSelector", 1), `&`, ``, 1) + "," + } + repeatedStringForSelectors += "}" + repeatedStringForTolerations := "[]DeviceToleration{" + for _, f := range this.Tolerations { + repeatedStringForTolerations += strings.Replace(strings.Replace(f.String(), "DeviceToleration", "DeviceToleration", 1), `&`, ``, 1) + "," + } + repeatedStringForTolerations += "}" + s := strings.Join([]string{`&ExactDeviceRequest{`, + `DeviceClassName:` + fmt.Sprintf("%v", this.DeviceClassName) + `,`, + `Selectors:` + repeatedStringForSelectors + `,`, + `AllocationMode:` + fmt.Sprintf("%v", this.AllocationMode) + `,`, + `Count:` + fmt.Sprintf("%v", this.Count) + `,`, + `AdminAccess:` + valueToStringGenerated(this.AdminAccess) + `,`, + `Tolerations:` + repeatedStringForTolerations + `,`, + `Capacity:` + strings.Replace(this.Capacity.String(), "CapacityRequirements", "CapacityRequirements", 1) + `,`, + `}`, + }, "") + return s +} +func (this *NetworkDeviceData) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkDeviceData{`, + `InterfaceName:` + fmt.Sprintf("%v", this.InterfaceName) + `,`, + `IPs:` + fmt.Sprintf("%v", this.IPs) + `,`, + `HardwareAddress:` + fmt.Sprintf("%v", this.HardwareAddress) + `,`, + `}`, + }, "") + return s +} +func (this *OpaqueDeviceConfiguration) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&OpaqueDeviceConfiguration{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Parameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Parameters), "RawExtension", "runtime.RawExtension", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaim) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaim{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "ResourceClaimStatus", "ResourceClaimStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimConsumerReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimConsumerReference{`, + `APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`, + `Resource:` + fmt.Sprintf("%v", this.Resource) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `UID:` + fmt.Sprintf("%v", this.UID) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ResourceClaim{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClaim", "ResourceClaim", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ResourceClaimList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimSpec{`, + `Devices:` + strings.Replace(strings.Replace(this.Devices.String(), "DeviceClaim", "DeviceClaim", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimStatus) String() string { + if this == nil { + return "nil" + } + repeatedStringForReservedFor := "[]ResourceClaimConsumerReference{" + for _, f := range this.ReservedFor { + repeatedStringForReservedFor += strings.Replace(strings.Replace(f.String(), "ResourceClaimConsumerReference", "ResourceClaimConsumerReference", 1), `&`, ``, 1) + "," + } + repeatedStringForReservedFor += "}" + repeatedStringForDevices := "[]AllocatedDeviceStatus{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "AllocatedDeviceStatus", "AllocatedDeviceStatus", 1), `&`, ``, 1) + "," + } + repeatedStringForDevices += "}" + s := strings.Join([]string{`&ResourceClaimStatus{`, + `Allocation:` + strings.Replace(this.Allocation.String(), "AllocationResult", "AllocationResult", 1) + `,`, + `ReservedFor:` + repeatedStringForReservedFor + `,`, + `Devices:` + repeatedStringForDevices + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimTemplate) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimTemplate{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimTemplateSpec", "ResourceClaimTemplateSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimTemplateList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ResourceClaimTemplate{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceClaimTemplate", "ResourceClaimTemplate", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ResourceClaimTemplateList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ResourceClaimTemplateSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceClaimTemplateSpec{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceClaimSpec", "ResourceClaimSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourcePool) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourcePool{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Generation:` + fmt.Sprintf("%v", this.Generation) + `,`, + `ResourceSliceCount:` + fmt.Sprintf("%v", this.ResourceSliceCount) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceSlice) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceSlice{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "ResourceSliceSpec", "ResourceSliceSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceSliceList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ResourceSlice{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ResourceSlice", "ResourceSlice", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ResourceSliceList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *ResourceSliceSpec) String() string { + if this == nil { + return "nil" + } + repeatedStringForDevices := "[]Device{" + for _, f := range this.Devices { + repeatedStringForDevices += strings.Replace(strings.Replace(f.String(), "Device", "Device", 1), `&`, ``, 1) + "," + } + repeatedStringForDevices += "}" + repeatedStringForSharedCounters := "[]CounterSet{" + for _, f := range this.SharedCounters { + repeatedStringForSharedCounters += strings.Replace(strings.Replace(f.String(), "CounterSet", "CounterSet", 1), `&`, ``, 1) + "," + } + repeatedStringForSharedCounters += "}" + s := strings.Join([]string{`&ResourceSliceSpec{`, + `Driver:` + fmt.Sprintf("%v", this.Driver) + `,`, + `Pool:` + strings.Replace(strings.Replace(this.Pool.String(), "ResourcePool", "ResourcePool", 1), `&`, ``, 1) + `,`, + `NodeName:` + valueToStringGenerated(this.NodeName) + `,`, + `NodeSelector:` + strings.Replace(fmt.Sprintf("%v", this.NodeSelector), "NodeSelector", "v11.NodeSelector", 1) + `,`, + `AllNodes:` + valueToStringGenerated(this.AllNodes) + `,`, + `Devices:` + repeatedStringForDevices + `,`, + `PerDeviceNodeSelection:` + valueToStringGenerated(this.PerDeviceNodeSelection) + `,`, + `SharedCounters:` + repeatedStringForSharedCounters + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *AllocatedDeviceStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocatedDeviceStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocatedDeviceStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pool = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Device = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, v1.Condition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &runtime.RawExtension{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NetworkData == nil { + m.NetworkData = &NetworkDeviceData{} + } + if err := m.NetworkData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ShareID = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AllocationResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Devices.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AllocationTimestamp == nil { + m.AllocationTimestamp = &v1.Time{} + } + if err := m.AllocationTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CELDeviceSelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CELDeviceSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CELDeviceSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapacityRequestPolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapacityRequestPolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapacityRequestPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Default == nil { + m.Default = &resource.Quantity{} + } + if err := m.Default.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidValues", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidValues = append(m.ValidValues, resource.Quantity{}) + if err := m.ValidValues[len(m.ValidValues)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidRange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ValidRange == nil { + m.ValidRange = &CapacityRequestPolicyRange{} + } + if err := m.ValidRange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapacityRequestPolicyRange) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapacityRequestPolicyRange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapacityRequestPolicyRange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Min", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Min == nil { + m.Min = &resource.Quantity{} + } + if err := m.Min.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Max", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Max == nil { + m.Max = &resource.Quantity{} + } + if err := m.Max.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Step", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Step == nil { + m.Step = &resource.Quantity{} + } + if err := m.Step.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapacityRequirements) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapacityRequirements: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapacityRequirements: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Requests == nil { + m.Requests = make(map[QualifiedName]resource.Quantity) + } + var mapkey QualifiedName + mapvalue := &resource.Quantity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Requests[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Counter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Counter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Counter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CounterSet) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CounterSet: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CounterSet: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Counters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Counters == nil { + m.Counters = make(map[string]Counter) + } + var mapkey string + mapvalue := &Counter{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Counter{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Counters[mapkey] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Device) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Device: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Attributes == nil { + m.Attributes = make(map[QualifiedName]DeviceAttribute) + } + var mapkey QualifiedName + mapvalue := &DeviceAttribute{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &DeviceAttribute{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Attributes[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = make(map[QualifiedName]DeviceCapacity) + } + var mapkey QualifiedName + mapvalue := &DeviceCapacity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &DeviceCapacity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Capacity[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsumesCounters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConsumesCounters = append(m.ConsumesCounters, DeviceCounterConsumption{}) + if err := m.ConsumesCounters[len(m.ConsumesCounters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllNodes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AllNodes = &b + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taints = append(m.Taints, DeviceTaint{}) + if err := m.Taints[len(m.Taints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BindsToNode", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.BindsToNode = &b + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingConditions = append(m.BindingConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingFailureConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingFailureConditions = append(m.BindingFailureConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowMultipleAllocations", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AllowMultipleAllocations = &b + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAllocationConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAllocationConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAllocationConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Source = AllocationConfigSource(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAllocationResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Results = append(m.Results, DeviceRequestAllocationResult{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = append(m.Config, DeviceAllocationConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAttribute) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAttribute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAttribute: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IntValue", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IntValue = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BoolValue", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.BoolValue = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StringValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.StringValue = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VersionValue", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.VersionValue = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceCapacity) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceCapacity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceCapacity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestPolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RequestPolicy == nil { + m.RequestPolicy = &CapacityRequestPolicy{} + } + if err := m.RequestPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClaim) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClaim: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClaim: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, DeviceRequest{}) + if err := m.Requests[len(m.Requests)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Constraints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Constraints = append(m.Constraints, DeviceConstraint{}) + if err := m.Constraints[len(m.Constraints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = append(m.Config, DeviceClaimConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClaimConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClaimConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClaimConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClass) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClass: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClassConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClassConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceConfiguration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeviceConfiguration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClassList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClassList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, DeviceClass{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceClassSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceClassSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceClassSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = append(m.Config, DeviceClassConfiguration{}) + if err := m.Config[len(m.Config)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtendedResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ExtendedResourceName = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Opaque", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Opaque == nil { + m.Opaque = &OpaqueDeviceConfiguration{} + } + if err := m.Opaque.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceConstraint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceConstraint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceConstraint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Requests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Requests = append(m.Requests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchAttribute", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FullyQualifiedName(dAtA[iNdEx:postIndex]) + m.MatchAttribute = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DistinctAttribute", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := FullyQualifiedName(dAtA[iNdEx:postIndex]) + m.DistinctAttribute = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceCounterConsumption) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceCounterConsumption: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceCounterConsumption: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CounterSet", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CounterSet = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Counters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Counters == nil { + m.Counters = make(map[string]Counter) + } + var mapkey string + mapvalue := &Counter{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Counter{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Counters[mapkey] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exactly", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Exactly == nil { + m.Exactly = &ExactDeviceRequest{} + } + if err := m.Exactly.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FirstAvailable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FirstAvailable = append(m.FirstAvailable, DeviceSubRequest{}) + if err := m.FirstAvailable[len(m.FirstAvailable)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceRequestAllocationResult) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceRequestAllocationResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceRequestAllocationResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Request = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pool = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Device = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminAccess", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AdminAccess = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tolerations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tolerations = append(m.Tolerations, DeviceToleration{}) + if err := m.Tolerations[len(m.Tolerations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingConditions = append(m.BindingConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BindingFailureConditions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BindingFailureConditions = append(m.BindingFailureConditions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + m.ShareID = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsumedCapacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsumedCapacity == nil { + m.ConsumedCapacity = make(map[QualifiedName]resource.Quantity) + } + var mapkey QualifiedName + mapvalue := &resource.Quantity{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = QualifiedName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ConsumedCapacity[QualifiedName(mapkey)] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceSelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CEL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CEL == nil { + m.CEL = &CELDeviceSelector{} + } + if err := m.CEL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceSubRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceSubRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceSubRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeviceClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllocationMode = DeviceAllocationMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tolerations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tolerations = append(m.Tolerations, DeviceToleration{}) + if err := m.Tolerations[len(m.Tolerations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = &CapacityRequirements{} + } + if err := m.Capacity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceTaint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceTaint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceTaint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Effect", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Effect = DeviceTaintEffect(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeAdded", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TimeAdded == nil { + m.TimeAdded = &v1.Time{} + } + if err := m.TimeAdded.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceToleration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceToleration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceToleration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operator = DeviceTolerationOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Effect", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Effect = DeviceTaintEffect(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TolerationSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TolerationSeconds = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExactDeviceRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExactDeviceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExactDeviceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeviceClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selectors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Selectors = append(m.Selectors, DeviceSelector{}) + if err := m.Selectors[len(m.Selectors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllocationMode = DeviceAllocationMode(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminAccess", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AdminAccess = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tolerations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tolerations = append(m.Tolerations, DeviceToleration{}) + if err := m.Tolerations[len(m.Tolerations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Capacity == nil { + m.Capacity = &CapacityRequirements{} + } + if err := m.Capacity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NetworkDeviceData) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetworkDeviceData: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetworkDeviceData: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InterfaceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InterfaceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPs = append(m.IPs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HardwareAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HardwareAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OpaqueDeviceConfiguration) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OpaqueDeviceConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OpaqueDeviceConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Parameters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaim) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaim: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaim: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimConsumerReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimConsumerReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimConsumerReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIGroup = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resource = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ResourceClaim{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Devices.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Allocation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Allocation == nil { + m.Allocation = &AllocationResult{} + } + if err := m.Allocation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReservedFor", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReservedFor = append(m.ReservedFor, ResourceClaimConsumerReference{}) + if err := m.ReservedFor[len(m.ReservedFor)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, AllocatedDeviceStatus{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimTemplate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimTemplate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimTemplate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimTemplateList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimTemplateList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimTemplateList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ResourceClaimTemplate{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceClaimTemplateSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceClaimTemplateSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceClaimTemplateSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourcePool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourcePool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourcePool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Generation", wireType) + } + m.Generation = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Generation |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceSliceCount", wireType) + } + m.ResourceSliceCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ResourceSliceCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceSlice) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceSlice: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceSlice: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceSliceList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceSliceList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceSliceList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ResourceSlice{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceSliceSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceSliceSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceSliceSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Driver = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Pool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.NodeName = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeSelector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeSelector == nil { + m.NodeSelector = &v11.NodeSelector{} + } + if err := m.NodeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllNodes", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.AllNodes = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, Device{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PerDeviceNodeSelection", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.PerDeviceNodeSelection = &b + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SharedCounters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SharedCounters = append(m.SharedCounters, CounterSet{}) + if err := m.SharedCounters[len(m.SharedCounters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenerated + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenerated + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") +) diff --git a/vendor/k8s.io/api/resource/v1/generated.proto b/vendor/k8s.io/api/resource/v1/generated.proto new file mode 100644 index 0000000000..816a430c26 --- /dev/null +++ b/vendor/k8s.io/api/resource/v1/generated.proto @@ -0,0 +1,1589 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = "proto2"; + +package k8s.io.api.resource.v1; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "k8s.io/api/resource/v1"; + +// AllocatedDeviceStatus contains the status of an allocated device, if the +// driver chooses to report it. This may include driver-specific information. +// +// The combination of Driver, Pool, Device, and ShareID must match the corresponding key +// in Status.Allocation.Devices. +message AllocatedDeviceStatus { + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 1; + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + optional string pool = 2; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 3; + + // ShareID uniquely identifies an individual allocation share of the device. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional string shareID = 7; + + // Conditions contains the latest observation of the device's state. + // If the device has been configured according to the class and claim + // config references, the `Ready` condition should be True. + // + // Must not contain more than 8 entries. + // + // +optional + // +listType=map + // +listMapKey=type + repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 4; + + // Data contains arbitrary driver-specific data. + // + // The length of the raw data must be smaller or equal to 10 Ki. + // + // +optional + optional .k8s.io.apimachinery.pkg.runtime.RawExtension data = 5; + + // NetworkData contains network-related information specific to the device. + // + // +optional + optional NetworkDeviceData networkData = 6; +} + +// AllocationResult contains attributes of an allocated resource. +message AllocationResult { + // Devices is the result of allocating devices. + // + // +optional + optional DeviceAllocationResult devices = 1; + + // NodeSelector defines where the allocated resources are available. If + // unset, they are available everywhere. + // + // +optional + optional .k8s.io.api.core.v1.NodeSelector nodeSelector = 3; + + // AllocationTimestamp stores the time when the resources were allocated. + // This field is not guaranteed to be set, in which case that time is unknown. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gate. + // + // +optional + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time allocationTimestamp = 5; +} + +// CELDeviceSelector contains a CEL expression for selecting a device. +message CELDeviceSelector { + // Expression is a CEL expression which evaluates a single device. It + // must evaluate to true when the device under consideration satisfies + // the desired criteria, and false when it does not. Any other result + // is an error and causes allocation of devices to abort. + // + // The expression's input is an object named "device", which carries + // the following properties: + // - driver (string): the name of the driver which defines this device. + // - attributes (map[string]object): the device's attributes, grouped by prefix + // (e.g. device.attributes["dra.example.com"] evaluates to an object with all + // of the attributes which were prefixed by "dra.example.com". + // - capacity (map[string]object): the device's capacities, grouped by prefix. + // - allowMultipleAllocations (bool): the allowMultipleAllocations property of the device + // (v1.34+ with the DRAConsumableCapacity feature enabled). + // + // Example: Consider a device with driver="dra.example.com", which exposes + // two attributes named "model" and "ext.example.com/family" and which + // exposes one capacity named "modules". This input to this expression + // would have the following fields: + // + // device.driver + // device.attributes["dra.example.com"].model + // device.attributes["ext.example.com"].family + // device.capacity["dra.example.com"].modules + // + // The device.driver field can be used to check for a specific driver, + // either as a high-level precondition (i.e. you only want to consider + // devices from this driver) or as part of a multi-clause expression + // that is meant to consider devices from different drivers. + // + // The value type of each attribute is defined by the device + // definition, and users who write these expressions must consult the + // documentation for their specific drivers. The value type of each + // capacity is Quantity. + // + // If an unknown prefix is used as a lookup in either device.attributes + // or device.capacity, an empty map will be returned. Any reference to + // an unknown field will cause an evaluation error and allocation to + // abort. + // + // A robust expression should check for the existence of attributes + // before referencing them. + // + // For ease of use, the cel.bind() function is enabled, and can be used + // to simplify expressions that access multiple attributes with the + // same domain. For example: + // + // cel.bind(dra, device.attributes["dra.example.com"], dra.someBool && dra.anotherBool) + // + // The length of the expression must be smaller or equal to 10 Ki. The + // cost of evaluating it is also limited based on the estimated number + // of logical steps. + // + // +required + optional string expression = 1; +} + +// CapacityRequestPolicy defines how requests consume device capacity. +// +// Must not set more than one ValidRequestValues. +message CapacityRequestPolicy { + // Default specifies how much of this capacity is consumed by a request + // that does not contain an entry for it in DeviceRequest's Capacity. + // + // +optional + optional .k8s.io.apimachinery.pkg.api.resource.Quantity default = 1; + + // ValidValues defines a set of acceptable quantity values in consuming requests. + // + // Must not contain more than 10 entries. + // Must be sorted in ascending order. + // + // If this field is set, + // Default must be defined and it must be included in ValidValues list. + // + // If the requested amount does not match any valid value but smaller than some valid values, + // the scheduler calculates the smallest valid value that is greater than or equal to the request. + // That is: min(ceil(requestedValue) ∈ validValues), where requestedValue ≤ max(validValues). + // + // If the requested amount exceeds all valid values, the request violates the policy, + // and this device cannot be allocated. + // + // +optional + // +listType=atomic + // +oneOf=ValidRequestValues + repeated .k8s.io.apimachinery.pkg.api.resource.Quantity validValues = 3; + + // ValidRange defines an acceptable quantity value range in consuming requests. + // + // If this field is set, + // Default must be defined and it must fall within the defined ValidRange. + // + // If the requested amount does not fall within the defined range, the request violates the policy, + // and this device cannot be allocated. + // + // If the request doesn't contain this capacity entry, Default value is used. + // + // +optional + // +oneOf=ValidRequestValues + optional CapacityRequestPolicyRange validRange = 4; +} + +// CapacityRequestPolicyRange defines a valid range for consumable capacity values. +// +// - If the requested amount is less than Min, it is rounded up to the Min value. +// - If Step is set and the requested amount is between Min and Max but not aligned with Step, +// it will be rounded up to the next value equal to Min + (n * Step). +// - If Step is not set, the requested amount is used as-is if it falls within the range Min to Max (if set). +// - If the requested or rounded amount exceeds Max (if set), the request does not satisfy the policy, +// and the device cannot be allocated. +message CapacityRequestPolicyRange { + // Min specifies the minimum capacity allowed for a consumption request. + // + // Min must be greater than or equal to zero, + // and less than or equal to the capacity value. + // requestPolicy.default must be more than or equal to the minimum. + // + // +required + optional .k8s.io.apimachinery.pkg.api.resource.Quantity min = 1; + + // Max defines the upper limit for capacity that can be requested. + // + // Max must be less than or equal to the capacity value. + // Min and requestPolicy.default must be less than or equal to the maximum. + // + // +optional + optional .k8s.io.apimachinery.pkg.api.resource.Quantity max = 2; + + // Step defines the step size between valid capacity amounts within the range. + // + // Max (if set) and requestPolicy.default must be a multiple of Step. + // Min + Step must be less than or equal to the capacity value. + // + // +optional + optional .k8s.io.apimachinery.pkg.api.resource.Quantity step = 3; +} + +// CapacityRequirements defines the capacity requirements for a specific device request. +message CapacityRequirements { + // Requests represent individual device resource requests for distinct resources, + // all of which must be provided by the device. + // + // This value is used as an additional filtering condition against the available capacity on the device. + // This is semantically equivalent to a CEL selector with + // `device.capacity[]..compareTo(quantity()) >= 0`. + // For example, device.capacity['test-driver.cdi.k8s.io'].counters.compareTo(quantity('2')) >= 0. + // + // When a requestPolicy is defined, the requested amount is adjusted upward + // to the nearest valid value based on the policy. + // If the requested amount cannot be adjusted to a valid value—because it exceeds what the requestPolicy allows— + // the device is considered ineligible for allocation. + // + // For any capacity that is not explicitly requested: + // - If no requestPolicy is set, the default consumed capacity is equal to the full device capacity + // (i.e., the whole device is claimed). + // - If a requestPolicy is set, the default consumed capacity is determined according to that policy. + // + // If the device allows multiple allocation, + // the aggregated amount across all requests must not exceed the capacity value. + // The consumed capacity, which may be adjusted based on the requestPolicy if defined, + // is recorded in the resource claim’s status.devices[*].consumedCapacity field. + // + // +optional + map requests = 1; +} + +// Counter describes a quantity associated with a device. +message Counter { + // Value defines how much of a certain device counter is available. + // + // +required + optional .k8s.io.apimachinery.pkg.api.resource.Quantity value = 1; +} + +// CounterSet defines a named set of counters +// that are available to be used by devices defined in the +// ResourceSlice. +// +// The counters are not allocatable by themselves, but +// can be referenced by devices. When a device is allocated, +// the portion of counters it uses will no longer be available for use +// by other devices. +message CounterSet { + // Name defines the name of the counter set. + // It must be a DNS label. + // + // +required + optional string name = 1; + + // Counters defines the set of counters for this CounterSet + // The name of each counter must be unique in that set and must be a DNS label. + // + // The maximum number of counters in all sets is 32. + // + // +required + map counters = 2; +} + +// Device represents one individual hardware instance that can be selected based +// on its attributes. Besides the name, exactly one field must be set. +message Device { + // Name is unique identifier among all devices managed by + // the driver in the pool. It must be a DNS label. + // + // +required + optional string name = 1; + + // Attributes defines the set of attributes for this device. + // The name of each attribute must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + map attributes = 2; + + // Capacity defines the set of capacities for this device. + // The name of each capacity must be unique in that set. + // + // The maximum number of attributes and capacities combined is 32. + // + // +optional + map capacity = 3; + + // ConsumesCounters defines a list of references to sharedCounters + // and the set of counters that the device will + // consume from those counter sets. + // + // There can only be a single entry per counterSet. + // + // The total number of device counter consumption entries + // must be <= 32. In addition, the total number in the + // entire ResourceSlice must be <= 1024 (for example, + // 64 devices with 16 counters each). + // + // +optional + // +listType=atomic + // +featureGate=DRAPartitionableDevices + repeated DeviceCounterConsumption consumesCounters = 4; + + // NodeName identifies the node where the device is available. + // + // Must only be set if Spec.PerDeviceNodeSelection is set to true. + // At most one of NodeName, NodeSelector and AllNodes can be set. + // + // +optional + // +oneOf=DeviceNodeSelection + // +featureGate=DRAPartitionableDevices + optional string nodeName = 5; + + // NodeSelector defines the nodes where the device is available. + // + // Must use exactly one term. + // + // Must only be set if Spec.PerDeviceNodeSelection is set to true. + // At most one of NodeName, NodeSelector and AllNodes can be set. + // + // +optional + // +oneOf=DeviceNodeSelection + // +featureGate=DRAPartitionableDevices + optional .k8s.io.api.core.v1.NodeSelector nodeSelector = 6; + + // AllNodes indicates that all nodes have access to the device. + // + // Must only be set if Spec.PerDeviceNodeSelection is set to true. + // At most one of NodeName, NodeSelector and AllNodes can be set. + // + // +optional + // +oneOf=DeviceNodeSelection + // +featureGate=DRAPartitionableDevices + optional bool allNodes = 7; + + // If specified, these are the driver-defined taints. + // + // The maximum number of taints is 4. + // + // This is an alpha field and requires enabling the DRADeviceTaints + // feature gate. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceTaints + repeated DeviceTaint taints = 8; + + // BindsToNode indicates if the usage of an allocation involving this device + // has to be limited to exactly the node that was chosen when allocating the claim. + // If set to true, the scheduler will set the ResourceClaim.Status.Allocation.NodeSelector + // to match the node where the allocation was made. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + optional bool bindsToNode = 9; + + // BindingConditions defines the conditions for proceeding with binding. + // All of these conditions must be set in the per-device status + // conditions with a value of True to proceed with binding the pod to the node + // while scheduling the pod. + // + // The maximum number of binding conditions is 4. + // + // The conditions must be a valid condition type string. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingConditions = 10; + + // BindingFailureConditions defines the conditions for binding failure. + // They may be set in the per-device status conditions. + // If any is set to "True", a binding failure occurred. + // + // The maximum number of binding failure conditions is 4. + // + // The conditions must be a valid condition type string. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingFailureConditions = 11; + + // AllowMultipleAllocations marks whether the device is allowed to be allocated to multiple DeviceRequests. + // + // If AllowMultipleAllocations is set to true, the device can be allocated more than once, + // and all of its capacity is consumable, regardless of whether the requestPolicy is defined or not. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional bool allowMultipleAllocations = 12; +} + +// DeviceAllocationConfiguration gets embedded in an AllocationResult. +message DeviceAllocationConfiguration { + // Source records whether the configuration comes from a class and thus + // is not something that a normal user would have been able to set + // or from a claim. + // + // +required + optional string source = 1; + + // Requests lists the names of requests where the configuration applies. + // If empty, its applies to all requests. + // + // References to subrequests must include the name of the main request + // and may include the subrequest using the format
[/]. If just + // the main request is given, the configuration applies to all subrequests. + // + // +optional + // +listType=atomic + repeated string requests = 2; + + optional DeviceConfiguration deviceConfiguration = 3; +} + +// DeviceAllocationResult is the result of allocating devices. +message DeviceAllocationResult { + // Results lists all allocated devices. + // + // +optional + // +listType=atomic + repeated DeviceRequestAllocationResult results = 1; + + // This field is a combination of all the claim and class configuration parameters. + // Drivers can distinguish between those based on a flag. + // + // This includes configuration parameters for drivers which have no allocated + // devices in the result because it is up to the drivers which configuration + // parameters they support. They can silently ignore unknown configuration + // parameters. + // + // +optional + // +listType=atomic + repeated DeviceAllocationConfiguration config = 2; +} + +// DeviceAttribute must have exactly one field set. +message DeviceAttribute { + // IntValue is a number. + // + // +optional + // +oneOf=ValueType + optional int64 int = 2; + + // BoolValue is a true/false value. + // + // +optional + // +oneOf=ValueType + optional bool bool = 3; + + // StringValue is a string. Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + optional string string = 4; + + // VersionValue is a semantic version according to semver.org spec 2.0.0. + // Must not be longer than 64 characters. + // + // +optional + // +oneOf=ValueType + optional string version = 5; +} + +// DeviceCapacity describes a quantity associated with a device. +message DeviceCapacity { + // Value defines how much of a certain capacity that device has. + // + // This field reflects the fixed total capacity and does not change. + // The consumed amount is tracked separately by scheduler + // and does not affect this value. + // + // +required + optional .k8s.io.apimachinery.pkg.api.resource.Quantity value = 1; + + // RequestPolicy defines how this DeviceCapacity must be consumed + // when the device is allowed to be shared by multiple allocations. + // + // The Device must have allowMultipleAllocations set to true in order to set a requestPolicy. + // + // If unset, capacity requests are unconstrained: + // requests can consume any amount of capacity, as long as the total consumed + // across all allocations does not exceed the device's defined capacity. + // If request is also unset, default is the full capacity value. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional CapacityRequestPolicy requestPolicy = 2; +} + +// DeviceClaim defines how to request devices with a ResourceClaim. +message DeviceClaim { + // Requests represent individual requests for distinct devices which + // must all be satisfied. If empty, nothing needs to be allocated. + // + // +optional + // +listType=atomic + repeated DeviceRequest requests = 1; + + // These constraints must be satisfied by the set of devices that get + // allocated for the claim. + // + // +optional + // +listType=atomic + repeated DeviceConstraint constraints = 2; + + // This field holds configuration for multiple potential drivers which + // could satisfy requests in this claim. It is ignored while allocating + // the claim. + // + // +optional + // +listType=atomic + repeated DeviceClaimConfiguration config = 3; +} + +// DeviceClaimConfiguration is used for configuration parameters in DeviceClaim. +message DeviceClaimConfiguration { + // Requests lists the names of requests where the configuration applies. + // If empty, it applies to all requests. + // + // References to subrequests must include the name of the main request + // and may include the subrequest using the format
[/]. If just + // the main request is given, the configuration applies to all subrequests. + // + // +optional + // +listType=atomic + repeated string requests = 1; + + optional DeviceConfiguration deviceConfiguration = 2; +} + +// DeviceClass is a vendor- or admin-provided resource that contains +// device configuration and selectors. It can be referenced in +// the device requests of a claim to apply these presets. +// Cluster scoped. +// +// This is an alpha type and requires enabling the DynamicResourceAllocation +// feature gate. +message DeviceClass { + // Standard object metadata + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Spec defines what can be allocated and how to configure it. + // + // This is mutable. Consumers have to be prepared for classes changing + // at any time, either because they get updated or replaced. Claim + // allocations are done once based on whatever was set in classes at + // the time of allocation. + // + // Changing the spec automatically increments the metadata.generation number. + optional DeviceClassSpec spec = 2; +} + +// DeviceClassConfiguration is used in DeviceClass. +message DeviceClassConfiguration { + optional DeviceConfiguration deviceConfiguration = 1; +} + +// DeviceClassList is a collection of classes. +message DeviceClassList { + // Standard list metadata + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is the list of resource classes. + repeated DeviceClass items = 2; +} + +// DeviceClassSpec is used in a [DeviceClass] to define what can be allocated +// and how to configure it. +message DeviceClassSpec { + // Each selector must be satisfied by a device which is claimed via this class. + // + // +optional + // +listType=atomic + repeated DeviceSelector selectors = 1; + + // Config defines configuration parameters that apply to each device that is claimed via this class. + // Some classses may potentially be satisfied by multiple drivers, so each instance of a vendor + // configuration applies to exactly one driver. + // + // They are passed to the driver, but are not considered while allocating the claim. + // + // +optional + // +listType=atomic + repeated DeviceClassConfiguration config = 2; + + // ExtendedResourceName is the extended resource name for the devices of this class. + // The devices of this class can be used to satisfy a pod's extended resource requests. + // It has the same format as the name of a pod's extended resource. + // It should be unique among all the device classes in a cluster. + // If two device classes have the same name, then the class created later + // is picked to satisfy a pod's extended resource requests. + // If two classes are created at the same time, then the name of the class + // lexicographically sorted first is picked. + // + // This is an alpha field. + // +optional + // +featureGate=DRAExtendedResource + optional string extendedResourceName = 4; +} + +// DeviceConfiguration must have exactly one field set. It gets embedded +// inline in some other structs which have other fields, so field names must +// not conflict with those. +message DeviceConfiguration { + // Opaque provides driver-specific configuration parameters. + // + // +optional + // +oneOf=ConfigurationType + optional OpaqueDeviceConfiguration opaque = 1; +} + +// DeviceConstraint must have exactly one field set besides Requests. +message DeviceConstraint { + // Requests is a list of the one or more requests in this claim which + // must co-satisfy this constraint. If a request is fulfilled by + // multiple devices, then all of the devices must satisfy the + // constraint. If this is not specified, this constraint applies to all + // requests in this claim. + // + // References to subrequests must include the name of the main request + // and may include the subrequest using the format
[/]. If just + // the main request is given, the constraint applies to all subrequests. + // + // +optional + // +listType=atomic + repeated string requests = 1; + + // MatchAttribute requires that all devices in question have this + // attribute and that its type and value are the same across those + // devices. + // + // For example, if you specified "dra.example.com/numa" (a hypothetical example!), + // then only devices in the same NUMA node will be chosen. A device which + // does not have that attribute will not be chosen. All devices should + // use a value of the same type for this attribute because that is part of + // its specification, but if one device doesn't, then it also will not be + // chosen. + // + // Must include the domain qualifier. + // + // +optional + // +oneOf=ConstraintType + optional string matchAttribute = 2; + + // DistinctAttribute requires that all devices in question have this + // attribute and that its type and value are unique across those devices. + // + // This acts as the inverse of MatchAttribute. + // + // This constraint is used to avoid allocating multiple requests to the same device + // by ensuring attribute-level differentiation. + // + // This is useful for scenarios where resource requests must be fulfilled by separate physical devices. + // For example, a container requests two network interfaces that must be allocated from two different physical NICs. + // + // +optional + // +oneOf=ConstraintType + // +featureGate=DRAConsumableCapacity + optional string distinctAttribute = 3; +} + +// DeviceCounterConsumption defines a set of counters that +// a device will consume from a CounterSet. +message DeviceCounterConsumption { + // CounterSet is the name of the set from which the + // counters defined will be consumed. + // + // +required + optional string counterSet = 1; + + // Counters defines the counters that will be consumed by the device. + // + // The maximum number counters in a device is 32. + // In addition, the maximum number of all counters + // in all devices is 1024 (for example, 64 devices with + // 16 counters each). + // + // +required + map counters = 2; +} + +// DeviceRequest is a request for devices required for a claim. +// This is typically a request for a single resource like a device, but can +// also ask for several identical devices. With FirstAvailable it is also +// possible to provide a prioritized list of requests. +message DeviceRequest { + // Name can be used to reference this request in a pod.spec.containers[].resources.claims + // entry and in a constraint of the claim. + // + // References using the name in the DeviceRequest will uniquely + // identify a request when the Exactly field is set. When the + // FirstAvailable field is set, a reference to the name of the + // DeviceRequest will match whatever subrequest is chosen by the + // scheduler. + // + // Must be a DNS label. + // + // +required + optional string name = 1; + + // Exactly specifies the details for a single request that must + // be met exactly for the request to be satisfied. + // + // One of Exactly or FirstAvailable must be set. + // + // +optional + // +oneOf=deviceRequestType + optional ExactDeviceRequest exactly = 2; + + // FirstAvailable contains subrequests, of which exactly one will be + // selected by the scheduler. It tries to + // satisfy them in the order in which they are listed here. So if + // there are two entries in the list, the scheduler will only check + // the second one if it determines that the first one can not be used. + // + // DRA does not yet implement scoring, so the scheduler will + // select the first set of devices that satisfies all the + // requests in the claim. And if the requirements can + // be satisfied on more than one node, other scheduling features + // will determine which node is chosen. This means that the set of + // devices allocated to a claim might not be the optimal set + // available to the cluster. Scoring will be implemented later. + // + // +optional + // +oneOf=deviceRequestType + // +listType=atomic + // +featureGate=DRAPrioritizedList + repeated DeviceSubRequest firstAvailable = 3; +} + +// DeviceRequestAllocationResult contains the allocation result for one request. +message DeviceRequestAllocationResult { + // Request is the name of the request in the claim which caused this + // device to be allocated. If it references a subrequest in the + // firstAvailable list on a DeviceRequest, this field must + // include both the name of the main request and the subrequest + // using the format
/. + // + // Multiple devices may have been allocated per request. + // + // +required + optional string request = 1; + + // Driver specifies the name of the DRA driver whose kubelet + // plugin should be invoked to process the allocation once the claim is + // needed on a node. + // + // Must be a DNS subdomain and should end with a DNS domain owned by the + // vendor of the driver. + // + // +required + optional string driver = 2; + + // This name together with the driver name and the device name field + // identify which device was allocated (`//`). + // + // Must not be longer than 253 characters and may contain one or more + // DNS sub-domains separated by slashes. + // + // +required + optional string pool = 3; + + // Device references one device instance via its name in the driver's + // resource pool. It must be a DNS label. + // + // +required + optional string device = 4; + + // AdminAccess indicates that this device was allocated for + // administrative access. See the corresponding request field + // for a definition of mode. + // + // This is an alpha field and requires enabling the DRAAdminAccess + // feature gate. Admin access is disabled if this field is unset or + // set to false, otherwise it is enabled. + // + // +optional + // +featureGate=DRAAdminAccess + optional bool adminAccess = 5; + + // A copy of all tolerations specified in the request at the time + // when the device got allocated. + // + // The maximum number of tolerations is 16. + // + // This is an alpha field and requires enabling the DRADeviceTaints + // feature gate. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceTaints + repeated DeviceToleration tolerations = 6; + + // BindingConditions contains a copy of the BindingConditions + // from the corresponding ResourceSlice at the time of allocation. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingConditions = 7; + + // BindingFailureConditions contains a copy of the BindingFailureConditions + // from the corresponding ResourceSlice at the time of allocation. + // + // This is an alpha field and requires enabling the DRADeviceBindingConditions and DRAResourceClaimDeviceStatus + // feature gates. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceBindingConditions,DRAResourceClaimDeviceStatus + repeated string bindingFailureConditions = 8; + + // ShareID uniquely identifies an individual allocation share of the device, + // used when the device supports multiple simultaneous allocations. + // It serves as an additional map key to differentiate concurrent shares + // of the same device. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional string shareID = 9; + + // ConsumedCapacity tracks the amount of capacity consumed per device as part of the claim request. + // The consumed amount may differ from the requested amount: it is rounded up to the nearest valid + // value based on the device’s requestPolicy if applicable (i.e., may not be less than the requested amount). + // + // The total consumed capacity for each device must not exceed the DeviceCapacity's Value. + // + // This field is populated only for devices that allow multiple allocations. + // All capacity entries are included, even if the consumed amount is zero. + // + // +optional + // +featureGate=DRAConsumableCapacity + map consumedCapacity = 10; +} + +// DeviceSelector must have exactly one field set. +message DeviceSelector { + // CEL contains a CEL expression for selecting a device. + // + // +optional + // +oneOf=SelectorType + optional CELDeviceSelector cel = 1; +} + +// DeviceSubRequest describes a request for device provided in the +// claim.spec.devices.requests[].firstAvailable array. Each +// is typically a request for a single resource like a device, but can +// also ask for several identical devices. +// +// DeviceSubRequest is similar to ExactDeviceRequest, but doesn't expose the +// AdminAccess field as that one is only supported when requesting a +// specific device. +message DeviceSubRequest { + // Name can be used to reference this subrequest in the list of constraints + // or the list of configurations for the claim. References must use the + // format
/. + // + // Must be a DNS label. + // + // +required + optional string name = 1; + + // DeviceClassName references a specific DeviceClass, which can define + // additional configuration and selectors to be inherited by this + // subrequest. + // + // A class is required. Which classes are available depends on the cluster. + // + // Administrators may use this to restrict which devices may get + // requested by only installing classes with selectors for permitted + // devices. If users are free to request anything without restrictions, + // then administrators can create an empty DeviceClass for users + // to reference. + // + // +required + optional string deviceClassName = 2; + + // Selectors define criteria which must be satisfied by a specific + // device in order for that device to be considered for this + // subrequest. All selectors must be satisfied for a device to be + // considered. + // + // +optional + // +listType=atomic + repeated DeviceSelector selectors = 3; + + // AllocationMode and its related fields define how devices are allocated + // to satisfy this subrequest. Supported values are: + // + // - ExactCount: This request is for a specific number of devices. + // This is the default. The exact number is provided in the + // count field. + // + // - All: This subrequest is for all of the matching devices in a pool. + // Allocation will fail if some devices are already allocated, + // unless adminAccess is requested. + // + // If AllocationMode is not specified, the default mode is ExactCount. If + // the mode is ExactCount and count is not specified, the default count is + // one. Any other subrequests must specify this field. + // + // More modes may get added in the future. Clients must refuse to handle + // requests with unknown modes. + // + // +optional + optional string allocationMode = 4; + + // Count is used only when the count mode is "ExactCount". Must be greater than zero. + // If AllocationMode is ExactCount and this field is not specified, the default is one. + // + // +optional + // +oneOf=AllocationMode + optional int64 count = 5; + + // If specified, the request's tolerations. + // + // Tolerations for NoSchedule are required to allocate a + // device which has a taint with that effect. The same applies + // to NoExecute. + // + // In addition, should any of the allocated devices get tainted + // with NoExecute after allocation and that effect is not tolerated, + // then all pods consuming the ResourceClaim get deleted to evict + // them. The scheduler will not let new pods reserve the claim while + // it has these tainted devices. Once all pods are evicted, the + // claim will get deallocated. + // + // The maximum number of tolerations is 16. + // + // This is an alpha field and requires enabling the DRADeviceTaints + // feature gate. + // + // +optional + // +listType=atomic + // +featureGate=DRADeviceTaints + repeated DeviceToleration tolerations = 6; + + // Capacity define resource requirements against each capacity. + // + // If this field is unset and the device supports multiple allocations, + // the default value will be applied to each capacity according to requestPolicy. + // For the capacity that has no requestPolicy, default is the full capacity value. + // + // Applies to each device allocation. + // If Count > 1, + // the request fails if there aren't enough devices that meet the requirements. + // If AllocationMode is set to All, + // the request fails if there are devices that otherwise match the request, + // and have this capacity, with a value >= the requested amount, but which cannot be allocated to this request. + // + // +optional + // +featureGate=DRAConsumableCapacity + optional CapacityRequirements capacity = 7; +} + +// The device this taint is attached to has the "effect" on +// any claim which does not tolerate the taint and, through the claim, +// to pods using the claim. +// +// +protobuf.options.(gogoproto.goproto_stringer)=false +message DeviceTaint { + // The taint key to be applied to a device. + // Must be a label name. + // + // +required + optional string key = 1; + + // The taint value corresponding to the taint key. + // Must be a label value. + // + // +optional + optional string value = 2; + + // The effect of the taint on claims that do not tolerate the taint + // and through such claims on the pods using them. + // Valid effects are NoSchedule and NoExecute. PreferNoSchedule as used for + // nodes is not valid here. + // + // +required + optional string effect = 3; + + // TimeAdded represents the time at which the taint was added. + // Added automatically during create or update if not set. + // + // +optional + optional .k8s.io.apimachinery.pkg.apis.meta.v1.Time timeAdded = 4; +} + +// The ResourceClaim this DeviceToleration is attached to tolerates any taint that matches +// the triple using the matching operator . +message DeviceToleration { + // Key is the taint key that the toleration applies to. Empty means match all taint keys. + // If the key is empty, operator must be Exists; this combination means to match all values and all keys. + // Must be a label name. + // + // +optional + optional string key = 1; + + // Operator represents a key's relationship to the value. + // Valid operators are Exists and Equal. Defaults to Equal. + // Exists is equivalent to wildcard for value, so that a ResourceClaim can + // tolerate all taints of a particular category. + // + // +optional + // +default="Equal" + optional string operator = 2; + + // Value is the taint value the toleration matches to. + // If the operator is Exists, the value must be empty, otherwise just a regular string. + // Must be a label value. + // + // +optional + optional string value = 3; + + // Effect indicates the taint effect to match. Empty means match all taint effects. + // When specified, allowed values are NoSchedule and NoExecute. + // + // +optional + optional string effect = 4; + + // TolerationSeconds represents the period of time the toleration (which must be + // of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, + // it is not set, which means tolerate the taint forever (do not evict). Zero and + // negative values will be treated as 0 (evict immediately) by the system. + // If larger than zero, the time when the pod needs to be evicted is calculated as