From 821a60304be65f389308275b3e066a7aed3cff4c Mon Sep 17 00:00:00 2001 From: jinxu <1319039722@qq.com> Date: Tue, 19 Sep 2023 16:30:09 +0800 Subject: [PATCH 1/6] feat: introduce kvrocks-controller --- api/v1alpha1/kvrocks_types.go | 11 +- api/v1alpha1/zz_generated.deepcopy.go | 27 - .../crd/bases/kvrocks.apache.org_kvrocks.yaml | 44 +- config/rbac/role.yaml | 12 + deploy/crd/templates/crd.yaml | 28 +- deploy/operator/templates/rbac.yaml | 12 + go.mod | 83 +-- go.sum | 500 +++++++++++++++--- pkg/client/controller/controller_client.go | 307 +++++++++++ pkg/client/k8s/configmap.go | 12 + pkg/client/k8s/deployment.go | 12 + pkg/client/k8s/service.go | 21 + pkg/client/k8s/statefulset.go | 29 + pkg/client/kvrocks/cluster.go | 57 -- pkg/client/kvrocks/kvrocks_client.go | 41 +- pkg/client/kvrocks/kvrocks_client_test.go | 223 -------- pkg/controllers/cluster/controller.go | 119 +++++ pkg/controllers/cluster/handler.go | 38 +- pkg/controllers/cluster/kubernetes.go | 27 +- pkg/controllers/cluster/kvrocks.go | 198 +++++-- pkg/controllers/cluster/rebalance.go | 139 +---- pkg/controllers/cluster/sentinel.go | 57 +- pkg/controllers/common/topo.go | 58 -- pkg/controllers/events/event.go | 5 +- pkg/controllers/events/handler.go | 139 ++--- pkg/controllers/kvrocks_controller.go | 43 +- pkg/resources/configmap.go | 30 ++ pkg/resources/deployment.go | 59 +++ pkg/resources/kvrocks.go | 4 +- pkg/resources/resource_test.go | 47 -- pkg/resources/service.go | 51 ++ pkg/resources/statefulset.go | 60 ++- test/e2e/Makefile | 2 + test/e2e/README.md | 9 +- test/e2e/cluster/cluster_test.go | 423 +++++++++++++++ test/e2e/cluster/suite_test.go | 13 + test/e2e/config/config.yaml | 6 +- 37 files changed, 2006 insertions(+), 940 deletions(-) create mode 100644 pkg/client/controller/controller_client.go delete mode 100644 pkg/client/kvrocks/kvrocks_client_test.go create mode 100644 pkg/controllers/cluster/controller.go delete mode 100644 pkg/controllers/common/topo.go delete mode 100644 pkg/resources/resource_test.go create mode 100644 test/e2e/cluster/cluster_test.go create mode 100644 test/e2e/cluster/suite_test.go diff --git a/api/v1alpha1/kvrocks_types.go b/api/v1alpha1/kvrocks_types.go index 080539f..8b87abf 100644 --- a/api/v1alpha1/kvrocks_types.go +++ b/api/v1alpha1/kvrocks_types.go @@ -83,6 +83,7 @@ type KVRocksShrinkMsg struct { type KVRocksTopoPartitions struct { PartitionName string `json:"partitionName"` + Shard int `json:"shard"` Topology []KVRocksTopology `json:"topology"` } @@ -95,18 +96,12 @@ type KVRocksTopology struct { Slots []string `json:"slots,omitempty"` MasterId string `json:"masterId,omitempty"` Migrate []MigrateMsg `json:"migrate,omitempty"` - Import []ImportMsg `json:"import,omitempty"` Failover bool `json:"failover,omitempty"` } -type ImportMsg struct { - SrcNode string `json:"srcNode"` - Slots []string `json:"slots"` -} - type MigrateMsg struct { - DstNode string `json:"dstNode"` - Slots []string `json:"slots"` + Shard int `json:"shard"` + Slots []string `json:"slots"` } type KVRocksStorage struct { diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 2cea76a..c0dd7da 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -26,26 +26,6 @@ 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 *ImportMsg) DeepCopyInto(out *ImportMsg) { - *out = *in - if in.Slots != nil { - in, out := &in.Slots, &out.Slots - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImportMsg. -func (in *ImportMsg) DeepCopy() *ImportMsg { - if in == nil { - return nil - } - out := new(ImportMsg) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KVRocks) DeepCopyInto(out *KVRocks) { *out = *in @@ -271,13 +251,6 @@ func (in *KVRocksTopology) DeepCopyInto(out *KVRocksTopology) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - if in.Import != nil { - in, out := &in.Import, &out.Import - *out = make([]ImportMsg, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KVRocksTopology. diff --git a/config/crd/bases/kvrocks.apache.org_kvrocks.yaml b/config/crd/bases/kvrocks.apache.org_kvrocks.yaml index 0a641c9..7c4e10f 100644 --- a/config/crd/bases/kvrocks.apache.org_kvrocks.yaml +++ b/config/crd/bases/kvrocks.apache.org_kvrocks.yaml @@ -891,27 +891,6 @@ spec: resources: description: ResourceRequirements describes the compute resource requirements. properties: - claims: - description: "Claims lists the names of resources, defined in - spec.resourceClaims, that are used by this container. \n This - is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only be set - for containers." - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: Name must match the name of one entry in pod.spec.resourceClaims - of the Pod where this field is used. It makes that resource - available inside a container. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map limits: additionalProperties: anyOf: @@ -1024,25 +1003,13 @@ spec: properties: partitionName: type: string + shard: + type: integer topology: items: properties: failover: type: boolean - import: - items: - properties: - slots: - items: - type: string - type: array - srcNode: - type: string - required: - - slots - - srcNode - type: object - type: array ip: type: string masterId: @@ -1050,14 +1017,14 @@ spec: migrate: items: properties: - dstNode: - type: string + shard: + type: integer slots: items: type: string type: array required: - - dstNode + - shard - slots type: object type: array @@ -1084,6 +1051,7 @@ spec: type: array required: - partitionName + - shard - topology type: object type: array diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 7547cc3..2abe2e9 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -17,6 +17,18 @@ rules: - patch - update - watch +- apiGroups: + - apps + resources: + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - apps.kruise.io resources: diff --git a/deploy/crd/templates/crd.yaml b/deploy/crd/templates/crd.yaml index 0a641c9..2d91e77 100644 --- a/deploy/crd/templates/crd.yaml +++ b/deploy/crd/templates/crd.yaml @@ -866,6 +866,8 @@ spec: type: array type: object type: object + enableSentinel: + type: boolean image: type: string imagePullPolicy: @@ -895,8 +897,7 @@ spec: description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable. It can only be set - for containers." + feature gate. \n This field is immutable." items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. properties: @@ -1024,25 +1025,13 @@ spec: properties: partitionName: type: string + shard: + type: integer topology: items: properties: failover: type: boolean - import: - items: - properties: - slots: - items: - type: string - type: array - srcNode: - type: string - required: - - slots - - srcNode - type: object - type: array ip: type: string masterId: @@ -1050,14 +1039,14 @@ spec: migrate: items: properties: - dstNode: - type: string + shard: + type: integer slots: items: type: string type: array required: - - dstNode + - shard - slots type: object type: array @@ -1084,6 +1073,7 @@ spec: type: array required: - partitionName + - shard - topology type: object type: array diff --git a/deploy/operator/templates/rbac.yaml b/deploy/operator/templates/rbac.yaml index d1c1dfd..e4c9f14 100644 --- a/deploy/operator/templates/rbac.yaml +++ b/deploy/operator/templates/rbac.yaml @@ -167,6 +167,18 @@ rules: - patch - update - watch + - apiGroups: + - apps + resources: + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/go.mod b/go.mod index f28808a..8e08e67 100644 --- a/go.mod +++ b/go.mod @@ -3,81 +3,92 @@ module github.com/RocksLabs/kvrocks-operator go 1.19 require ( - github.com/chaos-mesh/chaos-mesh/api v0.0.0-20230824072557-45fdbaea2552 + github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657 github.com/go-logr/logr v1.2.3 github.com/go-redis/redis/v8 v8.11.5 - github.com/google/uuid v1.3.1 github.com/joaojeronimo/go-crc16 v0.0.0-20140729130949-59bd0194935e github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.27.6 github.com/openkruise/kruise-api v1.3.0 github.com/robfig/cron/v3 v3.0.1 + github.com/satori/go.uuid v1.2.0 github.com/stretchr/testify v1.8.1 go.uber.org/zap v1.24.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.26.7 - k8s.io/apimachinery v0.26.7 - k8s.io/client-go v0.26.7 - sigs.k8s.io/controller-runtime v0.14.6 + k8s.io/api v0.24.2 + k8s.io/apimachinery v0.24.2 + k8s.io/client-go v0.24.2 + sigs.k8s.io/controller-runtime v0.12.3 sigs.k8s.io/yaml v1.3.0 ) require ( + cloud.google.com/go v0.81.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.18 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/emicklei/go-restful v2.9.5+incompatible // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/zapr v1.2.3 // indirect + github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/go-logr/zapr v1.2.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.21.1 // indirect + github.com/go-openapi/jsonreference v0.19.5 // indirect + github.com/go-openapi/swag v0.19.14 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.2.0 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/google/uuid v1.1.2 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/net v0.13.0 // indirect - golang.org/x/oauth2 v0.4.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/time v0.3.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.28.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.26.7 // indirect - k8s.io/component-base v0.26.7 // indirect - k8s.io/klog/v2 v2.90.0 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect - k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + k8s.io/apiextensions-apiserver v0.24.2 // indirect + k8s.io/component-base v0.24.2 // indirect + k8s.io/klog/v2 v2.60.1 // indirect + k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect ) diff --git a/go.sum b/go.sum index f95f31a..3b4add8 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV 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.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 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= 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= @@ -21,6 +27,7 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 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= @@ -31,8 +38,30 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl 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= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= +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 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= +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 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +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 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +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 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +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/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -40,82 +69,132 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +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/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +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.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chaos-mesh/chaos-mesh/api v0.0.0-20230824072557-45fdbaea2552 h1:Yp/OQYjMZRFYi4xJ1Z4mhU5k5yxVcyP/4qS8C+egROE= -github.com/chaos-mesh/chaos-mesh/api v0.0.0-20230824072557-45fdbaea2552/go.mod h1:y0x6w0fKnAgm/hBxDx2/0BDGw242LPEZ9eEq1foehCg= +github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657 h1:CyuI+igIjadM/GRnE2o0q+WCwipDh0n2cUYFPAvxziM= +github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657/go.mod h1:JRiumF+RFsH1mrrP8FUsi9tExPylKkO/oSRWeQEUdLE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 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/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +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.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -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/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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 h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +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 h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= +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.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +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.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= +github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/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/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= @@ -128,6 +207,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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/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= @@ -143,11 +223,15 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= +github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -157,15 +241,18 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.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/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.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/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= @@ -173,21 +260,57 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf 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-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-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +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.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 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/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/joaojeronimo/go-crc16 v0.0.0-20140729130949-59bd0194935e h1:LY29wmnTcSR92avOm1dW0LSjeE3d9Xnhm/mpGzMT/wc= github.com/joaojeronimo/go-crc16 v0.0.0-20140729130949-59bd0194935e/go.mod h1:+X++CLDTje8Yr7J4bGuUYx5LVbNpXPeO5ZLpI42hKVk= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -198,28 +321,45 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 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 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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= @@ -227,66 +367,105 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN 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/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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +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 h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +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.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= +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.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/openkruise/kruise-api v1.3.0 h1:yfEy64uXgSuX/5RwePLbwUK/uX8RRM8fHJkccel5ZIQ= github.com/openkruise/kruise-api v1.3.0/go.mod h1:9ZX+ycdHKNzcA5ezAf35xOa2Mwfa2BYagWr0lKgi5dU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= 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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +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.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +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.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -302,32 +481,72 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 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= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= 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.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-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-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-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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= @@ -350,6 +569,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl 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/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= @@ -358,10 +579,17 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB 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.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.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 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-20181023162649-9b4f9f5ad519/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= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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= @@ -373,6 +601,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL 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= @@ -389,20 +618,35 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R 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-20201202161906-c7110b5ffcbb/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-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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/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.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY= -golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= 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-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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= @@ -413,9 +657,13 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ 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/sys v0.0.0-20180823144017-11551d06cbcc/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-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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= @@ -429,6 +677,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191026070338-33540a1f6037/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= @@ -444,56 +693,81 @@ 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-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/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-20200923182605-d9f96fdee20d/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/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-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210603081109-ebe580a85c40/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-20210831042530-f4d43177bf5e/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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 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.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-20181030221726-6c7e314b6563/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-20190328211700-ab21143f2384/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-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/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-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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= @@ -513,6 +787,7 @@ 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-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= @@ -520,8 +795,17 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY 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-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-20201224043029-2b0845dc783e/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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -545,6 +829,11 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M 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/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= @@ -574,15 +863,31 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG 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-20200423170343-7949de9c1215/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-20201102152239-715cce707fb0/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-20210222152913-aa3ee6e6a81c/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-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 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= @@ -595,6 +900,16 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa 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.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +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.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -607,22 +922,29 @@ 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.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= 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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 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/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 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/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.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -634,6 +956,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C 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.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= 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= @@ -641,30 +965,40 @@ 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= -k8s.io/api v0.26.7 h1:Lf4iEBEJb5OFNmawtBfSZV/UNi9riSJ0t1qdhyZqI40= -k8s.io/api v0.26.7/go.mod h1:Vk9bMadzA49UHPmHB//lX7VRCQSXGoVwfLd3Sc1SSXI= -k8s.io/apiextensions-apiserver v0.26.7 h1:L7ImW831auK1ZQBtNJPaG5qyrFxeISEBlgfZJfnaIPk= -k8s.io/apiextensions-apiserver v0.26.7/go.mod h1:3DbZBfS3kO7/Jaj7qqzcBtPcKP0/KcklyAnk8zc+fs4= -k8s.io/apimachinery v0.26.7 h1:590jSBwaSHCAFCqltaEogY/zybFlhGsnLteLpuF2wig= -k8s.io/apimachinery v0.26.7/go.mod h1:qYzLkrQ9lhrZRh0jNKo2cfvf/R1/kQONnSiyB7NUJU0= -k8s.io/client-go v0.26.7 h1:hyU9aKHlwVOykgyxzGYkrDSLCc4+mimZVyUJjPyUn1E= -k8s.io/client-go v0.26.7/go.mod h1:okYjy0jtq6sdeztALDvCh24tg4opOQS1XNvsJlERDAo= -k8s.io/component-base v0.26.7 h1:uqsOyZh0Zqoaup8tmHa491D/CvgFdGUs+X2H/inNUKM= -k8s.io/component-base v0.26.7/go.mod h1:CZe1HTmX/DQdeBrb9XYOXzs96jXth8ZbFvhLMsoJLUg= -k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M= -k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE= -k8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= +k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= +k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= +k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= +k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= +k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= +k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= +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/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 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 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/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= -sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= +sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= +sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +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 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/client/controller/controller_client.go b/pkg/client/controller/controller_client.go new file mode 100644 index 0000000..1d6f876 --- /dev/null +++ b/pkg/client/controller/controller_client.go @@ -0,0 +1,307 @@ +package controller + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strconv" + "strings" + "time" + + "github.com/RocksLabs/kvrocks-operator/pkg/client/k8s" + "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" + "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/types" +) + +type ErrorResponse struct { + Error struct { + Message string `json:"message"` + } `json:"error"` +} + +type ClusterOption struct { + Name string `json:"name"` + Nodes []string `json:"nodes"` + Replicas int `json:"replicas"` + Password string `json:"password"` +} + +type NodeOption struct { + Addr string `json:"addr"` + Role string `json:"role"` + Password string `json:"password"` +} + +type MigrationOption struct { + Source int `json:"source"` + Target int `json:"target"` + Slot int `json:"slot"` +} + +type Node struct { + ID string `json:"id"` + Addr string `json:"addr"` + Role string `json:"role"` + Password string `json:"password"` + CreatedAt int64 `json:"created_at"` +} + +type ShardData struct { + Nodes []Node `json:"nodes"` + SlotRanges []string `json:"slot_ranges"` + ImportSlot int `json:"import_slot"` + MigratingSlot int `json:"migrating_slot"` +} + +type ShardOption struct { + Nodes []string `json:"nodes"` + Password string `json:"password"` +} + +type Controller struct { + EndPoint string + Namespace string + ClusterName string +} + +type Client struct { + logger logr.Logger + client *http.Client + controller *Controller +} + +func NewClient(logger logr.Logger) *Client { + return &Client{ + logger: logger, + client: &http.Client{ + Timeout: time.Second * 10, + }, + controller: &Controller{ + Namespace: "cluster-demo", + ClusterName: "cluster-demo", + }, + } +} + +func (c *Client) SetEndPoint(namespace string, k8s *k8s.Client) error { + service, err := k8s.GetService(types.NamespacedName{ + Namespace: namespace, + Name: kvrocks.ControllerServiceName, + }) + if err != nil { + return err + } + c.controller.EndPoint = fmt.Sprintf("http://%s:%d/api/v1", service.Spec.ClusterIP, kvrocks.ControllerPort) + return nil +} + +func (c *Client) CreateIfNotExistsNamespace() error { + resp, err := c.client.Post(c.controller.EndPoint+"/namespaces", "application/json", strings.NewReader(`{"namespace": "`+c.controller.Namespace+`"}`)) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusCreated { + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + var errorResponse ErrorResponse + err = json.Unmarshal(bodyBytes, &errorResponse) + if err != nil { + return err + } + if errorResponse.Error.Message != "the entry already existed" { + return errors.New(errorResponse.Error.Message) + } else { + return nil + } + } + return nil +} + +func (c *Client) CreateCluster(replicas int, nodes []string, password string) error { + clusterOption := &ClusterOption{ + Name: c.controller.ClusterName, + Replicas: replicas, + Nodes: nodes, + Password: password, + } + clusterOptionJson, err := json.Marshal(clusterOption) + if err != nil { + return err + } + resp, err := c.client.Post(c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters", "application/json", strings.NewReader(string(clusterOptionJson))) + if err != nil { + return err + } + if resp.StatusCode != http.StatusCreated { + return err + } + return nil +} + +func (c *Client) CreateShard(nodes []string, password string) error { + shardOption := &ShardOption{ + Nodes: nodes, + Password: password, + } + shardOptionJson, err := json.Marshal(shardOption) + if err != nil { + return err + } + resp, err := c.client.Post(c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters/"+c.controller.ClusterName+"/shards", "application/json", strings.NewReader(string(shardOptionJson))) + if err != nil { + return err + } + if resp.StatusCode != http.StatusCreated { + return errors.New("unexpected response status code: " + strconv.Itoa(resp.StatusCode)) + } + return nil +} + +func (c *Client) GetShards() ([]ShardData, error) { + resp, err := c.client.Get(c.controller.EndPoint + "/namespaces/" + c.controller.Namespace + "/clusters/" + c.controller.ClusterName + "/shards") + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, err + } + + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var responseMap map[string]map[string][]ShardData + err = json.Unmarshal(bodyBytes, &responseMap) + if err != nil { + return nil, err + } + + shardData, ok := responseMap["data"]["shards"] + if !ok { + return nil, errors.New("unexpected response format") + } + + return shardData, nil +} + +func (c *Client) DeleteShard(shardIndex int) error { + req, err := http.NewRequest("DELETE", c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters/"+c.controller.ClusterName+"/shards/"+strconv.Itoa(shardIndex), nil) + if err != nil { + return err + } + resp, err := c.client.Do(req) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK { + return errors.New("unexpected response status code: " + strconv.Itoa(resp.StatusCode)) + } + return nil +} + +func (c *Client) GetNodes(shardIndex int) (*ShardData, error) { + resp, err := c.client.Get(c.controller.EndPoint + "/namespaces/" + c.controller.Namespace + "/clusters/" + c.controller.ClusterName + "/shards/" + strconv.Itoa(shardIndex)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, err + } + + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var responseMap map[string]map[string]ShardData + err = json.Unmarshal(bodyBytes, &responseMap) + if err != nil { + return nil, err + } + + shardData, ok := responseMap["data"]["shard"] + if !ok { + return nil, errors.New("unexpected response format") + } + + return &shardData, nil +} + +func (c *Client) DeleteNode(shardIndex int, nodeID string) error { + req, err := http.NewRequest("DELETE", c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters/"+c.controller.ClusterName+"/shards/"+strconv.Itoa(shardIndex)+"/nodes/"+nodeID, nil) + if err != nil { + return err + } + resp, err := c.client.Do(req) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK { + return errors.New("unexpected response status code: " + strconv.Itoa(resp.StatusCode)) + } + return nil +} + +func (c *Client) AddNode(shardIndex int, addr, role, password string) error { + nodeOption := &NodeOption{ + Addr: addr, + Role: role, + Password: password, + } + nodeOptionJson, err := json.Marshal(nodeOption) + if err != nil { + return err + } + resp, err := c.client.Post(c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters/"+c.controller.ClusterName+"/shards/"+strconv.Itoa(shardIndex)+"/nodes", "application/json", strings.NewReader(string(nodeOptionJson))) + if err != nil { + return err + } + if resp.StatusCode != http.StatusCreated { + return errors.New("unexpected response status code: " + strconv.Itoa(resp.StatusCode)) + } + return nil +} + +func (c *Client) FailoverShard(shardIndex int) error { + resp, err := c.client.Post(c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters/"+c.controller.ClusterName+"/shards/"+strconv.Itoa(shardIndex)+"/failover", "application/json", nil) + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK { + return errors.New("unexpected response status code: " + strconv.Itoa(resp.StatusCode)) + } + return nil +} + +func (c *Client) MigrateSlotAndData(source, target, slot int) error { + migrationOption := &MigrationOption{ + Source: source, + Target: target, + Slot: slot, + } + migrationOptionJson, err := json.Marshal(migrationOption) + if err != nil { + return err + } + resp, err := c.client.Post(c.controller.EndPoint+"/namespaces/"+c.controller.Namespace+"/clusters/"+c.controller.ClusterName+"/shards/migration/slot_data", "application/json", strings.NewReader(string(migrationOptionJson))) + + if err != nil { + return err + } + if resp.StatusCode != http.StatusOK { + return errors.New("unexpected response status code: " + strconv.Itoa(resp.StatusCode)) + } + return nil +} diff --git a/pkg/client/k8s/configmap.go b/pkg/client/k8s/configmap.go index 2293455..2c579d8 100644 --- a/pkg/client/k8s/configmap.go +++ b/pkg/client/k8s/configmap.go @@ -45,3 +45,15 @@ func (c *Client) CreateIfNotExistsConfigMap(cm *corev1.ConfigMap) error { c.logger.V(1).Info("configMap create successfully", "configMap", cm.Name) return nil } + +func (c *Client) DeleteConfigMap(key types.NamespacedName) error { + cm, err := c.GetConfigMap(key) + if err != nil { + return err + } + if err := c.client.Delete(ctx, cm); err != nil { + return err + } + c.logger.V(1).Info("configMap delete successfully", "configMap", cm.Name) + return nil +} diff --git a/pkg/client/k8s/deployment.go b/pkg/client/k8s/deployment.go index 90edb4f..0d75d09 100644 --- a/pkg/client/k8s/deployment.go +++ b/pkg/client/k8s/deployment.go @@ -32,6 +32,18 @@ func (c *Client) UpdateDeployment(deployment *appsv1.Deployment) error { return nil } +func (c *Client) DeleteDeployment(key types.NamespacedName) error { + deployment, err := c.GetDeployment(key) + if err != nil { + return err + } + if err := c.client.Delete(ctx, deployment); err != nil { + return err + } + c.logger.V(1).Info("delete deployment successfully", "deployment", deployment.Name) + return nil +} + func (c *Client) ListDeploymentPods(key types.NamespacedName) (*corev1.PodList, error) { deployment, err := c.GetDeployment(key) if err != nil { diff --git a/pkg/client/k8s/service.go b/pkg/client/k8s/service.go index 4648d9c..8823027 100644 --- a/pkg/client/k8s/service.go +++ b/pkg/client/k8s/service.go @@ -3,6 +3,7 @@ package k8s import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" ) func (c *Client) CreateIfNotExistsService(service *corev1.Service) error { @@ -12,3 +13,23 @@ func (c *Client) CreateIfNotExistsService(service *corev1.Service) error { c.logger.V(1).Info("service create successfully", "service", service.Name) return nil } + +func (c *Client) GetService(key types.NamespacedName) (*corev1.Service, error) { + var service corev1.Service + if err := c.client.Get(ctx, key, &service); err != nil { + return nil, err + } + return &service, nil +} + +func (c *Client) DeleteService(key types.NamespacedName) error { + var service corev1.Service + if err := c.client.Get(ctx, key, &service); err != nil { + return err + } + if err := c.client.Delete(ctx, &service); err != nil { + return err + } + c.logger.V(1).Info("service delete successfully", "service", service.Name) + return nil +} diff --git a/pkg/client/k8s/statefulset.go b/pkg/client/k8s/statefulset.go index 7585370..5cffdcb 100644 --- a/pkg/client/k8s/statefulset.go +++ b/pkg/client/k8s/statefulset.go @@ -2,6 +2,7 @@ package k8s import ( kruise "github.com/openkruise/kruise-api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" @@ -99,3 +100,31 @@ func (c *Client) DeleteStatefulSetIfExists(key types.NamespacedName) error { } return c.client.Delete(ctx, sts) } + +// Native StatefulSet +func (c *Client) CreateIfNotExistsNativeStatefulSet(sts *appsv1.StatefulSet) error { + if err := c.client.Create(ctx, sts); err != nil && !errors.IsAlreadyExists(err) { + return err + } + c.logger.V(1).Info("create statefulSet successfully", "statefulSet", sts.Name) + return nil +} + +func (c *Client) GetNativeStatefulSet(key types.NamespacedName) (*appsv1.StatefulSet, error) { + var sts appsv1.StatefulSet + if err := c.client.Get(ctx, key, &sts); err != nil { + return nil, err + } + return &sts, nil +} + +func (c *Client) DeleteNativeStatefulSet(key types.NamespacedName) error { + sts, err := c.GetNativeStatefulSet(key) + if err != nil { + return err + } + if err := c.client.Delete(ctx, sts); err != nil { + return err + } + return nil +} diff --git a/pkg/client/kvrocks/cluster.go b/pkg/client/kvrocks/cluster.go index dd03800..5a2a217 100644 --- a/pkg/client/kvrocks/cluster.go +++ b/pkg/client/kvrocks/cluster.go @@ -4,63 +4,6 @@ import ( "strings" ) -const ( - ClusterNotInitErr = "CLUSTERDOWN The cluster is not initialized" - ClusterAlreadyMigrate = "Can't migrate slot which has been migrated" - ClusterSlotInvalid = "Can't migrate slot which doesn't belong to me" - ClusterVersionInvalid = "Invalid cluster version" - ClusterInvalidVersion = "Invalid version of cluster" -) - -func (s *Client) SetClusterID(ip, password, nodeID string) error { - c := kvrocksClient(ip, password) - defer c.Close() - if err := c.Do(ctx, "CLUSTERX", "SETNODEID", nodeID).Err(); err != nil { - return err - } - s.logger.V(1).Info("set cluster nodeID successfully", "ip", ip, "nodeId", nodeID) - return nil -} - -func (s *Client) SetTopoMsg(ip, password, topoMsg string, version int) error { - c := kvrocksClient(ip, password) - defer c.Close() - if err := c.Do(ctx, "CLUSTERX", "SETNODES", topoMsg, version).Err(); err != nil { - return err - } - s.logger.V(1).Info("clusterx setnodes successfully", "ip", ip) - return nil -} - -func (s *Client) MoveSlots(ip, password string, slot int, dstNodeId string) bool { - c := kvrocksClient(ip, password) - defer c.Close() - if err := c.Do(ctx, "CLUSTERX", "MIGRATE", slot, dstNodeId).Err(); err != nil && (err.Error() == ClusterAlreadyMigrate || err.Error() == ClusterSlotInvalid) { - return true - } - return false -} - -func (s *Client) ResetSlot(ip, password string, slot, version int, dstNodeId string) error { - c := kvrocksClient(ip, password) - defer c.Close() - if err := c.Do(ctx, "CLUSTERX", "SETSLOT", slot, "NODE", dstNodeId, version).Err(); err != nil { - return err - } - s.logger.V(1).Info("clusterx setslot successfully", "ip", ip, "node", dstNodeId, "slot", slot, "version", version) - return nil -} - -func (s *Client) ClusterVersion(ip, password string) (int, error) { - c := kvrocksClient(ip, password) - defer c.Close() - result, err := c.Do(ctx, "CLUSTERX", "VERSION").Int() - if err != nil { - return -1, err - } - return result, nil -} - func (s *Client) ClusterNodeInfo(ip, password string) (*Node, error) { c := kvrocksClient(ip, password) defer c.Close() diff --git a/pkg/client/kvrocks/kvrocks_client.go b/pkg/client/kvrocks/kvrocks_client.go index f678fe9..d33bac9 100644 --- a/pkg/client/kvrocks/kvrocks_client.go +++ b/pkg/client/kvrocks/kvrocks_client.go @@ -15,13 +15,23 @@ import ( var ctx = context.TODO() const ( - KVRocksPort = 6379 - SentinelPort = 26379 - SuperUser = "superuser" - RoleMaster = "master" - RoleSlaver = "slave" - Quorum = 2 - HashSlotCount = 16384 + KVRocksPort = 6379 + SentinelPort = 26379 + SuperUser = "superuser" + RoleMaster = "master" + RoleSlaver = "slave" + Quorum = 2 + MinSlotID = 0 + MaxSlotID = 16383 + + EtcdStatefulName = "etcd0" + EtcdServiceName = "etcd0-service" + EtcdClientPort = 2379 + EtcdServerPort = 2380 + + ControllerServiceName = "controller-service" + ControllerPort = 9379 + ControllerDeploymentName = "kvrocks-controller" ) const ErrPassword = "ERR invalid password" @@ -36,17 +46,11 @@ type Node struct { Expected int Failover bool Migrate []MigrateMsg - Import []ImportMsg -} - -type ImportMsg struct { - SrcNodeId string - Slots []int } type MigrateMsg struct { - DstNodeID string - Slots []int + Shard int + Slots []int } type Client struct { @@ -72,13 +76,6 @@ func kvrocksSentinelClient(ip, password string) *client.SentinelClient { }) } -func kvrocksClusterClient(ip, password string) *client.ClusterClient { - return client.NewClusterClient(&client.ClusterOptions{ - Addrs: []string{net.JoinHostPort(ip, strconv.Itoa(KVRocksPort))}, - Password: password, - }) -} - func (node *Node) InsertSlot(value int) { node.Slots = append(node.Slots, value) sort.Ints(node.Slots) diff --git a/pkg/client/kvrocks/kvrocks_client_test.go b/pkg/client/kvrocks/kvrocks_client_test.go deleted file mode 100644 index 615fa4e..0000000 --- a/pkg/client/kvrocks/kvrocks_client_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package kvrocks - -import ( - "fmt" - "strings" - "sync" - "testing" - "time" - - uuid "github.com/google/uuid" - "github.com/joaojeronimo/go-crc16" - "k8s.io/apimachinery/pkg/util/rand" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/log/zap" -) - -var c *Client - -var sentinels = []string{"10.0.77.34", "10.0.76.245", "10.0.78.80"} - -func init() { - opts := zap.Options{ - Development: true, - } - //opts.BindFlags(flag.CommandLine) - //flag.Parse() - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - c = NewKVRocksClient(ctrl.Log) -} - -func TestClient_NodeInfo(t *testing.T) { - c.NodeInfo("10.0.77.78", "39c5bb") -} - -func TestClient_GetMasterFromSentinel(t *testing.T) { - master := "demo" - for _, ip := range sentinels { - for i := 0; i < 4; i++ { - ip, err := c.GetMasterFromSentinel(ip, "c4ca4238a0b923820dcc509a6f75849b", fmt.Sprintf("%s-%d", master, i)) - if err != nil { - panic(err.Error()) - } - fmt.Println(ip) - } - } -} - -func TestClient_RemoveMonitor(t *testing.T) { - for _, ip := range sentinels { - c.RemoveMonitor(ip, "c4ca4238a0b923820dcc509a6f75849b", "kvrocks") - } -} - -func TestClient_CreateMonitor(t *testing.T) { - for _, ip := range sentinels { - c.CreateMonitor(ip, "c4ca4238a0b923820dcc509a6f75849b", "kvrocks", "10.0.77.78", "123456") - } -} - -func TestClient_GetMaster(t *testing.T) { - c.GetMaster("10.0.77.88", "39c5bb") -} - -func TestSetClusterID(t *testing.T) { - masterIp := "10.0.77.90" - slaveIp := "10.0.77.100" - if err := c.SetClusterID(masterIp, "39c5bb", "f7149f2apw3d8ftm4a01w59b35v75b46e8555ae4"); err != nil { - c.logger.Error(err, "set nodeID error") - } - if err := c.SetClusterID(slaveIp, "39c5bb", "2beb1a909fa2a8w54588i2bd51lo5936dfdd8ae8"); err != nil { - c.logger.Error(err, "set nodeID error") - } -} - -func TestClient_SetTopoMsg(t *testing.T) { - masterNode := "f7149f2apw3d8ftm4a01w59b35v75b46e8555ae4" - slaveNode := "2beb1a909fa2a8w54588i2bd51lo5936dfdd8ae8" - masterIp := "10.0.77.90" - slaveIp := "10.0.77.100" - topoMsg := fmt.Sprintf("%s %s %d master - %d-%d\n%s %s %d slave %s", masterNode, masterIp, KVRocksPort, 0, 4096, slaveNode, slaveIp, KVRocksPort, masterNode) - fmt.Println(len(masterNode)) - fmt.Println(topoMsg) - if err := c.SetTopoMsg(slaveIp, "39c5bb", topoMsg, 3); err != nil { - fmt.Println(err) - } - // fmt.Println( "2666fa2ce6db5dwv406e7ebd04gh4b2f2f439467 10.0.78.163 6379 master - 0-5462\n777e403be6af99wv41d37ea476gh00a055ce4649 10.0.77.8 6379 slave 2666fa2ce6db5dwv406e7ebd04gh4b2f2f439467\nd819b1d7e6072dwv40c87e887egh2ece4c412574 10.0.76.229 6379 master - 5461-10922\n7c385870e66a5ewv47d47ebd8agh05768425f5b2 10.0.76.180 6379 slave d819b1d7e6072dwv40c87e887egh2ece4c412574\n28873b1ee61484wv47107e82b1ghb6a73b339a86 10.0.78.78 6379 master - 10922-16383\n17a257b1e61514wv4ea67eb9bdghd3c033ba5164 10.0.77.19 6379 slave 28873b1ee61484wv47107e82b1ghb6a73b339a86") -} - -func TestClient_Ping(t *testing.T) { - ip := "10.0.76.148" - fmt.Println(c.Ping(ip, "39c5bb")) - var lock sync.RWMutex - lock.Lock() -} - -func TestClient_GetOffset(t *testing.T) { - ip := "10.0.76.143" - off, err := c.GetOffset(ip, "39c5bb") - if err != nil { - panic(err.Error()) - } - fmt.Println(off) -} - -func Test_crc16(t *testing.T) { - c := kvrocksClusterClient("10.0.78.140", "123456") - defer c.Close() - index := 0 - for { - if index == 10000 { - break - } - id := SetClusterNodeId() - crc := crc16.Crc16([]byte(id)) - if crc%16384 < 5461 { - index++ - c.Set(ctx, id, id, 0) - } - } - fmt.Println("ok") -} - -var key = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} - -func SetClusterNodeId() string { - rand.Seed(time.Now().Unix()) - uid := uuid.New().String() - for i := 1; i <= 4; i++ { - v1 := key[rand.Intn(len(key))] - v2 := key[rand.Intn(len(key))] - uid = strings.Replace(uid, "-", fmt.Sprintf("%c%c", v1, v2), 1) - } - rand.Intn(len(key)) - return uid -} - -func Test_DBSize(t *testing.T) { - ips := []string{"10.0.76.162", "10.0.77.38", "10.0.78.115"} - var sum int64 = 0 - for _, ip := range ips { - c := kvrocksClient(ip, "123456") - defer c.Close() - c.Do(ctx, "dbsize", "scan") - time.Sleep(time.Second * 2) - result, err := c.DBSize(ctx).Result() - if err != nil { - panic(err.Error()) - } - sum += result - fmt.Println(result) - } - fmt.Println("sum: ", sum) - -} - -func Test_DeepEqual(t *testing.T) { - ips := []string{"10.0.76.200", "10.0.76.162", "10.0.78.140", "10.0.77.38", "10.0.78.115", "10.0.76.170", "10.0.78.128", "10.0.78.83", "10.0.77.35", "10.0.76.189"} - infos := map[string]string{} - for _, ip := range ips { - c := kvrocksClient(ip, "123456") - defer c.Close() - info, err := c.ClusterNodes(ctx).Result() - infos[strings.ReplaceAll(info, "myself,", "")] = ip - if err != nil { - panic(err.Error()) - } - } - basic := "" - index := 1 - for info, ip := range infos { - if index == 1 { - basic = info - index++ - continue - } - if basic != info { - fmt.Println("cluster nodes not equal") - fmt.Println(ip) - fmt.Println(infos[basic]) - } - } - fmt.Println("equal") -} - -func TestClient_ClusterNodeInfo(t *testing.T) { - node, err := c.ClusterNodeInfo("10.0.76.251", "123456") - if err != nil { - panic(err.Error()) - } - fmt.Println(SlotsToString(node.Slots)) - node.Slots = nil - fmt.Printf("%+v\n", *node) -} - -func TestClient_ClusterVersion(t *testing.T) { - version, err := c.ClusterVersion("10.0.77.36", "123456") - if err != nil { - panic(err.Error()) - } - fmt.Println(version) -} - -func TestClient_SetKey(t *testing.T) { - c := kvrocksClusterClient("10.0.69.18", "39c5bb") - defer c.Close() - pipe := c.Pipeline() - index := 0 - for i := 0; i < 1000000; i++ { - index++ - for j := 0; j < 1000; j++ { - pipe.Set(ctx, fmt.Sprintf("key-%d-%d", i, j), fmt.Sprintf("value-%d-%d", i, j), 0) - } - if _, err := pipe.Exec(ctx); err != nil { - panic(err.Error()) - } - if index%100000 == 0 { - fmt.Println("执行了 100000 次") - } - } - fmt.Println("ok") -} diff --git a/pkg/controllers/cluster/controller.go b/pkg/controllers/cluster/controller.go new file mode 100644 index 0000000..b51945e --- /dev/null +++ b/pkg/controllers/cluster/controller.go @@ -0,0 +1,119 @@ +package cluster + +import ( + "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" + "github.com/RocksLabs/kvrocks-operator/pkg/resources" + "k8s.io/apimachinery/pkg/types" +) + +// etcd-> controller +// TODO owner reference +func (h *KVRocksClusterHandler) ensureController() error { + etcdService := resources.NewEtcdService(h.instance) + if err := h.k8s.CreateIfNotExistsService(etcdService); err != nil { + return err + } + etcd := resources.NewEtcdStatefulSet(h.instance) + if err := h.k8s.CreateIfNotExistsNativeStatefulSet(etcd); err != nil { + return err + } + // ensure etcd + etcd, err := h.k8s.GetNativeStatefulSet(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: kvrocks.EtcdStatefulName, + }) + if err != nil { + return err + } + if etcd.Status.ReadyReplicas != *etcd.Spec.Replicas { + h.log.Info("waiting for etcd ready") + h.requeue = true + return nil + } + + controllerConfigmap := resources.NewKVRocksControllerConfigmap(h.instance) + if err := h.k8s.CreateIfNotExistsConfigMap(controllerConfigmap); err != nil { + return err + } + controllerService := resources.NewKVRocksControllerService(h.instance) + if err := h.k8s.CreateIfNotExistsService(controllerService); err != nil { + return err + } + controllerDep := resources.NewKVRocksControllerDeployment(h.instance) + if err := h.k8s.CreateIfNotExistsDeployment(controllerDep); err != nil { + return err + } + // ensure controller + controllerDep, err = h.k8s.GetDeployment(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: kvrocks.ControllerDeploymentName, + }) + if err != nil { + return err + } + if controllerDep.Status.ReadyReplicas != *controllerDep.Spec.Replicas { + h.log.Info("waiting for controller ready") + h.requeue = true + return nil + } + + err = h.controllerClient.SetEndPoint(h.instance.Namespace, h.k8s) + if err != nil { + return err + } + + err = h.createControllerNamespace() + if err != nil { + return err + } + return nil +} + +func (h *KVRocksClusterHandler) removeController() (bool, error) { + // Remove KVRocks Controller resources + if err := h.k8s.DeleteDeployment(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: kvrocks.ControllerDeploymentName, + }); err != nil { + return false, err + } + + if err := h.k8s.DeleteService(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: kvrocks.ControllerServiceName, + }); err != nil { + return false, err + } + + if err := h.k8s.DeleteConfigMap(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: "controller-config", + }); err != nil { + return false, err + } + + // Remove Etcd resources + if err := h.k8s.DeleteNativeStatefulSet(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: kvrocks.EtcdStatefulName, + }); err != nil { + return false, err + } + + if err := h.k8s.DeleteService(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: kvrocks.EtcdServiceName, + }); err != nil { + return false, err + } + + return false, nil +} + +func (h *KVRocksClusterHandler) createControllerNamespace() error { + err := h.controllerClient.CreateIfNotExistsNamespace() + if err != nil { + return err + } + return nil +} diff --git a/pkg/controllers/cluster/handler.go b/pkg/controllers/cluster/handler.go index 08417ab..4551a41 100644 --- a/pkg/controllers/cluster/handler.go +++ b/pkg/controllers/cluster/handler.go @@ -5,6 +5,7 @@ import ( "k8s.io/apimachinery/pkg/types" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + "github.com/RocksLabs/kvrocks-operator/pkg/client/controller" "github.com/RocksLabs/kvrocks-operator/pkg/client/k8s" "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" "github.com/RocksLabs/kvrocks-operator/pkg/controllers/common" @@ -22,6 +23,8 @@ type KVRocksClusterHandler struct { key types.NamespacedName version int masters map[string]*kvrocks.Node + + controllerClient *controller.Client } func NewKVRocksClusterHandler( @@ -29,25 +32,32 @@ func NewKVRocksClusterHandler( kvrocks *kvrocks.Client, log logr.Logger, key types.NamespacedName, - instance *kvrocksv1alpha1.KVRocks) *KVRocksClusterHandler { + instance *kvrocksv1alpha1.KVRocks, + controllerClient *controller.Client) *KVRocksClusterHandler { return &KVRocksClusterHandler{ - instance: instance, - k8s: k8s, - kvrocks: kvrocks, - log: log, - requeue: false, - key: key, + instance: instance, + k8s: k8s, + kvrocks: kvrocks, + log: log, + requeue: false, + key: key, + controllerClient: controllerClient, } } func (h *KVRocksClusterHandler) Handle() (error, bool) { + // kvrocks-controller + err := h.ensureController() + if err != nil || h.requeue { + return err, false + } if h.instance.Status.Shrink != nil { err := h.cleanStatefulSet() if err != nil || h.requeue { return err, false } } - err := h.ensureKubernetes() + err = h.ensureKubernetes() if err != nil || h.requeue { return err, false } @@ -55,7 +65,6 @@ func (h *KVRocksClusterHandler) Handle() (error, bool) { if err != nil || h.requeue { return err, false } - err = h.ensureKVRocksStatus() if err != nil || h.requeue { return err, false @@ -84,6 +93,9 @@ func (h *KVRocksClusterHandler) Requeue() bool { } func (h *KVRocksClusterHandler) Finializer() error { + if _, ok := h.instance.Labels[resources.MonitoredBy]; !ok { + return nil + } commHandler := common.NewCommandHandler(h.instance, h.k8s, h.kvrocks, h.password) _, masterName := resources.ParseRedisName(h.instance.Name) for index := 0; index < int(h.instance.Spec.Master); index++ { @@ -94,5 +106,13 @@ func (h *KVRocksClusterHandler) Finializer() error { } } h.log.Info("sentinel clean up") + + // remove etcd and controller + requeue, err := h.removeController() + h.requeue = requeue + if err != nil { + return err + } + h.log.Info("controller clean up") return nil } diff --git a/pkg/controllers/cluster/kubernetes.go b/pkg/controllers/cluster/kubernetes.go index 626dedf..57cf3e7 100644 --- a/pkg/controllers/cluster/kubernetes.go +++ b/pkg/controllers/cluster/kubernetes.go @@ -35,7 +35,7 @@ func (h *KVRocksClusterHandler) ensureKubernetes() error { h.password = oldCM.Data["password"] for i := 0; i < int(h.instance.Spec.Master); i++ { sts := resources.NewClusterStatefulSet(h.instance, i) - if err = h.k8s.CreateIfNotExistsStatefulSet(sts); err != nil { + if err = h.k8s.CreateStatefulSetOrUpdateImage(sts); err != nil { return err } } @@ -131,16 +131,8 @@ func (h *KVRocksClusterHandler) ensureKubernetes() error { if topo.Migrate != nil { for _, migrate := range topo.Migrate { h.stsNodes[i][j].Migrate = append(h.stsNodes[i][j].Migrate, kvrocks.MigrateMsg{ - DstNodeID: migrate.DstNode, - Slots: kvrocks.SlotsToInt(migrate.Slots), - }) - } - } - if topo.Import != nil { - for _, im := range topo.Import { - h.stsNodes[i][j].Import = append(h.stsNodes[i][j].Import, kvrocks.ImportMsg{ - SrcNodeId: im.SrcNode, - Slots: kvrocks.SlotsToInt(im.Slots), + Shard: migrate.Shard, + Slots: kvrocks.SlotsToInt(migrate.Slots), }) } } @@ -175,16 +167,8 @@ func (h *KVRocksClusterHandler) ensureStatusTopoMsg() error { if node.Migrate != nil { for _, migrate := range node.Migrate { topo.Migrate = append(topo.Migrate, kvrocksv1alpha1.MigrateMsg{ - DstNode: migrate.DstNodeID, - Slots: kvrocks.SlotsToString(migrate.Slots), - }) - } - } - if node.Import != nil { - for _, im := range node.Import { - topo.Import = append(topo.Import, kvrocksv1alpha1.ImportMsg{ - SrcNode: im.SrcNodeId, - Slots: kvrocks.SlotsToString(im.Slots), + Shard: migrate.Shard, + Slots: kvrocks.SlotsToString(migrate.Slots), }) } } @@ -192,6 +176,7 @@ func (h *KVRocksClusterHandler) ensureStatusTopoMsg() error { } h.instance.Status.Topo = append(h.instance.Status.Topo, kvrocksv1alpha1.KVRocksTopoPartitions{ PartitionName: partitionName, + Shard: i, Topology: topoes, }) } diff --git a/pkg/controllers/cluster/kvrocks.go b/pkg/controllers/cluster/kvrocks.go index ad1db3c..b535dde 100644 --- a/pkg/controllers/cluster/kvrocks.go +++ b/pkg/controllers/cluster/kvrocks.go @@ -1,7 +1,10 @@ package cluster import ( + "errors" "fmt" + "strconv" + "strings" "k8s.io/apimachinery/pkg/types" @@ -17,9 +20,6 @@ func (h *KVRocksClusterHandler) ensureKVRocksStatus() error { if err = h.ensureKVRocksConfig(); err != nil { return err } - if err = h.ensureSetNodeID(); err != nil { - return err - } if h.instance.Status.Status == kvrocksv1alpha1.StatusCreating { if err = h.initCluster(); err != nil { return err @@ -29,12 +29,14 @@ func (h *KVRocksClusterHandler) ensureKVRocksStatus() error { return err } } + h.requeue, err = h.ensureCluster() + if err != nil { + return err + } h.ensureVersion() if err = h.ensureStatusTopoMsg(); err != nil { return err } - commHandler := common.NewCommandHandler(h.instance, h.k8s, h.kvrocks, h.password) - h.requeue, err = commHandler.EnsureTopo() h.version = h.instance.Status.Version return err } @@ -55,42 +57,13 @@ func (h *KVRocksClusterHandler) ensureKVRocksConfig() error { return nil } -func (h *KVRocksClusterHandler) ensureSetNodeID() error { - for _, sts := range h.stsNodes { - for _, node := range sts { - if node.NodeId == "" { - node.NodeId = resources.SetClusterNodeId() - } - // pod restart, reset nodeID - if err := h.kvrocks.SetClusterID(node.IP, h.password, node.NodeId); err != nil { - return err - } - } - } - return nil -} - func (h *KVRocksClusterHandler) initCluster() error { - slotsPreNode := kvrocks.HashSlotCount / h.instance.Spec.Master - slotsRem := kvrocks.HashSlotCount % h.instance.Spec.Master - allocated := 0 - for index, sts := range h.stsNodes { - expected := slotsPreNode - if index < int(slotsRem) { - expected++ - } - slots := make([]int, expected) - for i := 0; i < int(expected); i++ { - slots[i] = allocated - allocated++ - } - sts[0].Slots = slots + for _, sts := range h.stsNodes { sts[0].Role = kvrocks.RoleMaster } for partition, sts := range h.stsNodes { for index, node := range sts { if index != 0 { - node.Master = sts[0].NodeId node.Role = kvrocks.RoleSlaver } key := types.NamespacedName{ @@ -194,8 +167,9 @@ func (h *KVRocksClusterHandler) ensureFailover() error { } if change { h.version++ + return h.ensureStatusTopoMsg() } - return h.ensureStatusTopoMsg() + return nil } func (h *KVRocksClusterHandler) updatePodLabels(key types.NamespacedName, role string) error { @@ -211,3 +185,155 @@ func (h *KVRocksClusterHandler) updatePodLabels(key types.NamespacedName, role s } return nil } + +func (h *KVRocksClusterHandler) ensureCluster() (bool, error) { + nodes := make([]string, 0) + for _, sts := range h.stsNodes { + for _, node := range sts { + nodes = append(nodes, node.IP+":"+strconv.Itoa(kvrocks.KVRocksPort)) + } + } + if h.instance.Status.Status == kvrocksv1alpha1.StatusCreating { + err := h.controllerClient.CreateCluster(int(h.instance.Spec.Replicas), nodes, h.password) + if err != nil { + return false, err + } + } else { + err := h.updateCluster() + if err != nil { + return false, err + } + } + err := h.ensureSetNodeID() + if err != nil { + return false, err + } + if h.instance.Status.Status != kvrocksv1alpha1.StatusRunning { + h.instance.Status.Status = kvrocksv1alpha1.StatusRunning + } + if err := h.k8s.UpdateKVRocks(h.instance); err != nil { + return true, err + } + return false, nil +} + +func (h *KVRocksClusterHandler) ensureSetNodeID() error { + for index, sts := range h.stsNodes { + shardData, err := h.controllerClient.GetNodes(index) + if err != nil { + return err + } + masterID := "" + for _, shard := range shardData.Nodes { + if shard.Role == "master" { + masterID = shard.ID + break + } + } + if masterID == "" { + h.log.V(1).Error(errors.New("master error"), "no master node in shard", "shard", index) + return fmt.Errorf("no master node in shard %d", index) + } + for _, node := range sts { + for _, shard := range shardData.Nodes { + if simplyIp(shard.Addr) == node.IP { + node.NodeId = shard.ID + if shard.Role == "master" { + node.Role = kvrocks.RoleMaster + node.Master = "" + node.Slots = kvrocks.SlotsToInt(shardData.SlotRanges) + } else { + node.Role = kvrocks.RoleSlaver + node.Master = masterID + node.Slots = kvrocks.SlotsToInt(shardData.SlotRanges) + } + break + } + } + key := types.NamespacedName{ + Namespace: h.instance.GetNamespace(), + Name: fmt.Sprintf("%s-%d", resources.GetStatefulSetName(h.instance.GetName(), index), node.PodIndex), + } + if err := h.updatePodLabels(key, node.Role); err != nil { + return err + } + } + } + return nil +} + +func (h *KVRocksClusterHandler) updateCluster() error { + //remove node + for index, sts := range h.stsNodes { + shardData, err := h.controllerClient.GetNodes(index) + if err != nil { + return err + } + // the shard need to be created + if shardData == nil { + nodes := make([]string, 0) + for _, node := range sts { + nodes = append(nodes, node.IP+":"+strconv.Itoa(kvrocks.KVRocksPort)) + } + err := h.controllerClient.CreateShard(nodes, h.password) + if err != nil { + return err + } + continue + } + for _, shard := range shardData.Nodes { + needDeleted := true + for _, node := range sts { + if simplyIp(shard.Addr) == node.IP { + needDeleted = false + break + } + } + if needDeleted { + if err := h.controllerClient.DeleteNode(index, shard.ID); err != nil { + return err + } + } + } + } + + // add node + for index, sts := range h.stsNodes { + shardData, err := h.controllerClient.GetNodes(index) + if err != nil { + return err + } + for _, node := range sts { + needAdded := true + for _, shard := range shardData.Nodes { + if simplyIp(shard.Addr) == node.IP { + needAdded = false + break + } + } + if needAdded { + err = h.controllerClient.AddNode(index, node.IP+":"+strconv.Itoa(kvrocks.KVRocksPort), node.Role, h.password) + if err != nil { + return err + } + } + } + } + + // delete shard + shards, err := h.controllerClient.GetShards() + if err != nil { + return err + } + // TODO delete shard by any index + for i := len(shards) - 1; i >= len(h.stsNodes); i-- { + if err := h.controllerClient.DeleteShard(i); err != nil { + return err + } + } + return nil +} + +func simplyIp(ip string) string { + return strings.Split(ip, ":")[0] +} diff --git a/pkg/controllers/cluster/rebalance.go b/pkg/controllers/cluster/rebalance.go index 39ea000..659da4e 100644 --- a/pkg/controllers/cluster/rebalance.go +++ b/pkg/controllers/cluster/rebalance.go @@ -18,52 +18,28 @@ func (h *KVRocksClusterHandler) reBalance() error { } } } - for _, master := range masters { + for index, master := range masters { if master.Migrate != nil { h.requeue = true - return h.ensureReBalanceTopo(master) - } - } - h.instance.Status.Rebalance = false - h.calcExpectSlots(masters) - first := 0 - last := len(masters) - 1 - h.log.Info("begin reBalance!") - for first < last { - node1 := masters[first] - node2 := masters[last] - curLenNode1 := getCurSlotLen(node1) - curLenNode2 := getCurSlotLen(node2) - if node1.Expected == curLenNode1 { - first++ - continue - } - if node2.Expected == curLenNode2 { - last-- - continue - } - h.instance.Status.Rebalance = true - moved, err := h.moveSlot(node1, node2) - if err != nil { - return err - } - if moved == 0 { - last-- + return h.ensureReBalanceTopo(index, master) } } h.log.Info("reBalance successfully") return h.ensureStatusTopoMsg() } -func (h *KVRocksClusterHandler) ensureReBalanceTopo(node *kvrocks.Node) error { +func (h *KVRocksClusterHandler) ensureReBalanceTopo(src int, node *kvrocks.Node) error { for _, migrate := range node.Migrate { - dstNodeID := migrate.DstNodeID - h.log.Info("begin move slots", "src", node.NodeId, "dst", dstNodeID, "slots", migrate.Slots) + dest := migrate.Shard + h.log.Info("begin move slots", "src", src, "dst", dest, "slots", migrate.Slots) for _, slot := range migrate.Slots { retry := 0 wait := time.Millisecond * 10 moveSlots: - if !h.kvrocks.MoveSlots(node.IP, h.password, slot, dstNodeID) { + // TODO controller 500 "there is a migration task running" + err := h.controllerClient.MigrateSlotAndData(src, dest, slot) + if err != nil { + h.log.Error(err, "move slot error") if retry < 5 { time.Sleep(wait) } else { @@ -74,108 +50,13 @@ func (h *KVRocksClusterHandler) ensureReBalanceTopo(node *kvrocks.Node) error { wait *= 10 goto moveSlots } - if err := h.restSlot(slot, dstNodeID); err != nil { - return err - } } node.Slots = node.Slots[len(migrate.Slots):] - dst := h.masters[dstNodeID] - dst.Slots = append(dst.Slots, migrate.Slots...) node.Migrate = node.Migrate[1:] - dst.Import = dst.Import[1:] if err := h.ensureStatusTopoMsg(); err != nil { return err } - h.log.Info("move slots successfully", "src", node.NodeId, "dst", dstNodeID, "slots", migrate.Slots) - } - return nil -} - -func (h *KVRocksClusterHandler) restSlot(slot int, dstNodeId string) error { - // h.version++ - for _, sts := range h.stsNodes { - for _, node := range sts { - reset: - if err := h.kvrocks.ResetSlot(node.IP, h.password, slot, h.version, dstNodeId); err != nil { - if err.Error() == kvrocks.ClusterVersionInvalid { - h.version++ - goto reset - } - return err - } - } + h.log.Info("move slots successfully", "src", src, "dst", dest, "slots", migrate.Slots) } return nil } - -func (h *KVRocksClusterHandler) moveSlot(node1 *kvrocks.Node, node2 *kvrocks.Node) (int, error) { - balance1 := getCurSlotLen(node1) - node1.Expected - balance2 := getCurSlotLen(node2) - node2.Expected - moved := 0 - src, dst := node1, node2 - if balance1 > 0 && balance2 < 0 { - moved = min(balance1, -balance2) - } - if balance1 < 0 && balance2 > 0 { - moved = min(-balance1, balance2) - src, dst = node2, node1 - } - var slots []int - index := 0 - for _, migrate := range src.Migrate { - index += len(migrate.Slots) - } - for moved > 0 { - slot := src.Slots[index] - moved-- - index++ - slots = append(slots, slot) - } - if len(slots) != 0 { - src.Migrate = append(src.Migrate, kvrocks.MigrateMsg{ - DstNodeID: dst.NodeId, - Slots: slots, - }) - dst.Import = append(dst.Import, kvrocks.ImportMsg{ - SrcNodeId: src.NodeId, - Slots: slots, - }) - } - return len(slots), nil -} - -func (h *KVRocksClusterHandler) calcExpectSlots(masters []*kvrocks.Node) { - slotsPreNode := kvrocks.HashSlotCount / h.instance.Spec.Master - slotsRem := kvrocks.HashSlotCount % h.instance.Spec.Master - for i, node := range masters { - node.Expected = int(slotsPreNode) - if i < int(slotsRem) { - node.Expected++ - } - if i >= int(h.instance.Spec.Master) { - node.Expected = 0 - } - } -} - -func min(x, y int) int { - if x > y { - return y - } - return x -} - -func getCurSlotLen(node *kvrocks.Node) int { - result := len(node.Slots) - if node.Import != nil { - for _, im := range node.Import { - result += len(im.Slots) - } - } - if node.Migrate != nil { - for _, migrate := range node.Migrate { - result -= len(migrate.Slots) - } - } - return result -} diff --git a/pkg/controllers/cluster/sentinel.go b/pkg/controllers/cluster/sentinel.go index 4a0f770..7f4cb6b 100644 --- a/pkg/controllers/cluster/sentinel.go +++ b/pkg/controllers/cluster/sentinel.go @@ -1,35 +1,60 @@ package cluster import ( + "strconv" + + "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" - "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" - "github.com/RocksLabs/kvrocks-operator/pkg/controllers/common" + "github.com/RocksLabs/kvrocks-operator/pkg/resources" ) func (h *KVRocksClusterHandler) ensureSentinel() error { if h.instance.Status.Shrink != nil { return nil } - commHandler := common.NewCommandHandler(h.instance, h.k8s, h.kvrocks, h.password) - var err error - for index, sts := range h.stsNodes { - for _, node := range sts { - if node.Role == kvrocks.RoleMaster { - h.requeue, err = commHandler.EnsureSentinel(node.IP, index) - if err != nil { - return err - } - } - } - } + // add Finalizer if !controllerutil.ContainsFinalizer(h.instance, kvrocksv1alpha1.KVRocksFinalizer) { controllerutil.AddFinalizer(h.instance, kvrocksv1alpha1.KVRocksFinalizer) - if err = h.k8s.UpdateKVRocks(h.instance); err != nil { + if err := h.k8s.UpdateKVRocks(h.instance); err != nil { return err } } - h.log.Info("sentinel monitor ready") + // notify sentinel to update + if v, ok := h.instance.Labels[resources.MonitoredBy]; ok { + return h.updateSentinelAnnotationCount(v) + } + + return nil +} + +func (h *KVRocksClusterHandler) updateSentinelAnnotationCount(sentinelName string) error { + sentinel, err := h.k8s.GetKVRocks(types.NamespacedName{ + Namespace: h.instance.Namespace, + Name: sentinelName, + }) + if err != nil { + return err + } + annotations := sentinel.GetAnnotations() + if annotations == nil { + annotations = make(map[string]string) + } + count, ok := annotations["change-count"] + if !ok { + count = "0" + } + countInt, err := strconv.Atoi(count) + if err != nil { + return err + } + countInt++ + annotations["change-count"] = strconv.Itoa(countInt) + sentinel.SetAnnotations(annotations) + if err := h.k8s.UpdateKVRocks(sentinel); err != nil { + return err + } + h.log.V(1).Info("sentinel monitor ready") return nil } diff --git a/pkg/controllers/common/topo.go b/pkg/controllers/common/topo.go deleted file mode 100644 index dffcb55..0000000 --- a/pkg/controllers/common/topo.go +++ /dev/null @@ -1,58 +0,0 @@ -package common - -import ( - "fmt" - "strings" - - kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" - "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" -) - -func (h *CommandHandler) EnsureTopo() (bool, error) { - if h.instance.Status.Rebalance { - return false, nil - } - topoMsg := "" - for _, sts := range h.instance.Status.Topo { - for _, node := range sts.Topology { - if node.Failover { - continue - } - topoMsg += getTopoMsg(node) - } - } -ensureTopo: - for _, sts := range h.instance.Status.Topo { - for _, node := range sts.Topology { - if node.Failover { - continue - } - if err := h.kvrocks.SetTopoMsg(node.Ip, h.password, topoMsg, h.instance.Status.Version); err != nil { - if err.Error() == kvrocks.ClusterInvalidVersion { - h.instance.Status.Version++ - goto ensureTopo - } - return false, err - } - } - } - if h.instance.Status.Status != kvrocksv1alpha1.StatusRunning { - h.instance.Status.Status = kvrocksv1alpha1.StatusRunning - } - if err := h.k8s.UpdateKVRocks(h.instance); err != nil { - return true, err - } - return false, nil -} - -func getTopoMsg(node kvrocksv1alpha1.KVRocksTopology) string { - var msg string - if node.Role == kvrocks.RoleMaster { - msg = fmt.Sprintf("%s %s %d master - %v", node.NodeId, node.Ip, kvrocks.KVRocksPort, node.Slots) - msg = strings.ReplaceAll(msg, "[", "") - msg = strings.ReplaceAll(msg, "]", "") - } else { - msg = fmt.Sprintf("%s %s %d slave %s", node.NodeId, node.Ip, kvrocks.KVRocksPort, node.MasterId) - } - return msg + "\n" -} diff --git a/pkg/controllers/events/event.go b/pkg/controllers/events/event.go index 3b4251d..39fec1f 100644 --- a/pkg/controllers/events/event.go +++ b/pkg/controllers/events/event.go @@ -9,6 +9,7 @@ import ( "github.com/robfig/cron/v3" "k8s.io/apimachinery/pkg/types" + "github.com/RocksLabs/kvrocks-operator/pkg/client/controller" "github.com/RocksLabs/kvrocks-operator/pkg/client/k8s" "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" ) @@ -44,13 +45,15 @@ type event struct { producerSentinels map[string]func(msg *produceMessage) k8s *k8s.Client kvrocks *kvrocks.Client + controller *controller.Client log logr.Logger } -func NewEvent(k8s *k8s.Client, kvrocks *kvrocks.Client, log logr.Logger) *event { +func NewEvent(k8s *k8s.Client, kvrocks *kvrocks.Client, controller *controller.Client, log logr.Logger) *event { return &event{ k8s: k8s, kvrocks: kvrocks, + controller: controller, messages: message, producerSentinels: map[string]func(msg *produceMessage){}, log: log, diff --git a/pkg/controllers/events/handler.go b/pkg/controllers/events/handler.go index d743caf..be79976 100644 --- a/pkg/controllers/events/handler.go +++ b/pkg/controllers/events/handler.go @@ -1,7 +1,6 @@ package events import ( - "errors" "strconv" "strings" "time" @@ -16,6 +15,7 @@ import ( ) const ErrNoSuitableSlaver = "ErrNoSuitableSlaver" +const ErrNoMaster = "ErrNoMaster" func (e *event) sentDownMessage(msg *produceMessage) { pubsub, finalize := e.kvrocks.SubOdownMsg(msg.ip, msg.password) @@ -85,9 +85,16 @@ func (e *event) handleFailover(msg *eventMessage) { } commHandler := common.NewCommandHandler(instance, e.k8s, e.kvrocks, instance.Spec.Password) - // only one node, set instance fail - if len(instance.Status.Topo[msg.partition].Topology) == 1 { - e.log.Error(errors.New(ErrNoSuitableSlaver), "this instance doesn't have slaves") + err = e.controller.SetEndPoint(instance.Namespace, e.k8s) + if err != nil { + e.log.Error(err, "set endpoint failed", "instance", msg.key, "partition", msg.partition) + return + } + + // handle failover shard + err = e.controller.FailoverShard(msg.partition) + if err != nil { + e.log.Error(err, "failover shard failed", "instance", msg.key, "partition", msg.partition) instance.Status = kvrocksv1alpha1.KVRocksStatus{ Status: kvrocksv1alpha1.StatusFailed, Reason: ErrNoSuitableSlaver, @@ -97,98 +104,68 @@ func (e *event) handleFailover(msg *eventMessage) { } return } - // handle failover - failover := false - // slaves ip - nodeIps := map[string]int{} - oldMasterIndex := 0 - var newMasterIP *string - for index, topo := range instance.Status.Topo[msg.partition].Topology { + + isMasterFailover := false + for _, topo := range instance.Status.Topo[msg.partition].Topology { if topo.Failover { continue } if topo.Ip == msg.ip { - if topo.Role == kvrocks.RoleSlaver { - instance.Status.Topo[msg.partition].Topology[index].Failover = true - err = e.k8s.UpdateKVRocks(instance) - return + if topo.Role == kvrocks.RoleMaster { + isMasterFailover = true } - failover = true - oldMasterIndex = index - continue + break } - nodeIps[topo.Ip] = index } - if failover { + if isMasterFailover { // sentinel remove monitor _, masterName := resources.ParseRedisName(msg.key.Name) commHandler.RemoveMonitor(masterName, msg.partition) - newMasterIP = e.findNewMaster(nodeIps, instance.Spec.Password) - // can't find suitable slave - if newMasterIP == nil { - //filover timeout - if time.Since(msg.timeout) >= 0 { - e.log.Error(errors.New(ErrNoSuitableSlaver), "this instance doesn't have slaves") - instance.Status = kvrocksv1alpha1.KVRocksStatus{ - Status: kvrocksv1alpha1.StatusFailed, - Reason: ErrNoSuitableSlaver, - } - err = e.k8s.UpdateKVRocks(instance) - } - return + } + + // update topology + shardData, err := e.controller.GetNodes(msg.partition) + if err != nil { + return + } + + // find new masterID + masterID := "" + for _, node := range shardData.Nodes { + if node.Role == kvrocks.RoleMaster { + masterID = node.ID + break } - newMasterIndex := nodeIps[*newMasterIP] - oldMaster := instance.Status.Topo[msg.partition].Topology[oldMasterIndex] - newMaster := instance.Status.Topo[msg.partition].Topology[newMasterIndex] - for index, topo := range instance.Status.Topo[msg.partition].Topology { - if topo.NodeId == newMaster.NodeId { - instance.Status.Topo[msg.partition].Topology[index] = kvrocksv1alpha1.KVRocksTopology{ - Pod: newMaster.Pod, - Role: kvrocks.RoleMaster, - NodeId: newMaster.NodeId, - Ip: newMaster.Ip, - Port: kvrocks.KVRocksPort, - Slots: oldMaster.Slots, - Migrate: oldMaster.Migrate, - Import: oldMaster.Import, - Failover: false, - } - } else { - instance.Status.Topo[msg.partition].Topology[index] = kvrocksv1alpha1.KVRocksTopology{ - Role: kvrocks.RoleSlaver, - MasterId: newMaster.NodeId, - Port: kvrocks.KVRocksPort, - Pod: topo.Pod, - Failover: false, - NodeId: topo.NodeId, - Ip: topo.Ip, - } - if topo.NodeId == oldMaster.NodeId { - instance.Status.Topo[msg.partition].Topology[index].Failover = true - } - } + } + if masterID == "" { + e.log.Error(err, "no master found in instance", msg.key, "partition", msg.partition) + instance.Status = kvrocksv1alpha1.KVRocksStatus{ + Status: kvrocksv1alpha1.StatusFailed, + Reason: ErrNoMaster, } - instance.Status.Version++ - err = e.k8s.UpdateKVRocks(instance) - if err != nil { - return + if err = e.k8s.UpdateKVRocks(instance); err == nil { + requeue = false } - _, err = commHandler.EnsureTopo() + return } -} -func (e *event) findNewMaster(ips map[string]int, password string) *string { - max := 0 - var slaveIp *string - for ip := range ips { - offset, err := e.kvrocks.GetOffset(ip, password) - if err != nil || offset == -1 { - return nil - } - if offset > max { - max = offset - slaveIp = &ip + for index, topo := range instance.Status.Topo[msg.partition].Topology { + for _, node := range shardData.Nodes { + if topo.NodeId == node.ID { + instance.Status.Topo[msg.partition].Topology[index].Failover = false + instance.Status.Topo[msg.partition].Topology[index].Role = node.Role + if node.Role == kvrocks.RoleSlaver { + instance.Status.Topo[msg.partition].Topology[index].MasterId = masterID + } + } + if topo.Ip == msg.ip { + instance.Status.Topo[msg.partition].Topology[index].Failover = true + } } } - return slaveIp + instance.Status.Version++ + err = e.k8s.UpdateKVRocks(instance) + if err != nil { + return + } } diff --git a/pkg/controllers/kvrocks_controller.go b/pkg/controllers/kvrocks_controller.go index be160b4..73d9685 100644 --- a/pkg/controllers/kvrocks_controller.go +++ b/pkg/controllers/kvrocks_controller.go @@ -35,6 +35,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + controllerClient "github.com/RocksLabs/kvrocks-operator/pkg/client/controller" k8s "github.com/RocksLabs/kvrocks-operator/pkg/client/k8s" kv "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" "github.com/RocksLabs/kvrocks-operator/pkg/controllers/cluster" @@ -58,18 +59,19 @@ type KVRocksReconciler struct { once sync.Once } -//+kubebuilder:rbac:groups=kvrocks.apache.org,resources=kvrocks,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=kvrocks.apache.org,resources=kvrocks/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=kvrocks.apache.org,resources=kvrocks/finalizers,verbs=update -//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=nodes,verbs=get;list;watch -//+kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=secret,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=core,resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=apps.kruise.io,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=kvrocks.apache.org,resources=kvrocks,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=kvrocks.apache.org,resources=kvrocks/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=kvrocks.apache.org,resources=kvrocks/finalizers,verbs=update +// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=nodes,verbs=get;list;watch +// +kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=secret,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=core,resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=apps.kruise.io,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete // Reconcile is part of the main kubernetes reconciliation loop which aims to // move the current state of the cluster closer to the desired state. @@ -84,6 +86,7 @@ func (r *KVRocksReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct log := r.Log.WithName(req.NamespacedName.String()) k8sClient := k8s.NewK8sClient(r.Client, log) kvClient := kv.NewKVRocksClient(log) + controllerClient := controllerClient.NewClient(log) instance, err := k8sClient.GetKVRocks(req.NamespacedName) if err != nil { if errors.IsNotFound(err) { @@ -92,7 +95,7 @@ func (r *KVRocksReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct return ctrl.Result{}, err } r.once.Do(func() { - event := events.NewEvent(k8sClient, kvClient, log) + event := events.NewEvent(k8sClient, kvClient, controllerClient, log) go event.Run() }) var handler KVRocksHandler @@ -102,7 +105,7 @@ func (r *KVRocksReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct case kvrocksv1alpha1.StandardType: handler = standard.NewKVRocksStandardHandler(k8sClient, kvClient, log, req.NamespacedName, instance) case kvrocksv1alpha1.ClusterType: - handler = cluster.NewKVRocksClusterHandler(k8sClient, kvClient, log, req.NamespacedName, instance) + handler = cluster.NewKVRocksClusterHandler(k8sClient, kvClient, log, req.NamespacedName, instance, controllerClient) } // delete if instance.GetDeletionTimestamp() != nil { @@ -191,10 +194,11 @@ func shouldNotRetry(err error) bool { func runIfInitialize(instance *kvrocksv1alpha1.KVRocks, log logr.Logger, k8sClient *k8s.Client) error { labels := resources.MergeLabels(instance.Labels, resources.SelectorLabels(instance)) - if instance.Spec.Type == kvrocksv1alpha1.ClusterType { - sysId, _ := resources.ParseRedisName(instance.Name) - labels = resources.MergeLabels(labels, resources.MonitorLabels(resources.GetSentinelName(sysId))) - } + // todo each cluster has a unique sentinel cluster + // if instance.Spec.Type == kvrocksv1alpha1.ClusterType { + // sysId, _ := resources.ParseRedisName(instance.Name) + // labels = resources.MergeLabels(labels, resources.MonitorLabels(resources.GetSentinelName(sysId))) + // } if instance.Spec.Type == kvrocksv1alpha1.SentinelType { labels = resources.MergeLabels(labels, resources.SentinelLabels()) } @@ -204,11 +208,6 @@ func runIfInitialize(instance *kvrocksv1alpha1.KVRocks, log logr.Logger, k8sClie return err } } - // TODO wait for the relase of cluster mode - // if instance.Spec.Type == kvrocksv1alpha1.ClusterType && !instance.Spec.SentinelConfig.EnableSentinel { - // instance.Spec.SentinelConfig.EnableSentinel = true - // return k8sClient.UpdateKVRocks(instance) - // } if instance.Status.Status == kvrocksv1alpha1.StatusNone { log.Info("kvrocks is creating") instance.Status.Status = kvrocksv1alpha1.StatusCreating diff --git a/pkg/resources/configmap.go b/pkg/resources/configmap.go index 0cbb33a..e028513 100644 --- a/pkg/resources/configmap.go +++ b/pkg/resources/configmap.go @@ -8,6 +8,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" ) var UnChangeCfg = map[string]struct{}{ @@ -127,3 +128,32 @@ func ParseKVRocksConfigs(config map[string]string) map[string]string { } return cfg } + +func NewKVRocksControllerConfigmap(instance *kvrocksv1alpha1.KVRocks) *corev1.ConfigMap { + configYAML := fmt.Sprintf(` +addr: "0.0.0.0:%d" +etcd: + addrs: + - "%s:%d" + username: + password: + tls: + enable: false + cert_file: + key_file: + ca_file: +`, kvrocks.ControllerPort, kvrocks.EtcdServiceName, kvrocks.EtcdClientPort) + + return &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "controller-config", + Namespace: instance.Namespace, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(instance, instance.GroupVersionKind()), + }, + }, + Data: map[string]string{ + "config.yaml": configYAML, + }, + } +} diff --git a/pkg/resources/deployment.go b/pkg/resources/deployment.go index 76f2b6d..d174f0c 100644 --- a/pkg/resources/deployment.go +++ b/pkg/resources/deployment.go @@ -4,6 +4,7 @@ import ( "fmt" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -74,3 +75,61 @@ func GetDeploymentName(name string, index ...int) string { } return name } + +func NewKVRocksControllerDeployment(instance *kvrocksv1alpha1.KVRocks) *appsv1.Deployment { + labels := map[string]string{"app": "kvrocks-controller"} + replicas := int32(1) + + return &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: kvrocks.ControllerDeploymentName, + Namespace: instance.Namespace, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(instance, instance.GroupVersionKind()), + }, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: labels, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "controller", + Image: "jinxu95/kvrocks-controller:latest", + Ports: []corev1.ContainerPort{ + { + ContainerPort: kvrocks.ControllerPort, + }, + }, + VolumeMounts: []corev1.VolumeMount{ + { + Name: "config-volume", + MountPath: "/var/lib/kvctl/config.yaml", + SubPath: "config.yaml", + }, + }, + }, + }, + Volumes: []corev1.Volume{ + { + Name: "config-volume", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: "controller-config", + }, + }, + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/resources/kvrocks.go b/pkg/resources/kvrocks.go index fa7904c..49ac2b2 100644 --- a/pkg/resources/kvrocks.go +++ b/pkg/resources/kvrocks.go @@ -7,7 +7,7 @@ import ( "time" "github.com/go-logr/logr" - uuid "github.com/google/uuid" + uuid "github.com/satori/go.uuid" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/rand" @@ -92,7 +92,7 @@ var key = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', func SetClusterNodeId() string { rand.Seed(time.Now().Unix()) - uid := uuid.New().String() + uid := uuid.NewV4().String() for i := 1; i <= 4; i++ { v1 := key[rand.Intn(len(key))] v2 := key[rand.Intn(len(key))] diff --git a/pkg/resources/resource_test.go b/pkg/resources/resource_test.go deleted file mode 100644 index f13aae5..0000000 --- a/pkg/resources/resource_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package resources - -import ( - "fmt" - "sort" - "testing" - "time" - - "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" -) - -func TestSetClusterNodeId(t *testing.T) { - for i := 0; i < 20; i++ { - str := SetClusterNodeId() - fmt.Println(str) - fmt.Println(len(str)) - } -} - -func TestSetSlots(t *testing.T) { - slotsPreNode := (kvrocks.HashSlotCount) / 11 - slotsRem := (kvrocks.HashSlotCount) % 11 - allocated := 0 - for index := 0; index < 11; index++ { - begin := allocated - expected := slotsPreNode - if index < slotsRem { - expected++ - } - for i := 0; i < expected; i++ { - allocated++ - } - end := allocated - 1 - fmt.Printf("begin: %d end: %d\n", begin, end) - } -} - -func TestGetSlotSum(t *testing.T) { - a := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1} - sort.Ints(a) - fmt.Println(a) - -} - -func TestSlotToString(t *testing.T) { - fmt.Println(time.Since(time.Now().Add(time.Second*30)) < 0) -} diff --git a/pkg/resources/service.go b/pkg/resources/service.go index 6db47e4..29b6807 100644 --- a/pkg/resources/service.go +++ b/pkg/resources/service.go @@ -3,6 +3,7 @@ package resources import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" @@ -53,3 +54,53 @@ func NewKVRocksService(instance *kvrocksv1alpha1.KVRocks) *corev1.Service { }, } } + +func NewEtcdService(instance *kvrocksv1alpha1.KVRocks) *corev1.Service { + return &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: kvrocks.EtcdServiceName, + Namespace: instance.Namespace, + Labels: map[string]string{"app": "etcd"}, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(instance, instance.GroupVersionKind()), + }, + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Name: "client", + Port: kvrocks.EtcdClientPort, + TargetPort: intstr.FromInt(kvrocks.EtcdClientPort), + }, { + Name: "server", + Port: kvrocks.EtcdServerPort, + TargetPort: intstr.FromInt(kvrocks.EtcdServerPort), + }, + }, + Selector: map[string]string{"app": "etcd"}, + }, + } +} + +func NewKVRocksControllerService(instance *kvrocksv1alpha1.KVRocks) *corev1.Service { + return &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: kvrocks.ControllerServiceName, + Namespace: instance.Namespace, + Labels: map[string]string{"app": "kvrocks-controller"}, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(instance, instance.GroupVersionKind()), + }, + }, + Spec: corev1.ServiceSpec{ + Selector: map[string]string{"app": "kvrocks-controller"}, + Ports: []corev1.ServicePort{ + { + Protocol: corev1.ProtocolTCP, + Port: kvrocks.ControllerPort, + TargetPort: intstr.FromInt(kvrocks.ControllerPort), + }, + }, + }, + } +} diff --git a/pkg/resources/statefulset.go b/pkg/resources/statefulset.go index 19a82b3..d472bf5 100644 --- a/pkg/resources/statefulset.go +++ b/pkg/resources/statefulset.go @@ -7,12 +7,14 @@ import ( "github.com/openkruise/kruise-api/apps/pub" kruise "github.com/openkruise/kruise-api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" ) var TerminationGracePeriodSeconds int64 = 20 @@ -153,7 +155,7 @@ func NewReplicationStatefulSet(instance *kvrocksv1alpha1.KVRocks) *kruise.Statef func NewClusterStatefulSet(instance *kvrocksv1alpha1.KVRocks, index int) *kruise.StatefulSet { sts := NewStatefulSet(instance, GetStatefulSetName(instance.Name, index)) - sts.Spec.Template.Spec.Containers = append(sts.Spec.Template.Spec.Containers, *NewInstanceContainer(instance)) + sts.Spec.Template.Spec.Containers = append(sts.Spec.Template.Spec.Containers, *NewInstanceContainer(instance), *NewExporterContainer(instance)) return sts } @@ -168,3 +170,59 @@ func GetStatefulSetName(name string, index ...int) string { } return name } + +// default storage for controller +func NewEtcdStatefulSet(instance *kvrocksv1alpha1.KVRocks) *appsv1.StatefulSet { + replicas := int32(1) + + return &appsv1.StatefulSet{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "StatefulSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: kvrocks.EtcdStatefulName, + Namespace: instance.Namespace, + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(instance, instance.GroupVersionKind()), + }, + }, + Spec: appsv1.StatefulSetSpec{ + Replicas: &replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{"app": "etcd"}, + }, + ServiceName: kvrocks.EtcdServiceName, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"app": "etcd"}, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "etcd", + Image: "quay.io/coreos/etcd:latest", + Ports: []corev1.ContainerPort{ + { + ContainerPort: kvrocks.EtcdServerPort, + }, { + ContainerPort: kvrocks.EtcdClientPort, + }, + }, + Args: []string{ + "/usr/local/bin/etcd", + "--name=etcd0", + "--listen-peer-urls=http://0.0.0.0:" + strconv.Itoa(kvrocks.EtcdServerPort), + "--listen-client-urls=http://0.0.0.0:" + strconv.Itoa(kvrocks.EtcdClientPort), + "--advertise-client-urls=http://" + kvrocks.EtcdServiceName + ":" + strconv.Itoa(kvrocks.EtcdClientPort), + "--initial-advertise-peer-urls=http://" + kvrocks.EtcdServiceName + ":" + strconv.Itoa(kvrocks.EtcdServerPort), + "--initial-cluster=etcd0=http://" + kvrocks.EtcdServiceName + ":" + strconv.Itoa(kvrocks.EtcdServerPort), + "--initial-cluster-state=new", + }, + }, + }, + }, + }, + }, + } +} diff --git a/test/e2e/Makefile b/test/e2e/Makefile index c417a03..305ed32 100644 --- a/test/e2e/Makefile +++ b/test/e2e/Makefile @@ -12,6 +12,8 @@ ginkgo: ## Download ginkgo locally if necessary. e2e-test: ifeq ($(mode), standard) CONFIG_FILE_PATH=$(PROJECT_DIR)/test/e2e/$(CONFIG_FILE_PATH) $(GINKGO) -v ./standard/ +else ifeq ($(mode), cluster) + CONFIG_FILE_PATH=$(PROJECT_DIR)/test/e2e/$(CONFIG_FILE_PATH) $(GINKGO) -v ./cluster/ else @echo "Invalid mode: $(mode)" endif diff --git a/test/e2e/README.md b/test/e2e/README.md index 61d9179..11067f5 100644 --- a/test/e2e/README.md +++ b/test/e2e/README.md @@ -9,11 +9,18 @@ make ginkgo # download the ginkgo tool Then, you can refer to the development guide docs to install the Telepresence tool, which supports connecting to the cluster. -Now, you can use the following command to run the e2e test for standard mode: +To execute the end-to-end test in standard mode, use the command below: ```bash make e2e-test mode=standard CONFIG_FILE_PATH=config/config.yaml # run the e2e test for standard mode ``` +For testing in cluster mode, utilize the following command: +```bash +make e2e-test mode=cluster CONFIG_FILE_PATH=config/config.yaml # run the e2e test for cluster mode +``` + + + The details of [config.yaml](config/config.yaml) are as follows: ```yaml kruiseVersion: 1.4.0 diff --git a/test/e2e/cluster/cluster_test.go b/test/e2e/cluster/cluster_test.go new file mode 100644 index 0000000..e7ca3f4 --- /dev/null +++ b/test/e2e/cluster/cluster_test.go @@ -0,0 +1,423 @@ +package cluster + +import ( + "context" + "errors" + "fmt" + "os" + "reflect" + "time" + + kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" + "github.com/RocksLabs/kvrocks-operator/pkg/resources" + . "github.com/RocksLabs/kvrocks-operator/test/e2e/util" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + kruise "github.com/openkruise/kruise-api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + k8serr "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" +) + +var ( + env *KubernetesEnv + ctx context.Context + kvrocksClient *kvrocks.Client +) + +var _ = BeforeSuite(func() { + configFilePath := os.Getenv("CONFIG_FILE_PATH") + if configFilePath == "" { + configFilePath = "../config/config.yaml" + } + config, err := NewConfig(configFilePath) + Expect(err).Should(Succeed()) + env = Start(config) + ctx = context.Background() + kvrocksClient = kvrocks.NewKVRocksClient(ctrl.Log) +}) + +var _ = AfterSuite(func() { + err := env.Clean() + Expect(err).Should(Succeed()) +}) + +var _ = Describe("Operator for Cluster Mode", func() { + const ( + timeout = time.Minute * 10 + interval = time.Second * 10 + ) + + var ( + kvrocksInstance *kvrocksv1alpha1.KVRocks + sentinelInstance *kvrocksv1alpha1.KVRocks + kvrocksKey types.NamespacedName + sentinelKey types.NamespacedName + ) + + BeforeEach(func() { + var err error + kvrocksInstance, err = env.ParseManifest(kvrocksv1alpha1.ClusterType) + Expect(err).Should(Succeed()) + sentinelInstance, err = env.ParseManifest(kvrocksv1alpha1.SentinelType) + Expect(err).Should(Succeed()) + + kvrocksKey = types.NamespacedName{ + Name: kvrocksInstance.GetName(), + Namespace: kvrocksInstance.GetNamespace(), + } + + sentinelKey = types.NamespacedName{ + Name: sentinelInstance.GetName(), + Namespace: sentinelInstance.GetNamespace(), + } + + Expect(env.Client.Create(ctx, kvrocksInstance)).Should(Succeed()) + Expect(env.Client.Create(ctx, sentinelInstance)).Should(Succeed()) + Eventually(func() error { + if err = env.Client.Get(ctx, kvrocksKey, kvrocksInstance); err != nil { + return err + } + if kvrocksInstance.Status.Status != kvrocksv1alpha1.StatusRunning { + return errors.New("kvrocks doesn't reach running status") + } + if !controllerutil.ContainsFinalizer(kvrocksInstance, kvrocksv1alpha1.KVRocksFinalizer) { + return errors.New("kvrocks doesn't contain finalizer") + } + return nil + }, timeout, interval).Should(Succeed()) + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + AfterEach(func() { + err := env.Client.Get(ctx, kvrocksKey, kvrocksInstance) + Expect(err).Should(Succeed()) + Expect(env.Client.Delete(ctx, kvrocksInstance)).Should(Succeed()) + Eventually(func() bool { + return k8serr.IsNotFound(env.Client.Get(ctx, kvrocksKey, kvrocksInstance)) + }, timeout, interval).Should(Equal(true)) + + err = env.Client.Get(ctx, sentinelKey, sentinelInstance) + Expect(err).Should(Succeed()) + Expect(env.Client.Delete(ctx, sentinelInstance)).Should(Succeed()) + Eventually(func() bool { + return k8serr.IsNotFound(env.Client.Get(ctx, sentinelKey, sentinelInstance)) + }, timeout, interval).Should(Equal(true)) + }) + + It("test update kvrocks config", func() { + kvrocksInstance.Spec.KVRocksConfig["slowlog-log-slower-than"] = "250000" + kvrocksInstance.Spec.KVRocksConfig["profiling-sample-record-threshold-ms"] = "200" + Expect(env.Client.Update(ctx, kvrocksInstance)).Should(Succeed()) + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + It("test change kvrocks password", func() { + Expect(env.Client.Get(ctx, kvrocksKey, kvrocksInstance)).Should(Succeed()) + kvrocksInstance.Spec.Password = "39c5bb" + Expect(env.Client.Update(ctx, kvrocksInstance)).Should(Succeed()) + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + It("test recover when slave down", func() { + + var pod corev1.Pod + key := types.NamespacedName{ + Namespace: kvrocksInstance.GetNamespace(), + Name: fmt.Sprintf("%s-%d-%d", kvrocksInstance.GetName(), 0, 1), + } + Expect(env.Client.Get(ctx, key, &pod)).Should(Succeed()) + Expect(kvrocksInstance.Status.Topo[0].Topology[1].Role).Should(Equal(kvrocks.RoleSlaver)) + Expect(env.Client.Delete(ctx, &pod)).Should(Succeed()) + + // wait pod reconstruction + time.Sleep(time.Second * 30) + Eventually(func() error { + err := env.Client.Get(ctx, kvrocksKey, kvrocksInstance) + if err != nil { + return err + } + + var pod corev1.Pod + key := types.NamespacedName{ + Namespace: kvrocksInstance.GetNamespace(), + Name: fmt.Sprintf("%s-%d-%d", kvrocksInstance.GetName(), 0, 1), + } + if err := env.Client.Get(ctx, key, &pod); err != nil { + return err + } + if pod.Status.Phase != corev1.PodRunning { + return errors.New("please wait pod running") + } + if kvrocksInstance.Status.Topo[0].Topology[1].Failover { + return errors.New("wait failover over") + } + + return nil + }, timeout, interval).Should(Succeed()) + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + It("test recover when master down", func() { + + var pod corev1.Pod + key := types.NamespacedName{ + Namespace: kvrocksInstance.GetNamespace(), + Name: fmt.Sprintf("%s-%d-%d", kvrocksInstance.GetName(), 0, 0), + } + Expect(env.Client.Get(ctx, key, &pod)).Should(Succeed()) + Expect(kvrocksInstance.Status.Topo[0].Topology[0].Role).Should(Equal(kvrocks.RoleMaster)) + Expect(env.Client.Delete(ctx, &pod)).Should(Succeed()) + + // wait pod reconstruction + time.Sleep(time.Second * 30) + Eventually(func() error { + err := env.Client.Get(ctx, kvrocksKey, kvrocksInstance) + if err != nil { + return err + } + Expect(err).Should(Succeed()) + + var pod corev1.Pod + key := types.NamespacedName{ + Namespace: kvrocksInstance.GetNamespace(), + Name: fmt.Sprintf("%s-%d-%d", kvrocksInstance.GetName(), 0, 0), + } + if err := env.Client.Get(ctx, key, &pod); err != nil { + return err + } + if pod.Status.Phase != corev1.PodRunning { + return errors.New("please wait pod running") + } + if kvrocksInstance.Status.Topo[0].Topology[0].Failover { + return errors.New("wait failover over") + } + return nil + }, timeout, interval).Should(Succeed()) + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + It("test shrink", func() { + kvrocksInstance.Spec.Replicas = 1 + Expect(env.Client.Update(ctx, kvrocksInstance)).Should(Succeed()) + for index := 0; index < int(kvrocksInstance.Spec.Master); index++ { + key := types.NamespacedName{ + Namespace: kvrocksInstance.Namespace, + Name: fmt.Sprintf("%s-%d", kvrocksInstance.GetName(), index), + } + Eventually(func() error { + var sts kruise.StatefulSet + Expect(env.Client.Get(ctx, key, &sts)).Should(Succeed()) + if sts.Status.ReadyReplicas != int32(1) { + return errors.New("ready replicas error") + } + return nil + }, timeout, interval).Should(Succeed()) + } + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + It("test expansion", func() { + kvrocksInstance.Spec.Replicas = 3 + Expect(env.Client.Update(ctx, kvrocksInstance)).Should(Succeed()) + for index := 0; index < int(kvrocksInstance.Spec.Master); index++ { + key := types.NamespacedName{ + Namespace: kvrocksInstance.Namespace, + Name: fmt.Sprintf("%s-%d", kvrocksInstance.GetName(), index), + } + Eventually(func() error { + var sts kruise.StatefulSet + Expect(env.Client.Get(ctx, key, &sts)).Should(Succeed()) + if sts.Status.ReadyReplicas != 3 { + return errors.New("replication error") + } + return nil + }, timeout, interval).Should(Succeed()) + } + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + + It("test expansion and shrink master", func() { + // expansion + kvrocksInstance.Spec.Master = 5 + Expect(env.Client.Update(ctx, kvrocksInstance)).Should(Succeed()) + time.Sleep(time.Second * 30) + for index := 0; index < int(kvrocksInstance.Spec.Master); index++ { + key := types.NamespacedName{ + Namespace: kvrocksInstance.Namespace, + Name: fmt.Sprintf("%s-%d", kvrocksInstance.GetName(), index), + } + Eventually(func() error { + var sts kruise.StatefulSet + Expect(env.Client.Get(ctx, key, &sts)).Should(Succeed()) + if sts.Status.ReadyReplicas != kvrocksInstance.Spec.Replicas { + return errors.New("waitting ready") + } + return nil + }, timeout, interval).Should(Succeed()) + } + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + + // shrink + err := env.Client.Get(ctx, kvrocksKey, kvrocksInstance) + Expect(err).Should(Succeed()) + kvrocksInstance.Spec.Master = 3 + Expect(env.Client.Update(ctx, kvrocksInstance)).Should(Succeed()) + time.Sleep(time.Second * 30) + for index := 0; index < int(kvrocksInstance.Spec.Master); index++ { + key := types.NamespacedName{ + Namespace: kvrocksInstance.Namespace, + Name: fmt.Sprintf("%s-%d", kvrocksInstance.GetName(), index), + } + Eventually(func() error { + var sts kruise.StatefulSet + Expect(env.Client.Get(ctx, key, &sts)).Should(Succeed()) + if sts.Status.ReadyReplicas != kvrocksInstance.Spec.Replicas { + return errors.New("waitting ready") + } + return nil + }, timeout, interval).Should(Succeed()) + } + Eventually(func() error { + return checkKvrocksCluster(kvrocksKey, sentinelKey) + }, timeout, interval).Should(Succeed()) + }) + +}) + +func checkKvrocksCluster(kvrocksKey, sentinelKey types.NamespacedName) error { + kvrocksInstance := &kvrocksv1alpha1.KVRocks{} + err := env.Client.Get(ctx, kvrocksKey, kvrocksInstance) + if err != nil { + return err + } + sentinelInstance := &kvrocksv1alpha1.KVRocks{} + err = env.Client.Get(ctx, sentinelKey, sentinelInstance) + if err != nil { + return err + } + slots := []int{} + masterIP := []string{} + password := kvrocksInstance.Spec.Password + for _, partition := range kvrocksInstance.Status.Topo { + for _, topo := range partition.Topology { + var pod corev1.Pod + key := types.NamespacedName{ + Namespace: kvrocksInstance.GetNamespace(), + Name: topo.Pod, + } + if err := env.Client.Get(ctx, key, &pod); err != nil { + return err + } + node, err := kvrocksClient.ClusterNodeInfo(pod.Status.PodIP, password) + if err != nil { + return err + } + if topo.Role != node.Role { + return fmt.Errorf("role is incorrect, expect: %s, actual: %s", topo.Role, node.Role) + } + if topo.Role == kvrocks.RoleMaster { + masterIP = append(masterIP, topo.Ip) + if !reflect.DeepEqual(topo.Slots, kvrocks.SlotsToString(node.Slots)) { + return fmt.Errorf("slots is incorrect, expect: %v, actual: %v", topo.Slots, node.Slots) + } else { + slots = append(slots, node.Slots...) + } + } + if topo.Ip != node.IP { + return fmt.Errorf("ip is incorrect, expect: %s, actual: %s", topo.Ip, node.IP) + } + if topo.NodeId != node.NodeId { + return fmt.Errorf("nodeID is incorrect, expect: %s, actual: %s", topo.NodeId, node.NodeId) + } + if topo.MasterId != node.Master { + return fmt.Errorf("masterID is incorrect, expect: %s, actual: %s", topo.MasterId, node.Master) + } + for k, v := range kvrocksInstance.Spec.KVRocksConfig { + curValue, err := kvrocksClient.GetConfig(node.IP, password, k) + if err != nil { + return err + } + if *curValue != v { + return fmt.Errorf("kvrocks config is incorrect, expect: %s, actual: %s", v, *curValue) + } + } + } + } + if len(slots) != kvrocks.MaxSlotID+1 { + return fmt.Errorf("slots total is incorrect, expect: %d, actual: %d", (kvrocks.MaxSlotID + 1), len(slots)) + } + + podList, err := getSentinelPodList(sentinelInstance) + if err != nil { + return fmt.Errorf("get sentinel pod list error: %v", err) + } + for _, pod := range podList.Items { + for i := 0; i < int(kvrocksInstance.Spec.Master); i++ { + _, name := resources.ParseRedisName(kvrocksInstance.Name) + name = fmt.Sprintf("%s-%d", name, i) + master, err := kvrocksClient.GetMasterFromSentinel(pod.Status.PodIP, sentinelInstance.Spec.Password, name) + if err != nil { + return err + } + if master != masterIP[i] { + return fmt.Errorf("sentinel-1 monitor master error message,masterIp expect: %s, actual: %s", masterIP[i], master) + } + } + } + + pvcSum := int(kvrocksInstance.Spec.Master) * int(kvrocksInstance.Spec.Replicas) + var pvcList corev1.PersistentVolumeClaimList + if err := env.Client.List(ctx, &pvcList, client.InNamespace(kvrocksInstance.Namespace), client.MatchingLabels(kvrocksInstance.Labels)); err != nil { + return err + } + if len(pvcList.Items) != pvcSum { + return fmt.Errorf("number of pvc is incorrent, expect: %d, actual: %d", pvcSum, len(pvcList.Items)) + } + return nil +} + +func getSentinelPodList(sentinel *kvrocksv1alpha1.KVRocks) (*corev1.PodList, error) { + deployment := &appsv1.Deployment{} + key := types.NamespacedName{ + Namespace: sentinel.Namespace, + Name: sentinel.Name, + } + + if err := env.Client.Get(ctx, key, deployment); err != nil { + return nil, err + } + + labelSelector := labels.Set(deployment.Spec.Selector.MatchLabels).AsSelector() + podList := &corev1.PodList{} + listOpts := []client.ListOption{ + client.InNamespace(sentinel.Namespace), + client.MatchingLabelsSelector{Selector: labelSelector}, + } + if err := env.Client.List(ctx, podList, listOpts...); err != nil { + return nil, err + } + return podList, nil +} diff --git a/test/e2e/cluster/suite_test.go b/test/e2e/cluster/suite_test.go new file mode 100644 index 0000000..8d8eda5 --- /dev/null +++ b/test/e2e/cluster/suite_test.go @@ -0,0 +1,13 @@ +package cluster_test + +import ( + "testing" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +func TestCluster(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Cluster Suite") +} diff --git a/test/e2e/config/config.yaml b/test/e2e/config/config.yaml index 6d01b39..1f68ff7 100644 --- a/test/e2e/config/config.yaml +++ b/test/e2e/config/config.yaml @@ -1,6 +1,6 @@ kruiseVersion: 1.4.0 clusterName: e2e-test -namespace: kvrocks +namespace: default manifestDir: -chaosMeshEnabled: true -kubeConfig: +chaosMeshEnabled: false +kubeConfig: /root/.kube/config From 9a5f20fb16e2600306bca23ad4af2fd782b8fc79 Mon Sep 17 00:00:00 2001 From: jinxu <1319039722@qq.com> Date: Thu, 21 Sep 2023 23:04:37 +0800 Subject: [PATCH 2/6] fix --- .../crd/bases/kvrocks.apache.org_kvrocks.yaml | 21 + deploy/crd/templates/crd.yaml | 5 +- examples/cluster.yaml | 17 +- examples/sentinel.yaml | 6 +- go.mod | 76 ++- go.sum | 486 +++--------------- pkg/resources/kvrocks.go | 4 +- 7 files changed, 143 insertions(+), 472 deletions(-) diff --git a/config/crd/bases/kvrocks.apache.org_kvrocks.yaml b/config/crd/bases/kvrocks.apache.org_kvrocks.yaml index 7c4e10f..d3f1948 100644 --- a/config/crd/bases/kvrocks.apache.org_kvrocks.yaml +++ b/config/crd/bases/kvrocks.apache.org_kvrocks.yaml @@ -891,6 +891,27 @@ spec: resources: description: ResourceRequirements describes the compute resource requirements. properties: + claims: + description: "Claims lists the names of resources, defined in + spec.resourceClaims, that are used by this container. \n This + is an alpha field and requires enabling the DynamicResourceAllocation + feature gate. \n This field is immutable. It can only be set + for containers." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in pod.spec.resourceClaims + of the Pod where this field is used. It makes that resource + available inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: additionalProperties: anyOf: diff --git a/deploy/crd/templates/crd.yaml b/deploy/crd/templates/crd.yaml index 2d91e77..d3f1948 100644 --- a/deploy/crd/templates/crd.yaml +++ b/deploy/crd/templates/crd.yaml @@ -866,8 +866,6 @@ spec: type: array type: object type: object - enableSentinel: - type: boolean image: type: string imagePullPolicy: @@ -897,7 +895,8 @@ spec: description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation - feature gate. \n This field is immutable." + feature gate. \n This field is immutable. It can only be set + for containers." items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. properties: diff --git a/examples/cluster.yaml b/examples/cluster.yaml index 8420183..59acff1 100644 --- a/examples/cluster.yaml +++ b/examples/cluster.yaml @@ -2,16 +2,15 @@ apiVersion: kvrocks.apache.org/v1alpha1 kind: KVRocks metadata: name: kvrocks-cluster-1-demo - namespace: kvrocks + namespace: default labels: - kvrocks/system: xx + kvrocks/monitored-by: sentinel-1 spec: image: apache/kvrocks:nightly # kvrocks image imagePullPolicy: IfNotPresent master: 3 - replicas: 3 + replicas: 2 type: cluster - enableSentinel: true password: "123456" kvrocksConfig: bind: "0.0.0.0" @@ -40,9 +39,9 @@ spec: rocksdb.compression: "no" rocksdb.wal_ttl_seconds: "0" rocksdb.wal_size_limit_mb: "0" -# storage: -# size: 32Gi -# class: xxxxx # storage class + storage: + size: 200Mi + class: standard # storage class # nodeSelector: # role: kvrocks toleration: @@ -57,5 +56,5 @@ spec: cpu: 2 memory: 8Gi requests: - cpu: 1 - memory: 4Gi + cpu: 200m + memory: 200Mi diff --git a/examples/sentinel.yaml b/examples/sentinel.yaml index 31d2cf8..e704105 100644 --- a/examples/sentinel.yaml +++ b/examples/sentinel.yaml @@ -2,7 +2,7 @@ apiVersion: kvrocks.apache.org/v1alpha1 kind: KVRocks metadata: name: sentinel-1 - namespace: kvrocks + namespace: default spec: image: redis:6.2.4 imagePullPolicy: IfNotPresent @@ -21,5 +21,5 @@ spec: cpu: 500m memory: 500Mi requests: - cpu: 500m - memory: 500Mi + cpu: 200m + memory: 200Mi diff --git a/go.mod b/go.mod index 8e08e67..9da4911 100644 --- a/go.mod +++ b/go.mod @@ -3,92 +3,80 @@ module github.com/RocksLabs/kvrocks-operator go 1.19 require ( - github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657 + github.com/chaos-mesh/chaos-mesh/api v0.0.0-20230824072557-45fdbaea2552 github.com/go-logr/logr v1.2.3 github.com/go-redis/redis/v8 v8.11.5 - github.com/joaojeronimo/go-crc16 v0.0.0-20140729130949-59bd0194935e + github.com/google/uuid v1.3.1 github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.27.6 github.com/openkruise/kruise-api v1.3.0 github.com/robfig/cron/v3 v3.0.1 - github.com/satori/go.uuid v1.2.0 github.com/stretchr/testify v1.8.1 go.uber.org/zap v1.24.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/client-go v0.24.2 - sigs.k8s.io/controller-runtime v0.12.3 + k8s.io/api v0.26.7 + k8s.io/apimachinery v0.26.7 + k8s.io/client-go v0.26.7 + sigs.k8s.io/controller-runtime v0.14.6 sigs.k8s.io/yaml v1.3.0 ) require ( - cloud.google.com/go v0.81.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.18 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.13 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/emicklei/go-restful v2.9.5+incompatible // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-logr/zapr v1.2.0 // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/zapr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.21.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.1.2 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.8.0 // indirect golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/oauth2 v0.4.0 // indirect golang.org/x/sys v0.6.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + k8s.io/apiextensions-apiserver v0.26.7 // indirect + k8s.io/component-base v0.26.7 // indirect + k8s.io/klog/v2 v2.90.0 // indirect + k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect + k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect ) diff --git a/go.sum b/go.sum index 3b4add8..30acd81 100644 --- a/go.sum +++ b/go.sum @@ -13,12 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV 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.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 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= 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= @@ -27,7 +21,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 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= @@ -38,30 +31,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl 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= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= -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 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= -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 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -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 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -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 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -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/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -69,132 +40,82 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -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/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -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.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657 h1:CyuI+igIjadM/GRnE2o0q+WCwipDh0n2cUYFPAvxziM= -github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657/go.mod h1:JRiumF+RFsH1mrrP8FUsi9tExPylKkO/oSRWeQEUdLE= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20230824072557-45fdbaea2552 h1:Yp/OQYjMZRFYi4xJ1Z4mhU5k5yxVcyP/4qS8C+egROE= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20230824072557-45fdbaea2552/go.mod h1:y0x6w0fKnAgm/hBxDx2/0BDGw242LPEZ9eEq1foehCg= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 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/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -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.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +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/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 h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -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 h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= 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.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= 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-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 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/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/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= @@ -207,7 +128,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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/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= @@ -223,15 +143,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD 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 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -241,18 +157,15 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -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/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= @@ -260,57 +173,19 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf 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-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-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -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.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 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/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/joaojeronimo/go-crc16 v0.0.0-20140729130949-59bd0194935e h1:LY29wmnTcSR92avOm1dW0LSjeE3d9Xnhm/mpGzMT/wc= -github.com/joaojeronimo/go-crc16 v0.0.0-20140729130949-59bd0194935e/go.mod h1:+X++CLDTje8Yr7J4bGuUYx5LVbNpXPeO5ZLpI42hKVk= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -321,45 +196,28 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr 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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 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 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 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= @@ -367,105 +225,66 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN 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/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/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -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 h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -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.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -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.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/openkruise/kruise-api v1.3.0 h1:yfEy64uXgSuX/5RwePLbwUK/uX8RRM8fHJkccel5ZIQ= github.com/openkruise/kruise-api v1.3.0/go.mod h1:9ZX+ycdHKNzcA5ezAf35xOa2Mwfa2BYagWr0lKgi5dU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= 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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -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/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -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.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -481,72 +300,32 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 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= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= 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.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-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-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-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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= @@ -569,8 +348,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl 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/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= @@ -579,17 +356,10 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB 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.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.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 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-20181023162649-9b4f9f5ad519/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= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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= @@ -601,7 +371,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL 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= @@ -618,19 +387,9 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R 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-20201202161906-c7110b5ffcbb/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-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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/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.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -638,15 +397,10 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr 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-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= -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.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= 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= @@ -657,13 +411,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ 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/sys v0.0.0-20180823144017-11551d06cbcc/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-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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= @@ -677,7 +427,6 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191026070338-33540a1f6037/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= @@ -693,37 +442,20 @@ 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-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/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-20200923182605-d9f96fdee20d/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/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-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210603081109-ebe580a85c40/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-20210831042530-f4d43177bf5e/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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/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-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -735,8 +467,6 @@ 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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= @@ -744,30 +474,24 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 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-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-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-20190328211700-ab21143f2384/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-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/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-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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= @@ -787,7 +511,6 @@ 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-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= @@ -795,17 +518,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY 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-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-20201224043029-2b0845dc783e/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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -829,11 +543,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M 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/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= @@ -863,31 +572,15 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG 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-20200423170343-7949de9c1215/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-20201102152239-715cce707fb0/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-20210222152913-aa3ee6e6a81c/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-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 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= @@ -900,16 +593,6 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa 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.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -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.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -922,29 +605,22 @@ 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 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= 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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 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/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 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/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.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -956,8 +632,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C 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.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= 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= @@ -965,40 +639,30 @@ 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= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -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/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 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/api v0.26.7 h1:Lf4iEBEJb5OFNmawtBfSZV/UNi9riSJ0t1qdhyZqI40= +k8s.io/api v0.26.7/go.mod h1:Vk9bMadzA49UHPmHB//lX7VRCQSXGoVwfLd3Sc1SSXI= +k8s.io/apiextensions-apiserver v0.26.7 h1:L7ImW831auK1ZQBtNJPaG5qyrFxeISEBlgfZJfnaIPk= +k8s.io/apiextensions-apiserver v0.26.7/go.mod h1:3DbZBfS3kO7/Jaj7qqzcBtPcKP0/KcklyAnk8zc+fs4= +k8s.io/apimachinery v0.26.7 h1:590jSBwaSHCAFCqltaEogY/zybFlhGsnLteLpuF2wig= +k8s.io/apimachinery v0.26.7/go.mod h1:qYzLkrQ9lhrZRh0jNKo2cfvf/R1/kQONnSiyB7NUJU0= +k8s.io/client-go v0.26.7 h1:hyU9aKHlwVOykgyxzGYkrDSLCc4+mimZVyUJjPyUn1E= +k8s.io/client-go v0.26.7/go.mod h1:okYjy0jtq6sdeztALDvCh24tg4opOQS1XNvsJlERDAo= +k8s.io/component-base v0.26.7 h1:uqsOyZh0Zqoaup8tmHa491D/CvgFdGUs+X2H/inNUKM= +k8s.io/component-base v0.26.7/go.mod h1:CZe1HTmX/DQdeBrb9XYOXzs96jXth8ZbFvhLMsoJLUg= +k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M= +k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE= +k8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 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.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -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 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= +sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/resources/kvrocks.go b/pkg/resources/kvrocks.go index 49ac2b2..fa7904c 100644 --- a/pkg/resources/kvrocks.go +++ b/pkg/resources/kvrocks.go @@ -7,7 +7,7 @@ import ( "time" "github.com/go-logr/logr" - uuid "github.com/satori/go.uuid" + uuid "github.com/google/uuid" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/rand" @@ -92,7 +92,7 @@ var key = []byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', func SetClusterNodeId() string { rand.Seed(time.Now().Unix()) - uid := uuid.NewV4().String() + uid := uuid.New().String() for i := 1; i <= 4; i++ { v1 := key[rand.Intn(len(key))] v2 := key[rand.Intn(len(key))] From e244d3817b09a5111ca3cc081673ed6061fc2c56 Mon Sep 17 00:00:00 2001 From: xujin <1319039722@qq.com> Date: Tue, 10 Oct 2023 15:56:23 +0800 Subject: [PATCH 3/6] fix: update design docs --- docs/design.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/design.md b/docs/design.md index c19f357..6a3cc8c 100644 --- a/docs/design.md +++ b/docs/design.md @@ -2,7 +2,7 @@ ## Sentinel -![avatar](/docs/images/sentinel.png) +avatar 1. Use deployment to deploy sentinel Pod 2. For scaling, just modify the spec.replicas field @@ -27,7 +27,8 @@ ## Standard -![avatar](/docs/images/standard.png) + + 1. Use statefulSet to deploy kvrocks pod 2. Sentinel is used to monitor kvrocks master-slave mode, and perform failover and discovery From d40075ff4dd7b9a15e86df5c3ef74ed041963e44 Mon Sep 17 00:00:00 2001 From: xujin <1319039722@qq.com> Date: Tue, 10 Oct 2023 16:56:49 +0800 Subject: [PATCH 4/6] docs: update design --- docs/design.md | 73 +++++++++++++++++++++++++++++++++------ docs/images/cluster.png | Bin 0 -> 186335 bytes docs/images/sentinel.png | Bin 26893 -> 22685 bytes docs/images/standard.png | Bin 59567 -> 55692 bytes 4 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 docs/images/cluster.png diff --git a/docs/design.md b/docs/design.md index 6a3cc8c..e72bbc0 100644 --- a/docs/design.md +++ b/docs/design.md @@ -9,27 +9,29 @@ ### Expansion -1. Add the spec.replicas field, but the number of replicas must be an odd number after the increase +1. Add the `spec.replicas` field, but the number of replicas must be an odd number after the increase 2. The new sentinel copy will automatically add the master information that the current sentinel has monitored 3. Modify the number of quorum to (number of copies/2)+1 ### Shrink -1. Reduce the spec.replicas field, but the number of replicas after shrinking must be an odd number and must be greater than or equal to 3 +1. Reduce the spec.replicas field, but the number of replicas after shrinking must be an odd number and must be greater + than or equal to 3 2. Modify the number of quorum to (number of copies/2)+1 ### Fault Detection Recovery 1. When an event of sentinel type is received, the following steps will be performed - - Determine whether the pods of the deployment are all in the Running state, if not, wait - - The operator starts a coroutine subscription +odown message for each sentinel for cluster mode failure detection and recovery - - Detect all pods with the label sentinel=xxx (xxx is the name of the current sentinel cluster), and add monitoring if the master ip changes or is not monitored. + - Determine whether the pods of the deployment are all in the Running state, if not, wait + - The operator starts a coroutine subscription +odown message for each sentinel for cluster mode failure detection + and recovery + - Detect all pods with the label sentinel=xxx (xxx is the name of the current sentinel cluster), and add monitoring + if the master ip changes or is not monitored. ## Standard - 1. Use statefulSet to deploy kvrocks pod 2. Sentinel is used to monitor kvrocks master-slave mode, and perform failover and discovery @@ -38,12 +40,61 @@ 1. Clear sentinel's monitoring of the master before deleting the kvrocks instance 2. Delete the kvrocks instance - ### Fault Detection Recovery 1. When an event of standard type is received, the following steps will be executed - - Detect whether the pods of the statefulSet are all in the Running state, if not waiting - - newly created kvrocks instance, slaveof myself on startup to make it a slave - - newly created kvrocks instance slaveof current master - - sentinel Check whether the monitoring information is correct, delete the old monitoring information incorrectly, and create a new one + - Detect whether the pods of the statefulSet are all in the Running state, if not waiting + - newly created kvrocks instance, slaveof myself on startup to make it a slave + - newly created kvrocks instance slaveof current master + - sentinel Check whether the monitoring information is correct, delete the old monitoring information incorrectly, + and create a new one + +## Cluster + + + +### Apache Kvrocks Controller + +[Apache Kvrocks Controller](https://github.com/apache/kvrocks-controller) is a cluster management tool for Apache +Kvrocks. + +1. Deploy the ETCD pod using a statefulSet. ETCD stores the cluster information. +2. Deploy the Apache Kvrocks Controller pod using a deployment. + +### Apache Kvrocks Cluster + +1. Deploy the Apache Kvrocks Cluster pod using a statefulSet. Each statefulSet represents a shard of the cluster. +2. Sentinel monitors the kvrocks master-slave mode, facilitating failover and discovery. + +### Expansion + +#### Expand Shard +1. Add the `spec.master` field. However, the resulting number of replicas must be odd. +2. The new shard will be added automatically, but the slots won't be rebalanced. + +#### Expand Nodes +1. Add the `spec.replicas` field. However, the resulting number of replicas must be odd. +2. The new node will join based on the shard, and the slots will be synchronized. + +### Shrink +#### Shrink Shard +1. **Important:** Before shrinking the shard, manually migrate the slots to other shards. +2. Reduce the `spec.master` field. The resulting number of replicas must be an odd number and at least 3. +3. The shard with the highest ID (or number) without slots will be deleted. + + +#### Shrink Nodes +1. Reduce the `spec.replicas` field. The resulting number of replicas must be an odd number and at least 1. +2. Nodes with a `slave` role will be deleted. + +### Migration +1. Use kubectl edit kvrocks xxxx to modify the kvrocks cluster. +2. Add the content below to the master node of the shard you wish to migrate, and then save it. +```yaml +migrate: + - shard: 1 # the destination shard + slots: + - "1-2" # the slots to migrate + - "300" +``` diff --git a/docs/images/cluster.png b/docs/images/cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..a0266d5742b73cbe7b5c69ca874ca56d7b6bb056 GIT binary patch literal 186335 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%0A*aVfY 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
j3~FG1PN;&N@;gLnX%a|1_LSe`6Vhe!GGey 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 XKCW+^gEeN13Vi8m8zHe;_E-N8&NYB3 literal 0 HcmV?d00001 diff --git a/docs/images/sentinel.png b/docs/images/sentinel.png index 1b88c4d5bdd2181929da1a9292633f9c135bdc19..a017cc939558a05c8342d8b2dd85d946a245c374 100644 GIT binary patch literal 22685 zcmeIabySq!_b3dAG9U_wh)RQiQo_(6-Q5f!;J^%>Lk|q0geV~`QWhadDqRwi0@B?e z9U=oV)O+~)`F?-Db>H{>^WMAex~|3IJacmIefHUPp8Z52BZhv=1;AOu$PCDtdO9sm!7+`o{yEHn}+ot3V8UsBLDP3AieCY03c9Seg!~l zgdN-l1$P3|*!@FJl)SL56WUNy#92W_%bO4Cqah3sKkv?Of7bSkKMD(gY>%<71<#i+0db;5SAIvO;B5(Z*Kth9+`)>h4}Dx>jhE zv4F3&2xw4|mvu#fEtM4z(QpKXqmiAA1D~>-7g7moYpbOqB(LLWEy8Eu;;0A{f$7;P z+QRg_9X)+CVNe+8Zl|l@=?eArc2e?%>d5fPAssDUjCBl^bnKMe;U+ddP^5*}D*r|V;hHdJ$hD)Jj6oO$hFu1Y93Z*4_KT>)WBV>w5616#DbzJr^x z4_wL725GEequ~Mbauv~sxoe_46>Q|>!QLzKde~bl>1ilA%PY$}*vKL@JfN-~LMTB2 zK0RNUwy zSHKUl8XmT2C1X(oJs}gQyt;~=k*1@zyN@2Pt-Xi4vy2j4$=JjfU@63B1^&xw+IrZ4 zLEsTBDhF40Mq7Fb0>+h97e!hL!c7GAwQO`$gzXiKp!!g6eOFPqt$;kAsI|VGf|sX) zhO>i{myfWTh#-Pr-d5imem+px6>cZYXRYL6V}Nisao4kzGjY;#w&JrB_JFGE8Y|iB zTFI+>`RW>r%B%C)%PS&9ZDiGaZJb1f4EcrJZH)xr!blBXSr1EHTW1FmRe5hdU9e}? zM!K$+vR1rmmfA>p7!vA+kT-%V^NXCbiZRq$$4f}mM?e*zA;N2I2b0r*+8DU18R`nk zBi#jj^{mwFOoVM+gw=czo?h1OYG@T>Azyc-inTr3%1uoh4Aa*1@o;cf6Y#JH6MEW< z2>RMsc`FNxc%Wpw?7W=S`1Cz^Wd%$Wy?v}TjAitE5CTd@zEHR}pNxXGrjWa(tSvZ@ z!ZM<=w)Ud>0`j6>-j2r3$|lyX%If^WC}9+@wTd=4kYJ^MpUHn6Q1JU7dC0GjAAG?D z504Q~MP5eV$9yxLIDu6mvB3pfe}8D|d(fj#og7auKX2!F8_mMu{O;Y8*~jydL9c_N zA@3f)=HhpbeEYOBcj0m8F~tjm8~8FZ*Ntf!!!Duor$_S6s*DlX{JaBP-M98{mA8J@ zx&I*bT8gSXsBv33F-IsOU=|h@nLELFgko&pu_c^h^+}hR@bFU!aXjdFjkX;U0zvlg zp~WA4FS#|K2q0aZu>(wmB8Cin$jhwOl$=072Q4r}b!oj}Y zGwGE<#e3<*II={%Cg|X|YcM-P@}#UcS#U^#CLY{a%u?)W8fe+Ym;OCQ%*geLznOr* z5W>h+fFO{PWeqAO75vm!<=Q!eH$X|5+*Y8d- z7gz5@gXyVVcmyC)jS_w&W!!~9f~h+Xf!-A1#V_V;~erH`+}uWu=Dnv z3zV|2iP$~FWV3GutVMs_9cVMWKCNW+WJc5@oA&cpk;C!K?C7DL%vxmLXi@;nEs&$n&?Y=zuySk{^6RJ@G%y zVBP)HX4vUXmVPh1?osXD$4!lvq-Wh47|j{KJb%}bj?!${;$`pqvD=cB{?bNyH;v2c zwa{3pFn`6U7w=t899Jk053M*CLrkd+#5(h?C$Vpi-Jjettu&l=pK>qtpHjTbvC%u7 zV`_fZ^b@-8%f?YXa-ho0(-yUMjTKC_*y@|V_^!cBq+OCKiKljgxU01#m!ToRGAqr0 z;;l@;iXe4usp)j>l>Fh)Wa4g71=mM`Ok*)QBkMO`%gEconNLZ-bt9HC_fzo$%(fkB zgD3tP#XHWh%qsVihbN19ciwGJ_{OD`AAFYIJDHtZLXB_VsQC7oyL>ptMV$JtESF70CR18GF!0)>Pk*}ihWWucW_s`s zCm8JM9A}V(cZK4Kylswbj!wJg%^}vaqZJa-k|u+$ypW}_Bh6&*Z4s3%v~v_KcD*r% z+W!Y~VDV)-y9x}Je2fD8z8O82AJl30oS0>4BD^O-qPmTga!z5#nVoAOE#LKl_l)zH zFV5Duy1e3pkNQI0QI%k`p-q80)Bh+pUq?6Xx*w@)Wz-EOc7_8!UiIcmnpiHn)q0oe zQofKQno0*Yx0j-hk^J@El==!}kV|&?3wLWrD3M2(^@36-w^mV-xB1Z|W1!^cb%bx* zRZ3*fq7Kv=0V~xlcg0>h{0jJD$1Yh=wm-u_?s0?VmC~x zcIxS?maED-8p^IERX_VZ1nYkBq~iAdIt*qvUJ2HDui{`P8wU4mdY;qSCA{up>Y}s0 z89+5RbGp6@@0DJ|T8O(U?vk!uJm5|&I<{Mt_K#vVS2!&Z<{Djek2u?XtFjxBte%*- zezX`!Z_cwkGcjXGQ7cZBG(N*uqn@N^0X5ib`y!}S7-!{d#Cz9f)xCmJF)G)es(RqD zl989{vvtN7F+hzl2!CW|(-wyNP6tfw4sWuz=TeyMewp_~t!>}90{QsHPCYbudRHGm zr+4qlN$%b1jbh`7SvBF!_ag`jvDIf&PYZdfHr_1lu8QMa>V%((V|uhR*G=o{wOS)z z$Uj>96>_^xDctdzZ?9(jV*LFSj)B%_`AVCa3Q|P9^Tz^KBD$7Kgvg z)#q8>8cF|1pWVy9b~e&>X|N5sj$V4~m)se6h8)8y+`FZ}c~F^3-C1`Tr%(_eSv!F^ z{B5pB`R44MlHr|Rt{;cj8^xa&JNgsO|3t1Y)s0}K2>O0k&3mSHbXiBy2?_1Cz{0LH zm6GOtCJv4QydHT8g1Dp24*yW`(LjGKdd82sFp<*5c+jhDOUt4rW#iMBkuT~H2Y;-r zgYk&Dhnjz$bBAEPD{v#W=*;)s%Qg9xTGW1JOU{TBKNCf)R>A0t$xB+^#W|1N7oYM} z{Ynw+_`z&uH|QXBw7ZHL^g3Za{E=hWRTDVS(3v7RQ_=lirz7mnl<$dD%%0RjPQD}i zwx~jOaCS0o>;^Ghryy{l^-a#T8=Esq^=#cm&a`nKwf2KrLeeuAiN>cQYMA~uh?j0ZS# zPMu309#%A_)+U5+xn@?pJ^bB4WgDyr=^}vlUnhJ;E^P$mVtf%RZ5EOxx$M;+8M6eZsT#ug^ujVw9imG^e zR_&ASzmt8j*|4QPV3yRkIgPl(Jz#YU8yJ}4ton+}0Vprgz?E1RsbZZC`x^A~Gp7ly z>&VxS-NNs^Bcc=b_;SN4p04{@-WU&-fnHMW>ZoPfq)=c~?a8agURC=UbiT>O0!d5P z0lj=m_-Wz=oAwPLKX${Dy4b@VLvZ^{{7ZtSF)sId#OUG*Ys)e}HkGEo)DRA4ourd@ z&mk=}4=?_v8oAE&A_|-an)`)eL4z_zYggwBmoF~OBo!nVutlpI9(rImE(r73R^7A7 zt)xNci`N-QT5Ysvi?^B51-?_d6CHTELQ56M@xAcyh~sd~iu2OpZVw$>XG+n_j7jGD z#bD$vLxTm>v88SG6Iesr&Hs$+nv$H$V`&JVa<7LQ@W9#4Y z#*EA0gbr>@WrvG6H}8hOQF=QQc#GBqonIU z2YQ#fDZ=J%lbLA2E>RcVs-NrT2 z=nk4++|Dr<)5wn5oFRWdvj1^4QHtAy6DGm;kg?+VyQ$4ZO`;smZD)E`o1e6Bh_05OUMRy>DN1}ncSW$oo3`7`46w}j zs{On7|M=MjtZ^i|AHL)FW;xRUO}>VgVLWq%pfS`}tOM zJD1Qm99%G^ZX)VFLT$w6#vR3CosfByiR^d`q@gb+$!clG_yd7 zo6QisD@WI=IEN++{QS;EXfF#Krg-_eY&rtZ8%Z2%_2^mB zF(fb;KE1hL)qV1HSz$`MX%&CQRP!clvQ+H@UqwCGo)EUWO*15Vf8cJyZSQ=WF{(nM z%uKiCYllDIamKL(?meZUitcts=7@J-A+%<5lU}>CW^+;)M+H>=S)80TTg(*!NuJlT ztCJ@+@mI8Q-)6tV%+|2fbl=lA@U%ja)y!gEh+iXjgh<3B+T8VArtQ9^(EofVJ{S1Y z=Zpspn>G%~iY791G7JpE^@(_04Q%ugbvaw@mq_Xs_p;`G5G?Hpl+;j3c8)Y;(AdbH z#DnFTb5n|#b;!!6;ObxK6}DFb2CIirT1BHTXde`cSEr_%y)>Ws@V#$6aA(cqAt*GVj)aGv+U$YBR^$hVW#yq$%s|t-W7SArYGixz;;cO z@Yk9tH#v?pGQY-3nQanS@YI^NcQg$N;w=j)WbqDgKZ&n?@*y5HGqV5T5vnEJzv3Q^ zyOFvOUi+1;+ZjD!tdJYff1%YBDFyWRb+;&jid^CC6-8RizRpbTI|j_JsQQ52HyNJX zp-2{*6PKyk_e5{=$xrsWve}Ak24e~%3%3)4EAX?#cVf<*&aCg9kYW_eZt+iv7P#z* zx^}s#@VqK3ILprOlJfQVTKtRm`D{9g8iw%ol#+$@`~3Wz3ZEk1&X^1R6S0fixfk{)uI*MDRiAm z*gHENJ~f;3>%Glc{m#tFv^E=7h(Q_b3eitR6lNN7CgFtZ=+2^^Sa%i<5Y6n;`H&q( z@-^8&Q0r)c3nJu1(7*2?^39ZI8RXt;K{#?7sc*j%Zvn zMxbAqZI$IRdI$Gii=sAW!s!`p!_ng6rh2y|$1BgQ{rXS`$~PzL>|xskE}v`GuB3L+ zPg%XHSF3#=_id1?rip)U-V%af1Dg^_`ec;Y=tfe>a;xs~Du3RmwisHG(vG-5;tsn2kO<$Qst^7IGDKcp-7|>Wo_5nky}*eVj{Tpx)C^amM@m zh2-khvt>hU`2+YD)!P5jfA|}B`M)QO^n#>ICDkQk>gHt-@8b+!>U|KuH{;!xT8ooe zCjW0SGF`Z_36TIP{(lAi5`cv0Z=v)GAfTT7Z5v?4)lDg~`ks=Kp;zjR;8*?pqW}VS z`dSQVV8RPdI%ngn5NSMuD}>e6)p2J-BO^rA=fBC@l|e*-;%2fO9swK}IbrD*Z=c{1 zc7n(uSMvP=P%Fq1RQ%Dn$(5RboL2!4ZpT3DR&FX$}uOF-n0^ z0bWM3cm(*@q>V1U)R%pXN62x$E~y}$3?6|eBY2cc+MysIFIEL02=f2Fh!61rp~St% z>6!pPX>imosN8`AguVjT;YM?;AtPR}2nbj%d=u9JNN|G=w{DXI2>!9;SP2=)8Nsqa zDy(+^EKnd;I<*HV018ClQ4B%M0K&KVfNX~RPb|oTf~Y}w^#17Tbpmoo2te$G{IyG< zFDaOTkJj!YKsO%L_S8}e0u&zu#NM2v_!qIiJNB0q|DLh`Il`l!n9I0SUh-(Hx09GX zjnVzbH@h`Waroiyg_y2TYV(($`JKiEW|;b<2pRG4^?)eL?hocC50V}u)F;pI{gHy& z>r?8wWs}CI{;2#~635-4t$wxp8XKSKB+um}BkxNf#wdUolUI<2aeJ1P=H#$P_~m|~ z<=~>Zm}M^Ixu)M2XjKNygUc0zS;N5sbdTquKWj54p+C>oHWS=WSfDk#Kzk$odkX0a{=A&WA}a622-h zDVJ-qM~cfH(*Y5Ce($tTA$?5#G(mdUK+TYoh3;<16?_PS8CYi_&z}QD@B)G`E<=<- z-+!aL4CM0-AfJs9cIT=~>-E6-knWsoL_o5$0B9Aj1=9e@&Ong<(WKO5m0fs`1RpX8 zqLQTnqRm!7DM%A+8gd&KaFGjX0Kgi7cD$5nNf3fZI8HG-n8%u*xViGv`&^0A07Y}_ z3LwHBp-BOl>(fEeULK$$o9=vf9Euz2(`IX8f;PxJukwzM4a7*a>Cj{cV|j-h>+tFx3H6Ln$gx zaqIEr23lOUA|9}VUD9-YDf0ynKO`&o&aCWrfU8VS@@yy2`&>^roMd0$ z27~QI2GnXn%g-Mf?e2g}eh`M=A|wUs{Zs{*NYFuu;g;%;~IJDEA_plA_Tc}k4?H4&?tja`Tz@TOWKT2TU%T5AzKY+ zr~N}iOROItUH+pD*aDXhWU?9C*0^Ho|l)9Fko6%+JG@3_u$Wx2; zhnLg6GirB2@6(2u!K#1sq;t-kYk0AIVta1bdw}9**x}X>QVO|$jw?FBwCHm_dzXFUm|CEvI7lo41kA*NQ zU{iuS{=ry6R zYeT3L>_}Hp05-q;ByihrCf+6BSL$x>*>Ue~Fq!|O(Snou`ufG~nX}V_rAYps7tL42 z)o-6nIezMnYgp%Sc5x}HU1YtlGT!GiQfS86aJ+PX=^1C?3-(NZ-STO)gYU$|G~3w@ z*%@zSa4T+5Ppe}o*@CBH67`(R0qfsO+mL zmhI;XHqA711jPGfzsM7&mtP~fP#=EO05S>nP3aa4y;B$_rudy0(NmLs!IygW(gnrS39R0P9_?zK$NM{z}c-> z0*5lR7960&g&3&-X``$r-6Px2160yfxz$IeQXCt=9H>}q02gjloQCbx^*f;m>`qw` zrojJqGXwofVB_P95v~LK`mgh5zYo<(v$rO_VW8ajhE%WzAML$^#%x0yjf0jkN);bkTYVb zH}Le6|2$=;@~LS`-fwz7OZid)G&sU+0Uvk`Qq#T0?X-{OQdZ9bfLXM}pLwXxEEHaN z*PZjhA_togL|+Ryxf1T^kD~a7T&e6kF@eWc%(U3{+f)JQK>E-6{Mw zSE0j+(7N=G`8FKpSh17$mP#((>v?ac%{8Ss+V_NtNQPU7`mCFvRKXmQsS-yi(@i6% z4SQMlJGN@JC6(XTEzoV>B#*%nnXMkT3fIR%6tE7NnEhLe+tYsA=@4Nv3U#S!v`-T; z`Jp|d!erGZ~h!1$UR>X~TM}Q5|FL&vGTj38w=U0reOKknn z%fuzny0uU|2{GZU@enj{(aV22G_fKVnnm)xDDY%`x0&ITm!h_sV|*iCQg3WDnMA{k zZ_u>4dOn53(rjtaw4+*e%qO+>=kUpQegQoTtd|!@rJmH@m=;wq+V6qH)-pH{@p@Vk zg1+jEbwiSaE@r;^XP-5&a-oj58w$Uz75Gz?MrGy~)r%QN(4l+SoBB`Fo`jRSlo1PrWy38DlB93C9IB zLwJhh!iS2VSYK^ShR2GM%M*th4ldKLQiE(}I*LXaB0CFTTS6XFl0zba@l+ggP4f`Y zvinvJfkr0Lxnxd%K>4z;)iW;9x~X*N&6EO3m%eKqZm3Ap5P!gI!0y57rZuKs$3@4& zd&=`dMZrMjv+GG8q|$j)CH#b%N-4Fkj1>E_pBt3YiohO<{8C8^ia9Gr%>E9LaD89+ zB&ze0BsoWYQfuNV5=aE67>72#V3|Xa9E{;x)>Z1w4(H=RppR`RuQiqOYd*Xfd~VeFcEG8*@k5qo2iH|I=xN>;T^xKD=8^1P z&51ib+SU?^Te-UQrlzJWaZj{8oF1(lEs3-3o9M%-gpTK%WAhN7BAwr=NJZ5&rEWfR zuFaZWEp(-7>5jh9Zy-4}R7ex(!5>90GpN2nbq`#fi5uJv*sx-Vuc%$(ZuSZV5_779 zBX7$R_U3(W5i^%~YTQ3>p)3OAzo}iVu?0%{NU!LvHrceZKdf>~%=y8APEp^)7}~bd zxk=|uLOq`%Y|&%nH*504xJh%vHwpBy18Wc4Tiv+~9EG0MzU?V-q#adD=Ajcg({b5c z$6w$OFs-|n`?Onpyn)07<1a16aM-T2C|KmH(Vz3oo~p6>aUN0qy3t_8&I%hd4E`Z} zaQ#yDcPSA3=2!Qx2jF0Af=(Tj7=_@Xfv3miqWx1HxXCw?WGPz-no&1+9=?3qTC-K{ zFxxGTz8+1#8eeblV+I&bL=tK#BweuDd8&w@{+MT)m~trQS0uf_X(z0{bVqob^omej zdeK=%eUsaYphBUM{R9W2r&4u>-v`dD)l_ef93NacJ!bRm^gM%9fd9OvIXq=N%Z0U{ zO4odK)T`Yc|3Bfcf0-&LU-rr#*KCxkp^i*kjD@EQ>7VJt*j?%me=I(7$G|EJPgg1A ztFPtAX8-hzwx75=xcA)ybFj~Fx)Uxhzv|bH_43a5Mv_TrDoqR|>X``+!8o$FIcBV4 zB;pQi^0(z+j5H@&F=u@fM+H5JTqZ`@^SWOvGMZEBIUjzV$?)4ssrAxPsNJg7lJX7B zs<&GK4sIf6Q7x1LCnwB@3+fQcAxUO1sr0vdo;&E&B(KaiBI7YU)j2eBqhT0n6&L8k-@Inmuh2aAv^l>as| z|Lrhxy#g+!?c3&wU-!5S)Yo+6aN~*+db*ip>HIc5#Z#+GdauKwKz?<-R!t=z1>x8Z z+n|3AIO^e+o{>;JiLTj*jY_ZB`p0advgQB(CH4)uu#l`So*MP?F>4yp{ZT6g3q4Vf z3cthaD{ubee;Jh^NTnHtf#h`dxGDQZ9N0_;*Jq_?35`lfA2f!*9)Omg>UIH-%W6AthG9 z2FP!oC1!O}3bynY;$VbFJ878dd5cF&%!7QvvB z#ILZCAuu*??%}dIh*(cdD>mp4?D%W%GJKoY?ZMa~*FyLE;C9dE ze$KW!sc0ko#zp)!mS+N#2u%Q-rYl7X6BmoB*KH0;xeyih#b`i1x_9$U5KvOENm#X? z+uX91X%S2zT-W4`0Uo98{mu|jl9w7elR~;shp!ydBN`DVuALD4wPs~z*XBE*M3|_H zh87DXM%$;sEptKSb1)tctJ7OM=P3xr+KY@-Q3EgLQ}Tc}TUgpG@AJoaSPF$##83b_ z3w!0$Z{$f7tm0P^Bbb`rQ=;0ykZ2t@cnByV@fm!G5TxQGriVQ(TLWHUA|B(iTg-*GE}B8OM+oWH zg7|As`ud(piwObzEEp~)myl9t#73|Vw4{Us@WO8kl>ipB?C{tZ87K(`i6@2oH`GbX zw3zS{l!I`0DR?wSGQbWTT~E3JPNTr*eHv@a;!KtYdrCpLowkgOO~8#C%k9bG5H*X% zD|=lnj~Iz7A0+{*2?>f=2Z552SkVjwo;B2|ocZ|lWl|*9Q~~uIe(cnovpH45`WR7D zX@)OnivwGjEN{Q^Yp`3=lxjwy04|con+O(27vsRVv9>xXc-uWs1kl9oM|!R}3pkps z_geGGllZJp4qv9+WY&~?Q^6{Y`K-`#kpe))tQnB{og#@M<_cTb(|D~FCos~9!cC?H z%>Oh#rufcb0R$v#3Ne0vg@ZAt!*+tbrc&sJy9Txxw(_!62V?o>$R!@RWig*Lwrnzww z@bkG>{01y6>vn1AW)n2m!}@Yq1QU4iHTpT=dRTpg5Dn->Q}nV>(Wo_Hlc@yCC!gjo z>!KEfvwi;bGBXff@@dCHZ&fvn zf)AL5??pNuXVO^8MXN??8{Q9hUR(p*$10uG@d%WS?@M>2!F>ixfz}gsQfvoRhM^X~ zJwsGt7;uwL=0k(cdrhVG^I)kDOJF@?Jjxv0>!aWEE;5O8Am` z#CJ=;8ZF?mYzv(1K4R8FJCL+>Yo}6M#;2Vr{0;>@X0NZA(3&5fLei;rzfPc}W-g3I zp8cjIIV1{D+e9%UM;WkdtiXc(W%wR?pxQRl6jAT_{;S}2m4 z32au}%Hw8vqZ_1ymhN(ao?i1T`HAV;^RNDh^4Oc5fRPdugeJWxfX(T}SZdfHCQK!k zpGZMUDyt4Qhm;WV8SFW)Sn0X9#cDXP{^@uPQC6C*(z-bb$Thjb8wt3aLMHAqDFxh^ zQN2q8c{tQzpS7euZ~BLx{nmFuM{TIF2JQJJQtC=pyhZv)!&k~wnm&xu7@r``t1q^mn?j^n@27Z9_#Hq!+f5@ZsEimV=lRn*-$j#`I-cSAFc(V$dR_fT+-`wGOwwE>z_{} zu3bIX8-1b*82MxrL67todkg{sAINn8|p^fCyGbCn4%_IMNSG)VYS3n<&%@SKC$4`kc-zTh_#ejEwEEEbY= zS;Fxh+aru6aBUwlWWX1gH9jfY1`e*Rs6|4-@7`DH)x zQ(K1uNWld8Tc+jZZ?q6!tIeyt=S&V;L9VifR)MqcX27SmPCxHgcaD1KIS1OJ6Lid& zG0deXOy+}9MEdc0vh86r=d1Dmp07O6;2_>LvfuecVtvt%tnfvqx}s;s%v;Pax$mdl-2LG8gMM=ta2%GE+M=2Nb(}xOFMcQ;_M6YBlTqU3%FZ zCePZpzg<{+$FIo)3pHUNauU^)tY6k2L!tvQE8eqBLo|!j?l3lNiGO+k&Crn*P<|`S zK>1NUn&@cxKHA-1R)^Y`kl3vYPa<2x^sn%UE+7Y%xFp#h$-CG&ont z7e|Fix=b_7xwmWgtKbD&qVAFYJ{29Pmf;0THzDs;wCH}=#U~`|O)#&n)QZ%*CP7+U zruUPNJ*$p?$1YuXs|AB<`TV>-X7kIfgX6~x>|^pkK*f2cu^X13DrxNtY}QpDFIo%2b&M>9TE&- zU)D>i$lq@&4U!pvQJj$3UC9rM z)lU}=)Wp7(*L8gibkk+nub1lIemyN2dwI*0!{TsY*5HWKydtI6aoFf^ecp3-&7!+P zc!l2wQ6~uvfo|vm;aErD2(n12>~l6HxT}y}half9zQL4hLgN-I_^v>bqZCqqAn}_u zPd0&pOQP@%mz*Zu3H1g%_Q;NQ>=>#Y2)G3j+bf|Js zR5t{P|0KJa&GKmeqa4P6`FqN49!SZi>>BBM({S_j>!=9BV4dN=AwON98d%B&>FjR> z>rlro)X%2(osW-qc8pO$!@Z?g)JD|hIGeb2-1){l{IfCLEL>RQ_^ylwsuuw%YYnTd zv~_h;TkgLvw|4m+9n3^K)YiRJFv_z%?x0BR*qX9h{F6T{!5+hHmg#Yl?ZkeE%=~OC zMG$pbCs8_;(073*VeJ$-);^4DAz!D?!Qw{sF+#)EQx2gxTVcwYGl`b%7(@NrF7Y!z zH*Slrjr3Mu*c*L(Zbd%<#s)0NDJg;pWCn+y^w!%%_%9cAEj>R^k>3=!H-^QurazB2 z8%g&sL^uB^Z6ntKpxHBkl<=@xw;n=c@P!1;lPSxpU6&^=>sbLIpGlq+Zy-FVyfsL% zeah<_n4GQ}@3cGlLVF$5TjtC&7}p)Py7~5`nK+2dLtZ#{78yOQgm3Kv7JzaYK zX$u>hZRp*cQGTGG0<~@_Ue0uXKT{KNE`pj*50r3p@mGJ?7&^bWylpDBp?`h*iA4B? z;dK@z#d3&8w&ekF=9g!1_ zedAW=9v*>Oo7RhO)AJDCV0X3Fo0yYu z@QbIU6vOQ0AFCs_8_^g^uGJ%5IAIQSavEIjeI?Mqbpr;*C4$ zGrC;Or>{lZ#{iepV)AH1La~Yh7x`dIr2|nubQ2&3T=_ z*EF3S^iiR9ow{eJGUjEBZt!ZO1RANA6>SaISg5LS^$VF&<+7TUo&#m^ESuKqegX95ktoWK2pHQK3%QsoIW%56K(zM zZ6gJ6z?(?_MVE=UAz9V^l@!uv74@ZVPDSnQJh5)?s^6>4jB&?JT8pe7s4eavI$TnC zL83;Lu_;-tS2r+pBLpe_YUw!reox~=%t&~l;aWjG$p78CJ6G$Q!=hew|E;9skkVTB zJwJ^^vP~gTUmlZ&qPkj>y)-|xeI3ig1@KNW&lKuP%FVD}Q+~rQ5lGb8 zm=zKSzDtvrZ=ud(F~Lc;|1q9Hs#KOIu<~%icbr(Q&a=Y9sc5po)d?lNS(Lfrc)-zA zIw@v5B!-3OOHS`J5uo>rDX#0mjAgy?gN)aim7M< zka_h_%~w!!qbq*+pP%5BjL+aTr@rirFCZK2Uy0B`(j}ng>+XBOKR>}xa_~kf^799F z*Z_7C8eXS;sBe9E6{15hcgm2k)&hUS_KC@PGOuhykL6kD9K`!4N|OPU|@gsQ84mx4X}4|vBO~Gll$i#BQLk3ySEP`pFATk zuY!x6jgObR8@z?jUEOV+?49gv|M`xWo0pG+TbP5FPmi02kxxcI2>#;{<`fX*Gx_Iw zD+fEbe{Uqf$qhGPHgs~cb@%s%w;Foz9}hQt%qI));0r3h#;pRx+(wDGeu}KHzyB#rfX$y<>mChJPmyZKRYjPCm4ah zQ^(~{rcNLgM_;SVYCgGtk77Psv};&qPQ@PR`LkP+7;=$qO#BGq$sl@vxTh(6!}L6!En7 z5AtyJ6A%itkum1+7WUOp*7NprR^`_A<_`3~r|Ih9?8)O6Xu@|d(2Gak%EQ``*Zq#J zv4?n-Jr^}u5hr~OUJ(;34;NccCmV+#YjtZ!C0Tn|Z?c+!xy*nnl{@%_ow1)7xjFW?ogQ}}9w~~kRtNuKf1* z6daZOwE4WW_0;_h{oRz@yp>cP1)WS(wS-iSMNCYDtQGy`-PAl49P9%GHS8UPdF_m~ z{Dfidw3X%f_-**$9zL+l6b)?!jC}2c+yjLLjJ%Wr6rEf(4As50{q!_tHEgtPT!j=3 zwS@Ey)fJui+aeP0wfVgR1w{n>O}u=9Y>j!X_-(lZVc*H>y9jED2&t&~8`%fy3F{hq z@_DHTIs_W{7z=R2>Xp^k5>hr1Hd0fTv9c4gbG20tgb(dx1+0CY?fh(&x&5{IU==G` zyZZXc%b5hKXxiN4R;Zeva@3x1)iFoq`v-D?#v2=I_RX9mxk~K=D6&>F>sZzyGykdvJy)V~>SAV(j9A7dOnrUn=D`T#_EMUqs7&CH#6f*z(Ehrygy~y8Cg+k$ z#m0+Y#IR|!)PIa>N|lD0WNTig3iyF}P>pp}{0nZszM(mZ31NhEFWiU)D=#=4x1ivg zZIZg}{`&Mti7_7;k2N+Q{aFn8ke71y_8r-^iPEKULrVp-U))b$WN;yH`a(MKoi7s! zuVg>?rnY1eys>02H&f^C-Yu#YiGiKmUSeEr`=dQ_r<*>Z{$*d&Rx3F-Jnk|2aUHqN z;kYYm-P%f&jHoM<DSlW z5f$$#sZ02jr47T+eUPRl0k`Yr8xp5akVF-%S9VdIi9U89+>UFXs!p7^7A852f#5;} zi3nY`<-rRf_tzmiJxuGmFLUaxSh0Pw`UED;bl=A;_rJs4s4vG2+_`uWQWxQPPyy1(qWS#OgI@T3_0C35NFg zo{!lJI^5U=b9ZIqb4chSDoO|gVg|S{-PDfaDO2SlP>h#oo^iskHHNIt%E6t)30OHV zz~`55j|rR5LJROB9i~pM{rH?bH)SOP5AeeHKk5N@k3R1%JmKm!Fm+|@qVSF*pq4aC zwFp`jrQbd~-s+3M#9A!Of1LPxTU6i@7#;VRxYeGIj3sPAy+Z0~iv}JQ*Tg|!#CQiAZx|r9u zVOx8~`Ia=EoUZ0)Egmgrr8R9fs=f~16gfKlnPAsRVwmhU+t@=DyiO|-yk9cAgKnS?uA5AE|Ygre6$lOuE~gyyd_yA(S>U zd4%n^7!$EXuFKM)6a9%uiDF*<2YM6A#a{8H`}N@xwGYBRD|G+4sau1Bfss{okj+kc z_^ImtTzI&#Yt6Xr?#l2;qwm^1tHM)XU%b7Lrj2H)LDT3pFVNL?#$ zv+$d;idFk*Ja{*Ct&T!Um=s}vOT%8Oc(JMfT1AM>J!PZTqhIM7-_$Zi^`AWI zz*eMBGxvK*KrYxnV5Zo?U!3j0$R2*QL@IK;UOnq_*OfYDzUAOMTNkB&hIjDxj}ICl zMFnwJNalsU2jrM}e7K--GI?WOyP5o>*tJyAycykKMc?_3=pA@aH;JLydvXN?yVjaRo&IBwjU^xIfoJV zIy+i!QmREMUC^FiH?fl69nODDlNrc<{Y@@jrYvo7LKu@q2J=^!YIS>=Ar&KybisiE zURKQ|{eWgznO;94FZH&apSm~fO_!m-fc=bpQRY?b4}hlX&#&5z;m|H0>EFY&m=brNTczG>TA>`Lfhi~-Wp*~?7HIoMTV_s2D@rsBw#kJj9 zkL=0#?A7+f60~(f!8#6J43$5haV~Fo$(uPl_HrU#aHc?mC~qqic^v2e%`-M#V%(;W zqt1uU;b7K3jWNw^@YwK~`@3gq4=BLz2hre~edjxD;Um^{9ofB2r-jIg~Da zRr@=Eszw^G#f?!1TU^wkyU&Ba6X0V=Sci%z=cOl8He%S3?G^(tc(xw zKD~5!y=rfrA~)~(@v@L|TiEH1o_OK2+~Ln&r+M>Sp|Uj2;5tek@mXx*8nyC_-$-RG z($hnVg`tG?JN4z*{Cwx14sI8E6mvY}58!hc^x^YiW%ePde%$I6mCLCz9LcS$Of4vnKA%%7rGEDD8%2wO%T~Pkg^+P-@bU zwaT7eJ4_~+={lw~;)|;qN-K2QezIW9A z=#xn~nX-N>y>W->Y1WF2zwd_FzQv2}rawnmhCS}C#)!+eXZzhypE2I7#}}vL;mxVKSRD{I)=aV z-|CPK?XHgIE6$15y4B>!?!vD1<$F7muw!64W?{Z+9w3fd$*G#O2qqzM$lV_GR+)8E z9x8oOcNW~xQANu`&Vd+hC8vL-YNxds2y5BQQkWWX1HG0NFQlsx!~TBkhH9iUbST>W zGA$bVt*AN#Rd3)x{)D5qkYn?n6!Ixmiqz3!l5ZIWSMBLQ_}L$7A!pQp&|JN-D2czR zdrM78RWGZ6%W&7Ms9a&fW3V}42b^{rKaaQC{P~JR4R&$N=Q_uxKgZmlR0t&*G(s9k zp_XAUvp4Q(GhqAXX^;vOYO#mBH~;#%;Jm?mxmV)g8~s{IwMM)y-J6*&VL6vcWNiZT zY1wo99jL=ke%~q==3i7bkg79lGv>KVf%EPThSkg4=BWKdv`?HTNCktS-z@4~xS%)} zJW3{Uy48qnYE|(*%iMo<{84j9{6x-6nNX$*k713m+SX}yl6cl$AGTZO7;h7v=5&o~ zA3N^5jO!b6G@3tm3(t|&+IW29SwZ&LbVnnV*knr7^X*ZkH5ASncrHJ_AkmKne2;3b z)|k)Djco+%ejzgmJ=dE?zK*ZC;3XHvzbo7@*5Smy#UEwIZ(6*SW8X59C9s!Bi+l?rnb6InOoZ?UT zq;A)VJuXY!9zVG4o2qfaYTo)4?6cRVrplj5Qbqq1m0S`2fgzOMG;NuZa@lO$iwZCHE82HN!dC*N#M*yN{GY zONy;!6&%dBEbg_FUlSb`L51Z=ZcZrhMjulOGIYNWosY|HZL1&E5aXcZCs%28{HzmQ zy-8b`r7=eGNA$_emwhSL3VoWj;B-{I1@#e<{;VVZJNXX1bz!rLF-e(?McC2O&V;FZ zL+71g)}7BgoQ6iJjgu@LRc{CumkGDiFgix&rWTA@4(XDQ)(9N+S(3YDB~JQ!Y-XW%%iM>5Yj_Db%zQNn!ZOPik|+=RZ)}AFn=X zwK1+23Eq8b_a4zSC6?NlEpPZ>jlC4_edi5Rm*?)$N?8_Tr+mJOwPQoqV9HUiBJui3 zEdo9~YK@7qdn4_v+|8P1eXJyy>fg}8TP5fHX39@b98Yt#L#~dn8yAd=1|s^UAI_q& zQBlFDu}Eg=`bIb#aFyiaGH3mO_lYN5;YUxt&L~Iw&KGT`7?|`(ASb&SU-gYBd z!_&gA2$JKSr(x-)q^m1U$*ga8@x>cwwRcS-@CJ*^TTLd+ywx3?=kt(_+$s*DUu&Ev zfB4C1n`V}dPY*Jt8oeEKk6t77_rXlvTsEE*YE1eu`^8U=HN#i1ZrgO8wf%`Ja?nq% z)ogVe3-KEQoS&XK`t8^|oa_QVC}!P*(6IxGy~_84wRId7^aXZRC9_2}`oo4oV51rZ>L^(hb8e zGn+(~hshslA5)GuzF75d_f^f;)sz_Td|TGKH+Qymel~`Ln0LH!4%IQNR{cYMb6!A5;`DWNweGoA>(*a0qs}BXeNSw~skAb7 zqrQf8XT_SH!~wNwy<6&WDp=FXHvOfpV{f=>u(qiEn_ZguH#{Hn?3^tFq;^)tSl4e+ z)q>&`eCi{`Iac2N2&gwFK>X9mh@h7C25!6+2F78Wv@jZE0Eh=GB$CKg!p7 zYUl6N5Z31xbCHl+8B$zs<`=f<7(%zd{;sq(-+fxNX-wuiZQEJl2ZjNXS+eKw{TMj+)G<0d_6p_WP42s$4#-IrhKi4d2pm;Q`X`o! zM398vG7*iDMnXP6M#Lxm1K@;6CXCHA%?NVcqkczBOg2c+*`Bvwu>>y>8qXe>6fmEY-3x~I;G5i-)Tgx1 zL@|*PRwBL4ANPm<3>x*ZSm|BnvQH1eG8j%rqo>8R!kUZIr3K=fQY zgv8knf;zuU1ATqQuOcln7>K7B9f|T0(l4<^eUS|1ZD);;sVX%3ZJ5|QYs6w;vnt$0 zjuloxme{9A?#jSt-(QeS7Ke{n4kOocg=;WZCfj|kl{aYDkxbxTGKF_Pj}w7R7T{QT z*lzXn7gs0CvmnA!a%(%?zpj|AiX)9-b?1t7wi@DN?A5d+4bh(2Y{jP(#{YR(cKG?( zCTRy-d9%*N%eVAc_->LSEMO{vC@nHnAGCwpc^7=JS+$s`+KUFo*2;34jZS=yBcpHHs7;Tf6cbdu$`43f z6+;E=zP_IcQk*Tp2dQG4_4Ivj$nX&|09{=qam!GD-2Sb>dlnHfUG4D4h=ZkI7b`Lu zN4~uLz1!>zN3-*Em7NOxFb6hGLO9HZ?E27=fzm&tGEzYZ!QSDULDd-=Sy?z_n= z07T+3;}DoQ?6P;yPL6gUdTqKOigL@Pf{fePxAZ;%f>1dDyoE&VE(J~`1gitH?YA{D zj5dA;t(7vtFjbb+&fJUCYFEe6d)>aA70x-DubFo6J-B@4g=_8fX9@Kc=-<-iPY4`r zm>x3eXP!Ld2ynJ<#P_FcHb3uYou4qJ%aC0_5E@0bUsGkD53BrYlOVB};XN2h2t!W` zOE{*2jFkd`(!WabVlL#5y0Av@LgA)%QS7E~_j4`;TUq^E;$)OB`xPANY+l%oDf5E` zgb@+ih~c^)N2%|JF|2N2)7*Up1K|_EeFZ_-4R3j!7ve5q;vD{KKH%|={P3h4q7h7N z8bWS(+y0@;7f1T8HthT=1OjF{1WelDx+5+oP5{`%RVyt|T)5Z2t`r*+XE73PdsVwb z5l6b66*DS#y!$RGAizZMv&VNGwBS=>xR)m45jorp-Oe75cccI@s=)=^Kc7y*r*N&R z4%UAk_TORr?*jSnKKri)`5)Velh}@i;KEPWEbV~T8Ywex5+&njV0RdJ#R&Mc$0<8_ zW*M(fP7nkjIw48uxeTV28NrG(By}DlvR?6VvH8!Ssr=m=#Hp;zHM0Pc|C(`A{>>n=^j@Oh=WL7V?P0-iAioDn{>=fIbEjBO8?<*d|DhDdc#Ox3oyJ=+^n&p|HR;bJEjbtnQ3NE95<3R%QCAx^S%Lv?Du z!Nph1^_MYmk`*wljBjvi#9&~D&}j{pFjl8XDo|O{U_`!$K9AC=wt?ddMC1;d@R~YF zCf~%t#JNcuQNe!=rysh3hC_{7k>zw0R@8fmZ@a@j~CHPKVEbLF21nHu_(S&SaO%Zv{psP!&G=lx?Ffh$9?&ev+Tq4gOIbj`$l%_3l*eaV*?FV*wSW@@ zW_Iy5J~-I&cQ?N^jBDbDouB$IA7!2GGLcD!)UVh7e2V$JT^~meV&E#Tb+TzJgv0B= zJOWD5vA~fUXG4FiwUOK>?5&3jQ~|O0gxyS$b79BodFtuE!sgROeT%#o;`j!isd6?j zWL>cmfT4p?%(-h-#DU0Bj88l}Jr>IulstAJUTG1O*iX*Uip}6eG8i=8~cjH zt`_hGaq9qg@cOMAWy9)VA-aF~%HTg*fdA06+n^&k;MY}5 z^Qjz7veuIwRWc#BjP=H~vNPdWCPHrLvlH{p7l~I9jTk>lst2#lS}2pQdBE+DXtJLK z`W(M`!qsZzGf#O5RFw@$6}?fv*NFd!z*_ts zytUWGBOVz6#Hy;?hxX(U!l}CtE-wPapMs8WHw=3)A((p*5q7!QdwCE|9`*rUm~=I# z@)|;f9u|;sJ9pjAUp_dl0OSYFJVqGkof(1Rz$ayr%XWbwuX;XA;{zF~>=4Gu5Fcb? zL&G2U#eoF;MXNI9_!v@Y-TC&L|NYVbr-6`W7Rm!>U>LNAWJKqTN#~E*%9v*xeUl{i zr{q9|!NOMhUPs}l&vK@}%GURmrTh4t&wyFXe_Olgv~3x7q=1%U7>A$k*^R0T4J55r zx?Ii;v-$9b2>Tl3S!x(`=1~eX$>h3n9aY>&Ru#p#o3u^qRZrwYss{0*?8Fz+%)B0D z_)Zw_bl`J!r<%Hvl_ycu;N^ySU%#fd2MNJQb;N=O3R|{;N1;RK5iGbCH^t&@qk4}w z;Df}xfKcvU8P3Ud{aWh<{8t}roAfY32foXS)nUb@wXe*8)ZKJAKN<>O911_H&hY$9 zHqzkja0I}?Y{@3t1c5#$1w4E2uo5*#EHL$S1Y?tE%MY3idbH(PA*dR>wFTql1@N$H zli$WY?k6YIXww4&>je~Kz32PPr=vhN0r8T+?>y08!?s`apw=)rL_)UE((-4l9IeFFWfW3rTO>gomi=p z4;*-?U+L}{G~->Xr6x5+o4nWVH4-XaNZKDR)MYw?v0JQ}wD3L!S%S(H(Ut6b^M-0h ztss5jz1xlvh%C&PC#7(bYCA&}tNqKkPlunMW(JtrrRaYN(tSD zByq?!Jhl=VG$;Bb<+F?{S_Y+{Z~{u2wNFjuO3Zs}&L`V_l91M(-n4qdgLw1pMK4k6 zt+znl%?um86N$4l%Pc4vrNx1#0{c=9jzk7}b9)!e7s^8T(BnMu1TSq()A?y|bpEHQ{@Ms$1rHKJEYESo? zaRWEI`o|2jVJj(y7M@>;3bS=88<0iC6OJc)la^xh1=Wv5)9dDA$R`L>K{V1r9EJ)I z5!HL{5z+qOgZUmB?yS=TBcw{2 z`uxRkSM7s~my4>c-p|Glwyw6m43f9bH)?Ve)OV2D^L&41ZfaD7p-)s0zFT?3(?y}X zd^jwY5^Xb(Au=jqKdH1S`n9k+KB)h-#Mc3CWdFT+o1G4&gPMacaW4AWl(?JS&$7Z$ zJ)YVc!+uhhA-|)ElUTWPls0NEpZ|Dpb+H}ms*kMsh88XPQ8{0=s9ZC^kK>McY{xa~ z8=;a!sfA{@SFR&Ifb!}hc@RYc1TMy}D$Ia-nnjS3JZ<#I-KOmApn7|75&wcFgWqmT zcc$Nr({s$_f%N51X_A9aYh{Z#*w?PP`Wl~s#HG<6PyfedN>RO6g04s^t2LXQw$lxF z0sGrIU8k(yc2Af|>4Mix4t2_akNd4hy%+igs0?eO>b+C7P$4hi@|lt08;Zkmyd71K z$hn9%7KbIbj=0I6w4r?hvjmsOf zKnAA<$)Cw5r0?<613CI~e5KNN(J&D>sr>8qtm02_oulk#vE>TqbarCBX`Wq#)p$#9 zb=3Lq?lf*DZV4_xu+8KtIgG#czkpBeot8-PTq|AJ^Q}wufZ)r1qX~-vDvAAx4||^V zlCLBWe>|AI=Seb%dLe!p^aU38c3(7Ix4*pcvnOsToFzu5Eq9S%S(@fDgg5*JBl(kP z|CU0}o}<9s_^QD}TU9Pt_J(S*veAuTA>Jz2J&-FdQhs#&RqfH%V|{wvElKYztApI1kvB^9o5#%!Q_cBcOsM=C(7wRD-4&5Y zEjP8xV7HM& z*&CZSg-;&fDOl(n8{Np;0>i&%&omdjC2_!PrjYk|#o7{2#rpTtr{(trQK*4uv~n4D zCwcVs0C@hoIjf(kFz%Y5Av}-GBu>u8zV}3$bum;5Jlx#Rhv9x`5BK?EU)(kDaC+-W z;l9xdLWdJw13(pR&{aF5RVrWKnH?0ywKnI_-BEDb)h8o)5xu3O*s&9Vb;Tn+Xzh(< z)v$utaGC?a=c|%wH#_MIxwgjkxq>pvK?D)&Y13>w{=W2MpOUsK#h`MzE06Kk9g z-mRfJEy;BgrVf3}1KVOo!IDvjc7Ta8-Xeq>A0YySLuhw*WFG=xr(y{MM#Uo zQV;m%NWu+d%<84KR#3}_ zAsRKT`_NQ&WAZ?5kFsl~cyu(s9mffHq0wxWEW$%-xcxN7|J(5hP5~rv~EKH-Cs=+Otbs<=$jOvs;i|5h09;vcszB z287>$nT@#>c=A*ozH#y4kCN_0ckn9a#Q1Or2#nH?cR`#4PnIv_W)CsEUp_AC2ar%TZuBC#(z)}8~Elr zIpt+qElT3+4yv3Iz^w?E&(x>(cuRLXeMk5f|Iiv*AGH+_d z5hwC7P;YEh2!ibl2+#ju{Iu8svWyW-G3_%F7&o?&IAXx;?FycEZB1bVEy5{vvi%?g zj93-K+g+QnF@V?9Vz-{5oQ)w`L(3SGj{Yn=hzaM&&=A5hkw(O)_Yh6lr@Q_YkTPY3 z==gmPTwWB-V}dMPAE7C+m%Lup$5{m;zdjIA>QFuzq$T{HNB$K^LgcqJqRN$m)>-&T z@dNr&#pnUTho)DQ+;=0)yaxoPuM9d8;zYqPK9l}w?}hEwuyjKNMBYo_A5$SqV1s!NY($ImN7l=*YiQdSRqtSz=YSAamRpK@SEmig5B6n|~Y=;m43txEiw%iZMww~!~h$w(Sjo!Wa zcT7qB!s8wvH7*#U1#HlKlA~b;i1kU|)&!5-VPcfLNC{}qIm`(IF;H02u;CXUF};2! z8H(!Op8rUc#v?L9fN;8|r7Z%&doqcj_h<-!*X>(9e{7CB4mNBUvJgBB8qP@Il{7{D zH`&k64%%k>b07C%T@j{n^MC&U1N+)-4~S-ZKp;4)w#3`VPG8=#|Ei?!dk}7dtUt62 zcqGOnj7UX7Ezd$B&di1}InrHpU_Sz(`+?B0nIM8womT5M=4`$fYIk*WD2|Npn=Hrz z^1MDhBzoA(8|Wp9y#NXP=QoPvIAe4kODTqEsV@OAIPEthA;#5C|7?9>ugjq1bl42$>YE-bzf^O=W-N(S@MPm;H0$7j~2BJ-=Tyg~wg0MmbKoSAoDL~rv zU|m$vO_5zk5N^ZUktFGbivWxez`Ew8SOtm;2XIc_{`#K+0C~a%iDUnL*nfxdfBOZ( zGD9*etV?mfj22)x>2@20zP>(HaIAAY0N*YIEg7{6M!)zyUI2P7-HrnZ&2#CS{8(sB zi&OfioYwcaqv5Y{wWtH1Qq|_GN1&9`Ju8j zQ=0C+?+m_$bCJ&MCW1heGfgc5#Y{%RbWu41g~PpK*BDp9PW<9(zPHsj?c>8|H!zX( z996q(SeVF^rVMJ7?bHmon@3RXr8JRXr^RR(5nEgU0fY|A0)0RG>ca z&#x*7fASUxGX>RXUKPgK+uw5gKt_lY3wukWqP0qB!R zB@t9FwN_eZVQqh#j-5Jag_cazr$8-Tur$UBv@|(%IbtLvJAseD>No%WOBYKjw;Zf^T({P?IJ#D{#c1>0ks-|&zeI|40mONe`bu=Ys zWM@))@dMkAU#xIwM_(Cvz4)x91CNb=Mp_i|Jkl5lE_0-?3$BJ+KVs@3&X!DcFnL4; zshBAf_g;#^=`mU|ZNI{vhu2T(H$_`(Tp6_lDx(GLB_I;FF1n2urSL5RM*7$l=W;cD zdo-=sL|n2I^!Us=rgIuvS!I*Cq- z?Gc!6*}xAqM(zzkkZ8XDgTH_Plam0gb~&Pv4qc?zFft~Co7&Yo@Dy!M#*p-?0c$lG?r$Uc;3IqGzba0kr=psP0zLW`obUqdN^&;`oyu2xPJ@?e( zOA}Lc(xLzJs`P5&8ySYOy#;%zK)=$z#v6~AlXj|nIn}#x~$wvz2+N}Vc^#WJJK`G`}Qdb-ly>$Nq zzAeDC$v{DMgT|Nx#;)nT`<&!c*Y`Z~5%>?@+`ao)1Thxd@a*n0T6leP*VeYT|0Q28 zXv@%oC)Iq7%ta9UUq3C(Y-N)Roll_~st-gjH(Hg|uK~NmN`2}=vx^3C zYaN>%IWZL(ympUG3v#+*sl%9^OKS{J6FjoNU}e}o&A{}QhlQnG!7bno4gb}xe&rAr zQ4iD=ZMckHkN_?suqIO=Y6t04vNUgUUqV)&_D=qZH$bM z3%qQzJf0YvOa!U`+qcQ)3K_5bpvW@Cv{fwSBJc*DF``x?{+nh_u-A`c!GQGv9pNyE z&+g0*Er?fCzC;CfL;MP7nZPTIyU%}?0*a0e?~&c44E>G7!3R~tXyJXk7C7vk8$&@FT3X7QDslPXJUFp>pPkT;WkDvW^Q{1BT&|}4HvfF9U2eTLs{T#@QOhnEOe=Y&q^9;zTgSHMG z>dIROr38p^mq3ME?i6 z2+_=|hf%~2e^iwb23b!hgOm<__^IHhcOf)X=T5ZmcNkX|D2^mCXZ(&ffBLA9lcM6X zL}CqLTJ~#HLC0VQ9-TQ&mYHjBsWfo+zY`Kd!C;{r3#5 z%!E46+v*c0&ZVs8!++34u%c@v#8)m1N$6_}doFys$Ay2v{!K**2XoB_pu_rHa+i;Y z8iU7_(4vt&@F?90UbrD(#Hzq`H0I~3qswWF(BQhO(7QR@2NksEx+UVt6p@rdaI;D_FDzNnxQ1eyy&VcV#%HQQR=;{fir9N;EO1MbHE^J-Lc z5uIYQOzY3NXZ9Q9VQ0E|!=C6?FW`QUfT!U}56wTr>7%$>#SyQN1{rTrh5~=c0g!G?)UkWcA-N-Kt?Hg~QgNaxOfZeEVFLfkR6eLBQO%%pjFbD&f zpy04qcolT3zQjMyWbCig6E4OrfuErJ*_Dt6EMYfTTNWr_O@zR#rz0A_Cm92W-*rY0 zYN8ooLuH<&8lv*nk#@$E-3jS(09d^Rbtfn?%(@vB~xmGxH?t!;>@EF<;*d3cVg9 zj$(^`KHI?-#ToG-9J63Mm?5$Q zbXYIo>bH|_t0#K?{QT&wiAppn5Xu5oq5knCmX;2k6>(1ALFU|MMdmDy;V#G{bLP2& zIoS3232yNhfI15u`}Om5bpt|n|DlVp(0x%kt{eW}1M|^=3a{%7|8mpWMbVH$kAuG0 zgiCw#HhQDKAE5~6&z@_z9er_rxTkITt(hbhWwiB>{;5Z6dCi20*M|$F!ZJOWkuf+0 z?cxXDyq9tkB)#&#gAe#FL6t9gs}~Vw0Uk)kO*&gRk`S5m<}jFrovU$$j!ZnD;?F6% zq8bRwS7g00ypdUxG}&#Duc1uB3yMe^!>K{ylM%WNmRc;f8_ zNfnu`%nJ5qC!|e(B-W+Wj!17BEv85!dd2!lmJp(}u}hC$Gr%gp^J;gA9CHqtGjGf~snl@NLXtX0qDz!|vzw-qk~ld)hhyB8AUkvnV3oHB4gfm{5D(Ux==7nQLwNdJ+N$eYmh(XTo>X z<;9#;c?)-=}^nOJvfaPI*T?F*T-S^!xMI9h}8V$=*NPZ4S#8Mv7dYk-us{ za1j47LXeR8i8Q#8+1toKBO1lfWD*k%jR@!*hJ538s`P6ly&Ity7t}F!?RX?5kTc9o z(-A(Z5pQ+9m0isc(iTY%=(8^12Q<_)S{c$7$Q&M?{+f!omhZ0|BMXkcz-Uid6gMv9Lq*<>%97$GNQ!6_3T8wlRU zawLBu{hn(Yju_BCo$fNC%$<6OQYPXwpHzis$)KM_1<(53S5vV*QJSs>Wzpy}59;b@ zE&-6v?YRI|VWf3XvmFR-t?E{7iDyAVm4~O-eV7SstC19c>>VxY_{i7JR?~Uv54Nfy= zsq+&)eE(ZX7v6KEN3=$?0L6P}G*5k&j_S#!Ju4not10==C?bdEI3=2^dqhLk=e4~x z6?#ASK!|mZ0Bc5;<_6~4k;81O(HEy=a>T@+p~lb#T>hBPbU(b$XxVLYvEymB=jM9Z z&#i4{CB3@c|G6a0;nMe`jBp&)9dZN@u2CDeQ61N9zgJ695ql@qZk8GyaW8pr58;Bo z7k6a%aQI9>wF>j=K}f%C%6B8z3lJzBXj5|wt@k4ph*#X_z!%Kt*!HoHE@iEq}KMA82Vq3 zB}JewhH6&p12lgxkmUVuxBola|F^8p&xe;dBzbx84|`4f$;Sm|<>@3HJ)CSge3 z>+p#Ud|D;h{o&=4Cn3)FD+ok7e@k4!TqC`>w%=)`k$ys0fxf0s^IawX70j$ZSFOmH z=pC^zi7LaaD%_~=EDHTKJ(6wJSX&{3Qc-r%e~v*Ol?Z1;^jsGDrZtub>81*R4euab zL)ZP^fdK6B>*7-hNHo0Q)QG;to}?wT40S2hRHM;nl@4;VItq_=Of&~MIc+gC&ST&I zLVI}#jm4~j$wnV^Gy-Uau~Tk}O5VYku4Yfz@dguGSmgo?C1YK6$lJdLMdeXx`5uq^ zcX7iUC}eAcFl`uWn!mc5pYDNB?)xpS==5ms67*Q8JbF{UR|(=ibU6178c-&=O9fhH zv0gw1xyW7LYwvOG<#JaAJ-vEl7{}33)nRPd8~x^sJV`36tRZltw^G-dDp?sWfgz=AhXz{I9KI8KY=cBD4 zlz`KLV%e=%Atbizh{8o&c>CuxA^FvSLk8w3Mr5zM90qj{?A!6Vd-OYbWlF%Cp4-v`5V&D zCLW-M_0R_m&9dP1tzR3C#ZPnJ;|V_tF-$j+LW|mp<5zG$Wr%n$g1#~peMAi)ZZ|<= zen{7LVwWZnPu&xAW?WaEjB{u}jTRRc5UXxc(Fv1#bll#*)R@Bd zE*6nq%%nU89+@bW?AM#Cq?~iepJ-`Zd7=w&#c0uHHz*Ia=;aDiKsdlA^?vudh~y%5$B1K4inkR^ zE!VfWyzd!$w#b21KmxrHn;_CH@xEQnSw|l^^F}WAR;OuE#h7FcIr_XfHZ;&g{9^dc zRzhK>rsUDP_15FfO++?AmkY1o$Ug0%q*;AP@zv54_@N4#w}!GrV+Jz3(}Cd9zYaLX zD|fq863_*Gf2q;nq_bJjBi*{W+5AUib+)N4eRYz_O_jY;p5=wwKMPGgFSY)FI;T^t zlPX#%PpL!a!Vi$>-G*r`yngl-cE|dSReqn9rd0G{M&AIn)e*LblTREV3Z4bJc|9rz z?<-)H-!7lRg!EQeeat98A3m@`;IL@(-90thrPT6f$=6A(*T|vJk_6NVXURbG2HAYn<{;4>TU!9VSuEV$v3_kWydm|@=b(xOo_JCX*924mR#_g zhn!H~9N-s=ckRC=?UCn$QNcCD*?W_8Q#8_RKwz>PwmO&CdWBpjzLDy@-6{q3&Q&WX zmK;16mZgquK+K!SdL8Enp#J@r{F^~SBwafC%)A!1KqwmM0cKw}F@Kmox6!OJ&vTjBf7Vk}_W`UY z9-=2`k*Wk`aSNLYOG!!QUo%i@H-281|80YA_jAscBL|cemBlt$5rSGWt9(dX_uBFc}4^Ur9>vt&^W2u6aeH0bLJ;zQt{)GLr46mINBIy^h+d@{k z%ur`%kU9LMicLcy4O!T$CA(rzY(Dd@m9Tg=>rmN^P3kkwRfYg`JDV2a6PyfYbI_Gd zZ}LOV_O&G1`B50YBMa(Ay!|L*4UhEPHLB3Yks2dP#tf=Le+P6#Yp4?q1GClmPpwqs;v1!(Ll;uN)I}#G7&r*K#dKa&9lod$VD=v1?v*G;8wT z#oGGW;wIjO*R46Zd{mcbGj`b|8%d{LIhReZgtG5B;{-ie|K1X;-GS5B%a8?@hI&n| zO*vOg7|x_Xbst0BOWJFR;9lz|90o7t?>OoGGff=}rlC+VGqMrm0q2=DM7z{nJ&jg7 zs2h_)jn{!hCHa2O;y)I~_FhVzrX>$4UR!g{SDuxo7oBc8cR~Y|=6r|eZh>D7KPXe( z;Cgs{=5a-d+77s^d+YJKJ*GuhTX>M93cG8xjpi@HSX8ARnYh%p@xDyzFZkC{eEX{QUCYobjEV-+rs{l`;;-Z8&9*3uD; zfjZ9=^Y<(MQ{%Fwjnh+$}|Q51=s zLD`cnW0xdUjMJ!)ZkDFTR+em;dsG-Sw)=ae?&rL?=f!>9`}sfr?fF0R`+c_u3WqTN zH^y=mA18^sTnLZ1Y$j#1@248ucE{{$3xvd`6T5KZaDFTLfO`fjhrrF;z;_UCp~G`d_K)uc#c z#pfF_jIp8Zl5c&Qw6Kbj;{HGTVaZjBgODxgQc+nM6s^%kb3@;hdhek&PgpJX z%MQbDT_Rp{tq(ckTbKDH!kG|=nJX*>bdCaaw>~`tgJnABw*=?LeO==-U z`pnOZ`1vFr(SOc~pI^uSzfJ%$h)6mz3d_f2|%rXf)Py#GLnNqLE-=g*s!A36I3mJBq)TlL4hT&{J)^d z7HC<&kMZ=HI2n<48YRs}z-?vx(- z+?Hp~)Gq>c^8+ANdN7z!@fu^gwvzuti5O6l=5FwMDp~}fW(`C#HcPE84l=OEjJ@+a zMjJ@I+5-% zxShzl>qP6z+O{w)Ur(sfEQQ6*{WR{NpCwY)_~rGE!K(VQZW}Gku(h0*-m8kj>w%mM zykz_?sw;7I@nwTr3?%TV0;pQ|47;6UT1)DEdIh+uE?t$)w|Vi}(9ctI!0)n%2B-_Ug8x=6 zQ%<~}1@h~nTBXFDj?LUAll|pd3ax%-N#{TVo&i4KhrlSzN=~Vp*OTR(ajdQvGk#N<@CivWX~L)&xmy zccD^oc_>S@81&%y8!#Cv2ch%4aenBbDcD-0+uX}gS}w>CUK0Cu1eOS6r+)LUiP%H| z=D1C((9A810cQJi6>zU&7@z>5_0M?fpwk1*`Y!+~RBHd)bwxay@NxigGJL1f|tQEt^UJ+as4X5Hb_kF`#M zE}PPNI_tC5fI39Yy0A39A-S@gZQ8S6;sz{ltk#V0_{xqp25qL zOKmJ>g~_MJ8P3`$p$WP4_l&&U-gF1N**P}3hqXYK@s(RS(>ul+>207-`A8gwATr~< zWMo8#hRZ9B1PUn$zU;k^_@}&a<1B6cERaN_AuyUqM;+UDCzJ&AFoL=BB$MWl9ha6_!`P7V4B5uGu^35 z-tWt4MV?)3;e97V4vL>@EzZs>ZaV03f^clQ89*~Kzza9QReQgQ884MA&=d_0l{Tbv z7`FvkcCHChae^%ygF(t>cpG@f!FNHo3a|T`aZl_D&wd^MEiwb?08y^~K7(WF9NQKA z5LV~Fm5iAx6p{_jV(O1hA9@MQQF=#ovyFo(N?0dWlqrxha#PN;j#d*05?}SFsoN$%PsOZK|b_M3ZnaX z>yE73P3hUM33~Y-Cv*}O0&Y?Aot|MSWdjN`u6J98KhltPUi9NOm*>JQr_#d>AYumH z1R8xofU6L4;QBxxGF>?oP_PpGDZz!Di+dpHpa;+^zm5y#&?$q0_;1H7mAg>b4lYUx z+`|hn>Dpd?slXnF%>QUu5UPKFlHMVq51FWcJJmvjK=uNfC-E-uBm9*_=)AQ{_a|lJ z!p9zPW?A6=MhI~V*gxdwAM>&}0~LX1q;y?~ZK?ttF==4nTPdYj009~Em+!f}9293B zy?(}rio;gm_xge7BgB8`FUG~G^sF)>DQF#AF?24$V{TA+10j%!<%>tdoGO`|`T~!g zaMP%QO>hJsw(pQko9b5n`L>tDC2^Kz!t=Lm5P|Vw5-JxJq!B8^XFwJ6rY_ZxgzVdo z^+K(QgJB7(TWS4THSO%V6c%)0LJBFLtaGwB)g7v;)Vm{q)#Q7zwOnQOB)GFDADlI? z56b=i#xSPx4sPjx=#EZ2USocFdrXkBJw z>1127wbq-Bmstn=>ih5J^&fIcs+x|a9vZm?k8&n=3+}g5>Z0A$`hUD#h?g+v1W8>4 zXcHgfKx9kiU(Ai;TzkTHfq$@A*!aK-0Jp zBr7CnbsqJxpEaixVJ%7aGA)pJcN|PSRMo!4DjC|zbIz?-^={RDRrjl+V6*q`?zL9;3cc2^cc{9mJjn%`3phA9B#H_$ znm9P;vT$(lrilo^9a<|kA@B#+O;cV9r?8850SAXr&s|p6-O+I&v%qzpp!z1fpW#Nu=b^@2+zN53Howc2n<=HbH2oEm@Hw64>Lxh-lCHeWmFCKnQ z2tS|x+52WTR!+Y=0=Gd2Y;Zd#OJ`3vaH*;desM#2jnMWF2JJ{Jo}O(3%fbWt3$XQ z9qq08T;wFVg{-)_c^sS^?Y(&TTpS_R78+U(C|f%|m@J>WhdNT)Q%PS=P*dNM+f2=k zo7de_NKsQ!2H_;6z%6ZwlCr~!#9P&wo7c-84%bt2lTk(32nbnvN=m9oI@zo9!7Ws! zpaOOp`rg_IMO7;;9#2Iu4N{(xIy^Fh_Kxzd-25`0nl?K6sul_`ZZo)=6iiq~K|xK% zgWFLaVlJpH%www{=OL+VuM5-k5VCjFvQZIm)=>iEN~!W{t3##LWt`>h%>}$Pt*qtc zU2T*dpz<=dD5RXH8B9iw-_y$(=3&m~sidu`BPe6XV{QWo)>P$1d#NK(Qd+u}lF|a6 z+?KM!Jo@hX4uW>v(%x`4ULJitOI<5VD;Xh}l(du%8U=Gjx+y4|fwr>JNO=c0l(~|# zt-YEBpS-#@L{Lf1TNtKhqlJcQnhPl@q4Z=>fIKZ86@fW50@_X*@+ww* zGWLpmLJ&&}DPf2vHy<3WCkZu|vJlc1@>CVFQk1vWaCcYNhJzI@WosrUZ6{~}T6;Ko zISRnlxxK+%C>q=_6Y@|IwvvZIU2GiGc37 z1$6~W3v~xxYm}0?l(V{qtC}uKNnb`?TgDD1@8sxZ5Ao2`b`gMT@Vg7D+Mxy1bcA$y z(3&WenI;#u1IVdZ8xan(Xal2dTz-*iqow@C`f!X4bQ&o19gnQ~+dN|wZd0GnD zf}X&Sw3d>jx4e!FzpDpI3+>>F(r|OuQgd!Ri@!>7)pk5wKoEuc(p_Ab`0@@i7j z2xWIEH92cbb1N4MWqot-oL|M(T}jE(-5FtJFXPH*V}k^|bK3*;ML{4aWfglJw1uoZ zkEgu5ttCv|k=qN5?qu$)jncHoPQHqpva=f88^y0+i;xBXqrBAlc(nOkta&sXU>2UL zuKK!2IR$PjdudrW2P+RbYej7(sD-_^hlZ-Brn!Kvr8W;t5!iPrz>b`ogO`nZZz=f?d zQ~)h4D{bM85>`SYuno*~5i+t;e0KJ-ZrFt)Xb!x9lq8R$kUWo&w7Q3?gQ5kJ$4uJ8 z9J?5;cwA%^d7Leva8*TR4|gcUO+eKgh+hsZq~PG;i8bliAK--K{#f!;vkw0M?L~QI zKlhCwaBvuL6lEl}y^NP92oop=_L_frUM#LHzI&JPEjccENxJFK+hHFjjW;FHZ%c-B zDQ*qEE%}thw!L2^7moS-_`(GbNr|hni=4&9wGMmYYkD@ATA#H^ADh{(l6{t#QAd01y$nVYsulCjfQ)H40^7~8cwu(R|2wiEq0Mifs8SMhnDQL zBO>)cQyNBrTB-LoxDRr=UulQnG{$lRA_1imLU{OnF5@HYc>Y9W&?EJX%lOe3i_P0w z{z1Y6yTIY)3%F^3K(Sy=I=uV@9)jQf%7cC*M0{l5lY)L3p7safuxCBPQVz(MqGn8Z zJb9iE2X_b%I^=#;hOq!Aem#rX{M^|KhZKwn`!I(#Zx9NZIpqO4;*O$t28i)7GXDw_b;D~t)BbE<@Ou;c}O0WZJy#3hk< zUjfG9r#nxsz%Bt%QEnnQonE3{Rv_r^=p-^CeL!`&&_P%X7*G|{S#lFg-a}5n6Xv2V z4qhSXsBnSpiG)5NQ~##GnOxtC1BnH^=zl2j1yKF!(}+n5pvQI5F@o}R=H0=|^F|Wq z$XtMMP%840_`P6?`>vGWo=x~MF_^5f3>N$cfI9+?uH)~wBp~5h&Tjdqa{ZtDyT})%G7e{pCNKa@>B-$3;-FW6JIS!J1|dMtkNz=Q_R}>r4_^LK z8%V(T6$ocBDdGW91|?&{zfOHIe}ZuZD)Z3E)-$oTPD9nt{&}5fmB4~z8h3g&ZLP7| zLQkdyRlh)63~zk9e{g$-iQ;o#p$66M04HPp{GPn{7XC5qB%UJQ2B`>NRFKet8vI>l ziQa5KUmI`Pi*^_TJbP?>CoS??uMy`&dR5NOgV3;D8ha z6$Dx&yzDednTjW0R<#V-tf%(v9H_j_<-$|8x6^Ta)NZwyqCY=*@l_CIhM_%f^VO?d zr@ne*{&k(>j#W3ma^_e!3(e^Dq^5^`(ckejavobhADYXLiaD+-R`F&{K>t#uhEj;g zjr}@Yo ze%>V;Fhw7?81r~c(6it#Je@I_GP%p;TlK+{8`Oef`yQnuNsa(7-_{sr?CaDE7i@B?<*SBMXWY(Q z8on0Sq$*_KXkyc@nR0^Mul8x-6MCTx=>ChVnTI@$!h^;}7iXdsVe9Y9#|x!wh6fY{ znG(=FZ|>ryf>nR*#+jnyvypu=P5Mj8hSM&p!M|A7IC-NzvtAla)t)M{9a91R4#C*1 zrsn(?i|@>mt%<*z>Fr$SeB>zQkR^GWn<$==y5+=Aiz%D%9fC$1g7IyiL=KONP6zLy zcxLx1Wn9e)rMWk!>*K?sX83&(ZnL#aU|@u9z?(Vy|OQ6sixWg ztV6adU7M^8yPM;zL?f2^BbBeA@Z+LOU?1;F;cx5q$K0N|5TBs8=lhf^=N(r?2jY6| zz=A#mnlMp~qPsj!OvO$kV)CgUCV^pvt*MFrSdlHj6-<6rK9S3eoT!W|RkC|tw`Ea4 zyWV>!up;b)K?-}>dS25uzH1bAp+jln!>F7$VivjA9J`qD+WTNYX?l07-ReiZQKo#n zl-5*foXUD*9lF{HQ2~8v;(W{rgABkrlKm&-J#;bJNlD2wJO zwJPb}1`B0r-D^GiluBq}Vy|XA!(<|X*2EO|(u?-$WbG&Zi9f%4vQH-rQI#+7&ei`Y z{r=%Sys<3t6MmmV`7l+`GO)ZO-X;8Jmh~lm`c-JrXs)JznNH$WYN{6MFnC+_8V7>J zc7;5}^mV)g0;k`HW-NeDd!kHBoZ_$45PIP;ON!VO%8wr&;8o8pSs}kQy-*IJ`1pF# zCTE9#P=HT)NQxU5wwB%hLnvoL+T$|Apmf(rh7=mb&NpUz?MP_HZZX*V_|QrDi7FK| z^+0ro&T#NXY;Jp;0W4`idCp(;C;+ppH}=lmD#lR6D)ew^BeTG;OY~jM)Q>4cHZ7|1 zhvr9zc1K8Iw;vZaWE(&B*>{L0JBj&w*-$_!xW2utD3^@z%AC2f+SDE6lYcXLduh}D|cR?xJ$*0E}W7QG$BI;};NqV$@Qw9xz0MMtw73|B@1l=oScyu3i3zC3s|-yR)||{{jIqbF3Eugx0jR2yI+{H3!x?^>0|adDVXv`!xwpK=Lglk zGZ&h08sBcNFM0Lx={U#O)^iMDT;c(3YBu4Cm6qRIt?GV3fp$s;So=dRf8uuiBIESK zv5J~78r!e5qh-p;L!TUK5rP{sdYMYwv0p40q6vPA@JNOj6T{YmU7?8-1 zS7`VpT|m4o=rklx5KGy5&V(z*ZB$eN@nOEcbcrVO_D7>E>5;suRn{@nB+g4Bq&+;V z^irN#1WuJq2{jsTF5x8tXU^+p&VClB`H~llCM;4IUi815F~#W^HBd{P2$M6y9Q;_i zs43R})=$VGAg9nR$2rYORxxcnd2x$*|7k~Wnu%ZfH;r?XVN*p>%{KkzcI`K$Yuk4_ zeUg<8*LKZw3=hp<%cfZcKchTO4$NNsv>PG0qf$~(Zl=t3&zVN|Z_HNd}O~zEu%0|9E&xtG0zHkZu2#I45 zsc%#{3-g@n&&BiUe?jAZrHxhA1!%8{t9Ul#P!u9`1d`i>JQ;KmZHr5i5&jiF?4@`} zve2z71!FtU%`i1BZCTdUD`lD1ahl?)rtBP?Q18f`vLu7anRp*)D(hFo*U6pgw0q;y zd8E@lJAsQAX5wP$1dLvT*tWs=PtW7ek3I;!Jf*%-2aY#q;{iQGnQ z={6N$xllfy&uczgyCtqp1zdi#;sb-9+cIt$XnQ&nWY^vynp>0Zby9AHG_K9=xM#&n z43@O{7bRbP7Xh^yqsmgn&lnTtNM9`rS&-S z*m^{dU#C@fXuOF1mm1`f(gx0Lj7{lL$`q)i zi=#rvx4qk!Z23Bj>t!>SMc#Gf9~%RAKfbvT zU0xLC+IH*{QqS^pNq#Cg7bPx!5bq^!H_;o@Jh zx24K)w54*C8cN68kTG=JP+S?!Z+7cqp=6O*64+;C!t9hy&rw&a>ZxEWkA_FT>&1*OM|TRJtgl)DBJBKW1(A9n()(x=E)Q`poFW zvAh!L)UYBZ`8xP4our--qT;02^<4GrOgc%%I0Flw~f<3Bt zg$ph|_f5V!I@1_mhA8V9-kDd!yZQtTQK@sNC>zSSB^C<*_`E)H`fnpW8R#{M-ihNj>DtzFbXec|(DamOX( zamxi^4-8UIeXM^rPNenm!fSia_~6GL@u)jB<%27A(bjDr&~B|;*Twri*pgHrDl>kE z`=SPG1uBCAsG+#;ITx2y)YS}oR4R|$e0Ji&cA>JqjrF}<;xDitxTaNd15XcZX3ALJ zoMwA)@K(<|kYue!K8g0fD6}(wnT-SCHxn^+P+TBp^9b{vd5D>sa_9rw2X$eM;CeN8V2H0B9{lmCD?^*bkQWd{~^vl)0IFMKfjI_mOHg)_V|TEiQ^_1MbSpTC z(|W^?m%Uc}g5UA=4Wj8V;NeWr(Lc^oQ`jWug$oy;*OQWyrJXO5VDF}5(}UBLDhaWvu|l2`$K6O;89FcljO{l5HY@gdd8XyNKd2Yc7BtK)2se!Gc(Q0fb;_ddQN|9@faKV|xdQZ*pEG{zi)|77hQNcY#c zy}A0Il>R*l|6E^xPr~1t@PD&83Ob~Eo0}UQ##y7FDzd_Njn7uSH&~_0{GR>b-Rjkv zC8#I{z18LniMR}`ON$h!Xq~4@{^KI*&hx29Fo+vR+*@S3Cg@}s5}0%+0l_$c^qfG& z-_G9pd1~`^WkGGm_SEQNfAL)X0@E_$C@3rxU>+sx-)`jNj#}KNq@+v_XhzsQ{_5}; z2d@M;oX=T#!s@?`=}+nRdi*N+?Zj_`2}uP4MBQdP1}S@+R&+VG-VnY$hl{_i0Vs>a zv~mA-MG{^3qeV&9HB36nym96t_+^gxGIGc^cV0R7X2f%cYZ(JWsU00y`7hNT&+ccM>L%c{Id8#+?(I- zD~R@@WeuVYVHY9tV3AyckqcOQ@1Ahl-=$-shc}{Hv8~NEFCEC>1ib~FzZtYBr~Ylg z^T`#eK-w*bu#LSZ zCTM8^UlKs7=d^QWunrScXm^Qk6(*JH(=;5==n8VvSW9Xr2R|H^>JRrm7&!+?57CLR}NGum#1vv%3s?xNib z2E5vp%4G0_5br;-!7k&j&F9|Ggz^pKmOgITtPy#EMftl{1%e8qGk?w~0mlCKYCSP_h;x62_)nAo z*x&q*wR{OAF7WBs&gKfA4b-#Al8tVBEdz44QO}kB6Z>F^0!i|Zt~NzPyEj1iBK`c{ zKdd;2-2S^-@K?>r|BbcezhMObCt(D4csy4Py;rN}raJ|vVx8;vK7ZBG(P<;N?!f4? zhN*f+!>?51zR-*7H`5lk-mA>j`bsj`60BXsEyc*2%%t$#ng}YD`i6zS7gM zu$iicqk_X3&&1aJ}LwQI^IM_vm$I zpeeEFu*y^KA!E$g)mUCqqVdviTd(@t^>1$&oM&&M`)#Cs0F)Uovjkbc^mlX~t(e5}D@G0_uHt zCOnay{6pn>*S16y_Knggpj*4!qxM{Cyf~@7KdD1ry(Oxe#zl#HQt#0 z^888o-tLdc_Ast`HuRo@w|BKe%|aG(*es+K80iU`{8Wii|JZrI;+hY;g9grtCqqcp z6IQ3CShYiMkTza#=SqfsaSsBqLEctM^g~{yO2MY_pkvj9&SlX} zbv?(50sZ9o<>AfAfxN;Rr9neCl@k^@8N|&5xr{fq*0%t}=J~P!4M++ASQ9Mh9YG%` zjm4;m>3x27E#?;{vgRpzrDCXUbD>Y=337Gn{&bYI<>q|P>|`@oHwGYV;^e)XlD1@3 zRA$pH5Rko-5pi8mb$@e#X<@N%C0jN1PP`#9)LT7#g!2#D7O255^P8$B3v?bjR84r;AL-@pU*TdMBr8z6Fz6%1-@nl3!GFu%kLJ>r zP>NcvvUg0u6Bc?G0ro6J_Cdh$-dyL$*Zt~i0|PK9N$Y|bnxV*eG>^f^br7cMClp;M z)Npcqz*4;UF}d*F_X`?oM=rP5xN`CP+?k%GF?}@#N-!A_eda1HImqTra~oCRUpI4V zx-u&-yk!sDe@fw}(7nG@l(vq#)%qZV;EqvGpG$UL!v2?x?KF7?zy9U2qs;Q02Md^; zN%j+9>SlHtPB7l@)DPZg;~Gd88V@er?@-*iCIj#+^UR;o4Tbvm82rBUJRxU-st>6)JTaNxBb5ke-rb8!q2AHCyLFKHu?li8smp+BR20fOj@m9q5 zzuY#`7*O`*YB)r0Fyl7Hnl5fniL~8_3J1aJb&kqYV<+(*lwis^UQIIO?zsAI_QJd`qdZswn)lVED>Le#G(BK2XB!|PrKKY&zh)PXzt?{s17vsXO`8L@qp7r z4Qk%iXm6n1Z;QUO$upPW8gxuhDN=8(aUkT{!nx=a%7r%(_mm>;uPcxg z1_f-IiSSmxR_9UbKCr6%Y>4?@WtWPSLZW*NBqml?R_S>uiTHimYRf7E2!jW9<_DY6 zMt;#hfwy!x)`!b)U9t1Kxqdr4CAvpK)pwl}h$gA$l^GNMeGux2;%U;JMY|68-)W#* z(R~Kan1TBW^P~a0(%F_>Z7+=xxoTx7YBYjlJlW z-yJ6~koXn<6*gJ+Kt+9_bq;= zl}P#a41`Ip%W)HhS^_|0y!-YT37id!U*Pk>yh$442H=7>$XH2+(V<1hdSf~93JhLf zgXpB{Dq$FbVbgPc)_x4^SZ-#--5eqU*?~0K1umSq&abMBg^k+hrrf$kS>Yyr71dCk zG^#w(nVyjA3!)k5g`7!~+}DaGYw4tPy*m$C3U%)_ZZ4N~zwp~0X?B-@!QxUpC%x0x z=K6~(fTgM;P$aSOobs!>4_2o2n06x&`GnK<@<^7dky*dMVxCrt%YEm``y07bMimYL zqz<{Jiw~hBul3gi#vCm0%s^lPO@K(!qvu~=UQwomZoO9h(Htqb6SjEn>E<`NeR?g- zxZYAfrO8oZy_7uH!~mrwNrLLZmd*at>qjXrABanr3PB<24UAzo!-U8-VZasi6q0lg z)aqW+98)kT%s5fWR9#);4tJXBK^_1Px4lEoak{f>VFDgbYekAAjb?H)NHUa^4KanG zdAE5(^o@L^Q(5{PzPO)FwirwYez-mE)-4bOZ{J>kf`61==qKbv5wQ(&wkA7^KwFS}wd=RppARpAE& z(Lm%zxyjr@RZVoRB+o=P7+PCnljXxUoog}&95GuH&_%uc@I}vI?G>kV9wAypZ#IYXs+730myv0#!l_g z_E?n|$FQ9Rc8-yl?(O4)wRjL~w>=ayTIh%5<`vW6^O9t#`l0h_c=%u4TjL)1`ffnS zATdr8Lt9l`T>Q};Y3%uiy`pA4@94FeU(*wEWXp|^gb?`(uIwPgv={k1>j=n@Y5qaz zScoZ275$u7@Kpdx&grZ_-Nu`9fs(=z84lwI5ZDrV(yLSfcZu+$?vXg%#$yxAvs%u` zyRINX{JEf6c#;u|DMplWojx80nGg$ce4Ho6z)^fimG3J6xN`j|Sw2uC0HFdl|Gn3r zOshN&F8;en0>5vV6c^_vfW?Qq%=Nf0fxZVl$w|(Z8W!{{w#CwX1zVIDN2mNC(F7I7 z41t5wiF$$s)@)1T1QG!nn8v;NCeT1*w~S=YohBL9LG>U>4bxiEqyifK&G!H0v;7sU zG_Y1A9-arrr;@1ZWfqeu$i($``M-vp28P~uKuN1FVy4)f87xMar&}>D2rSM$uogUv z8yTZc@XntJ3C*tX$gq~*RnTKL`w;_=~2AEp>)~ifO0k2lSjafP)($4NnZJb!y$9V z<%B)+JaOAhy$BKi>jqHsuW2u1skH|$AvvH&8h{L$>K$93!t)6X)l?B4 zNBDiVI}8QbR5l(ppvVR3@z)J7+QWNcSp=N#4~bIlYl_@Tkjt&Ly$d=btH)ub`nH41 zQ49~jP+9*?Ci&;r0o_i9IsD@I2@HEZ zk=6GuJg_UY%)!<D%wQFa*K5^DwZwxIct1yy9fpvo`S(dB-c)dB|$ajwsOqRqK z@(GegzH~bIG7xYD6$5gJlwTgnNrDye$T&URj2I&RAv*H2KXF#iJga_aU|LvBCzUjf)Gx04$zuHA&({mNmfsWaCt^w+_|ytp9WGF zfBR8Db2{+U;fU@YC;YqQE)NzEc?H&rVYYIG=Tl(F{rf|`{S2~zysJLp0)#*-iInc4 z4|+-@A>qaiJ?8lNSHAj_=hZMpef}~R1SyMof@Nvcl~05Wv|;RcJ{}rD^1$v^ZG;?? zX(UdAi$2bme@>!Cr)^>wrv{6%Sxa{to!D+G~hf9%Q?l@_-81i=naCN zIbl|7LUOD%dADJU?gHymm^EVgGDu{u+@pyI6vaD?F3IM4fFSmxkL5cEO$WOD6eE`$ z42%>$Gacp#lpu#}%KyS$!rx`KFp8h9lic*~3LTMr2znx4y`S{b4Y1P{%2a#qft_V- z#N)q3`L`(lcdg1pTSbsgnLi;Qp@}W6f$sYb=Iiz5!MQfX#jpsv4JIstuH_N9pw9i3 z6Jtt~RzIsi-jXQ6a)a4MB>Q^`(Q@&}%RF8`O|dA1-oR14Gcu0-T%MhjnC#r|Lc47fl9QXiI& zU~KHqU46w(B%=ikX{UdC)&mb_g*X58l}+nZxPY<0&Q0RylVmXj9F~mx?M$qLgX* zMq%}A67oGRVas!Q`rBZdO9aW4m;xmRL7pYQ^`_pdv(7Bzdu7 zgKoQGlObjgZhL+pW-TYq(}R8f3?khUpj;NYb;FQf2F^Ol8|lizME@ZhKT$^Z2Mfa` z76u)a1{Y}%;T4ZLt@f}c=hyhh-9gk7FZ0KmJM>5>lTNYdT%*o4(xyboWg0p%$y4(u; zae}i=x@>i<|55>iXzN$3Vu9&nee{jPaWT%Vz@d*&urz+RX`aU%h!#-vS~Q}>5TECcpS z81Qi3T`k^fdSJR(Dt&u44`<^eT=h;nFRsB{2=(lj2RUN%AO&9D%97kN-5P_Tl^!i+ zl8=au6x(mPPo&83q=^s!T_~R*Ax3`vYysSFNrEon&q9+dD@(VUJ`iVhL|(cVqv8t! zl3i7$N8Yzg4-S7y(dk1bY~O@;T$lxwVaA4oiM2XxzocTjuV_J%Ii0;+D_d2iRup_D zLc#-R!gAd(4eprQU4X~$fdDz0EtWZtop(rMFg}zb&RVP6h;S(D6yS0BDzUdc=8P#9 z|50jRSe@1JQq*A5|G;qsy;Q)<+58x+9gwz6ntZ}Rrf{|R2(aAdMe+|D{(gJ!+b6DA z)7&*0tffyuw%tY^Z4LR@1$?$r6W!9rVhXUDGi#LX3pQoHKmKr)^o+1ye}z=iGjDvv z9$OF~8Wt0;`|HsaC`jLXdV})9G^ohL0A9Z+AMkP>U~AF|+!mIg#u)<&A7Vd{4o`6K z7Qk#Qgb(8d$^2$@=)bZWOhCdD{}WV5RUTiaTg*JV7N08SSCfy~9!-zm>`LNi|M#v= zLDE4T_zvQ~X2X&@_MaCZnXnUp?0=2l*W0U^Q&12$(;gpoEc~SVDJ6SGem+!5NlE6U z13Ra{{9-@t@rw*ADT+0(XVM0d(R*h0-CsDb<6~w249MOrwdrw%2^XD=9)3C_*{AAH zp`KUebdD=~wka;o${$By*l4d|_k1$fKVB*J^Y?NkW=>da%PiC%?C(#2bufz6+#AFA zc$P`!1+iy=2)jAAoA2tD5z`->(E_%Nv7wqtGJ z%Ereq6ShY8HO$TntX|Xm@0tnEzY4CyuAj*J>rZHXe>Rp58T(*yDlx9Y0svXJ30C8# zoC7%M2#$A1SmRZud2M`Bu|8_isV2wrC%mZsU;%3^sExf|(*_*=LIOMKge;0i*y`oSUeyXOzzoS+W2!1snOw{4MjwPgfBw3Q*Xap;)?* zm8^7fd}OscUTr*@<~o9Vj-Umo_$>zi-PZu1bLW4Yd6oq0!AOU=>$qccA@Of6GbbQ| z1*d%7_CS$&8o(){K)v{LJ9h?$h}j4HYa$-`4gfKO^%vO_FTs~a7y%;R&coOtJaC1T zD#eRe?&DQc|A#r<^^Vk7et%u$NC4oORFax2o!hIXg!9_j3Y9oM+oV?UR88~IaL972u+r{09BG1zh)Ze>&+o-W#+%lrw5k0^dEIRDnhutj8R5F!2ijF*19*zxWU9_x<3Hm1Od z)x1*QapHNaFZ;Qvx3#hqK$YtLuO^C8P;Wx%k3@4 zz7S^}3u!9*0vl3-jT7#UdS!HwUiWz4IUZn}Y0(h4ejFJN>I;~D@^$!pya1x!#M*Uq?GWPZ(Ju3|OK_3J8L zsD0iJ)1>^Mi`1MBn5JaY#qKApr)Ncek)N7unzRzzAJ2Kj9hNCaEyGTgIEKGbn^fv! zM4`*#(-;2!JGE1ZI3++NDD<;#v4ecQJ@n5;!cGr>JLX|8LMO5?tl@!giYOZslG5MZ zmze>forVV}CTGM29IR9!L6Ngf-@br(%5Nuip}UxKhB*Pfb^=9!6L9HG0z`*^ZLB5f z`43By1_MM)XQ%l`Hyo`vBSAn@MGse04D}{l_|Ir;*63|TMMc5bOHgE8A8I&;?eDCu zeR@<%49KE`mrt)4sp-hY3rhoj+X@`{UoVGRg)Nb%`0pOSZ=T?vmjrta@GWvG$YWBN#!~JXJW&l9Ma=4JY!jkM@zDk-Z z;HYmeN^@U6oMvD&YrAnXC;KH&-oid3>ya(n%1}{S^|BZ65wq`{Fk3oqc6+^<%AI1H zbEB$`!T#LHJ{7^l5J_RPj*(_bLOM%h#f*3%&xKyuez}iswDg5CkeRg0_@xx5D>2C^ zptPa^?AiiEb2u7KU1E6wNmeLfW{_-fQ@&o=bY#Hco4p=jz?{pFGx!&|h+h?Fpj~3L{f%(Szm1J^%`IyH+fgpah4HiBAj>hoJS= z=sd^GbZ9BkE~PA2NYQxkt1mvyHP&3p*R-a-~^!uI_Bw&@ES#${j>wBAWTl6H z_fH`dS(sYzQQx{^X~TdHC@U;o6zy?6IQxV}5&SI5GxkYXHwIgA<4v~YwNpBe|3T-X z-wX7~e4@?Eky+#How#Td&pzisaL z4Fm)OfLdb@J1raelC#$rtxCJJoPu?^J7;t1LU&%5nzuc*gC5`h3h_JJs4QC8Xu$@- zdd_cUBV#%Zu!*-{d;*fa#dD98_*{KwEmQrk=A}%Gf1C>C1qufI{xTc2 z5s>|c3aw0HeA+0rj)LNM685Xj_dk+~w=hNCH#fHb;agYN980OC13gM|>yJ4(Q~8a6 zOQXIIJ4lm#LMk6|ocj77w-fHEec$X2WQz;$wR-Ab<58)fLyCJ3gh8FFo0FQDwf?}h6gt?vR)>pkP4wigwM_sn z=MU2Um{U(9_i;t;x??}h;o;>h{i$-hzUc=SIitWPZ4zI7?uN3e%ixbBkddeZ$RQB& zx-R6olslqFkl#a0l^`g=GB!$}IM{uvD}CxW29XV>L$O!qw=ZBQ=uS>i)*Eb_UJ{i%3*`>q3cr$8gdFw(hEe*&jp`xF*Jbi4vXZ}kG`_VMjxpyaTggp6q#E~|6 z{Bui(!~PXlgt1@L8LPGOpI>|bs3Ls5zhlPQ|E@t!LwNd03D`A}vz(p#0h>N)nsbRM zy0-)z75!oi#j5pJkI;I_R6FyUj6VccI0!G_j&YLZV6E8-@6?>Sm42e9X~?)=wZC-O zC%d&?MVdDaz5?gCr~p3yC+K8L25^e5Q20`ON(@O*E`4hJ$Kz_-Sz%=*In!RkLB?@vuDqqU9*q|E|K|+a}#*d4R`cV;Prh z$K@#b1_lF{qTe@RtxSvfV4dj#)$3&Ve%)fP$wAkVNy$e=btU=f{5-3n=C8$>KKdhM z0EX}vg5O3Fj!ey6F7JAk(wooqvf9;;FVX1O7iw)KqtEd!Lji)$)O5GHkUBu&qpvND z+g77zUCip4*XMZ5%yyCJ&=@)d>jZB#y?V>=wh3@0)*>5|Uj^)0Z(S5pe zGQ0x91#%94_Ri|iPvD5f3{Nc-;%kKeTT>C+*E4_@J zfUhw#3}la%iGfAGZ(}g?2Daz>AdG={!t$I&>ry|U1sw~B;&Mjx_>PRO;+;VSh5-7X3zl(hR`7l3&BGM%g zqdXJOq|dW~qx-^f<{t(8k`JzPU3x1q&4^8URIAWhjo>4O1c2#DZF$TfS09tS^)}V7 zDDi^o=3tNmVv#n0?4)V$4?UYj;a;ghC}|kJT!le`o+o&kd&lw}Zle%1dW6qwG5PxEd^kC9S+T^MWfL*^c3fyIeeu*H0g-B zU$uFS2r8J>p{L4eI_x=G!AD!e7k+tO&nM-MYOcRNiJ+eQG#ELsV)}EYFQl&ZO5(Jv zqBdi7aW_)sNoeA^+%H6*j8(M3fMM7f6!~)o<>9f_WpOZQM?mQ+nh%+=qv1la(?**T zQ-%(ut52QGO_PZ&x043O;pnXWF7q?_#{Q+lnYn9|HkXeuQZGNdHwaYjeqbvow2X0_ z*Jc>>nm(x%$$NbM2}OjZ-#GBRN|tya(k`MQj?tmD-Zv$&Btt*5p(kjXZsROw7? z(#jZXmPU(BsUgHqYswuc5m8SA{EPUnNIBZ*|_a3e?u$mFep7!b*{Je?iqoUsawt>3zCRJ&&Fy32nQwgFoI#jpf=hXId=**tPP- z14rZWGbaI;Q`Q-zJCQPhuabl2KsGM6ecUQc=m=f_v|63-`rfA4x21V1h)0rG_i$`B z@IN`|&cpqvvTMFoOy3Iabozr(Soz_T;vb~Aux#07rMW#SoI?tzXE}Qk>BYn0`I1@P zBY#;(3&Q2H-CAfZtG>W5)w-2Vy1nWzpdp`eR;vHA+LzGl;p#hBqL%gx2P(g*Doywk zKuj^Xr2OLSN_7fx8BZ=x?@2jJPA)4_>uDOijysqwfFJqMp?t~Te*JZN{QM(^Q{DQ6 zw{ggrbpNIIaSc8|i_GsI!(4bzcza?6vaN?%%eclb1jqPO=1I537mF^@FujF$slzu+ zB29e`Y|DccVgUiDpdJRbk-iMd7G5&>(0>it3wV(SzPG2o1YBMqZIlRWcnAJFq^}mO z5p;Ly?_Jn@1pvJ)+uhrOwc8YzXiTy3vUBrBg{RkioQ`#qwuKm9Mr#*hoJH*g_dnVD z6la7`s{i?ga4w}BVKn2*#F8~ z$H)4JS^8^yRi?fKT0`wKQx4z4hkQ(64C`$c|Dz8E;n^BHN0GBVXv=&)cLMeM17tJ9 z2OlYtQ`;yo0rRqyR#&sK4lRzBW(5xQkM^|-iBZU?5h7=nb8WkouT&N=7fTKc$I z@=M+ut0AnEI8XnaF2LbW=O3xZZ|6Ri0bt8ej%VRlrT}l)_h)9DI#D2(!_{QfUxoX; zjBLbH;`kK6K~K+FdiT{YJM2*5YL@I>u*Wzmhr?)A#QD`5;?IZOwNwDzzGuEEY4yVY zoFehyJ{Q>)Qts5$=BI+Vd%;dzi3kIFQ)IUnUgjyTWHy{1Qr_v->bPh%iqt>Ed+L2) zTK}rhdUjo%5`apv9Udw0SKKt)S}Ya2;yI&;v7p)T)y(5i&oMsv)Q7Puo&B>F?l%^* z%c>(aG!4slU2MqHvn;^DEkDPaxAEf5aJ}%>$QCodej?iz`p=-eH z!Qg!Fa4{Xev|X3fNYbA%wB^eP)5hX5zy0R}i4Rp{!z%u9uL$Sv?9oFuu$~G?h~73d zRcLOch=ietNQI$_G`oE3)LJ)D^1UpVnoHB3SZM)G7GF4L#WNnJu3La|pS0IIJ_Dhr z%%2PfF?1Qnq;W%zH)0e+1fMsG4agnl$cy0yeUARcXwQ|9k(fVF)m%kD1zU)|tU7O1 zz10@HC~u^vQWw7og?cc+NW69WYo)OyYP6D>qOfJ!i0=3Rlt>iN2Bt1nOY%+D!<9bf zXFvi=eQ}dyQ=uMhq)b^fV(!>e{vS>tQzDT#%GEs@bi9JFIygA6wGM8T_B!yX=d8Ee zQb|3_G^y0BCMyZ!x?ytM^soq3u98jN3;rd|KHhjZq>FE>{X!-%hQ zqGec9cv;2K+u*qQ%Mk^xG}9^OyrH^{Dy?UUCY>n4V{6srA>hpe2m2%3q>mw1&?}GC z2yc_38%oK`iqZ%#)MR_sks|@ z9?hv40&*x3!F?FJi*yqJ!od+#%p!di@|$Qkp6@ob)&V;48!O~lco!^QA=TF>>s8zE z-M6Q(n*{)MEm1p4aZghOV5iQl0!5%Et}ywa-&7V;?tC?Yd(BSIN@48)9Tsuv>0k9?(Gz z;!5uQ{-6Wr()kJS z5qtFRNiSD+j~$%MOton76laFdu-2D7*wLJModIq;buq_qc4<*Jmw(`|o;%d|<9HoQ zXFkqIP9f>fWIPH_@^syxPAM5Kku3s`F*so#z6?BH7}Rh88eRS2XKt!Ine2ddkZWQH zA$E9ce)$rE|0yD=S9zjQ9;h~kVP*A`RC=?F#ix5V>)~BAMoyASu2KRF_`J32>hO)^ zrO{eE1VWh_lg?sord1mya+CJvVi+Gz9UjUTF;H1x}q3ntF(_+w3IubdNpXRnX`+cxai^z6^%N9^_K z{QM)n^QG8I(1Y3=Lh3_9N!gvzv&w~cOzsD8JHU2PP=LDv$zuQozEm7V+7)}Pn9XeP zl7-*AEj^RIcA)JQC>Xe8w4k1oR)5z0`Lt*$+SX#2R3}(_=_SjouU(Q(y{K)$+SEau z9)L+n%P@s81Nt(F^rjC{&@xnn=F(hP z7nDrEu5YDTup}Sk_7Wv8A9SlatS0s+sc}3@M$}eWst2f~<|!|0IL4Fp*xc zFoDY_KOR;5IEM9QPqwXjFQpf%8b?o~{zMn2GLJyc(dXkHlRm9k6Fc{cxErs!qVdz0 zvTtC1L*4!e<>Q@+5l=B+!QzJE@kWj6w|c?Q@=uC-=S|~VZSL*;F!!u+kbOT(o^brq zj5K8kn@kM6Es$reLJovb)x*i0+g%T!(+WV;nI~jR61opJr{i2VypB=`31+Iot!8SA z&d*PK3H$b`8w6b&RHc{dt?5nTGxz~7J1s{8*8dZr1! zej#~#X);!Ot>d_|;tkjUfGZ`Zqw8-?Pqvs}`lg3~XE}@stXrhVx5Bb zP7d|?JhbX!V#hdX>bzFh21*?jbHj zJ$Eg`_QJ_L#V+~GSeSpI1OUN$mlWPtDPf+(k;CZ)kml0fu@d$lA=hgHf)I66xPbfL zOi!)2$tO-Y&96afstUjX`zn~gEy3`?>nP~^`0cdRPRnk0w|rk%XX&ukX^|w~^wL29 zSj6y;xmlEc`}IvJ5Xo^+A8o%W9${zRWfuxQwL$I%`eu<6NOTf>>DLL7=Zm_l!R)@d zs%3HP^O~bP!Ab}tR;&GgBTrNi1-+}q@3wTD61dZ+IaFqAVWWFICgeU+cG-nqw0Y^) z?scAh_!3`$Q(<$)%XXTe=PdQC!3vo`&Y=y&75lq#mPLwHRqyFAdqDbdqSX>lzae65@QEBM7#KXUI zrP!EVoiC(!;S=P(7E?7`VA5edE`9%m=9#bSa0+U_#o*eQ^ir}lT~4KTw5BY-?awDw zzWkw0Ug1)cu69Wr9Gty1%86a?GpdVMvg_m2)kBYNxMn-$!E+`XkwvnvMk7lt*6+pM zPr#SH^t1&I<%`pG+r(b(-A_y9?of7`Nbe8a~*cn>6Clg`)kIJbyZ@MHo32Rvx!eBh;Z<2rle1ZH7uI=lJ}O`&Zk3E(_Ge6 zwbhfkMOkD8ci3kG&OsX7sd&kdce?rWzC+*medWe7r_p@HgY(slUQqXHxg42okwS)U1q0^Z$3m=0fn!jGso>642$)qil#yLgpBRJ&;;r`23$9)&Y! z)!^{lz)647`MuJ)jpiHT+ZExY$`5*_bM;CmL@HGEbOl9B+vH`)T)7EG6NSA2Dybd@hm)RWGX z(}+(FuHwFo_Ctqys&8a3oj2{c%SM>4e|90aQ(U;jYlF2kSq)9lufH7PD5fGB{QU;Y z_7(QZt?e$~hb+4K=RQG!bKyr+`A8CoiVw@l-|Avje8^~2S5VB(|E~CTPEln`!^~yt zeS}iBbRwY#@)ECWYlrNlmAkF$YU6dIqXTvft*eh~aMJBSnmf|S+J(>40s>M5ROJrw zr;VNNgn-@YMPNX7O_;d7V4=+Lw+QYkM-h1|KS_^1ZmwZ!bRcPfXSIDR_sC6Q3 z$QAPQ-_z#jBEm%Vcd@vp_QE@Fpv1}@I#z6EguZD{_Ypcgxw6h&jk~7^hcFbne2^8; z@jk&@ee=Mm8#&b0=@Xn9+BU-))vnyhMf@TJv5&f=!n!!W34eUaGdbE35A- zKZ4Js@?&{Vs9D+@nTfoNh8JdoqKrm4sym1mA1)aywXT%sbYddm&P?xdcvd)Erxuzz zA-~2wVlsV_yeGkrTG&wWMgB#r%BK6`S)o$1RWkfQ0iFnpT{;s)-T)5D!b~QUwVCCk z?Pj^D`r+70V@l_HPGtJDP9wjvkA9VQ2g6*#?w0A(R*qqN9Hcj88qj}_fbk!Tq^b4m`(+7;gfDsBX?qziLYcCNh83NMiqujL-FqJ8u zV}u=89d4id2qZcd3oZf~{HypQs1YHtAyHwrLIwxoaA&0v;pdOlia|%I?H(WabgMU8 zHJG(gnncwHW9P;*p=)*AjmNIHg!9HDsG2Ge^mHgIHOFT%141PI(eil-60X2?PhE_- ztU`RQu^`^aN1?KEBj20K_oiAe!%cXXhHY#jVTwM>bRSKzI-$O{(V2vFD89x2z+8t@c;qaUsq z#e#-j^Zvh8lqV{tfa9vORg#e_tOjZaXgAB#wv7IMKzR`{??Mb!w z5j0HucHg3ePiw~~S|;N$$-L1n!Dr@omN8jZDEW+4$94Vri_Q%8#yj&5H_cqz(IZsF z$d^6gLb?@5BQ2BPQQE8KW5Za`=Jgvt?M19yIn9l4BI09^YD&tLs7oECwfZCZ2Lu+x z+T)xF<%+Fy;0zS){um4IJvGHqDlTf6Tftr1Xw z5;4B+G^YzJP!7OaiagOV&ws*gOL*5RMySOEwln_sQAZ^3-ho3^B5zAGrZ5$NS6Ht= z3LZZ&cYU?5V=CiJy*d+|W8(cb#S69Gm^O|D4LYqjZ+-Et`hmN%+zzT9+(Hu_m9J)_ zG}8soW$vg(p!q9AsljD(8H&v!J#Dv;OFMCWK_^w9C*(!$-=yDGehBDL*E1j_4j}3O zj7(KpCNZ3*raoMKL6>97tC}#CGt%ejU$eW~7_Z*uIB2CH^=xN~ z8bhu>>J;zhv~>Q*1>6($d3NINTlVPVh_k#(?}h%eE@p7v_DS*m39U#;w)dWbf` z9-^&63u2jG=pl*7-!UNMuY$HZZ4Wd$Y|5XzGTozWpp`K#o~O)kDSO@OT%*_cb~#IQ zvett{v+?uH3^dg#U#)fPJG{QnL${EurdHAR%%)3~LEnw6T>;g*`Mi1TP#@`syy48q8_}h5lz2lznsmpc+*6e>%MH5SsNk1YE;Enb!$6> zqTFb<-aeq34c^=!rmip|Y-;wfUMOKiK_?%aZf$WND5MPQfy#Osx9k$hlA0>@=90P_&kg^?*_qNy%owYJcm!7r}w!S*+ znirxc?I8)Af{2kd0Z>A(b^KNiujWV&gheCQrpG`~vVpbXfms`JX*-Wn4wWy!%w&zw z5W=~`q<$CMJ*Ysh>7e`P_G?9*Z;QF0jbNHr%cQv}({1RU$maO8;PFt3+p%T^qcYt? zdO8pG9p$QLDY}on^>|Ceh}Da-u}VB9qj%ga(EIb|j~nwbWc$0^I}3Ko(arT=^yHdm znDl?Ik|)V%nuJ=24N??5uBR`o+2mDr7MI4~)@n-Tcs=y2ZaEK)TOt!T*PYw)1=7gg z^;kISu62^;%0cGDAryz}+Z19%K20MA6XUw*&F10MF5I=OpoF{q$!m8nF&BMinmDd; zdz^A|w|%|ukO?Pdr_v{B7O&_1N{n7~ifct%c^(hB;+@_)8#PS_-g8EnLnvPDx`*)* zx^U_9l=cznyGV%(N$4<{%%Z58NNPGgnhD{m?BW_nSn!?JQF~Gv36^zA36G}jSjzKx z$+b@`WA~RDKdRt2)7P5xmfjle}>;@_V`O#@3+|@%anxJPl$N2Z0n+ZPjnE9^;)yn zRYdL!4k0Nw{#c1ODw25PU|!cF1OcradOB{FMXlRp7SCPT#AG;Eav4&WJF_er!{b(DG^^oOM#{1}xbpKl{1 zjv&?H0s=E1`4nN1;-~})c;OLM#et-3dL_K#vI!Im%5z&n>P|%lc+A|0OCex$QPG@p z`|N{gHCi0g=z3|7rI$T&-W$Tmd!VQ5w&}^QpVpwdGkcrK(sf9yUT$>N+R&LS|g0C}hM zh_w3yiF=wPR_;EJI$_}?ka+0JC~UY2Od*JvJYyWoSjP3omCJe9qzl#m3jRB5j=B&T58Nka2Eftt*wG#AS6-icV~4Lm(iza@G81H838SkG zMprNtvr86C6X_@9^n04DL+XNA%9b;`MCzP#P?WdWhP?e5MOho{7Tj0xiEaoK^DGj! z{yV?d|KBgg9yj+>Dqz`L7|YPz$^BSzFoej|ev?(F*63CMa8&2}aAi!9HXzyfRF z1HSkPEYi+PJtSkCSDkU`|K~Zdaz6omgAfLr1M}}3T7Q=A5qD$*Te@Uy<(1g4Ichgs zM^7AcKEAS_8w~dM#XkJZ1*_Z*b*mX>^KKm4~E0)US9P}pucG;>26{y45)d6EyD6~N4 zjzMzIT;4WJpbY$3-nSPm*@xd*Y-5axTNH=;6p2CIr;C%T#|w5IsLnJe>VsT55X2OE zq`Pzi?gSyUa;Oc)459%6))D9Jq~gDQUk6bN;D&zysTQsi-R- z(8O?N*E(0ha(n?Cg}vvt8`;{?Tw}oMDfcf{gOR84@sO1BNT`}|0A18aU7N1ImU8tN zS-Bau^HH!#@Z6O{!6fleS?yV}SC_4D1{=YNv=nM^?;=2>I%EJ~v%K17b}AHYd^L^7xe!*G%w{o4Q=nB-czj|=29FJn zO|sd~(N*W)@}{?IF!w2Af5H0Jz}xHB4pj?)Wo0XYV+?l#CO=LTG?%?X1{y;M($S2e z@X`$M4ZsILc>xE|4K@Nv+{y3UeF+YuIP5TLxQTa$j~0jmWu$eJTQdX`N0Eu-nF6d_ zxwU9~IKZM|L^8~Ku+?lqI)12Beij4Tgis3QfczJSmXMUeuAqWPL1fnNVZQbME#eR4 zD8ns*h?joMCL;y+MqbZfM6fsuM?x|Ez?l{RnBXv-1}OZW0f9#Te~5=}dXS&ONKa#h z#$!#NR$W9nBL)`4cNnPj06m-iuE^Z%0ld{?QdSO1YSh+IWPX@bA}L?ofhWc+cLqwy z8SHoce*{PyEPnK_0J*6_e)1p*-GKu#0#A15t|wC9!(33{9|I1H-kirKV-kmX41iBo z=}BOu-=3~bEY)r30sUCi&YR=17Sf{~;4mq`5Ngdwa%CeJ0bFh@F{o^J06lL#{HHUq zc0}=$LHK%*>IRE8_Qq=PC3j^2~h+RhABCjB?h9=^Xdd#;ZQS4>Dlm#Yr$^Kcx!8b{!W6&C0KV7cgMnmHrgd0soV= zp|-7#@iKiu^{E#0tevKf^D$VMWbxz}ksXc#H_UMn1kobO$X-OQ5+c0idxCc$KM_rKf_nM+bmly;8-f@Pc7ma-2Y& z`f&ghhEvqafoHMg|4UeYu^R~!sm`cyp@9xPtMP|~tMakc2IxYxV3JXKQP^s`JypYI zJ;iZ&xELwOWSZ`t3y)WI*I=sFR{tDu%NVr&3|E>+8!ZB0ViS<)6SFJ)rg|4@HuPkD zzPTAIm+rZ$6;S?irHvKL2jC57s}`v#)j60X3Htg(lvqgbiAu>$ zyuv(9NoKa;!M`^GlDTYch7ke_ZoJxY)ggyP zfEZ5S%fmrISf5%VsN$0qIA6ly-mV^TutLJ^(f%G$5T-dBq#8Z_$y%EtLiKD8G)=rl zRAu%aeyqx`Tof65LMGGZf{%R`2!bo>h-`v?=YvcV9t9e&?#gvMoCTViI6D~{gHAz{ zFPFYDJ%jCAfX)EK8k_VQO~4j5CW1znWBz?1t=XuS>n>5 zzt>^G4c0KcQB;-yniX5N;_jzw1Qi6+TdvvcWi?dOA-Fy=|C*0d z4+9|x++Oj<1C0-QtXYY42=K3jiY;h%$_?7GMMAObDhtq(sms2Fi$XR^%XY?}fg`E@ z_-;d?N`YZuW$+n~HAd^Gx=~OEc+h!mg`bCDFFj+QBzqXl}STJ%?+H?C%D8Mvb zvC0!5Jn@*eu1%U9X(?R zw5lN33%T7V%6nFnKTf@O>Q>Vk+6JsE5m>nO5ej&2^sjc@#eAy)xzA+|fZD}U(I2t2 zTwQ>E0hU$HdvI(qD@ArSx{!_{{^&h&GSPRNA(Foyu{u zq{)NQ_OoUAIcUb@{0N1$rb`wzy#KN*gci6iHf*fzDziA2E&++U52pw7Fk))UasQHm z^j(}Rk!5V!ysTk|$MK}<18TrQGAU9H8j`X%e;>HVVD_l8eZ|EQLp4qJe;!4jW*3y4 z8R`vYCK9f1>Y>!PNTgJF99zWhfQGz8WE?7q&WOjNFTIXc*(t={MS)(yp)3B~5@@m> zGxso&8|V!-K-PKY1O#fOVTQ(!UegrJM{-$z7w<(2!QH?DcAur-f2yKDjx2*kx9atK z9p^FCm9&o@tkF&L%JYv4%fg4gdLR!E3f?ln+J3wM(l)F!z87?lJfW0M;9yV{xzB`E z5B4_)AoMFi-R!%2dSbX8S0JZ>K0wC-tO>h1(C#9eBJvURBnD|0BkC;ISn?wDd-D1gat|fp&S6nq>e`&RKh)R-(m8ora=- zwm25`1C8j}Bm1I;(iAS+1Tgei_K0Kg%MkQ<(AJmY+es&L?_7mr(?lv!*Ch$7-3DdE zt(rO-J(mgTX#miaSaAjS{%zV>qEMH%J3Bl3GB^~mpz}u_G{c6Zo=hJVn4Dyt%M z3XpA~!eR(}L*k@q^c))2YXEuO-PaC;5q#m5!;fJAdJ=nue$QQ8*=FaPQy ze_@#OPXe;r?zs(pL~76SDKL0Rm{j?j{Ql@M$_YB>Q~@Sa6toBtTu9 zdIh)t{mtzySn{J#=0l_a!&zt=# z+@FPoTxFeWIVdRF;u6(Atl;K;2~ZhHWY*U^a@|U(|A~$Qlp!DZYD2Np;Mrf%KEXuV zO1`iC5HlZ*kb|XJ4;aD$baOi%7wPSNiUcrEHwDmoB%T(3ZEg!S{J~DL*c5|{GzFz7 zi1S)@!AbHtW!Zl7$10PN!=p@bqN%esfOsHNt03a+=hR>IoVW0PXi5{qkE?c}bBC>ngiQdr#dp!-M~? zy6KOGKfrlw48~XTK!@p%89?9>(mz%9>$xvrlmGXr!-QTcBFD_;XEbyI?lqP#c?eE7jR;9}Kcj>>(6edzJ23GD7 zGT7H0c(_)MUEk;SWe}9VBLL%3OoeHYCP7m+X4Cc@$t@P>+!UWSi@$3m!?XqF!VM?a z3ycr~^ybO-w8S6i!Jp|f3ZziY$bMG1WtM)qN_#a(ldVtUS zPo(Pr%LTxG@gV&B%unbAY!6VuWCq|52xnLZ_TU_57a#un><%0P_-&XOh*luXq&?uo{f|E{50m8{-AAZ*ZGjE-nD*89 zkFoy=Hj0qBG7iZ35;#^l%74Ta#=D2WkV!QI?qS1BHp{5We|$gkGl z_pYB?aCfFo8NAaFdtJkOdAY;ynQbKHFcOEv$5W!>F~lLD;`dx3pqi`; z-gXtn7rlQpTVW)=g}~dTndf3%pj|uQtM9z==!;g3g(_lB%~7a+4K~Ay}VROb_{Qn`?K! zlNYI%MK9B2hWG4S3hv1c+`5ZK9v`CxlpdYC(Mkuu^OV#1`l|lYs=iM=h-OzWjN*IZbIeEDvdv?u9QMATy(eQ-%oGv6 z#U+`Z`yQ59&3vZK<1$;bzI3t9)~w1EdpBO7+pEqm>Z*R5%r5@A z4?^oJlTN4o$*S92Kj>h289)?9l~R*1_hZ5kX@j*PD>IL&Vy|(q<*CAt@L576FAk>wYmXAHEcABhZ<^}v+MtzVsPe82KtgKe1 zXDx6>yJc0EempMSLzrZDu_Y12W`a$sxuCn7SGwG%$RjQr&8Yo}O`Ou;5t&TvoisY~ zs6u!pRY`DwMIS+1;EkyB<{wDw6TE{caRZ8 zOt5fXMf605ant?WS+o!iEGT+T`v4A;=ABR>@<{XR!D!G%MX}f+-}fc6fv(eK=P58E zF=A*$!v-S8H&+O3>zAa)!>;qIDCgVu4zApn#q2_vG)Nz!`8lHZM z3~sZSx16dDt?QC*Telo9#=_^FVc-A}>+01hw0RXKQN|~!b(yuf_XW47YdBXMIa8Z_ z8a-^1g)~XXTZnO!vLIPc7MH|8`3=!SS`hlaeJfOmq^!H-b2ilZx`N1!=doio@pMis z@#MnWw;DMXnfkt$x>VkYj7s++nbHRZ4j*t|tYsw3yIezuRhdRdq%ZoY4Sl4a|9-XJ8YXcqDDs8D^n9n^_`AHG1fC^x*Cwnq#| zZG~qLH=T=1^pXffOgNMSgmv`rS4=X;nQx=ZB4g%#Zrk>Tzcnd)I3+53rpjno#PLhC zVF?m(>2yY!Biu(=;RtddSW?K{QVo(9r~BmewG7{0ufTc!4PR%!q;i+J4xJ0xqyh(HIs zl|w*>7HCfzKR^AT^_ZO7E=!8}sL%{w11;T;!tUIM??#qKNoGX{v-iKs2{F47@Y)1; z9qm(dCyF`?78GISU-SU~@}bzPv5he*j~C6KZ0BuaEZ*8A4y4IQcsICM-=Q%SkhvTP z9J!4;Y%<1OH%)V|4^{gCt*vc9c2v2#>Lgxf(he+W;G;zYR0R5w2CZ8HuB__2(dLb< z9&gY#dLGC9Y!4s7*Lhm*d1^y&J#fi(F?;GD)wt2q3(_SQpEXcL&x2Z0>kj+QcLqBm z2F-^TLb!Sb=4a0z39z6nm^Bidffweu;8bm&qVo}+e}t<+UTx&(5`ko4FS4!BxIU+l znO%^e1-<}0{MA#L)qynXHgP`2k=#KR#$6XBbqWb!z*yk0pN7W!&5;!Rbo#lfpZo+^ z9@^R&w?=^GNM3;_DL{&)QE6PTCd`M~_(7I;=lcLvc2l>3PA2aAqGOqj@B27QDYnhM z-Q(NYII`7niIk!**|^P|K(^E(hW3N8{3~CrgzzpIFqbwI1S_-r>{~eRa6PcrdkT+cljv-(RuW$1cYn zpwdYrzXcC7;YOYB6InC75*({`&l^3H%z`RSdOP%3xEF!Nq_Z)jV1jVd8LHG_Kanw7 z6k`Iu&wV%_%v=oq1IWAcGv$$s5xI2(5pyjqtp^-kKjT```8}6{67^V36^@4v?Ocx< z`pqkrP9K5JuyYwPzUyME=}-L{HktSXo3vx-Pd&cKsspe+Eu0b-1H%)|3-FR#@9~5l z#l_t_k^JzGtgU?nN0p-{aMM5dju`C1J9sFA%tYBd*_+)){Uc=sYw_l38&>iFzHaKh z?d;v<=uQ%@2JXiZX3Q_|&l)j(__@#JKV~`J6-$vmfXt~nZ~2_xV0Qob654$GY_;)T zEfJ}!6@J}$$0m0Nrv8?Jv}puNIE^_n&=ca3EbmisX+cO40uQB=0XbD_uGuMdJSLr| zoR;G(nMdUvAw1bHT)2??(%C28j*JyeNVL5{kHKmqjipm9{H%#!qABvDs$y{|bV0uR z)An?Z47lcScrpK_JN7x8zRz(D-|bKO*Lhm{4Ou^rMwR8{Qtyt&y#!v$%>YbSMPlYg z+dshtxfQs(%qSzWDQrtC+LvK-2b0C-I0SYRX767Xdluo8X%5`Ut?A4CdMTpZsp*kPy+5B6V_fb%h=|8S;NBXB<@Xl?jwMpyXO6- zZ{SX3Bm5_;NjleAc8QfieXoJ;gXV)*v{rYX7V~;lBA>MIByv7K*vsa0cTAn=e*tr%jWcF{|`LSuUo%S~5351jR_5e>Av z^4NPZEZ1gz)CYT6ZGG<>2H&{}1J7zxa;3oHXc%a}8m<`zkPeS;xSVIoOY@K_%-r*8 zINhE$6+fFRE?}f4GR-08EHSHOWK(%e^_2f1@469`+8xi0;lYO2lm&x!-Q zwRtlRhiG#wGZboU;_hD+u^`>V@kGFa1jxO_2GQqZI6chV!l4LuA@Wyd{#KaWmAzNu;U3 zRju|#YhS+3*!B5w*b?qB&6oZX25?MM0>fXmpQ&_fN%Dm znvtO%9EeB7^xU1Z>z?oQPv|etwlX?^Zz)^Z`}3U?W>`c-JK|FI>}be9 zz6+5wB3iD~DXw7$I$PA=VuMBCFn{l$x2#!muxc=-sdn}O4kA#6#4T0N=^aOX2VOw5 zW)xY`;Cv`vHLzUYgk)sTKfYcD>Zk{&jbxwbCeCKCzjltvakW3Tlf+#jg8L#r?zMsE z;;rT<8IP0t7RdS5hy zo0bF_S0^=@KtFw??@ThJ9!snQhx>WMtC^@vSBC?~s4i0AJjGO zmatSnTJB-+KgsaoQ3G-uFynxexT3LD_*T|)YoB_#sH{2KaX>&BoKWen=Ms>VJC1R_ zp74$jTSuE4QxaaZD8YR~9kDEJP|TG}VZz|I%c!;*no$aa;G+72@TdFnHKIgO0^`!T zX+~HM(!tZWE&I9+z_poP%E3>M=Bcry&Q~i8rM}ykbDF$q69aBSdb#xF-kPd5F{N<# zH1C*12tzJvT}RlEG^AQw45kjDs7o2X3Ek3zf)vgh z5p-vF)rMqY=H6`2RzHACzy`8G;wj8E+2q~ebv9>4t6LwJ^N^Ju4{l?k%Ht$KDMzZO zR^OXM8f!`Nj(=yyBl6v*TmPdS=Te;+>dRExNI@j%$pwx3X(LAVsrzbAKbPKaq!{IA z+&)F*`{^wku&I!@Y*Y~LBGKHP4qC?&cV>&YIBRpw0r!~C`^Dj1w!YJvrjPViuhnKW zpDOlVjXj)IP2n>sfQG@mWZX(mkkS(5b3JNT&C^Fy`yY>$pbI}Sex`qq-%DG_1& zL+_2tOa6lhP7f=$tnn%Uv?a}Q&6vOK3X7*-uB0yof;mUvk>(o>N&!^#+)ii<)XPej z#|`y3;Ey0*<0o`%uP)}+xU#yXrmjJ{Cyu+vS2qB5W}Ee7!^vK8-z`HL=_K{kNG2Zt z?vM<@NAm|Zjq-Y@%g3IZH+LvX+G=XCA)P_H)+YXR-dnmSfj0JgPXS{o{Ak(gQN2)4 z9229y<6R}0;(K6hIw~(UQ$w)VTC*=$(cyfa{=hZxnB`ROF33yW635TBN)fnOVt2o3 zPsGYiIK3l`%jg<)?+{7V=??Q?1g&G7W5TES7UCe5ni6?K40tbjpe(C(r=K~@NBK9M ziqmoKmEL{RSL9cXadR=^S}^J)UlXq&DqlxWXN0W!4n^HR^xond?jCOGX{lF$h^cYv z3PiXjYCuGCdO8znqoCFiZ{#WR)>Mu3fWWC&cVC|fL~BRxzairpAmccLOSl9FqpPQ< zr?T7pJGc^a%kWbVEQo1ZsJG1S?4E^Uq~UetWxNLn?Y=`%uR2Gq39c;v;sWfTV`1h7 z(oJpWX%thau;N+N9m01Y!j=dd8!WLv&=3_~DcCPD(7Zhi*JQLS5ms?va<$kQyffFR z&2%%5TWLQ+6Hk=n$b<5k5Sb{F zn<#|Dq3g@R>HOjHjN?Fp^z8(-D0Fe~b<^2F(ZLWzektk=QTO~Iez}oFUCKRFTiC)? z;#RNOa zDZ0_MvOIe1rY#iLz@m;BS+#oR1#7Z+zTvwc2gaxZZ~BRs(MOCET8ZN`1bB11x1vYU z{2x+)-QcmGp$5Kj*3#^$K-9e=wRrptUoELPnrOqh0~g0y+j%B+UC%egx(#vzyR*_4 zI&Mu)oAx}dqYky$g=Tec3|S%-+8=!gnq&ohh%~R1GK`>u@U?Pi^2d0PM+Lw`pUQw@ z4f=_Bry>SDs0hpl(IW-*ueMHFx=8chgRh3Pg*GS3sA0}V7#?F7%dy`jlIoFPY$ivv zLOYE=ZVVrbfC_|7ysndTh>}%2h$@0b*2y;eSB`@jS=l*u=hLj0rJ!cB!JBH!39#vr4IoWU$~(zDkK!`=h>yf<_-y4Ll7uOC<04>B|&-968(O zd11{*#D&id&sgdfs9M+4+}Jh1oZRF|P$+QAs>C5wWwuJ}@JbPW6M+RhX6<3|4!zd3 zy(^5`*`kMSCO`ZdKoO4;?J6%bhsMjS`wxhp07D(`VA2aSNzou2T7g8c)Xax}LETl? z_k1~b`Qv5l`nIdKKi>Tix|5wTWu_fRa#D2eBNIJ?9^z$8vw$jg@gT$qP}}_$Buo9I z;h{7#HS6Jc%n8#M$BCeG`_V_o+r~H9V#gayiXR_wAr*t{$Pp=v0xY5dm-2B2kpeV` zoMur)W+2$lUep%bYt?qeD{Z`?IyaqkXkA|npFJKPbG_arF>75X;>c%~7d(HyaKxm* zBmv|0oo9DNS;R%}6BrN@P%D89BopRdAG<3{DR}cWMiy^bZM>xPZxb8Xgjzcw9SA6+%2iBSvQ&9^|K2c(7K! zP-(ae7D6=UY{nCKRVo7cZr0kU-f^87Jm8@q zk%Nib;^u3cmHh8!|7)b_|Ju@Q_a26zg|JtRZl}vS!)?R=*WOn~RT*{b3WAaXA|Oa3 zsB|NeA}t}^B?1znQd=675=rTnE&&O_O^G1gB_K#iBi*_0+}``0^W8Jfz2p2iKkm5W z^OrjI*n7R}U2Cqnp7}h_Jj_Ur_PyDL=uTaxVzNLMu`2WpPz00 zySp>)vS(!7!l5X5)jNGM2M(^x$>PhY9nUVL2fuwOe-nK~@YLgI;X6k2oug$FZG;%m zv#mk3Q8Ote0jV?TwP;lSrXW4*ICW4%Rann04N;6Fi)|Idq@<+W{;`CxIQ4rQP*Y!- zJAzzn!>)6eImM&%%XdEy(ovWppERg?7WM7Hy3ow-&&xe)u9eFdYt8Q()845yBrP~x z7~lRTM@OoXc7ek02A!+2X_%sq#=g!s2vW9w`6ASJumPL$@tN|o{?OhTR}xVr`;}=* z<#_V60LnE3b>j-MSq|>cv1l?QZn_gE>pUf1A%x~18(uGZw?s{&Y%H%zs9h2h~$14NW&a3`$m_r;#WS6u0DmbM}5K}TH| z(G~e+$C)GbD*Kf97Ys_~jj?@7{p__n0fPuYgA5(oWu)1@kC_9+8WU$ibH~Kvh-_x} zrDaOh;nNnm`#C&v$lu&(#D!cFuaV!&?hYj;aodB24H%2znbR>`q~{?eCaKF-PqP`m z5>0yx5oK?r8tpLO(JzEY{|We%loB(JJ9`^HKeNaz4`k2z{SJ>BR9TB$b?Mc;081)8 zc2u;VvsOTJtEft@vu4BlHn6z)gubolZLI&Q-o78vSv=VM#Y=bhIIpU!Fo8e18c~wE zu=M(zy1nUoh@bire}7o`BZ$Gx3zuP)evyg7H=`ot7=R007)}<*1totX9dkW)))3oc zU$)9#ZC%~5t-D`2$Rn3zG}IDEI~$a1!iy4c4-26YGWI&$vLa2)4>z`P>bUc3-tTu< z4B)QF0ZsDeV$%>?hEmR2=Y!p`MU!Yqc_~k*1V!7D#l%+HuDtv#q=kn9;8B@BX#LCb zV1WfbazBwRTV?I18iOf;tUsH{tZu7Zo_<0mA)tFJMMR zFkkZ362?U5t-bYm`?Sde8zuL5rrf}6cIKxAbWGToeuc0uXny3>uedu> z{20*UESI80^+N5Uv#E0LVvQQ@0rC->9e@HYj)G&#U~MLEuxWq1M(B?xx^fV3ndW9u z2=Oz9?nFU_;BNL{^XnD3Jy%Qqj+9w3nw##t;@RL&j|-YWr^BieL=G?CO%Zi2P)g<1 zvg|qKTXa?eK5ArCjqRbM4wRp33uSpPrObqk90q-7UC5KaE&Qpae$-6teqqP?A#uQS-&2y9z?ujji=-mIvs#Ea9MbmbqfLW_R zlicWql{cBt)H@0;PUc;8-S9=13G05~&wV-Y_4ivdHqUWSTU8^n86-hs5)qORZ9xI8z+ManB4`?LQnB zEXuNYw_sU&xZI!TZ#`Jv>r!~#sGQ}*u1as0=7rBu-%>Q~uk0q0HJNbo@4w-&%cR=a zA_;ZwQtR&vX6N_~$~Zk$1~krxhvA}R-kLY7M)BVE{7grC^IZ60ibi z+HW*(%TI4%6))5&w5-=D)K)H7J-A2|Z8Kb`07ty}ZGn2d_}$-~BcTJN$ju){e~UrT zj3eQ;e@IA3GD}uASqw`c4a>9f6?+?7>sOC13MIz%@j7{%eQT8Awdl}flC|nhU~`)k z*<7;E3sw^wnJiYmF@li8w_!K$)1#1|I}G|U;NduwC{PA#OOv0Pk`8C^=`p_bUzC(M z=L!b-dn1WD<2tv{Cw3j&W)(mtj)B0EkXH44ydH%Z?^=JlKUMXXvum#(+XjMkX#9}T zP(yEa=M$95b9_#t>X0L(R5PAzP%N8)pjYTyjdrEumzb-MOWXBd6$Tl6c^dgv)~2l z{>#l$^LdRn!_OS&hor`IhZ4dA)yX;LkbT5|+?wfH`7?1(ZaFY7NzlGSK_ zTA`Ei@UT4c9LJ{s|1U>O?1JAA#Vmyb+r`zCjuhK-B(zDbGi#EXWZ^- zD&9<2ojbE*xL5B4%CqE8cUQDnLP8k=weh3a;JKfbqz}2JL7khkvTj*w=I~BMd;Ooc zJWF;2KY7KIKfj(x$Ke(q<*{&r0FQeU7&i2F1s!re3RCAQW~+?`59W0~8s348Em#x9 zrn9WG-+M#QuFY9ZkMYhbDjz25J(Ylsyz-9LFT>d^5#(o^AN(S9f?^@}ttLM?d)&1p zLtX^Y4vvQGMW6*p0^I_uF$W50mrs0jC?+4qotu9zz|#>cwBaNe|NPJeoAWB4#Og*F z7X`i{Yo+Ij%kOLeHs+BZKl)u8>FnG$(YNH}9!G6#&v#nA>s=X^K}gr_e%f?d;3x?r zvMN$ZnFt~BvtHSC(Z|EU2dV_e3n{#$2(jgNr^kZ_ca*-Z=ag?&j!UQ%na`|+(Eo0t zlo)s9lVebNwvjn{8N&n!6UQAXskQ`B^=F*sGta(;C+h}*$Vk<1YbGQOJPH9MsXS2o z^9D%b^h%!dD!l?NO2>@btG$2Xf3ApQD^7y)lR1f$6`QzNn;~Tu>llv!aZ~f7-7Myu!+1~Ss zE;SsD6ZbphQVnuI7ZG>Jxt!FP_5AA~an9dQ`mx?i59I!@d@|(ztz8)K(pXy3mM{0` zuW^qVusqQ0ZYC?YPj{4#_eBWJY|!)2cHK#e$ZRDf^$ZEy_W$*&E>xq(SPsm zK_ksGc`EOj8A)3`XPH*`nI+L7y50w15jhq1Cj|G>Z#7cSqk|NBcaERj-oFpj^N$oc zG$IPxmuAa@@C}W96Kw;Zq#0b&e7RmHr|MflR z75Q?@?zt|$-smV*aXkPhEC#%wlbA!l421#+q2`+@OroJ~61b+|D~eY6kTA*0`{R*0 z%&WP39nDkx?XCv8fM`%nDFCFH?Rm04P-Gw^44OIgfnWwr2QXRAo` z!+~SG+Sgw!tZ2|AI^UK1?e9DsxREjg`eFwBuO`NhTUbrFgVO}8N@=fVanX8MyPp*b z_O)BGlwjpo3r2#n{N($8e%0vE0*}ZQI@pBXu7g$;j_(U~Q8R&bPoVM9U%A&w<+E`` zxTkbyJb})*WzMVG)?aJ~kNtMtY2ii* zp2k9c+iA}s)T4iB$U{E;1#~}DG%eGr878l0u$Q5$dp)Mh#$*Z;6|@9XMMC?R`5uvt z=!y#d^1%XBJ*e%TY)*dzjmTESCA4ml^XsVt4CGz=$d{MqQQ9)gp!7hu{8*TR8579R zlChrd7iIO*8eO@v0=9{4fP94%m*UEIXQf>LkGD^1@nuYNefjstDBtwx{^V3j$W1I!}Oq#t;|i)V{7ba;D>O zb5E;0lXB$<+HxwL*D~&xd_8~P$yuWWr2_`&0U1s0*u{gr9S@!PlhY}qkBW5Releytyz>!sXP^1)M!Ela5Rjipb4o9Gw3t3gmdf5*6eGIMVa)8#V(jyl-)%lhU79udawvHQ<+OWwdx2P?Q>F6-bIz+Wz zaG3%8-?D=u>HymFHb^F9N0=Ff&8cqle4_7h$1hobyt1Ahuy+anhordJgJX2hC?AZA zPnP=99iXq-+;w5s?I*&kAImeU$AqfMSp;Eob%3cG-478t{Tg2yVIXkr3lInT1scjgnA=IM?jvk$@~WKa zd!tBdW>?|wH?FK@#^0!$!>pf(`D^~AFoFMrS;(AV-}F@hYDC|M`|9-`M}}nBocHfR z|K07nG=AchLQMV*U;xw?#xYnUi9|PjqHn7)R$tPMO;niT4Lp1V3)_!7bn$k%QM~Mc z%R+u%G`hkS8Nx8|my`hWc$xRAS%J_R(29(EgcqrWx7(QTJ(!g~B!gOwend~LZbBYA zcXIZI$Ff>Ohe8xf!XslBrOcfh`R2F44?tw7DDw}F%z`8NWaLY{n2!A|k`DX-e0R%B zxiWF^Y~H)>NtZv_P?%oti-^K2Fn5!`w%exoG8Bl6{*9)9jdN_RQ)#Z`GAV{Hm0Illq{L>?VLl!W}Pr?1}p1qNST zl6m&`tyG5x_Etxd-bI1sUsaI(JS_3!;z8G)1qBeyeynMZQ;?`Wj|&;9ulLzl4XA z5OQJEXx(v-j&#KakI`qF7?LuH)6F;enZR_I=~7&pO4ub07Rl*2t>3hiTXGuY@;W&> zi9ePru-ZO3l;3j=hWcIN3aYi=3+E;%I{5ER*ssUibff)LtNyGY)x@IQ=3{g^aBn3? zYz$;s>nd-+>7U$->FX=O-31zPnk|0qg|X4PV?mSy3FaDi#os;kAy4$m_i zVja@-K;6vac9LdFE_y$eo=-`N|K)Vy3|{{b*(`vmbX=SsVsJmdY*S^p4ZGz-dAj-U z!xujo9WIlaLiDC2fq`Mdq?6(#6>O834pe>B82z#tCMPc@A~n%*qw{ISOR%oFvVBd- z2bM<1D4K>2YdleMRMVe(&y>z|X6=5ij2SQf#%)uwi0J=$FZ<_|2d%ctU8HJ)+fb+O ztMPy2FQja}@%L;=kZ*9gA%2H|27}%g<_FhLS?f={+b1H>sV!C9R)AEch~Hg9P&E#D(FvDE@GSY!HV#pWoj9V;j{O65c0ZqR^aXNGiAd02Vah9)L22zE zk`$lvjmi?kzrOPSiMa&6O1Rj}P2gJudK{hu-=ZKoylpTVwq)nn;$OZ+dzFbYR!}yq zqS$*a%;mbTL@u_YQ}AxU3Cik7ZBkxIYHMr9c3*+Mr)W8%9Yv0qyAeH#-GGHl3>7kz zuQBfKQ+oHNFJ!r$WI85j*NMo3DOY^;Sipz$SFXo(K?M2t?1=RxP^Q;5kqx<7jeBuXRJfvqcHHQ|zAQTo}7O!N;Ud_GWKQHeP>&QSK6>5&+Nu zm7m)6bfc@{NbkotusjstVsYHZ6y6>mE)gS6VMM9_qAX zUhe$Q?+QFjZ8TelwZi=pVI)`mslJND+BM`t0o%v9AhmvySL^<9b5W|TiX)`qaVG%; z!JK^gq>9u3i%HjE5ogQ@Wlz3zXAM0MTy!PY^=LS9;P;$8?~4Ybt)i~hY(BZ8UL+a; zLhadr;G2ke^EG$M!NJtP;`>g*?h#|J`!+*)>lkJ6*Ml2?K{oFlX987?7F({)^gvon z_IJ1*d)-wI2R`>Lt27bHuBQ(q5f7b5oR-cWK-DX3Pqpdl#MOm7tc&4}05c;o%FU@3 zugGmd;67Asv@>_wI3w!#vPGKZURCTcNH{WPNxLt7f4V(4H4>Nft7#kyo@KjIHHcZ3 z9Xxc*8%3ViF_5uFtL6v~tzGq1rlfS3Jn~esj;cSGQjBGvQE$)JBLD{1X%8&QJ=Nzq z%*315F}VK3vkrh5&JM*+u=hM$(P29wc8tCx?NS-&webU65fr^FuBAGy3w_WVKV&}@Oa7!rtEyW3&AJtIfg`Lfj|@^awh z>P+mY)jh{(Pw}_k85i>Uq9N(srAH^d#l&bP?nsLvqN#hK@k$-P)eo>( zQI^U{Z9X;Yb5i6FMRszODIHK3iQ3b=yJMju$J#{aO<x14KhN|)MehVDAda>36~M$9I}U-qYoq{?!IywB`tH9XSE*Pq<7ukYR$6I@(U584eov~a!eGV zFy+a`kx0k+VB>~ekH^las%dYk7_aFxaRQHHtkd#@0>JJNdTHc^^l^g)V51s7fBm5sKvuuuR&k;P^M z1~|Pi=Qh8e!o&o4J;Jv5s{*)yu|6BGh&|b$dE%=TPaNhGJkYL@qj=`FH;1%JjaH1g z9zGK@3`t%)52)1wo_eOtQ{8DJTo~130z2ZEA5bPb#+S}vZ=?? z>n0ozjMTH*FkEh=Wc*kgk7GU{^pu3cJ|bVMJcq#hR1HLPD!~KtD&=U=LEQ&^=Pd{Tmbb%f@;qlPq2(hMbJ#qL5-eI@ppDlQYtr_ch-62^Xxx%cC#`IpohI;Y+Xchp{^PV%44b zVk)sz0tJIY8T6lQhHYRNf0aN>59jv!9c$wZJt8aYhk1kF%dhBQemy--!p$9#sS=lF zyV)}6iU?R4DY0r?22GmuV}cK{@gP8I4&gMBUATRqdnpb803sblpakI2Pb18zo^Gp3 zpcv`Ac1xEI8U~Sr{R^I6?2~wORIGyaDZ6zZsHSjXToGF5EOdO$m~y2jRx*WK-}YRP z)m+L!*@IdE{d7c$%j>q=0F6G&}yKp~#U5{96&;X-M@b`4V;1CK}f}`!c za?L%Q?~`!`wS8W zu9OI4Ir(*fmNq6Y?A}Et!FUn|D%#DApEK^aCNw}_UFEx;^!oP^TRr!7oR-}hw_X+t z3k0KPJ4@!_2x}ip`LTp8HuWob30oC$0Z3pIt<+?cw}jLglzx4X2j?Y8X)JZ+_)8y_ zI6Q$z6XS6{ufywo{+e3**y}53zT_b&Wdkvf>G4vWG@oV9dx`USc94)VqE5@%bM-C@ z+1$M4EOx&-^%bTN^-1#>u3amz{cW*qOp}*6#;8=hJKAqOY=6&u_37J#!k?w)xgo7%QrSjaTF9FtAojC%_@coEL`}&8yg^f|-sHVp zl6(`-Gqm`UXHj*&BPMEp?I!@s%Gr8REb28b9432_7M*eLyzZeE)4ba^fCkr{B(zvj z^0*n#GTmK$gf#nTrrTrKo+^qO6CLC-$aZ5Wj{zu>s&*Drt9Dxc&a413syHfZtfuc= z_1EgK_0oW8W7D{-D)L#*fm*Q$mnov!aR~3ocHeFx&u_2dHJemC%NT|xk*_A$taPtE zs|%Wi-;PZ4I?^KN&`(|s*J9O)%~4K@=hps}{j~2xy`G`_On>vA+2)5&&R_dmW}sF} zgv;#Djtz6@oE}|Ve)Z(C@Jb#Nva1bWWiKyO;`A_zB+reLeUsm2=uz0(M0?OsM+~cL zg~fVeomW#p@{40^eDZ~Blj%()4n2BS=)}gUN=k7D3&W&W?O|-&=~0(jrL#0xlG1{1 z{}7y8`70bLxbzsmqQv$1J)X97C6w74*)!w{J5zkVe|9XJwNj{Fpi{^K331dwcGQky zBHVBih`*v$PiWOjM)O1I@lubYU=P9~_3W~Wr;~>Il}|Y#<>pzN_La=Q=}HxA^&42# zYbU&MF49W96b_own0wAPw>qfVR`lQ;ITd#;JKbu%mLP6!8Kw++*XSq}QMGCpv2V4( zftN8AeT0L(B5T9DAzf{Ar(Hg0>vd z-3FEM5#!xS2i{X<&4wx!mfci(bqiC5Ghe>BEEA?wvt^6abtlnrawG{+)P)3G#uOwz zbQwUfB%h>N&LvRWg{QkaCEGh(U*%<6 zycbhH??1RAK8mABs^a~EDc@zPZK>}2f_cQ=cCd2x6(9Qze zi1%`m5)HUGnrFpoc;Bov-f#@IVR&*V?i&6b3At5+sWhKix79*}t6D=D;dl%7z zRpOmGQ2+juFT^yj@8{JY7J-8sMEN5$9a?NU3bK8L;f(p}y{1Vx{%0U14i}zENw8+5 zl1gDF(sF^EHcPgf3gtg&EAN>Zp#E7gM!pMt)xf~O7J#9mm)HT44Jbes&JTDv{3HuV z(Ahaj9+k>hI3mk46H4ze>B!dwjDS}{6HafPJAVCl_6BAD!hn&u+j@XD@bpXkQU;g}+Mo};W0NhJ;GV9;0NhBM@05dz# zRlf>V67W-x<^<6JTtfajSN!j85dU9WYY-n2SwY3F4_#0Bhq;L472k$qZZelYWUaR&;HYkQpO4(pnM!9jFxWvV-`&*eZc^6zHA94BaK=& T5%t=<0Dlx@RHTcgOke*GLU88X literal 59567 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 Date: Thu, 19 Oct 2023 19:21:45 +0800 Subject: [PATCH 5/6] refact code --- examples/cluster.yaml | 2 +- examples/standard.yaml | 14 +++++----- pkg/controllers/cluster/controller.go | 1 - pkg/controllers/cluster/handler.go | 23 ++++++++-------- pkg/controllers/cluster/rebalance.go | 5 ++-- pkg/controllers/cluster/sentinel.go | 36 ++------------------------ pkg/controllers/sentinel/kubernetes.go | 33 +++++++++++++++++++++++ pkg/controllers/standard/kvrocks.go | 34 ++---------------------- 8 files changed, 58 insertions(+), 90 deletions(-) diff --git a/examples/cluster.yaml b/examples/cluster.yaml index 59acff1..43df31f 100644 --- a/examples/cluster.yaml +++ b/examples/cluster.yaml @@ -6,7 +6,7 @@ metadata: labels: kvrocks/monitored-by: sentinel-1 spec: - image: apache/kvrocks:nightly # kvrocks image + image: apache/kvrocks:2.5.1 # kvrocks image imagePullPolicy: IfNotPresent master: 3 replicas: 2 diff --git a/examples/standard.yaml b/examples/standard.yaml index 38d0eb7..0900bd7 100644 --- a/examples/standard.yaml +++ b/examples/standard.yaml @@ -2,11 +2,11 @@ apiVersion: kvrocks.apache.org/v1alpha1 kind: KVRocks metadata: name: kvrocks-standard-1-demo - namespace: kvrocks + namespace: default labels: kvrocks/monitored-by: sentinel-1 spec: - image: apache/kvrocks:nightly + image: apache/kvrocks:2.4.0 imagePullPolicy: IfNotPresent master: 1 replicas: 3 @@ -39,9 +39,9 @@ spec: rocksdb.compression: "no" rocksdb.wal_ttl_seconds: "0" rocksdb.wal_size_limit_mb: "0" - # storage: - # size: 32Gi - # class: local-hostpath + storage: + size: 200Mi + class: standard toleration: - key: kvrocks effect: NoSchedule @@ -54,5 +54,5 @@ spec: cpu: 2 memory: 8Gi requests: - cpu: 1 - memory: 4Gi + cpu: 200m + memory: 200Mi diff --git a/pkg/controllers/cluster/controller.go b/pkg/controllers/cluster/controller.go index b51945e..8df16e7 100644 --- a/pkg/controllers/cluster/controller.go +++ b/pkg/controllers/cluster/controller.go @@ -7,7 +7,6 @@ import ( ) // etcd-> controller -// TODO owner reference func (h *KVRocksClusterHandler) ensureController() error { etcdService := resources.NewEtcdService(h.instance) if err := h.k8s.CreateIfNotExistsService(etcdService); err != nil { diff --git a/pkg/controllers/cluster/handler.go b/pkg/controllers/cluster/handler.go index 4551a41..2482856 100644 --- a/pkg/controllers/cluster/handler.go +++ b/pkg/controllers/cluster/handler.go @@ -13,17 +13,16 @@ import ( ) type KVRocksClusterHandler struct { - instance *kvrocksv1alpha1.KVRocks - k8s *k8s.Client - kvrocks *kvrocks.Client - log logr.Logger - password string - requeue bool - stsNodes [][]*kvrocks.Node - key types.NamespacedName - version int - masters map[string]*kvrocks.Node - + instance *kvrocksv1alpha1.KVRocks + k8s *k8s.Client + kvrocks *kvrocks.Client + log logr.Logger + password string + requeue bool + stsNodes [][]*kvrocks.Node + key types.NamespacedName + version int + masters map[string]*kvrocks.Node controllerClient *controller.Client } @@ -69,7 +68,7 @@ func (h *KVRocksClusterHandler) Handle() (error, bool) { if err != nil || h.requeue { return err, false } - err = h.reBalance() + err = h.ensureMigrate() if err != nil || h.requeue { return err, false } diff --git a/pkg/controllers/cluster/rebalance.go b/pkg/controllers/cluster/rebalance.go index 659da4e..aeda4bf 100644 --- a/pkg/controllers/cluster/rebalance.go +++ b/pkg/controllers/cluster/rebalance.go @@ -7,7 +7,7 @@ import ( "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" ) -func (h *KVRocksClusterHandler) reBalance() error { +func (h *KVRocksClusterHandler) ensureMigrate() error { masters := make([]*kvrocks.Node, 0) h.masters = map[string]*kvrocks.Node{} for _, nodes := range h.stsNodes { @@ -24,7 +24,7 @@ func (h *KVRocksClusterHandler) reBalance() error { return h.ensureReBalanceTopo(index, master) } } - h.log.Info("reBalance successfully") + h.log.Info("migrate successfully") return h.ensureStatusTopoMsg() } @@ -36,7 +36,6 @@ func (h *KVRocksClusterHandler) ensureReBalanceTopo(src int, node *kvrocks.Node) retry := 0 wait := time.Millisecond * 10 moveSlots: - // TODO controller 500 "there is a migration task running" err := h.controllerClient.MigrateSlotAndData(src, dest, slot) if err != nil { h.log.Error(err, "move slot error") diff --git a/pkg/controllers/cluster/sentinel.go b/pkg/controllers/cluster/sentinel.go index 7f4cb6b..b390cad 100644 --- a/pkg/controllers/cluster/sentinel.go +++ b/pkg/controllers/cluster/sentinel.go @@ -1,12 +1,10 @@ package cluster import ( - "strconv" - - "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" + sentinel "github.com/RocksLabs/kvrocks-operator/pkg/controllers/sentinel" "github.com/RocksLabs/kvrocks-operator/pkg/resources" ) @@ -23,38 +21,8 @@ func (h *KVRocksClusterHandler) ensureSentinel() error { } // notify sentinel to update if v, ok := h.instance.Labels[resources.MonitoredBy]; ok { - return h.updateSentinelAnnotationCount(v) + return sentinel.UpdateSentinelAnnotationCount(h.k8s, h.instance.Namespace, v) } return nil } - -func (h *KVRocksClusterHandler) updateSentinelAnnotationCount(sentinelName string) error { - sentinel, err := h.k8s.GetKVRocks(types.NamespacedName{ - Namespace: h.instance.Namespace, - Name: sentinelName, - }) - if err != nil { - return err - } - annotations := sentinel.GetAnnotations() - if annotations == nil { - annotations = make(map[string]string) - } - count, ok := annotations["change-count"] - if !ok { - count = "0" - } - countInt, err := strconv.Atoi(count) - if err != nil { - return err - } - countInt++ - annotations["change-count"] = strconv.Itoa(countInt) - sentinel.SetAnnotations(annotations) - if err := h.k8s.UpdateKVRocks(sentinel); err != nil { - return err - } - h.log.V(1).Info("sentinel monitor ready") - return nil -} diff --git a/pkg/controllers/sentinel/kubernetes.go b/pkg/controllers/sentinel/kubernetes.go index 8815b53..0fce31a 100644 --- a/pkg/controllers/sentinel/kubernetes.go +++ b/pkg/controllers/sentinel/kubernetes.go @@ -1,7 +1,11 @@ package sentinel import ( + "strconv" + + "github.com/RocksLabs/kvrocks-operator/pkg/client/k8s" "github.com/RocksLabs/kvrocks-operator/pkg/resources" + "k8s.io/apimachinery/pkg/types" ) func (h *KVRocksSentinelHandler) ensureKubernetes() error { @@ -37,3 +41,32 @@ func (h *KVRocksSentinelHandler) ensureKubernetes() error { h.log.Info("kubernetes resources ok") return nil } + +func UpdateSentinelAnnotationCount(k8s *k8s.Client, namespace, sentinelName string) error { + sentinel, err := k8s.GetKVRocks(types.NamespacedName{ + Namespace: namespace, + Name: sentinelName, + }) + if err != nil { + return err + } + annotations := sentinel.GetAnnotations() + if annotations == nil { + annotations = make(map[string]string) + } + count, ok := annotations["change-count"] + if !ok { + count = "0" + } + countInt, err := strconv.Atoi(count) + if err != nil { + return err + } + countInt++ + annotations["change-count"] = strconv.Itoa(countInt) + sentinel.SetAnnotations(annotations) + if err := k8s.UpdateKVRocks(sentinel); err != nil { + return err + } + return nil +} diff --git a/pkg/controllers/standard/kvrocks.go b/pkg/controllers/standard/kvrocks.go index 0f9125b..18ac5bb 100644 --- a/pkg/controllers/standard/kvrocks.go +++ b/pkg/controllers/standard/kvrocks.go @@ -3,7 +3,6 @@ package standard import ( "errors" "fmt" - "strconv" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -11,6 +10,7 @@ import ( kvrocksv1alpha1 "github.com/RocksLabs/kvrocks-operator/api/v1alpha1" "github.com/RocksLabs/kvrocks-operator/pkg/client/kvrocks" "github.com/RocksLabs/kvrocks-operator/pkg/controllers/common" + sentinel "github.com/RocksLabs/kvrocks-operator/pkg/controllers/sentinel" "github.com/RocksLabs/kvrocks-operator/pkg/resources" ) @@ -102,41 +102,11 @@ func (h *KVRocksStandardHandler) ensureKVRocksReplication() error { } // notify sentinel to update if v, ok := h.instance.Labels[resources.MonitoredBy]; ok { - return h.updateSentinelAnnotationCount(v) + return sentinel.UpdateSentinelAnnotationCount(h.k8s, h.instance.Namespace, v) } return nil } -func (h *KVRocksStandardHandler) updateSentinelAnnotationCount(sentinelName string) error { - sentinel, err := h.k8s.GetKVRocks(types.NamespacedName{ - Namespace: h.instance.Namespace, - Name: sentinelName, - }) - if err != nil { - return err - } - annotations := sentinel.GetAnnotations() - if annotations == nil { - annotations = make(map[string]string) - } - count, ok := annotations["change-count"] - if !ok { - count = "0" - } - countInt, err := strconv.Atoi(count) - if err != nil { - return err - } - countInt++ - annotations["change-count"] = strconv.Itoa(countInt) - sentinel.SetAnnotations(annotations) - if err := h.k8s.UpdateKVRocks(sentinel); err != nil { - return err - } - h.log.V(1).Info("sentinel monitor ready") - return nil -} - func (h *KVRocksStandardHandler) updateKVRocksRole(podID int, role string) error { podName := fmt.Sprintf("%s-%d", h.instance.Name, podID) pod, err := h.k8s.GetPod(types.NamespacedName{ From 00f68f6f0a3db47528aaf4781d037715b7d924c2 Mon Sep 17 00:00:00 2001 From: jinxu <1319039722@qq.com> Date: Fri, 20 Oct 2023 23:14:49 +0800 Subject: [PATCH 6/6] update code --- examples/cluster.yaml | 14 +++++++------- examples/sentinel.yaml | 6 +++--- examples/standard.yaml | 14 +++++++------- test/e2e/config/config.yaml | 6 +++--- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/examples/cluster.yaml b/examples/cluster.yaml index 43df31f..761b079 100644 --- a/examples/cluster.yaml +++ b/examples/cluster.yaml @@ -2,11 +2,11 @@ apiVersion: kvrocks.apache.org/v1alpha1 kind: KVRocks metadata: name: kvrocks-cluster-1-demo - namespace: default + namespace: kvrocks labels: kvrocks/monitored-by: sentinel-1 spec: - image: apache/kvrocks:2.5.1 # kvrocks image + image: apache/kvrocks # kvrocks image imagePullPolicy: IfNotPresent master: 3 replicas: 2 @@ -39,9 +39,9 @@ spec: rocksdb.compression: "no" rocksdb.wal_ttl_seconds: "0" rocksdb.wal_size_limit_mb: "0" - storage: - size: 200Mi - class: standard # storage class + # storage: + # size: 32Gi + # class: local-hostpath # nodeSelector: # role: kvrocks toleration: @@ -56,5 +56,5 @@ spec: cpu: 2 memory: 8Gi requests: - cpu: 200m - memory: 200Mi + cpu: 1 + memory: 4Gi diff --git a/examples/sentinel.yaml b/examples/sentinel.yaml index e704105..31d2cf8 100644 --- a/examples/sentinel.yaml +++ b/examples/sentinel.yaml @@ -2,7 +2,7 @@ apiVersion: kvrocks.apache.org/v1alpha1 kind: KVRocks metadata: name: sentinel-1 - namespace: default + namespace: kvrocks spec: image: redis:6.2.4 imagePullPolicy: IfNotPresent @@ -21,5 +21,5 @@ spec: cpu: 500m memory: 500Mi requests: - cpu: 200m - memory: 200Mi + cpu: 500m + memory: 500Mi diff --git a/examples/standard.yaml b/examples/standard.yaml index 0900bd7..71a82d0 100644 --- a/examples/standard.yaml +++ b/examples/standard.yaml @@ -2,11 +2,11 @@ apiVersion: kvrocks.apache.org/v1alpha1 kind: KVRocks metadata: name: kvrocks-standard-1-demo - namespace: default + namespace: kvrocks labels: kvrocks/monitored-by: sentinel-1 spec: - image: apache/kvrocks:2.4.0 + image: apache/kvrocks imagePullPolicy: IfNotPresent master: 1 replicas: 3 @@ -39,9 +39,9 @@ spec: rocksdb.compression: "no" rocksdb.wal_ttl_seconds: "0" rocksdb.wal_size_limit_mb: "0" - storage: - size: 200Mi - class: standard + # storage: + # size: 32Gi + # class: local-hostpath toleration: - key: kvrocks effect: NoSchedule @@ -54,5 +54,5 @@ spec: cpu: 2 memory: 8Gi requests: - cpu: 200m - memory: 200Mi + cpu: 1 + memory: 4Gi diff --git a/test/e2e/config/config.yaml b/test/e2e/config/config.yaml index 1f68ff7..6d01b39 100644 --- a/test/e2e/config/config.yaml +++ b/test/e2e/config/config.yaml @@ -1,6 +1,6 @@ kruiseVersion: 1.4.0 clusterName: e2e-test -namespace: default +namespace: kvrocks manifestDir: -chaosMeshEnabled: false -kubeConfig: /root/.kube/config +chaosMeshEnabled: true +kubeConfig: