diff --git a/gcsfs/file.go b/gcsfs/file.go index 671c0466..24019194 100644 --- a/gcsfs/file.go +++ b/gcsfs/file.go @@ -26,7 +26,7 @@ import ( "sort" "syscall" - "github.com/googleapis/google-cloud-go-testing/storage/stiface" + "github.com/spf13/afero/gcsfs/internal/stiface" "cloud.google.com/go/storage" diff --git a/gcsfs/file_resource.go b/gcsfs/file_resource.go index 06d5c544..86cab3c4 100644 --- a/gcsfs/file_resource.go +++ b/gcsfs/file_resource.go @@ -24,7 +24,7 @@ import ( "os" "syscall" - "github.com/googleapis/google-cloud-go-testing/storage/stiface" + "github.com/spf13/afero/gcsfs/internal/stiface" ) const ( diff --git a/gcsfs/fs.go b/gcsfs/fs.go index b2a78fcc..914704f7 100644 --- a/gcsfs/fs.go +++ b/gcsfs/fs.go @@ -25,7 +25,7 @@ import ( "syscall" "time" - "github.com/googleapis/google-cloud-go-testing/storage/stiface" + "github.com/spf13/afero/gcsfs/internal/stiface" ) const ( diff --git a/gcsfs/gcs.go b/gcsfs/gcs.go index c94b1421..b33bdeb1 100644 --- a/gcsfs/gcs.go +++ b/gcsfs/gcs.go @@ -22,8 +22,8 @@ import ( "time" "cloud.google.com/go/storage" - "github.com/googleapis/google-cloud-go-testing/storage/stiface" "github.com/spf13/afero" + "github.com/spf13/afero/gcsfs/internal/stiface" "google.golang.org/api/option" ) diff --git a/gcsfs/gcs_mocks.go b/gcsfs/gcs_mocks.go index b71b2924..5d4e8372 100644 --- a/gcsfs/gcs_mocks.go +++ b/gcsfs/gcs_mocks.go @@ -18,8 +18,8 @@ import ( "strings" "cloud.google.com/go/storage" - "github.com/googleapis/google-cloud-go-testing/storage/stiface" "github.com/spf13/afero" + "github.com/spf13/afero/gcsfs/internal/stiface" "google.golang.org/api/iterator" ) diff --git a/gcsfs/gcs_test.go b/gcsfs/gcs_test.go index 67794be5..d1cf70da 100644 --- a/gcsfs/gcs_test.go +++ b/gcsfs/gcs_test.go @@ -20,8 +20,8 @@ import ( "golang.org/x/oauth2/google" "cloud.google.com/go/storage" - "github.com/googleapis/google-cloud-go-testing/storage/stiface" "github.com/spf13/afero" + "github.com/spf13/afero/gcsfs/internal/stiface" ) const ( diff --git a/gcsfs/internal/stiface/README.md b/gcsfs/internal/stiface/README.md new file mode 100644 index 00000000..2b2d411a --- /dev/null +++ b/gcsfs/internal/stiface/README.md @@ -0,0 +1,4 @@ +# Copy of [google-cloud-go-testing](https://github.com/googleapis/google-cloud-go-testing) + +This is a temporary copy of the [google-cloud-go-testing](https://github.com/googleapis/google-cloud-go-testing) library. +The library is deprecated and the code was copied here to drop it as a dependency (allowing to upgrade other library dependencies). diff --git a/gcsfs/internal/stiface/adapters.go b/gcsfs/internal/stiface/adapters.go new file mode 100644 index 00000000..905e89de --- /dev/null +++ b/gcsfs/internal/stiface/adapters.go @@ -0,0 +1,176 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stiface + +import ( + "context" + + "cloud.google.com/go/storage" +) + +// AdaptClient adapts a storage.Client so that it satisfies the Client +// interface. +func AdaptClient(c *storage.Client) Client { + return client{c} +} + +type ( + client struct{ *storage.Client } + bucketHandle struct{ *storage.BucketHandle } + objectHandle struct{ *storage.ObjectHandle } + bucketIterator struct{ *storage.BucketIterator } + objectIterator struct{ *storage.ObjectIterator } + reader struct{ *storage.Reader } + writer struct{ *storage.Writer } + copier struct{ *storage.Copier } + composer struct{ *storage.Composer } + aclHandle struct{ *storage.ACLHandle } +) + +func (client) embedToIncludeNewMethods() {} +func (bucketHandle) embedToIncludeNewMethods() {} +func (objectHandle) embedToIncludeNewMethods() {} +func (bucketIterator) embedToIncludeNewMethods() {} +func (objectIterator) embedToIncludeNewMethods() {} +func (writer) embedToIncludeNewMethods() {} +func (reader) embedToIncludeNewMethods() {} +func (copier) embedToIncludeNewMethods() {} +func (composer) embedToIncludeNewMethods() {} +func (aclHandle) embedToIncludeNewMethods() {} + +func (c client) Bucket(name string) BucketHandle { + return bucketHandle{c.Client.Bucket(name)} +} + +func (c client) Buckets(ctx context.Context, projectID string) BucketIterator { + return bucketIterator{c.Client.Buckets(ctx, projectID)} +} + +func (b bucketHandle) Object(name string) ObjectHandle { + return objectHandle{b.BucketHandle.Object(name)} +} + +func (b bucketHandle) If(conds storage.BucketConditions) BucketHandle { + return bucketHandle{b.BucketHandle.If(conds)} +} + +func (b bucketHandle) Objects(ctx context.Context, q *storage.Query) ObjectIterator { + return objectIterator{b.BucketHandle.Objects(ctx, q)} +} + +func (b bucketHandle) DefaultObjectACL() ACLHandle { + return aclHandle{b.BucketHandle.DefaultObjectACL()} +} + +func (b bucketHandle) ACL() ACLHandle { + return aclHandle{b.BucketHandle.ACL()} +} + +func (b bucketHandle) UserProject(projectID string) BucketHandle { + return bucketHandle{b.BucketHandle.UserProject(projectID)} +} + +func (bi bucketIterator) SetPrefix(s string) { + bi.BucketIterator.Prefix = s +} + +func (o objectHandle) ACL() ACLHandle { + return aclHandle{o.ObjectHandle.ACL()} +} + +func (o objectHandle) Generation(gen int64) ObjectHandle { + return objectHandle{o.ObjectHandle.Generation(gen)} +} + +func (o objectHandle) If(conds storage.Conditions) ObjectHandle { + return objectHandle{o.ObjectHandle.If(conds)} +} + +func (o objectHandle) Key(encryptionKey []byte) ObjectHandle { + return objectHandle{o.ObjectHandle.Key(encryptionKey)} +} + +func (o objectHandle) ReadCompressed(compressed bool) ObjectHandle { + return objectHandle{o.ObjectHandle.ReadCompressed(compressed)} +} + +func (o objectHandle) NewReader(ctx context.Context) (Reader, error) { + r, err := o.ObjectHandle.NewReader(ctx) + if err != nil { + return nil, err + } + return reader{r}, nil +} + +func (o objectHandle) NewRangeReader(ctx context.Context, offset, length int64) (Reader, error) { + r, err := o.ObjectHandle.NewRangeReader(ctx, offset, length) + if err != nil { + return nil, err + } + return reader{r}, nil +} + +func (o objectHandle) NewWriter(ctx context.Context) Writer { + return writer{o.ObjectHandle.NewWriter(ctx)} +} + +func (o objectHandle) CopierFrom(src ObjectHandle) Copier { + return copier{o.ObjectHandle.CopierFrom(src.(objectHandle).ObjectHandle)} +} + +func (o objectHandle) ComposerFrom(srcs ...ObjectHandle) Composer { + objs := make([]*storage.ObjectHandle, len(srcs)) + for i, s := range srcs { + objs[i] = s.(objectHandle).ObjectHandle + } + return composer{o.ObjectHandle.ComposerFrom(objs...)} +} + +func (w writer) ObjectAttrs() *storage.ObjectAttrs { + return &w.Writer.ObjectAttrs +} + +func (w writer) SetChunkSize(s int) { + w.ChunkSize = s +} + +func (w writer) SetProgressFunc(f func(int64)) { + w.ProgressFunc = f +} + +func (w writer) SetCRC32C(c uint32) { + w.CRC32C = c + w.SendCRC32C = true +} + +func (c copier) ObjectAttrs() *storage.ObjectAttrs { + return &c.Copier.ObjectAttrs +} + +func (c copier) SetRewriteToken(t string) { + c.RewriteToken = t +} + +func (c copier) SetProgressFunc(f func(copiedBytes, totalBytes uint64)) { + c.ProgressFunc = f +} + +func (c copier) SetDestinationKMSKeyName(k string) { + c.DestinationKMSKeyName = k +} + +func (c composer) ObjectAttrs() *storage.ObjectAttrs { + return &c.Composer.ObjectAttrs +} diff --git a/gcsfs/internal/stiface/doc.go b/gcsfs/internal/stiface/doc.go new file mode 100644 index 00000000..3a777ea3 --- /dev/null +++ b/gcsfs/internal/stiface/doc.go @@ -0,0 +1,34 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package stiface provides a set of interfaces for the types in +// cloud.google.com/go/storage. These can be used to create mocks or other test +// doubles. The package also provides adapters to enable the types of the +// storage package to implement these interfaces. +// +// We do not recommend using mocks for most testing. Please read +// https://testing.googleblog.com/2013/05/testing-on-toilet-dont-overuse-mocks.html. +// +// Note: This package is in alpha. Some backwards-incompatible changes may occur. +// +// You must embed these interfaces to implement them: +// +// type ClientMock struct { +// stiface.Client +// ... +// } +// +// This ensures that your implementations will not break when methods are added +// to the interfaces. +package stiface diff --git a/gcsfs/internal/stiface/examples_test.go b/gcsfs/internal/stiface/examples_test.go new file mode 100644 index 00000000..dca5b60b --- /dev/null +++ b/gcsfs/internal/stiface/examples_test.go @@ -0,0 +1,34 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stiface_test + +import ( + "context" + + "cloud.google.com/go/storage" + "github.com/spf13/afero/gcsfs/internal/stiface" +) + +func Example_AdaptClient() { + ctx := context.Background() + c, err := storage.NewClient(ctx) + if err != nil { + // TODO: Handle error. + } + client := stiface.AdaptClient(c) + w := client.Bucket("my-bucket").Object("my-object").NewWriter(ctx) + w.ObjectAttrs().ContentType = "text/plain" + // TODO: Use w. +} diff --git a/gcsfs/internal/stiface/interfaces.go b/gcsfs/internal/stiface/interfaces.go new file mode 100644 index 00000000..513ec4d0 --- /dev/null +++ b/gcsfs/internal/stiface/interfaces.go @@ -0,0 +1,133 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stiface + +import ( + "context" + "io" + + "cloud.google.com/go/iam" + "cloud.google.com/go/storage" + "google.golang.org/api/iterator" +) + +type Client interface { + Bucket(name string) BucketHandle + Buckets(ctx context.Context, projectID string) BucketIterator + Close() error + + embedToIncludeNewMethods() +} + +type ObjectHandle interface { + ACL() ACLHandle + Generation(int64) ObjectHandle + If(storage.Conditions) ObjectHandle + Key([]byte) ObjectHandle + ReadCompressed(bool) ObjectHandle + Attrs(context.Context) (*storage.ObjectAttrs, error) + Update(context.Context, storage.ObjectAttrsToUpdate) (*storage.ObjectAttrs, error) + NewReader(context.Context) (Reader, error) + NewRangeReader(context.Context, int64, int64) (Reader, error) + NewWriter(context.Context) Writer + Delete(context.Context) error + CopierFrom(ObjectHandle) Copier + ComposerFrom(...ObjectHandle) Composer + + embedToIncludeNewMethods() +} + +type BucketHandle interface { + Create(context.Context, string, *storage.BucketAttrs) error + Delete(context.Context) error + DefaultObjectACL() ACLHandle + Object(string) ObjectHandle + Attrs(context.Context) (*storage.BucketAttrs, error) + Update(context.Context, storage.BucketAttrsToUpdate) (*storage.BucketAttrs, error) + If(storage.BucketConditions) BucketHandle + Objects(context.Context, *storage.Query) ObjectIterator + ACL() ACLHandle + IAM() *iam.Handle + UserProject(projectID string) BucketHandle + Notifications(context.Context) (map[string]*storage.Notification, error) + AddNotification(context.Context, *storage.Notification) (*storage.Notification, error) + DeleteNotification(context.Context, string) error + LockRetentionPolicy(context.Context) error + + embedToIncludeNewMethods() +} + +type ObjectIterator interface { + Next() (*storage.ObjectAttrs, error) + PageInfo() *iterator.PageInfo + + embedToIncludeNewMethods() +} + +type BucketIterator interface { + SetPrefix(string) + Next() (*storage.BucketAttrs, error) + PageInfo() *iterator.PageInfo + + embedToIncludeNewMethods() +} + +type ACLHandle interface { + Delete(context.Context, storage.ACLEntity) error + Set(context.Context, storage.ACLEntity, storage.ACLRole) error + List(context.Context) ([]storage.ACLRule, error) + + embedToIncludeNewMethods() +} + +type Reader interface { + io.ReadCloser + Size() int64 + Remain() int64 + ContentType() string + ContentEncoding() string + CacheControl() string + + embedToIncludeNewMethods() +} + +type Writer interface { + io.WriteCloser + ObjectAttrs() *storage.ObjectAttrs + SetChunkSize(int) + SetProgressFunc(func(int64)) + SetCRC32C(uint32) // Sets both CRC32C and SendCRC32C. + CloseWithError(err error) error + Attrs() *storage.ObjectAttrs + + embedToIncludeNewMethods() +} + +type Copier interface { + ObjectAttrs() *storage.ObjectAttrs + SetRewriteToken(string) + SetProgressFunc(func(uint64, uint64)) + SetDestinationKMSKeyName(string) + Run(context.Context) (*storage.ObjectAttrs, error) + + embedToIncludeNewMethods() +} + +type Composer interface { + ObjectAttrs() *storage.ObjectAttrs + Run(context.Context) (*storage.ObjectAttrs, error) + + embedToIncludeNewMethods() +} diff --git a/gcsfs/internal/stiface/stiface_test.go b/gcsfs/internal/stiface/stiface_test.go new file mode 100644 index 00000000..8f8b57fc --- /dev/null +++ b/gcsfs/internal/stiface/stiface_test.go @@ -0,0 +1,210 @@ +// Copyright 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package stiface + +import ( + "bytes" + "context" + "fmt" + "io/ioutil" + "os" + "testing" + + "cloud.google.com/go/storage" +) + +func TestIntegration(t *testing.T) { + if testing.Short() { + t.Skip("integration tests skipped in short mode") + } + name := os.Getenv("STIFACE_BUCKET") + if name == "" { + t.Skip("missing STIFACE_BUCKET environment variable") + } + ctx := context.Background() + c, err := storage.NewClient(ctx) + if err != nil { + t.Fatal(err) + } + client := AdaptClient(c) + defer client.Close() + bkt := client.Bucket(name) + basicTests(t, name, bkt) +} + +func basicTests(t *testing.T, bucketName string, bkt BucketHandle) { + ctx := context.Background() + attrs, err := bkt.Attrs(ctx) + if err != nil { + t.Fatal(err) + } + if got, want := attrs.Name, bucketName; got != want { + t.Errorf("name: got %v, want %v", got, want) + } + + const contents = "hello, stiface" + obj := bkt.Object("stiface-test") + w := obj.NewWriter(ctx) + if _, err := fmt.Fprint(w, contents); err != nil { + t.Fatal(err) + } + if err := w.Close(); err != nil { + t.Fatal(err) + } + bytes := readObject(t, obj) + if got, want := string(bytes), contents; got != want { + t.Errorf("got %q, want %q", got, want) + } + if err := obj.Delete(ctx); err != nil { + t.Errorf("deleting: %v", err) + } +} + +func readObject(t *testing.T, obj ObjectHandle) []byte { + r, err := obj.NewReader(context.Background()) + if err != nil { + t.Fatalf("reading %v: %v", obj, err) + } + defer r.Close() + bytes, err := ioutil.ReadAll(r) + if err != nil { + t.Fatalf("reading %v: %v", obj, err) + } + return bytes +} + +// This test demonstrates how to use this package to create a simple fake for the storage client. +func TestFake(t *testing.T) { + ctx := context.Background() + client := newFakeClient() + + bkt := client.Bucket("my-bucket") + if err := bkt.Create(ctx, "my-project", nil); err != nil { + t.Fatal(err) + } + basicTests(t, "my-bucket", bkt) +} + +type fakeClient struct { + Client + buckets map[string]*fakeBucket +} + +type fakeBucket struct { + attrs *storage.BucketAttrs + objects map[string][]byte +} + +func newFakeClient() Client { + return &fakeClient{buckets: map[string]*fakeBucket{}} +} + +func (c *fakeClient) Bucket(name string) BucketHandle { + return fakeBucketHandle{c: c, name: name} +} + +type fakeBucketHandle struct { + BucketHandle + c *fakeClient + name string +} + +func (b fakeBucketHandle) Create(_ context.Context, _ string, attrs *storage.BucketAttrs) error { + if _, ok := b.c.buckets[b.name]; ok { + return fmt.Errorf("bucket %q already exists", b.name) + } + if attrs == nil { + attrs = &storage.BucketAttrs{} + } + attrs.Name = b.name + b.c.buckets[b.name] = &fakeBucket{attrs: attrs, objects: map[string][]byte{}} + return nil +} + +func (b fakeBucketHandle) Attrs(context.Context) (*storage.BucketAttrs, error) { + bkt, ok := b.c.buckets[b.name] + if !ok { + return nil, fmt.Errorf("bucket %q does not exist", b.name) + } + return bkt.attrs, nil +} + +func (b fakeBucketHandle) Object(name string) ObjectHandle { + return fakeObjectHandle{c: b.c, bucketName: b.name, name: name} +} + +type fakeObjectHandle struct { + ObjectHandle + c *fakeClient + bucketName string + name string +} + +func (o fakeObjectHandle) NewReader(context.Context) (Reader, error) { + bkt, ok := o.c.buckets[o.bucketName] + if !ok { + return nil, fmt.Errorf("bucket %q not found", o.bucketName) + } + contents, ok := bkt.objects[o.name] + if !ok { + return nil, fmt.Errorf("object %q not found in bucket %q", o.name, o.bucketName) + } + return fakeReader{r: bytes.NewReader(contents)}, nil +} + +func (o fakeObjectHandle) Delete(context.Context) error { + bkt, ok := o.c.buckets[o.bucketName] + if !ok { + return fmt.Errorf("bucket %q not found", o.bucketName) + } + delete(bkt.objects, o.name) + return nil +} + +type fakeReader struct { + Reader + r *bytes.Reader +} + +func (r fakeReader) Read(buf []byte) (int, error) { + return r.r.Read(buf) +} + +func (r fakeReader) Close() error { + return nil +} + +func (o fakeObjectHandle) NewWriter(context.Context) Writer { + return &fakeWriter{obj: o} +} + +type fakeWriter struct { + Writer + obj fakeObjectHandle + buf bytes.Buffer +} + +func (w *fakeWriter) Write(data []byte) (int, error) { + return w.buf.Write(data) +} + +func (w *fakeWriter) Close() error { + bkt, ok := w.obj.c.buckets[w.obj.bucketName] + if !ok { + return fmt.Errorf("bucket %q not found", w.obj.bucketName) + } + bkt.objects[w.obj.name] = w.buf.Bytes() + return nil +} diff --git a/go.mod b/go.mod index 002cd05c..c68e8104 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,10 @@ module github.com/spf13/afero +go 1.19 + require ( + cloud.google.com/go/iam v1.1.5 cloud.google.com/go/storage v1.35.1 - github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 github.com/pkg/sftp v1.13.6 golang.org/x/crypto v0.16.0 golang.org/x/oauth2 v0.15.0 @@ -14,7 +16,6 @@ require ( cloud.google.com/go v0.110.10 // indirect cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/s2a-go v0.1.7 // indirect @@ -35,5 +36,3 @@ require ( google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect ) - -go 1.19 diff --git a/go.sum b/go.sum index e61b09a2..bb974096 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,15 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 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= @@ -33,8 +25,6 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4er 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/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/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= @@ -48,8 +38,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/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= @@ -58,11 +46,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -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/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -70,15 +54,8 @@ github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= -github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= @@ -94,35 +71,24 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -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.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/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/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 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/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 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-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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -132,26 +98,17 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= 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.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.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-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-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-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= @@ -165,52 +122,32 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= 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.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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -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.152.0 h1:t0r1vPnfMc260S2Ci+en7kfCZaLOPs5KI0sVV/6jZrY= google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= 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.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= @@ -220,8 +157,6 @@ google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= 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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -246,7 +181,4 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C 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= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=