From ad0ffb3a39aa89e17b9bddb6ed395cc3984fbe54 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 30 May 2024 16:00:41 -0400 Subject: [PATCH] Move client from github/korrel8r/korrel8r Move client code to its own repo. --- .bingo/.gitignore | 13 + .bingo/README.md | 14 + .bingo/Variables.mk | 31 + .bingo/bingo.mod | 5 + .bingo/bingo.sum | 29 + .bingo/go.mod | 1 + .bingo/golangci-lint.mod | 5 + .bingo/golangci-lint.sum | 910 ++++++++++++++++++ .bingo/variables.env | 14 + CHANGELOG.md | 18 + Makefile | 19 + README.md | 14 + cmd/korrel8rcli/doc.go | 49 + cmd/korrel8rcli/enum_flag.go | 29 + cmd/korrel8rcli/main.go | 48 + cmd/korrel8rcli/operations.go | 97 ++ cmd/korrel8rcli/output.go | 35 + cmd/korrel8rcli/web.go | 47 + go.mod | 104 ++ go.sum | 317 ++++++ hack/tag-release.sh | 16 + pkg/browser/attrs.go | 21 + pkg/browser/browser.go | 95 ++ pkg/browser/correlate.go | 174 ++++ pkg/browser/graph.go | 77 ++ pkg/browser/images/favicon.svg | 206 ++++ pkg/browser/images/gears.gif | Bin 0 -> 35587 bytes pkg/browser/templates/correlate.html.tmpl | 47 + pkg/browser/templates/error.html.tmpl | 4 + pkg/browser/templates/header.html.tmpl | 113 +++ pkg/new_with_url.go | 3 + .../get_domains_domain_classes_parameters.go | 153 +++ .../get_domains_domain_classes_responses.go | 185 ++++ .../operations/get_domains_parameters.go | 130 +++ .../operations/get_domains_responses.go | 185 ++++ .../client/operations/operations_client.go | 260 +++++ .../post_graphs_goals_parameters.go | 190 ++++ .../operations/post_graphs_goals_responses.go | 187 ++++ .../post_graphs_neighbours_parameters.go | 190 ++++ .../post_graphs_neighbours_responses.go | 187 ++++ .../operations/post_lists_goals_parameters.go | 155 +++ .../operations/post_lists_goals_responses.go | 185 ++++ pkg/swagger/client/r_e_s_t_api_client.go | 113 +++ pkg/swagger/models/classes.go | 29 + pkg/swagger/models/domain.go | 120 +++ pkg/swagger/models/edge.go | 130 +++ pkg/swagger/models/goals.go | 115 +++ pkg/swagger/models/graph.go | 185 ++++ pkg/swagger/models/neighbours.go | 114 +++ pkg/swagger/models/node.go | 130 +++ pkg/swagger/models/query_count.go | 55 ++ pkg/swagger/models/rest_constraint.go | 58 ++ pkg/swagger/models/rule.go | 126 +++ pkg/swagger/models/start.go | 120 +++ pkg/swagger/models/store.go | 29 + 55 files changed, 5886 insertions(+) create mode 100644 .bingo/.gitignore create mode 100644 .bingo/README.md create mode 100644 .bingo/Variables.mk create mode 100644 .bingo/bingo.mod create mode 100644 .bingo/bingo.sum create mode 100644 .bingo/go.mod create mode 100644 .bingo/golangci-lint.mod create mode 100644 .bingo/golangci-lint.sum create mode 100644 .bingo/variables.env create mode 100644 CHANGELOG.md create mode 100644 Makefile create mode 100644 README.md create mode 100644 cmd/korrel8rcli/doc.go create mode 100644 cmd/korrel8rcli/enum_flag.go create mode 100644 cmd/korrel8rcli/main.go create mode 100644 cmd/korrel8rcli/operations.go create mode 100644 cmd/korrel8rcli/output.go create mode 100644 cmd/korrel8rcli/web.go create mode 100644 go.mod create mode 100644 go.sum create mode 100755 hack/tag-release.sh create mode 100644 pkg/browser/attrs.go create mode 100644 pkg/browser/browser.go create mode 100644 pkg/browser/correlate.go create mode 100644 pkg/browser/graph.go create mode 100644 pkg/browser/images/favicon.svg create mode 100644 pkg/browser/images/gears.gif create mode 100644 pkg/browser/templates/correlate.html.tmpl create mode 100644 pkg/browser/templates/error.html.tmpl create mode 100644 pkg/browser/templates/header.html.tmpl create mode 100644 pkg/new_with_url.go create mode 100644 pkg/swagger/client/operations/get_domains_domain_classes_parameters.go create mode 100644 pkg/swagger/client/operations/get_domains_domain_classes_responses.go create mode 100644 pkg/swagger/client/operations/get_domains_parameters.go create mode 100644 pkg/swagger/client/operations/get_domains_responses.go create mode 100644 pkg/swagger/client/operations/operations_client.go create mode 100644 pkg/swagger/client/operations/post_graphs_goals_parameters.go create mode 100644 pkg/swagger/client/operations/post_graphs_goals_responses.go create mode 100644 pkg/swagger/client/operations/post_graphs_neighbours_parameters.go create mode 100644 pkg/swagger/client/operations/post_graphs_neighbours_responses.go create mode 100644 pkg/swagger/client/operations/post_lists_goals_parameters.go create mode 100644 pkg/swagger/client/operations/post_lists_goals_responses.go create mode 100644 pkg/swagger/client/r_e_s_t_api_client.go create mode 100644 pkg/swagger/models/classes.go create mode 100644 pkg/swagger/models/domain.go create mode 100644 pkg/swagger/models/edge.go create mode 100644 pkg/swagger/models/goals.go create mode 100644 pkg/swagger/models/graph.go create mode 100644 pkg/swagger/models/neighbours.go create mode 100644 pkg/swagger/models/node.go create mode 100644 pkg/swagger/models/query_count.go create mode 100644 pkg/swagger/models/rest_constraint.go create mode 100644 pkg/swagger/models/rule.go create mode 100644 pkg/swagger/models/start.go create mode 100644 pkg/swagger/models/store.go diff --git a/.bingo/.gitignore b/.bingo/.gitignore new file mode 100644 index 0000000..9efccf6 --- /dev/null +++ b/.bingo/.gitignore @@ -0,0 +1,13 @@ + +# Ignore everything +* + +# But not these files: +!.gitignore +!*.mod +!*.sum +!README.md +!Variables.mk +!variables.env + +*tmp.mod diff --git a/.bingo/README.md b/.bingo/README.md new file mode 100644 index 0000000..7a5c2d4 --- /dev/null +++ b/.bingo/README.md @@ -0,0 +1,14 @@ +# Project Development Dependencies. + +This is directory which stores Go modules with pinned buildable package that is used within this repository, managed by https://github.com/bwplotka/bingo. + +* Run `bingo get` to install all tools having each own module file in this directory. +* Run `bingo get ` to install that have own module file in this directory. +* For Makefile: Make sure to put `include .bingo/Variables.mk` in your Makefile, then use $() variable where is the .bingo/.mod. +* For shell: Run `source .bingo/variables.env` to source all environment variable for each tool. +* For go: Import `.bingo/variables.go` to for variable names. +* See https://github.com/bwplotka/bingo or -h on how to add, remove or change binaries dependencies. + +## Requirements + +* Go 1.14+ diff --git a/.bingo/Variables.mk b/.bingo/Variables.mk new file mode 100644 index 0000000..d9f2d03 --- /dev/null +++ b/.bingo/Variables.mk @@ -0,0 +1,31 @@ +# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.9. DO NOT EDIT. +# All tools are designed to be build inside $GOBIN. +BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST))) +GOPATH ?= $(shell go env GOPATH) +GOBIN ?= $(firstword $(subst :, ,${GOPATH}))/bin +GO ?= $(shell which go) + +# Below generated variables ensure that every time a tool under each variable is invoked, the correct version +# will be used; reinstalling only if needed. +# For example for bingo variable: +# +# In your main Makefile (for non array binaries): +# +#include .bingo/Variables.mk # Assuming -dir was set to .bingo . +# +#command: $(BINGO) +# @echo "Running bingo" +# @$(BINGO) +# +BINGO := $(GOBIN)/bingo-v0.9.0 +$(BINGO): $(BINGO_DIR)/bingo.mod + @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. + @echo "(re)installing $(GOBIN)/bingo-v0.9.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=bingo.mod -o=$(GOBIN)/bingo-v0.9.0 "github.com/bwplotka/bingo" + +GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.59.0 +$(GOLANGCI_LINT): $(BINGO_DIR)/golangci-lint.mod + @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. + @echo "(re)installing $(GOBIN)/golangci-lint-v1.59.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.59.0 "github.com/golangci/golangci-lint/cmd/golangci-lint" + diff --git a/.bingo/bingo.mod b/.bingo/bingo.mod new file mode 100644 index 0000000..654200d --- /dev/null +++ b/.bingo/bingo.mod @@ -0,0 +1,5 @@ +module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT + +go 1.21.10 + +require github.com/bwplotka/bingo v0.9.0 diff --git a/.bingo/bingo.sum b/.bingo/bingo.sum new file mode 100644 index 0000000..f231dd1 --- /dev/null +++ b/.bingo/bingo.sum @@ -0,0 +1,29 @@ +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/bwplotka/bingo v0.9.0 h1:slnsdJYExR4iRalHR6/ZiYnr9vSazOuFGmc2LdX293g= +github.com/bwplotka/bingo v0.9.0/go.mod h1:GxC/y/xbmOK5P29cn+B3HuOSw0s2gruddT3r+rDizDw= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/efficientgo/core v1.0.0-rc.0 h1:jJoA0N+C4/knWYVZ6GrdHOtDyrg8Y/TR4vFpTaqTsqs= +github.com/efficientgo/core v1.0.0-rc.0/go.mod h1:kQa0V74HNYMfuJH6jiPiwNdpWXl4xd/K4tzlrcvYDQI= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +mvdan.cc/sh/v3 v3.7.0 h1:lSTjdP/1xsddtaKfGg7Myu7DnlHItd3/M2tomOcNNBg= +mvdan.cc/sh/v3 v3.7.0/go.mod h1:K2gwkaesF/D7av7Kxl0HbF5kGOd2ArupNTX3X44+8l8= diff --git a/.bingo/go.mod b/.bingo/go.mod new file mode 100644 index 0000000..610249a --- /dev/null +++ b/.bingo/go.mod @@ -0,0 +1 @@ +module _ // Fake go.mod auto-created by 'bingo' for go -moddir compatibility with non-Go projects. Commit this file, together with other .mod files. \ No newline at end of file diff --git a/.bingo/golangci-lint.mod b/.bingo/golangci-lint.mod new file mode 100644 index 0000000..1346671 --- /dev/null +++ b/.bingo/golangci-lint.mod @@ -0,0 +1,5 @@ +module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT + +go 1.21.10 + +require github.com/golangci/golangci-lint v1.59.0 // cmd/golangci-lint diff --git a/.bingo/golangci-lint.sum b/.bingo/golangci-lint.sum new file mode 100644 index 0000000..b3d932f --- /dev/null +++ b/.bingo/golangci-lint.sum @@ -0,0 +1,910 @@ +4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= +4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= +4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= +4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= +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/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/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8= +github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0= +github.com/Abirdcfly/dupword v0.0.14 h1:3U4ulkc8EUo+CaT105/GJ1BQwtgyj6+VaBVbAX11Ba8= +github.com/Abirdcfly/dupword v0.0.14/go.mod h1:VKDAbxdY8YbKUByLGg8EETzYSuC4crm9WwI6Y3S0cLI= +github.com/Antonboom/errname v0.1.13 h1:JHICqsewj/fNckzrfVSe+T33svwQxmjC+1ntDsHOVvM= +github.com/Antonboom/errname v0.1.13/go.mod h1:uWyefRYRN54lBg6HseYCFhs6Qjcy41Y3Jl/dVhA87Ns= +github.com/Antonboom/nilnil v0.1.9 h1:eKFMejSxPSA9eLSensFmjW2XTgTwJMjZ8hUHtV4s/SQ= +github.com/Antonboom/nilnil v0.1.9/go.mod h1:iGe2rYwCq5/Me1khrysB4nwI7swQvjclR8/YRPl5ihQ= +github.com/Antonboom/testifylint v1.3.0 h1:UiqrddKs1W3YK8R0TUuWwrVKlVAnS07DTUVWWs9c+y4= +github.com/Antonboom/testifylint v1.3.0/go.mod h1:NV0hTlteCkViPW9mSR4wEMfwp+Hs1T3dY60bkvSfhpM= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Crocmagnon/fatcontext v0.2.2 h1:OrFlsDdOj9hW/oBEJBNSuH7QWf+E9WPVHw+x52bXVbk= +github.com/Crocmagnon/fatcontext v0.2.2/go.mod h1:WSn/c/+MMNiD8Pri0ahRj0o9jVpeowzavOQplBJw6u0= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0 h1:sATXp1x6/axKxz2Gjxv8MALP0bXaNRfQinEwyfMcx8c= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0/go.mod h1:Nl76DrGNJTA1KJ0LePKBw/vznBX1EHbAZX8mwjR82nI= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= +github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c= +github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= +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/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= +github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= +github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= +github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= +github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= +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/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= +github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v4 v4.2.1 h1:Cxg6u+XDWff75SIFFmNsqnIOgob+Q9hG6y/ioKbRFiM= +github.com/bombsimon/wsl/v4 v4.2.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= +github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY= +github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ= +github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA= +github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U= +github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0= +github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= +github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs= +github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ= +github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= +github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= +github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= +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/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= +github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +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/ckaznocha/intrange v0.1.2 h1:3Y4JAxcMntgb/wABQ6e8Q8leMd26JbX2790lIss9MTI= +github.com/ckaznocha/intrange v0.1.2/go.mod h1:RWffCw/vKBwHeOEwWdCikAtY0q4gGt8VhJZEEA5n+RE= +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/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= +github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= +github.com/daixiang0/gci v0.13.4 h1:61UGkmpoAcxHM2hhNkZEf5SzwQtWJXTSws7jaPyqwlw= +github.com/daixiang0/gci v0.13.4/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +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/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA= +github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk= +github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= +github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU= +github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc= +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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= +github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +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/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/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.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e h1:ULcKCDV1LOZPFxGZaA6TlQbiM3J2GCPnkx/bGF6sX/g= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e/go.mod h1:Pm5KhLPA8gSnQwrQ6ukebRcapGb/BG9iUkdaiCcGHJM= +github.com/golangci/golangci-lint v1.59.0 h1:st69YDnAH/v2QXDcgUaZ0seQajHScPALBVkyitYLXEk= +github.com/golangci/golangci-lint v1.59.0/go.mod h1:QNA32UWdUdHXnu+Ap5/ZU4WVwyp2tL94UxEXrSErjg0= +github.com/golangci/misspell v0.5.1 h1:/SjR1clj5uDjNLwYzCahHwIOPmQgoH04AyQIiWGbhCM= +github.com/golangci/misspell v0.5.1/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= +github.com/golangci/modinfo v0.3.4 h1:oU5huX3fbxqQXdfspamej74DFX0kyGLkw1ppvXoJ8GA= +github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= +github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= +github.com/golangci/revgrep v0.5.3 h1:3tL7c1XBMtWHHqVpS5ChmiAAoe4PF/d5+ULzV9sLAzs= +github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= +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/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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/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/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/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= +github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= +github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jjti/go-spancheck v0.6.1 h1:ZK/wE5Kyi1VX3PJpUO2oEgeoI4FWOUm7Shb2Gbv5obI= +github.com/jjti/go-spancheck v0.6.1/go.mod h1:vF1QkOO159prdo6mHRxak2CpzDpHAfKiPUDP/NeRnX8= +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/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/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= +github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= +github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= +github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= +github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= +github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= +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/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/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= +github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= +github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= +github.com/lasiar/canonicalheader v1.1.1 h1:wC+dY9ZfiqiPwAexUApFush/csSPXeIi4QqyxXmng8I= +github.com/lasiar/canonicalheader v1.1.1/go.mod h1:cXkb3Dlk6XXy+8MVQnF23CYKWlyA7kfQhSw2CcZtZb0= +github.com/ldez/gomoddirectives v0.2.4 h1:j3YjBIjEBbqZ0NKtBNzr8rtMHTOrLPeiwTkfUJZ3alg= +github.com/ldez/gomoddirectives v0.2.4/go.mod h1:oWu9i62VcQDYp9EQ0ONTfqLNh+mDLWWDO+SO0qSQw5g= +github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= +github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= +github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= +github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= +github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= +github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= +github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= +github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= +github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +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/mgechev/revive v1.3.7 h1:502QY0vQGe9KtYJ9FpxMz9rL+Fc/P13CI5POL4uHCcE= +github.com/mgechev/revive v1.3.7/go.mod h1:RJ16jUbF0OWC3co/+XTxmFNgEpUPwnnA0BRllX2aDNA= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +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/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= +github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= +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/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbnVSxfHJk= +github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +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/polyfloyd/go-errorlint v1.5.1 h1:5gHxDjLyyWij7fhfrjYNNlHsUNQeyx0LFQKUelO3RBo= +github.com/polyfloyd/go-errorlint v1.5.1/go.mod h1:sH1QC1pxxi0fFecsVIzBmxtrgd9IF/SkJpA6wqyKAJs= +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.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.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/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/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs= +github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.3.2 h1:CuG27ulzEB1Gu5Dk5gP8PFxSOZ3ptSdP5iI/3IXxM18= +github.com/ryancurrah/gomodguard v1.3.2/go.mod h1:LqdemiFomEjcxOqirbQCb3JFvSxH2JUYMerTFd3sF2o= +github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= +github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= +github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.25.0 h1:IK8SI2QyFzy/2OD2PYnhy84dpfNo9qADrRt6LH8vSzU= +github.com/sashamelentyev/usestdlibvars v1.25.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9 h1:rnO6Zp1YMQwv8AyxzuwsVohljJgp4L0ZqiCgtACsPsc= +github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9/go.mod h1:dg7lPlu/xK/Ut9SedURCoZbVCR4yC7fM65DtH9/CDHs= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= +github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= +github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= +github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= +github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= +github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= +github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= +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/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.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.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= +github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= +github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= +github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.4.16 h1:4ChfhveiNLk4NveAZ9Pu2AN8QZ2nkUGFuadM9lrr5D0= +github.com/tetafro/godot v1.4.16/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= +github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= +github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= +github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= +github.com/tomarrell/wrapcheck/v2 v2.8.3 h1:5ov+Cbhlgi7s/a42BprYoxsr73CbdMUTzE3bRDFASUs= +github.com/tomarrell/wrapcheck/v2 v2.8.3/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= +github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= +github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= +github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= +github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= +github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= +github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= +github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= +github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= +github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= +go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= +go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= +go-simpler.org/sloglint v0.7.0 h1:rMZRxD9MbaGoRFobIOicMxZzum7AXNFDlez6xxJs5V4= +go-simpler.org/sloglint v0.7.0/go.mod h1:g9SXiSWY0JJh4LS39/Q0GxzP/QX2cVcbTOYhDpXrJEs= +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.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +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/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +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/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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +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-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-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +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-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +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-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-20191001151750-bb3f8db39f24/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-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-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-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-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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.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/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-20190321232350-e250d351ecad/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-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-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-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +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-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-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +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-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +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/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/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/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/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/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.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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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.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.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= +honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= +mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= +mvdan.cc/unparam v0.0.0-20240427195214-063aff900ca1 h1:Nykk7fggxChwLK4rUPYESzeIwqsuxXXlFEAh5YhaMRo= +mvdan.cc/unparam v0.0.0-20240427195214-063aff900ca1/go.mod h1:ZzZjEpJDOmx8TdVU6umamY3Xy0UAQUI2DHbf05USVbI= +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= diff --git a/.bingo/variables.env b/.bingo/variables.env new file mode 100644 index 0000000..3d9d6a0 --- /dev/null +++ b/.bingo/variables.env @@ -0,0 +1,14 @@ +# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.9. DO NOT EDIT. +# All tools are designed to be build inside $GOBIN. +# Those variables will work only until 'bingo get' was invoked, or if tools were installed via Makefile's Variables.mk. +GOBIN=${GOBIN:=$(go env GOBIN)} + +if [ -z "$GOBIN" ]; then + GOBIN="$(go env GOPATH)/bin" +fi + + +BINGO="${GOBIN}/bingo-v0.9.0" + +GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.59.0" + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d625fce --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,18 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/) +and this project adheres to [Semantic Versioning](http://semver.org/). + +## [Unreleased] - 2024-05-30 + +## [0.0.1] - 2024-05-30 + +### Added + +First version of `korrel8rcli` command. + - REST client, command line access to a remote korrel8r server. See `korrel8rcli --help` + - Web browser API using data from remote korrel8r server, see `korrel8rcli web --help` + - Client packages for 3rd party use, see ./pkg/swagger + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9ab45ae --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ + +VERSION=0.0.1 + +include .bingo/Variables.mk + +all: build lint test + +build: + go mod tidy + go build ./... + +lint: $(GOLANGCI_LINT) + $(GOLANGCI_LINT) run ./... + +test: + go test ./... + +release: all + hack/tag-release.sh $(VERSION) diff --git a/README.md b/README.md new file mode 100644 index 0000000..daef1c7 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Client library and command for Korrel8r + +[![Build](https://github.com/korrel8r/client/actions/workflows/build.yml/badge.svg)](https://github.com/korrel8r/client/actions/workflows/build.yml) +[![Go Reference](https://pkg.go.dev/badge/github.com/korrel8r/client.svg)](https://pkg.go.dev/github.com/korrel8r/client) + +Client library and command for the [Korrel8r](http://github.com/korrel8r/korrel8r) REST API. + +Installation: + + go install github.com/korrel8r/client/cmd/korrel8rcli@latest + +Command help: + + korrel8rcli help diff --git a/cmd/korrel8rcli/doc.go b/cmd/korrel8rcli/doc.go new file mode 100644 index 0000000..d1e2128 --- /dev/null +++ b/cmd/korrel8rcli/doc.go @@ -0,0 +1,49 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package main + +import ( + "time" + + stdlog "log" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +func init() { + docCmd := &cobra.Command{ + Use: "doc", + Short: "Generate documentation", + } + rootCmd.AddCommand(docCmd) + + manCmd := &cobra.Command{ + Use: "man DIR", + Short: "Generate man pages in directory DIR", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + header := &doc.GenManHeader{ + Title: cmd.Name(), + Section: "1", + Date: func() *time.Time { t := time.Now(); return &t }(), + } + if err := doc.GenManTree(rootCmd, header, args[0]); err != nil { + stdlog.Fatalln(err) + } + }, + } + docCmd.AddCommand(manCmd) + + markdownCmd := &cobra.Command{ + Use: "markdown DIR", + Short: "Generate markdown documentation in directory DIR", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + if err := doc.GenMarkdownTree(rootCmd, args[0]); err != nil { + stdlog.Fatalln(err) + } + }, + } + docCmd.AddCommand(markdownCmd) +} diff --git a/cmd/korrel8rcli/enum_flag.go b/cmd/korrel8rcli/enum_flag.go new file mode 100644 index 0000000..0706636 --- /dev/null +++ b/cmd/korrel8rcli/enum_flag.go @@ -0,0 +1,29 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package main + +import ( + "fmt" + "slices" + "strings" +) + +// EnumFlagValue is a flag value that validates its value is one of a set of allowed values. +type EnumFlagValue struct { + Allowed []string + Value string +} + +// EnumFlag returns an enum flag value with the allowed strings. First one is the default. +func EnumFlag(allowed ...string) *EnumFlagValue { + return &EnumFlagValue{Allowed: allowed, Value: allowed[0]} +} +func (f *EnumFlagValue) String() string { return f.Value } +func (f *EnumFlagValue) Type() string { return fmt.Sprintf("enum(%v)", strings.Join(f.Allowed, ",")) } +func (f *EnumFlagValue) Set(s string) error { + if !slices.Contains(f.Allowed, s) { + return fmt.Errorf("invalid value %q: must be one of %v", s, f.Allowed) + } + f.Value = s + return nil +} diff --git a/cmd/korrel8rcli/main.go b/cmd/korrel8rcli/main.go new file mode 100644 index 0000000..3686425 --- /dev/null +++ b/cmd/korrel8rcli/main.go @@ -0,0 +1,48 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package main + +import ( + _ "embed" + "log" + "net/url" + "path/filepath" + + "os" + + httptransport "github.com/go-openapi/runtime/client" + "github.com/korrel8r/client/pkg/swagger/client" + "github.com/spf13/cobra" +) + +var ( + rootCmd = &cobra.Command{ + Use: "korrel8rcli COMMAND", + Short: "REST client for a remote korrel8r server.", + } + + // Global Flags + output = EnumFlag("yaml", "json-pretty", "json") +) + +func main() { + rootCmd.PersistentFlags().VarP(output, "output", "o", "Output format") + log.SetPrefix(filepath.Base(os.Args[0]) + ": ") + log.SetFlags(0) + check(rootCmd.Execute()) +} + +func check(err error) { + if err != nil { + log.Fatalln(err) + } +} + +func newClient(urlStr string) *client.RESTAPI { + u, err := url.Parse(urlStr) + check(err) + if u.Path == "" { + u.Path = client.DefaultBasePath + } + return client.New(httptransport.New(u.Host, u.Path, []string{u.Scheme}), nil) +} diff --git a/cmd/korrel8rcli/operations.go b/cmd/korrel8rcli/operations.go new file mode 100644 index 0000000..0a04946 --- /dev/null +++ b/cmd/korrel8rcli/operations.go @@ -0,0 +1,97 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package main + +import ( + "os" + + "github.com/korrel8r/client/pkg/swagger/client/operations" + "github.com/korrel8r/client/pkg/swagger/models" + "github.com/spf13/cobra" +) + +// Common flags +var ( + queries []string + class string + objects []string + goals []string + depth int64 + rules bool +) + +func makeStart() *models.Start { + return &models.Start{ + Class: class, + Constraint: nil, // TODO support for constraints. + Objects: objects, + Queries: queries, + } +} + +var domainsCmd = &cobra.Command{ + Use: "domains URL", + Short: "Get a list of domains and store configuration", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + c := newClient(args[0]) + ok, err := c.Operations.GetDomains(&operations.GetDomainsParams{}) + check(err) + NewPrinter(output.String(), os.Stdout)(ok.Payload) + }, +} + +func init() { + rootCmd.AddCommand(domainsCmd) +} + +var neighboursCmd = &cobra.Command{ + Use: "neighbours URL [FLAGS]", + Short: "Get graph of nearest neighbours", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + c := newClient(args[0]) + ok, err := c.Operations.PostGraphsNeighbours(&operations.PostGraphsNeighboursParams{ + Request: &models.Neighbours{ + Depth: depth, + Start: makeStart(), + }, + Rules: &rules, + }) + check(err) + NewPrinter(output.String(), os.Stdout)(ok.Payload) + }, +} + +var goalsCmd = &cobra.Command{ + Use: "goals URL [FLAGS]", + Short: "Get graph of nearest goals", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + c := newClient(args[0]) + ok, err := c.Operations.PostGraphsGoals(&operations.PostGraphsGoalsParams{ + Request: &models.Goals{ + Goals: goals, + Start: makeStart(), + }, + Rules: &rules, + }) + check(err) + NewPrinter(output.String(), os.Stdout)(ok.Payload) + }, +} + +func commonFlags(cmd *cobra.Command) { + rootCmd.AddCommand(cmd) + cmd.Flags().StringArrayVar(&queries, "query", nil, "Query string for start objects, can be multiple.") + cmd.Flags().StringVar(&class, "class", "", "Class for serialized objects") + cmd.Flags().StringArrayVar(&objects, "object", nil, "Serialized start object, can be multiple.") + cmd.Flags().BoolVar(&rules, "rules", false, "Include per-rule information in returned graph.") +} + +func init() { + commonFlags(neighboursCmd) + neighboursCmd.Flags().Int64Var(&depth, "depth", 2, "Depth of neighbourhood search.") + commonFlags(goalsCmd) + goalsCmd.Flags().StringArrayVar(&goals, "goal", nil, "Serialized start goal, can be multiple.") +} diff --git a/cmd/korrel8rcli/output.go b/cmd/korrel8rcli/output.go new file mode 100644 index 0000000..7f73701 --- /dev/null +++ b/cmd/korrel8rcli/output.go @@ -0,0 +1,35 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + + "sigs.k8s.io/yaml" +) + +// NewPrinter returns a function that prints in the chose format to writer. +func NewPrinter(format string, w io.Writer) func(any) { + switch format { + + case "json": + return func(v any) { + if b, err := json.Marshal(v); err != nil { + fmt.Fprintf(w, "%v\n", err) + } else { + fmt.Fprintf(w, "%v\n", string(b)) + } + } + + case "json-pretty": + encoder := json.NewEncoder(w) + encoder.SetIndent("", " ") + return func(v any) { _ = encoder.Encode(v) } + + case "yaml": + return func(v any) { y, _ := yaml.Marshal(v); fmt.Fprintf(w, "%s", y) } + + default: + return func(v any) { fmt.Fprintf(w, "%v", v) } + } +} diff --git a/cmd/korrel8rcli/web.go b/cmd/korrel8rcli/web.go new file mode 100644 index 0000000..df01065 --- /dev/null +++ b/cmd/korrel8rcli/web.go @@ -0,0 +1,47 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package main + +import ( + "log" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/korrel8r/client/pkg/browser" + "github.com/spf13/cobra" +) + +var webCmd = &cobra.Command{ + Use: "web REMOTE-URL [LISTEN-ADDR]", + Short: "Connect to REMOTE-URL and run an HTTP server listening on LISTEN-ADDR (default :8080)", + Args: cobra.RangeArgs(1, 2), + RunE: func(_ *cobra.Command, args []string) error { + remoteURL := args[0] + gin.DefaultWriter = log.Writer() + gin.SetMode(gin.ReleaseMode) + gin.DisableConsoleColor() + router := gin.New() + router.Use(gin.Recovery()) + router.Use(gin.Logger()) + b, err := browser.New(newClient(remoteURL), router) + if err != nil { + return err + } + defer b.Close() + s := http.Server{ + Addr: *addr, + Handler: router, + } + log.Printf("Listening on %v, connected to %v\n", *addr, remoteURL) + return s.ListenAndServe() + }, +} + +var ( + addr *string +) + +func init() { + rootCmd.AddCommand(webCmd) + addr = webCmd.Flags().StringP("addr", "a", ":8080", "Listeing address for web server") +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..7aec605 --- /dev/null +++ b/go.mod @@ -0,0 +1,104 @@ +module github.com/korrel8r/client + +go 1.21 + +require ( + github.com/gin-gonic/gin v1.10.0 + github.com/go-openapi/errors v0.22.0 + github.com/go-openapi/runtime v0.28.0 + github.com/go-openapi/strfmt v0.23.0 + github.com/go-openapi/swag v0.23.0 + github.com/korrel8r/korrel8r v0.6.3 + github.com/spf13/cobra v1.8.0 + gonum.org/v1/gonum v0.15.0 + sigs.k8s.io/yaml v1.4.0 +) + +require ( + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.2 // indirect + github.com/evanphx/json-patch/v5 v5.8.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/validate v0.24.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/mapstructure v1.5.0 // 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/oklog/ulid v1.3.1 // indirect + github.com/openshift/api v0.0.0-20240116232628-6d48d55c0598 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/operator-framework/api v0.21.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/alertmanager v0.26.0 // indirect + github.com/prometheus/client_golang v1.18.0 // indirect + github.com/prometheus/common v0.46.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + go.mongodb.org/mongo-driver v1.14.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/protobuf v1.34.1 // 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/api v0.29.0 // indirect + k8s.io/apimachinery v0.29.0 // indirect + k8s.io/client-go v0.29.0 // indirect + k8s.io/klog/v2 v2.120.0 // indirect + k8s.io/kube-openapi v0.0.0-20240105020646-a37d4de58910 // indirect + k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect + sigs.k8s.io/controller-runtime v0.17.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fb2a00e --- /dev/null +++ b/go.sum @@ -0,0 +1,317 @@ +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +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/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +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/emicklei/go-restful/v3 v3.11.2 h1:1onLa9DcsMYO9P+CXaL0dStDqQ2EHHXLiz+BtnqkLAU= +github.com/emicklei/go-restful/v3 v3.11.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.8.1 h1:iPEdwg0XayoS+E7Mth9JxwUtOgyVxnDTXHtKhZPlZxA= +github.com/evanphx/json-patch/v5 v5.8.1/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= +github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA= +github.com/go-task/slim-sprig v2.20.0+incompatible/go.mod h1:N/mhXZITr/EQAOErEHciKvO1bFei2Lld2Ym6h96pdy0= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/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.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.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20240117000934-35fc243c5815 h1:WzfWbQz/Ze8v6l++GGbGNFZnUShVpP/0xffCPLL+ax8= +github.com/google/pprof v0.0.0-20240117000934-35fc243c5815/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +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 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/korrel8r/korrel8r v0.6.3 h1:/Xp8tnXmC63G+ZEo7C9zqV0e5KbhIQ+oeuq4/1xwZ68= +github.com/korrel8r/korrel8r v0.6.3/go.mod h1:0CiYeZ/836W8ucr00h6OP9ZYUWgeEgyJ5rRVLdnHza4= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/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-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/ginkgo/v2 v2.14.0/go.mod h1:JkUdW7JkN0V6rFvsHcJ478egV3XH9NxpD27Hal/PhZw= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/openshift/api v0.0.0-20240116232628-6d48d55c0598 h1:/a1Ncl3PdwFYzOLJxv2AvoLbsD5LJHYXE0d6cUgdVyk= +github.com/openshift/api v0.0.0-20240116232628-6d48d55c0598/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/operator-framework/api v0.21.0 h1:89LhqGTLskxpPR4siEaorkF9PY3KLI51S5mFxP6q1G8= +github.com/operator-framework/api v0.21.0/go.mod h1:3tsDLxXChMY1KgxO5v1CZQogHNQCIMy14YXkXqA5lT4= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +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/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= +github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +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.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= +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.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/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/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= +golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +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-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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.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/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +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.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.29.0 h1:NiCdQMY1QOp1H8lfRyeEf8eOwV6+0xA6XEE44ohDX2A= +k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= +k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0= +k8s.io/apiextensions-apiserver v0.29.0/go.mod h1:TKmpy3bTS0mr9pylH0nOt/QzQRrW7/h7yLdRForMZwc= +k8s.io/apimachinery v0.29.0 h1:+ACVktwyicPz0oc6MTMLwa2Pw3ouLAfAon1wPLtG48o= +k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= +k8s.io/client-go v0.29.0 h1:KmlDtFcrdUzOYrBhXHgKw5ycWzc3ryPX5mQe0SkG3y8= +k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= +k8s.io/klog/v2 v2.120.0 h1:z+q5mfovBj1fKFxiRzsa2DsJLPIVMk/KFL81LMOfK+8= +k8s.io/klog/v2 v2.120.0/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240105020646-a37d4de58910 h1:1Rp/XEKP5uxPs6QrsngEHAxBjaAR78iJRiJq5Fi7LSU= +k8s.io/kube-openapi v0.0.0-20240105020646-a37d4de58910/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw= +k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ= +k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/controller-runtime v0.17.0 h1:fjJQf8Ukya+VjogLO6/bNX9HE6Y2xpsO5+fyS26ur/s= +sigs.k8s.io/controller-runtime v0.17.0/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= +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.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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/hack/tag-release.sh b/hack/tag-release.sh new file mode 100755 index 0000000..3bdc7a4 --- /dev/null +++ b/hack/tag-release.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Apply and push a release tag. +set -e +VERSION=$1 +[[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[^[:space:]]+)?$ ]] || { + echo "not a semantic version X.Y.Z: $VERSION" + exit 1 +} +[ "$(git status -s)" = "" ] || { + git status + echo "working directory not clean" + exit 1 +} +set -x +git tag "v$VERSION" -a -m "Release $VERSION" +git push --follow-tags diff --git a/pkg/browser/attrs.go b/pkg/browser/attrs.go new file mode 100644 index 0000000..b024c2b --- /dev/null +++ b/pkg/browser/attrs.go @@ -0,0 +1,21 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package browser + +import "gonum.org/v1/gonum/graph/encoding" + +// Attributes for nodes and lines rendered by Graphviz. +type Attrs map[string]string + +var ( + _ encoding.Attributer = Attrs{} + _ encoding.Attributer = Node{} + _ encoding.Attributer = Edge{} +) + +func (a Attrs) Attributes() (enc []encoding.Attribute) { + for k, v := range a { + enc = append(enc, encoding.Attribute{Key: k, Value: v}) + } + return enc +} diff --git a/pkg/browser/browser.go b/pkg/browser/browser.go new file mode 100644 index 0000000..dc3d67b --- /dev/null +++ b/pkg/browser/browser.go @@ -0,0 +1,95 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// package browser implements an HTML UI for web browsers. +package browser + +import ( + "context" + "embed" + "errors" + "html/template" + "io/fs" + "log" + "net/http" + "os" + "path/filepath" + + "github.com/gin-gonic/gin" + "github.com/korrel8r/client/pkg/swagger/client" + "github.com/korrel8r/korrel8r/pkg/domains/k8s" + "github.com/korrel8r/korrel8r/pkg/openshift" +) + +var ( + //go:embed templates + templates embed.FS + //go:embed images + images embed.FS +) + +// Browser implements HTTP handlers for web browsers. +type Browser struct { + client *client.RESTAPI + console *openshift.Console + router *gin.Engine + images http.FileSystem + dir, files string +} + +func New(restClient *client.RESTAPI, router *gin.Engine) (*Browser, error) { + images, err := fs.Sub(images, "images") + if err != nil { + return nil, err + } + b := &Browser{ + client: restClient, + router: router, + images: http.FS(images), + } + if b.dir, err = os.MkdirTemp("", "korrel8r"); err == nil { + b.files = filepath.Join(b.dir, "files") + err = os.Mkdir(b.files, 0700) + } + if err != nil { + return nil, err + } + log.Println("Using temporary directory: ", b.dir) + cfg, err := k8s.GetConfig() + if err != nil { + return nil, err + } + kc, err := k8s.NewClient(cfg) + if err != nil { + return nil, err + } + consoleURL, err := openshift.ConsoleURL(context.Background(), kc) + if err != nil { + return nil, err + } + b.console = openshift.NewConsole(consoleURL, kc) + c := &correlate{Browser: b} + + tmpl := template.Must(template.New("").ParseFS(templates, "templates/*.tmpl")) + router.SetHTMLTemplate(tmpl) + router.GET("/", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, "/correlate") }) + router.GET("/correlate", c.HTML) + router.Static("/files", b.files) + router.StaticFS("/images", b.images) + // Display errors converted into URLs. + router.GET("/error", func(c *gin.Context) { + httpError(c, errors.New(c.Request.URL.Query().Get("err")), http.StatusNotFound) + }) + + return b, nil +} + +// Close should be called on shutdown to clean up external resources. +func (b *Browser) Close() { _ = os.RemoveAll(b.dir) } + +func httpError(c *gin.Context, err error, code int) bool { + if err != nil { + _ = c.Error(err) + c.HTML(code, "error.html.tmpl", c) + } + return err != nil +} diff --git a/pkg/browser/correlate.go b/pkg/browser/correlate.go new file mode 100644 index 0000000..ae127c7 --- /dev/null +++ b/pkg/browser/correlate.go @@ -0,0 +1,174 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package browser + +import ( + _ "embed" + "errors" + "fmt" + "maps" + "net/http" + "net/url" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/korrel8r/client/pkg/swagger/client/operations" + "github.com/korrel8r/client/pkg/swagger/models" + "github.com/korrel8r/korrel8r/pkg/graph" + "gonum.org/v1/gonum/graph/encoding/dot" +) + +// correlate web page handler. +type correlate struct { + URL *url.URL + // URL Query parameter fields + Start string // Start query + Goal string // Goal class or neighbourhood depth + + // Computed fields used by page template. + Depth int + Graph *Graph + Diagram, DiagramTxt, DiagramImg string + ConsoleURL *url.URL + UpdateTime time.Duration + + // Other context + Err error // Accumulated errors from template. + Browser *Browser +} + +// reset the fields to contain only URL query parameters +func (c *correlate) reset(url *url.URL) { + params := url.Query() + app := c.Browser // Save + *c = correlate{ // Overwrite + URL: url, + Start: params.Get("start"), + Goal: params.Get("goal"), + Browser: app, + Graph: NewGraph(nil), + } +} + +func (c *correlate) HTML(gc *gin.Context) { + c.update(gc.Request) + if c.Err != nil { + c.Graph = NewGraph(nil) + } + gc.HTML(http.StatusOK, "correlate.html.tmpl", c) +} + +func (c *correlate) NewStartURL(query string) *url.URL { + values := c.URL.Query() + values.Set("start", query) // Replace start query + u := url.URL(*c.URL) // Copy + u.RawQuery = values.Encode() + return &u +} + +// addErr adds an error to be displayed on the page. +func (c *correlate) addErr(err error, msg ...any) bool { + if err == nil { + return false + } + switch len(msg) { + case 0: // Use err unmodified + case 1: // Use bare msg string as prefix + err = fmt.Errorf("%v: %w", msg[0], err) + default: // Treat msg as printf format + err = fmt.Errorf(msg[0].(string), msg[1:]) + } + c.Err = errors.Join(c.Err, err) + return true +} + +func (c *correlate) update(req *http.Request) { + c.reset(req.URL) + start := models.Start{Queries: []string{c.Start}} + if c.Goal == "" { + c.addErr(errors.New("Must provide a goal class or neighbourhood search depth.")) + return + } + var err error + c.Depth, err = strconv.Atoi(c.Goal) + if err == nil { + ok, err := c.Browser.client.Operations.PostGraphsNeighbours( + &operations.PostGraphsNeighboursParams{ + Request: &models.Neighbours{ + Start: &start, + Depth: int64(c.Depth), + }, + }) + if !c.addErr(err) { + c.Graph = NewGraph(ok.Payload) + } + } else { + ok, err := c.Browser.client.Operations.PostGraphsGoals( + &operations.PostGraphsGoalsParams{ + Request: &models.Goals{ + Start: &start, + Goals: []string{c.Goal}, + }, + }) + if !c.addErr(err) { + c.Graph = NewGraph(ok.Payload) + } + } + c.updateDiagram() +} + +var domainAttrs = map[string]graph.Attrs{ + "k8s": {"shape": "octagon", "fillcolor": "#326CE5", "fontcolor": "white"}, + "log": {"shape": "note", "fillcolor": "goldenrod", "fontname": "Courier"}, + "alert": {"shape": "triangle", "fillcolor": "yellow"}, + "metric": {"shape": "oval", "fillcolor": "wheat"}, + "netobserv": {"shape": "rectangle", "fillcolor": "brick"}, +} + +// updateDiagram generates an SVG diagram via graphviz. +func (c *correlate) updateDiagram() { + if c.Depth > 0 { + c.Graph.GraphAttrs["layout"] = "twopi" + } + nodes := c.Graph.Nodes() + for nodes.Next() { + n := nodes.Node().(*Node) + count := n.Model.Count + a := n.Attrs + a["style"] += "filled" + a["label"] = fmt.Sprintf("%v\n%v", n.Model.Class, count) + a["tooltip"] = fmt.Sprintf("%#+v", n.Model.Queries) + maps.Copy(a, domainAttrs[strings.SplitN(n.Model.Class, ":", 2)[0]]) + } + // Write the graph files + baseName := filepath.Join(c.Browser.dir, "files", "korrel8r") + if gv, err := dot.MarshalMulti(c.Graph, "", "", " "); !c.addErr(err) { + gvFile := baseName + ".txt" + if !c.addErr(os.WriteFile(gvFile, gv, 0664)) { + // Render and write the graph image + svgFile := baseName + ".svg" + if !c.addErr(runDot("dot", "-v", "-Tsvg", "-o", svgFile, gvFile)) { + c.Diagram, _ = filepath.Rel(c.Browser.dir, svgFile) + c.DiagramTxt, _ = filepath.Rel(c.Browser.dir, gvFile) + pngFile := baseName + ".png" + if !c.addErr(runDot("dot", "-v", "-Tpng", "-o", pngFile, gvFile)) { + c.DiagramImg, _ = filepath.Rel(c.Browser.dir, pngFile) + } + } + } + } +} + +func runDot(cmdName string, args ...string) error { + cmd := exec.Command(cmdName, args[1:]...) + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("%v %w: %v", cmdName, err, string(out)) + } + return err +} diff --git a/pkg/browser/graph.go b/pkg/browser/graph.go new file mode 100644 index 0000000..25899d6 --- /dev/null +++ b/pkg/browser/graph.go @@ -0,0 +1,77 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package browser + +import ( + "unsafe" + + "github.com/korrel8r/client/pkg/swagger/models" + "gonum.org/v1/gonum/graph/encoding" + "gonum.org/v1/gonum/graph/multi" +) + +func nodeID(n *models.Node) int64 { return int64(uintptr(unsafe.Pointer(n))) } + +type Graph struct { + Model *models.Graph + GraphAttrs, NodeAttrs, EdgeAttrs Attrs + + nodes map[string]*Node + *multi.DirectedGraph +} + +func NewGraph(mg *models.Graph) *Graph { + g := &Graph{ + DirectedGraph: multi.NewDirectedGraph(), + Model: mg, + GraphAttrs: Attrs{ + "fontname": "Helvetica", + "fontsize": "12", + "splines": "true", + "overlap": "prism", + "overlap_scaling": "-2", + "layout": "dot", + }, + NodeAttrs: Attrs{ + "fontname": "Helveticax", + "fontsize": "12", + }, + EdgeAttrs: Attrs{ + "fontname": "Helvetica", + "fontsize": "12", + }, + + nodes: map[string]*Node{}, + } + if mg == nil { + return g + } + for _, n := range mg.Nodes { + nn := &Node{Model: n, Attrs: Attrs{}} + g.nodes[n.Class] = nn + g.AddNode(nn) + } + for _, e := range mg.Edges { + g.DirectedGraph.SetLine(g.NewLine(g.NodeFor(e.Start), g.NodeFor(e.Goal))) + } + return g +} + +func (g *Graph) DOTID() string { return "korrel8r" } +func (g *Graph) DOTAttributers() (graph, node, edge encoding.Attributer) { + return g.GraphAttrs, g.NodeAttrs, g.EdgeAttrs +} + +type Node struct { + Model *models.Node + Attrs +} + +func (g *Graph) NodeFor(class string) *Node { return g.nodes[class] } +func (n *Node) ID() int64 { return nodeID(n.Model) } + +type Edge struct { + Model *models.Edge + Attrs + multi.Edge +} diff --git a/pkg/browser/images/favicon.svg b/pkg/browser/images/favicon.svg new file mode 100644 index 0000000..3c8d13c --- /dev/null +++ b/pkg/browser/images/favicon.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/browser/images/gears.gif b/pkg/browser/images/gears.gif new file mode 100644 index 0000000000000000000000000000000000000000..5487e4b9fb247b3135baa69ce6a169c8c3b0ff97 GIT binary patch literal 35587 zcmdSAX$>fB<1X34ufw2@qCUP6Aj^)QG55Q6r*7iWVt4Xt8s05-=!g z1gxkC0Z|dfM#Qz)35yyn+K9N8wh>X$+7>8P>p0Ah&V1+pxKICil81TamE@iGeP7r8 zLE6mdn3Xud!7~7;FjY_LlU2#R-MtdAq`9d%Hz#*^XjtGVsHv*S%*Y(*A5erTI@&vm zi;5@4Cpaul<@U<-S?PT@`ho(2PPU#b$S-*H@|CB%XWfCi>?PTQj|Ssn<2o;OmToD1 z|L#4NPSuy|lV>LPUhS3mOPY^1=dQ^eel{#{5!8H9les8!;NE~DQqgg)qj*#C#OnzT zk5jp;GJS4(->tr&=|Lw?oh(>i@amUWp5C5y^>x|Hvj=||j7x~?{JOLB^V0W|@BjVp ze}n%&KScj#&rQi(kfc_1lS>MaCqz)j~PJ|#=o*V5v93SahFTz zaHfObv;;Qwxc&EC-oDO4L9Z|rs7}zgXF>9@C(3QWafvXf7-XM7cPzp3QZ)PYJN0oL zFQ4A{pwYu=kwDOqBe}5DV@0y>XihT6ITB~)cXc^aouWSj*h+EI_C=5ycA(>3eagh_ zl4KL#5RdUahtPcW>UQU{+OhsUVtB`*No20zr8=X2!2NbfimZe}2STTuwKR>!2GLFx z4j2PQy7A>Ib_babMjzGL5j{ z1>feyx2P0U-RMTI8Xl0Bv}Kp>y_7@-I;vbdhBj0`n;%0D_;;(Gmx#6|8?b-Tdd6H6^N5S*Ay_Y+( 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 V44?!NutBlt$j3hVaS(w306P|(Hz@!B literal 0 HcmV?d00001 diff --git a/pkg/browser/templates/correlate.html.tmpl b/pkg/browser/templates/correlate.html.tmpl new file mode 100644 index 0000000..2dcd7d8 --- /dev/null +++ b/pkg/browser/templates/correlate.html.tmpl @@ -0,0 +1,47 @@ +{{template "header.html.tmpl" .}} + +
+
+ + +
+
+
+ + +
+
+

+ + +

+
+ + + +
+ {{with .Err}} +
+

Errors

+
{{printf "%+v" .}}
+ {{end}} + + {{if .Diagram}} +
+

Diagram

+

+
+ Image + Source +

+ {{end}} +
+ diff --git a/pkg/browser/templates/error.html.tmpl b/pkg/browser/templates/error.html.tmpl new file mode 100644 index 0000000..246edbc --- /dev/null +++ b/pkg/browser/templates/error.html.tmpl @@ -0,0 +1,4 @@ +{{template "header.html.tmpl ."}} + +

{{.Errors}}

+ diff --git a/pkg/browser/templates/header.html.tmpl b/pkg/browser/templates/header.html.tmpl new file mode 100644 index 0000000..855a6b1 --- /dev/null +++ b/pkg/browser/templates/header.html.tmpl @@ -0,0 +1,113 @@ + + + Korrel8r Web UI + + + + + + + + + + + + +
+ + diff --git a/pkg/new_with_url.go b/pkg/new_with_url.go new file mode 100644 index 0000000..6f8f35c --- /dev/null +++ b/pkg/new_with_url.go @@ -0,0 +1,3 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +package client diff --git a/pkg/swagger/client/operations/get_domains_domain_classes_parameters.go b/pkg/swagger/client/operations/get_domains_domain_classes_parameters.go new file mode 100644 index 0000000..3f1a927 --- /dev/null +++ b/pkg/swagger/client/operations/get_domains_domain_classes_parameters.go @@ -0,0 +1,153 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// NewGetDomainsDomainClassesParams creates a new GetDomainsDomainClassesParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewGetDomainsDomainClassesParams() *GetDomainsDomainClassesParams { + return &GetDomainsDomainClassesParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewGetDomainsDomainClassesParamsWithTimeout creates a new GetDomainsDomainClassesParams object +// with the ability to set a timeout on a request. +func NewGetDomainsDomainClassesParamsWithTimeout(timeout time.Duration) *GetDomainsDomainClassesParams { + return &GetDomainsDomainClassesParams{ + timeout: timeout, + } +} + +// NewGetDomainsDomainClassesParamsWithContext creates a new GetDomainsDomainClassesParams object +// with the ability to set a context for a request. +func NewGetDomainsDomainClassesParamsWithContext(ctx context.Context) *GetDomainsDomainClassesParams { + return &GetDomainsDomainClassesParams{ + Context: ctx, + } +} + +// NewGetDomainsDomainClassesParamsWithHTTPClient creates a new GetDomainsDomainClassesParams object +// with the ability to set a custom HTTPClient for a request. +func NewGetDomainsDomainClassesParamsWithHTTPClient(client *http.Client) *GetDomainsDomainClassesParams { + return &GetDomainsDomainClassesParams{ + HTTPClient: client, + } +} + +/* +GetDomainsDomainClassesParams contains all the parameters to send to the API endpoint + + for the get domains domain classes operation. + + Typically these are written to a http.Request. +*/ +type GetDomainsDomainClassesParams struct { + + /* Domain. + + Domain name + */ + Domain string + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the get domains domain classes params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetDomainsDomainClassesParams) WithDefaults() *GetDomainsDomainClassesParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the get domains domain classes params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetDomainsDomainClassesParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) WithTimeout(timeout time.Duration) *GetDomainsDomainClassesParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) WithContext(ctx context.Context) *GetDomainsDomainClassesParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) WithHTTPClient(client *http.Client) *GetDomainsDomainClassesParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithDomain adds the domain to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) WithDomain(domain string) *GetDomainsDomainClassesParams { + o.SetDomain(domain) + return o +} + +// SetDomain adds the domain to the get domains domain classes params +func (o *GetDomainsDomainClassesParams) SetDomain(domain string) { + o.Domain = domain +} + +// WriteToRequest writes these params to a swagger request +func (o *GetDomainsDomainClassesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + + // path param domain + if err := r.SetPathParam("domain", o.Domain); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/pkg/swagger/client/operations/get_domains_domain_classes_responses.go b/pkg/swagger/client/operations/get_domains_domain_classes_responses.go new file mode 100644 index 0000000..6b14fa4 --- /dev/null +++ b/pkg/swagger/client/operations/get_domains_domain_classes_responses.go @@ -0,0 +1,185 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// GetDomainsDomainClassesReader is a Reader for the GetDomainsDomainClasses structure. +type GetDomainsDomainClassesReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *GetDomainsDomainClassesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewGetDomainsDomainClassesOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewGetDomainsDomainClassesDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewGetDomainsDomainClassesOK creates a GetDomainsDomainClassesOK with default headers values +func NewGetDomainsDomainClassesOK() *GetDomainsDomainClassesOK { + return &GetDomainsDomainClassesOK{} +} + +/* +GetDomainsDomainClassesOK describes a response with status code 200, with default header values. + +OK +*/ +type GetDomainsDomainClassesOK struct { + Payload models.Classes +} + +// IsSuccess returns true when this get domains domain classes o k response has a 2xx status code +func (o *GetDomainsDomainClassesOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this get domains domain classes o k response has a 3xx status code +func (o *GetDomainsDomainClassesOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get domains domain classes o k response has a 4xx status code +func (o *GetDomainsDomainClassesOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this get domains domain classes o k response has a 5xx status code +func (o *GetDomainsDomainClassesOK) IsServerError() bool { + return false +} + +// IsCode returns true when this get domains domain classes o k response a status code equal to that given +func (o *GetDomainsDomainClassesOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the get domains domain classes o k response +func (o *GetDomainsDomainClassesOK) Code() int { + return 200 +} + +func (o *GetDomainsDomainClassesOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains/{domain}/classes][%d] getDomainsDomainClassesOK %s", 200, payload) +} + +func (o *GetDomainsDomainClassesOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains/{domain}/classes][%d] getDomainsDomainClassesOK %s", 200, payload) +} + +func (o *GetDomainsDomainClassesOK) GetPayload() models.Classes { + return o.Payload +} + +func (o *GetDomainsDomainClassesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewGetDomainsDomainClassesDefault creates a GetDomainsDomainClassesDefault with default headers values +func NewGetDomainsDomainClassesDefault(code int) *GetDomainsDomainClassesDefault { + return &GetDomainsDomainClassesDefault{ + _statusCode: code, + } +} + +/* +GetDomainsDomainClassesDefault describes a response with status code -1, with default header values. + +GetDomainsDomainClassesDefault get domains domain classes default +*/ +type GetDomainsDomainClassesDefault struct { + _statusCode int + + Payload string +} + +// IsSuccess returns true when this get domains domain classes default response has a 2xx status code +func (o *GetDomainsDomainClassesDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this get domains domain classes default response has a 3xx status code +func (o *GetDomainsDomainClassesDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this get domains domain classes default response has a 4xx status code +func (o *GetDomainsDomainClassesDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this get domains domain classes default response has a 5xx status code +func (o *GetDomainsDomainClassesDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this get domains domain classes default response a status code equal to that given +func (o *GetDomainsDomainClassesDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the get domains domain classes default response +func (o *GetDomainsDomainClassesDefault) Code() int { + return o._statusCode +} + +func (o *GetDomainsDomainClassesDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains/{domain}/classes][%d] GetDomainsDomainClasses default %s", o._statusCode, payload) +} + +func (o *GetDomainsDomainClassesDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains/{domain}/classes][%d] GetDomainsDomainClasses default %s", o._statusCode, payload) +} + +func (o *GetDomainsDomainClassesDefault) GetPayload() string { + return o.Payload +} + +func (o *GetDomainsDomainClassesDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/pkg/swagger/client/operations/get_domains_parameters.go b/pkg/swagger/client/operations/get_domains_parameters.go new file mode 100644 index 0000000..1725ea6 --- /dev/null +++ b/pkg/swagger/client/operations/get_domains_parameters.go @@ -0,0 +1,130 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// NewGetDomainsParams creates a new GetDomainsParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewGetDomainsParams() *GetDomainsParams { + return &GetDomainsParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewGetDomainsParamsWithTimeout creates a new GetDomainsParams object +// with the ability to set a timeout on a request. +func NewGetDomainsParamsWithTimeout(timeout time.Duration) *GetDomainsParams { + return &GetDomainsParams{ + timeout: timeout, + } +} + +// NewGetDomainsParamsWithContext creates a new GetDomainsParams object +// with the ability to set a context for a request. +func NewGetDomainsParamsWithContext(ctx context.Context) *GetDomainsParams { + return &GetDomainsParams{ + Context: ctx, + } +} + +// NewGetDomainsParamsWithHTTPClient creates a new GetDomainsParams object +// with the ability to set a custom HTTPClient for a request. +func NewGetDomainsParamsWithHTTPClient(client *http.Client) *GetDomainsParams { + return &GetDomainsParams{ + HTTPClient: client, + } +} + +/* +GetDomainsParams contains all the parameters to send to the API endpoint + + for the get domains operation. + + Typically these are written to a http.Request. +*/ +type GetDomainsParams struct { + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the get domains params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetDomainsParams) WithDefaults() *GetDomainsParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the get domains params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetDomainsParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the get domains params +func (o *GetDomainsParams) WithTimeout(timeout time.Duration) *GetDomainsParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the get domains params +func (o *GetDomainsParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the get domains params +func (o *GetDomainsParams) WithContext(ctx context.Context) *GetDomainsParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the get domains params +func (o *GetDomainsParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the get domains params +func (o *GetDomainsParams) WithHTTPClient(client *http.Client) *GetDomainsParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the get domains params +func (o *GetDomainsParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WriteToRequest writes these params to a swagger request +func (o *GetDomainsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/pkg/swagger/client/operations/get_domains_responses.go b/pkg/swagger/client/operations/get_domains_responses.go new file mode 100644 index 0000000..aa07591 --- /dev/null +++ b/pkg/swagger/client/operations/get_domains_responses.go @@ -0,0 +1,185 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// GetDomainsReader is a Reader for the GetDomains structure. +type GetDomainsReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *GetDomainsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewGetDomainsOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewGetDomainsDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewGetDomainsOK creates a GetDomainsOK with default headers values +func NewGetDomainsOK() *GetDomainsOK { + return &GetDomainsOK{} +} + +/* +GetDomainsOK describes a response with status code 200, with default header values. + +OK +*/ +type GetDomainsOK struct { + Payload []*models.Domain +} + +// IsSuccess returns true when this get domains o k response has a 2xx status code +func (o *GetDomainsOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this get domains o k response has a 3xx status code +func (o *GetDomainsOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get domains o k response has a 4xx status code +func (o *GetDomainsOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this get domains o k response has a 5xx status code +func (o *GetDomainsOK) IsServerError() bool { + return false +} + +// IsCode returns true when this get domains o k response a status code equal to that given +func (o *GetDomainsOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the get domains o k response +func (o *GetDomainsOK) Code() int { + return 200 +} + +func (o *GetDomainsOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains][%d] getDomainsOK %s", 200, payload) +} + +func (o *GetDomainsOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains][%d] getDomainsOK %s", 200, payload) +} + +func (o *GetDomainsOK) GetPayload() []*models.Domain { + return o.Payload +} + +func (o *GetDomainsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewGetDomainsDefault creates a GetDomainsDefault with default headers values +func NewGetDomainsDefault(code int) *GetDomainsDefault { + return &GetDomainsDefault{ + _statusCode: code, + } +} + +/* +GetDomainsDefault describes a response with status code -1, with default header values. + +GetDomainsDefault get domains default +*/ +type GetDomainsDefault struct { + _statusCode int + + Payload string +} + +// IsSuccess returns true when this get domains default response has a 2xx status code +func (o *GetDomainsDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this get domains default response has a 3xx status code +func (o *GetDomainsDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this get domains default response has a 4xx status code +func (o *GetDomainsDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this get domains default response has a 5xx status code +func (o *GetDomainsDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this get domains default response a status code equal to that given +func (o *GetDomainsDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the get domains default response +func (o *GetDomainsDefault) Code() int { + return o._statusCode +} + +func (o *GetDomainsDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains][%d] GetDomains default %s", o._statusCode, payload) +} + +func (o *GetDomainsDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[GET /domains][%d] GetDomains default %s", o._statusCode, payload) +} + +func (o *GetDomainsDefault) GetPayload() string { + return o.Payload +} + +func (o *GetDomainsDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/pkg/swagger/client/operations/operations_client.go b/pkg/swagger/client/operations/operations_client.go new file mode 100644 index 0000000..a93155b --- /dev/null +++ b/pkg/swagger/client/operations/operations_client.go @@ -0,0 +1,260 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "github.com/go-openapi/runtime" + httptransport "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// New creates a new operations API client. +func New(transport runtime.ClientTransport, formats strfmt.Registry) ClientService { + return &Client{transport: transport, formats: formats} +} + +// New creates a new operations API client with basic auth credentials. +// It takes the following parameters: +// - host: http host (github.com). +// - basePath: any base path for the API client ("/v1", "/v3"). +// - scheme: http scheme ("http", "https"). +// - user: user for basic authentication header. +// - password: password for basic authentication header. +func NewClientWithBasicAuth(host, basePath, scheme, user, password string) ClientService { + transport := httptransport.New(host, basePath, []string{scheme}) + transport.DefaultAuthentication = httptransport.BasicAuth(user, password) + return &Client{transport: transport, formats: strfmt.Default} +} + +// New creates a new operations API client with a bearer token for authentication. +// It takes the following parameters: +// - host: http host (github.com). +// - basePath: any base path for the API client ("/v1", "/v3"). +// - scheme: http scheme ("http", "https"). +// - bearerToken: bearer token for Bearer authentication header. +func NewClientWithBearerToken(host, basePath, scheme, bearerToken string) ClientService { + transport := httptransport.New(host, basePath, []string{scheme}) + transport.DefaultAuthentication = httptransport.BearerToken(bearerToken) + return &Client{transport: transport, formats: strfmt.Default} +} + +/* +Client for operations API +*/ +type Client struct { + transport runtime.ClientTransport + formats strfmt.Registry +} + +// ClientOption may be used to customize the behavior of Client methods. +type ClientOption func(*runtime.ClientOperation) + +// ClientService is the interface for Client methods +type ClientService interface { + GetDomains(params *GetDomainsParams, opts ...ClientOption) (*GetDomainsOK, error) + + GetDomainsDomainClasses(params *GetDomainsDomainClassesParams, opts ...ClientOption) (*GetDomainsDomainClassesOK, error) + + PostGraphsGoals(params *PostGraphsGoalsParams, opts ...ClientOption) (*PostGraphsGoalsOK, error) + + PostGraphsNeighbours(params *PostGraphsNeighboursParams, opts ...ClientOption) (*PostGraphsNeighboursOK, error) + + PostListsGoals(params *PostListsGoalsParams, opts ...ClientOption) (*PostListsGoalsOK, error) + + SetTransport(transport runtime.ClientTransport) +} + +/* +GetDomains gets name configuration and status for each domain +*/ +func (a *Client) GetDomains(params *GetDomainsParams, opts ...ClientOption) (*GetDomainsOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewGetDomainsParams() + } + op := &runtime.ClientOperation{ + ID: "GetDomains", + Method: "GET", + PathPattern: "/domains", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &GetDomainsReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*GetDomainsOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*GetDomainsDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +GetDomainsDomainClasses gets class names and descriptions for a domain +*/ +func (a *Client) GetDomainsDomainClasses(params *GetDomainsDomainClassesParams, opts ...ClientOption) (*GetDomainsDomainClassesOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewGetDomainsDomainClassesParams() + } + op := &runtime.ClientOperation{ + ID: "GetDomainsDomainClasses", + Method: "GET", + PathPattern: "/domains/{domain}/classes", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &GetDomainsDomainClassesReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*GetDomainsDomainClassesOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*GetDomainsDomainClassesDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +PostGraphsGoals creates a correlation graph from start objects to goal queries +*/ +func (a *Client) PostGraphsGoals(params *PostGraphsGoalsParams, opts ...ClientOption) (*PostGraphsGoalsOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewPostGraphsGoalsParams() + } + op := &runtime.ClientOperation{ + ID: "PostGraphsGoals", + Method: "POST", + PathPattern: "/graphs/goals", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &PostGraphsGoalsReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*PostGraphsGoalsOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*PostGraphsGoalsDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +PostGraphsNeighbours creates a neighbourhood graph around a start object to a given depth +*/ +func (a *Client) PostGraphsNeighbours(params *PostGraphsNeighboursParams, opts ...ClientOption) (*PostGraphsNeighboursOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewPostGraphsNeighboursParams() + } + op := &runtime.ClientOperation{ + ID: "PostGraphsNeighbours", + Method: "POST", + PathPattern: "/graphs/neighbours", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &PostGraphsNeighboursReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*PostGraphsNeighboursOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*PostGraphsNeighboursDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +/* +PostListsGoals creates a list of goal nodes related to a starting point +*/ +func (a *Client) PostListsGoals(params *PostListsGoalsParams, opts ...ClientOption) (*PostListsGoalsOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewPostListsGoalsParams() + } + op := &runtime.ClientOperation{ + ID: "PostListsGoals", + Method: "POST", + PathPattern: "/lists/goals", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &PostListsGoalsReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*PostListsGoalsOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*PostListsGoalsDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + +// SetTransport changes the transport on the client +func (a *Client) SetTransport(transport runtime.ClientTransport) { + a.transport = transport +} diff --git a/pkg/swagger/client/operations/post_graphs_goals_parameters.go b/pkg/swagger/client/operations/post_graphs_goals_parameters.go new file mode 100644 index 0000000..9fbea9f --- /dev/null +++ b/pkg/swagger/client/operations/post_graphs_goals_parameters.go @@ -0,0 +1,190 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// NewPostGraphsGoalsParams creates a new PostGraphsGoalsParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewPostGraphsGoalsParams() *PostGraphsGoalsParams { + return &PostGraphsGoalsParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewPostGraphsGoalsParamsWithTimeout creates a new PostGraphsGoalsParams object +// with the ability to set a timeout on a request. +func NewPostGraphsGoalsParamsWithTimeout(timeout time.Duration) *PostGraphsGoalsParams { + return &PostGraphsGoalsParams{ + timeout: timeout, + } +} + +// NewPostGraphsGoalsParamsWithContext creates a new PostGraphsGoalsParams object +// with the ability to set a context for a request. +func NewPostGraphsGoalsParamsWithContext(ctx context.Context) *PostGraphsGoalsParams { + return &PostGraphsGoalsParams{ + Context: ctx, + } +} + +// NewPostGraphsGoalsParamsWithHTTPClient creates a new PostGraphsGoalsParams object +// with the ability to set a custom HTTPClient for a request. +func NewPostGraphsGoalsParamsWithHTTPClient(client *http.Client) *PostGraphsGoalsParams { + return &PostGraphsGoalsParams{ + HTTPClient: client, + } +} + +/* +PostGraphsGoalsParams contains all the parameters to send to the API endpoint + + for the post graphs goals operation. + + Typically these are written to a http.Request. +*/ +type PostGraphsGoalsParams struct { + + /* Request. + + search from start to goal classes + */ + Request *models.Goals + + /* Rules. + + include rules in graph edges + */ + Rules *bool + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the post graphs goals params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *PostGraphsGoalsParams) WithDefaults() *PostGraphsGoalsParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the post graphs goals params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *PostGraphsGoalsParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the post graphs goals params +func (o *PostGraphsGoalsParams) WithTimeout(timeout time.Duration) *PostGraphsGoalsParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the post graphs goals params +func (o *PostGraphsGoalsParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the post graphs goals params +func (o *PostGraphsGoalsParams) WithContext(ctx context.Context) *PostGraphsGoalsParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the post graphs goals params +func (o *PostGraphsGoalsParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the post graphs goals params +func (o *PostGraphsGoalsParams) WithHTTPClient(client *http.Client) *PostGraphsGoalsParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the post graphs goals params +func (o *PostGraphsGoalsParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithRequest adds the request to the post graphs goals params +func (o *PostGraphsGoalsParams) WithRequest(request *models.Goals) *PostGraphsGoalsParams { + o.SetRequest(request) + return o +} + +// SetRequest adds the request to the post graphs goals params +func (o *PostGraphsGoalsParams) SetRequest(request *models.Goals) { + o.Request = request +} + +// WithRules adds the rules to the post graphs goals params +func (o *PostGraphsGoalsParams) WithRules(rules *bool) *PostGraphsGoalsParams { + o.SetRules(rules) + return o +} + +// SetRules adds the rules to the post graphs goals params +func (o *PostGraphsGoalsParams) SetRules(rules *bool) { + o.Rules = rules +} + +// WriteToRequest writes these params to a swagger request +func (o *PostGraphsGoalsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if o.Request != nil { + if err := r.SetBodyParam(o.Request); err != nil { + return err + } + } + + if o.Rules != nil { + + // query param rules + var qrRules bool + + if o.Rules != nil { + qrRules = *o.Rules + } + qRules := swag.FormatBool(qrRules) + if qRules != "" { + + if err := r.SetQueryParam("rules", qRules); err != nil { + return err + } + } + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/pkg/swagger/client/operations/post_graphs_goals_responses.go b/pkg/swagger/client/operations/post_graphs_goals_responses.go new file mode 100644 index 0000000..1a0f2e0 --- /dev/null +++ b/pkg/swagger/client/operations/post_graphs_goals_responses.go @@ -0,0 +1,187 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// PostGraphsGoalsReader is a Reader for the PostGraphsGoals structure. +type PostGraphsGoalsReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *PostGraphsGoalsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewPostGraphsGoalsOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewPostGraphsGoalsDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewPostGraphsGoalsOK creates a PostGraphsGoalsOK with default headers values +func NewPostGraphsGoalsOK() *PostGraphsGoalsOK { + return &PostGraphsGoalsOK{} +} + +/* +PostGraphsGoalsOK describes a response with status code 200, with default header values. + +OK +*/ +type PostGraphsGoalsOK struct { + Payload *models.Graph +} + +// IsSuccess returns true when this post graphs goals o k response has a 2xx status code +func (o *PostGraphsGoalsOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this post graphs goals o k response has a 3xx status code +func (o *PostGraphsGoalsOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this post graphs goals o k response has a 4xx status code +func (o *PostGraphsGoalsOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this post graphs goals o k response has a 5xx status code +func (o *PostGraphsGoalsOK) IsServerError() bool { + return false +} + +// IsCode returns true when this post graphs goals o k response a status code equal to that given +func (o *PostGraphsGoalsOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the post graphs goals o k response +func (o *PostGraphsGoalsOK) Code() int { + return 200 +} + +func (o *PostGraphsGoalsOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/goals][%d] postGraphsGoalsOK %s", 200, payload) +} + +func (o *PostGraphsGoalsOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/goals][%d] postGraphsGoalsOK %s", 200, payload) +} + +func (o *PostGraphsGoalsOK) GetPayload() *models.Graph { + return o.Payload +} + +func (o *PostGraphsGoalsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + o.Payload = new(models.Graph) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewPostGraphsGoalsDefault creates a PostGraphsGoalsDefault with default headers values +func NewPostGraphsGoalsDefault(code int) *PostGraphsGoalsDefault { + return &PostGraphsGoalsDefault{ + _statusCode: code, + } +} + +/* +PostGraphsGoalsDefault describes a response with status code -1, with default header values. + +PostGraphsGoalsDefault post graphs goals default +*/ +type PostGraphsGoalsDefault struct { + _statusCode int + + Payload string +} + +// IsSuccess returns true when this post graphs goals default response has a 2xx status code +func (o *PostGraphsGoalsDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this post graphs goals default response has a 3xx status code +func (o *PostGraphsGoalsDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this post graphs goals default response has a 4xx status code +func (o *PostGraphsGoalsDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this post graphs goals default response has a 5xx status code +func (o *PostGraphsGoalsDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this post graphs goals default response a status code equal to that given +func (o *PostGraphsGoalsDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the post graphs goals default response +func (o *PostGraphsGoalsDefault) Code() int { + return o._statusCode +} + +func (o *PostGraphsGoalsDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/goals][%d] PostGraphsGoals default %s", o._statusCode, payload) +} + +func (o *PostGraphsGoalsDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/goals][%d] PostGraphsGoals default %s", o._statusCode, payload) +} + +func (o *PostGraphsGoalsDefault) GetPayload() string { + return o.Payload +} + +func (o *PostGraphsGoalsDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/pkg/swagger/client/operations/post_graphs_neighbours_parameters.go b/pkg/swagger/client/operations/post_graphs_neighbours_parameters.go new file mode 100644 index 0000000..5e8fc22 --- /dev/null +++ b/pkg/swagger/client/operations/post_graphs_neighbours_parameters.go @@ -0,0 +1,190 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// NewPostGraphsNeighboursParams creates a new PostGraphsNeighboursParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewPostGraphsNeighboursParams() *PostGraphsNeighboursParams { + return &PostGraphsNeighboursParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewPostGraphsNeighboursParamsWithTimeout creates a new PostGraphsNeighboursParams object +// with the ability to set a timeout on a request. +func NewPostGraphsNeighboursParamsWithTimeout(timeout time.Duration) *PostGraphsNeighboursParams { + return &PostGraphsNeighboursParams{ + timeout: timeout, + } +} + +// NewPostGraphsNeighboursParamsWithContext creates a new PostGraphsNeighboursParams object +// with the ability to set a context for a request. +func NewPostGraphsNeighboursParamsWithContext(ctx context.Context) *PostGraphsNeighboursParams { + return &PostGraphsNeighboursParams{ + Context: ctx, + } +} + +// NewPostGraphsNeighboursParamsWithHTTPClient creates a new PostGraphsNeighboursParams object +// with the ability to set a custom HTTPClient for a request. +func NewPostGraphsNeighboursParamsWithHTTPClient(client *http.Client) *PostGraphsNeighboursParams { + return &PostGraphsNeighboursParams{ + HTTPClient: client, + } +} + +/* +PostGraphsNeighboursParams contains all the parameters to send to the API endpoint + + for the post graphs neighbours operation. + + Typically these are written to a http.Request. +*/ +type PostGraphsNeighboursParams struct { + + /* Request. + + search from neighbours + */ + Request *models.Neighbours + + /* Rules. + + include rules in graph edges + */ + Rules *bool + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the post graphs neighbours params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *PostGraphsNeighboursParams) WithDefaults() *PostGraphsNeighboursParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the post graphs neighbours params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *PostGraphsNeighboursParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) WithTimeout(timeout time.Duration) *PostGraphsNeighboursParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) WithContext(ctx context.Context) *PostGraphsNeighboursParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) WithHTTPClient(client *http.Client) *PostGraphsNeighboursParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithRequest adds the request to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) WithRequest(request *models.Neighbours) *PostGraphsNeighboursParams { + o.SetRequest(request) + return o +} + +// SetRequest adds the request to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) SetRequest(request *models.Neighbours) { + o.Request = request +} + +// WithRules adds the rules to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) WithRules(rules *bool) *PostGraphsNeighboursParams { + o.SetRules(rules) + return o +} + +// SetRules adds the rules to the post graphs neighbours params +func (o *PostGraphsNeighboursParams) SetRules(rules *bool) { + o.Rules = rules +} + +// WriteToRequest writes these params to a swagger request +func (o *PostGraphsNeighboursParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if o.Request != nil { + if err := r.SetBodyParam(o.Request); err != nil { + return err + } + } + + if o.Rules != nil { + + // query param rules + var qrRules bool + + if o.Rules != nil { + qrRules = *o.Rules + } + qRules := swag.FormatBool(qrRules) + if qRules != "" { + + if err := r.SetQueryParam("rules", qRules); err != nil { + return err + } + } + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/pkg/swagger/client/operations/post_graphs_neighbours_responses.go b/pkg/swagger/client/operations/post_graphs_neighbours_responses.go new file mode 100644 index 0000000..3ef07ff --- /dev/null +++ b/pkg/swagger/client/operations/post_graphs_neighbours_responses.go @@ -0,0 +1,187 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// PostGraphsNeighboursReader is a Reader for the PostGraphsNeighbours structure. +type PostGraphsNeighboursReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *PostGraphsNeighboursReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewPostGraphsNeighboursOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewPostGraphsNeighboursDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewPostGraphsNeighboursOK creates a PostGraphsNeighboursOK with default headers values +func NewPostGraphsNeighboursOK() *PostGraphsNeighboursOK { + return &PostGraphsNeighboursOK{} +} + +/* +PostGraphsNeighboursOK describes a response with status code 200, with default header values. + +OK +*/ +type PostGraphsNeighboursOK struct { + Payload *models.Graph +} + +// IsSuccess returns true when this post graphs neighbours o k response has a 2xx status code +func (o *PostGraphsNeighboursOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this post graphs neighbours o k response has a 3xx status code +func (o *PostGraphsNeighboursOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this post graphs neighbours o k response has a 4xx status code +func (o *PostGraphsNeighboursOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this post graphs neighbours o k response has a 5xx status code +func (o *PostGraphsNeighboursOK) IsServerError() bool { + return false +} + +// IsCode returns true when this post graphs neighbours o k response a status code equal to that given +func (o *PostGraphsNeighboursOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the post graphs neighbours o k response +func (o *PostGraphsNeighboursOK) Code() int { + return 200 +} + +func (o *PostGraphsNeighboursOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/neighbours][%d] postGraphsNeighboursOK %s", 200, payload) +} + +func (o *PostGraphsNeighboursOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/neighbours][%d] postGraphsNeighboursOK %s", 200, payload) +} + +func (o *PostGraphsNeighboursOK) GetPayload() *models.Graph { + return o.Payload +} + +func (o *PostGraphsNeighboursOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + o.Payload = new(models.Graph) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewPostGraphsNeighboursDefault creates a PostGraphsNeighboursDefault with default headers values +func NewPostGraphsNeighboursDefault(code int) *PostGraphsNeighboursDefault { + return &PostGraphsNeighboursDefault{ + _statusCode: code, + } +} + +/* +PostGraphsNeighboursDefault describes a response with status code -1, with default header values. + +PostGraphsNeighboursDefault post graphs neighbours default +*/ +type PostGraphsNeighboursDefault struct { + _statusCode int + + Payload string +} + +// IsSuccess returns true when this post graphs neighbours default response has a 2xx status code +func (o *PostGraphsNeighboursDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this post graphs neighbours default response has a 3xx status code +func (o *PostGraphsNeighboursDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this post graphs neighbours default response has a 4xx status code +func (o *PostGraphsNeighboursDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this post graphs neighbours default response has a 5xx status code +func (o *PostGraphsNeighboursDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this post graphs neighbours default response a status code equal to that given +func (o *PostGraphsNeighboursDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the post graphs neighbours default response +func (o *PostGraphsNeighboursDefault) Code() int { + return o._statusCode +} + +func (o *PostGraphsNeighboursDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/neighbours][%d] PostGraphsNeighbours default %s", o._statusCode, payload) +} + +func (o *PostGraphsNeighboursDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /graphs/neighbours][%d] PostGraphsNeighbours default %s", o._statusCode, payload) +} + +func (o *PostGraphsNeighboursDefault) GetPayload() string { + return o.Payload +} + +func (o *PostGraphsNeighboursDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/pkg/swagger/client/operations/post_lists_goals_parameters.go b/pkg/swagger/client/operations/post_lists_goals_parameters.go new file mode 100644 index 0000000..611a067 --- /dev/null +++ b/pkg/swagger/client/operations/post_lists_goals_parameters.go @@ -0,0 +1,155 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// NewPostListsGoalsParams creates a new PostListsGoalsParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewPostListsGoalsParams() *PostListsGoalsParams { + return &PostListsGoalsParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewPostListsGoalsParamsWithTimeout creates a new PostListsGoalsParams object +// with the ability to set a timeout on a request. +func NewPostListsGoalsParamsWithTimeout(timeout time.Duration) *PostListsGoalsParams { + return &PostListsGoalsParams{ + timeout: timeout, + } +} + +// NewPostListsGoalsParamsWithContext creates a new PostListsGoalsParams object +// with the ability to set a context for a request. +func NewPostListsGoalsParamsWithContext(ctx context.Context) *PostListsGoalsParams { + return &PostListsGoalsParams{ + Context: ctx, + } +} + +// NewPostListsGoalsParamsWithHTTPClient creates a new PostListsGoalsParams object +// with the ability to set a custom HTTPClient for a request. +func NewPostListsGoalsParamsWithHTTPClient(client *http.Client) *PostListsGoalsParams { + return &PostListsGoalsParams{ + HTTPClient: client, + } +} + +/* +PostListsGoalsParams contains all the parameters to send to the API endpoint + + for the post lists goals operation. + + Typically these are written to a http.Request. +*/ +type PostListsGoalsParams struct { + + /* Request. + + search from start to goal classes + */ + Request *models.Goals + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the post lists goals params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *PostListsGoalsParams) WithDefaults() *PostListsGoalsParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the post lists goals params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *PostListsGoalsParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the post lists goals params +func (o *PostListsGoalsParams) WithTimeout(timeout time.Duration) *PostListsGoalsParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the post lists goals params +func (o *PostListsGoalsParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the post lists goals params +func (o *PostListsGoalsParams) WithContext(ctx context.Context) *PostListsGoalsParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the post lists goals params +func (o *PostListsGoalsParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the post lists goals params +func (o *PostListsGoalsParams) WithHTTPClient(client *http.Client) *PostListsGoalsParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the post lists goals params +func (o *PostListsGoalsParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithRequest adds the request to the post lists goals params +func (o *PostListsGoalsParams) WithRequest(request *models.Goals) *PostListsGoalsParams { + o.SetRequest(request) + return o +} + +// SetRequest adds the request to the post lists goals params +func (o *PostListsGoalsParams) SetRequest(request *models.Goals) { + o.Request = request +} + +// WriteToRequest writes these params to a swagger request +func (o *PostListsGoalsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if o.Request != nil { + if err := r.SetBodyParam(o.Request); err != nil { + return err + } + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/pkg/swagger/client/operations/post_lists_goals_responses.go b/pkg/swagger/client/operations/post_lists_goals_responses.go new file mode 100644 index 0000000..ab08383 --- /dev/null +++ b/pkg/swagger/client/operations/post_lists_goals_responses.go @@ -0,0 +1,185 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package operations + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + + "github.com/korrel8r/client/pkg/swagger/models" +) + +// PostListsGoalsReader is a Reader for the PostListsGoals structure. +type PostListsGoalsReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *PostListsGoalsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewPostListsGoalsOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewPostListsGoalsDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewPostListsGoalsOK creates a PostListsGoalsOK with default headers values +func NewPostListsGoalsOK() *PostListsGoalsOK { + return &PostListsGoalsOK{} +} + +/* +PostListsGoalsOK describes a response with status code 200, with default header values. + +OK +*/ +type PostListsGoalsOK struct { + Payload []*models.Node +} + +// IsSuccess returns true when this post lists goals o k response has a 2xx status code +func (o *PostListsGoalsOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this post lists goals o k response has a 3xx status code +func (o *PostListsGoalsOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this post lists goals o k response has a 4xx status code +func (o *PostListsGoalsOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this post lists goals o k response has a 5xx status code +func (o *PostListsGoalsOK) IsServerError() bool { + return false +} + +// IsCode returns true when this post lists goals o k response a status code equal to that given +func (o *PostListsGoalsOK) IsCode(code int) bool { + return code == 200 +} + +// Code gets the status code for the post lists goals o k response +func (o *PostListsGoalsOK) Code() int { + return 200 +} + +func (o *PostListsGoalsOK) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /lists/goals][%d] postListsGoalsOK %s", 200, payload) +} + +func (o *PostListsGoalsOK) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /lists/goals][%d] postListsGoalsOK %s", 200, payload) +} + +func (o *PostListsGoalsOK) GetPayload() []*models.Node { + return o.Payload +} + +func (o *PostListsGoalsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewPostListsGoalsDefault creates a PostListsGoalsDefault with default headers values +func NewPostListsGoalsDefault(code int) *PostListsGoalsDefault { + return &PostListsGoalsDefault{ + _statusCode: code, + } +} + +/* +PostListsGoalsDefault describes a response with status code -1, with default header values. + +PostListsGoalsDefault post lists goals default +*/ +type PostListsGoalsDefault struct { + _statusCode int + + Payload string +} + +// IsSuccess returns true when this post lists goals default response has a 2xx status code +func (o *PostListsGoalsDefault) IsSuccess() bool { + return o._statusCode/100 == 2 +} + +// IsRedirect returns true when this post lists goals default response has a 3xx status code +func (o *PostListsGoalsDefault) IsRedirect() bool { + return o._statusCode/100 == 3 +} + +// IsClientError returns true when this post lists goals default response has a 4xx status code +func (o *PostListsGoalsDefault) IsClientError() bool { + return o._statusCode/100 == 4 +} + +// IsServerError returns true when this post lists goals default response has a 5xx status code +func (o *PostListsGoalsDefault) IsServerError() bool { + return o._statusCode/100 == 5 +} + +// IsCode returns true when this post lists goals default response a status code equal to that given +func (o *PostListsGoalsDefault) IsCode(code int) bool { + return o._statusCode == code +} + +// Code gets the status code for the post lists goals default response +func (o *PostListsGoalsDefault) Code() int { + return o._statusCode +} + +func (o *PostListsGoalsDefault) Error() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /lists/goals][%d] PostListsGoals default %s", o._statusCode, payload) +} + +func (o *PostListsGoalsDefault) String() string { + payload, _ := json.Marshal(o.Payload) + return fmt.Sprintf("[POST /lists/goals][%d] PostListsGoals default %s", o._statusCode, payload) +} + +func (o *PostListsGoalsDefault) GetPayload() string { + return o.Payload +} + +func (o *PostListsGoalsDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + // response payload + if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} diff --git a/pkg/swagger/client/r_e_s_t_api_client.go b/pkg/swagger/client/r_e_s_t_api_client.go new file mode 100644 index 0000000..c781aa2 --- /dev/null +++ b/pkg/swagger/client/r_e_s_t_api_client.go @@ -0,0 +1,113 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package client + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "github.com/go-openapi/runtime" + httptransport "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" + "github.com/korrel8r/client/pkg/swagger/client/operations" +) + +// Default r e s t API HTTP client. +var Default = NewHTTPClient(nil) + +const ( + // DefaultHost is the default Host + // found in Meta (info) section of spec file + DefaultHost string = "localhost" + // DefaultBasePath is the default BasePath + // found in Meta (info) section of spec file + DefaultBasePath string = "/api/v1alpha1" +) + +// DefaultSchemes are the default schemes found in Meta (info) section of spec file +var DefaultSchemes = []string{"http", "https"} + +// NewHTTPClient creates a new r e s t API HTTP client. +func NewHTTPClient(formats strfmt.Registry) *RESTAPI { + return NewHTTPClientWithConfig(formats, nil) +} + +// NewHTTPClientWithConfig creates a new r e s t API HTTP client, +// using a customizable transport config. +func NewHTTPClientWithConfig(formats strfmt.Registry, cfg *TransportConfig) *RESTAPI { + // ensure nullable parameters have default + if cfg == nil { + cfg = DefaultTransportConfig() + } + + // create transport and client + transport := httptransport.New(cfg.Host, cfg.BasePath, cfg.Schemes) + return New(transport, formats) +} + +// New creates a new r e s t API client +func New(transport runtime.ClientTransport, formats strfmt.Registry) *RESTAPI { + // ensure nullable parameters have default + if formats == nil { + formats = strfmt.Default + } + + cli := new(RESTAPI) + cli.Transport = transport + cli.Operations = operations.New(transport, formats) + return cli +} + +// DefaultTransportConfig creates a TransportConfig with the +// default settings taken from the meta section of the spec file. +func DefaultTransportConfig() *TransportConfig { + return &TransportConfig{ + Host: DefaultHost, + BasePath: DefaultBasePath, + Schemes: DefaultSchemes, + } +} + +// TransportConfig contains the transport related info, +// found in the meta section of the spec file. +type TransportConfig struct { + Host string + BasePath string + Schemes []string +} + +// WithHost overrides the default host, +// provided by the meta section of the spec file. +func (cfg *TransportConfig) WithHost(host string) *TransportConfig { + cfg.Host = host + return cfg +} + +// WithBasePath overrides the default basePath, +// provided by the meta section of the spec file. +func (cfg *TransportConfig) WithBasePath(basePath string) *TransportConfig { + cfg.BasePath = basePath + return cfg +} + +// WithSchemes overrides the default schemes, +// provided by the meta section of the spec file. +func (cfg *TransportConfig) WithSchemes(schemes []string) *TransportConfig { + cfg.Schemes = schemes + return cfg +} + +// RESTAPI is a client for r e s t API +type RESTAPI struct { + Operations operations.ClientService + + Transport runtime.ClientTransport +} + +// SetTransport changes the transport on the client and all its subresources +func (c *RESTAPI) SetTransport(transport runtime.ClientTransport) { + c.Transport = transport + c.Operations.SetTransport(transport) +} diff --git a/pkg/swagger/models/classes.go b/pkg/swagger/models/classes.go new file mode 100644 index 0000000..5391d1d --- /dev/null +++ b/pkg/swagger/models/classes.go @@ -0,0 +1,29 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/strfmt" +) + +// Classes Classes is a map from class names to a short description. +// +// swagger:model Classes +type Classes map[string]string + +// Validate validates this classes +func (m Classes) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this classes based on context it is used +func (m Classes) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} diff --git a/pkg/swagger/models/domain.go b/pkg/swagger/models/domain.go new file mode 100644 index 0000000..fd0a747 --- /dev/null +++ b/pkg/swagger/models/domain.go @@ -0,0 +1,120 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Domain Domain configuration information. +// +// swagger:model Domain +type Domain struct { + + // Name of the domain. + Name string `json:"name,omitempty"` + + // Stores configured for the domain. + Stores []Store `json:"stores"` +} + +// Validate validates this domain +func (m *Domain) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateStores(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Domain) validateStores(formats strfmt.Registry) error { + if swag.IsZero(m.Stores) { // not required + return nil + } + + for i := 0; i < len(m.Stores); i++ { + + if m.Stores[i] != nil { + if err := m.Stores[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("stores" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("stores" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this domain based on the context it is used +func (m *Domain) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateStores(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Domain) contextValidateStores(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Stores); i++ { + + if swag.IsZero(m.Stores[i]) { // not required + return nil + } + + if err := m.Stores[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("stores" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("stores" + "." + strconv.Itoa(i)) + } + return err + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Domain) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Domain) UnmarshalBinary(b []byte) error { + var res Domain + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/edge.go b/pkg/swagger/models/edge.go new file mode 100644 index 0000000..4849f61 --- /dev/null +++ b/pkg/swagger/models/edge.go @@ -0,0 +1,130 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Edge Directed edge in the result graph, from Start to Goal classes. +// +// swagger:model Edge +type Edge struct { + + // Goal is the class name of the goal node. + // Example: domain:class + Goal string `json:"goal,omitempty"` + + // Rules is the set of rules followed along this edge. + Rules []*Rule `json:"rules,omitempty"` + + // Start is the class name of the start node. + Start string `json:"start,omitempty"` +} + +// Validate validates this edge +func (m *Edge) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateRules(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Edge) validateRules(formats strfmt.Registry) error { + if swag.IsZero(m.Rules) { // not required + return nil + } + + for i := 0; i < len(m.Rules); i++ { + if swag.IsZero(m.Rules[i]) { // not required + continue + } + + if m.Rules[i] != nil { + if err := m.Rules[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("rules" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("rules" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this edge based on the context it is used +func (m *Edge) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateRules(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Edge) contextValidateRules(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Rules); i++ { + + if m.Rules[i] != nil { + + if swag.IsZero(m.Rules[i]) { // not required + return nil + } + + if err := m.Rules[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("rules" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("rules" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Edge) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Edge) UnmarshalBinary(b []byte) error { + var res Edge + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/goals.go b/pkg/swagger/models/goals.go new file mode 100644 index 0000000..e82b0d6 --- /dev/null +++ b/pkg/swagger/models/goals.go @@ -0,0 +1,115 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Goals Starting point for a goals search. +// +// swagger:model Goals +type Goals struct { + + // Goal classes for correlation. + // Example: ["domain:class"] + Goals []string `json:"goals"` + + // start + Start *Start `json:"start,omitempty"` +} + +// Validate validates this goals +func (m *Goals) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateStart(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Goals) validateStart(formats strfmt.Registry) error { + if swag.IsZero(m.Start) { // not required + return nil + } + + if m.Start != nil { + if err := m.Start.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("start") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("start") + } + return err + } + } + + return nil +} + +// ContextValidate validate this goals based on the context it is used +func (m *Goals) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateStart(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Goals) contextValidateStart(ctx context.Context, formats strfmt.Registry) error { + + if m.Start != nil { + + if swag.IsZero(m.Start) { // not required + return nil + } + + if err := m.Start.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("start") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("start") + } + return err + } + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Goals) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Goals) UnmarshalBinary(b []byte) error { + var res Goals + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/graph.go b/pkg/swagger/models/graph.go new file mode 100644 index 0000000..fa2c915 --- /dev/null +++ b/pkg/swagger/models/graph.go @@ -0,0 +1,185 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Graph Graph resulting from a correlation search. +// +// swagger:model Graph +type Graph struct { + + // edges + Edges []*Edge `json:"edges"` + + // nodes + Nodes []*Node `json:"nodes"` +} + +// Validate validates this graph +func (m *Graph) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateEdges(formats); err != nil { + res = append(res, err) + } + + if err := m.validateNodes(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Graph) validateEdges(formats strfmt.Registry) error { + if swag.IsZero(m.Edges) { // not required + return nil + } + + for i := 0; i < len(m.Edges); i++ { + if swag.IsZero(m.Edges[i]) { // not required + continue + } + + if m.Edges[i] != nil { + if err := m.Edges[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("edges" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("edges" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +func (m *Graph) validateNodes(formats strfmt.Registry) error { + if swag.IsZero(m.Nodes) { // not required + return nil + } + + for i := 0; i < len(m.Nodes); i++ { + if swag.IsZero(m.Nodes[i]) { // not required + continue + } + + if m.Nodes[i] != nil { + if err := m.Nodes[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("nodes" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("nodes" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this graph based on the context it is used +func (m *Graph) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateEdges(ctx, formats); err != nil { + res = append(res, err) + } + + if err := m.contextValidateNodes(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Graph) contextValidateEdges(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Edges); i++ { + + if m.Edges[i] != nil { + + if swag.IsZero(m.Edges[i]) { // not required + return nil + } + + if err := m.Edges[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("edges" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("edges" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +func (m *Graph) contextValidateNodes(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Nodes); i++ { + + if m.Nodes[i] != nil { + + if swag.IsZero(m.Nodes[i]) { // not required + return nil + } + + if err := m.Nodes[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("nodes" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("nodes" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Graph) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Graph) UnmarshalBinary(b []byte) error { + var res Graph + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/neighbours.go b/pkg/swagger/models/neighbours.go new file mode 100644 index 0000000..f1fbd43 --- /dev/null +++ b/pkg/swagger/models/neighbours.go @@ -0,0 +1,114 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Neighbours Starting point for a neighbours search. +// +// swagger:model Neighbours +type Neighbours struct { + + // Max depth of neighbours graph. + Depth int64 `json:"depth,omitempty"` + + // start + Start *Start `json:"start,omitempty"` +} + +// Validate validates this neighbours +func (m *Neighbours) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateStart(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Neighbours) validateStart(formats strfmt.Registry) error { + if swag.IsZero(m.Start) { // not required + return nil + } + + if m.Start != nil { + if err := m.Start.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("start") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("start") + } + return err + } + } + + return nil +} + +// ContextValidate validate this neighbours based on the context it is used +func (m *Neighbours) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateStart(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Neighbours) contextValidateStart(ctx context.Context, formats strfmt.Registry) error { + + if m.Start != nil { + + if swag.IsZero(m.Start) { // not required + return nil + } + + if err := m.Start.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("start") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("start") + } + return err + } + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Neighbours) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Neighbours) UnmarshalBinary(b []byte) error { + var res Neighbours + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/node.go b/pkg/swagger/models/node.go new file mode 100644 index 0000000..a79e5e5 --- /dev/null +++ b/pkg/swagger/models/node.go @@ -0,0 +1,130 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Node node +// +// swagger:model Node +type Node struct { + + // Class is the full class name in "DOMAIN:CLASS" form. + // Example: domain:class + Class string `json:"class,omitempty"` + + // Count of results found for this class, after de-duplication. + Count int64 `json:"count,omitempty"` + + // Queries yielding results for this class. + Queries []*QueryCount `json:"queries"` +} + +// Validate validates this node +func (m *Node) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateQueries(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Node) validateQueries(formats strfmt.Registry) error { + if swag.IsZero(m.Queries) { // not required + return nil + } + + for i := 0; i < len(m.Queries); i++ { + if swag.IsZero(m.Queries[i]) { // not required + continue + } + + if m.Queries[i] != nil { + if err := m.Queries[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("queries" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("queries" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this node based on the context it is used +func (m *Node) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateQueries(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Node) contextValidateQueries(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Queries); i++ { + + if m.Queries[i] != nil { + + if swag.IsZero(m.Queries[i]) { // not required + return nil + } + + if err := m.Queries[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("queries" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("queries" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Node) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Node) UnmarshalBinary(b []byte) error { + var res Node + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/query_count.go b/pkg/swagger/models/query_count.go new file mode 100644 index 0000000..c8597b6 --- /dev/null +++ b/pkg/swagger/models/query_count.go @@ -0,0 +1,55 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// QueryCount Query run during a correlation with a count of results found. +// +// swagger:model QueryCount +type QueryCount struct { + + // Count of results or -1 if the query was not executed. + Count int64 `json:"count,omitempty"` + + // Query for correlation data. + Query string `json:"query,omitempty"` +} + +// Validate validates this query count +func (m *QueryCount) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this query count based on context it is used +func (m *QueryCount) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *QueryCount) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *QueryCount) UnmarshalBinary(b []byte) error { + var res QueryCount + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/rest_constraint.go b/pkg/swagger/models/rest_constraint.go new file mode 100644 index 0000000..44c0d01 --- /dev/null +++ b/pkg/swagger/models/rest_constraint.go @@ -0,0 +1,58 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// RestConstraint Constraint constrains the objects that will be included in search results. +// +// swagger:model rest.Constraint +type RestConstraint struct { + + // End of time interval to include. + End string `json:"end,omitempty"` + + // Limit number of objects returned per query. + Limit int64 `json:"limit,omitempty"` + + // Start of time interval to include. + Start string `json:"start,omitempty"` +} + +// Validate validates this rest constraint +func (m *RestConstraint) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this rest constraint based on context it is used +func (m *RestConstraint) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (m *RestConstraint) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *RestConstraint) UnmarshalBinary(b []byte) error { + var res RestConstraint + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/rule.go b/pkg/swagger/models/rule.go new file mode 100644 index 0000000..dc3cd5e --- /dev/null +++ b/pkg/swagger/models/rule.go @@ -0,0 +1,126 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Rule rule +// +// swagger:model Rule +type Rule struct { + + // Name is an optional descriptive name. + Name string `json:"name,omitempty"` + + // Queries generated while following this rule. + Queries []*QueryCount `json:"queries"` +} + +// Validate validates this rule +func (m *Rule) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateQueries(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Rule) validateQueries(formats strfmt.Registry) error { + if swag.IsZero(m.Queries) { // not required + return nil + } + + for i := 0; i < len(m.Queries); i++ { + if swag.IsZero(m.Queries[i]) { // not required + continue + } + + if m.Queries[i] != nil { + if err := m.Queries[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("queries" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("queries" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this rule based on the context it is used +func (m *Rule) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateQueries(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Rule) contextValidateQueries(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Queries); i++ { + + if m.Queries[i] != nil { + + if swag.IsZero(m.Queries[i]) { // not required + return nil + } + + if err := m.Queries[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("queries" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("queries" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Rule) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Rule) UnmarshalBinary(b []byte) error { + var res Rule + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/start.go b/pkg/swagger/models/start.go new file mode 100644 index 0000000..a76bcdd --- /dev/null +++ b/pkg/swagger/models/start.go @@ -0,0 +1,120 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/errors" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// Start Start identifies a set of starting objects for correlation. +// +// swagger:model Start +type Start struct { + + // Class for `objects` + Class string `json:"class,omitempty"` + + // constraint + Constraint *RestConstraint `json:"constraint,omitempty"` + + // Objects of `class` serialized as JSON + Objects interface{} `json:"objects,omitempty"` + + // Queries for starting objects + Queries []string `json:"queries"` +} + +// Validate validates this start +func (m *Start) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateConstraint(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Start) validateConstraint(formats strfmt.Registry) error { + if swag.IsZero(m.Constraint) { // not required + return nil + } + + if m.Constraint != nil { + if err := m.Constraint.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("constraint") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("constraint") + } + return err + } + } + + return nil +} + +// ContextValidate validate this start based on the context it is used +func (m *Start) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateConstraint(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Start) contextValidateConstraint(ctx context.Context, formats strfmt.Registry) error { + + if m.Constraint != nil { + + if swag.IsZero(m.Constraint) { // not required + return nil + } + + if err := m.Constraint.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("constraint") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("constraint") + } + return err + } + } + + return nil +} + +// MarshalBinary interface implementation +func (m *Start) MarshalBinary() ([]byte, error) { + if m == nil { + return nil, nil + } + return swag.WriteJSON(m) +} + +// UnmarshalBinary interface implementation +func (m *Start) UnmarshalBinary(b []byte) error { + var res Start + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *m = res + return nil +} diff --git a/pkg/swagger/models/store.go b/pkg/swagger/models/store.go new file mode 100644 index 0000000..0a98ba0 --- /dev/null +++ b/pkg/swagger/models/store.go @@ -0,0 +1,29 @@ +// Copyright: This file is part of korrel8r, released under https://github.com/korrel8r/korrel8r/blob/main/LICENSE + +// Code generated by go-swagger; DO NOT EDIT. + +package models + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + + "github.com/go-openapi/strfmt" +) + +// Store Store is a map of name:value attributes used to connect to a store. +// +// swagger:model Store +type Store map[string]string + +// Validate validates this store +func (m Store) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this store based on context it is used +func (m Store) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +}