From 3793a2167ddf89a2895fd5e5742258f4d1a8c87a Mon Sep 17 00:00:00 2001 From: Jan Knipper Date: Thu, 18 Apr 2024 16:52:35 +0200 Subject: [PATCH] Add k8sniff --- contrib/k8sniff/Dockerfile | 21 +- contrib/k8sniff/LICENSE | 19 + contrib/k8sniff/Makefile | 7 +- contrib/k8sniff/README.md | 73 ++ contrib/k8sniff/config.go | 156 ++++ contrib/k8sniff/go.mod | 57 ++ contrib/k8sniff/go.sum | 796 ++++++++++++++++++ contrib/k8sniff/kubernetes/example/bar.yaml | 30 + contrib/k8sniff/kubernetes/example/foo.yaml | 30 + .../k8sniff/kubernetes/example/k8sniff.json | 7 + .../kubernetes/example/tcp-ingress.yaml | 23 + .../k8sniff/kubernetes/k8sniff-configmap.yaml | 19 + .../kubernetes/k8sniff-deployment.yaml | 37 + .../k8sniff/kubernetes/k8sniff-namespace.yaml | 4 + contrib/k8sniff/kubernetes/k8sniff-svc.yaml | 13 + contrib/k8sniff/logo/logo.png | Bin 0 -> 119204 bytes contrib/k8sniff/main.go | 49 ++ contrib/k8sniff/metrics/backends.go | 18 + contrib/k8sniff/metrics/connections.go | 34 + contrib/k8sniff/metrics/doc.go | 3 + contrib/k8sniff/metrics/errors.go | 26 + contrib/k8sniff/metrics/init.go | 14 + contrib/k8sniff/metrics/serve.go | 17 + contrib/k8sniff/parser/parser.go | 144 ++++ contrib/k8sniff/server.go | 443 ++++++++++ 25 files changed, 2022 insertions(+), 18 deletions(-) create mode 100644 contrib/k8sniff/LICENSE create mode 100644 contrib/k8sniff/README.md create mode 100644 contrib/k8sniff/config.go create mode 100644 contrib/k8sniff/go.mod create mode 100644 contrib/k8sniff/go.sum create mode 100644 contrib/k8sniff/kubernetes/example/bar.yaml create mode 100644 contrib/k8sniff/kubernetes/example/foo.yaml create mode 100644 contrib/k8sniff/kubernetes/example/k8sniff.json create mode 100644 contrib/k8sniff/kubernetes/example/tcp-ingress.yaml create mode 100644 contrib/k8sniff/kubernetes/k8sniff-configmap.yaml create mode 100644 contrib/k8sniff/kubernetes/k8sniff-deployment.yaml create mode 100644 contrib/k8sniff/kubernetes/k8sniff-namespace.yaml create mode 100644 contrib/k8sniff/kubernetes/k8sniff-svc.yaml create mode 100644 contrib/k8sniff/logo/logo.png create mode 100644 contrib/k8sniff/main.go create mode 100644 contrib/k8sniff/metrics/backends.go create mode 100644 contrib/k8sniff/metrics/connections.go create mode 100644 contrib/k8sniff/metrics/doc.go create mode 100644 contrib/k8sniff/metrics/errors.go create mode 100644 contrib/k8sniff/metrics/init.go create mode 100644 contrib/k8sniff/metrics/serve.go create mode 100644 contrib/k8sniff/parser/parser.go create mode 100644 contrib/k8sniff/server.go diff --git a/contrib/k8sniff/Dockerfile b/contrib/k8sniff/Dockerfile index c6d44a0002..4bbbb1d283 100644 --- a/contrib/k8sniff/Dockerfile +++ b/contrib/k8sniff/Dockerfile @@ -1,19 +1,10 @@ -FROM keppel.eu-de-1.cloud.sap/ccloud-dockerhub-mirror/library/golang:1.16-alpine3.13 +FROM golang:1.22 as builder WORKDIR /go/src/github.com/kubermatic/k8sniff +ADD . . +RUN CGO_ENABLED=0 go build -ldflags '-s' -o /go/bin/k8sniff . -RUN apk add --no-cache curl git \ - && curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh -ARG VERSION=master -RUN git clone https://github.com/kubermatic/k8sniff.git . \ - && git checkout $VERSION - -RUN dep ensure - -RUN go build -v -o k8sniff . - -FROM alpine:3.9 +FROM alpine LABEL source_repository="https://github.com/sapcc/kubernikus" - -RUN apk add --no-cache ca-certificates -COPY --from=0 /go/src/github.com/kubermatic/k8sniff /pipeline/source/k8sniff +COPY --from=builder /go/bin/k8sniff /pipeline/source/k8sniff +CMD ["/pipeline/source/k8sniff"] diff --git a/contrib/k8sniff/LICENSE b/contrib/k8sniff/LICENSE new file mode 100644 index 0000000000..8f63e30d34 --- /dev/null +++ b/contrib/k8sniff/LICENSE @@ -0,0 +1,19 @@ +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/contrib/k8sniff/Makefile b/contrib/k8sniff/Makefile index aa8e92e865..58fb68325c 100644 --- a/contrib/k8sniff/Makefile +++ b/contrib/k8sniff/Makefile @@ -1,7 +1,8 @@ -IMAGE:= sapcc/k8sniff -VERSION := e7435d989925e8559b0e5ca26da69f84a1035c32 +IMAGE:=keppel.eu-de-1.cloud.sap/ccloud/k8sniff +VERSION:=$(shell git rev-parse --verify HEAD) build: - docker build --build-arg VERSION=$(VERSION) -t $(IMAGE):$(VERSION) . + docker build --network=host -t $(IMAGE):$(VERSION) . + push: docker push $(IMAGE):$(VERSION) diff --git a/contrib/k8sniff/README.md b/contrib/k8sniff/README.md new file mode 100644 index 0000000000..5a899dfe9d --- /dev/null +++ b/contrib/k8sniff/README.md @@ -0,0 +1,73 @@ +K8SNIff + +Forked from https://github.com/kubermatic/k8sniff + +K8SNIff - tcp ingress controller with SNI support +===== + +K8SNIff is a small ingress server that will accept incoming TLS connections and parse +TLS Client Hello messages for the SNI Extension. If one is found, we'll go +ahead and forward that connection to a Kubernetes service with a matching Ingress resource. + +sniff config +------------ + +The following config will K8SNIff listen on port `8443` and listen on Ingress resources + +```json +{ + "bind": { + "host": "localhost", + "port": 8443 + }, + "kubernetes": {} +} + +``` +The example ingress connect any requests to `foo` to service `foo` with port `443` and any requests to `bar` to service `bar` with port `443`. If nothing matches this, it will send the traffic to the default backend with the service `bar` on port `443`. + +```yaml +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: tcp + annotations: + kubernetes.io/ingress.class: k8sniff +spec: + backend: + serviceName: bar + servicePort: 443 + rules: + - host: foo + http: + paths: + - backend: + serviceName: foo + servicePort: 443 + - host: bar + http: + paths: + - backend: + serviceName: bar + servicePort: 443 +``` + +The requested domain name are interpreted as regular expressions. Each server and name will be checked in the order they appear in the file, stopping with the first match. If there is no match, then the request is sent to the first server with default `backend` set. + +using the parser +---------------- + +``` +import ( + "fmt" + + " kubermatic/k8sniff/parser" +) + +func main() { + listener, err := net.Listen("tcp", "localhost:2222") + if err != nil { + return err + } +} +``` diff --git a/contrib/k8sniff/config.go b/contrib/k8sniff/config.go new file mode 100644 index 0000000000..baf792b3d1 --- /dev/null +++ b/contrib/k8sniff/config.go @@ -0,0 +1,156 @@ +/* {{{ Copyright (c) Paul R. Tagliamonte , 2015 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. }}} */ + +package main + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "strings" + "sync" + + "github.com/golang/glog" + + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" +) + +const ( + maxTCPPort = 65535 +) + +type Config struct { + Bind Bind + Metrics Metrics + Servers []Server + Kubernetes *Kubernetes + proxy *Proxy + lock sync.Mutex + + serviceController cache.Controller + serviceStore cache.Store + ingressController cache.Controller + ingressStore cache.Store +} + +// Valid returns an if the config is invalid +func (c *Config) Valid() error { + if len(c.Servers) > 0 && c.Kubernetes != nil { + return errors.New("Cannot set .Servers and .Kubernetes in config file") + } + + if err := c.Metrics.Valid(); err != nil { + return err + } + + return nil +} + +type Kubernetes struct { + Kubeconfig string + Client *kubernetes.Clientset + IngressClass string +} + +// Metrics contains the port & path for the +// prometheus endpoint +type Metrics struct { + Host string + Port int + Path string +} + +type Bind struct { + Host string + Port int +} + +type Server struct { + Default bool + Regexp bool + Host string + Names []string + Port int +} + +// Valid returns an error if the metrics config is invalid +func (m Metrics) Valid() error { + if m.Port > maxTCPPort { + return fmt.Errorf("Configured metrics port is above %d: port=%d", maxTCPPort, m.Port) + } + + return nil +} + +func LoadConfig(path string) (*Config, error) { + glog.V(5).Infof("Loading config from: %s", path) + + fd, err := os.Open(path) + if err != nil { + return nil, err + } + config := Config{} + err = json.NewDecoder(fd).Decode(&config) + if err != nil { + return nil, err + } + + if err = config.Valid(); err != nil { + return nil, err + } + + config.setDefaultsIfUnset() + + glog.V(5).Infof("Read config: %v", config) + + return &config, err +} + +func (c *Config) setDefaultsIfUnset() { + if c.Bind.Port == 0 { + c.Bind.Port = 8443 + } + + if c.Bind.Host == "" { + glog.V(5).Infof("Bind host not set. Using default: 0.0.0.0") + c.Bind.Host = "0.0.0.0" + } + + if c.Metrics.Host == "" { + glog.V(5).Infof("Metrics host not set. Using default: 0.0.0.0") + c.Metrics.Host = c.Bind.Host + } + + if c.Metrics.Port == 0 { + glog.V(5).Infof("Metrics port not set. Using default: 9091") + c.Metrics.Port = 9091 + } + + if c.Metrics.Path == "" { + glog.V(5).Infof("Metrics path not set. Using default: /metrics") + c.Metrics.Path = "/metrics" + } + if !strings.HasPrefix(c.Metrics.Path, "/") { + c.Metrics.Path = "/" + c.Metrics.Path + } + +} diff --git a/contrib/k8sniff/go.mod b/contrib/k8sniff/go.mod new file mode 100644 index 0000000000..efbaaa52a3 --- /dev/null +++ b/contrib/k8sniff/go.mod @@ -0,0 +1,57 @@ +module github.com/sapcc/kubernikus + +go 1.22 + +require ( + github.com/golang/glog v1.2.1 + github.com/kubermatic/k8sniff v0.0.0-20171019092931-e7435d989925 + github.com/prometheus/client_golang v1.19.0 + k8s.io/api v0.29.4 + k8s.io/apimachinery v0.29.4 + k8s.io/client-go v0.29.4 +) + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/imdario/mergo v0.3.6 // 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/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/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + golang.org/x/net v0.23.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.110.1 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/contrib/k8sniff/go.sum b/contrib/k8sniff/go.sum new file mode 100644 index 0000000000..b2079083e3 --- /dev/null +++ b/contrib/k8sniff/go.sum @@ -0,0 +1,796 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/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/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/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/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= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +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/creack/pty v1.1.9/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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +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.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +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-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-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +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.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +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.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +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 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/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/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/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= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +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.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/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/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/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/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 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +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= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +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/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/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/kubermatic/k8sniff v0.0.0-20171019092931-e7435d989925 h1:FeKKcWLJLVSEb1xj9q/vfnvoqjmzDeqkR1R1rb/esCI= +github.com/kubermatic/k8sniff v0.0.0-20171019092931-e7435d989925/go.mod h1:FzAZy85CdcRRXeoEFHb0fh6/ZjrP1ZL/my0HfFfpShQ= +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/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/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 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +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 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +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 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +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.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +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.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +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.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +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.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +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/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +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/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= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/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= +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= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-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-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= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-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= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +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-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.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/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-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= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-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-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 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +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-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-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/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +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/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.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.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= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= +k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/api v0.29.4 h1:WEnF/XdxuCxdG3ayHNRR8yH3cI1B/llkWBma6bq4R3w= +k8s.io/api v0.29.4/go.mod h1:DetSv0t4FBTcEpfA84NJV3g9a7+rSzlUHk5ADAYHUv0= +k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= +k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q= +k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y= +k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= +k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/client-go v0.29.4 h1:79ytIedxVfyXV8rpH3jCBW0u+un0fxHDwX5F9K8dPR8= +k8s.io/client-go v0.29.4/go.mod h1:kC1thZQ4zQWYwldsfI088BbK6RkxK+aF5ebV8y9Q4tk= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/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/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +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/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +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/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/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/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/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +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/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +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/contrib/k8sniff/kubernetes/example/bar.yaml b/contrib/k8sniff/kubernetes/example/bar.yaml new file mode 100644 index 0000000000..2ed6cd72db --- /dev/null +++ b/contrib/k8sniff/kubernetes/example/bar.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: Service +metadata: + name: bar +spec: + ports: + - port: 443 + selector: + app: bar +--- +kind: Pod +apiVersion: v1 +metadata: + name: bar + labels: + app: bar +spec: + containers: + - name: porter + image: gcr.io/google_containers/porter:cd5cb5791ebaa8641955f0e8c2a9bed669b1eaab + env: + - name: SERVE_TLS_PORT_443 + value: bar + - name: CERT_FILE + value: "/localhost.crt" + - name: KEY_FILE + value: "/localhost.key" + ports: + - name: https + containerPort: 443 diff --git a/contrib/k8sniff/kubernetes/example/foo.yaml b/contrib/k8sniff/kubernetes/example/foo.yaml new file mode 100644 index 0000000000..0b9da323f8 --- /dev/null +++ b/contrib/k8sniff/kubernetes/example/foo.yaml @@ -0,0 +1,30 @@ +apiVersion: v1 +kind: Service +metadata: + name: foo +spec: + ports: + - port: 443 + selector: + app: foo +--- +kind: Pod +apiVersion: v1 +metadata: + name: foo + labels: + app: foo +spec: + containers: + - name: porter + image: gcr.io/google_containers/porter:cd5cb5791ebaa8641955f0e8c2a9bed669b1eaab + env: + - name: SERVE_TLS_PORT_443 + value: foo + - name: CERT_FILE + value: "/localhost.crt" + - name: KEY_FILE + value: "/localhost.key" + ports: + - name: https + containerPort: 443 diff --git a/contrib/k8sniff/kubernetes/example/k8sniff.json b/contrib/k8sniff/kubernetes/example/k8sniff.json new file mode 100644 index 0000000000..85fab5e336 --- /dev/null +++ b/contrib/k8sniff/kubernetes/example/k8sniff.json @@ -0,0 +1,7 @@ +{ + "bind": { + "host": "localhost", + "port": 8443 + }, + "kubernetes": {} +} diff --git a/contrib/k8sniff/kubernetes/example/tcp-ingress.yaml b/contrib/k8sniff/kubernetes/example/tcp-ingress.yaml new file mode 100644 index 0000000000..71906ec891 --- /dev/null +++ b/contrib/k8sniff/kubernetes/example/tcp-ingress.yaml @@ -0,0 +1,23 @@ +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: tcp + annotations: + kubernetes.io/ingress.class: k8sniff +spec: + backend: + serviceName: bar + servicePort: 443 + rules: + - host: foo + http: + paths: + - backend: + serviceName: foo + servicePort: 443 + - host: bar + http: + paths: + - backend: + serviceName: bar + servicePort: 443 diff --git a/contrib/k8sniff/kubernetes/k8sniff-configmap.yaml b/contrib/k8sniff/kubernetes/k8sniff-configmap.yaml new file mode 100644 index 0000000000..869b907b07 --- /dev/null +++ b/contrib/k8sniff/kubernetes/k8sniff-configmap.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: k8sniff-configmap + namespace: k8sniff +data: + k8sniff.json: | + { + "bind": { + "host": "0.0.0.0", + "port": 8443 + }, + "metrics": { + "host": "0.0.0.0", + "port": 9091, + "path": "/metrics" + }, + "kubernetes": {} + } diff --git a/contrib/k8sniff/kubernetes/k8sniff-deployment.yaml b/contrib/k8sniff/kubernetes/k8sniff-deployment.yaml new file mode 100644 index 0000000000..1104544a02 --- /dev/null +++ b/contrib/k8sniff/kubernetes/k8sniff-deployment.yaml @@ -0,0 +1,37 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: k8sniff-ingress-lb + namespace: k8sniff + labels: + role: k8sniff-ingress-lb +spec: + replicas: 1 + selector: + matchLabels: + role: k8sniff-ingress-lb + template: + metadata: + labels: + role: k8sniff-ingress-lb + spec: + containers: + - image: kubermatic/k8sniff:latest + name: k8sniff-ingress-lb + imagePullPolicy: Always + command: + - /bin/sh + - -c + - -x + - "/pipeline/source/k8sniff -logtostderr --v=9 --config /etc/config/k8sniff.json" + ports: + - name: https + containerPort: 8443 + volumeMounts: + - name: k8sniff-config + mountPath: /etc/config + readOnly: true + volumes: + - name: k8sniff-config + configMap: + name: k8sniff-configmap diff --git a/contrib/k8sniff/kubernetes/k8sniff-namespace.yaml b/contrib/k8sniff/kubernetes/k8sniff-namespace.yaml new file mode 100644 index 0000000000..d64430a65b --- /dev/null +++ b/contrib/k8sniff/kubernetes/k8sniff-namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k8sniff diff --git a/contrib/k8sniff/kubernetes/k8sniff-svc.yaml b/contrib/k8sniff/kubernetes/k8sniff-svc.yaml new file mode 100644 index 0000000000..e8cbde3104 --- /dev/null +++ b/contrib/k8sniff/kubernetes/k8sniff-svc.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: k8sniff-ingress-lb + namespace: k8sniff +spec: + type: LoadBalancer + ports: + - port: 443 + targetPort: 8443 + protocol: TCP + selector: + role: k8sniff-ingress-lb diff --git a/contrib/k8sniff/logo/logo.png b/contrib/k8sniff/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..658725e0e454521045366166c7e7243d2deedc9e GIT binary patch literal 119204 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�^c|BE8l!=OXit!^$ARC}e<)!tVeAUKhq4<%W92 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

U?Ow=tRH`EEZDwHx1MgHvkZM7~7{aCce>EB;}P5 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, 2015 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. }}} */ + +package main + +import ( + "flag" + "fmt" + + "github.com/kubermatic/k8sniff/metrics" +) + +func main() { + var k8sniffConfig, kubeconfig string + + flag.StringVar(&k8sniffConfig, "config", "k8sniff.json", "Config") + flag.StringVar(&kubeconfig, "kubeconfig", "", "absolute path to the kubeconfig file") + flag.Parse() + + config, err := LoadConfig(k8sniffConfig) + if err != nil { + panic(err) + } + config.Kubernetes.Kubeconfig = kubeconfig + + go metrics.Serve(fmt.Sprintf("%s:%d", config.Metrics.Host, config.Metrics.Port), config.Metrics.Path) + + stop := make(chan struct{}) + defer close(stop) + go panic(config.Serve(stop)) + <-stop +} diff --git a/contrib/k8sniff/metrics/backends.go b/contrib/k8sniff/metrics/backends.go new file mode 100644 index 0000000000..522798ce75 --- /dev/null +++ b/contrib/k8sniff/metrics/backends.go @@ -0,0 +1,18 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +var ( + backendGauge = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: Prefix + "configured_backends_count", + Help: "Number of configured backends", + }, + ) +) + +func SetBackendCount(count int) { + backendGauge.Set(float64(count)) +} diff --git a/contrib/k8sniff/metrics/connections.go b/contrib/k8sniff/metrics/connections.go new file mode 100644 index 0000000000..5c3b72bb06 --- /dev/null +++ b/contrib/k8sniff/metrics/connections.go @@ -0,0 +1,34 @@ +package metrics + +import ( + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +var ( + connDurationsHisto = prometheus.NewHistogram(prometheus.HistogramOpts{ + Name: Prefix + "connection_durations_histogram_seconds", + Help: "Connection duration distributions.", + }) + connGauge = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: Prefix + "opened_connections_count", + Help: "Number of opened TCP connections", + }, + ) +) + +// IncConnections increments the total connections counter +func IncConnections() { + connGauge.Inc() +} + +func DecConnections() { + connGauge.Dec() +} + +// ConnectionTime gather the duration of a connection +func ConnectionTime(d time.Duration) { + connDurationsHisto.Observe(d.Seconds()) +} diff --git a/contrib/k8sniff/metrics/doc.go b/contrib/k8sniff/metrics/doc.go new file mode 100644 index 0000000000..e5d5019bb1 --- /dev/null +++ b/contrib/k8sniff/metrics/doc.go @@ -0,0 +1,3 @@ +// Package metrics contains some metrics that could be +// collected by Prometheus. +package metrics diff --git a/contrib/k8sniff/metrics/errors.go b/contrib/k8sniff/metrics/errors.go new file mode 100644 index 0000000000..2869926657 --- /dev/null +++ b/contrib/k8sniff/metrics/errors.go @@ -0,0 +1,26 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +const ( + Error = "error" + Fatal = "fatal" + Info = "info" +) + +var ( + errorCounterVec = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: Prefix + "errors_total", + Help: "Total error count", + }, + []string{"type"}, + ) +) + +// IncErrors increments the total errors counter +func IncErrors(typ string) { + errorCounterVec.WithLabelValues(typ).Inc() +} diff --git a/contrib/k8sniff/metrics/init.go b/contrib/k8sniff/metrics/init.go new file mode 100644 index 0000000000..2e9d0e4644 --- /dev/null +++ b/contrib/k8sniff/metrics/init.go @@ -0,0 +1,14 @@ +package metrics + +import "github.com/prometheus/client_golang/prometheus" + +const ( + Prefix = "k8sniff_" +) + +func init() { + prometheus.MustRegister(connDurationsHisto) + prometheus.MustRegister(connGauge) + prometheus.MustRegister(errorCounterVec) + prometheus.MustRegister(backendGauge) +} diff --git a/contrib/k8sniff/metrics/serve.go b/contrib/k8sniff/metrics/serve.go new file mode 100644 index 0000000000..eee0ea243d --- /dev/null +++ b/contrib/k8sniff/metrics/serve.go @@ -0,0 +1,17 @@ +package metrics + +import ( + "log" + "net/http" + + "github.com/golang/glog" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +// Serve the prometheus metrics endpoint +func Serve(addr, path string) { + glog.V(1).Infof("Metrics exposed on %s%s", addr, path) + + http.Handle(path, promhttp.Handler()) + log.Fatal(http.ListenAndServe(addr, nil)) +} diff --git a/contrib/k8sniff/parser/parser.go b/contrib/k8sniff/parser/parser.go new file mode 100644 index 0000000000..edc75ef446 --- /dev/null +++ b/contrib/k8sniff/parser/parser.go @@ -0,0 +1,144 @@ +/* {{{ Copyright 2017 Paul Tagliamonte + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. }}} */ + +package parser + +import ( + "fmt" +) + +var TLSHeaderLength = 5 + +/* This function is basically all most folks want to invoke out of this + * jumble of bits. This will take an incoming TLS Client Hello (including + * all the fuzzy bits at the beginning of it - fresh out of the socket) and + * go ahead and give us the SNI Name they want. */ +func GetHostname(data []byte) (string, error) { + if len(data) == 0 || data[0] != 0x16 { + return "", fmt.Errorf("Doesn't look like a TLS Client Hello") + } + + extensions, err := GetExtensionBlock(data) + if err != nil { + return "", err + } + sn, err := GetSNBlock(extensions) + if err != nil { + return "", err + } + sni, err := GetSNIBlock(sn) + if err != nil { + return "", err + } + return string(sni), nil +} + +/* Given a Server Name TLS Extension block, parse out and return the SNI + * (Server Name Indication) payload */ +func GetSNIBlock(data []byte) ([]byte, error) { + index := 0 + + for { + if index >= len(data) { + break + } + length := int((data[index] << 8) + data[index+1]) + endIndex := index + 2 + length + if data[index+2] == 0x00 { /* SNI */ + sni := data[index+3:] + sniLength := int((sni[0] << 8) + sni[1]) + return sni[2 : sniLength+2], nil + } + index = endIndex + } + return []byte{}, fmt.Errorf( + "Finished parsing the SN block without finding an SNI", + ) +} + +/* Given a TLS Extensions data block, go ahead and find the SN block */ +func GetSNBlock(data []byte) ([]byte, error) { + index := 0 + + if len(data) < 2 { + return []byte{}, fmt.Errorf("Not enough bytes to be an SN block") + } + + extensionLength := int((data[index] << 8) + data[index+1]) + if extensionLength+2 > len(data) { + return []byte{}, fmt.Errorf("Extension looks bonkers") + } + data = data[2 : extensionLength+2] + + for { + if index+3 >= len(data) { + break + } + length := int((data[index+2] << 8) + data[index+3]) + endIndex := index + 4 + length + if data[index] == 0x00 && data[index+1] == 0x00 { + return data[index+4 : endIndex], nil + } + + index = endIndex + } + + return []byte{}, fmt.Errorf( + "Finished parsing the Extension block without finding an SN block", + ) +} + +/* Given a raw TLS Client Hello, go ahead and find all the Extensions */ +func GetExtensionBlock(data []byte) ([]byte, error) { + /* data[0] - content type + * data[1], data[2] - major/minor version + * data[3], data[4] - total length + * data[...38+5] - start of SessionID (length bit) + * data[38+5] - length of SessionID + */ + var index = TLSHeaderLength + 38 + + if len(data) <= index+1 { + return []byte{}, fmt.Errorf("Not enough bits to be a Client Hello") + } + + /* Index is at SessionID Length bit */ + if newIndex := index + 1 + int(data[index]); (newIndex + 2) < len(data) { + index = newIndex + } else { + return []byte{}, fmt.Errorf("Not enough bytes for the SessionID") + } + + /* Index is at Cipher List Length bits */ + if newIndex := (index + 2 + int((data[index]<<8)+data[index+1])); (newIndex + 1) < len(data) { + index = newIndex + } else { + return []byte{}, fmt.Errorf("Not enough bytes for the Cipher List") + } + + /* Index is now at the compression length bit */ + if newIndex := index + 1 + int(data[index]); newIndex < len(data) { + index = newIndex + } else { + return []byte{}, fmt.Errorf("Not enough bytes for the compression length") + } + + /* Now we're at the Extension start */ + if len(data[index:]) == 0 { + return nil, fmt.Errorf("No extensions") + } + return data[index:], nil +} + +// vim: foldmethod=marker diff --git a/contrib/k8sniff/server.go b/contrib/k8sniff/server.go new file mode 100644 index 0000000000..4100938fce --- /dev/null +++ b/contrib/k8sniff/server.go @@ -0,0 +1,443 @@ +/* {{{ Copyright (c) Paul R. Tagliamonte , 2015 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. }}} */ + +package main + +import ( + "context" + "fmt" + "io" + "math/rand" + "net" + "reflect" + "regexp" + "strings" + "sync" + "time" + + "github.com/golang/glog" + "github.com/kubermatic/k8sniff/metrics" + "github.com/kubermatic/k8sniff/parser" + + v1 "k8s.io/api/core/v1" + netv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/clientcmd" +) + +const ( + // ingressClassKey picks a specific "class" for the Ingress. The controller + // only processes Ingresses with this annotation either unset, or set + // to either nginxIngressClass or the empty string. + ingressClassKey = "kubernetes.io/ingress.class" + + ConnectionClosedErr = "use of closed network connection" + ConnectionResetErr = "connection reset by peer" +) + +// now provides func() time.Time +// so it is easier to mock, if wou want to add tests +var now = time.Now + +type ServerAndRegexp struct { + Server *Server + Regexp *regexp.Regexp +} + +type Proxy struct { + Lock sync.RWMutex + ServerList []ServerAndRegexp + Default *Server +} + +func (p *Proxy) Get(host string) *Server { + p.Lock.RLock() + defer p.Lock.RUnlock() + + for _, tuple := range p.ServerList { + if tuple.Regexp.MatchString(host) { + return tuple.Server + } + } + return p.Default +} + +func (p *Proxy) Update(c *Config) error { + servers := []ServerAndRegexp{} + currentServers := c.Servers + for i, server := range currentServers { + for _, hostname := range server.Names { + var hostRegexp *regexp.Regexp + var err error + if server.Regexp { + hostRegexp, err = regexp.Compile(hostname) + } else { + hostRegexp, err = regexp.Compile("^" + regexp.QuoteMeta(hostname) + "$") + } + if err != nil { + return fmt.Errorf("cannot update proxy due to invalid regex: %v", err) + } + tuple := ServerAndRegexp{¤tServers[i], hostRegexp} + servers = append(servers, tuple) + } + } + var def *Server + for i, server := range currentServers { + if server.Default { + def = ¤tServers[i] + break + } + } + + p.Lock.Lock() + defer p.Lock.Unlock() + p.ServerList = servers + p.Default = def + + return nil +} + +func (c *Config) UpdateServers() error { + class := c.Kubernetes.IngressClass + if class == "" { + class = "k8sniff" + } + + serverForBackend := func(ing *netv1.Ingress, backend *netv1.IngressBackend) (*Server, error) { + obj, found, err := c.serviceStore.GetByKey(fmt.Sprintf("%s/%s", ing.Namespace, backend.Service.Name)) + if err != nil { + return nil, err + } + if !found { + return nil, fmt.Errorf("service %s/%s not found", ing.Namespace, backend.Service.Name) + } + svc := obj.(*v1.Service) + port := int(backend.Service.Port.Number) + return &Server{ + Host: svc.Spec.ClusterIP, + Port: port, + }, nil + } + + servers := []Server{} + ingressList := c.ingressStore.List() + for _, i := range ingressList { + i := i.(*netv1.Ingress) + name := fmt.Sprintf("%s/%s", i.Namespace, i.Name) + if i.Annotations[ingressClassKey] != class { + glog.V(6).Infof("Skipping ingress %s due to missing annotation. Expected %s=%s Got %s=%s", name, ingressClassKey, class, ingressClassKey, i.Annotations[ingressClassKey]) + continue + } + + if i.Spec.DefaultBackend != nil { + s, err := serverForBackend(i, i.Spec.DefaultBackend) + if err != nil { + metrics.IncErrors(metrics.Error) + glog.V(0).Infof("Ingress %s error with default backend, skipping: %v", name, err) + } else { + s.Default = true + servers = append(servers, *s) + } + } + for _, r := range i.Spec.Rules { + if r.HTTP == nil { + metrics.IncErrors(metrics.Error) + glog.V(0).Infof("Ingress %s error with rule, skipping: http must be set", name) + continue + } + for _, p := range r.HTTP.Paths { + if p.Path != "" && p.Path != "/" { + metrics.IncErrors(metrics.Error) + glog.V(0).Infof("Ingress %s error with rule, skipping: path is not empty", name) + continue + } + s, err := serverForBackend(i, &p.Backend) + if err != nil { + metrics.IncErrors(metrics.Error) + glog.V(0).Infof("Ingress %s error with rule %q path %q, skipping: %v", name, r.Host, p.Path, err) + continue + } + s.Names = []string{r.Host} + glog.V(6).Infof("Adding backend %q -> %s:%d", r.Host, s.Host, s.Port) + servers = append(servers, *s) + } + } + } + c.lock.Lock() + defer c.lock.Unlock() + if !reflect.DeepEqual(c.Servers, servers) { + c.Servers = servers + glog.V(2).Infof("Updating proxy configuration") + err := c.proxy.Update(c) + if err != nil { + time.Sleep(time.Second) + return fmt.Errorf("failed to update proxy: %v", err) + } + glog.V(2).Infof("================================================") + glog.V(2).Infof("Updated servers. New servers:") + c.PrintCurrentServers(2) + glog.V(2).Infof("================================================") + } + + metrics.SetBackendCount(len(c.Servers) - 1) + + return nil +} + +func (c *Config) PrintCurrentServers(logLevel glog.Level) { + for _, s := range c.Servers { + hostnames := strings.Join(s.Names, ",") + if hostnames == "" { + hostnames = "default backend" + } + glog.V(logLevel).Infof("%s -> %s", hostnames, s.Host) + } +} + +func (c *Config) Debug() { + glog.V(4).Info("================================================") + glog.V(4).Info("Current configured servers:") + c.PrintCurrentServers(4) + glog.V(4).Info("================================================") +} + +func (c *Config) TriggerUpdate() { + if !c.ControllersHaveSynced() { + return + } + err := c.UpdateServers() + if err != nil { + metrics.IncErrors(metrics.Info) + glog.V(0).Infof("failed to update servers list: %v", err) + } +} + +func (c *Config) ControllersHaveSynced() bool { + return c.ingressController.HasSynced() && c.serviceController.HasSynced() +} + +func (c *Config) Serve(stopCh chan struct{}) error { + glog.V(0).Infof("Listening on %s:%d", c.Bind.Host, c.Bind.Port) + listener, err := net.Listen("tcp", fmt.Sprintf( + "%s:%d", c.Bind.Host, c.Bind.Port, + )) + if err != nil { + metrics.IncErrors(metrics.Fatal) + return err + } + + c.proxy = &Proxy{} + err = c.proxy.Update(c) + if err != nil { + metrics.IncErrors(metrics.Fatal) + return err + } + + if c.Kubernetes != nil { + cfg, err := clientcmd.BuildConfigFromFlags("", c.Kubernetes.Kubeconfig) + if err != nil { + panic(err) + } + c.Kubernetes.Client = kubernetes.NewForConfigOrDie(cfg) + c.ingressStore, c.ingressController = cache.NewInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return c.Kubernetes.Client.NetworkingV1().Ingresses("").List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return c.Kubernetes.Client.NetworkingV1().Ingresses("").Watch(context.TODO(), options) + }, + }, + &netv1.Ingress{}, + 30*time.Minute, + cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + go c.TriggerUpdate() + }, + UpdateFunc: func(old, cur interface{}) { + go c.TriggerUpdate() + }, + DeleteFunc: func(obj interface{}) { + go c.TriggerUpdate() + }, + }, + ) + + c.serviceStore, c.serviceController = cache.NewInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return c.Kubernetes.Client.CoreV1().Services("").List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return c.Kubernetes.Client.CoreV1().Services("").Watch(context.TODO(), options) + }, + }, + &v1.Service{}, + 30*time.Minute, + cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + go c.TriggerUpdate() + }, + UpdateFunc: func(old, cur interface{}) { + go c.TriggerUpdate() + }, + DeleteFunc: func(obj interface{}) { + go c.TriggerUpdate() + }, + }, + ) + + go c.serviceController.Run(stopCh) + go c.ingressController.Run(stopCh) + } + c.TriggerUpdate() + + go wait.Forever(func() { + c.Debug() + }, 30*time.Second) + + for { + conn, err := listener.Accept() + if err != nil { + metrics.IncErrors(metrics.Error) + return err + } + + connectionID := RandomString(8) + glog.V(4).Infof( + "[%s] Proxy: %s -> %s", + connectionID, + conn.RemoteAddr(), + conn.LocalAddr(), + ) + go c.proxy.Handle(conn, connectionID) + } +} + +func (p *Proxy) Handle(conn net.Conn, connectionID string) { + metrics.IncConnections() + start := now() + defer func(s time.Time) { + err := conn.Close() + if err != nil { + glog.V(0).Infof("[%s] Failed closing connection: %v", connectionID, err) + metrics.IncErrors(metrics.Error) + } + metrics.DecConnections() + metrics.ConnectionTime(now().Sub(s)) + }(start) + data := make([]byte, 4096) + + length, err := conn.Read(data) + if err != nil { + metrics.IncErrors(metrics.Error) + glog.V(4).Infof("[%s] Error reading the first 4k of the connection: %v", connectionID, err) + return + } + + var proxy *Server + hostname, hostnameErr := parser.GetHostname(data[:]) + if hostnameErr == nil { + glog.V(6).Infof("[%s] Parsed hostname: %s", connectionID, hostname) + + proxy = p.Get(hostname) + if proxy == nil { + glog.V(4).Infof("[%s] No proxy matched %s", connectionID, hostname) + return + } else { + glog.V(4).Infof("[%s] Host found %s", connectionID, proxy.Host) + } + } else { + glog.V(6).Infof("[%s] Parsed request without hostname", connectionID) + + proxy = p.Default + if proxy == nil { + glog.V(4).Infof("[%s] No default proxy", connectionID) + return + } + } + + clientConn, err := net.Dial("tcp", fmt.Sprintf( + "%s:%d", proxy.Host, proxy.Port, + )) + if err != nil { + metrics.IncErrors(metrics.Error) + glog.V(0).Infof("[%s] Error connecting to backend: %v", connectionID, err) + return + } + + defer func() { + err := clientConn.Close() + if err != nil { + glog.V(0).Infof("[%s] Failed closing client connection: %v", connectionID, err) + metrics.IncErrors(metrics.Error) + } + }() + + n, err := clientConn.Write(data[:length]) + glog.V(7).Infof("[%s] Wrote %d bytes", connectionID, n) + if err != nil { + metrics.IncErrors(metrics.Info) + glog.V(7).Infof("[%s] Error sending data to backend: %v", connectionID, err) + return + } + Copycat(clientConn, conn, connectionID) +} + +func Copycat(client, server net.Conn, connectionID string) { + glog.V(6).Infof("[%s] Initiating copy between %s and %s", connectionID, client.RemoteAddr().String(), server.RemoteAddr().String()) + + doCopy := func(s, c net.Conn, cancel chan<- bool) { + glog.V(7).Infof("[%s] Established connection %s -> %s", connectionID, s.RemoteAddr().String(), c.RemoteAddr().String()) + _, err := io.Copy(s, c) + if err != nil && !strings.Contains(err.Error(), ConnectionClosedErr) && !strings.Contains(err.Error(), ConnectionResetErr) { + glog.V(0).Infof("[%s] Failed copying connection data: %v", connectionID, err) + metrics.IncErrors(metrics.Error) + } + glog.V(7).Infof("[%s] Destroyed connection %s -> %s", connectionID, s.RemoteAddr().String(), c.RemoteAddr().String()) + cancel <- true + } + + cancel := make(chan bool, 2) + + go doCopy(server, client, cancel) + go doCopy(client, server, cancel) + + select { + case <-cancel: + glog.V(6).Infof("[%s] Disconnected", connectionID) + return + } +} + +func RandomString(strlen int) string { + rand.Seed(time.Now().UTC().UnixNano()) + const chars = "abcdefghijklmnopqrstuvwxyz0123456789" + result := make([]byte, strlen) + for i := 0; i < strlen; i++ { + result[i] = chars[rand.Intn(len(chars))] + } + return string(result) +}