From 46e388a7a249032d83df20943e125e4691591503 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Mon, 28 Aug 2023 16:09:13 -0400 Subject: [PATCH 01/11] WIP Porting to `firehose-core` --- CHANGELOG.md | 208 ++++ cmd/fireeth/cli/combined-index-builder.go | 2 +- cmd/fireeth/cli/firehose.go | 1 - cmd/fireeth/cli/node.go | 28 +- cmd/fireeth/main.go | 89 +- cmd/fireeth/tools.go | 33 + go.mod | 17 +- go.sum | 37 +- node-manager/geth/bootstrap.go | 2 +- node-manager/openeth/monitoring.go | 88 -- node-manager/openeth/superviser.go | 363 ------ .../sf/ethereum/transform/v1/transforms.proto | 5 - transform/block_header_only.go | 5 + transform/call_filter.go | 4 + transform/combined_filter.go | 15 +- transform/light_block.go | 102 -- transform/light_block_test.go | 38 - transform/log_filter.go | 4 + transform/testing.go | 2 +- types/block.go | 5 +- types/go.mod | 103 +- types/go.sum | 1076 ++++++++++++++++- types/pb/sf/ethereum/type/v2/type.go | 27 + 23 files changed, 1466 insertions(+), 788 deletions(-) create mode 100644 cmd/fireeth/tools.go delete mode 100644 node-manager/openeth/monitoring.go delete mode 100644 node-manager/openeth/superviser.go delete mode 100644 transform/light_block.go delete mode 100644 transform/light_block_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index ccae9c4c..bd674b2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,214 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). See [MAINTAINERS.md](./MAINTAINERS.md) for instructions to keep up to date. +## v2.0.0 + +### Highlights + +This releases refactor `firehose-ethereum` repository to use the common shared Firehose Core library (https://github.com/streamingfast/firehose-core) that every single Firehose supported chain should use and follow. + +At the data level and gRPC level, there is no changes in behavior to all core components which are `reader-node`, `merger`, `relayer`, `firehose`, `substreams-tier1` and `substreams-tier2`. + +A lot of changes happened at the operators level however and some superflous mode have been removed, especially around the `reader-node` application. The full changes is listed below, operators should review thoroughly the changelog. + +> **Important** It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.12 in case of a problem is quite easy and no special data migration is required. + +#### Operators + +You will find below the detailed upgrade procedure for the configuration file providers usually use. If you are using the flags based approach, simply update the corresponding flags. + +#### Reader Node changes + +In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering" node, this is not possible anymore. If you were using the `node` app previously: + +```yaml +start: + args: + - ... + - node + - ... + flags: + ... + node-... +``` + +> **note* This is about `node` app, the `reader-node` app + +#### Reader Node changes + +In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering" node, this is not possible anymore. If you were using the `node` app previously: + +```yaml +start: + args: + - ... + - node + - ... + flags: + ... + node-... +``` + +> **Note** This is about the `node` app and **not** the `reader-node`, we think usage of this app is minimal/inexistent. + +#### Rename of `combined-index-builder` to `index-builder` + +The app has been renamed to simply `index-builder` and the flags has been completely renamed removing the prefix `combined-` in front of them. So change: + +```yaml +start: + args: + - ... + - combined-index-builder + - ... + flags: + ... + combined-index-builder-grpc-listen-addr: ":9999" + combined-index-builder-index-size: 10000 + combined-index-builder-start-block: 0 + combined-index-builder-stop-block: 0 + ... +``` + +To + +```yaml +start: + args: + - ... + - index-builder + - ... + flags: + ... + index-builder-grpc-listen-addr: ":9999" + index-builder-index-size: 10000 + index-builder-start-block: 0 + index-builder-stop-block: 0 + ... +``` + +> **Note** Rename only configuration item you had previously defined, do not copy paste verbatim example aboe + +* Removed support for `archive-node` app, if you were using this, please use a standard NEAR Archive node to do the same job. + +* Flag `common-block-index-sizes` has been renamed to `common-index-block-sizes`. + +* String variable `{sf-data-dir}` which interpolates at runtime to Firehose data directory is now `{data-dir}`. If any of your parameter value has `{sf-data-dir}` in its value, change it to `{data-dir}`. + + > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + +* The default value for `config-file` changed from `sf.yaml` to `firehose.yaml`. If you didn't had this flag defined and wish to keep the old default, define `config-file: sf.yaml`. + +* The default value for `data-dir` changed from `sf-data` to `firehose-data`. If you didn't had this flag defined before, you should either move `sf-data` to `firehose-data` or define `data-dir: sf-data`. + + > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + +* The flag `verbose` has been renamed to `log-verbosity`. + +* The default value for `common-blocks-cache-dir` changed from `{sf-data-dir}/blocks-cache` to `file://{data-dir}/storage/blocks-cache`. If you didn't had this flag defined and you had `common-blocks-cache-enabled: true`, you should define `common-blocks-cache-dir: {data-dir}/blocks-cache`. + +* The default value for `common-live-blocks-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `common-live-blocks-addr: 15011` and ensure you also modify `relayer-grpc-listen-addr: :15011` (see next entry for details). + +* The default value for `relayer-grpc-listen-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `relayer-grpc-listen-addr: 15011` and ensure you also modify `common-live-blocks-addr: :15011` (see previous entry for details). + +* The default value for `relayer-source` changed from `:15010` to `:10010`. If you didn't had this flag defined and wish to keep the old default, define `relayer-source: 15010` and ensure you also modify `reader-node-grpc-listen-addr: :15010` (see next entry for details). + +* The default value for `reader-node-grpc-listen-addr` changed from `:15010` to `:10010`. If you didn't had this flag defined and wish to keep the old default, define `reader-node-grpc-listen-addr: :15010` and ensure you also modify `relayer-source: :15010` (see previous entry for details). + +* The default value for `reader-node-manager-api-addr` changed from `:15009` to `:10011`. If you didn't had this flag defined and wish to keep the old default, define `reader-node-manager-api-addr: :15010`. + +* The `reader-node-arguments` is not populated anymore with default `--home={node-data-dir} run` which means you must now specify those manually. The variables `{data-dir}`, `{node-data-dir}` and `{hostname}` are interpolated respectively to Firehose absolute `data-dir` value, to Firehose absolute `reader-node-data-dir` value and to current hostname. To upgrade, if you had no `reader-node-arguments` defined, you must now define `reader-node-arguments: --home="{node-data-dir}" run`, if you had a `+` in your `reader-node-arguments: +--some-flag`, you must now define it like `reader-node-arguments: --home="{node-data-dir}" --some-flag run`. + + > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + +* The `reader-node-boot-nodes` flag has been removed entirely, if you have boot nodes to specify, specify them in `reader-node-arguments` using `--boot-nodes=...` instead. + +* Removed unused flags `reader-node-merge-and-store-directly`, `reader-node-merge-threshold-block-age` and `reader-node-wait-upload-complete-on-shutdown`. + +* The flag `receipt-index-builder-index-size` has been renamed to `index-builder-index-size`. + +* The flag `receipt-index-builder-start-block` has been renamed to `index-builder-start-block`. + +* The flag `receipt-index-builder-stop-block` has been renamed to `index-builder-stop-block`. + +* The default value for `firehose-grpc-listen-addr` changed from `:15042` to `:10015`. If you didn't had this flag defined and wish to keep the old default, define `firehose-grpc-listen-addr: :15010`. + +* The default value for `merger-grpc-listen-addr` changed from `:15012` to `:10012`. If you didn't had this flag defined and wish to keep the old default, define `merger-grpc-listen-addr: :15012`. + +#### > **TODO** + +#### Lost of `common-network-id` (custom tags replacement? to be emitted in metrics, I proposed that in https://github.com/streamingfast/firehose-core/issues/5#issuecomment-1658573184) + +#### Lost of `reader-node-ipc-path` (show how to replace) + +#### Lost of `reader-node-enforce-peers` (how could we offer a replacement for that?) + + +##### Document changes to node argument building + +We might want to port back some replacements within firehose-core directly (check with steph) + +``` +func buildNodeArguments(appLogger *zap.Logger, networkID, nodeDataDir, nodeIPCPath, providedArgs, nodeType, nodeRole, bootstrapDataURL string) ([]string, error) { + zlog.Info("building node arguments", zap.String("node-type", nodeType), zap.String("node-role", nodeRole)) + typeRoles, ok := nodeArgsByTypeAndRole[nodeType] + if !ok { + return nil, fmt.Errorf("invalid node type: %s", nodeType) + } + + args, ok := typeRoles[nodeRole] + if !ok { + return nil, fmt.Errorf("invalid node role: %s for type %s", nodeRole, nodeType) + } + + // This sets `--firehose-genesis-file` if the node role is of type reader + // (for which case we are sure that Firehose patch is supported) and if the bootstrap data + // url is a `genesis.json` file. + if nodeRole == "reader" && isGenesisBootstrapper(bootstrapDataURL) { + args += fmt.Sprintf(" --firehose-genesis-file=%s", bootstrapDataURL) + } + + if providedArgs != "" { + if strings.HasPrefix(providedArgs, "+") { + args += " " + strings.TrimLeft(providedArgs, "+") + } else { + args = providedArgs // discard info provided by node type / role + } + } + + args = strings.Replace(args, "{node-data-dir}", nodeDataDir, -1) + args = strings.Replace(args, "{network-id}", networkID, -1) + args = strings.Replace(args, "{node-ipc-path}", nodeIPCPath, -1) + + if strings.Contains(args, "{public-ip}") { + var foundPublicIP string + hostname := os.Getenv("HOSTNAME") + publicIPs := os.Getenv("PUBLIC_IPS") // format is PUBLIC_IPS="reader-v3-1:1.2.3.4 backup-node:5.6.7.8" + for _, pairStr := range strings.Fields(publicIPs) { + pair := strings.Split(pairStr, ":") + if len(pair) != 2 { + continue + } + if pair[0] == hostname { + foundPublicIP = pair[1] + } + } + + if foundPublicIP == "" { + appLogger.Warn("cannot find public IP in environment variable PUBLIC_IPS (format: 'HOSTNAME:a.b.c.d HOSTNAME2:e.f.g.h'), using 127.0.0.1 as fallback", zap.String("hostname", hostname)) + foundPublicIP = "127.0.0.1" + } + args = strings.Replace(args, "{public-ip}", foundPublicIP, -1) + } + + return strings.Fields(args), nil +} +``` + +### Removed + +* Transform `sf.ethereum.transform.v1.LightBlock` is not supported, this has been deprecated for a long time and should not be used anywhere. + # v1.4.22 * Fixed a regression where `reader-node-role` was changed to `dev` by default, putting back the default `geth` value. diff --git a/cmd/fireeth/cli/combined-index-builder.go b/cmd/fireeth/cli/combined-index-builder.go index 689479cb..d3f0869b 100644 --- a/cmd/fireeth/cli/combined-index-builder.go +++ b/cmd/fireeth/cli/combined-index-builder.go @@ -59,7 +59,7 @@ func init() { } stopBlockNum := viper.GetUint64("combined-index-builder-stop-block") - combinedIndexer := transform.NewEthCombinedIndexer(indexStore, viper.GetUint64("combined-index-builder-index-size")) + combinedIndexer := transform.NewEthCombinedIndexerLegacy(indexStore, viper.GetUint64("combined-index-builder-index-size")) handler := bstream.HandlerFunc(func(blk *bstream.Block, obj interface{}) error { combinedIndexer.ProcessBlock(blk.ToProtocol().(*pbeth.Block)) return nil diff --git a/cmd/fireeth/cli/firehose.go b/cmd/fireeth/cli/firehose.go index 942979c6..9db328f5 100644 --- a/cmd/fireeth/cli/firehose.go +++ b/cmd/fireeth/cli/firehose.go @@ -85,7 +85,6 @@ func init() { firehoseGRPCListenAddr := viper.GetString("firehose-grpc-listen-addr") registry := transform.NewRegistry() - registry.Register(ethtransform.LightBlockTransformFactory) registry.Register(ethtransform.HeaderOnlyTransformFactory) registry.Register(ethtransform.MultiLogFilterTransformFactory(indexStore, possibleIndexSizes)) registry.Register(ethtransform.MultiCallToFilterTransformFactory(indexStore, possibleIndexSizes)) diff --git a/cmd/fireeth/cli/node.go b/cmd/fireeth/cli/node.go index fc2151df..bee6b01e 100644 --- a/cmd/fireeth/cli/node.go +++ b/cmd/fireeth/cli/node.go @@ -29,10 +29,9 @@ import ( nodemanager "github.com/streamingfast/firehose-ethereum/node-manager" "github.com/streamingfast/firehose-ethereum/node-manager/dev" "github.com/streamingfast/firehose-ethereum/node-manager/geth" - "github.com/streamingfast/firehose-ethereum/node-manager/openeth" "github.com/streamingfast/logging" nodeManager "github.com/streamingfast/node-manager" - nodeManagerApp "github.com/streamingfast/node-manager/app/node_manager2" + nodeManagerApp "github.com/streamingfast/node-manager/app/node_manager" "github.com/streamingfast/node-manager/metrics" reader "github.com/streamingfast/node-manager/mindreader" "github.com/streamingfast/node-manager/operator" @@ -44,11 +43,9 @@ import ( var nodeLogger, nodeTracer = logging.PackageLogger("node", "github.com/streamingfast/firehose-ethereum/node") var nodeGethLogger, _ = logging.PackageLogger("node.geth", "github.com/streamingfast/firehose-ethereum/node/geth", DefaultLevelInfo) -var nodeOpenEthereumLogger, _ = logging.PackageLogger("node.openethereum", "github.com/streamingfast/firehose-ethereum/node/open-ethereum", DefaultLevelInfo) var readerLogger, readerTracer = logging.PackageLogger("reader", "github.com/streamingfast/firehose-ethereum/mindreader") var readerGethLogger, _ = logging.PackageLogger("reader.geth", "github.com/streamingfast/firehose-ethereum/mindreader/geth", DefaultLevelInfo) -var readerOpenEthereumLogger, _ = logging.PackageLogger("reader.open-ethereum", "github.com/streamingfast/firehose-ethereum/mindreader/open-ethereum", DefaultLevelInfo) func registerNodeApp(backupModuleFactories map[string]operator.BackupModuleFactory) { launcher.RegisterApp(zlog, &launcher.AppDef{ @@ -260,12 +257,6 @@ func getSupervisedProcessLogger(isReader bool, nodeType string) *zap.Logger { } else { return nodeGethLogger } - case "openethereum": - if isReader { - return readerOpenEthereumLogger - } else { - return nodeOpenEthereumLogger - } default: panic(fmt.Errorf("unknown node type %q, only knows about %q, %q and %q", nodeType, "geth", "openethereum", "dev")) } @@ -487,24 +478,7 @@ func buildSuperviser( } return superviser, nil - case "openethereum": - superviser, err := openeth.NewSuperviser( - nodePath, - nodeDataDir, - nodeIPCPath, - nodeArguments, - deepMind, - debugDeepMind, - metricsAndReadinessManager.UpdateHeadBlock, - enforcedPeers, - logToZap, - appLogger, nodeGethLogger, - ) - if err != nil { - return nil, fmt.Errorf("unable to create chain superviser: %w", err) - } - return superviser, nil default: return nil, fmt.Errorf("unsupported node type: %s", nodeType) } diff --git a/cmd/fireeth/main.go b/cmd/fireeth/main.go index a291c94c..935a9c07 100644 --- a/cmd/fireeth/main.go +++ b/cmd/fireeth/main.go @@ -1,38 +1,75 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 main import ( - "github.com/streamingfast/firehose-ethereum/cmd/fireeth/cli" - "github.com/streamingfast/node-manager/operator" - "github.com/streamingfast/snapshotter" + "github.com/spf13/cobra" + firecore "github.com/streamingfast/firehose-core" + "github.com/streamingfast/firehose-ethereum/codec" + "github.com/streamingfast/firehose-ethereum/transform" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "github.com/streamingfast/logging" + "github.com/streamingfast/node-manager/mindreader" + pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" + "go.uber.org/zap" + "google.golang.org/protobuf/reflect/protoreflect" ) -// Version value, injected via go build `ldflags` at build time -var version = "dev" - func init() { - cli.RootCmd.Version = cli.Version(version) + firecore.UnsafePayloadKind = pbbstream.Protocol_ETH } func main() { - cli.Main(cli.RegisterCommonFlags, nil, map[string]operator.BackupModuleFactory{ - "gke-pvc-snapshot": gkeSnapshotterFactory, + firecore.Main(&firecore.Chain[*pbeth.Block]{ + ShortName: "eth", + LongName: "Ethereum", + ExecutableName: "geth", + FullyQualifiedModule: "github.com/streamingfast/firehose-ethereum", + Version: version, + + Protocol: "ETH", + ProtocolVersion: 1, + + BlockFactory: func() firecore.Block { return new(pbeth.Block) }, + + BlockIndexerFactories: map[string]firecore.BlockIndexerFactory[*pbeth.Block]{ + transform.CombinedIndexerShortName: transform.NewEthCombinedIndexer, + }, + + BlockTransformerFactories: map[protoreflect.FullName]firecore.BlockTransformerFactory{ + transform.HeaderOnlyMessageName: transform.NewHeaderOnlyTransformFactory, + transform.CombinedFilterMessageName: transform.NewCombinedFilterTransformFactory, + + // Still needed? + transform.MultiCallToFilterMessageName: transform.NewMultiCallToFilterTransformFactory, + transform.MultiLogFilterMessageName: transform.NewMultiLogFilterTransformFactory, + }, + + ConsoleReaderFactory: func(lines chan string, blockEncoder firecore.BlockEncoder, logger *zap.Logger, tracer logging.Tracer) (mindreader.ConsolerReader, error) { + // FIXME: This was hardcoded also in the previouse firehose-near version, Firehose will break if this is not available + // blockEncoder + return codec.NewConsoleReader(logger, lines) + }, + + // ReaderNodeBootstrapperFactory: newReaderNodeBootstrapper, + + Tools: &firecore.ToolsConfig[*pbeth.Block]{ + BlockPrinter: printBlock, + + RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { + // toolsCmd.AddCommand(newToolsGenerateNodeKeyCmd(chain)) + // toolsCmd.AddCommand(newToolsBackfillCmd(zlog)) + + return nil + }, + + TransformFlags: map[string]*firecore.TransformFlag{ + // "receipt-account-filters": { + // Description: "Comma-separated accounts to use as filter/index. If it contains a colon (:), it will be interpreted as : (each of which can be empty, ex: 'hello:' or ':world')", + // Parser: parseReceiptAccountFilters, + // }, + }, + }, }) } -func gkeSnapshotterFactory(conf operator.BackupModuleConfig) (operator.BackupModule, error) { - return snapshotter.NewGKEPVCSnapshotter(conf) -} +// Version value, injected via go build `ldflags` at build time, **must** not be removed or inlined +var version = "dev" diff --git a/cmd/fireeth/tools.go b/cmd/fireeth/tools.go new file mode 100644 index 00000000..de0b735f --- /dev/null +++ b/cmd/fireeth/tools.go @@ -0,0 +1,33 @@ +package main + +import ( + "encoding/hex" + "fmt" + "io" + + "github.com/streamingfast/bstream" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" +) + +func printBlock(blk *bstream.Block, alsoPrintTransactions bool, out io.Writer) error { + block := blk.ToProtocol().(*pbeth.Block) + + if _, err := fmt.Fprintf(out, "Block #%d (%s) (prev: %s): %d transactions\n", + block.Num(), + block.ID(), + block.PreviousID()[0:7], + len(block.TransactionTraces), + ); err != nil { + return err + } + + if alsoPrintTransactions { + for _, trx := range block.TransactionTraces { + if _, err := fmt.Fprintf(out, " - Transaction %s\n", hex.EncodeToString(trx.Hash)); err != nil { + return err + } + } + } + + return nil +} diff --git a/go.mod b/go.mod index 6e8f95e9..c2569bbe 100644 --- a/go.mod +++ b/go.mod @@ -14,25 +14,26 @@ require ( github.com/manifoldco/promptui v0.9.0 github.com/mitchellh/go-testing-interface v1.14.1 github.com/mostynb/go-grpc-compression v1.1.17 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.15.0 github.com/streamingfast/bstream v0.0.2-0.20230829131224-b9272048dc6a github.com/streamingfast/cli v0.0.4-0.20230825151644-8cc84512cd80 github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330 github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1 github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa - github.com/streamingfast/dlauncher v0.0.0-20230201165548-2d1aa7607b13 + github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa github.com/streamingfast/dmetrics v0.0.0-20230919161904-206fa8ebd545 github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9 - github.com/streamingfast/firehose-ethereum/types v0.0.0-20230911152856-ecc5a5edb14f + github.com/streamingfast/firehose-core v0.1.7-0.20230825192517-7bcda2c1d32a + github.com/streamingfast/firehose-ethereum/types v0.0.0-20230802141234-f0dd68e1f596 github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 - github.com/streamingfast/merger v0.0.3-0.20221123202507-445dfd357868 - github.com/streamingfast/node-manager v0.0.2-0.20221115101723-d9823ffd7ad5 + github.com/streamingfast/merger v0.0.3-0.20230413191947-fe3ce68cb9f8 + github.com/streamingfast/node-manager v0.0.2-0.20230406142433-692298a8b8d2 github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 github.com/streamingfast/relayer v0.0.2-0.20220909122435-e67fbc964fd9 github.com/streamingfast/sf-tools v0.0.0-20230811131237-97a5d4afa459 @@ -75,7 +76,7 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.3.1 // indirect - github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d // indirect + github.com/blendle/zapdriver v1.3.1 // indirect github.com/bobg/go-generics/v2 v2.1.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/bufbuild/connect-go v1.10.0 // indirect @@ -128,6 +129,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/cpuid/v2 v2.2.3 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect @@ -172,9 +174,10 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 // indirect - github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5 // indirect + github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad // indirect github.com/streamingfast/dtracing v0.0.0-20220305214756-b5c0e8699839 // indirect github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 // indirect + github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf // indirect github.com/tetratelabs/wazero v1.1.0 // indirect diff --git a/go.sum b/go.sum index b6e1776c..fb2c7845 100644 --- a/go.sum +++ b/go.sum @@ -172,9 +172,8 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/bits-and-blooms/bitset v1.3.1 h1:y+qrlmq3XsWi+xZqSaueaE8ry8Y127iMxlMfqcK8p0g= github.com/bits-and-blooms/bitset v1.3.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d h1:fSlGu5ePbkjBidXuj2O5j9EcYrVB5Cr6/wdkYyDgxZk= -github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d/go.mod h1:yCBkgASmKHgUOFjK9h1sOytUVgA+JkQjqj3xYP4AdWY= github.com/bobg/go-generics/v2 v2.1.1 h1:4rN9upY6Xm4TASSMeH+NzUghgO4h/SbNrQphIjRd/R0= github.com/bobg/go-generics/v2 v2.1.1/go.mod h1:iPMSRVFlzkJSYOCXQ0n92RA3Vxw0RBv2E8j9ZODXgHk= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= @@ -479,6 +478,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs= @@ -520,6 +520,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= 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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -572,8 +574,8 @@ github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqf github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -739,8 +741,8 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU 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.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -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/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= 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= @@ -759,16 +761,17 @@ github.com/streamingfast/cli v0.0.4-0.20230825151644-8cc84512cd80/go.mod h1:QxjV github.com/streamingfast/dauth v0.0.0-20210812020920-1c83ba29add1/go.mod h1:FIYpVqt+ICVuNBoOH3ZIicIctpVoCq3393+RpfXsPEM= github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330 h1:49JYZkn8ALGe+LhcACZyX3L9B8tIxRZ3F3l+OxmNMhY= github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330/go.mod h1:zfq+mtesfbaZnNeh1BF+vo+zEFP1sat4pm3lvt40nRw= -github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5 h1:m/3aIPNXCwZ9m/dfYdOs8ftrS7GJl82ipVr6K2aZiBs= github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= +github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad h1:6z4uS6TlD9KoHdyE1vzoGsELVCCcviTFT/3/vqCylh8= +github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= github.com/streamingfast/derr v0.0.0-20210811180100-9138d738bcec/go.mod h1:ulVfui/yGXmPBbt9aAqCWdAjM7YxnZkYHzvQktLfw3M= github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1 h1:xJB7rXnOHLesosMjfwWsEL2i/40mFSkzenEb3M0qTyM= github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1/go.mod h1:QSm/AfaDsE0k1xBYi0lW580YJ/WDV/FKZI628tkZR0Y= github.com/streamingfast/dgrpc v0.0.0-20220909121013-162e9305bbfc/go.mod h1:YlFJuFiB9rmglB5UfTfnsOTfKC1rFo+D0sRbTzLcqgc= github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa h1:L/Ipge5pkZtyHucT7c8F/PiCitiNqQxjoUuxyzWKZew= github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa/go.mod h1:AcY2kk28XswihgU6z37288a3ZF4gGGO7nNwlTI/vET4= -github.com/streamingfast/dlauncher v0.0.0-20230201165548-2d1aa7607b13 h1:B+sUDgOmOAPWhUcRIcuDitTGGiOCWDwhGWv+XIaeeNc= -github.com/streamingfast/dlauncher v0.0.0-20230201165548-2d1aa7607b13/go.mod h1:xErlHEDd5+4NlR+Mg3ZtW7BTTLB0yZBxZAjHPrkk8X4= +github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e h1:Nh/gLDv8rOMIidb/gpO4rZOYVe09k+tof/trezkpku4= +github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e/go.mod h1:xErlHEDd5+4NlR+Mg3ZtW7BTTLB0yZBxZAjHPrkk8X4= github.com/streamingfast/dmetering v0.0.0-20220301165106-a642bb6a21bd/go.mod h1:Eu1SH2HyBbDUmQqJV+f5oowCQ/c02HkAZyR5U2BKIT8= github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa h1:bM6iy5X7Gtw1oh1bMxFmtroouKZu4K4BHXaFvR96jNw= github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa/go.mod h1:3XggUfQMyciaue133qhbIkFqJQqNzozGpa/gI3sdwac= @@ -787,8 +790,10 @@ github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1/go.mod h1:UEm github.com/streamingfast/firehose v0.1.1-0.20221017171248-8fd3adbe7b4d/go.mod h1:weGz9xDNJMBNmn03XiJZ/b5Ngw8UAUoLirarqG7OwQY= github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9 h1:SybLEPFkJk8EINJGDlijSWxEZGNXDul4zqlDpttQUCI= github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9/go.mod h1:lGC1T6mpAAApjBQNF5COSXb3SbrYRI3dBR1f6/PZE54= -github.com/streamingfast/firehose-ethereum/types v0.0.0-20230911152856-ecc5a5edb14f h1:aZDa7RI+lYrBxTkZ4oNEM3NDc0FUhi10raYxCJmbTOs= -github.com/streamingfast/firehose-ethereum/types v0.0.0-20230911152856-ecc5a5edb14f/go.mod h1:Kh5fptEEMKVw/QXrdfr49ldY3SP5+/MJoUPQfUtByUU= +github.com/streamingfast/firehose-core v0.1.7-0.20230825192517-7bcda2c1d32a h1:k1ycDIyswPqrM9/cxvOOeLNbtI9/CQXBpYpkQCUOQwI= +github.com/streamingfast/firehose-core v0.1.7-0.20230825192517-7bcda2c1d32a/go.mod h1:ArmpKvAPFBkUCzpslRmvIW3Os7ImGT03RSgBJiG8zIM= +github.com/streamingfast/firehose-ethereum/types v0.0.0-20230802141234-f0dd68e1f596 h1:2SIsuLBhc2MchfSFlcmK59/QaryS7EndmQakvlf/eS0= +github.com/streamingfast/firehose-ethereum/types v0.0.0-20230802141234-f0dd68e1f596/go.mod h1:Kh5fptEEMKVw/QXrdfr49ldY3SP5+/MJoUPQfUtByUU= github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 h1:dgYLhP3STiPi30fISAijFPEB11D4r1fQFc8D3cpgV5s= github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2/go.mod h1:OYv1UX/kRsV9aP4SEwa9zpt34qGzdtJzOvdGn+n56as= github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 h1:g8eEYbFSykyzIyuxNMmHEUGGUvJE0ivmqZagLDK42gw= @@ -800,10 +805,10 @@ github.com/streamingfast/logging v0.0.0-20220304183711-ddba33d79e27/go.mod h1:4G github.com/streamingfast/logging v0.0.0-20220304214715-bc750a74b424/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= -github.com/streamingfast/merger v0.0.3-0.20221123202507-445dfd357868 h1:L7VhktkU+fVn2GWU+t1EVP6H2bYkKylWXefWSV7GCqg= -github.com/streamingfast/merger v0.0.3-0.20221123202507-445dfd357868/go.mod h1:WGMs+zwpPQNfzRnOqnyNdQfyGSG4lXYWQacicAGiP4s= -github.com/streamingfast/node-manager v0.0.2-0.20221115101723-d9823ffd7ad5 h1:R7hbTRB1NfC2J2C4BJYrYGtfBpDJCjctvoedAPpPoBQ= -github.com/streamingfast/node-manager v0.0.2-0.20221115101723-d9823ffd7ad5/go.mod h1:6z7e2s6kcZCzM/UN8IUtGU24+TRp5Nygv+1ucvfXvJA= +github.com/streamingfast/merger v0.0.3-0.20230413191947-fe3ce68cb9f8 h1:riOEu4aTwjy7Gjq8safA8kYUs+jVKi/gZ0+k7S/w/u8= +github.com/streamingfast/merger v0.0.3-0.20230413191947-fe3ce68cb9f8/go.mod h1:WGMs+zwpPQNfzRnOqnyNdQfyGSG4lXYWQacicAGiP4s= +github.com/streamingfast/node-manager v0.0.2-0.20230406142433-692298a8b8d2 h1:6Jdu6LBwaW38n2jjInFk1fM460cq+5paEAHGPPRWWN0= +github.com/streamingfast/node-manager v0.0.2-0.20230406142433-692298a8b8d2/go.mod h1:R5WwJuyNueq0QXKAFinTGU8zaON0hWJBFHX6KA9WZqk= github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 h1:xlWSfi1BoPfsHtPb0VEHGUcAdBF208LUiFCwfaVPfLA= github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308/go.mod h1:K1p8Bj/wG34KJvYzPUqtzpndffmpkrVY11u2hkyxCWQ= github.com/streamingfast/overseer v0.2.1-0.20210326144022-ee491780e3ef h1:9IVFHRsqvI+vKJwgF1OMV6L55jHbaV/ZLoU4IAG/dME= @@ -825,6 +830,8 @@ github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 h1:Y15G1 github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0/go.mod h1:/Rnz2TJvaShjUct0scZ9kKV2Jr9/+KBAoWy4UMYxgv4= github.com/streamingfast/substreams v1.1.20 h1:61k/HKti9xo7vDAu5zew/VL8qzY+ye/9Zzt1om+tVks= github.com/streamingfast/substreams v1.1.20/go.mod h1:Ak7a+EM8MRehep0ZaQD1NwG27ZE9auZY9+/VLbhBnDU= +github.com/streamingfast/substreams v1.1.12-0.20230825185616-0ba49a2ee9ee h1:Q78BDGVmulzXgPoovmhLCUcxc98RFxYhifoukQflWHk= +github.com/streamingfast/substreams v1.1.12-0.20230825185616-0ba49a2ee9ee/go.mod h1:Thcw2blrOD8uwRMGKhjD4BXwy1Fp9UADxIRHRme+raQ= 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= diff --git a/node-manager/geth/bootstrap.go b/node-manager/geth/bootstrap.go index 683a2db1..30a412c0 100644 --- a/node-manager/geth/bootstrap.go +++ b/node-manager/geth/bootstrap.go @@ -29,7 +29,7 @@ import ( "go.uber.org/zap" ) -//GenesisBootstrapper needs to write genesis file, static node file, then run a command like 'geth init' +// GenesisBootstrapper needs to write genesis file, static node file, then run a command like 'geth init' type GenesisBootstrapper struct { dataDir string genesisFileURL string diff --git a/node-manager/openeth/monitoring.go b/node-manager/openeth/monitoring.go deleted file mode 100644 index 03f161b9..00000000 --- a/node-manager/openeth/monitoring.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 openeth - -import ( - "fmt" - "time" - - "github.com/streamingfast/bstream" - "github.com/tidwall/gjson" - "go.uber.org/zap" -) - -// Monitor periodically checks the head block num and block time, as well as the enode string (server ID) -func (s *Superviser) Monitor() { - started := time.Now() - for { - time.Sleep(2 * time.Second) - - if !s.IsRunning() { - continue - } - - resp, err := s.sendIPCCommand(`{"jsonrpc":"2.0","method":"parity_enode","params":[],"id":1}`) - if err != nil { - s.Logger.Warn("geth Monitor cannot get info from IPC socket", zap.Error(err)) - if time.Since(started) < time.Minute { - continue - } - } else { - s.setEnodeStr(gjson.Get(resp, "result").String()) - } - - resp, err = s.sendIPCCommand(`{"method":"parity_netPeers","params":[],"id":1,"jsonrpc":"2.0"}`) - if err != nil { - s.Logger.Warn("geth Monitor cannot get peers from IPC socket", zap.Error(err)) - } else { - connectedPeers := []string{} - for _, peer := range gjson.Get(resp, "result.peers").Array() { - connectedPeers = append(connectedPeers, peer.Get("id").String()) - } - s.infoMutex.Lock() - s.connectedPeers = connectedPeers - s.infoMutex.Unlock() - } - - if s.headBlockUpdateFunc != nil { - resp, err = s.sendIPCCommand(`{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}`) - if err != nil { - s.Logger.Warn("geth Monitor cannot get blocknumber from IPC socket", zap.Error(err)) - continue - } - lastBlock := gjson.Get(resp, "result") - lastBlockNum := hex2uint(lastBlock.String()) - if lastBlockNum == 0 { - continue - } - - resp, err = s.sendIPCCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["%s", true],"id":1}`, lastBlock)) - if err != nil { - s.Logger.Warn("geth Monitor cannot get block by number", zap.Error(err)) - continue - } - timestamp := time.Unix(hex2int(gjson.Get(resp, "result.timestamp").String()), 0) - hash := hex2string(gjson.Get(resp, "result.hash").String()) - - s.headBlockUpdateFunc(&bstream.Block{ - Id: hash, - Number: uint64(lastBlockNum), - Timestamp: timestamp, - }) - - } - - } -} diff --git a/node-manager/openeth/superviser.go b/node-manager/openeth/superviser.go deleted file mode 100644 index 4395d05d..00000000 --- a/node-manager/openeth/superviser.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 openeth - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "sync" - "time" - - "go.uber.org/zap/zapcore" - - "github.com/ShinyTrinkets/overseer" - nodemanager "github.com/streamingfast/firehose-ethereum/node-manager" - nodeManager "github.com/streamingfast/node-manager" - logplugin "github.com/streamingfast/node-manager/log_plugin" - "github.com/streamingfast/node-manager/superviser" - "github.com/tidwall/gjson" - "go.uber.org/zap" -) - -var enodeRegexp = regexp.MustCompile(`enode://([a-f0-9]*)@.*$`) - -type Superviser struct { - *nodemanager.Superviser - - //backupMutex sync.Mutex - infoMutex sync.Mutex - binary string - arguments []string - dataDir string - chaindataDir string - ipcFilePath string - snapshotsFolder string - lastBlockSeen uint64 - enodeStr string - connectedPeers []string - headBlockUpdateFunc nodeManager.HeadBlockUpdater - - logger *zap.Logger -} - -func (s *Superviser) GetName() string { - return "open ethereum" -} - -func NewSuperviser( - binary string, - dataDir string, - ipcFilePath string, - arguments []string, - isReader bool, - debugDeepMind bool, - headBlockUpdateFunc nodeManager.HeadBlockUpdater, - enforcePeersStr string, - logToZap bool, - appLogger *zap.Logger, - nodelogger *zap.Logger, -) (*Superviser, error) { - // Ensure process manager line buffer is large enough (50 MiB) for our Deep Mind instrumentation outputting lot's of text. - overseer.DEFAULT_LINE_BUFFER_SIZE = 50 * 1024 * 1024 - - superviser := &Superviser{ - Superviser: &nodemanager.Superviser{ - Superviser: superviser.New(appLogger, binary, arguments), - Logger: appLogger, - }, - - binary: binary, - arguments: arguments, - dataDir: dataDir, - chaindataDir: filepath.Join(dataDir, "chains"), - ipcFilePath: ipcFilePath, - snapshotsFolder: filepath.Join(dataDir, "snapshots"), - connectedPeers: []string{}, - headBlockUpdateFunc: headBlockUpdateFunc, - logger: appLogger, - } - - if !isReader { - superviser.RegisterLogPlugin(logplugin.LogPluginFunc(superviser.lastBlockSeenLogPlugin)) - } - - if logToZap { - superviser.RegisterLogPlugin(nodemanager.NewGethToZapLogPlugin(debugDeepMind, nodelogger)) - } else { - superviser.RegisterLogPlugin(logplugin.NewToConsoleLogPlugin(debugDeepMind)) - } - - appLogger.Info("creating snapshots folder") - err := os.MkdirAll(superviser.snapshotsFolder, os.ModePerm) - if err != nil { - return nil, fmt.Errorf("unable to create snapshots folder %q: %s", superviser.snapshotsFolder, err) - } - - if enforcePeersStr != "" { - enforcedPeers := strings.Split(enforcePeersStr, ",") - appLogger.Info("enforcing peers by dns", zap.Strings("peers", enforcedPeers)) - go superviser.EnsurePeersByDNS(enforcedPeers) - } - - appLogger.Info("created openethereum superviser", zap.Object("superviser", superviser)) - return superviser, nil -} -func (s *Superviser) GetCommand() string { - return s.binary + " " + strings.Join(s.arguments, " ") -} - -func (s *Superviser) HasData() bool { - _, err := os.Stat(s.chaindataDir) - return err == nil -} - -func (s *Superviser) UpdateLastBlockSeen(blockNum uint64) { - s.lastBlockSeen = blockNum -} - -func (s *Superviser) LastSeenBlockNum() uint64 { - return s.lastBlockSeen -} - -func (s *Superviser) ServerID() (string, error) { - id := s.enodeStr - if id != "" { - return id, nil - } - return "", fmt.Errorf("enode not fetched yet") -} - -func (s *Superviser) lastBlockSeenLogPlugin(line string) { - switch { - case strings.HasPrefix(line, "DMLOG FINALIZE_BLOCK"): - line = strings.TrimSpace(strings.TrimPrefix(line, "DMLOG FINALIZE_BLOCK")) - case strings.HasPrefix(line, "FIRE FINALIZE_BLOCK"): - line = strings.TrimSpace(strings.TrimPrefix(line, "FIRE FINALIZE_BLOCK")) - default: - return - } - - blockNum, err := strconv.ParseUint(line, 10, 64) - if err != nil { - s.logger.Error("unable to extract last block num", zap.String("line", line), zap.Error(err)) - return - } - - //metrics.SetHeadBlockNumber(blockNum) - s.lastBlockSeen = blockNum -} - -// AddPeer sends a command through IPC socket to connect geth to the given peer -func (s *Superviser) AddPeer(peer string) error { - for _, peerPrefix := range append(s.connectedPeers, s.enodeStr[0:19]) { //connected or ourself - if strings.Contains(peer, peerPrefix) { - return nil - } - } - - resp, err := s.sendIPCCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"parity_addReservedPeer","params":["%s"],"id":1}`, peer)) - if err != nil { - return err - } - if !gjson.Get(resp, "result").Bool() { - return fmt.Errorf("result not true") - } - return nil -} - -func (s *Superviser) sendIPCCommand(cmd string) (string, error) { - c, err := net.Dial("unix", s.ipcFilePath) - if err != nil { - return "", err - } - defer c.Close() - - _, err = c.Write([]byte(cmd)) - if err != nil { - return "", err - } - - resp, err := readString(c) - return resp, err -} - -func (s *Superviser) setEnodeStr(enodeStr string) error { - ipAddr := getIPAddress() - if ipAddr == "" { - return fmt.Errorf("cannot find local IP address") - } - - s.infoMutex.Lock() - defer s.infoMutex.Unlock() - fixedEnodeStr := enodeRegexp.ReplaceAllString(enodeStr, fmt.Sprintf(`enode://${1}@%s:30303`, ipAddr)) - if fixedEnodeStr != "" && s.enodeStr != fixedEnodeStr { - s.enodeStr = fixedEnodeStr - } - return nil -} - -// EnsurePeersByDNS periodically checks IP addresses on the given FQDNs, -// calls /v1/server_id on port 8080 and adds them as peers -// wantedPeersHostnames can point to the headless service name in k8s -func (s *Superviser) EnsurePeersByDNS(wantedPeersHostnames []string) { - for { - time.Sleep(10 * time.Second) - if !s.IsRunning() { - s.logger.Info("supervisor not running, will retry to add peers") - continue - } - if len(s.enodeStr) < 20 { - s.logger.Info("wrong enode string will retry", zap.String("enode", s.enodeStr)) - continue - } - - var allEnodes []string - for _, hostname := range wantedPeersHostnames { - enodes := s.getEnodesFromPeers(hostname) - s.logger.Debug("got enode", zap.String("hostname", hostname), zap.Strings("enodes", enodes)) - allEnodes = append(allEnodes, enodes...) - } - - for _, enode := range allEnodes { - if err := s.AddPeer(enode); err != nil { - s.logger.Warn("cannot add peer", zap.String("enode", enode)) - } - } - } -} -func (s *Superviser) getEnodesFromPeers(hostname string) []string { - ips, err := net.LookupIP(hostname) - if err != nil { - s.logger.Warn("cannot get IP for hostname", zap.Error(err), zap.String("hostname", hostname)) - return nil - } - var enodes []string - for _, ip := range ips { - enodeAddr, err := httpGet(fmt.Sprintf("http://%s:8080/v1/server_id", ip)) - if err != nil { - s.logger.Warn("error getting enode string from IP", zap.Stringer("ip", ip)) - continue - } - if !strings.HasPrefix(enodeAddr, "enode://") { - s.logger.Warn("got invalid enode string from IP", zap.Stringer("ip", ip), zap.String("enode", enodeAddr)) - continue - } - enodes = append(enodes, enodeAddr) - } - return enodes -} - -func readString(r io.Reader) (string, error) { - br := bufio.NewReader(r) - var line string - for { - l, err := br.ReadString('\n') - if len(l) > 0 { - line += l - } - switch err { - case bufio.ErrBufferFull: - continue - case io.EOF, nil: - return line, nil - default: - return "", err - } - } -} - -func hex2int(hexStr string) int64 { - // remove 0x suffix if found in the input string - cleaned := strings.Replace(hexStr, "0x", "", -1) - - // base 16 for hexadecimal - result, _ := strconv.ParseInt(cleaned, 16, 64) - return result -} - -func hex2uint(hexStr string) uint64 { - // remove 0x suffix if found in the input string - cleaned := strings.Replace(hexStr, "0x", "", -1) - - // base 16 for hexadecimal - result, _ := strconv.ParseUint(cleaned, 16, 64) - return result -} - -func hex2string(hexStr string) string { - // remove 0x suffix if found in the input string - return strings.Replace(hexStr, "0x", "", -1) -} - -func getIPAddress() string { - ifaces, err := net.Interfaces() - if err != nil { - return "" - } - for _, i := range ifaces { - addrs, err := i.Addrs() - if err != nil { - continue - } - for _, addr := range addrs { - var ip net.IP - switch v := addr.(type) { - case *net.IPNet: - ip = v.IP - case *net.IPAddr: - ip = v.IP - } - if ip.IsGlobalUnicast() { - return ip.String() - } - } - } - return "" -} - -func httpGet(addr string) (string, error) { - resp, err := http.Get(addr) - if err != nil { - return "", err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - return string(body), nil -} - -func (s *Superviser) MarshalLogObject(enc zapcore.ObjectEncoder) error { - enc.AddString("binary", s.binary) - enc.AddArray("arguments", nodemanager.StringArray(s.arguments)) - enc.AddString("data_dir", s.dataDir) - enc.AddString("chaindata_dir", s.chaindataDir) - enc.AddString("ipc_file_path", s.chaindataDir) - enc.AddString("snapshots_folder", s.snapshotsFolder) - enc.AddUint64("last_block_seen", s.lastBlockSeen) - enc.AddString("enode_str", s.enodeStr) - - return nil -} diff --git a/proto/sf/ethereum/transform/v1/transforms.proto b/proto/sf/ethereum/transform/v1/transforms.proto index c5444cc3..cdb2c03a 100644 --- a/proto/sf/ethereum/transform/v1/transforms.proto +++ b/proto/sf/ethereum/transform/v1/transforms.proto @@ -60,11 +60,6 @@ message CallToFilter { repeated bytes signatures = 2; } -// Deprecated: LightBlock is deprecated, replaced by HeaderOnly, note however that the new transform -// does not have any transactions traces returned, so it's not a direct replacement. -message LightBlock { -} - // HeaderOnly returns only the block's header and few top-level core information for the block. Useful // for cases where no transactions information is required at all. // diff --git a/transform/block_header_only.go b/transform/block_header_only.go index 25cbddde..1aa1ae00 100644 --- a/transform/block_header_only.go +++ b/transform/block_header_only.go @@ -6,6 +6,7 @@ import ( "github.com/streamingfast/bstream" "github.com/streamingfast/bstream/transform" + "github.com/streamingfast/dstore" pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "go.uber.org/zap" @@ -15,6 +16,10 @@ import ( var HeaderOnlyMessageName = proto.MessageName(&pbtransform.HeaderOnly{}) +func NewHeaderOnlyTransformFactory(_ dstore.Store, _ []uint64) (*transform.Factory, error) { + return HeaderOnlyTransformFactory, nil +} + var HeaderOnlyTransformFactory = &transform.Factory{ Obj: &pbtransform.HeaderOnly{}, NewFunc: func(message *anypb.Any) (transform.Transform, error) { diff --git a/transform/call_filter.go b/transform/call_filter.go index 1260b58e..76bdb62b 100644 --- a/transform/call_filter.go +++ b/transform/call_filter.go @@ -81,6 +81,10 @@ func (p *CallToFilter) matches(trace *pbeth.TransactionTrace) bool { return false } +func NewMultiCallToFilterTransformFactory(indexStore dstore.Store, possibleIndexSizes []uint64) (*transform.Factory, error) { + return MultiCallToFilterTransformFactory(indexStore, possibleIndexSizes), nil +} + // backwards compatibility, returns a combined filter now func MultiCallToFilterTransformFactory(indexStore dstore.Store, possibleIndexSizes []uint64) *transform.Factory { return &transform.Factory{ diff --git a/transform/combined_filter.go b/transform/combined_filter.go index cdc692c8..4cdf522e 100644 --- a/transform/combined_filter.go +++ b/transform/combined_filter.go @@ -10,6 +10,7 @@ import ( "github.com/streamingfast/bstream/transform" "github.com/streamingfast/dstore" "github.com/streamingfast/eth-go" + firecore "github.com/streamingfast/firehose-core" pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "google.golang.org/protobuf/proto" @@ -28,6 +29,10 @@ type Indexer interface { var CombinedFilterMessageName = proto.MessageName(&pbtransform.CombinedFilter{}) +func NewCombinedFilterTransformFactory(indexStore dstore.Store, possibleIndexSizes []uint64) (*transform.Factory, error) { + return CombinedFilterTransformFactory(indexStore, possibleIndexSizes), nil +} + func CombinedFilterTransformFactory(indexStore dstore.Store, possibleIndexSizes []uint64) *transform.Factory { return &transform.Factory{ Obj: &pbtransform.CombinedFilter{}, @@ -104,7 +109,11 @@ type EthCombinedIndexer struct { BlockIndexer Indexer } -func NewEthCombinedIndexer(indexStore dstore.Store, indexSize uint64) *EthCombinedIndexer { +func NewEthCombinedIndexer(indexStore dstore.Store, indexSize uint64) (firecore.BlockIndexer[*pbeth.Block], error) { + return NewEthCombinedIndexerLegacy(indexStore, indexSize), nil +} + +func NewEthCombinedIndexerLegacy(indexStore dstore.Store, indexSize uint64) *EthCombinedIndexer { bi := transform.NewBlockIndexer(indexStore, indexSize, CombinedIndexerShortName) return &EthCombinedIndexer{ BlockIndexer: bi, @@ -112,7 +121,7 @@ func NewEthCombinedIndexer(indexStore dstore.Store, indexSize uint64) *EthCombin } // ProcessBlock implements chain-specific logic for Ethereum bstream.Block's -func (i *EthCombinedIndexer) ProcessBlock(blk *pbeth.Block) { +func (i *EthCombinedIndexer) ProcessBlock(blk *pbeth.Block) error { keys := make(map[string]bool) for _, trace := range blk.TransactionTraces { for key := range callKeys(trace, IdxPrefixCall) { @@ -128,7 +137,7 @@ func (i *EthCombinedIndexer) ProcessBlock(blk *pbeth.Block) { } i.BlockIndexer.Add(keyArray, blk.Number) - return + return nil } func addSigString(in AddressSignatureFilter) string { diff --git a/transform/light_block.go b/transform/light_block.go deleted file mode 100644 index 4276aa19..00000000 --- a/transform/light_block.go +++ /dev/null @@ -1,102 +0,0 @@ -package transform - -import ( - "encoding/hex" - "fmt" - - "github.com/streamingfast/bstream" - "github.com/streamingfast/bstream/transform" - pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - "go.uber.org/zap" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/anypb" -) - -var LightBlockMessageName = proto.MessageName(&pbtransform.LightBlock{}) - -var LightBlockTransformFactory = &transform.Factory{ - Obj: &pbtransform.LightBlock{}, - NewFunc: func(message *anypb.Any) (transform.Transform, error) { - mname := message.MessageName() - if mname != LightBlockMessageName { - return nil, fmt.Errorf("expected type url %q, recevied %q ", LightBlockMessageName, message.TypeUrl) - } - - filter := &pbtransform.LightBlock{} - err := proto.Unmarshal(message.Value, filter) - if err != nil { - return nil, fmt.Errorf("unexpected unmarshall error: %w", err) - } - return &LightBlockFilter{}, nil - }, -} - -type LightBlockFilter struct{} - -func (p *LightBlockFilter) String() string { - return "light block filter" -} - -func (p *LightBlockFilter) Transform(readOnlyBlk *bstream.Block, in transform.Input) (transform.Output, error) { - ethFullBlock := readOnlyBlk.ToProtocol().(*pbeth.Block) - zlog.Debug("running light block transformer", - zap.String("hash", hex.EncodeToString(ethFullBlock.Hash)), - zap.Uint64("num", ethFullBlock.Num()), - ) - - // FIXME: The block is actually duplicated elsewhere which means that at this point, - // we work on our own copy of the block. So we can re-write this code to avoid - // all the extra allocation and simply nillify the values that we want to hide - // instead - block := &pbeth.Block{ - Hash: ethFullBlock.Hash, - Number: ethFullBlock.Number, - Header: &pbeth.BlockHeader{ - Timestamp: ethFullBlock.Header.Timestamp, - ParentHash: ethFullBlock.Header.ParentHash, - }, - } - - newTrace := func(fullTrxTrace *pbeth.TransactionTrace) (trxTrace *pbeth.TransactionTrace) { - trxTrace = &pbeth.TransactionTrace{ - Hash: fullTrxTrace.Hash, - Receipt: fullTrxTrace.Receipt, - From: fullTrxTrace.From, - To: fullTrxTrace.To, - } - - trxTrace.Calls = make([]*pbeth.Call, len(fullTrxTrace.Calls)) - for i, fullCall := range fullTrxTrace.Calls { - call := &pbeth.Call{ - Index: fullCall.Index, - ParentIndex: fullCall.ParentIndex, - Depth: fullCall.Depth, - CallType: fullCall.CallType, - Caller: fullCall.Caller, - Address: fullCall.Address, - Value: fullCall.Value, - GasLimit: fullCall.GasLimit, - GasConsumed: fullCall.GasConsumed, - ReturnData: fullCall.ReturnData, - Input: fullCall.Input, - ExecutedCode: fullCall.ExecutedCode, - Suicide: fullCall.Suicide, - Logs: fullCall.Logs, - } - - trxTrace.Calls[i] = call - } - - return trxTrace - } - - traces := make([]*pbeth.TransactionTrace, len(ethFullBlock.TransactionTraces)) - for i, fullTrxTrace := range ethFullBlock.TransactionTraces { - traces[i] = newTrace(fullTrxTrace) - } - - block.TransactionTraces = traces - - return block, nil -} diff --git a/transform/light_block_test.go b/transform/light_block_test.go deleted file mode 100644 index 091a84b6..00000000 --- a/transform/light_block_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package transform - -import ( - "testing" - - "github.com/streamingfast/bstream/transform" - pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/types/known/anypb" -) - -func lightBlockTransform(t *testing.T) *anypb.Any { - transform := &pbtransform.LightBlock{} - a, err := anypb.New(transform) - require.NoError(t, err) - return a -} - -func TestBlockLight_Transform(t *testing.T) { - transformReg := transform.NewRegistry() - transformReg.Register(LightBlockTransformFactory) - - transforms := []*anypb.Any{lightBlockTransform(t)} - - preprocFunc, x, _, err := transformReg.BuildFromTransforms(transforms) - require.NoError(t, err) - require.Nil(t, x) - - blk := testBlockFromFiles(t, "block.json") - - output, err := preprocFunc(blk) - require.NoError(t, err) - - pbcodecBlock := output.(*pbeth.Block) - assert.Equal(t, blk.Number, pbcodecBlock.Number) -} diff --git a/transform/log_filter.go b/transform/log_filter.go index 4018111a..d9846797 100644 --- a/transform/log_filter.go +++ b/transform/log_filter.go @@ -82,6 +82,10 @@ func (p *LogFilter) matches(trace *pbeth.TransactionTrace) bool { return false } +func NewMultiLogFilterTransformFactory(indexStore dstore.Store, possibleIndexSizes []uint64) (*transform.Factory, error) { + return MultiLogFilterTransformFactory(indexStore, possibleIndexSizes), nil +} + // backwards compatibility, returns a combined filter now func MultiLogFilterTransformFactory(indexStore dstore.Store, possibleIndexSizes []uint64) *transform.Factory { return &transform.Factory{ diff --git a/transform/testing.go b/transform/testing.go index efc5d2c4..c7f1be02 100644 --- a/transform/testing.go +++ b/transform/testing.go @@ -192,7 +192,7 @@ func testMockstoreWithFiles(t testing.T, blocks []*pbeth.Block, indexSize uint64 }) // spawn an indexer with our mock indexStore - indexer := NewEthCombinedIndexer(indexStore, indexSize) + indexer := NewEthCombinedIndexerLegacy(indexStore, indexSize) for _, blk := range blocks { // feed the indexer indexer.ProcessBlock(blk) diff --git a/types/block.go b/types/block.go index ea53bbb4..ca4fee6b 100644 --- a/types/block.go +++ b/types/block.go @@ -18,11 +18,14 @@ import ( "fmt" "github.com/streamingfast/bstream" - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" "google.golang.org/protobuf/proto" ) +var _ firecore.Block = (*pbeth.Block)(nil) + func BlockFromProto(b *pbeth.Block, libNum uint64) (*bstream.Block, error) { blockTime, err := b.Time() if err != nil { diff --git a/types/go.mod b/types/go.mod index 2b5e06fd..880a1273 100644 --- a/types/go.mod +++ b/types/go.mod @@ -4,68 +4,81 @@ go 1.17 require ( github.com/mitchellh/go-testing-interface v1.14.1 - github.com/streamingfast/bstream v0.0.2-0.20221017131819-2a7e38be1047 - github.com/streamingfast/eth-go v0.0.0-20220421042603-ebe2c94fcc92 + github.com/streamingfast/bstream v0.0.2-0.20230731165201-639b4f347707 + github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 - github.com/streamingfast/logging v0.0.0-20220304214715-bc750a74b424 - github.com/streamingfast/pbgo v0.0.6-0.20220629184423-cfd0608e0cf4 - github.com/stretchr/testify v1.7.1-0.20210427113832-6241f9ab9942 - go.uber.org/zap v1.21.0 - google.golang.org/grpc v1.49.0 - google.golang.org/protobuf v1.28.0 + github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 + github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 + github.com/stretchr/testify v1.8.3 + go.uber.org/zap v1.24.0 + google.golang.org/grpc v1.54.0 + google.golang.org/protobuf v1.30.0 ) require ( - cloud.google.com/go v0.102.1 // indirect - cloud.google.com/go/compute v1.7.0 // indirect - cloud.google.com/go/iam v0.3.0 // indirect - cloud.google.com/go/storage v1.22.1 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/iam v0.12.0 // indirect + cloud.google.com/go/storage v1.30.1 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-storage-blob-go v0.14.0 // indirect - github.com/aws/aws-sdk-go v1.37.0 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect + github.com/aws/aws-sdk-go v1.44.233 // indirect + github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blendle/zapdriver v1.3.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.8 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang-jwt/jwt/v4 v4.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect - github.com/googleapis/gax-go/v2 v2.4.0 // indirect - github.com/googleapis/go-type-adapters v1.0.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/holiman/uint256 v1.2.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.10.2 // indirect + github.com/klauspost/compress v1.15.12 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/mattn/go-ieproxy v0.0.1 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/paulbellamy/ratecounter v0.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.0 // indirect github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 // indirect - github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5 // indirect - github.com/streamingfast/dgrpc v0.0.0-20220909121013-162e9305bbfc // indirect - github.com/streamingfast/dmetrics v0.0.0-20210811180524-8494aeb34447 // indirect - github.com/streamingfast/dstore v0.1.1-0.20220607202639-35118aeaf648 // indirect + github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad // indirect + github.com/streamingfast/dgrpc v0.0.0-20230623191332-4ed02c06bc6f // indirect + github.com/streamingfast/dmetrics v0.0.0-20230516031116-28fcfeb4b9ed // indirect + github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 // indirect github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 // indirect github.com/streamingfast/shutter v1.5.0 // indirect - go.opencensus.io v0.23.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect - golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect - golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 // indirect - golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect - google.golang.org/api v0.91.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 // indirect + go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/goleak v1.2.1 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/crypto v0.6.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect + golang.org/x/sys v0.9.0 // indirect + golang.org/x/term v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220808131553-a91ffa7f803e // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/types/go.sum b/types/go.sum index 5eff5462..1f5f9357 100644 --- a/types/go.sum +++ b/types/go.sum @@ -4,6 +4,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -16,6 +17,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -30,53 +32,519 @@ cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2Z cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1 h1:vpK6iQWv/2uUeFJth4/cBHsQAGjn1iIE6AAlxipRaA0= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/container v1.3.1/go.mod h1:/mI/mTug/DwXJPxysUoInyvF3ekeXGiP8teCAtgGMdM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/monitoring v1.6.0/go.mod h1:w+OY1TYCk4MtvY7WfEHlIp5mP8SV/gDSqOsvGhVa2KM= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/storage v1.22.1 h1:F6IlQJZrZM++apn9V5/VfS3gbTUYg98PS3EMQAzqtfg= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk= contrib.go.opencensus.io/exporter/zipkin v0.1.1/go.mod h1:GMvdSl3eJ2gapOaLKzTKE3qDgUkJ86k9k3yY2eqwkzc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= +github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= @@ -85,24 +553,45 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.3/go.mod h1:s7Gpwj0tk7XnVCm4BQEmx/mbS36SuTCY/vMB2SNxe8o= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.15.0/go.mod h1:LTScD9l1w6+z1IB3FKtXxS4oenRlIJQQrIiV/Iq1Bsw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.39.0/go.mod h1:PV+bUv9S+/W9PmZECvnC39uIEYnDL9veytwZrMqPexc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.39.0/go.mod h1:lz6DEePTxmjvYMtusOoS3qDAErC0STi/wmvqJucKY28= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221018185641-36f91511cfd7/go.mod h1:FwtSi1M0P8cuMlHxVso1vcivukprUr1bBwf15CRypOI= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.37.2/go.mod h1:Nxye/E+YPru//Bpaorfhc3JsSGYwCaDDj+R4bK52U5o= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/gometalinter v2.0.11+incompatible/go.mod h1:qfIpQGGz3d+NmgyPBqv+LSh50emm1pt72EtcX2vKYQk= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= 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/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.43/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.37.0 h1:GzFnhOIsrGyQ69s7VgqtrG2BG8v7X7vwB3Xpbd/DBBk= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/aws/aws-sdk-go v1.44.233 h1:KB3p/yL32oG/aF4Ld0Ui9CU0tdezvhX6Xdqpb8vyP3U= +github.com/aws/aws-sdk-go v1.44.233/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= @@ -110,16 +599,29 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= +github.com/bufbuild/connect-go v1.5.1/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= +github.com/bufbuild/connect-go v1.7.0/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= +github.com/bufbuild/connect-go v1.8.0/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= +github.com/bufbuild/connect-grpchealth-go v1.1.1/go.mod h1:9KbkogLoUIxOTPKyWDv5evkawr1IYXaHax4XoUHCgoQ= +github.com/bufbuild/connect-grpcreflect-go v1.0.0/go.mod h1:825I20H8bfE9rLnBH/046JSpmm3uwpNYdG4duCARetc= +github.com/bufbuild/connect-opentelemetry-go v0.3.0/go.mod h1:r1ppyTtu1EWeRodk4Q/JbyQhIWtO7eR3GoRDzjeEcNU= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -128,22 +630,30 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -155,29 +665,62 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +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-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/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 h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +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/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= 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= @@ -204,12 +747,15 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -223,15 +769,17 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/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.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -241,6 +789,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -253,31 +802,56 @@ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 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/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -293,16 +867,27 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= 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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.10.2 h1:Znfn6hXZAHaLPNnlqUYRrBSReFHYybslgv4PTiyz6P0= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= +github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -310,13 +895,24 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/manifoldco/promptui v0.3.2/go.mod h1:8JU+igZ+eeiiRku4T5BjtKh2ms8sziGpSYl1gN8Bazw= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -327,99 +923,173 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= 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/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM= +github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= +github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/rabbitmq/amqp091-go v1.5.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQfcJj+oyz0dGg= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/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/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 h1:fGJnUx0shX9Y312QOlz+/+yLquihXRhNqctJ26jtZZM= github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680/go.mod h1:iISPGAstbUsPgyC3auLLi7PYUTi9lHv5z0COam0OPOY= -github.com/streamingfast/bstream v0.0.2-0.20221017131819-2a7e38be1047 h1:BExIqX4qVbbjD6yyiNYJIY1prLlbuBvnPweIwtZZgp4= -github.com/streamingfast/bstream v0.0.2-0.20221017131819-2a7e38be1047/go.mod h1:Njkx972HcZiz0djWBylxqO/eq686eDGr+egQ1lePj3Q= -github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5 h1:m/3aIPNXCwZ9m/dfYdOs8ftrS7GJl82ipVr6K2aZiBs= +github.com/streamingfast/bstream v0.0.2-0.20230731165201-639b4f347707 h1:hJW+QNNJrR1boQuoEaajlMFjWh0XKt4Fcg33h9hT7Eo= +github.com/streamingfast/bstream v0.0.2-0.20230731165201-639b4f347707/go.mod h1:Njkx972HcZiz0djWBylxqO/eq686eDGr+egQ1lePj3Q= github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= -github.com/streamingfast/dgrpc v0.0.0-20220909121013-162e9305bbfc h1:sRhUilbZExbUbQP9WIavdL2L0HZG0LW5ojVdxFc+7LI= +github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad h1:6z4uS6TlD9KoHdyE1vzoGsELVCCcviTFT/3/vqCylh8= +github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= github.com/streamingfast/dgrpc v0.0.0-20220909121013-162e9305bbfc/go.mod h1:YlFJuFiB9rmglB5UfTfnsOTfKC1rFo+D0sRbTzLcqgc= -github.com/streamingfast/dmetrics v0.0.0-20210811180524-8494aeb34447 h1:oZwOVjxpWCqLUjgcPgVigVCHYR40JkmXfm1kuMcCOQk= +github.com/streamingfast/dgrpc v0.0.0-20230623191332-4ed02c06bc6f h1:qiIHzYZpnHdQHwOvsUaPc7DQkeyRptDS+8DN1FCfBcQ= +github.com/streamingfast/dgrpc v0.0.0-20230623191332-4ed02c06bc6f/go.mod h1:0tXk90PNAgFur+u/W6bQPdgfOGPGSwUqHILZKacqJj4= github.com/streamingfast/dmetrics v0.0.0-20210811180524-8494aeb34447/go.mod h1:VLdQY/FwczmC/flqWkcsBbqXO4BhU4zQDSK7GMrpcjY= -github.com/streamingfast/dstore v0.1.1-0.20220607202639-35118aeaf648 h1:xpy3HNXeUHaZexf42duj7NeOmXcGfDMJXlZaj3CX18Y= +github.com/streamingfast/dmetrics v0.0.0-20230516031116-28fcfeb4b9ed h1:b6EFwgne8MSK4kUjvulyyg2GGyvVUgQ+xY6o8eXlFIA= +github.com/streamingfast/dmetrics v0.0.0-20230516031116-28fcfeb4b9ed/go.mod h1:JbxEDbzWRG1dHdNIPrYfuPllEkktZMgm40AwVIBENcw= github.com/streamingfast/dstore v0.1.1-0.20220607202639-35118aeaf648/go.mod h1:SHSEIPowGeE1TfNNmGeAUUnlO3dwevmX5kFOSazU60M= +github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 h1:u7FWLqz3Uwff609Ja9M+3aGOWqBCVU7dx9i6R6Qc4qI= +github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77/go.mod h1:ngKU7WzHwVjOFpt2g+Wtob5mX4IvN90HYlnARcTRbmQ= github.com/streamingfast/dtracing v0.0.0-20210811175635-d55665d3622a/go.mod h1:bqiYZaX6L/MoXNfFQeAdau6g9HLA3yKHkX8KzStt58Q= -github.com/streamingfast/eth-go v0.0.0-20220421042603-ebe2c94fcc92 h1:jMLyqSyOP0Wf1wbC0qhTW8GdFr+NM5WBwBzNc74TAk8= -github.com/streamingfast/eth-go v0.0.0-20220421042603-ebe2c94fcc92/go.mod h1:GSWB6tldvuaUekmehj7yCv/8o6MIWPb+9Hf+m4uZdDM= +github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 h1:CGU52NV9heyO2Wb4ImDBy+1bVCeCsrEuu7WN/o/JGy0= +github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1/go.mod h1:UEm8dqibr3c3A1iIA3CHpkhN7j3X78prN7/55sXf3A0= github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 h1:g8eEYbFSykyzIyuxNMmHEUGGUvJE0ivmqZagLDK42gw= github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0/go.mod h1:cTNObq2Uofb330y05JbbZZ6RwE6QUXw5iVcHk1Fx3fk= github.com/streamingfast/logging v0.0.0-20210811175431-f3b44b61606a/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= github.com/streamingfast/logging v0.0.0-20210908162127-bdc5856d5341/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= -github.com/streamingfast/logging v0.0.0-20220304214715-bc750a74b424 h1:qKt1W13L7GXL3xqvD6z2ufSkIy/KDm9oGrfurypC78E= github.com/streamingfast/logging v0.0.0-20220304214715-bc750a74b424/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= +github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 h1:xlWSfi1BoPfsHtPb0VEHGUcAdBF208LUiFCwfaVPfLA= github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308/go.mod h1:K1p8Bj/wG34KJvYzPUqtzpndffmpkrVY11u2hkyxCWQ= -github.com/streamingfast/pbgo v0.0.6-0.20220629184423-cfd0608e0cf4 h1:VsXTYU57m0zz4VldGBmmolCnNV55BoXCWqE1vkgRHLc= github.com/streamingfast/pbgo v0.0.6-0.20220629184423-cfd0608e0cf4/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= +github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 h1:wmQg8T0rIFl/R3dy97OWRi8OSdM3llvRw2p3TPFVKZQ= +github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= +github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9/go.mod h1:ktzt1BUj3GF+SKQHEmn3ShryJ7y87JeCHtaTGaDVATs= github.com/streamingfast/shutter v1.5.0 h1:NpzDYzj0HVpSiDJVO/FFSL6QIK/YKOxY0gJAtyaTOgs= github.com/streamingfast/shutter v1.5.0/go.mod h1:B/T6efqdeMGbGwjzPS1ToXzYZI4kDzI5/u4I+7qbjY8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1-0.20210427113832-6241f9ab9942 h1:t0lM6y/M5IiUZyvbBTcngso8SZEZICH7is9B6g/obVU= -github.com/stretchr/testify v1.7.1-0.20210427113832-6241f9ab9942/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -github.com/tidwall/gjson v1.6.5 h1:P/K9r+1pt9AK54uap7HcoIp6T3a7AoMg3v18tUis+Cg= -github.com/tidwall/gjson v1.6.5/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= -github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= -github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9/go.mod h1:q+QjxYvZ+fpjMXqs+XEriussHjSYqeXVnAdSV1tkMYk= +github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= 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.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= @@ -427,50 +1097,112 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/detectors/gcp v1.9.0/go.mod h1:OqG0FEnmWeJWYVrEovaHXHXY4bVTnp/WfTzhwrsGWlw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 h1:PRXhsszxTt5bbPriTjmaweWUsAnJYeWBhUMLRetUgBU= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4/go.mod h1:05eWWy6ZWzmpeImD3UowLTB3VjDMU1yxQ+ENuVWDM3c= +go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= +go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= +go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= +go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.15.1/go.mod h1:q8+Tha+5LThjeSU8BW93uUC5w5/+DnYHMKBMpRCsui0= +go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= +go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= +go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= +go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= +go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -494,6 +1226,12 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -520,6 +1258,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -528,12 +1267,16 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -541,8 +1284,23 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220927171203-f486391704dc/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.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/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 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= @@ -563,8 +1321,16 @@ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 h1:+jnHzr9VPj32ykQVai5DNahi9+NSp7yYuCsl5eAQtL0= golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= 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= @@ -577,6 +1343,12 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -592,12 +1364,16 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -618,14 +1394,18 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -634,9 +1414,12 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -650,11 +1433,35 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810 h1:rHZQSjJdAI4Xf5Qzeh2bBc5YJIkPFVM6oDtMFYmgws0= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 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= @@ -663,15 +1470,26 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.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.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181122213734-04b5d21e00f1/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-20190206041539-40960b6deb8e/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= @@ -684,6 +1502,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -715,24 +1534,41 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +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= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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= @@ -772,12 +1608,29 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.91.0 h1:731+JzuwaJoZXRQGmPoBiV+SrsAfUaIkdMCWTcQNPyA= google.golang.org/api v0.91.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= 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= @@ -823,7 +1676,9 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -862,11 +1717,13 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= @@ -874,9 +1731,54 @@ google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljW google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= google.golang.org/genproto v0.0.0-20220802133213-ce4fa296bf78/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220808131553-a91ffa7f803e h1:yXLYwnRRqNHIwwHZLiA9/aC9uieNrOF0owsijAiZJr8= google.golang.org/genproto v0.0.0-20220808131553-a91ffa7f803e/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55/go.mod h1:45EK0dUbEZ2NHjCeAd2LXmyjAgGUGrpGROgjhC3ADck= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 h1:khxVcsk/FhnzxMKOyD+TDGwjbEOpcPuIpmafPGFmhMA= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -905,14 +1807,20 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -927,8 +1835,11 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -948,8 +1859,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -958,6 +1870,42 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/types/pb/sf/ethereum/type/v2/type.go b/types/pb/sf/ethereum/type/v2/type.go index 841ed2c2..84c88dc9 100644 --- a/types/pb/sf/ethereum/type/v2/type.go +++ b/types/pb/sf/ethereum/type/v2/type.go @@ -287,3 +287,30 @@ func MustGasChangeReasonFromString(reason string) GasChange_Reason { return GasChange_Reason(enumID) } + +// GetFirehoseBlockID implements firecore.Block. +func (b *Block) GetFirehoseBlockID() string { + return hex.EncodeToString(b.Hash) +} + +// GetFirehoseBlockLIBNum implements firecore.Block. +func (b *Block) GetFirehoseBlockLIBNum() uint64 { + // FIXME: Wrong, LIBNum is incorrect and can only be implemented by console reader! + // Need to review firehose-core to see how GetFirehoseBlockLIBNum is used + return b.LIBNum() +} + +// GetFirehoseBlockNumber implements firecore.Block. +func (b *Block) GetFirehoseBlockNumber() uint64 { + return b.Number +} + +// GetFirehoseBlockParentID implements firecore.Block. +func (b *Block) GetFirehoseBlockParentID() string { + return hex.EncodeToString(b.Header.ParentHash) +} + +// GetFirehoseBlockTime implements firecore.Block. +func (b *Block) GetFirehoseBlockTime() time.Time { + return b.Header.Timestamp.AsTime() +} From 45a8c8ef74f708b742f189ff56790eed9299fc7b Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Fri, 1 Sep 2023 17:02:00 -0400 Subject: [PATCH 02/11] Further work towards `firehose-ethereum` ported to `firehose-core`. --- CHANGELOG.md | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd674b2f..ac9208f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,26 +20,34 @@ A lot of changes happened at the operators level however and some superflous mod You will find below the detailed upgrade procedure for the configuration file providers usually use. If you are using the flags based approach, simply update the corresponding flags. -#### Reader Node changes +#### App `reader-node` changes -In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering" node, this is not possible anymore. If you were using the `node` app previously: +This change will impact all operators currently running Firehose on Ethereum so it's important to pay attention to the upgrade procedure below, if you are unsure of something, reach to us on [Discord](https://discord.gg/jZwqxJAvRs). -```yaml -start: - args: - - ... - - node - - ... - flags: - ... - node-... -``` +Before this release, the `reader-node` app was managing for you a portion of the `reader-node-arguments` configuration value, prepending some arguments that would be passed to `geth` when invoking it, the list of arguments that were automatically provided before: + +- `--networkid=` +- `--datadir=` +- `--ipcpath=` +- `--port=30305` +- `--http` +- `--http.api=eth,net,web3` +- `--http.port=8547 ` +- `--http.addr=0.0.0.0 ` +- `--http.vhosts=* ` +- `--firehose-enabled` + +We have now removed those magical additions and operators are now responsible of providing the flags they required to properly run a Firehose-enabled native `geth` node. The `+` sign that was used to append/override the flags has been removed also since no default additions is performed, the `+` was now useless. We also removed the following `fireeth` configuration value: -> **note* This is about `node` app, the `reader-node` app +- `reader-node-type` (No replacement needed, just remove it) +- `reader-node-ipc-path` (If you were using that, define it manually using `geth` flag `--ipcpath=...`) +- `reader-node-enforce-peers` (If you were using that, use a `geth` config file to add static peers to your node, read about static peers for `geth` on the Web) -#### Reader Node changes +Default listening addresses changed also to be the same on all `firehose-<...>` project, meaning consistent ports across all chains for operators. The `reader-node-grpc-listen-addr` default listen address went from `:13010` to `:10010` and `reader-node-manager-api-addr` from `:13009` to `:10011`. If you have no occurrences of `13010` or `13009` in your config file or your scripts, there is nothing to do. Otherwise, feel free to adjust the default port to fit your needs, if you do change `reader-node-grpc-listen-addr`, ensure `--relayer-source` is also updated as by default it points to `:10010`. -In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering" node, this is not possible anymore. If you were using the `node` app previously: +#### App `node` removed + +In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering/backup/whatever" Ethereum node, this is not possible anymore. If you were using the `node` app previously, like in this config: ```yaml start: @@ -52,6 +60,10 @@ start: node-... ``` +You must now remove the `node` app from `args` and any flags starting with `node-`. The migration path is to run those on your own without the use of `fireeth` and using whatever tools fits your desired needs. + +We have completely drop support to concentrate on the core mission of Firehose which is to run reader nodes to extract Firehose blocks from it. + > **Note** This is about the `node` app and **not** the `reader-node`, we think usage of this app is minimal/inexistent. #### Rename of `combined-index-builder` to `index-builder` From 4e118d0aa12f20868688f9b17397ec5b6c8ffd94 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Mon, 11 Sep 2023 11:10:20 -0400 Subject: [PATCH 03/11] Removed useless blank line --- tools/compare.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/compare.go b/tools/compare.go index d8d9d38a..54684b33 100644 --- a/tools/compare.go +++ b/tools/compare.go @@ -85,7 +85,6 @@ func sanitizeBlock(block *pbeth.Block) *pbeth.Block { } func readBundle(ctx context.Context, filename string, store dstore.Store, fileStartBlock, stopBlock uint64) ([]string, map[string]*pbeth.Block, error) { - fileReader, err := store.OpenObject(ctx, filename) if err != nil { return nil, nil, fmt.Errorf("creating reader: %w", err) From 76f50ca541fb1bb5ef075e350dcf1c2db2410a58 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Fri, 27 Oct 2023 16:58:27 -0400 Subject: [PATCH 04/11] More work towards having working firehose-core --- .gitignore | 1 + CHANGELOG.md | 100 +++++++- cmd/fireeth/main.go | 89 ++++--- cmd/fireeth/main_test.go | 37 +++ cmd/fireeth/reader_node_bootstraper.go | 245 +++++++++++++++++++ cmd/fireeth/tools_transform_flags.go | 153 ++++++++++++ codec/console_reader.go | 13 +- codec/console_reader_test.go | 9 +- codec/init_test.go | 8 +- devel/.gitignore | 1 + devel/firehose-mainnet/firehose-mainnet.yaml | 4 + devel/firehose-mainnet/start.sh | 14 -- devel/standard/miner/bootstrap.tar.gz | Bin 0 -> 81214 bytes devel/standard/miner/bootstrap.tar.zst | Bin 52250 -> 0 bytes devel/standard/miner/config.toml | 15 ++ devel/standard/reader/config.toml | 4 + devel/standard/reader/static-nodes.json | 3 - devel/standard/standard.yaml | 28 ++- devel/standard/start.sh | 29 ++- tools/download-blocks-from-firehose.go | 92 ------- tools/firehose-prometheus-exporter.go | 14 -- types/block.go | 51 ---- types/decoder.go | 47 ---- types/init.go | 38 ++- types/logging.go | 21 -- types/pb/sf/ethereum/type/v2/type.go | 12 +- types/testing/types.go | 4 - 27 files changed, 682 insertions(+), 350 deletions(-) create mode 100644 cmd/fireeth/main_test.go create mode 100644 cmd/fireeth/reader_node_bootstraper.go create mode 100644 cmd/fireeth/tools_transform_flags.go create mode 100644 devel/standard/miner/bootstrap.tar.gz delete mode 100644 devel/standard/miner/bootstrap.tar.zst create mode 100644 devel/standard/miner/config.toml create mode 100644 devel/standard/reader/config.toml delete mode 100644 devel/standard/reader/static-nodes.json delete mode 100644 tools/download-blocks-from-firehose.go delete mode 100644 tools/firehose-prometheus-exporter.go delete mode 100644 types/block.go delete mode 100644 types/decoder.go delete mode 100644 types/logging.go diff --git a/.gitignore b/.gitignore index c82988c6..6473b7e1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ .release_notes.md *.spkg /sf-data +/firehose-data /sf.yaml /fireeth /dist diff --git a/CHANGELOG.md b/CHANGELOG.md index ac9208f7..414488d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,15 +10,24 @@ for instructions to keep up to date. This releases refactor `firehose-ethereum` repository to use the common shared Firehose Core library (https://github.com/streamingfast/firehose-core) that every single Firehose supported chain should use and follow. -At the data level and gRPC level, there is no changes in behavior to all core components which are `reader-node`, `merger`, `relayer`, `firehose`, `substreams-tier1` and `substreams-tier2`. +Both at the data level and gRPC level, there is no changes in behavior to all core components which are `reader-node`, `merger`, `relayer`, `firehose`, `substreams-tier1` and `substreams-tier2`. A lot of changes happened at the operators level however and some superflous mode have been removed, especially around the `reader-node` application. The full changes is listed below, operators should review thoroughly the changelog. -> **Important** It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.12 in case of a problem is quite easy and no special data migration is required. +> [!IMPORTANT] +> It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.19 in case of a problem is quite easy and no special data migration is required outside of changing back to the old set of flags that was used before. #### Operators -You will find below the detailed upgrade procedure for the configuration file providers usually use. If you are using the flags based approach, simply update the corresponding flags. +You will find below the detailed upgrade procedure for the configuration file operators usually use. If you are using the flags based approach, simply update the corresponding flags. + +#### Common Changes + +* The `{sf-data-dir}` templating argument used in various flags to resolve to the `--data-dir=` value has been deprecated and should now be simply `{data-dir}`. The older replacement is still going to work but you should replace any occurrences of `{sf-data-dir}` in your flag definition by `{data-dir}`. + +* The default value for `common-blocks-cache-dir` changed from `{sf-data-dir}/blocks-cache` to `file://{data-dir}/storage/blocks-cache`. If you didn't had this flag defined and you had `common-blocks-cache-enabled: true`, you should define `common-blocks-cache-dir: file://{data-dir}/blocks-cache`. + +* The default value for `common-live-blocks-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `common-live-blocks-addr: 15011` and ensure you also modify `relayer-grpc-listen-addr: :15011` (see next entry for details). #### App `reader-node` changes @@ -37,7 +46,20 @@ Before this release, the `reader-node` app was managing for you a portion of the - `--http.vhosts=* ` - `--firehose-enabled` -We have now removed those magical additions and operators are now responsible of providing the flags they required to properly run a Firehose-enabled native `geth` node. The `+` sign that was used to append/override the flags has been removed also since no default additions is performed, the `+` was now useless. We also removed the following `fireeth` configuration value: +We have now removed those magical additions and operators are now responsible of providing the flags they required to properly run a Firehose-enabled native `geth` node. The `+` sign that was used to append/override the flags has been removed also since no default additions is performed, the `+` was now useless. To make some flag easier to define and avoid repetition, a few templating variable can be used within the `reader-node-arguments` value: + +- `{data-dir}` The current data-dir path defined by the config value `data-dir` +- `{node-data-dir}` The node data dir path defined by the flag `reader-node-data-dir` +- `{hostname}` The machine's hostname +- `{start-block-num}` The resolved start block number defined by the flag `reader-node-start-block-num` (can be overwritten) +- `{stop-block-num}` The stop block number defined by the flag `reader-node-stop-block-num` + +As an example, if you provide the config value `reader-node-data-dir=/var/geth` for example, then you could use `reader-node-arguments: --datadir={node-data-dir}` and that would resolve to `reader-node-arguments: --datadir=/var/geth` for you. + +> [!NOTE] +> The `reader-node-arguments` is a string that is parsed using Shell word splitting rules which means for example that double quotes are supported like `--datadir="/var/with space/path"` and the argument will be correctly accepted. We use https://github.com/kballard/go-shellquote as your parsing library. + +We also removed the following `reader-node` configuration value: - `reader-node-type` (No replacement needed, just remove it) - `reader-node-ipc-path` (If you were using that, define it manually using `geth` flag `--ipcpath=...`) @@ -45,6 +67,55 @@ We have now removed those magical additions and operators are now responsible of Default listening addresses changed also to be the same on all `firehose-<...>` project, meaning consistent ports across all chains for operators. The `reader-node-grpc-listen-addr` default listen address went from `:13010` to `:10010` and `reader-node-manager-api-addr` from `:13009` to `:10011`. If you have no occurrences of `13010` or `13009` in your config file or your scripts, there is nothing to do. Otherwise, feel free to adjust the default port to fit your needs, if you do change `reader-node-grpc-listen-addr`, ensure `--relayer-source` is also updated as by default it points to `:10010`. +Here an example of the required changes. + +Change: + +```yaml +start: + args: + - ... + - reader-node + - ... + flags: + ... + reader-node-bootstrap-data-url: ./reader/genesis.json + reader-node-enforce-peers: localhost:13041 + reader-node-arguments: +--firehose-genesis-file=./reader/genesis.json --authrpc.port=8552 + reader-node-log-to-zap: false + ... +``` + +To: + +```yaml +start: + args: + - ... + - reader-node + - ... + flags: + ... + reader-node-bootstrap-data-url: ./reader/genesis.json + reader-node-arguments: + --networkid=1515 + --datadir={node-data-dir} + --ipcpath={data-dir}/reader/ipc + --port=30305 + --http + --http.api=eth,net,web3 + --http.port=8547 + --http.addr=0.0.0.0 + --http.vhosts=* + --firehose-enabled + --firehose-genesis-file=./reader/genesis.json + --authrpc.port=8552 + ... +``` + +> [!NOTE] +> Adjust the `--networkid=1515` value to fit your targeted chain, see https://chainlist.org/ for a list of Ethereum chain and their `network-id` value. + #### App `node` removed In previous version of `firehose-ethereum`, it was possible to use the `node` app to launch managed "peering/backup/whatever" Ethereum node, this is not possible anymore. If you were using the `node` app previously, like in this config: @@ -68,7 +139,9 @@ We have completely drop support to concentrate on the core mission of Firehose w #### Rename of `combined-index-builder` to `index-builder` -The app has been renamed to simply `index-builder` and the flags has been completely renamed removing the prefix `combined-` in front of them. So change: +The app has been renamed to simply `index-builder` and the flags has been completely renamed removing the prefix `combined-` in front of them. + +Change: ```yaml start: @@ -85,7 +158,7 @@ start: ... ``` -To +To: ```yaml start: @@ -102,7 +175,8 @@ start: ... ``` -> **Note** Rename only configuration item you had previously defined, do not copy paste verbatim example aboe +> [!NOTE] +> Rename only configuration item you had previously defined, do not copy paste verbatim example above. * Removed support for `archive-node` app, if you were using this, please use a standard NEAR Archive node to do the same job. @@ -110,19 +184,18 @@ start: * String variable `{sf-data-dir}` which interpolates at runtime to Firehose data directory is now `{data-dir}`. If any of your parameter value has `{sf-data-dir}` in its value, change it to `{data-dir}`. - > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + > [!NOTE] + > This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. * The default value for `config-file` changed from `sf.yaml` to `firehose.yaml`. If you didn't had this flag defined and wish to keep the old default, define `config-file: sf.yaml`. * The default value for `data-dir` changed from `sf-data` to `firehose-data`. If you didn't had this flag defined before, you should either move `sf-data` to `firehose-data` or define `data-dir: sf-data`. - > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + > [!NOTE] + > This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. * The flag `verbose` has been renamed to `log-verbosity`. -* The default value for `common-blocks-cache-dir` changed from `{sf-data-dir}/blocks-cache` to `file://{data-dir}/storage/blocks-cache`. If you didn't had this flag defined and you had `common-blocks-cache-enabled: true`, you should define `common-blocks-cache-dir: {data-dir}/blocks-cache`. - -* The default value for `common-live-blocks-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `common-live-blocks-addr: 15011` and ensure you also modify `relayer-grpc-listen-addr: :15011` (see next entry for details). * The default value for `relayer-grpc-listen-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `relayer-grpc-listen-addr: 15011` and ensure you also modify `common-live-blocks-addr: :15011` (see previous entry for details). @@ -134,7 +207,8 @@ start: * The `reader-node-arguments` is not populated anymore with default `--home={node-data-dir} run` which means you must now specify those manually. The variables `{data-dir}`, `{node-data-dir}` and `{hostname}` are interpolated respectively to Firehose absolute `data-dir` value, to Firehose absolute `reader-node-data-dir` value and to current hostname. To upgrade, if you had no `reader-node-arguments` defined, you must now define `reader-node-arguments: --home="{node-data-dir}" run`, if you had a `+` in your `reader-node-arguments: +--some-flag`, you must now define it like `reader-node-arguments: --home="{node-data-dir}" --some-flag run`. - > **Note** This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. + > [!NOTE] + > This is an important change, forgetting to change it will change expected locations of data leading to errors or wrong data. * The `reader-node-boot-nodes` flag has been removed entirely, if you have boot nodes to specify, specify them in `reader-node-arguments` using `--boot-nodes=...` instead. diff --git a/cmd/fireeth/main.go b/cmd/fireeth/main.go index 935a9c07..468e8112 100644 --- a/cmd/fireeth/main.go +++ b/cmd/fireeth/main.go @@ -1,13 +1,17 @@ package main import ( + // Forced imported to convey they fact that this is a required import (for its side-effect!) + _ "github.com/streamingfast/firehose-ethereum/types" + "github.com/spf13/cobra" + "github.com/spf13/pflag" firecore "github.com/streamingfast/firehose-core" "github.com/streamingfast/firehose-ethereum/codec" "github.com/streamingfast/firehose-ethereum/transform" + "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/logging" - "github.com/streamingfast/node-manager/mindreader" pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" "go.uber.org/zap" "google.golang.org/protobuf/reflect/protoreflect" @@ -18,57 +22,64 @@ func init() { } func main() { - firecore.Main(&firecore.Chain[*pbeth.Block]{ - ShortName: "eth", - LongName: "Ethereum", - ExecutableName: "geth", - FullyQualifiedModule: "github.com/streamingfast/firehose-ethereum", - Version: version, + firecore.Main(Chain) +} - Protocol: "ETH", - ProtocolVersion: 1, +var Chain = &firecore.Chain[*pbeth.Block]{ + ShortName: "eth", + LongName: "Ethereum", + ExecutableName: "geth", + FullyQualifiedModule: "github.com/streamingfast/firehose-ethereum", + Version: version, - BlockFactory: func() firecore.Block { return new(pbeth.Block) }, + // Ensure that if you ever modify test, modify also `types/init.go#init` so that the `bstream.InitGeneric` there fits us + Protocol: "ETH", + ProtocolVersion: 1, - BlockIndexerFactories: map[string]firecore.BlockIndexerFactory[*pbeth.Block]{ - transform.CombinedIndexerShortName: transform.NewEthCombinedIndexer, - }, + BlockFactory: func() firecore.Block { return new(pbeth.Block) }, + BlockAcceptedVersions: types.BlockAcceptedVersions, - BlockTransformerFactories: map[protoreflect.FullName]firecore.BlockTransformerFactory{ - transform.HeaderOnlyMessageName: transform.NewHeaderOnlyTransformFactory, - transform.CombinedFilterMessageName: transform.NewCombinedFilterTransformFactory, + BlockIndexerFactories: map[string]firecore.BlockIndexerFactory[*pbeth.Block]{ + transform.CombinedIndexerShortName: transform.NewEthCombinedIndexer, + }, - // Still needed? - transform.MultiCallToFilterMessageName: transform.NewMultiCallToFilterTransformFactory, - transform.MultiLogFilterMessageName: transform.NewMultiLogFilterTransformFactory, - }, + BlockTransformerFactories: map[protoreflect.FullName]firecore.BlockTransformerFactory{ + transform.HeaderOnlyMessageName: transform.NewHeaderOnlyTransformFactory, + transform.CombinedFilterMessageName: transform.NewCombinedFilterTransformFactory, - ConsoleReaderFactory: func(lines chan string, blockEncoder firecore.BlockEncoder, logger *zap.Logger, tracer logging.Tracer) (mindreader.ConsolerReader, error) { - // FIXME: This was hardcoded also in the previouse firehose-near version, Firehose will break if this is not available - // blockEncoder - return codec.NewConsoleReader(logger, lines) - }, + transform.MultiCallToFilterMessageName: transform.NewMultiCallToFilterTransformFactory, + transform.MultiLogFilterMessageName: transform.NewMultiLogFilterTransformFactory, + }, - // ReaderNodeBootstrapperFactory: newReaderNodeBootstrapper, + ConsoleReaderFactory: codec.NewConsoleReader, - Tools: &firecore.ToolsConfig[*pbeth.Block]{ - BlockPrinter: printBlock, + RegisterExtraStartFlags: func(flags *pflag.FlagSet) { + flags.String("reader-node-bootstrap-data-url", "", "URL (file or gs) to either a genesis.json file or a .tar.zst archive to decompress in the datadir. Only used when bootstrapping (no prior data)") + }, - RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { - // toolsCmd.AddCommand(newToolsGenerateNodeKeyCmd(chain)) - // toolsCmd.AddCommand(newToolsBackfillCmd(zlog)) + ReaderNodeBootstrapperFactory: newReaderNodeBootstrapper, - return nil - }, + Tools: &firecore.ToolsConfig[*pbeth.Block]{ + BlockPrinter: printBlock, + + RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { + // toolsCmd.AddCommand(newToolsGenerateNodeKeyCmd(chain)) + // toolsCmd.AddCommand(newToolsBackfillCmd(zlog)) - TransformFlags: map[string]*firecore.TransformFlag{ - // "receipt-account-filters": { - // Description: "Comma-separated accounts to use as filter/index. If it contains a colon (:), it will be interpreted as : (each of which can be empty, ex: 'hello:' or ':world')", - // Parser: parseReceiptAccountFilters, - // }, + return nil + }, + + TransformFlags: &firecore.TransformFlags{ + Register: func(flags *pflag.FlagSet) { + flags.Bool("header-only", false, "Apply the HeaderOnly transform sending back Block's header only (with few top-level fields), exclusive option") + flags.String("call-filters", "", "call filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") + flags.String("log-filters", "", "log filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") + flags.Bool("send-all-block-headers", false, "ask for all the blocks to be sent (header-only if there is no match)") }, + + Parse: parseTransformFlags, }, - }) + }, } // Version value, injected via go build `ldflags` at build time, **must** not be removed or inlined diff --git a/cmd/fireeth/main_test.go b/cmd/fireeth/main_test.go new file mode 100644 index 00000000..4fecc806 --- /dev/null +++ b/cmd/fireeth/main_test.go @@ -0,0 +1,37 @@ +package main + +import ( + "bytes" + "testing" + + "github.com/streamingfast/bstream" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "github.com/test-go/testify/require" +) + +func Test_Encode_Decode_Block(t *testing.T) { + Chain.Validate() + Chain.Init() + + original, err := Chain.BlockEncoder.Encode(&pbeth.Block{ + Number: 1, + Header: &pbeth.BlockHeader{}, + }) + require.NoError(t, err) + + require.Equal(t, uint64(1), original.ToProtocol().(*pbeth.Block).Number) + + buffer := bytes.NewBuffer(nil) + writer, err := bstream.GetBlockWriterFactory.New(buffer) + require.NoError(t, err) + + require.NoError(t, writer.Write(original)) + + reader, err := bstream.GetBlockReaderFactory.New(buffer) + require.NoError(t, err) + + hydrated, err := reader.Read() + require.NoError(t, err) + + require.Equal(t, uint64(1), hydrated.ToProtocol().(*pbeth.Block).Number) +} diff --git a/cmd/fireeth/reader_node_bootstraper.go b/cmd/fireeth/reader_node_bootstraper.go new file mode 100644 index 00000000..52017e2a --- /dev/null +++ b/cmd/fireeth/reader_node_bootstraper.go @@ -0,0 +1,245 @@ +package main + +import ( + "archive/tar" + "context" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "github.com/spf13/cobra" + "github.com/streamingfast/cli" + "github.com/streamingfast/cli/sflags" + "github.com/streamingfast/dstore" + firecore "github.com/streamingfast/firehose-core" + "github.com/streamingfast/node-manager/operator" + "go.uber.org/zap" +) + +func newReaderNodeBootstrapper(ctx context.Context, logger *zap.Logger, cmd *cobra.Command, resolvedNodeArguments []string, resolver firecore.ReaderNodeArgumentResolver) (operator.Bootstrapper, error) { + nodePath := sflags.MustGetString(cmd, "reader-node-path") + bootstrapDataURL := sflags.MustGetString(cmd, "reader-node-bootstrap-data-url") + nodeDataDir := resolver("{node-data-dir}") + + switch { + case strings.HasSuffix(bootstrapDataURL, "tar.zst") || strings.HasSuffix(bootstrapDataURL, "tar.zstd"): + // There could be a mistmatch here if the user override `--datadir` manually, we live it for now + return NewTarballBootstrapper(bootstrapDataURL, nodeDataDir, logger), nil + + case strings.HasSuffix(bootstrapDataURL, "json"): + var args []string + if dataDirArgument := findDataDirArgument(resolvedNodeArguments); dataDirArgument != "" { + args = append(args, dataDirArgument) + } + + return NewGenesisBootstrapper(nodeDataDir, bootstrapDataURL, nodePath, append(args, "init"), logger), nil + default: + return nil, fmt.Errorf("'reader-node-bootstrap-data-url' config should point to either an archive ending in '.tar.zstd' or a genesis file ending in '.json', not %s", bootstrapDataURL) + } +} + +func findDataDirArgument(resolvedNodeArguments []string) string { + for i, arg := range resolvedNodeArguments { + if strings.HasPrefix(arg, "--datadir") { + // If the argument is in 2 parts (e.g. [--datadir, ]), we try to re-combine them + if arg == "--datadir" { + if len(resolvedNodeArguments) > i+1 { + return "--datadir=" + resolvedNodeArguments[i+1] + } + + // The arguments are invalid, we'll let the node fail later on + return arg + } + + return arg + } + } + + return "" +} + +// GenesisBootstrapper needs to write genesis file, static node file, then run a command like 'geth init' +type GenesisBootstrapper struct { + dataDir string + genesisFileURL string + cmdArgs []string + nodePath string + // staticNodesFilepath string + logger *zap.Logger +} + +func NewGenesisBootstrapper(dataDir string, genesisFileURL string, nodePath string, cmdArgs []string, logger *zap.Logger) *GenesisBootstrapper { + return &GenesisBootstrapper{ + dataDir: dataDir, + genesisFileURL: genesisFileURL, + nodePath: nodePath, + cmdArgs: cmdArgs, + logger: logger, + } +} + +func downloadDstoreObject(url string, destpath string) error { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + reader, _, _, err := dstore.OpenObject(ctx, url) + if err != nil { + return fmt.Errorf("cannot get file from store: %w", err) + } + defer reader.Close() + data, err := io.ReadAll(reader) + if err != nil { + return err + } + + return os.WriteFile(destpath, data, 0644) +} + +func (b *GenesisBootstrapper) Bootstrap() error { + if b.genesisFileURL == "" || isBootstrapped(b.dataDir, b.logger) { + return nil + } + + genesisFilePath := filepath.Join(b.dataDir, "genesis.json") + + b.logger.Info("running bootstrap sequence", zap.String("data_dir", b.dataDir), zap.String("genesis_file_path", genesisFilePath)) + if err := os.MkdirAll(b.dataDir, 0755); err != nil { + return fmt.Errorf("cannot create folder %s to bootstrap node: %w", b.dataDir, err) + } + + if !cli.FileExists(genesisFilePath) { + b.logger.Info("fetching genesis file", zap.String("source_url", b.genesisFileURL)) + if err := downloadDstoreObject(b.genesisFileURL, genesisFilePath); err != nil { + return err + } + } + + cmd := exec.Command(b.nodePath, append(b.cmdArgs, genesisFilePath)...) + b.logger.Info("running node init command (creating genesis block from genesis.json)", zap.Stringer("cmd", cmd)) + if output, err := runCmd(cmd); err != nil { + return fmt.Errorf("failed to init node (output %s): %w", output, err) + } + + return nil +} + +func NewTarballBootstrapper( + url string, + dataDir string, + logger *zap.Logger, +) *TarballBootstrapper { + return &TarballBootstrapper{ + url: url, + dataDir: dataDir, + logger: logger, + } +} + +type TarballBootstrapper struct { + url string + dataDir string + logger *zap.Logger +} + +func isBootstrapped(dataDir string, logger *zap.Logger) bool { + var foundCURRENT bool + err := filepath.Walk(dataDir, + func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + if filepath.Base(path) == "CURRENT" { + foundCURRENT = true + return io.EOF + } + return nil + }) + if err != nil && !os.IsNotExist(err) && err != io.EOF { + logger.Warn("error while checking for bootstrapped status", zap.Error(err)) + } + + return foundCURRENT +} + +func (b *TarballBootstrapper) isBootstrapped() bool { + return isBootstrapped(b.dataDir, b.logger) +} + +func (b *TarballBootstrapper) Bootstrap() error { + if b.isBootstrapped() { + return nil + } + + b.logger.Info("bootstrapping geth chain data from pre-built data", zap.String("bootstrap_data_url", b.url)) + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) + defer cancel() + + reader, _, _, err := dstore.OpenObject(ctx, b.url, dstore.Compression("zstd")) + if err != nil { + return fmt.Errorf("cannot get snapshot from gstore: %w", err) + } + defer reader.Close() + + b.createChainData(reader) + return nil +} + +func (b *TarballBootstrapper) createChainData(reader io.Reader) error { + err := os.MkdirAll(b.dataDir, os.ModePerm) + if err != nil { + return fmt.Errorf("unable to create blocks log file: %w", err) + } + + b.logger.Info("extracting bootstrapping data into node data directory", zap.String("data_dir", b.dataDir)) + tr := tar.NewReader(reader) + for { + header, err := tr.Next() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + path := filepath.Join(b.dataDir, header.Name) + b.logger.Debug("about to write content of entry", zap.String("name", header.Name), zap.String("path", path), zap.Bool("is_dir", header.FileInfo().IsDir())) + if header.FileInfo().IsDir() { + err = os.MkdirAll(path, os.ModePerm) + if err != nil { + return fmt.Errorf("unable to create directory: %w", err) + } + + continue + } + + file, err := os.Create(path) + if err != nil { + return fmt.Errorf("unable to create file: %w", err) + } + + if _, err := io.Copy(file, tr); err != nil { + file.Close() + return err + } + file.Close() + } +} + +func runCmd(cmd *exec.Cmd) (string, error) { + // This runs (and wait) the command, combines both stdout and stderr in a single stream and return everything + out, err := cmd.CombinedOutput() + if err == nil { + return "", nil + } + + return string(out), err +} diff --git a/cmd/fireeth/tools_transform_flags.go b/cmd/fireeth/tools_transform_flags.go new file mode 100644 index 00000000..91b36886 --- /dev/null +++ b/cmd/fireeth/tools_transform_flags.go @@ -0,0 +1,153 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/streamingfast/cli/sflags" + "github.com/streamingfast/eth-go" + pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" + "go.uber.org/zap" + "google.golang.org/protobuf/types/known/anypb" +) + +func parseTransformFlags(cmd *cobra.Command, logger *zap.Logger) (transforms []*anypb.Any, err error) { + filters, err := parseFilters(sflags.MustGetString(cmd, "call-filters"), sflags.MustGetString(cmd, "log-filters"), sflags.MustGetBool(cmd, "send-all-block-headers")) + if err != nil { + return nil, err + } + + headerOnly := sflags.MustGetBool(cmd, "header-only") + if filters != nil && headerOnly { + return nil, fmt.Errorf("'header-only' flag is exclusive with 'call-filters', 'log-filters' and 'send-all-block-headers' choose either 'header-only' or a combination of the others") + } + + if headerOnly { + t, err := anypb.New(&pbtransform.HeaderOnly{}) + if err != nil { + return nil, err + } + + return []*anypb.Any{t}, nil + } + + if filters != nil { + t, err := anypb.New(filters) + if err != nil { + return nil, err + } + + return []*anypb.Any{t}, nil + } + + return +} + +func parseFilters(callFilters, logFilters string, sendAllBlockHeaders bool) (*pbtransform.CombinedFilter, error) { + mf := &pbtransform.CombinedFilter{} + + if callFilters == "" && logFilters == "" && !sendAllBlockHeaders { + return nil, nil + } + if callFilters != "" { + for _, filter := range strings.Split(callFilters, ",") { + if filter == "" { + continue + } + parts := strings.Split(filter, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("option --call-filters must be of type address_hash+address_hash+address_hash:event_sig_hash+event_sig_hash (repeated, separated by comma)") + } + var addrs []eth.Address + for _, a := range strings.Split(parts[0], "+") { + if a != "" { + addr := eth.MustNewAddressLoose(a) + addrs = append(addrs, addr) + } + } + var sigs []eth.Hash + for _, s := range strings.Split(parts[1], "+") { + if s != "" { + sig := eth.MustNewHash(s) + sigs = append(sigs, sig) + } + } + + mf.CallFilters = append(mf.CallFilters, basicCallToFilter(addrs, sigs)) + } + } + + if logFilters != "" { + for _, filter := range strings.Split(logFilters, ",") { + if filter == "" { + continue + } + parts := strings.Split(filter, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("option --log-filters must be of type address_hash+address_hash+address_hash:event_sig_hash+event_sig_hash (repeated, separated by comma)") + } + var addrs []eth.Address + for _, a := range strings.Split(parts[0], "+") { + if a != "" { + addr := eth.MustNewAddress(a) + addrs = append(addrs, addr) + } + } + var sigs []eth.Hash + for _, s := range strings.Split(parts[1], "+") { + if s != "" { + sig := eth.MustNewHash(s) + sigs = append(sigs, sig) + } + } + + mf.LogFilters = append(mf.LogFilters, basicLogFilter(addrs, sigs)) + } + } + + if sendAllBlockHeaders { + mf.SendAllBlockHeaders = true + } + return mf, nil +} + +func basicCallToFilter(addrs []eth.Address, sigs []eth.Hash) *pbtransform.CallToFilter { + var addrBytes [][]byte + var sigsBytes [][]byte + + for _, addr := range addrs { + b := addr.Bytes() + addrBytes = append(addrBytes, b) + } + + for _, sig := range sigs { + b := sig.Bytes() + sigsBytes = append(sigsBytes, b) + } + + return &pbtransform.CallToFilter{ + Addresses: addrBytes, + Signatures: sigsBytes, + } +} + +func basicLogFilter(addrs []eth.Address, sigs []eth.Hash) *pbtransform.LogFilter { + var addrBytes [][]byte + var sigsBytes [][]byte + + for _, addr := range addrs { + b := addr.Bytes() + addrBytes = append(addrBytes, b) + } + + for _, sig := range sigs { + b := sig.Bytes() + sigsBytes = append(sigsBytes, b) + } + + return &pbtransform.LogFilter{ + Addresses: addrBytes, + EventSignatures: sigsBytes, + } +} diff --git a/codec/console_reader.go b/codec/console_reader.go index 671fbe9e..8eb420ca 100644 --- a/codec/console_reader.go +++ b/codec/console_reader.go @@ -31,8 +31,10 @@ import ( "github.com/streamingfast/bstream" "github.com/streamingfast/dmetrics" "github.com/streamingfast/eth-go" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "github.com/streamingfast/logging" + "github.com/streamingfast/node-manager/mindreader" "go.uber.org/zap" "google.golang.org/protobuf/proto" ) @@ -50,7 +52,7 @@ type ConsoleReader struct { logger *zap.Logger } -func NewConsoleReader(logger *zap.Logger, lines chan string) (*ConsoleReader, error) { +func NewConsoleReader(lines chan string, blockEncoder firecore.BlockEncoder, logger *zap.Logger, tracer logging.Tracer) (mindreader.ConsolerReader, error) { globalStats := newConsoleReaderStats() globalStats.StartPeriodicLogToZap(context.Background(), logger, 30*time.Second) @@ -58,7 +60,7 @@ func NewConsoleReader(logger *zap.Logger, lines chan string) (*ConsoleReader, er lines: lines, close: func() {}, - ctx: &parseCtx{logger: logger, globalStats: globalStats, normalizationFeatures: &normalizationFeatures{}}, + ctx: &parseCtx{logger: logger, globalStats: globalStats, normalizationFeatures: &normalizationFeatures{}, encoder: blockEncoder}, done: make(chan interface{}), stats: globalStats, @@ -177,6 +179,7 @@ type parseCtx struct { transactionTraces []*pbeth.TransactionTrace evmCallStackIndexes []int32 + encoder firecore.BlockEncoder stats *parsingStats globalStats *consoleReaderStats @@ -1134,7 +1137,7 @@ func (ctx *parseCtx) readBlock(line string) (*bstream.Block, error) { libNum = computeProofOfWorkLIBNum(block.Number, bstream.GetProtocolFirstStreamableBlock) } - bstreamBlock, err := types.BlockFromProto(block, libNum) + bstreamBlock, err := ctx.encoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: libNum}) if err != nil { return nil, err } @@ -1241,7 +1244,7 @@ func (ctx *parseCtx) readEndBlock(line string) (*bstream.Block, error) { libNum = computeProofOfWorkLIBNum(block.Number, bstream.GetProtocolFirstStreamableBlock) } - bstreamBlock, err := types.BlockFromProto(block, libNum) + bstreamBlock, err := ctx.encoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: libNum}) if err != nil { return nil, err } diff --git a/codec/console_reader_test.go b/codec/console_reader_test.go index 18ce8b01..5d289313 100644 --- a/codec/console_reader_test.go +++ b/codec/console_reader_test.go @@ -31,7 +31,7 @@ import ( "testing" "github.com/golang/protobuf/proto" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/jsonpb" "github.com/stretchr/testify/assert" @@ -167,13 +167,14 @@ func TestGeneratePBBlocks(t *testing.T) { t.Skip("generate only when firehose-logs.dmlog changes") cr := testFileConsoleReader(t, "testdata/firehose-logs.dmlog") + encoder := firecore.NewBlockEncoder() for { out, err := cr.ReadBlock() if out != nil { block := out.ToProtocol().(*pbeth.Block) - bstreamBlock, err := types.BlockFromProto(block, out.LibNum) + bstreamBlock, err := encoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: out.LibNum}) require.NoError(t, err) pbBlock, err := bstreamBlock.ToProto() @@ -222,10 +223,12 @@ func testFileConsoleReader(t *testing.T, filename string) *ConsoleReader { } func testReaderConsoleReader(helperFunc func(), lines chan string, closer func()) *ConsoleReader { + encoder := firecore.NewBlockEncoder() + l := &ConsoleReader{ lines: lines, close: closer, - ctx: &parseCtx{logger: zlog, stats: newParsingStats(zlog, 0), globalStats: newConsoleReaderStats(), normalizationFeatures: &normalizationFeatures{UpgradeBlockV2ToV3: true}}, + ctx: &parseCtx{logger: zlog, stats: newParsingStats(zlog, 0), globalStats: newConsoleReaderStats(), normalizationFeatures: &normalizationFeatures{UpgradeBlockV2ToV3: true}, encoder: encoder}, logger: zlog, } diff --git a/codec/init_test.go b/codec/init_test.go index cda1f14e..5d594e1c 100644 --- a/codec/init_test.go +++ b/codec/init_test.go @@ -1,8 +1,12 @@ package codec -import "github.com/streamingfast/logging" +import ( + // Import for its side-effect (registering necessary bstream + _ "github.com/streamingfast/firehose-ethereum/types" + "github.com/streamingfast/logging" +) -var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/node-mananager/codec") +var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/codec") func init() { logging.InstantiateLoggers() diff --git a/devel/.gitignore b/devel/.gitignore index ead192c1..af9c8b2d 100644 --- a/devel/.gitignore +++ b/devel/.gitignore @@ -1,5 +1,6 @@ geth/ sf-data/ cs-data/ +firehose-data/ perso /bsc-local/localdata/ diff --git a/devel/firehose-mainnet/firehose-mainnet.yaml b/devel/firehose-mainnet/firehose-mainnet.yaml index e25325bd..e7200820 100644 --- a/devel/firehose-mainnet/firehose-mainnet.yaml +++ b/devel/firehose-mainnet/firehose-mainnet.yaml @@ -7,6 +7,10 @@ start: # - $FIREETH_COMMON_FORKED_BLOCKS_STORE_URL (defines common-forked-blocks-store-url) # - $FIREETH_COMMON_MERGED_BLOCKS_STORE_URL (defines common-merged-blocks-store-url) # - $FIREETH_SUBSTREAMS_RPC_ENDPOINTS (defines substreams-rpc-endpoint) + # + # Assuming `BLOCK_STORE_URL` is defined, someone can use those config + # - Mainnet: ./devel/firehose-mainnet/start.sh -c -- --common-one-block-store-url="${BLOCK_STORE_URL}/eth-mainnet/v4-oneblock" --common-forked-blocks-store-url="${BLOCK_STORE_URL}/eth-mainnet/v4-forked" --common-merged-blocks-store-url="${BLOCK_STORE_URL}/eth-mainnet/v4" --common-live-blocks-addr="" + # # Comment out 'common-live-blocks-addr' to only use historical which improves the start up speed of 'fireeth' common-live-blocks-addr: localhost:9001 diff --git a/devel/firehose-mainnet/start.sh b/devel/firehose-mainnet/start.sh index 79c6b652..ea15ab90 100755 --- a/devel/firehose-mainnet/start.sh +++ b/devel/firehose-mainnet/start.sh @@ -20,20 +20,6 @@ main() { set -e - if [[ - -z "$FIREETH_COMMON_ONE_BLOCK_STORE_URL" || - -z "$FIREETH_COMMON_FORKED_BLOCKS_STORE_URL" || - -z "$FIREETH_COMMON_MERGED_BLOCKS_STORE_URL" || - -z "$FIREETH_SUBSTREAMS_RPC_ENDPOINTS" - ]]; then - echo 'To use this config, you must define:' - echo '- FIREETH_COMMON_ONE_BLOCK_STORE_URL (defines common-one-block-store-url)' - echo '- FIREETH_COMMON_FORKED_BLOCKS_STORE_URL (defines common-forked-blocks-store-url)' - echo '- FIREETH_COMMON_MERGED_BLOCKS_STORE_URL (defines common-merged-blocks-store-url)' - echo '- FIREETH_SUBSTREAMS_RPC_ENDPOINTS (defines substreams-rpc-endpoint)' - exit 1 - fi - if [[ $clean == "true" ]]; then rm -rf sf-data &> /dev/null || true fi diff --git a/devel/standard/miner/bootstrap.tar.gz b/devel/standard/miner/bootstrap.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a3d84e8fbb6e18d9b1b07bebf96376976c6deba GIT binary patch literal 81214 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 m~l9$PcUsHNVIkt9y1-Ko+L>H@&n1>Z!`> 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 bdu++6O|_{u)u!6?zmWb9@VR#`0CofbQvZkt literal 0 HcmV?d00001 diff --git a/devel/standard/miner/bootstrap.tar.zst b/devel/standard/miner/bootstrap.tar.zst deleted file mode 100644 index ecbb910c23356b5963f5e199fb4610dd1a1c528a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52250 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 diff --git a/devel/standard/miner/config.toml b/devel/standard/miner/config.toml new file mode 100644 index 00000000..594ffb79 --- /dev/null +++ b/devel/standard/miner/config.toml @@ -0,0 +1,15 @@ +[Eth] +NetworkId = 1515 +SyncMode = "full" +# Activate archive mode +NoPruning = true + +[Node] +HTTPHost = "" +HTTPPort = 8545 +HTTPModules = ["personal", "net", "web3", "eth"] +AuthPort = 8551 + +[Node.P2P] +ListenAddr = ":30303" +NoDiscovery = true diff --git a/devel/standard/reader/config.toml b/devel/standard/reader/config.toml new file mode 100644 index 00000000..a8645ebb --- /dev/null +++ b/devel/standard/reader/config.toml @@ -0,0 +1,4 @@ +[Node.P2P] +StaticNodes = [ + "enode://e4d5433fd9e84930cd38028f2fdb1ca8d55bdb7b6a749da57e8aa7fc5d3c146c44c0d129a14cecc7b0f13bb98700bf392dd4fd7c31bf2fe26038d4ba8f5a8e32@127.0.0.1:30303", +] diff --git a/devel/standard/reader/static-nodes.json b/devel/standard/reader/static-nodes.json deleted file mode 100644 index 8e3dfab0..00000000 --- a/devel/standard/reader/static-nodes.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - "enode://444aadceb03f6dad618842399a1e5908de4bdd7bf3fa64b3dc1ac6dfe5843a99302b86049b2b5c3e16ee3a3279cb09465d98741a8f791b0b0f7a48c309d41dcf@127.0.0.1:13090" -] \ No newline at end of file diff --git a/devel/standard/standard.yaml b/devel/standard/standard.yaml index 77e81252..3a4042e9 100644 --- a/devel/standard/standard.yaml +++ b/devel/standard/standard.yaml @@ -1,23 +1,31 @@ start: args: - - node - reader-node - merger - relayer - - combined-index-builder + - index-builder - firehose - substreams-tier1 - substreams-tier2 flags: - node-role: dev-miner - node-bootstrap-data-url: ./miner/bootstrap.tar.zst - node-log-to-zap: false - reader-node-bootstrap-data-url: ./reader/genesis.json - reader-node-enforce-peers: localhost:13041 # App `node` manager API port - reader-node-arguments: +--firehose-genesis-file=./reader/genesis.json --authrpc.port=8552 - reader-node-log-to-zap: false - merger-time-between-store-pruning: 10s firehose-grpc-listen-addr: :8089 + merger-time-between-store-pruning: 10s + reader-node-bootstrap-data-url: ./reader/genesis.json + reader-node-arguments: + --config=./reader/config.toml + --networkid=1515 + --datadir={node-data-dir} + --ipcpath={data-dir}/reader/ipc + --port=30305 + --nodiscover + --authrpc.port=8552 + --http + --http.api=eth,net,web3 + --http.port=8547 + --http.addr=0.0.0.0 + --http.vhosts=* + --firehose-enabled + --firehose-genesis-file=./reader/genesis.json #substreams-rpc-endpoints: $ETH_MAINNET_RPC # replace with eth mainnet rpc endpoint substreams-rpc-cache-chunk-size: 100 substreams-state-bundle-size: 100 diff --git a/devel/standard/start.sh b/devel/standard/start.sh index 4964b96c..456960b5 100755 --- a/devel/standard/start.sh +++ b/devel/standard/start.sh @@ -18,13 +18,36 @@ main() { shift $((OPTIND-1)) [[ $1 = "--" ]] && shift + fh_data_dir="$ROOT/firehose-data" + miner_data_dir="$fh_data_dir/miner" + + # If nodekey is changed, the enode must be updated too because it's generated from the nodekey (put here for reference purposes, do not remove) + miner_enode="enode://e4d5433fd9e84930cd38028f2fdb1ca8d55bdb7b6a749da57e8aa7fc5d3c146c44c0d129a14cecc7b0f13bb98700bf392dd4fd7c31bf2fe26038d4ba8f5a8e32@[127.0.0.1]:30303" + miner_nodekey="f5f0aadf436e6b35c5fc00a1b0dbc181113ce4f3c448b73b954fe932c00a1b0d" + set -e if [[ $clean == "true" ]]; then - rm -rf sf-data &> /dev/null || true + rm -rf "$fh_data_dir" &> /dev/null || true + + echo "Creating miner Geth directory from 'bootstrap.tar.gz'" + mkdir -p "$miner_data_dir" + tar -C "$miner_data_dir" -xzf "$ROOT/miner/bootstrap.tar.gz" fi - exec $fireeth -c $(basename $ROOT).yaml start "$@" + # The sleep is here to give 1s for the process to exists, too fast and the 'kill' is a noop + trap "trap - SIGTERM && sleep 1 && kill -- -$$" SIGINT SIGTERM EXIT + geth \ + --config="$ROOT/miner/config.toml" \ + --datadir="$miner_data_dir" \ + --mine \ + --miner.etherbase=0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab \ + --nodekeyhex="$miner_nodekey" \ + --allow-insecure-unlock \ + --password=/dev/null \ + --unlock=0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab & + + $fireeth -c $(basename $ROOT).yaml start "$@" } usage_error() { @@ -46,7 +69,7 @@ usage() { echo " -c Clean actual data directory first" echo "" echo "Examples" - echo " Stream blocks grpcurl -plaintext -import-path ../proto -import-path ./proto -proto sf/ethereum/type/v2/type.proto -proto sf/firehose/v1/firehose.proto -d '{\"start_block_num\": -1}' localhost:13042 sf.firehose.v1.Stream.Blocks" + echo " Stream blocks grpcurl -plaintext -d '{\"start_block_num\": -1}' localhost:8089 sf.firehose.v2.Stream/Blocks" } main "$@" diff --git a/tools/download-blocks-from-firehose.go b/tools/download-blocks-from-firehose.go deleted file mode 100644 index 8a5e58c7..00000000 --- a/tools/download-blocks-from-firehose.go +++ /dev/null @@ -1,92 +0,0 @@ -package tools - -import ( - "context" - "fmt" - "os" - "strconv" - - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/firehose-ethereum/types" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - sftools "github.com/streamingfast/sf-tools" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/anypb" -) - -func init() { - Cmd.AddCommand(DownloadFromFirehoseCmd) - DownloadFromFirehoseCmd.Flags().StringP("api-token-env-var", "a", "FIREHOSE_API_TOKEN", "Look for a JWT in this environment variable to authenticate against endpoint") - DownloadFromFirehoseCmd.Flags().BoolP("plaintext", "p", false, "Use plaintext connection to firehose") - DownloadFromFirehoseCmd.Flags().BoolP("insecure", "k", false, "Skip SSL certificate validation when connecting to firehose") - DownloadFromFirehoseCmd.Flags().Bool("fix-ordinals", false, "Decode the eth blocks to fix the ordinals in the receipt logs") -} - -var DownloadFromFirehoseCmd = &cobra.Command{ - Use: "download-from-firehose ", - Short: "download blocks from firehose and save them to merged-blocks", - Args: cobra.ExactArgs(4), - RunE: downloadFromFirehoseE, - Example: ExamplePrefixed("fireeth tools download-from-firehose", ` - api.streamingfast.io 1000 2000 ./outputdir - `), -} - -func downloadFromFirehoseE(cmd *cobra.Command, args []string) error { - ctx := context.Background() - - endpoint := args[0] - start, err := strconv.ParseUint(args[1], 10, 64) - if err != nil { - return fmt.Errorf("parsing start block num: %w", err) - } - stop, err := strconv.ParseUint(args[2], 10, 64) - if err != nil { - return fmt.Errorf("parsing stop block num: %w", err) - } - destFolder := args[3] - - apiTokenEnvVar := mustGetString(cmd, "api-token-env-var") - apiToken := os.Getenv(apiTokenEnvVar) - - plaintext := mustGetBool(cmd, "plaintext") - insecure := mustGetBool(cmd, "insecure") - var fixerFunc func(*bstream.Block) (*bstream.Block, error) - if mustGetBool(cmd, "fix-ordinals") { - fixerFunc = func(in *bstream.Block) (*bstream.Block, error) { - block := in.ToProtocol().(*pbeth.Block) - return types.BlockFromProto(block, in.LibNum) - } - } else { - fixerFunc = func(in *bstream.Block) (*bstream.Block, error) { - return in, nil - } - } - - return sftools.DownloadFirehoseBlocks( - ctx, - endpoint, - apiToken, - insecure, - plaintext, - start, - stop, - destFolder, - decodeAnyPB, - fixerFunc, - zlog, - ) -} - -func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { - block := &pbeth.Block{} - if err := anypb.UnmarshalTo(in, block, proto.UnmarshalOptions{}); err != nil { - return nil, fmt.Errorf("unmarshal anypb: %w", err) - } - - // We are downloading only final blocks from the Firehose connection which means the LIB for them - // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like - // `LIBNum == self.BlockNum`). - return types.BlockFromProto(block, block.Number-1) -} diff --git a/tools/firehose-prometheus-exporter.go b/tools/firehose-prometheus-exporter.go deleted file mode 100644 index 28f9560c..00000000 --- a/tools/firehose-prometheus-exporter.go +++ /dev/null @@ -1,14 +0,0 @@ -package tools - -import ( - sftools "github.com/streamingfast/sf-tools" -) - -func init() { - prometheusExporterCmd := sftools.GetFirehosePrometheusExporterCmd(zlog, tracer, transformsSetter) - prometheusExporterCmd.Flags().Bool("header-only", false, "Apply the HeaderOnly transform sending back Block's header only (with few top-level fields), exclusive option") - prometheusExporterCmd.Flags().String("call-filters", "", "call filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") - prometheusExporterCmd.Flags().String("log-filters", "", "log filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") - prometheusExporterCmd.Flags().Bool("send-all-block-headers", false, "ask for all the blocks to be sent (header-only if there is no match)") - Cmd.AddCommand(prometheusExporterCmd) -} diff --git a/types/block.go b/types/block.go deleted file mode 100644 index ca4fee6b..00000000 --- a/types/block.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 types - -import ( - "fmt" - - "github.com/streamingfast/bstream" - firecore "github.com/streamingfast/firehose-core" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" - "google.golang.org/protobuf/proto" -) - -var _ firecore.Block = (*pbeth.Block)(nil) - -func BlockFromProto(b *pbeth.Block, libNum uint64) (*bstream.Block, error) { - blockTime, err := b.Time() - if err != nil { - return nil, err - } - - content, err := proto.Marshal(b) - if err != nil { - return nil, fmt.Errorf("unable to marshal to binary form: %s", err) - } - - blk := &bstream.Block{ - Id: b.ID(), - Number: b.Number, - PreviousId: b.PreviousID(), - Timestamp: blockTime, - LibNum: libNum, - PayloadKind: pbbstream.Protocol_ETH, - PayloadVersion: b.Ver, - } - - return bstream.GetBlockPayloadSetter(blk, content) -} diff --git a/types/decoder.go b/types/decoder.go deleted file mode 100644 index 3afef621..00000000 --- a/types/decoder.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 types - -import ( - "fmt" - - "github.com/streamingfast/bstream" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" - "google.golang.org/protobuf/proto" -) - -func BlockDecoder(blk *bstream.Block) (interface{}, error) { - if blk.Kind() != pbbstream.Protocol_ETH { - return nil, fmt.Errorf("expected kind %s, got %s", pbbstream.Protocol_ETH, blk.Kind()) - } - - if blk.Version() > 3 || blk.Version() < 1 { - return nil, fmt.Errorf("this decoder only knows about version 1, 2 and 3, got %d", blk.Version()) - } - - block := new(pbeth.Block) - pl, err := blk.Payload.Get() - if err != nil { - return nil, fmt.Errorf("unable to get payload: %s", err) - } - - err = proto.Unmarshal(pl, block) - if err != nil { - return nil, fmt.Errorf("unable to decode payload: %s", err) - } - - return block, nil -} diff --git a/types/init.go b/types/init.go index 8350471c..7b3d533a 100644 --- a/types/init.go +++ b/types/init.go @@ -15,38 +15,32 @@ package types import ( - "fmt" - "io" "strings" - "time" "github.com/streamingfast/bstream" + firecore "github.com/streamingfast/firehose-core" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" + "google.golang.org/protobuf/proto" ) +var _ firecore.Block = (*pbeth.Block)(nil) + +var encoder = firecore.NewBlockEncoder() + +var BlockAcceptedVersions = []int32{1, 2, 3} + func init() { - bstream.GetBlockWriterFactory = bstream.BlockWriterFactoryFunc(blockWriterFactory) - bstream.GetBlockReaderFactory = bstream.BlockReaderFactoryFunc(blockReaderFactory) - bstream.GetBlockDecoder = bstream.BlockDecoderFunc(BlockDecoder) - bstream.GetBlockWriterHeaderLen = 10 - bstream.GetBlockPayloadSetter = bstream.MemoryBlockPayloadSetter - bstream.GetMemoizeMaxAge = 20 * time.Second + // Doing it in `types` ensure that does that depend only on us are properly initialized + firecore.UnsafePayloadKind = pbbstream.Protocol_ETH + + // Must fit what is defined in `cmd/fireeth/main.go` in regards to `protocol` and `protocolVersion` and `blockAcceptedVersions` + bstream.InitGeneric("ETH", 1, BlockAcceptedVersions, func() proto.Message { return &pbeth.Block{} }) bstream.NormalizeBlockID = func(in string) string { return strings.TrimPrefix(strings.ToLower(in), "0x") } } -func blockReaderFactory(reader io.Reader) (bstream.BlockReader, error) { - return bstream.NewDBinBlockReader(reader, func(contentType string, version int32) error { - protocol := pbbstream.Protocol(pbbstream.Protocol_value[contentType]) - if protocol != pbbstream.Protocol_ETH && version != 1 { - return fmt.Errorf("reader only knows about %s block kind at version 1, got %s at version %d", protocol, contentType, version) - } - - return nil - }) -} - -func blockWriterFactory(writer io.Writer) (bstream.BlockWriter, error) { - return bstream.NewDBinBlockWriter(writer, pbbstream.Protocol_ETH.String(), 1) +func BlockFromProto(b *pbeth.Block, libNum uint64) (*bstream.Block, error) { + return encoder.Encode(firecore.BlockEnveloppe{Block: b, LIBNum: libNum}) } diff --git a/types/logging.go b/types/logging.go deleted file mode 100644 index ab471b35..00000000 --- a/types/logging.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 types - -import ( - "github.com/streamingfast/logging" -) - -var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/types") diff --git a/types/pb/sf/ethereum/type/v2/type.go b/types/pb/sf/ethereum/type/v2/type.go index 84c88dc9..c22ca4c2 100644 --- a/types/pb/sf/ethereum/type/v2/type.go +++ b/types/pb/sf/ethereum/type/v2/type.go @@ -293,13 +293,6 @@ func (b *Block) GetFirehoseBlockID() string { return hex.EncodeToString(b.Hash) } -// GetFirehoseBlockLIBNum implements firecore.Block. -func (b *Block) GetFirehoseBlockLIBNum() uint64 { - // FIXME: Wrong, LIBNum is incorrect and can only be implemented by console reader! - // Need to review firehose-core to see how GetFirehoseBlockLIBNum is used - return b.LIBNum() -} - // GetFirehoseBlockNumber implements firecore.Block. func (b *Block) GetFirehoseBlockNumber() uint64 { return b.Number @@ -314,3 +307,8 @@ func (b *Block) GetFirehoseBlockParentID() string { func (b *Block) GetFirehoseBlockTime() time.Time { return b.Header.Timestamp.AsTime() } + +// GetFirehoseBlockVersion implements firecore.Block. +func (b *Block) GetFirehoseBlockVersion() int32 { + return b.Ver +} diff --git a/types/testing/types.go b/types/testing/types.go index ea158626..42ad6243 100644 --- a/types/testing/types.go +++ b/types/testing/types.go @@ -555,7 +555,3 @@ func failInvalidComponent(t testing.T, tag string, component interface{}, option require.FailNowf(t, "invalid component", "Invalid %s component of type %T", tag, component) } - -func logInvalidComponent(tag string, component interface{}) { - zlog.Info(fmt.Sprintf("invalid %s component of type %T", tag, component)) -} From f66c79dda2808fe59890301d44d586b63b46adb3 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Fri, 27 Oct 2023 19:37:18 -0400 Subject: [PATCH 05/11] Ported all remaining tools to firehose-core framework --- cmd/fireeth/cli/node.go | 3 +- cmd/fireeth/cli/reader-node-stdin.go | 3 +- cmd/fireeth/main.go | 6 +- cmd/fireeth/main_test.go | 6 +- cmd/fireeth/tools.go | 5 + cmd/fireeth/tools_compare_blocks_rpc.go | 444 ++++++++++++++++++++++ cmd/fireeth/tools_compare_oneblock_rpc.go | 102 +++++ cmd/fireeth/tools_fix_polygon_index.go | 165 ++++++++ cmd/fireeth/tools_poll_rpc_blocks.go | 101 +++++ go.mod | 10 +- go.sum | 16 +- tools/blocks.go | 431 --------------------- tools/check.go | 89 ----- tools/compare-rpc-oneblock.go | 31 ++ tools/compare-rpc.go | 15 + tools/firehose-client.go | 164 -------- tools/fix-polygon-index.go | 17 +- tools/unmerge.go | 143 ------- 18 files changed, 901 insertions(+), 850 deletions(-) create mode 100644 cmd/fireeth/tools_compare_blocks_rpc.go create mode 100644 cmd/fireeth/tools_compare_oneblock_rpc.go create mode 100644 cmd/fireeth/tools_fix_polygon_index.go create mode 100644 cmd/fireeth/tools_poll_rpc_blocks.go delete mode 100644 tools/blocks.go delete mode 100644 tools/check.go delete mode 100644 tools/firehose-client.go delete mode 100644 tools/unmerge.go diff --git a/cmd/fireeth/cli/node.go b/cmd/fireeth/cli/node.go index bee6b01e..754bbc03 100644 --- a/cmd/fireeth/cli/node.go +++ b/cmd/fireeth/cli/node.go @@ -25,6 +25,7 @@ import ( "github.com/streamingfast/bstream" "github.com/streamingfast/bstream/blockstream" "github.com/streamingfast/dlauncher/launcher" + firecore "github.com/streamingfast/firehose-core" "github.com/streamingfast/firehose-ethereum/codec" nodemanager "github.com/streamingfast/firehose-ethereum/node-manager" "github.com/streamingfast/firehose-ethereum/node-manager/dev" @@ -203,7 +204,7 @@ func nodeFactoryFunc(isReader bool, backupModuleFactories map[string]operator.Ba oneBlocksStoreURL, workingDir, func(lines chan string) (reader.ConsolerReader, error) { - return codec.NewConsoleReader(appLogger, lines) + return codec.NewConsoleReader(lines, firecore.NewBlockEncoder(), appLogger, appTracer) }, batchStartBlockNum, batchStopBlockNum, diff --git a/cmd/fireeth/cli/reader-node-stdin.go b/cmd/fireeth/cli/reader-node-stdin.go index 0bc5cde1..cbc31008 100644 --- a/cmd/fireeth/cli/reader-node-stdin.go +++ b/cmd/fireeth/cli/reader-node-stdin.go @@ -20,6 +20,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/streamingfast/dlauncher/launcher" + firecore "github.com/streamingfast/firehose-core" "github.com/streamingfast/firehose-ethereum/codec" "github.com/streamingfast/logging" nodeManager "github.com/streamingfast/node-manager" @@ -41,7 +42,7 @@ func init() { archiveStoreURL := MustReplaceDataDir(sfDataDir, viper.GetString("common-one-block-store-url")) consoleReaderFactory := func(lines chan string) (mindreader.ConsolerReader, error) { - r, err := codec.NewConsoleReader(appLogger, lines) + r, err := codec.NewConsoleReader(lines, firecore.NewBlockEncoder(), appLogger, appTracer) if err != nil { return nil, fmt.Errorf("initiating console reader: %w", err) } diff --git a/cmd/fireeth/main.go b/cmd/fireeth/main.go index 468e8112..1532e49e 100644 --- a/cmd/fireeth/main.go +++ b/cmd/fireeth/main.go @@ -63,8 +63,10 @@ var Chain = &firecore.Chain[*pbeth.Block]{ BlockPrinter: printBlock, RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { - // toolsCmd.AddCommand(newToolsGenerateNodeKeyCmd(chain)) - // toolsCmd.AddCommand(newToolsBackfillCmd(zlog)) + toolsCmd.AddCommand(compareOneblockRPCCmd) + toolsCmd.AddCommand(newCompareBlocksRPCCmd(zlog)) + toolsCmd.AddCommand(newFixPolygonIndexCmd(zlog)) + toolsCmd.AddCommand(newPollRPCBlocksCmd(zlog)) return nil }, diff --git a/cmd/fireeth/main_test.go b/cmd/fireeth/main_test.go index 4fecc806..919b39dd 100644 --- a/cmd/fireeth/main_test.go +++ b/cmd/fireeth/main_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/streamingfast/bstream" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/test-go/testify/require" ) @@ -13,10 +14,11 @@ func Test_Encode_Decode_Block(t *testing.T) { Chain.Validate() Chain.Init() - original, err := Chain.BlockEncoder.Encode(&pbeth.Block{ + original, err := Chain.BlockEncoder.Encode(firecore.BlockEnveloppe{Block: &pbeth.Block{ Number: 1, Header: &pbeth.BlockHeader{}, - }) + Ver: 1, + }, LIBNum: 0}) require.NoError(t, err) require.Equal(t, uint64(1), original.ToProtocol().(*pbeth.Block).Number) diff --git a/cmd/fireeth/tools.go b/cmd/fireeth/tools.go index de0b735f..ec0d1b9e 100644 --- a/cmd/fireeth/tools.go +++ b/cmd/fireeth/tools.go @@ -6,6 +6,7 @@ import ( "io" "github.com/streamingfast/bstream" + "github.com/streamingfast/cli" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" ) @@ -31,3 +32,7 @@ func printBlock(blk *bstream.Block, alsoPrintTransactions bool, out io.Writer) e return nil } + +func ExamplePrefixed(prefix, examples string) string { + return string(cli.ExamplePrefixed(prefix, examples)) +} diff --git a/cmd/fireeth/tools_compare_blocks_rpc.go b/cmd/fireeth/tools_compare_blocks_rpc.go new file mode 100644 index 00000000..b4517f5a --- /dev/null +++ b/cmd/fireeth/tools_compare_blocks_rpc.go @@ -0,0 +1,444 @@ +// Copyright 2021 dfuse Platform Inc. +// +// 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 main + +import ( + "bytes" + "fmt" + "io" + "os" + "strconv" + "time" + + "github.com/holiman/uint256" + jd "github.com/josephburnett/jd/lib" + "github.com/mostynb/go-grpc-compression/zstd" + "github.com/spf13/cobra" + "github.com/streamingfast/bstream" + "github.com/streamingfast/cli" + "github.com/streamingfast/cli/sflags" + "github.com/streamingfast/eth-go" + "github.com/streamingfast/eth-go/rpc" + firecore "github.com/streamingfast/firehose-core" + "github.com/streamingfast/firehose-ethereum/types" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "github.com/streamingfast/firehose/client" + pbfirehose "github.com/streamingfast/pbgo/sf/firehose/v2" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" +) + +func init() { + + //compareBlocksRPCCmd.PersistentFlags().String("write-rpc-cache", "compared-rpc-blocks.jsonl", "When non-empty, the results of the RPC calls will be appended to this JSONL file") + //compareBlocksRPCCmd.PersistentFlags().String("read-rpc-cache", "compared-rpc-blocks.jsonl", "When non-empty, this file will be parsed before doing any RPC calls") +} + +func newCompareBlocksRPCCmd(logger *zap.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "compare-blocks-rpc ", + Short: "Checks for any differences between a Firehose and RPC endpoint (get_block) for a specified range.", + Long: cli.Dedent(` + The 'compare-blocks-rpc' takes in a firehose URL, an RPC endpoint URL and inclusive start/stop block numbers. + `), + Args: cobra.ExactArgs(4), + RunE: createCompareBlocksRPCE(logger), + Example: ExamplePrefixed("fireeth tools compare-blocks-rpc", ` + # Run over full block range + mainnet.eth.streamingfast.io:443 http://localhost:8545 1000000 1001000 + `), + } + + cmd.PersistentFlags().Bool("diff", false, "When activated, difference is displayed for each block with a difference") + cmd.Flags().BoolP("plaintext", "p", false, "Use plaintext connection to Firehose") + cmd.Flags().BoolP("insecure", "k", false, "Use SSL connection to Firehose but skip SSL certificate validation") + + cmd.Flags().StringP("api-token-env-var", "a", "FIREHOSE_API_TOKEN", "Look for a JWT in this environment variable to authenticate against endpoint") + + return cmd +} + +func createCompareBlocksRPCE(logger *zap.Logger) firecore.CommandExecutor { + return func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + firehoseEndpoint := args[0] + rpcEndpoint := args[1] + cli := rpc.NewClient(rpcEndpoint) + start, err := strconv.ParseInt(args[2], 10, 64) + if err != nil { + return fmt.Errorf("parsing start block num: %w", err) + } + stop, err := strconv.ParseUint(args[3], 10, 64) + if err != nil { + return fmt.Errorf("parsing stop block num: %w", err) + } + apiTokenEnvVar := sflags.MustGetString(cmd, "api-token-env-var") + jwt := os.Getenv(apiTokenEnvVar) + + plaintext := sflags.MustGetBool(cmd, "plaintext") + insecure := sflags.MustGetBool(cmd, "insecure") + + firehoseClient, connClose, grpcCallOpts, err := client.NewFirehoseClient(firehoseEndpoint, jwt, insecure, plaintext) + if err != nil { + return err + } + defer connClose() + + grpcCallOpts = append(grpcCallOpts, grpc.UseCompressor(zstd.Name)) + + request := &pbfirehose.Request{ + StartBlockNum: start, + StopBlockNum: stop, + FinalBlocksOnly: true, + } + + stream, err := firehoseClient.Blocks(ctx, request, grpcCallOpts...) + if err != nil { + return fmt.Errorf("unable to start blocks stream: %w", err) + } + + meta, err := stream.Header() + if err != nil { + logger.Warn("cannot read header") + } else { + if hosts := meta.Get("hostname"); len(hosts) != 0 { + logger = logger.With(zap.String("remote_hostname", hosts[0])) + } + } + logger.Info("connected") + + respChan := make(chan *pbeth.Block, 100) + + allDone := make(chan struct{}) + go func() { + + for fhBlock := range respChan { + + rpcBlock, err := cli.GetBlockByNumber(ctx, rpc.BlockNumber(fhBlock.Number), rpc.WithGetBlockFullTransaction()) + if err != nil { + panic(err) + } + + logs, err := cli.Logs(ctx, rpc.LogsParams{ + FromBlock: rpc.BlockNumber(fhBlock.Number), + ToBlock: rpc.BlockNumber(fhBlock.Number), + }) + if err != nil { + panic(err) + } + + identical, diffs := CompareFirehoseToRPC(fhBlock, rpcBlock, logs) + if !identical { + fmt.Println("different", diffs) + } else { + fmt.Println(fhBlock.Number, "identical") + } + } + close(allDone) + }() + + for { + response, err := stream.Recv() + if err != nil { + if err == io.EOF { + break + } + return fmt.Errorf("stream error while receiving: %w", err) + } + blk, err := decodeAnyPB(response.Block) + if err != nil { + return fmt.Errorf("error while decoding block: %w", err) + } + respChan <- blk.ToProtocol().(*pbeth.Block) + } + close(respChan) + <-allDone + + return nil + } +} + +func bigIntFromEthUint256(in *eth.Uint256) *pbeth.BigInt { + if in == nil { + return &pbeth.BigInt{} + } + + in32 := (*uint256.Int)(in).Bytes32() + slice := bytes.TrimLeft(in32[:], string([]byte{0})) + if len(slice) == 0 { + return &pbeth.BigInt{} + } + return pbeth.BigIntFromBytes(slice) +} + +func toFirehoseBlock(in *rpc.Block, logs []*rpc.LogEntry) (*pbeth.Block, map[string]bool) { + + trx, hashesWithoutTo := toFirehoseTraces(in.Transactions, logs) + + out := &pbeth.Block{ + Hash: in.Hash.Bytes(), + Number: uint64(in.Number), + Ver: 3, + Size: uint64(in.BlockSize), + Uncles: toFirehoseUncles(in.Uncles), + TransactionTraces: trx, + Header: &pbeth.BlockHeader{ + ParentHash: in.ParentHash.Bytes(), + // Coinbase: nil, // FIXME + // UncleHash: nil, + StateRoot: in.StateRoot.Bytes(), + TransactionsRoot: in.TransactionsRoot.Bytes(), + ReceiptRoot: in.ReceiptsRoot.Bytes(), + LogsBloom: in.LogsBloom.Bytes(), + Difficulty: bigIntFromEthUint256(in.Difficulty), + TotalDifficulty: bigIntFromEthUint256(in.TotalDifficulty), + Number: uint64(in.Number), + GasLimit: uint64(in.GasLimit), + GasUsed: uint64(in.GasUsed), + Timestamp: timestamppb.New(time.Time(in.Timestamp)), + ExtraData: in.ExtraData.Bytes(), + Nonce: uint64(in.Nonce), + Hash: in.Hash.Bytes(), + MixHash: in.MixHash.Bytes(), + BaseFeePerGas: bigIntFromEthUint256(in.BaseFeePerGas), + // WithdrawalsRoot: in.WithdrawalsRoot, // FIXME + // TxDependency: in.TxDependency // FIXME + }, + } + return out, hashesWithoutTo +} + +func toFirehoseUncles(in []eth.Hash) []*pbeth.BlockHeader { + out := make([]*pbeth.BlockHeader, len(in)) + for i := range in { + out[i] = &pbeth.BlockHeader{ + Hash: in[i].Bytes(), + } + } + return out +} + +func toFirehoseTraces(in *rpc.BlockTransactions, logs []*rpc.LogEntry) (traces []*pbeth.TransactionTrace, hashesWithoutTo map[string]bool) { + + receipts, _ := in.Receipts() + out := make([]*pbeth.TransactionTrace, len(receipts)) + hashesWithoutTo = make(map[string]bool) + for i := range receipts { + txHash := eth.Hash(receipts[i].Hash.Bytes()).String() + var toBytes []byte + if receipts[i].To != nil { + toBytes = receipts[i].To.Bytes() + } else { + hashesWithoutTo[txHash] = true + } + + out[i] = &pbeth.TransactionTrace{ + Hash: receipts[i].Hash.Bytes(), + To: toBytes, + Nonce: uint64(receipts[i].Nonce), + GasLimit: uint64(receipts[i].Gas), + GasPrice: bigIntFromEthUint256(receipts[i].GasPrice), + Input: receipts[i].Input.Bytes(), + Value: bigIntFromEthUint256(receipts[i].Value), + From: receipts[i].From.Bytes(), + Index: uint32(receipts[i].TransactionIndex), + Receipt: &pbeth.TransactionReceipt{ + // filled next + }, + V: pbeth.NewBigInt(int64(receipts[i].V)).Bytes, + //R: bigIntFromEthUint256(receipts[i].R).Bytes, + //S: bigIntFromEthUint256(receipts[i].S).Bytes, + } + + for _, log := range logs { + if eth.Hash(log.TransactionHash).String() == txHash { + out[i].Receipt.Logs = append(out[i].Receipt.Logs, &pbeth.Log{ + Address: log.Address.Bytes(), //[]byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Topics: hashesToBytes(log.Topics), //[][]byte `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` + Data: log.Data.Bytes(), //[]byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + BlockIndex: uint32(log.ToLog().BlockIndex), //uint32 `protobuf:"varint,6,opt,name=blockIndex,proto3" json:"blockIndex,omitempty"` + }) + } + } + + } + return out, hashesWithoutTo +} + +func hashesToBytes(in []eth.Hash) [][]byte { + out := make([][]byte, len(in)) + for i := range in { + out[i] = in[i].Bytes() + } + return out +} + +// only keep hash +func stripFirehoseUncles(in []*pbeth.BlockHeader) { + for _, uncle := range in { + uncle.BaseFeePerGas = nil + uncle.Coinbase = nil + uncle.Difficulty = nil + uncle.ExtraData = nil + uncle.GasLimit = 0 + uncle.GasUsed = 0 + uncle.LogsBloom = nil + uncle.MixHash = nil + uncle.Nonce = 0 + uncle.Number = 0 + uncle.ParentHash = nil + uncle.ReceiptRoot = nil + uncle.StateRoot = nil + uncle.Timestamp = nil + uncle.TotalDifficulty = nil + uncle.TransactionsRoot = nil + uncle.TxDependency = nil + uncle.UncleHash = nil + uncle.WithdrawalsRoot = nil + } +} + +func stripFirehoseHeader(in *pbeth.BlockHeader) { + in.Coinbase = nil + in.Timestamp = nil + in.TxDependency = nil + in.UncleHash = nil + in.WithdrawalsRoot = nil + + if in.BaseFeePerGas == nil { + in.BaseFeePerGas = &pbeth.BigInt{} + } + + if len(in.Difficulty.Bytes) == 1 && in.Difficulty.Bytes[0] == 0x0 { + in.Difficulty.Bytes = nil + } +} + +func stripFirehoseBlock(in *pbeth.Block, hashesWithoutTo map[string]bool) { + // clean up internal values + msg := in.ProtoReflect() + msg.SetUnknown(nil) + in = msg.Interface().(*pbeth.Block) + + in.Ver = 0 + stripFirehoseHeader(in.Header) + stripFirehoseUncles(in.Uncles) + stripFirehoseTransactionTraces(in.TransactionTraces, hashesWithoutTo) + + // ARB-ONE FIX + if in.Header.TotalDifficulty.Uint64() == 2 { + in.Header.TotalDifficulty = pbeth.NewBigInt(int64(in.Number) - 22207816) + } + + // FIXME temp + in.BalanceChanges = nil + in.CodeChanges = nil +} + +func stripFirehoseTransactionTraces(in []*pbeth.TransactionTrace, hashesWithoutTo map[string]bool) { + idx := uint32(0) + for _, trace := range in { + + if hashesWithoutTo[eth.Hash(trace.Hash).String()] { + trace.To = nil // FIXME: we could compute this from nonce+address + } + + trace.BeginOrdinal = 0 + trace.EndOrdinal = 0 + trace.AccessList = nil + + trace.GasUsed = 0 // FIXME receipt? + + if trace.GasPrice == nil { + trace.GasPrice = &pbeth.BigInt{} + } + + // FIXME ... + trace.R = nil + trace.S = nil + + trace.Type = 0 + trace.AccessList = nil + trace.MaxFeePerGas = nil + trace.MaxPriorityFeePerGas = nil + + trace.ReturnData = nil + trace.PublicKey = nil + + trace.Status = 0 + stripFirehoseTrxReceipt(trace.Receipt) + trace.Calls = nil + + if trace.Value == nil { + trace.Value = &pbeth.BigInt{} + } + idx++ + } +} + +func stripFirehoseTrxReceipt(in *pbeth.TransactionReceipt) { + for _, log := range in.Logs { + log.Ordinal = 0 + log.Index = 0 // index inside transaction is a pbeth construct, it doesn't exist in RPC interface and we can't reconstruct exactly the same from RPC because the pbeth ones are increased even when a call is reverted. + } + in.LogsBloom = nil + in.StateRoot = nil + in.CumulativeGasUsed = 0 +} + +func CompareFirehoseToRPC(fhBlock *pbeth.Block, rpcBlock *rpc.Block, logs []*rpc.LogEntry) (isEqual bool, differences []string) { + if fhBlock == nil && rpcBlock == nil { + return true, nil + } + + rpcAsPBEth, hashesWithoutTo := toFirehoseBlock(rpcBlock, logs) + stripFirehoseBlock(fhBlock, hashesWithoutTo) + + if !proto.Equal(fhBlock, rpcAsPBEth) { + fh, err := rpc.MarshalJSONRPCIndent(fhBlock, "", " ") + cli.NoError(err, "cannot marshal Firehose block to JSON") + rpc, err := rpc.MarshalJSONRPCIndent(rpcAsPBEth, "", " ") + cli.NoError(err, "cannot marshal RPC block to JSON") + f, err := jd.ReadJsonString(string(fh)) + cli.NoError(err, "cannot read Firehose block JSON") + r, err := jd.ReadJsonString(string(rpc)) + cli.NoError(err, "cannot read RPC block JSON") + // fmt.Println(string(fh)) + // fmt.Println("RPC") + // fmt.Println(string(rpc)) + + if diff := r.Diff(f).Render(); diff != "" { + differences = append(differences, diff) + } + return false, differences + } + return true, nil +} + +func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { + block := &pbeth.Block{} + if err := anypb.UnmarshalTo(in, block, proto.UnmarshalOptions{}); err != nil { + return nil, fmt.Errorf("unmarshal anypb: %w", err) + } + + // We are downloading only final blocks from the Firehose connection which means the LIB for them + // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like + // `LIBNum == self.BlockNum`). + return types.BlockFromProto(block, block.Number-1) +} diff --git a/cmd/fireeth/tools_compare_oneblock_rpc.go b/cmd/fireeth/tools_compare_oneblock_rpc.go new file mode 100644 index 00000000..3518c918 --- /dev/null +++ b/cmd/fireeth/tools_compare_oneblock_rpc.go @@ -0,0 +1,102 @@ +// Copyright 2021 dfuse Platform Inc. +// +// 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 main + +import ( + "fmt" + "os" + + "github.com/DataDog/zstd" + "github.com/spf13/cobra" + "github.com/streamingfast/bstream" + "github.com/streamingfast/cli" + "github.com/streamingfast/eth-go/rpc" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" +) + +var compareOneblockRPCCmd = &cobra.Command{ + Use: "compare-oneblock-rpc ", + Short: "Checks for any differences between a firehose one-block and the same block from RPC endpoint (get_block).", + Long: cli.Dedent(` + The 'compare-oneblock-rpc' takes in a local path, an RPC endpoint URL and compares a single block at a time. + `), + Args: cobra.ExactArgs(2), + RunE: compareOneblockRPCE, + Example: ExamplePrefixed("fireeth tools compare-oneblock-rpc", ` + /path/to/oneblocks/0046904064-0061a308bf12bc2e-5b6ef5eed4e06d5b-46903864-default.dbin.zst http://localhost:8545 + `), +} + +func compareOneblockRPCE(cmd *cobra.Command, args []string) error { + + ctx := cmd.Context() + filepath := args[0] + rpcEndpoint := args[1] + + fhBlock, err := getOneBlock(filepath) + if err != nil { + return err + } + + cli := rpc.NewClient(rpcEndpoint) + + rpcBlock, err := cli.GetBlockByNumber(ctx, rpc.BlockNumber(fhBlock.Number), rpc.WithGetBlockFullTransaction()) + if err != nil { + return err + } + + logs, err := cli.Logs(ctx, rpc.LogsParams{ + FromBlock: rpc.BlockNumber(fhBlock.Number), + ToBlock: rpc.BlockNumber(fhBlock.Number), + }) + if err != nil { + return err + } + + identical, diffs := CompareFirehoseToRPC(fhBlock, rpcBlock, logs) + if !identical { + fmt.Println("different", diffs) + } else { + fmt.Println(fhBlock.Number, "identical") + } + return nil +} + +func getOneBlock(path string) (*pbeth.Block, error) { + // Check if it's a file and if it exists + if !cli.FileExists(path) { + return nil, os.ErrNotExist + } + + file, err := os.Open(path) + if err != nil { + return nil, err + } + + uncompressedReader := zstd.NewReader(file) + defer uncompressedReader.Close() + + readerFactory, err := bstream.GetBlockReaderFactory.New(uncompressedReader) + if err != nil { + return nil, fmt.Errorf("new block reader: %w", err) + } + + block, err := readerFactory.Read() + if err != nil { + return nil, fmt.Errorf("reading block: %w", err) + } + + return block.ToProtocol().(*pbeth.Block), nil +} diff --git a/cmd/fireeth/tools_fix_polygon_index.go b/cmd/fireeth/tools_fix_polygon_index.go new file mode 100644 index 00000000..ab45ced7 --- /dev/null +++ b/cmd/fireeth/tools_fix_polygon_index.go @@ -0,0 +1,165 @@ +package main + +import ( + "context" + "fmt" + "io" + "strconv" + + "github.com/spf13/cobra" + "github.com/streamingfast/bstream" + "github.com/streamingfast/dstore" + firecore "github.com/streamingfast/firehose-core" + "github.com/streamingfast/firehose-ethereum/types" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "go.uber.org/zap" +) + +func newFixPolygonIndexCmd(logger *zap.Logger) *cobra.Command { + return &cobra.Command{ + Use: "fix-polygon-index ", + Short: "look for blocks containing a single transaction with index==1 (where it should be index==0) and rewrite the affected 100-block-files to dest. it does not rewrite correct merged-files-bundles", + Args: cobra.ExactArgs(4), + RunE: createFixPolygonIndexE(logger), + } +} + +func createFixPolygonIndexE(logger *zap.Logger) firecore.CommandExecutor { + return func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + srcStore, err := dstore.NewDBinStore(args[0]) + if err != nil { + return fmt.Errorf("unable to create source store: %w", err) + } + + destStore, err := dstore.NewDBinStore(args[1]) + if err != nil { + return fmt.Errorf("unable to create destination store: %w", err) + } + + start := mustParseUint64(args[2]) + stop := mustParseUint64(args[3]) + + if stop <= start { + return fmt.Errorf("stop block must be greater than start block") + } + + startWalkFrom := fmt.Sprintf("%010d", start-(start%100)) + err = srcStore.WalkFrom(ctx, "", startWalkFrom, func(filename string) error { + logger.Debug("checking merged block file", zap.String("filename", filename)) + + startBlock := mustParseUint64(filename) + + if startBlock > stop { + logger.Debug("skipping merged block file", zap.String("reason", "past stop block"), zap.String("filename", filename)) + return io.EOF + } + + if startBlock+100 < start { + logger.Debug("skipping merged block file", zap.String("reason", "before start block"), zap.String("filename", filename)) + return nil + } + + rc, err := srcStore.OpenObject(ctx, filename) + if err != nil { + return fmt.Errorf("failed to open %s: %w", filename, err) + } + defer rc.Close() + + br, err := bstream.GetBlockReaderFactory.New(rc) + if err != nil { + return fmt.Errorf("creating block reader: %w", err) + } + + var mustWrite bool + blocks := make([]*bstream.Block, 100) + i := 0 + for { + block, err := br.Read() + if err == io.EOF { + break + } + + ethBlock := block.ToProtocol().(*pbeth.Block) + if len(ethBlock.TransactionTraces) == 1 && + ethBlock.TransactionTraces[0].Index == 1 { + fmt.Println("ERROR FOUND AT BLOCK", block.Number) + mustWrite = true + ethBlock.TransactionTraces[0].Index = 0 + block, err = types.BlockFromProto(ethBlock, block.LibNum) + if err != nil { + return fmt.Errorf("re-packing the block: %w", err) + } + } + blocks[i] = block + i++ + } + if i != 100 { + return fmt.Errorf("expected to have read 100 blocks, we have read %d. Bailing out.", i) + } + if mustWrite { + if err := writeMergedBlocks(startBlock, destStore, blocks); err != nil { + return fmt.Errorf("writing merged block %d: %w", startBlock, err) + } + } + + return nil + }) + + if err == io.EOF { + return nil + } + + if err != nil { + return err + } + + return nil + } +} + +func writeMergedBlocks(lowBlockNum uint64, store dstore.Store, blocks []*bstream.Block) error { + file := filename(lowBlockNum) + fmt.Printf("writing merged file %s.dbin.zst\n", file) + + if len(blocks) == 0 { + return fmt.Errorf("no blocks to write to bundle") + } + + pr, pw := io.Pipe() + + go func() { + var err error + defer func() { + pw.CloseWithError(err) + }() + + blockWriter, err := bstream.GetBlockWriterFactory.New(pw) + if err != nil { + return + } + + for _, blk := range blocks { + err = blockWriter.Write(blk) + if err != nil { + return + } + } + }() + + return store.WriteObject(context.Background(), file, pr) +} + +func filename(num uint64) string { + return fmt.Sprintf("%010d", num) +} + +func mustParseUint64(in string) uint64 { + out, err := strconv.ParseUint(in, 0, 64) + if err != nil { + panic(fmt.Errorf("unable to parse %q as uint64: %w", in, err)) + } + + return out +} diff --git a/cmd/fireeth/tools_poll_rpc_blocks.go b/cmd/fireeth/tools_poll_rpc_blocks.go new file mode 100644 index 00000000..9a98caac --- /dev/null +++ b/cmd/fireeth/tools_poll_rpc_blocks.go @@ -0,0 +1,101 @@ +package main + +import ( + "encoding/base64" + "encoding/hex" + "fmt" + "strconv" + "time" + + "github.com/spf13/cobra" + "github.com/streamingfast/eth-go/rpc" + firecore "github.com/streamingfast/firehose-core" + "go.uber.org/zap" + "google.golang.org/protobuf/proto" +) + +func newPollRPCBlocksCmd(logger *zap.Logger) *cobra.Command { + return &cobra.Command{ + Use: "poll-rpc-blocks ", + Short: "Generate 'light' firehose blocks from an RPC endpoint", + Args: cobra.ExactArgs(2), + RunE: createPollRPCBlocksE(logger), + } +} + +var pollDelay = time.Millisecond * 100 + +var lastDelayWarning time.Time + +func createPollRPCBlocksE(logger *zap.Logger) firecore.CommandExecutor { + delay := func(err error) { + if err != nil { + logger.Warn("retrying...", zap.Error(err)) + } + time.Sleep(pollDelay) + } + + return func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + + rpcEndpoint := args[0] + startBlockNumStr := args[1] + + logger.Info("retrieving from rpc endpoint", + zap.String("start_block_num", startBlockNumStr), + zap.String("rpc_endpoint", rpcEndpoint), + ) + startBlockNum, err := strconv.ParseUint(startBlockNumStr, 10, 64) + if err != nil { + return fmt.Errorf("unable to parse start block number %s: %w", startBlockNumStr, err) + } + client := rpc.NewClient(rpcEndpoint) + + fmt.Println("FIRE INIT 2.3 local v1.0.0") + + blockNum := startBlockNum + for { + latest, err := client.LatestBlockNum(ctx) + if err != nil { + delay(err) + continue + } + + if latest < blockNum { + delay(nil) + continue + } + rpcBlock, err := client.GetBlockByNumber(ctx, rpc.BlockNumber(blockNum), rpc.WithGetBlockFullTransaction()) + if err != nil { + delay(err) + continue + } + + logs, err := client.Logs(ctx, rpc.LogsParams{ + FromBlock: rpc.BlockNumber(blockNum), + ToBlock: rpc.BlockNumber(blockNum), + }) + if err != nil { + delay(err) + continue + } + + block, _ := toFirehoseBlock(rpcBlock, logs) + cnt, err := proto.Marshal(block) + if err != nil { + return fmt.Errorf("failed to proto marshal pb sol block: %w", err) + } + + libNum := uint64(0) + if blockNum != 0 { + libNum = blockNum - 1 + } + b64Cnt := base64.StdEncoding.EncodeToString(cnt) + lineCnt := fmt.Sprintf("FIRE BLOCK %d %s %d %s %s", blockNum, hex.EncodeToString(block.Hash), libNum, hex.EncodeToString(block.Header.ParentHash), b64Cnt) + if _, err := fmt.Println(lineCnt); err != nil { + return fmt.Errorf("failed to write log line (char lenght %d): %w", len(lineCnt), err) + } + blockNum++ + } + } +} diff --git a/go.mod b/go.mod index c2569bbe..ee0e6dcc 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,19 @@ module github.com/streamingfast/firehose-ethereum go 1.21 require ( + github.com/DataDog/zstd v1.5.5 github.com/RoaringBitmap/roaring v0.9.4 github.com/ShinyTrinkets/overseer v0.3.0 github.com/golang/protobuf v1.5.3 github.com/holiman/uint256 v1.2.0 github.com/josephburnett/jd v1.7.1 - github.com/klauspost/compress v1.16.5 github.com/lithammer/dedent v1.1.0 github.com/logrusorgru/aurora v2.0.3+incompatible github.com/manifoldco/promptui v0.9.0 github.com/mitchellh/go-testing-interface v1.14.1 github.com/mostynb/go-grpc-compression v1.1.17 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.7.0 + github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.15.0 github.com/streamingfast/bstream v0.0.2-0.20230829131224-b9272048dc6a github.com/streamingfast/cli v0.0.4-0.20230825151644-8cc84512cd80 @@ -39,7 +40,6 @@ require ( github.com/streamingfast/sf-tools v0.0.0-20230811131237-97a5d4afa459 github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9 github.com/streamingfast/shutter v1.5.0 - github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 github.com/streamingfast/substreams v1.1.20 github.com/stretchr/testify v1.8.4 github.com/test-go/testify v1.1.4 @@ -76,7 +76,7 @@ require ( github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.3.1 // indirect - github.com/blendle/zapdriver v1.3.1 // indirect + github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d // indirect github.com/bobg/go-generics/v2 v2.1.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/bufbuild/connect-go v1.10.0 // indirect @@ -130,6 +130,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/klauspost/cpuid/v2 v2.2.3 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect @@ -172,7 +173,6 @@ require ( github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 // indirect github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad // indirect github.com/streamingfast/dtracing v0.0.0-20220305214756-b5c0e8699839 // indirect diff --git a/go.sum b/go.sum index fb2c7845..fafceff0 100644 --- a/go.sum +++ b/go.sum @@ -112,6 +112,8 @@ github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUM github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.3 h1:fiyErF/p5fz79DvMCca9ayvYiWYsFP1oJbskt9fjo8I= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.3/go.mod h1:s7Gpwj0tk7XnVCm4BQEmx/mbS36SuTCY/vMB2SNxe8o= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.6/go.mod h1:NE8dAwJ1VU4WFdJYTlO0tdobQFdy70z8wNDU1L3VAr4= @@ -172,8 +174,9 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY github.com/bits-and-blooms/bitset v1.3.1 h1:y+qrlmq3XsWi+xZqSaueaE8ry8Y127iMxlMfqcK8p0g= github.com/bits-and-blooms/bitset v1.3.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d h1:fSlGu5ePbkjBidXuj2O5j9EcYrVB5Cr6/wdkYyDgxZk= +github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d/go.mod h1:yCBkgASmKHgUOFjK9h1sOytUVgA+JkQjqj3xYP4AdWY= github.com/bobg/go-generics/v2 v2.1.1 h1:4rN9upY6Xm4TASSMeH+NzUghgO4h/SbNrQphIjRd/R0= github.com/bobg/go-generics/v2 v2.1.1/go.mod h1:iPMSRVFlzkJSYOCXQ0n92RA3Vxw0RBv2E8j9ZODXgHk= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= @@ -478,7 +481,6 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs= @@ -574,8 +576,8 @@ github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqf github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= -github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -741,8 +743,8 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU 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.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +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= @@ -830,8 +832,6 @@ github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 h1:Y15G1 github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0/go.mod h1:/Rnz2TJvaShjUct0scZ9kKV2Jr9/+KBAoWy4UMYxgv4= github.com/streamingfast/substreams v1.1.20 h1:61k/HKti9xo7vDAu5zew/VL8qzY+ye/9Zzt1om+tVks= github.com/streamingfast/substreams v1.1.20/go.mod h1:Ak7a+EM8MRehep0ZaQD1NwG27ZE9auZY9+/VLbhBnDU= -github.com/streamingfast/substreams v1.1.12-0.20230825185616-0ba49a2ee9ee h1:Q78BDGVmulzXgPoovmhLCUcxc98RFxYhifoukQflWHk= -github.com/streamingfast/substreams v1.1.12-0.20230825185616-0ba49a2ee9ee/go.mod h1:Thcw2blrOD8uwRMGKhjD4BXwy1Fp9UADxIRHRme+raQ= 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= diff --git a/tools/blocks.go b/tools/blocks.go deleted file mode 100644 index a81b6747..00000000 --- a/tools/blocks.go +++ /dev/null @@ -1,431 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "context" - "errors" - "fmt" - "io" - "os" - "regexp" - "strconv" - - "github.com/klauspost/compress/zstd" - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/cli" - "github.com/streamingfast/dstore" - "github.com/streamingfast/eth-go" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - "github.com/streamingfast/jsonpb" - "go.uber.org/zap" -) - -var printCmd = &cobra.Command{ - Use: "print", - Short: "Prints of one block or merged blocks file", -} - -var oneBlockCmd = &cobra.Command{ - Use: "one-block ", - Short: "Prints a block from a one-block file", - Args: cobra.ExactArgs(1), - RunE: printOneBlockE, -} - -var blocksCmd = &cobra.Command{ - Use: "blocks ", - Short: "Prints the content summary of a merged block file", - Args: cobra.ExactArgs(1), - RunE: printBlocksE, -} - -var blockCmd = &cobra.Command{ - Use: "block ", - Short: "Finds and prints one block from a merged block file", - Args: cobra.ExactArgs(1), - RunE: printBlockE, -} - -func init() { - Cmd.AddCommand(printCmd) - - printCmd.AddCommand(oneBlockCmd) - - printCmd.AddCommand(blocksCmd) - blocksCmd.PersistentFlags().Bool("transactions", false, "Include transaction IDs in output") - - printCmd.AddCommand(blockCmd) - blockCmd.Flags().String("transaction", "", "Filters transaction by this hash") - - printCmd.PersistentFlags().Uint64("transactions-for-block", 0, "Include transaction IDs in output") - printCmd.PersistentFlags().Bool("transactions", false, "Include transaction IDs in output") - printCmd.PersistentFlags().Bool("calls", false, "Include transaction's Call data in output") - printCmd.PersistentFlags().Bool("full", false, "print the fullblock instead of just header/ID") - printCmd.PersistentFlags().String("store", "", "block store") -} - -var integerRegex = regexp.MustCompile("^[0-9]+$") - -func printBlocksE(cmd *cobra.Command, args []string) error { - var identifier string - var reader io.Reader - var closer func() error - - if integerRegex.MatchString(args[0]) { - blockNum, err := strconv.ParseUint(args[0], 10, 64) - if err != nil { - return fmt.Errorf("unable to parse block number %q: %w", args[0], err) - } - - str := mustGetString(cmd, "store") - - store, err := dstore.NewDBinStore(str) - if err != nil { - return fmt.Errorf("unable to create store at path %q: %w", store, err) - } - - identifier = fmt.Sprintf("%010d", blockNum) - gsReader, err := store.OpenObject(context.Background(), identifier) - if err != nil { - fmt.Printf("❌ Unable to read blocks filename %q: %s\n", identifier, err) - return err - } - - reader = gsReader - closer = gsReader.Close - } else { - identifier = args[0] - - // Check if it's a file and if it exists - if !cli.FileExists(identifier) { - fmt.Printf("❌ File %q does not exist\n", identifier) - return os.ErrNotExist - } - - file, err := os.Open(identifier) - if err != nil { - fmt.Printf("❌ Unable to read blocks filename %q: %s\n", identifier, err) - return err - } - reader = file - closer = file.Close - } - - defer closer() - - return printBlocks(identifier, reader, mustGetBool(cmd, "transactions")) -} - -func printBlocks(inputIdentifier string, reader io.Reader, printTransactions bool) error { - readerFactory, err := bstream.GetBlockReaderFactory.New(reader) - if err != nil { - fmt.Printf("❌ Unable to read blocks %s: %s\n", inputIdentifier, err) - return err - } - - seenBlockCount := 0 - for { - block, err := readerFactory.Read() - if err != nil { - if err == io.EOF { - fmt.Printf("Total blocks: %d\n", seenBlockCount) - return nil - } - return fmt.Errorf("error receiving blocks: %w", err) - } - - seenBlockCount++ - - //payloadSize, err := len(block.Payload.Get()) //disabled after rework - ethBlock := block.ToProtocol().(*pbeth.Block) - - fmt.Printf("Block #%d (%s) (prev: %s, lib: %d): %d transactions, %d balance changes\n", - block.Num(), - block.ID()[0:7], - block.PreviousID()[0:7], - block.LibNum, - len(ethBlock.TransactionTraces), - len(ethBlock.BalanceChanges), - ) - if printTransactions { - fmt.Println("- Transactions: ") - for _, t := range ethBlock.TransactionTraces { - fmt.Println(" * ", t.Hash) - } - fmt.Println() - } - } -} - -func printBlockE(cmd *cobra.Command, args []string) error { - printTransactions := mustGetBool(cmd, "transactions") - printCall := mustGetBool(cmd, "calls") - printFull := mustGetBool(cmd, "full") - transactionFilter := mustGetString(cmd, "transaction") - - zlog.Info("printing block", - zap.Bool("print_transactions", printTransactions), - zap.String("transaction_filter", transactionFilter), - ) - - blockNum, err := strconv.ParseUint(args[0], 10, 64) - if err != nil { - return fmt.Errorf("unable to parse block number %q: %w", args[0], err) - } - - str := mustGetString(cmd, "store") - - store, err := dstore.NewDBinStore(str) - if err != nil { - return fmt.Errorf("unable to create store at path %q: %w", store, err) - } - - mergedBlockNum := blockNum - (blockNum % 100) - zlog.Info("finding merged block file", - zap.Uint64("merged_block_num", mergedBlockNum), - zap.Uint64("block_num", blockNum), - ) - - filename := fmt.Sprintf("%010d", mergedBlockNum) - reader, err := store.OpenObject(context.Background(), filename) - if err != nil { - fmt.Printf("❌ Unable to read blocks filename %s: %s\n", filename, err) - return err - } - defer reader.Close() - - readerFactory, err := bstream.GetBlockReaderFactory.New(reader) - if err != nil { - fmt.Printf("❌ Unable to read blocks filename %s: %s\n", filename, err) - return err - } - - for { - block, err := readerFactory.Read() - if err != nil { - if err == io.EOF { - return nil - } - return fmt.Errorf("error reading blocks: %w", err) - } - - if block.Number != blockNum { - zlog.Debug("skipping block", - zap.Uint64("desired_block_num", blockNum), - zap.Uint64("block_num", block.Number), - ) - continue - } - ethBlock := block.ToProtocol().(*pbeth.Block) - - if printFull { - jsonPayload, _ := jsonpb.MarshalIndentToString(ethBlock, " ") - fmt.Println(jsonPayload) - continue - } - - fmt.Printf("Block #%d (%s) (prev: %s, lib: %d): %d transactions, %d balance changes\n", - block.Num(), - block.ID()[0:7], - block.PreviousID()[0:7], - block.LibNum, - len(ethBlock.TransactionTraces), - len(ethBlock.BalanceChanges), - ) - if printTransactions { - fmt.Println("- Transactions: ") - for _, t := range ethBlock.TransactionTraces { - hash := eth.Hash(t.Hash) - if transactionFilter != "" { - if transactionFilter != hash.String() && transactionFilter != hash.Pretty() { - continue - } - } - printTrx(t, printCall) - } - - } - - continue - } -} - -func getOneBlock(path string) (*pbeth.Block, error) { - - // Check if it's a file and if it exists - if !cli.FileExists(path) { - return nil, os.ErrNotExist - } - - file, err := os.Open(path) - if err != nil { - return nil, err - } - - uncompressedReader, err := zstd.NewReader(file) - if err != nil { - return nil, fmt.Errorf("new zstd reader: %w", err) - } - defer uncompressedReader.Close() - - readerFactory, err := bstream.GetBlockReaderFactory.New(uncompressedReader) - if err != nil { - return nil, fmt.Errorf("new block reader: %w", err) - } - - block, err := readerFactory.Read() - if err != nil { - return nil, fmt.Errorf("reading block: %w", err) - } - - return block.ToProtocol().(*pbeth.Block), nil - -} - -func printOneBlockE(cmd *cobra.Command, args []string) error { - if integerRegex.MatchString(args[0]) { - blockNum, err := strconv.ParseUint(args[0], 10, 64) - if err != nil { - return fmt.Errorf("unable to parse block number %q: %w", args[0], err) - } - - return printOneBlockFromStore(cmd.Context(), blockNum, mustGetString(cmd, "store"), mustGetBool(cmd, "transactions")) - } - - path := args[0] - - // Check if it's a file and if it exists - if !cli.FileExists(path) { - fmt.Printf("❌ File %q does not exist\n", path) - return os.ErrNotExist - } - - file, err := os.Open(path) - if err != nil { - fmt.Printf("❌ Unable to open file %q: %s\n", path, err) - return err - } - - uncompressedReader, err := zstd.NewReader(file) - if err != nil { - return fmt.Errorf("new zstd reader: %w", err) - } - defer uncompressedReader.Close() - - if err := printBlockFromReader(path, uncompressedReader); err != nil { - if errors.Is(err, io.EOF) { - fmt.Printf("❌ One block file is empty %q: %s\n", path, err) - return err - } - - fmt.Printf("❌ Unable to print one-block file %s: %s\n", path, err) - return err - } - - return nil -} - -func printOneBlockFromStore(ctx context.Context, blockNum uint64, storeDSN string, printTransactions bool) error { - store, err := dstore.NewDBinStore(storeDSN) - if err != nil { - return fmt.Errorf("unable to create store at path %q: %w", store, err) - } - - var files []string - filePrefix := fmt.Sprintf("%010d", blockNum) - err = store.Walk(ctx, filePrefix, func(filename string) (err error) { - files = append(files, filename) - return nil - }) - if err != nil { - return fmt.Errorf("unable to find on block files: %w", err) - } - - for _, filepath := range files { - reader, err := store.OpenObject(ctx, filepath) - if err != nil { - fmt.Printf("❌ Unable to open one-block file %s: %s\n", filepath, err) - return err - } - defer reader.Close() - - if err := printBlockFromReader(filepath, reader); err != nil { - if errors.Is(err, io.EOF) { - break - } - - return err - } - } - return nil -} - -func printBlockFromReader(identifier string, reader io.Reader) error { - readerFactory, err := bstream.GetBlockReaderFactory.New(reader) - if err != nil { - return fmt.Errorf("new block reader: %w", err) - } - - block, err := readerFactory.Read() - if err != nil { - return fmt.Errorf("reading block: %w", err) - } - - return printBlock(block) -} - -func printBlock(block *bstream.Block) error { - nativeBlock := block.ToProtocol().(*pbeth.Block) - - data, err := jsonpb.MarshalIndentToString(nativeBlock, " ") - if err != nil { - return fmt.Errorf("json marshall: %w", err) - } - - fmt.Println(string(data)) - - return nil -} - -func printTrx(trx *pbeth.TransactionTrace, withCall bool) { - hash := eth.Hash(trx.Hash) - - fmt.Printf(" * %s\n", hash.Pretty()) - if withCall { - for _, call := range trx.Calls { - - str := "" - //if len(call.Input) > 8 { - // str = hex.EncodeToString(call.Input[0:8]) - //} else { - // str = hex.EncodeToString(call.Input) - //} - - fmt.Printf(" -> Call: %d , input: %s (parent: %d, depth: %d, Statusfailed: %v, StatusReverted: %v, FailureReason: %s, StateReverted: %v)\n", - call.Index, - str, - call.ParentIndex, - call.Depth, - call.StatusFailed, - call.StatusReverted, - call.FailureReason, - call.StateReverted, - ) - } - } - -} diff --git a/tools/check.go b/tools/check.go deleted file mode 100644 index d2f7ab3c..00000000 --- a/tools/check.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - sftools "github.com/streamingfast/sf-tools" -) - -// CmdCheck is used in sf-ethereum-priv where additional checks are added. -var CheckCmd = &cobra.Command{Use: "check", Short: "Various checks for deployment, data integrity & debugging"} - -var checkMergedBlocksCmd = &cobra.Command{ - // TODO: Not sure, it's now a required thing, but we could probably use the same logic as `start` - // and avoid altogether passing the args. If this would also load the config and everything else, - // that would be much more seamless! - Use: "merged-blocks ", - Short: "Checks for any holes in merged blocks as well as ensuring merged blocks integrity", - Args: cobra.ExactArgs(1), - RunE: checkMergedBlocksE, - Example: ExamplePrefixed("fireeth tools check merged-blocks", ` - "./sf-data/storage/merged-blocks" - "gs://// -s" - "s3://// -f" - "az://// -r \"10 000 - 1 000 000" - `), -} - -func init() { - Cmd.AddCommand(CheckCmd) - CheckCmd.AddCommand(checkMergedBlocksCmd) - - CheckCmd.PersistentFlags().StringP("range", "r", "", "Block range to use for the check") - - checkMergedBlocksCmd.Flags().BoolP("print-stats", "s", false, "Natively decode each block in the segment and print statistics about it, ensuring it contains the required blocks") - checkMergedBlocksCmd.Flags().BoolP("print-full", "f", false, "Natively decode each block and print the full JSON representation of the block, should be used with a small range only if you don't want to be overwhelmed") -} - -func checkMergedBlocksE(cmd *cobra.Command, args []string) error { - storeURL := args[0] - fileBlockSize := uint32(100) - - blockRange, err := sftools.Flags.GetBlockRange("range") - if err != nil { - return err - } - - printDetails := sftools.PrintNoDetails - if mustGetBool(cmd, "print-stats") { - printDetails = sftools.PrintStats - } - - if mustGetBool(cmd, "print-full") { - printDetails = sftools.PrintFull - } - - return sftools.CheckMergedBlocks(cmd.Context(), zlog, storeURL, fileBlockSize, blockRange, blockPrinter, printDetails) -} - -func blockPrinter(block *bstream.Block) { - ethBlock := block.ToProtocol().(*pbeth.Block) - - callCount := 0 - for _, trxTrace := range ethBlock.TransactionTraces { - callCount += len(trxTrace.Calls) - } - - fmt.Printf("Block %s %d transactions, %d calls\n", - block, - len(ethBlock.TransactionTraces), - callCount, - ) -} diff --git a/tools/compare-rpc-oneblock.go b/tools/compare-rpc-oneblock.go index 1590acd1..a86f6726 100644 --- a/tools/compare-rpc-oneblock.go +++ b/tools/compare-rpc-oneblock.go @@ -16,10 +16,14 @@ package tools import ( "fmt" + "os" + "github.com/DataDog/zstd" "github.com/spf13/cobra" + "github.com/streamingfast/bstream" "github.com/streamingfast/cli" "github.com/streamingfast/eth-go/rpc" + pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" ) var compareOneblockRPCCmd = &cobra.Command{ @@ -73,3 +77,30 @@ func compareOneblockRPCE(cmd *cobra.Command, args []string) error { } return nil } + +func getOneBlock(path string) (*pbeth.Block, error) { + // Check if it's a file and if it exists + if !cli.FileExists(path) { + return nil, os.ErrNotExist + } + + file, err := os.Open(path) + if err != nil { + return nil, err + } + + uncompressedReader := zstd.NewReader(file) + defer uncompressedReader.Close() + + readerFactory, err := bstream.GetBlockReaderFactory.New(uncompressedReader) + if err != nil { + return nil, fmt.Errorf("new block reader: %w", err) + } + + block, err := readerFactory.Read() + if err != nil { + return nil, fmt.Errorf("reading block: %w", err) + } + + return block.ToProtocol().(*pbeth.Block), nil +} diff --git a/tools/compare-rpc.go b/tools/compare-rpc.go index 70d9a06b..5dc56edd 100644 --- a/tools/compare-rpc.go +++ b/tools/compare-rpc.go @@ -26,15 +26,18 @@ import ( jd "github.com/josephburnett/jd/lib" "github.com/mostynb/go-grpc-compression/zstd" "github.com/spf13/cobra" + "github.com/streamingfast/bstream" "github.com/streamingfast/cli" "github.com/streamingfast/eth-go" "github.com/streamingfast/eth-go/rpc" + "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/firehose/client" pbfirehose "github.com/streamingfast/pbgo/sf/firehose/v2" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) @@ -420,3 +423,15 @@ func CompareFirehoseToRPC(fhBlock *pbeth.Block, rpcBlock *rpc.Block, logs []*rpc } return true, nil } + +func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { + block := &pbeth.Block{} + if err := anypb.UnmarshalTo(in, block, proto.UnmarshalOptions{}); err != nil { + return nil, fmt.Errorf("unmarshal anypb: %w", err) + } + + // We are downloading only final blocks from the Firehose connection which means the LIB for them + // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like + // `LIBNum == self.BlockNum`). + return types.BlockFromProto(block, block.Number-1) +} diff --git a/tools/firehose-client.go b/tools/firehose-client.go deleted file mode 100644 index 1cd2dad4..00000000 --- a/tools/firehose-client.go +++ /dev/null @@ -1,164 +0,0 @@ -package tools - -import ( - "fmt" - "strings" - - "github.com/spf13/cobra" - "github.com/streamingfast/eth-go" - pbtransform "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/transform/v1" - sftools "github.com/streamingfast/sf-tools" - "google.golang.org/protobuf/types/known/anypb" -) - -func init() { - firehoseClientCmd := sftools.GetFirehoseClientCmd(zlog, tracer, transformsSetter) - firehoseClientCmd.Flags().Bool("header-only", false, "Apply the HeaderOnly transform sending back Block's header only (with few top-level fields), exclusive option") - firehoseClientCmd.Flags().String("call-filters", "", "call filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") - firehoseClientCmd.Flags().String("log-filters", "", "log filters (format: '[address1[+address2[+...]]]:[eventsig1[+eventsig2[+...]]]") - firehoseClientCmd.Flags().Bool("send-all-block-headers", false, "ask for all the blocks to be sent (header-only if there is no match)") - Cmd.AddCommand(firehoseClientCmd) - - firehoseSingleBlockClientCmd := sftools.GetFirehoseSingleBlockClientCmd(zlog, tracer) - Cmd.AddCommand(firehoseSingleBlockClientCmd) -} - -var transformsSetter = func(cmd *cobra.Command) (transforms []*anypb.Any, err error) { - filters, err := parseFilters(mustGetString(cmd, "call-filters"), mustGetString(cmd, "log-filters"), mustGetBool(cmd, "send-all-block-headers")) - if err != nil { - return nil, err - } - - headerOnly := mustGetBool(cmd, "header-only") - if filters != nil && headerOnly { - return nil, fmt.Errorf("'header-only' flag is exclusive with 'call-filters', 'log-filters' and 'send-all-block-headers' choose either 'header-only' or a combination of the others") - } - - if headerOnly { - t, err := anypb.New(&pbtransform.HeaderOnly{}) - if err != nil { - return nil, err - } - - return []*anypb.Any{t}, nil - } - - if filters != nil { - t, err := anypb.New(filters) - if err != nil { - return nil, err - } - - return []*anypb.Any{t}, nil - } - - return -} - -func parseFilters(callFilters, logFilters string, sendAllBlockHeaders bool) (*pbtransform.CombinedFilter, error) { - mf := &pbtransform.CombinedFilter{} - - if callFilters == "" && logFilters == "" && !sendAllBlockHeaders { - return nil, nil - } - if callFilters != "" { - for _, filter := range strings.Split(callFilters, ",") { - if filter == "" { - continue - } - parts := strings.Split(filter, ":") - if len(parts) != 2 { - return nil, fmt.Errorf("option --call-filters must be of type address_hash+address_hash+address_hash:event_sig_hash+event_sig_hash (repeated, separated by comma)") - } - var addrs []eth.Address - for _, a := range strings.Split(parts[0], "+") { - if a != "" { - addr := eth.MustNewAddressLoose(a) - addrs = append(addrs, addr) - } - } - var sigs []eth.Hash - for _, s := range strings.Split(parts[1], "+") { - if s != "" { - sig := eth.MustNewHash(s) - sigs = append(sigs, sig) - } - } - - mf.CallFilters = append(mf.CallFilters, basicCallToFilter(addrs, sigs)) - } - } - - if logFilters != "" { - for _, filter := range strings.Split(logFilters, ",") { - if filter == "" { - continue - } - parts := strings.Split(filter, ":") - if len(parts) != 2 { - return nil, fmt.Errorf("option --log-filters must be of type address_hash+address_hash+address_hash:event_sig_hash+event_sig_hash (repeated, separated by comma)") - } - var addrs []eth.Address - for _, a := range strings.Split(parts[0], "+") { - if a != "" { - addr := eth.MustNewAddress(a) - addrs = append(addrs, addr) - } - } - var sigs []eth.Hash - for _, s := range strings.Split(parts[1], "+") { - if s != "" { - sig := eth.MustNewHash(s) - sigs = append(sigs, sig) - } - } - - mf.LogFilters = append(mf.LogFilters, basicLogFilter(addrs, sigs)) - } - } - - if sendAllBlockHeaders { - mf.SendAllBlockHeaders = true - } - return mf, nil -} - -func basicCallToFilter(addrs []eth.Address, sigs []eth.Hash) *pbtransform.CallToFilter { - var addrBytes [][]byte - var sigsBytes [][]byte - - for _, addr := range addrs { - b := addr.Bytes() - addrBytes = append(addrBytes, b) - } - - for _, sig := range sigs { - b := sig.Bytes() - sigsBytes = append(sigsBytes, b) - } - - return &pbtransform.CallToFilter{ - Addresses: addrBytes, - Signatures: sigsBytes, - } -} - -func basicLogFilter(addrs []eth.Address, sigs []eth.Hash) *pbtransform.LogFilter { - var addrBytes [][]byte - var sigsBytes [][]byte - - for _, addr := range addrs { - b := addr.Bytes() - addrBytes = append(addrBytes, b) - } - - for _, sig := range sigs { - b := sig.Bytes() - sigsBytes = append(sigsBytes, b) - } - - return &pbtransform.LogFilter{ - Addresses: addrBytes, - EventSignatures: sigsBytes, - } -} diff --git a/tools/fix-polygon-index.go b/tools/fix-polygon-index.go index e5eb8069..8985aadd 100644 --- a/tools/fix-polygon-index.go +++ b/tools/fix-polygon-index.go @@ -4,14 +4,14 @@ import ( "context" "fmt" "io" - - "go.uber.org/zap" + "strconv" "github.com/spf13/cobra" "github.com/streamingfast/bstream" "github.com/streamingfast/dstore" "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" + "go.uber.org/zap" ) var fixPolygonIndexCmd = &cobra.Command{ @@ -120,7 +120,7 @@ func fixPolygonIndexE(cmd *cobra.Command, args []string) error { func writeMergedBlocks(lowBlockNum uint64, store dstore.Store, blocks []*bstream.Block) error { file := filename(lowBlockNum) - fmt.Printf("writing merged file %s.dbin.zst\n", file) + fmt.Printf("writing merged file %s.dbin.zst\n", file) if len(blocks) == 0 { return fmt.Errorf("no blocks to write to bundle") @@ -142,7 +142,7 @@ func writeMergedBlocks(lowBlockNum uint64, store dstore.Store, blocks []*bstream for _, blk := range blocks { err = blockWriter.Write(blk) if err != nil { - return + return } } }() @@ -153,3 +153,12 @@ func writeMergedBlocks(lowBlockNum uint64, store dstore.Store, blocks []*bstream func filename(num uint64) string { return fmt.Sprintf("%010d", num) } + +func mustParseUint64(in string) uint64 { + out, err := strconv.ParseUint(in, 0, 64) + if err != nil { + panic(fmt.Errorf("unable to parse %q as uint64: %w", in, err)) + } + + return out +} diff --git a/tools/unmerge.go b/tools/unmerge.go deleted file mode 100644 index 88579db9..00000000 --- a/tools/unmerge.go +++ /dev/null @@ -1,143 +0,0 @@ -package tools - -import ( - "fmt" - "io" - "strconv" - - "go.uber.org/zap" - - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/dstore" -) - -var unmergeBlocksCmd = &cobra.Command{ - Use: "unmerge ", - Short: "unmerges merged block files into one-block-files", - Args: cobra.ExactArgs(4), - RunE: unmergeBlocksE, -} - -func init() { - Cmd.AddCommand(unmergeBlocksCmd) -} - -func mustParseUint64(s string) uint64 { - i, err := strconv.Atoi(s) - if err != nil { - panic(err) - } - return uint64(i) -} - -func unmergeBlocksE(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - - srcStore, err := dstore.NewDBinStore(args[0]) - if err != nil { - return fmt.Errorf("unable to create source store: %w", err) - } - - destStore, err := dstore.NewDBinStore(args[1]) - if err != nil { - return fmt.Errorf("unable to create destination store: %w", err) - } - - start := mustParseUint64(args[2]) - stop := mustParseUint64(args[3]) - - if stop <= start { - return fmt.Errorf("stop block must be greater than start block") - } - - startWalkFrom := fmt.Sprintf("%010d", start-(start%100)) - err = srcStore.WalkFrom(ctx, "", startWalkFrom, func(filename string) error { - zlog.Debug("checking merged block file", zap.String("filename", filename)) - - startBlock := mustParseUint64(filename) - - if startBlock > stop { - zlog.Debug("skipping merged block file", zap.String("reason", "past stop block"), zap.String("filename", filename)) - return io.EOF - } - - if startBlock+100 < start { - zlog.Debug("skipping merged block file", zap.String("reason", "before start block"), zap.String("filename", filename)) - return nil - } - - rc, err := srcStore.OpenObject(ctx, filename) - if err != nil { - return fmt.Errorf("failed to open %s: %w", filename, err) - } - defer rc.Close() - - br, err := bstream.GetBlockReaderFactory.New(rc) - if err != nil { - return fmt.Errorf("creating block reader: %w", err) - } - - // iterate through the blocks in the file - for { - block, err := br.Read() - if err == io.EOF { - break - } - - if block.Number < start { - continue - } - - if block.Number > stop { - break - } - - oneblockFilename := bstream.BlockFileNameWithSuffix(block, "extracted") - zlog.Debug("writing block", zap.Uint64("block_num", block.Number), zap.String("filename", oneblockFilename)) - - pr, pw := io.Pipe() - - //write block data to pipe, and then close to signal end of data - go func(block *bstream.Block) { - var err error - defer func() { - pw.CloseWithError(err) - }() - - var bw bstream.BlockWriter - bw, err = bstream.GetBlockWriterFactory.New(pw) - if err != nil { - zlog.Error("creating block writer", zap.Error(err)) - return - } - - err = bw.Write(block) - if err != nil { - zlog.Error("writing block", zap.Error(err)) - return - } - }(block) - - //read block data from pipe and write block data to dest store - err = destStore.WriteObject(ctx, oneblockFilename, pr) - if err != nil { - return fmt.Errorf("writing block %d to %s: %w", block.Number, oneblockFilename, err) - } - - zlog.Info("wrote block", zap.Uint64("block_num", block.Number), zap.String("filename", oneblockFilename)) - } - - return nil - }) - - if err == io.EOF { - return nil - } - - if err != nil { - return err - } - - return nil -} From ac130a705610cc0e8c24121c562090cce8794715 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Mon, 30 Oct 2023 13:13:28 -0400 Subject: [PATCH 06/11] Updated to latest `firehose-core` and removed `firehose-ethereum/types` Go sub-module --- .github/workflows/main.yml | 2 +- CHANGELOG.md | 9 +- bin/test.sh | 46 - cmd/fireeth/cli/start.go | 1 - cmd/fireeth/main.go | 5 +- cmd/fireeth/tools.go | 3 + cmd/fireeth/tools_compare_blocks_rpc.go | 3 +- cmd/fireeth/tools_fix_polygon_index.go | 4 +- codec/init_test.go | 5 +- go.mod | 3 +- go.sum | 6 +- tools/cmd.go | 3 + tools/compare-rpc.go | 4 +- tools/fix-polygon-index.go | 4 +- transform/init_test.go | 5 + transform/testing.go | 2 - types/go.mod | 84 - types/go.sum | 1911 ----------------------- types/init.go | 13 +- types/pb/sf/ethereum/type/v2/type.go | 5 + types/testing/types.go | 4 +- 21 files changed, 53 insertions(+), 2069 deletions(-) delete mode 100755 bin/test.sh delete mode 100644 types/go.mod delete mode 100644 types/go.sum diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bd1057d0..6434e856 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -43,7 +43,7 @@ jobs: ${{ runner.os }}-go- - name: Run Tests - run: ./bin/test.sh + run: go test ./... - name: Build run: go build ./... diff --git a/CHANGELOG.md b/CHANGELOG.md index 414488d9..cb4153ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ Both at the data level and gRPC level, there is no changes in behavior to all co A lot of changes happened at the operators level however and some superflous mode have been removed, especially around the `reader-node` application. The full changes is listed below, operators should review thoroughly the changelog. > [!IMPORTANT] -> It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.19 in case of a problem is quite easy and no special data migration is required outside of changing back to the old set of flags that was used before. +> It's important to emphasis that at the data level, nothing changed, so reverting to 1.4.22 in case of a problem is quite easy and no special data migration is required outside of changing back to the old set of flags that was used before. #### Operators @@ -23,12 +23,17 @@ You will find below the detailed upgrade procedure for the configuration file op #### Common Changes -* The `{sf-data-dir}` templating argument used in various flags to resolve to the `--data-dir=` value has been deprecated and should now be simply `{data-dir}`. The older replacement is still going to work but you should replace any occurrences of `{sf-data-dir}` in your flag definition by `{data-dir}`. +* **Deprecated** The `{sf-data-dir}` templating argument used in various flags to resolve to the `--data-dir=` value has been deprecated and should now be simply `{data-dir}`. The older replacement is still going to work but you should replace any occurrences of `{sf-data-dir}` in your flag definition by `{data-dir}`. * The default value for `common-blocks-cache-dir` changed from `{sf-data-dir}/blocks-cache` to `file://{data-dir}/storage/blocks-cache`. If you didn't had this flag defined and you had `common-blocks-cache-enabled: true`, you should define `common-blocks-cache-dir: file://{data-dir}/blocks-cache`. * The default value for `common-live-blocks-addr` changed from `:15011` to `:10014`. If you didn't had this flag defined and wish to keep the old default, define `common-live-blocks-addr: 15011` and ensure you also modify `relayer-grpc-listen-addr: :15011` (see next entry for details). +* The Go module `github.com/streamingfast/firehose-ethereum/types` has been removed, if you were depending on `github.com/streamingfast/firehose-ethereum/types` in your project before, depend directly on `github.com/streamingfast/firehose-ethereum` instead. + + > [!NOTE] + > This will pull much more dependencies then before, if you're reluctant of such additions, talk to us on Discord and we can offer alternatives depending on what you were using. + #### App `reader-node` changes This change will impact all operators currently running Firehose on Ethereum so it's important to pay attention to the upgrade procedure below, if you are unsure of something, reach to us on [Discord](https://discord.gg/jZwqxJAvRs). diff --git a/bin/test.sh b/bin/test.sh deleted file mode 100755 index 3b42e39c..00000000 --- a/bin/test.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash - -ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" - - -main() { - pushd "$ROOT" &> /dev/null - - while getopts "h" opt; do - case $opt in - h) usage && exit 0;; - \?) usage_error "Invalid option: -$OPTARG";; - esac - done - shift $((OPTIND-1)) - - set -e - - pushd types &> /dev/null - go test ./... "$@" - popd&> /dev/null - - go test ./... "$@" -} - -usage_error() { - message="$1" - exit_code="$2" - - echo "ERROR: $message" - echo "" - usage - exit ${exit_code:-1} -} - -usage() { - echo "usage: test.sh" - echo "" - echo "Runs the Go tests in all sub-packages of this repository. Normal 'go test'" - echo "does run test just under the current Go package, sub-package are not traversed." - echo "" - echo "Options" - echo " -h Display help about this script" -} - -main "$@" \ No newline at end of file diff --git a/cmd/fireeth/cli/start.go b/cmd/fireeth/cli/start.go index ec95653f..d4e61ec1 100644 --- a/cmd/fireeth/cli/start.go +++ b/cmd/fireeth/cli/start.go @@ -34,7 +34,6 @@ import ( "github.com/streamingfast/derr" "github.com/streamingfast/dlauncher/launcher" "github.com/streamingfast/dmetering" - _ "github.com/streamingfast/firehose-ethereum/types" tracing "github.com/streamingfast/sf-tracing" "go.uber.org/zap" ) diff --git a/cmd/fireeth/main.go b/cmd/fireeth/main.go index 1532e49e..d9185272 100644 --- a/cmd/fireeth/main.go +++ b/cmd/fireeth/main.go @@ -1,9 +1,6 @@ package main import ( - // Forced imported to convey they fact that this is a required import (for its side-effect!) - _ "github.com/streamingfast/firehose-ethereum/types" - "github.com/spf13/cobra" "github.com/spf13/pflag" firecore "github.com/streamingfast/firehose-core" @@ -62,7 +59,7 @@ var Chain = &firecore.Chain[*pbeth.Block]{ Tools: &firecore.ToolsConfig[*pbeth.Block]{ BlockPrinter: printBlock, - RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { + RegisterExtraCmd: func(_ *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, _ logging.Tracer) error { toolsCmd.AddCommand(compareOneblockRPCCmd) toolsCmd.AddCommand(newCompareBlocksRPCCmd(zlog)) toolsCmd.AddCommand(newFixPolygonIndexCmd(zlog)) diff --git a/cmd/fireeth/tools.go b/cmd/fireeth/tools.go index ec0d1b9e..4c9bd3a1 100644 --- a/cmd/fireeth/tools.go +++ b/cmd/fireeth/tools.go @@ -7,9 +7,12 @@ import ( "github.com/streamingfast/bstream" "github.com/streamingfast/cli" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" ) +var blockEncoder = firecore.NewBlockEncoder() + func printBlock(blk *bstream.Block, alsoPrintTransactions bool, out io.Writer) error { block := blk.ToProtocol().(*pbeth.Block) diff --git a/cmd/fireeth/tools_compare_blocks_rpc.go b/cmd/fireeth/tools_compare_blocks_rpc.go index b4517f5a..145e5115 100644 --- a/cmd/fireeth/tools_compare_blocks_rpc.go +++ b/cmd/fireeth/tools_compare_blocks_rpc.go @@ -32,7 +32,6 @@ import ( "github.com/streamingfast/eth-go" "github.com/streamingfast/eth-go/rpc" firecore "github.com/streamingfast/firehose-core" - "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/firehose/client" pbfirehose "github.com/streamingfast/pbgo/sf/firehose/v2" @@ -440,5 +439,5 @@ func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { // We are downloading only final blocks from the Firehose connection which means the LIB for them // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like // `LIBNum == self.BlockNum`). - return types.BlockFromProto(block, block.Number-1) + return blockEncoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: block.Number - 1}) } diff --git a/cmd/fireeth/tools_fix_polygon_index.go b/cmd/fireeth/tools_fix_polygon_index.go index ab45ced7..cbb5cd74 100644 --- a/cmd/fireeth/tools_fix_polygon_index.go +++ b/cmd/fireeth/tools_fix_polygon_index.go @@ -10,7 +10,6 @@ import ( "github.com/streamingfast/bstream" "github.com/streamingfast/dstore" firecore "github.com/streamingfast/firehose-core" - "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "go.uber.org/zap" ) @@ -87,7 +86,8 @@ func createFixPolygonIndexE(logger *zap.Logger) firecore.CommandExecutor { fmt.Println("ERROR FOUND AT BLOCK", block.Number) mustWrite = true ethBlock.TransactionTraces[0].Index = 0 - block, err = types.BlockFromProto(ethBlock, block.LibNum) + + block, err = blockEncoder.Encode(firecore.BlockEnveloppe{Block: ethBlock, LIBNum: block.LibNum}) if err != nil { return fmt.Errorf("re-packing the block: %w", err) } diff --git a/codec/init_test.go b/codec/init_test.go index 5d594e1c..8e1f39a9 100644 --- a/codec/init_test.go +++ b/codec/init_test.go @@ -1,14 +1,17 @@ package codec import ( - // Import for its side-effect (registering necessary bstream + // Imported for side-effects + "github.com/streamingfast/firehose-ethereum/types" _ "github.com/streamingfast/firehose-ethereum/types" + "github.com/streamingfast/logging" ) var zlog, _ = logging.PackageLogger("fireeth", "github.com/streamingfast/firehose-ethereum/codec") func init() { + types.InitFireCore() logging.InstantiateLoggers() } diff --git a/go.mod b/go.mod index ee0e6dcc..6ae709af 100644 --- a/go.mod +++ b/go.mod @@ -28,8 +28,7 @@ require ( github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9 - github.com/streamingfast/firehose-core v0.1.7-0.20230825192517-7bcda2c1d32a - github.com/streamingfast/firehose-ethereum/types v0.0.0-20230802141234-f0dd68e1f596 + github.com/streamingfast/firehose-core v0.1.12-0.20231030151853-bc6879426511 github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 diff --git a/go.sum b/go.sum index fafceff0..4fafd56b 100644 --- a/go.sum +++ b/go.sum @@ -792,10 +792,8 @@ github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1/go.mod h1:UEm github.com/streamingfast/firehose v0.1.1-0.20221017171248-8fd3adbe7b4d/go.mod h1:weGz9xDNJMBNmn03XiJZ/b5Ngw8UAUoLirarqG7OwQY= github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9 h1:SybLEPFkJk8EINJGDlijSWxEZGNXDul4zqlDpttQUCI= github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9/go.mod h1:lGC1T6mpAAApjBQNF5COSXb3SbrYRI3dBR1f6/PZE54= -github.com/streamingfast/firehose-core v0.1.7-0.20230825192517-7bcda2c1d32a h1:k1ycDIyswPqrM9/cxvOOeLNbtI9/CQXBpYpkQCUOQwI= -github.com/streamingfast/firehose-core v0.1.7-0.20230825192517-7bcda2c1d32a/go.mod h1:ArmpKvAPFBkUCzpslRmvIW3Os7ImGT03RSgBJiG8zIM= -github.com/streamingfast/firehose-ethereum/types v0.0.0-20230802141234-f0dd68e1f596 h1:2SIsuLBhc2MchfSFlcmK59/QaryS7EndmQakvlf/eS0= -github.com/streamingfast/firehose-ethereum/types v0.0.0-20230802141234-f0dd68e1f596/go.mod h1:Kh5fptEEMKVw/QXrdfr49ldY3SP5+/MJoUPQfUtByUU= +github.com/streamingfast/firehose-core v0.1.12-0.20231030151853-bc6879426511 h1:ufAHt1DaBf5NHi8gfiM3ms89JhqNf73/s7R8V2bN77c= +github.com/streamingfast/firehose-core v0.1.12-0.20231030151853-bc6879426511/go.mod h1:S5jeP4FYeWghjEY4L1LFIXfF1tl9/cyaAQZM9Or9+L4= github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 h1:dgYLhP3STiPi30fISAijFPEB11D4r1fQFc8D3cpgV5s= github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2/go.mod h1:OYv1UX/kRsV9aP4SEwa9zpt34qGzdtJzOvdGn+n56as= github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 h1:g8eEYbFSykyzIyuxNMmHEUGGUvJE0ivmqZagLDK42gw= diff --git a/tools/cmd.go b/tools/cmd.go index c1d2ba73..687644ec 100644 --- a/tools/cmd.go +++ b/tools/cmd.go @@ -19,8 +19,11 @@ import ( "github.com/spf13/cobra" "github.com/streamingfast/cli" + firecore "github.com/streamingfast/firehose-core" ) +var blockEncoder = firecore.NewBlockEncoder() + var Cmd = &cobra.Command{Use: "tools", Short: "Developer tools related to fireeth"} var Example = func(in string) string { diff --git a/tools/compare-rpc.go b/tools/compare-rpc.go index 5dc56edd..1fde9438 100644 --- a/tools/compare-rpc.go +++ b/tools/compare-rpc.go @@ -30,7 +30,7 @@ import ( "github.com/streamingfast/cli" "github.com/streamingfast/eth-go" "github.com/streamingfast/eth-go/rpc" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/firehose/client" pbfirehose "github.com/streamingfast/pbgo/sf/firehose/v2" @@ -433,5 +433,5 @@ func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { // We are downloading only final blocks from the Firehose connection which means the LIB for them // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like // `LIBNum == self.BlockNum`). - return types.BlockFromProto(block, block.Number-1) + return blockEncoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: block.Number - 1}) } diff --git a/tools/fix-polygon-index.go b/tools/fix-polygon-index.go index 8985aadd..c3f33fe8 100644 --- a/tools/fix-polygon-index.go +++ b/tools/fix-polygon-index.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/streamingfast/bstream" "github.com/streamingfast/dstore" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "go.uber.org/zap" ) @@ -87,7 +87,7 @@ func fixPolygonIndexE(cmd *cobra.Command, args []string) error { fmt.Println("ERROR FOUND AT BLOCK", block.Number) mustWrite = true ethBlock.TransactionTraces[0].Index = 0 - block, err = types.BlockFromProto(ethBlock, block.LibNum) + block, err = blockEncoder.Encode(firecore.BlockEnveloppe{Block: ethBlock, LIBNum: block.LibNum}) if err != nil { return fmt.Errorf("re-packing the block: %w", err) } diff --git a/transform/init_test.go b/transform/init_test.go index e39bbc7d..1ccf48cd 100644 --- a/transform/init_test.go +++ b/transform/init_test.go @@ -4,12 +4,17 @@ import ( "encoding/json" "testing" + "github.com/streamingfast/firehose-ethereum/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" ) +func init() { + types.InitFireCore() +} + func assertProtoEqual(t *testing.T, expected proto.Message, actual proto.Message) { t.Helper() diff --git a/transform/testing.go b/transform/testing.go index c7f1be02..59ebe928 100644 --- a/transform/testing.go +++ b/transform/testing.go @@ -5,11 +5,9 @@ import ( "os" "github.com/mitchellh/go-testing-interface" - "github.com/streamingfast/bstream" "github.com/streamingfast/dstore" "github.com/streamingfast/eth-go" - _ "github.com/streamingfast/firehose-ethereum/types" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/jsonpb" pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" diff --git a/types/go.mod b/types/go.mod deleted file mode 100644 index 880a1273..00000000 --- a/types/go.mod +++ /dev/null @@ -1,84 +0,0 @@ -module github.com/streamingfast/firehose-ethereum/types - -go 1.17 - -require ( - github.com/mitchellh/go-testing-interface v1.14.1 - github.com/streamingfast/bstream v0.0.2-0.20230731165201-639b4f347707 - github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 - github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 - github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 - github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 - github.com/stretchr/testify v1.8.3 - go.uber.org/zap v1.24.0 - google.golang.org/grpc v1.54.0 - google.golang.org/protobuf v1.30.0 -) - -require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.18.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.12.0 // indirect - cloud.google.com/go/storage v1.30.1 // indirect - github.com/Azure/azure-pipeline-go v0.2.3 // indirect - github.com/Azure/azure-storage-blob-go v0.14.0 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/aws/aws-sdk-go v1.44.233 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blendle/zapdriver v1.3.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect - github.com/holiman/uint256 v1.2.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.15.12 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mattn/go-ieproxy v0.0.1 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/paulbellamy/ratecounter v0.2.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect - github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 // indirect - github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad // indirect - github.com/streamingfast/dgrpc v0.0.0-20230623191332-4ed02c06bc6f // indirect - github.com/streamingfast/dmetrics v0.0.0-20230516031116-28fcfeb4b9ed // indirect - github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 // indirect - github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 // indirect - github.com/streamingfast/shutter v1.5.0 // indirect - github.com/tidwall/pretty v1.2.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/goleak v1.2.1 // indirect - go.uber.org/multierr v1.9.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/types/go.sum b/types/go.sum deleted file mode 100644 index 1f5f9357..00000000 --- a/types/go.sum +++ /dev/null @@ -1,1911 +0,0 @@ -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.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.3.1/go.mod h1:/mI/mTug/DwXJPxysUoInyvF3ekeXGiP8teCAtgGMdM= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.6.0/go.mod h1:w+OY1TYCk4MtvY7WfEHlIp5mP8SV/gDSqOsvGhVa2KM= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk= -contrib.go.opencensus.io/exporter/zipkin v0.1.1/go.mod h1:GMvdSl3eJ2gapOaLKzTKE3qDgUkJ86k9k3yY2eqwkzc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.3/go.mod h1:s7Gpwj0tk7XnVCm4BQEmx/mbS36SuTCY/vMB2SNxe8o= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.15.0/go.mod h1:LTScD9l1w6+z1IB3FKtXxS4oenRlIJQQrIiV/Iq1Bsw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.39.0/go.mod h1:PV+bUv9S+/W9PmZECvnC39uIEYnDL9veytwZrMqPexc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.39.0/go.mod h1:lz6DEePTxmjvYMtusOoS3qDAErC0STi/wmvqJucKY28= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221018185641-36f91511cfd7/go.mod h1:FwtSi1M0P8cuMlHxVso1vcivukprUr1bBwf15CRypOI= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.37.2/go.mod h1:Nxye/E+YPru//Bpaorfhc3JsSGYwCaDDj+R4bK52U5o= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/gometalinter v2.0.11+incompatible/go.mod h1:qfIpQGGz3d+NmgyPBqv+LSh50emm1pt72EtcX2vKYQk= -github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= -github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -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/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.43/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.233 h1:KB3p/yL32oG/aF4Ld0Ui9CU0tdezvhX6Xdqpb8vyP3U= -github.com/aws/aws-sdk-go v1.44.233/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= -github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= -github.com/bufbuild/connect-go v1.5.1/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= -github.com/bufbuild/connect-go v1.7.0/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= -github.com/bufbuild/connect-go v1.8.0/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= -github.com/bufbuild/connect-grpchealth-go v1.1.1/go.mod h1:9KbkogLoUIxOTPKyWDv5evkawr1IYXaHax4XoUHCgoQ= -github.com/bufbuild/connect-grpcreflect-go v1.0.0/go.mod h1:825I20H8bfE9rLnBH/046JSpmm3uwpNYdG4duCARetc= -github.com/bufbuild/connect-opentelemetry-go v0.3.0/go.mod h1:r1ppyTtu1EWeRodk4Q/JbyQhIWtO7eR3GoRDzjeEcNU= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -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-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/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.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -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/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -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/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= -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/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= -github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/manifoldco/promptui v0.3.2/go.mod h1:8JU+igZ+eeiiRku4T5BjtKh2ms8sziGpSYl1gN8Bazw= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -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/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= -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/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM= -github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -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/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -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/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/rabbitmq/amqp091-go v1.5.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQfcJj+oyz0dGg= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/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/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 h1:fGJnUx0shX9Y312QOlz+/+yLquihXRhNqctJ26jtZZM= -github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680/go.mod h1:iISPGAstbUsPgyC3auLLi7PYUTi9lHv5z0COam0OPOY= -github.com/streamingfast/bstream v0.0.2-0.20230731165201-639b4f347707 h1:hJW+QNNJrR1boQuoEaajlMFjWh0XKt4Fcg33h9hT7Eo= -github.com/streamingfast/bstream v0.0.2-0.20230731165201-639b4f347707/go.mod h1:Njkx972HcZiz0djWBylxqO/eq686eDGr+egQ1lePj3Q= -github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= -github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad h1:6z4uS6TlD9KoHdyE1vzoGsELVCCcviTFT/3/vqCylh8= -github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= -github.com/streamingfast/dgrpc v0.0.0-20220909121013-162e9305bbfc/go.mod h1:YlFJuFiB9rmglB5UfTfnsOTfKC1rFo+D0sRbTzLcqgc= -github.com/streamingfast/dgrpc v0.0.0-20230623191332-4ed02c06bc6f h1:qiIHzYZpnHdQHwOvsUaPc7DQkeyRptDS+8DN1FCfBcQ= -github.com/streamingfast/dgrpc v0.0.0-20230623191332-4ed02c06bc6f/go.mod h1:0tXk90PNAgFur+u/W6bQPdgfOGPGSwUqHILZKacqJj4= -github.com/streamingfast/dmetrics v0.0.0-20210811180524-8494aeb34447/go.mod h1:VLdQY/FwczmC/flqWkcsBbqXO4BhU4zQDSK7GMrpcjY= -github.com/streamingfast/dmetrics v0.0.0-20230516031116-28fcfeb4b9ed h1:b6EFwgne8MSK4kUjvulyyg2GGyvVUgQ+xY6o8eXlFIA= -github.com/streamingfast/dmetrics v0.0.0-20230516031116-28fcfeb4b9ed/go.mod h1:JbxEDbzWRG1dHdNIPrYfuPllEkktZMgm40AwVIBENcw= -github.com/streamingfast/dstore v0.1.1-0.20220607202639-35118aeaf648/go.mod h1:SHSEIPowGeE1TfNNmGeAUUnlO3dwevmX5kFOSazU60M= -github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 h1:u7FWLqz3Uwff609Ja9M+3aGOWqBCVU7dx9i6R6Qc4qI= -github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77/go.mod h1:ngKU7WzHwVjOFpt2g+Wtob5mX4IvN90HYlnARcTRbmQ= -github.com/streamingfast/dtracing v0.0.0-20210811175635-d55665d3622a/go.mod h1:bqiYZaX6L/MoXNfFQeAdau6g9HLA3yKHkX8KzStt58Q= -github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 h1:CGU52NV9heyO2Wb4ImDBy+1bVCeCsrEuu7WN/o/JGy0= -github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1/go.mod h1:UEm8dqibr3c3A1iIA3CHpkhN7j3X78prN7/55sXf3A0= -github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 h1:g8eEYbFSykyzIyuxNMmHEUGGUvJE0ivmqZagLDK42gw= -github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0/go.mod h1:cTNObq2Uofb330y05JbbZZ6RwE6QUXw5iVcHk1Fx3fk= -github.com/streamingfast/logging v0.0.0-20210811175431-f3b44b61606a/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= -github.com/streamingfast/logging v0.0.0-20210908162127-bdc5856d5341/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= -github.com/streamingfast/logging v0.0.0-20220304214715-bc750a74b424/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= -github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= -github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= -github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= -github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 h1:xlWSfi1BoPfsHtPb0VEHGUcAdBF208LUiFCwfaVPfLA= -github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308/go.mod h1:K1p8Bj/wG34KJvYzPUqtzpndffmpkrVY11u2hkyxCWQ= -github.com/streamingfast/pbgo v0.0.6-0.20220629184423-cfd0608e0cf4/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= -github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 h1:wmQg8T0rIFl/R3dy97OWRi8OSdM3llvRw2p3TPFVKZQ= -github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= -github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9/go.mod h1:ktzt1BUj3GF+SKQHEmn3ShryJ7y87JeCHtaTGaDVATs= -github.com/streamingfast/shutter v1.5.0 h1:NpzDYzj0HVpSiDJVO/FFSL6QIK/YKOxY0gJAtyaTOgs= -github.com/streamingfast/shutter v1.5.0/go.mod h1:B/T6efqdeMGbGwjzPS1ToXzYZI4kDzI5/u4I+7qbjY8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= -github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= -github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= -github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9/go.mod h1:q+QjxYvZ+fpjMXqs+XEriussHjSYqeXVnAdSV1tkMYk= -github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -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.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/detectors/gcp v1.9.0/go.mod h1:OqG0FEnmWeJWYVrEovaHXHXY4bVTnp/WfTzhwrsGWlw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 h1:PRXhsszxTt5bbPriTjmaweWUsAnJYeWBhUMLRetUgBU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4/go.mod h1:05eWWy6ZWzmpeImD3UowLTB3VjDMU1yxQ+ENuVWDM3c= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= -go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= -go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.15.1/go.mod h1:q8+Tha+5LThjeSU8BW93uUC5w5/+DnYHMKBMpRCsui0= -go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA= -go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= -go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= -go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= -go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20221010152910-d6f0a8c073c2/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -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/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220927171203-f486391704dc/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.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/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/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-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220909162455-aba9fc2a8ff2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/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/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.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.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181122213734-04b5d21e00f1/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-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -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= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.91.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -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-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220802133213-ce4fa296bf78/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220808131553-a91ffa7f803e/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55/go.mod h1:45EK0dUbEZ2NHjCeAd2LXmyjAgGUGrpGROgjhC3ADck= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 h1:khxVcsk/FhnzxMKOyD+TDGwjbEOpcPuIpmafPGFmhMA= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -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.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/types/init.go b/types/init.go index 7b3d533a..e100f6a5 100644 --- a/types/init.go +++ b/types/init.go @@ -30,12 +30,23 @@ var encoder = firecore.NewBlockEncoder() var BlockAcceptedVersions = []int32{1, 2, 3} +// init is kept for backward compatibility, `InitFireCore()` should be called directly instead in your +// own `init()` function. func init() { + InitFireCore() +} + +// InitFireCore initializes the firehose-core library and override some specific `bstream` element with the proper +// values for the ETH chain. +// +// You should use this method explicitely in your `init()` function to make the dependency explicit. +func InitFireCore() { // Doing it in `types` ensure that does that depend only on us are properly initialized firecore.UnsafePayloadKind = pbbstream.Protocol_ETH // Must fit what is defined in `cmd/fireeth/main.go` in regards to `protocol` and `protocolVersion` and `blockAcceptedVersions` - bstream.InitGeneric("ETH", 1, BlockAcceptedVersions, func() proto.Message { return &pbeth.Block{} }) + firecore.InitBstream("ETH", 1, BlockAcceptedVersions, func() proto.Message { return &pbeth.Block{} }) + bstream.NormalizeBlockID = func(in string) string { return strings.TrimPrefix(strings.ToLower(in), "0x") } diff --git a/types/pb/sf/ethereum/type/v2/type.go b/types/pb/sf/ethereum/type/v2/type.go index c22ca4c2..883cd3cc 100644 --- a/types/pb/sf/ethereum/type/v2/type.go +++ b/types/pb/sf/ethereum/type/v2/type.go @@ -303,6 +303,11 @@ func (b *Block) GetFirehoseBlockParentID() string { return hex.EncodeToString(b.Header.ParentHash) } +// GetFirehoseBlockParentNumber implements firecore.Block. +func (b *Block) GetFirehoseBlockParentNumber() uint64 { + return b.Number - 1 +} + // GetFirehoseBlockTime implements firecore.Block. func (b *Block) GetFirehoseBlockTime() time.Time { return b.Header.Timestamp.AsTime() diff --git a/types/testing/types.go b/types/testing/types.go index 42ad6243..b3c66c71 100644 --- a/types/testing/types.go +++ b/types/testing/types.go @@ -27,7 +27,7 @@ import ( "github.com/mitchellh/go-testing-interface" "github.com/streamingfast/bstream" "github.com/streamingfast/eth-go" - "github.com/streamingfast/firehose-ethereum/types" + firecore "github.com/streamingfast/firehose-core" pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" "github.com/streamingfast/jsonpb" "github.com/streamingfast/logging" @@ -440,7 +440,7 @@ func ToTimestamp(t time.Time) *timestamppb.Timestamp { } func ToBstreamBlock(t testing.T, block *pbeth.Block, libNum uint64) *bstream.Block { - blk, err := types.BlockFromProto(block, libNum) + blk, err := firecore.NewBlockEncoder().Encode(firecore.BlockEnveloppe{Block: block, LIBNum: libNum}) require.NoError(t, err) return blk From aa50b5c7286f0407e834771563ccbc17cecf105e Mon Sep 17 00:00:00 2001 From: billettc Date: Tue, 31 Oct 2023 09:55:09 -0400 Subject: [PATCH 07/11] optimize the number of call made to geth Last Block Num --- tools/poll-rpc-blocks.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/poll-rpc-blocks.go b/tools/poll-rpc-blocks.go index 3ef056ca..3399ef17 100644 --- a/tools/poll-rpc-blocks.go +++ b/tools/poll-rpc-blocks.go @@ -8,7 +8,6 @@ import ( "time" "github.com/spf13/cobra" - "github.com/streamingfast/eth-go/rpc" "go.uber.org/zap" "google.golang.org/protobuf/proto" @@ -55,17 +54,23 @@ func pollRPCBlocksE(cmd *cobra.Command, args []string) error { fmt.Println("FIRE INIT 2.3 local v1.0.0") blockNum := startBlockNum + latestBlockNum := uint64(0) for { - latest, err := client.LatestBlockNum(ctx) - if err != nil { - delay(err) - continue - } - if latest < blockNum { - delay(nil) - continue + if latestBlockNum < blockNum { + latestBlockNum, err = client.LatestBlockNum(ctx) + zlog.Info("fetched latest block num", zap.Uint64("latest_block_num", latestBlockNum), zap.Uint64("block_num", blockNum)) + if err != nil { + delay(err) + continue + } + + if latestBlockNum < blockNum { + delay(nil) + continue + } } + rpcBlock, err := client.GetBlockByNumber(ctx, rpc.BlockNumber(blockNum), rpc.WithGetBlockFullTransaction()) if err != nil { delay(err) @@ -76,6 +81,7 @@ func pollRPCBlocksE(cmd *cobra.Command, args []string) error { FromBlock: rpc.BlockNumber(blockNum), ToBlock: rpc.BlockNumber(blockNum), }) + if err != nil { delay(err) continue From fdd7772e40fa924140b0a789d679030c4753e898 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Tue, 31 Oct 2023 14:16:03 -0400 Subject: [PATCH 08/11] Fixed `newReaderNodeBootstrapper` to return `nil` bootstrapper if bootstrap URL is "" --- cmd/fireeth/reader_node_bootstraper.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/fireeth/reader_node_bootstraper.go b/cmd/fireeth/reader_node_bootstraper.go index 52017e2a..e008421b 100644 --- a/cmd/fireeth/reader_node_bootstraper.go +++ b/cmd/fireeth/reader_node_bootstraper.go @@ -20,9 +20,13 @@ import ( "go.uber.org/zap" ) -func newReaderNodeBootstrapper(ctx context.Context, logger *zap.Logger, cmd *cobra.Command, resolvedNodeArguments []string, resolver firecore.ReaderNodeArgumentResolver) (operator.Bootstrapper, error) { - nodePath := sflags.MustGetString(cmd, "reader-node-path") +func newReaderNodeBootstrapper(_ context.Context, logger *zap.Logger, cmd *cobra.Command, resolvedNodeArguments []string, resolver firecore.ReaderNodeArgumentResolver) (operator.Bootstrapper, error) { bootstrapDataURL := sflags.MustGetString(cmd, "reader-node-bootstrap-data-url") + if bootstrapDataURL == "" { + return nil, nil + } + + nodePath := sflags.MustGetString(cmd, "reader-node-path") nodeDataDir := resolver("{node-data-dir}") switch { From cfa217fa0b2e18bf4dc32817c277628652ce564c Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Thu, 2 Nov 2023 10:26:17 -0400 Subject: [PATCH 09/11] Finalized firehose-ethereum cleanup --- cmd/fireeth/cli/combined-index-builder.go | 79 ---- cmd/fireeth/cli/common-flag.go | 79 ---- cmd/fireeth/cli/constants.go | 66 --- cmd/fireeth/cli/firehose.go | 121 ----- cmd/fireeth/cli/logging.go | 21 - cmd/fireeth/cli/main.go | 147 ------ cmd/fireeth/cli/merger.go | 59 --- cmd/fireeth/cli/node.go | 527 ---------------------- cmd/fireeth/cli/purge.go | 79 ---- cmd/fireeth/cli/reader-node-stdin.go | 73 --- cmd/fireeth/cli/reader-node.go | 46 -- cmd/fireeth/cli/relayer.go | 52 --- cmd/fireeth/cli/setup.go | 138 ------ cmd/fireeth/cli/start.go | 202 --------- cmd/fireeth/cli/substreams-tier1.go | 163 ------- cmd/fireeth/cli/substreams-tier2.go | 118 ----- cmd/fireeth/cli/tools.go | 21 - cmd/fireeth/cli/utils.go | 275 ----------- cmd/fireeth/cli/utils_test.go | 57 --- cmd/fireeth/main.go | 12 +- cmd/fireeth/tools.go | 7 +- cmd/fireeth/tools_compare_blocks_rpc.go | 8 +- cmd/fireeth/tools_compare_oneblock_rpc.go | 3 +- cmd/fireeth/tools_geth_enforce_peers.go | 431 ++++++++++++++++++ devel/standard/standard.yaml | 2 +- node-manager/dev/superviser.go | 104 ----- node-manager/geth/bootstrap.go | 227 ---------- node-manager/geth/monitoring.go | 86 ---- node-manager/geth/superviser.go | 348 -------------- node-manager/logging.go | 109 ----- node-manager/logging_test.go | 85 ---- node-manager/namer.go | 31 -- node-manager/superviser.go | 26 -- node-manager/trx_pool_log_plugin.go | 112 ----- node-manager/trxstream/server.go | 115 ----- node-manager/trxstream/subscription.go | 55 --- node-manager/types.go | 29 -- tools/cmd.go | 64 --- tools/compare-rpc-oneblock.go | 106 ----- tools/compare-rpc.go | 437 ------------------ tools/compare.go | 380 ---------------- tools/fix-polygon-index.go | 164 ------- tools/logging.go | 22 - tools/poll-rpc-blocks.go | 107 ----- 44 files changed, 447 insertions(+), 4946 deletions(-) delete mode 100644 cmd/fireeth/cli/combined-index-builder.go delete mode 100644 cmd/fireeth/cli/common-flag.go delete mode 100644 cmd/fireeth/cli/constants.go delete mode 100644 cmd/fireeth/cli/firehose.go delete mode 100644 cmd/fireeth/cli/logging.go delete mode 100644 cmd/fireeth/cli/main.go delete mode 100644 cmd/fireeth/cli/merger.go delete mode 100644 cmd/fireeth/cli/node.go delete mode 100644 cmd/fireeth/cli/purge.go delete mode 100644 cmd/fireeth/cli/reader-node-stdin.go delete mode 100644 cmd/fireeth/cli/reader-node.go delete mode 100644 cmd/fireeth/cli/relayer.go delete mode 100644 cmd/fireeth/cli/setup.go delete mode 100644 cmd/fireeth/cli/start.go delete mode 100644 cmd/fireeth/cli/substreams-tier1.go delete mode 100644 cmd/fireeth/cli/substreams-tier2.go delete mode 100644 cmd/fireeth/cli/tools.go delete mode 100644 cmd/fireeth/cli/utils.go delete mode 100644 cmd/fireeth/cli/utils_test.go create mode 100644 cmd/fireeth/tools_geth_enforce_peers.go delete mode 100644 node-manager/dev/superviser.go delete mode 100644 node-manager/geth/bootstrap.go delete mode 100644 node-manager/geth/monitoring.go delete mode 100644 node-manager/geth/superviser.go delete mode 100644 node-manager/logging.go delete mode 100644 node-manager/logging_test.go delete mode 100644 node-manager/namer.go delete mode 100644 node-manager/superviser.go delete mode 100644 node-manager/trx_pool_log_plugin.go delete mode 100644 node-manager/trxstream/server.go delete mode 100644 node-manager/trxstream/subscription.go delete mode 100644 node-manager/types.go delete mode 100644 tools/cmd.go delete mode 100644 tools/compare-rpc-oneblock.go delete mode 100644 tools/compare-rpc.go delete mode 100644 tools/compare.go delete mode 100644 tools/fix-polygon-index.go delete mode 100644 tools/logging.go delete mode 100644 tools/poll-rpc-blocks.go diff --git a/cmd/fireeth/cli/combined-index-builder.go b/cmd/fireeth/cli/combined-index-builder.go deleted file mode 100644 index d3f0869b..00000000 --- a/cmd/fireeth/cli/combined-index-builder.go +++ /dev/null @@ -1,79 +0,0 @@ -package cli - -import ( - "context" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/bstream" - bstransform "github.com/streamingfast/bstream/transform" - "github.com/streamingfast/dlauncher/launcher" - "github.com/streamingfast/firehose-ethereum/transform" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - indexerApp "github.com/streamingfast/index-builder/app/index-builder" -) - -func init() { - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "combined-index-builder", - Title: "Combined Index Builder", - Description: "Produces a combined index for a given set of blocks", - RegisterFlags: func(cmd *cobra.Command) error { - cmd.Flags().Uint64("combined-index-builder-index-size", 10000, "size of combined index bundles that will be created") - cmd.Flags().Uint64("combined-index-builder-start-block", 0, "block number to start indexing") - cmd.Flags().Uint64("combined-index-builder-stop-block", 0, "block number to stop indexing") - cmd.Flags().String("combined-index-builder-grpc-listen-addr", IndexBuilderServiceAddr, "Address to listen for grpc-based healthz check") - return nil - }, - InitFunc: func(runtime *launcher.Runtime) error { - return nil - }, - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - - mergedBlocksStoreURL, _, _, err := getCommonStoresURLs(runtime.AbsDataDir) - if err != nil { - return nil, err - } - - indexStore, lookupIdxSizes, err := GetIndexStore(runtime.AbsDataDir) - if err != nil { - return nil, err - } - - startBlockResolver := func(ctx context.Context) (uint64, error) { - select { - case <-ctx.Done(): - return 0, ctx.Err() - default: - } - - startBlockNum := bstransform.FindNextUnindexed( - ctx, - viper.GetUint64("combined-index-builder-start-block"), - lookupIdxSizes, - transform.CombinedIndexerShortName, - indexStore, - ) - - return startBlockNum, nil - } - stopBlockNum := viper.GetUint64("combined-index-builder-stop-block") - - combinedIndexer := transform.NewEthCombinedIndexerLegacy(indexStore, viper.GetUint64("combined-index-builder-index-size")) - handler := bstream.HandlerFunc(func(blk *bstream.Block, obj interface{}) error { - combinedIndexer.ProcessBlock(blk.ToProtocol().(*pbeth.Block)) - return nil - }) - - app := indexerApp.New(&indexerApp.Config{ - BlockHandler: handler, - StartBlockResolver: startBlockResolver, - EndBlock: stopBlockNum, - BlockStorePath: mergedBlocksStoreURL, - GRPCListenAddr: viper.GetString("combined-index-builder-grpc-listen-addr"), - }) - - return app, nil - }, - }) -} diff --git a/cmd/fireeth/cli/common-flag.go b/cmd/fireeth/cli/common-flag.go deleted file mode 100644 index ff891b23..00000000 --- a/cmd/fireeth/cli/common-flag.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "strings" - - "github.com/spf13/cobra" - "github.com/streamingfast/cli" - "go.uber.org/zap" -) - -func RegisterCommonFlags(_ *zap.Logger, cmd *cobra.Command) error { - // this one belong everywhere - RootCmd.PersistentFlags().Int("common-first-streamable-block", 0, "[COMMON] first streamable block number") - - //Common stores configuration flags - cmd.Flags().String("common-merged-blocks-store-url", MergedBlocksStoreURL, "[COMMON] Store URL (with prefix) where to read/write merged blocks.") - cmd.Flags().String("common-one-block-store-url", OneBlockStoreURL, "[COMMON] Store URL (with prefix) to read/write one-block files.") - cmd.Flags().String("common-forked-blocks-store-url", ForkedBlocksStoreURL, "[COMMON] Store URL (with prefix) to read/write forked block files that we want to keep") - cmd.Flags().String("common-index-store-url", IndexStoreURL, "[COMMON] Store URL (with prefix) to read/write index files.") - cmd.Flags().String("common-live-blocks-addr", RelayerServingAddr, "[COMMON] gRPC endpoint to get real-time blocks.") - cmd.Flags().Bool("dev", false, "[COMMON] Runs in local dev mode (remove 'node' app from defaults, overrides '--reader-node-path' to this program itself, overrides '--reader-node-arguments' to 'tools poll-rpc-blocks http://localhost:8545 0'") - - cmd.Flags().IntSlice("common-block-index-sizes", []int{100000, 100000, 10000, 1000}, "index bundle sizes that that are considered valid when looking for block indexes") - cmd.Flags().Bool("common-blocks-cache-enabled", false, FlagDescription(` - [COMMON] Use a disk cache to store the blocks data to disk and instead of keeping it in RAM. By enabling this, block's Protobuf content, in bytes, - is kept on file system instead of RAM. This is done as soon the block is downloaded from storage. This is a tradeoff between RAM and Disk, if you - are going to serve only a handful of concurrent requests, it's suggested to keep is disabled, if you encounter heavy RAM consumption issue, specially - by the firehose component, it's definitely a good idea to enable it and configure it properly through the other 'common-blocks-cache-...' flags. The cache is - split in two portions, one keeping N total bytes of blocks of the most recently used blocks and the other one keeping the N earliest blocks as - requested by the various consumers of the cache. - `)) - cmd.Flags().String("common-blocks-cache-dir", BlocksCacheDirectory, FlagDescription(` - [COMMON] Blocks cache directory where all the block's bytes will be cached to disk instead of being kept in RAM. - This should be a disk that persists across restarts of the Firehose component to reduce the the strain on the disk - when restarting and streams reconnects. The size of disk must at least big (with a 10%% buffer) in bytes as the sum of flags' - value for 'common-blocks-cache-max-recent-entry-bytes' and 'common-blocks-cache-max-entry-by-age-bytes'. - `)) - cmd.Flags().Int("common-blocks-cache-max-recent-entry-bytes", 20*1024^3, FlagDescription(` - [COMMON] Blocks cache max size in bytes of the most recently used blocks, after the limit is reached, blocks are evicted from the cache. - `)) - cmd.Flags().Int("common-blocks-cache-max-entry-by-age-bytes", 20*1024^3, FlagDescription(` - [COMMON] Blocks cache max size in bytes of the earliest used blocks, after the limit is reached, blocks are evicted from the cache. - `)) - - // Network config - cmd.Flags().Uint32("common-chain-id", DefaultChainID, "[COMMON] ETH chain ID (from EIP-155) as returned from JSON-RPC 'eth_chainId' call Used by: dgraphql") - cmd.Flags().Uint32("common-network-id", DefaultNetworkID, "[COMMON] ETH network ID as returned from JSON-RPC 'net_version' call") - cmd.Flags().String("common-deployment-id", DefaultDeploymentID, "[COMMON] Deployment ID, used for some billing functions by dgraphql") - - //// Authentication, metering and rate limiter plugins - cmd.Flags().String("common-auth-plugin", "trust://", "[COMMON] Auth plugin URI, see streamingfast/dauth repository") - cmd.Flags().String("common-metering-plugin", "null://", "[COMMON] Metering plugin URI, see streamingfast/dmetering repository") - - // System Behavior - cmd.Flags().Duration(CommonSystemShutdownSignalDelayFlag, 0, "[COMMON] Add a delay between receiving SIGTERM signal and shutting down apps. Apps will respond negatively to /healthz during this period") - cmd.Flags().Uint64(CommonAutoMemLimitFlag, 0, "[COMMON] Automatically sets GOMEMLIMIT to a percentage of memory limit from cgroup (useful for container environments)") - cmd.Flags().Bool(CommonAutoMaxProcsFlag, false, "[COMMON] Automatically sets GOMAXPROCS to max cpu available from cgroup (useful for container environments)") - - return nil -} - -func FlagDescription(in string, args ...interface{}) string { - return fmt.Sprintf(strings.Join(strings.Split(string(cli.Description(in)), "\n"), " "), args...) -} diff --git a/cmd/fireeth/cli/constants.go b/cmd/fireeth/cli/constants.go deleted file mode 100644 index 8d353f9c..00000000 --- a/cmd/fireeth/cli/constants.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" -) - -const ( - Protocol = pbbstream.Protocol_ETH - - DefaultChainID uint32 = 123 - DefaultNetworkID uint32 = 123 - DefaultDeploymentID string = "eth-local" - - OneBlockStoreURL string = "file://{sf-data-dir}/storage/one-blocks" - ForkedBlocksStoreURL string = "file://{sf-data-dir}/storage/forked-blocks" - MergedBlocksStoreURL string = "file://{sf-data-dir}/storage/merged-blocks" - IndexStoreURL string = "file://{sf-data-dir}/storage/index" - SnapshotsURL string = "file://{sf-data-dir}/storage/snapshots" - StateDBDSN string = "badger://{sf-data-dir}/storage/statedb" - - MetricsListenAddr string = ":9102" - - BlocksCacheDirectory string = "{sf-data-dir}/blocks-cache" - BlockstreamGRPCServingAddr string = ":13039" - BlockstreamHTTPServingAddr string = ":13040" - EVMExecutorGRPCServingAddr string = ":13036" - FirehoseGRPCServingAddr string = ":13042" - SubstreamsTier1GRPCServingAddr string = ":13044" - SubstreamsTier2GRPCServingAddr string = ":13045" - FirehoseGRPCHealthServingAddr string = ":13043" - MergerServingAddr string = ":13012" - IndexBuilderServiceAddr string = ":13043" - ReaderNodeManagerAPIAddr string = ":13009" - ReaderGRPCAddr string = ":13010" - NodeManagerAPIAddr string = ":13041" - RelayerServingAddr string = ":13011" - TokenMetaServingAddr string = ":13039" - TraderServingAddr string = ":13038" - StateDBServingAddr string = ":13029" - StateDBGRPCServingAddr string = ":13035" - - // Geth instance port definitions - ReaderNodeP2PPort string = "30305" - ReaderNodeRPCPort string = "8547" - NodeP2PPort string = "30303" - NodeRPCPort string = "8545" - devMinerAddress string = "0x821b55d8abe79bc98f05eb675fdc50dfe796b7ab" - - CommonAutoMaxProcsFlag string = "common-auto-max-procs" - CommonAutoMemLimitFlag string = "common-auto-mem-limit-percent" - CommonSystemShutdownSignalDelayFlag string = "common-system-shutdown-signal-delay" -) diff --git a/cmd/fireeth/cli/firehose.go b/cmd/fireeth/cli/firehose.go deleted file mode 100644 index 9db328f5..00000000 --- a/cmd/fireeth/cli/firehose.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "net/url" - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/bstream/transform" - "github.com/streamingfast/dauth" - "github.com/streamingfast/derr" - discoveryservice "github.com/streamingfast/dgrpc/server/discovery-service" - "github.com/streamingfast/dlauncher/launcher" - "github.com/streamingfast/dmetrics" - ethtransform "github.com/streamingfast/firehose-ethereum/transform" - firehoseApp "github.com/streamingfast/firehose/app/firehose" - firehoseServer "github.com/streamingfast/firehose/server" - "github.com/streamingfast/logging" -) - -var metricset = dmetrics.NewSet() - -var headBlockNumMetric = metricset.NewHeadBlockNumber("firehose") -var headTimeDriftmetric = metricset.NewHeadTimeDrift("firehose") - -func init() { - appLogger, _ := logging.PackageLogger("firehose", "github.com/streamingfast/firehose-ethereum/firehose") - - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "firehose", - Title: "Block Firehose", - Description: "Provides on-demand filtered blocks, depends on common-merged-blocks-store-url and common-live-blocks-addr", - RegisterFlags: func(cmd *cobra.Command) error { - cmd.Flags().String("firehose-grpc-listen-addr", FirehoseGRPCServingAddr, "Address on which the firehose will listen, appending * to the end of the listen address will start the server over an insecure TLS connection. By default firehose will start in plain-text mode.") - cmd.Flags().String("firehose-discovery-service-url", "", "url to configure the grpc discovery service") //traffic-director://xds?vpc_network=vpc-global&use_xds_reds=true - cmd.Flags().Int("firehose-rate-limit-bucket-size", -1, "Rate limit bucket size (default: no rate limit)") - cmd.Flags().Duration("firehose-rate-limit-bucket-fill-rate", 10*time.Second, "Rate limit bucket refill rate (default: 10s)") - return nil - }, - - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - blockstreamAddr := viper.GetString("common-live-blocks-addr") - - authenticator, err := dauth.New(viper.GetString("common-auth-plugin"), appLogger) - if err != nil { - return nil, fmt.Errorf("unable to initialize authenticator: %w", err) - } - mergedBlocksStoreURL, oneBlocksStoreURL, forkedBlocksStoreURL, err := getCommonStoresURLs(runtime.AbsDataDir) - if err != nil { - return nil, err - } - - indexStore, possibleIndexSizes, err := GetIndexStore(runtime.AbsDataDir) - if err != nil { - return nil, fmt.Errorf("unable to initialize indexes: %w", err) - } - - rawServiceDiscoveryURL := viper.GetString("firehose-discovery-service-url") - var serviceDiscoveryURL *url.URL - if rawServiceDiscoveryURL != "" { - serviceDiscoveryURL, err = url.Parse(rawServiceDiscoveryURL) - if err != nil { - return nil, fmt.Errorf("unable to parse discovery service url: %w", err) - } - err = discoveryservice.Bootstrap(serviceDiscoveryURL) - if err != nil { - return nil, fmt.Errorf("unable to bootstrap discovery service: %w", err) - } - } - - firehoseGRPCListenAddr := viper.GetString("firehose-grpc-listen-addr") - registry := transform.NewRegistry() - registry.Register(ethtransform.HeaderOnlyTransformFactory) - registry.Register(ethtransform.MultiLogFilterTransformFactory(indexStore, possibleIndexSizes)) - registry.Register(ethtransform.MultiCallToFilterTransformFactory(indexStore, possibleIndexSizes)) - registry.Register(ethtransform.CombinedFilterTransformFactory(indexStore, possibleIndexSizes)) - - serverOptions := []firehoseServer.Option{} - - limiterSize := viper.GetInt("firehose-rate-limit-bucket-size") - limiterRefillRate := viper.GetDuration("firehose-rate-limit-bucket-fill-rate") - if limiterSize > 0 { - serverOptions = append(serverOptions, firehoseServer.WithLeakyBucketLimiter(limiterSize, limiterRefillRate)) - } - - return firehoseApp.New(appLogger, &firehoseApp.Config{ - MergedBlocksStoreURL: mergedBlocksStoreURL, - OneBlocksStoreURL: oneBlocksStoreURL, - ForkedBlocksStoreURL: forkedBlocksStoreURL, - BlockStreamAddr: blockstreamAddr, - GRPCListenAddr: firehoseGRPCListenAddr, - GRPCShutdownGracePeriod: time.Second, - ServiceDiscoveryURL: serviceDiscoveryURL, - ServerOptions: serverOptions, - }, &firehoseApp.Modules{ - Authenticator: authenticator, - HeadTimeDriftMetric: headTimeDriftmetric, - HeadBlockNumberMetric: headBlockNumMetric, - TransformRegistry: registry, - CheckPendingShutdown: func() bool { - return derr.IsShuttingDown() - }, - }), nil - }, - }) -} diff --git a/cmd/fireeth/cli/logging.go b/cmd/fireeth/cli/logging.go deleted file mode 100644 index a5187965..00000000 --- a/cmd/fireeth/cli/logging.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "github.com/streamingfast/logging" -) - -var zlog, _ = logging.RootLogger("fireeth", "github.com/streamingfast/firehose-ethereum/cmd/fireeth") diff --git a/cmd/fireeth/cli/main.go b/cmd/fireeth/cli/main.go deleted file mode 100644 index 88ce3420..00000000 --- a/cmd/fireeth/cli/main.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "runtime/debug" - "strings" - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/derr" - "github.com/streamingfast/dlauncher/flags" - "github.com/streamingfast/dlauncher/launcher" - "github.com/streamingfast/node-manager/operator" - "go.uber.org/zap" -) - -var RootCmd = &cobra.Command{Use: "fireeth", Short: "Ethereum on StreamingFast"} - -var allFlags = make(map[string]bool) // used as global because of async access to cobra init functions -var registerCommonModulesCallback func(runtime *launcher.Runtime) error - -func Main( - registerCommonFlags func(logger *zap.Logger, cmd *cobra.Command) error, - registerCommonModules func(runtime *launcher.Runtime) error, - backupModuleFactories map[string]operator.BackupModuleFactory, -) { - cobra.OnInitialize(func() { - allFlags = flags.AutoBind(RootCmd, "FIREETH") - }) - - RootCmd.PersistentFlags().StringP("data-dir", "d", "./sf-data", "Path to data storage for all components of the stack") - RootCmd.PersistentFlags().StringP("config-file", "c", "", "Configuration file to use. No config file loaded if set to an empty string (hence using flags to configure the whole stack).") - RootCmd.PersistentFlags().String("log-format", "text", "Format for logging to stdout. Either 'text' or 'stackdriver'. When 'text', if the standard output is detected to be interactive, colored text is output, otherwise non-colored text.") - RootCmd.PersistentFlags().Bool("log-to-file", false, "Also write logs to {data-dir}/sf.log.json ") - RootCmd.PersistentFlags().CountP("verbose", "v", "Enables verbose output (-vvvv for max verbosity)") - - RootCmd.PersistentFlags().String("log-level-switcher-listen-addr", "localhost:1065", "If non-empty, the process will listen on this address for json-formatted requests to change different logger levels (see DEBUG.md for more info)") - RootCmd.PersistentFlags().String("metrics-listen-addr", MetricsListenAddr, "If non-empty, the process will listen on this address to server Prometheus metrics") - RootCmd.PersistentFlags().String("pprof-listen-addr", "localhost:6060", "If non-empty, the process will listen on this address for pprof analysis (see https://golang.org/pkg/net/http/pprof/)") - RootCmd.PersistentFlags().Duration("startup-delay", 0, "[DEV] Delay with units (like 10s or 1m) before launching actual application(s), useful to leave some time to perform maintenance operations, on persistent disks for example.") - - // Those must come before `launcher.RegisterFlags` call because they register themselves some flags that are checked by `launcher.RegisterFlags` - registerNodeApp(backupModuleFactories) - registerReaderNodeApp(backupModuleFactories) - - // FIXME Should actually be a dependency on `launcher.RegisterFlags` directly! - launcher.RegisterCommonFlags = registerCommonFlags - derr.Check("registering application flags", launcher.RegisterFlags(zlog, StartCmd)) - - registerCommonModulesCallback = registerCommonModules - - var availableCmds []string - for app := range launcher.AppRegistry { - availableCmds = append(availableCmds, app) - } - StartCmd.SetHelpTemplate(fmt.Sprintf(startCmdHelpTemplate, strings.Join(availableCmds, "\n "))) - StartCmd.Example = startCmdExample - - RootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - if err := setupCmd(cmd); err != nil { - return err - } - startupDelay := viper.GetDuration("global-startup-delay") - if startupDelay.Microseconds() > 0 { - zlog.Info("sleeping before starting application(s)", zap.Duration("delay", startupDelay)) - time.Sleep(startupDelay) - } - return nil - } - - derr.Check("dfuse", RootCmd.Execute()) -} - -func Version(version string) string { - info, ok := debug.ReadBuildInfo() - if !ok { - panic("we should have been able to retrieve info from 'runtime/debug#ReadBuildInfo'") - } - - commit := findSetting("vcs.revision", info.Settings) - date := findSetting("vcs.time", info.Settings) - - var labels []string - if len(commit) >= 7 { - labels = append(labels, fmt.Sprintf("Commit %s", commit[0:7])) - } - - if date != "" { - labels = append(labels, fmt.Sprintf("Built %s", date)) - } - - if len(labels) == 0 { - return version - } - - return fmt.Sprintf("%s (%s)", version, strings.Join(labels, ", ")) -} - -func findSetting(key string, settings []debug.BuildSetting) (value string) { - for _, setting := range settings { - if setting.Key == key { - return setting.Value - } - } - - return "" -} - -var startCmdExample = `fireeth start -c config.yaml` -var startCmdHelpTemplate = `Usage:{{if .Runnable}} - {{.UseLine}}{{end}} [all|command1 [command2...]]{{if gt (len .Aliases) 0}} - -Aliases: - {{.NameAndAliases}}{{end}}{{if .HasExample}} - -Examples: - {{.Example}}{{end}} - -Available Commands: - %s{{if .HasAvailableLocalFlags}} - -Flags: -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} - -Global Flags: -{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} - -Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} - {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} - -Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} -` diff --git a/cmd/fireeth/cli/merger.go b/cmd/fireeth/cli/merger.go deleted file mode 100644 index 21ea3320..00000000 --- a/cmd/fireeth/cli/merger.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/dlauncher/launcher" - mergerApp "github.com/streamingfast/merger/app/merger" -) - -func init() { - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "merger", - Title: "Merger", - Description: "Produces merged block files from single-block files", - RegisterFlags: func(cmd *cobra.Command) error { - cmd.Flags().Duration("merger-time-between-store-lookups", 1*time.Second, "Delay between source store polling (should be higher for remote storage)") - cmd.Flags().Duration("merger-time-between-store-pruning", time.Minute, "Delay between source store pruning loops") - cmd.Flags().Uint64("merger-prune-forked-blocks-after", 50000, "Number of blocks that must pass before we delete old forks (one-block-files lingering)") - cmd.Flags().String("merger-grpc-listen-addr", MergerServingAddr, "Address to listen for incoming gRPC requests") - cmd.Flags().Uint64("merger-stop-block", 0, "if non-zero, merger will trigger shutdown when blocks have been merged up to this block") - return nil - }, - InitFunc: func(runtime *launcher.Runtime) (err error) { - return nil - }, - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - mergedBlocksStoreURL, oneBlocksStoreURL, forkedBlocksStoreURL, err := getCommonStoresURLs(runtime.AbsDataDir) - if err != nil { - return nil, err - } - return mergerApp.New(&mergerApp.Config{ - StorageOneBlockFilesPath: oneBlocksStoreURL, - StorageMergedBlocksFilesPath: mergedBlocksStoreURL, - StorageForkedBlocksFilesPath: forkedBlocksStoreURL, - GRPCListenAddr: viper.GetString("merger-grpc-listen-addr"), - PruneForkedBlocksAfter: viper.GetUint64("merger-prune-forked-blocks-after"), - StopBlock: viper.GetUint64("merger-stop-block"), - TimeBetweenPruning: viper.GetDuration("merger-time-between-store-pruning"), - TimeBetweenPolling: viper.GetDuration("merger-time-between-store-lookups"), - }), nil - }, - }) -} diff --git a/cmd/fireeth/cli/node.go b/cmd/fireeth/cli/node.go deleted file mode 100644 index 754bbc03..00000000 --- a/cmd/fireeth/cli/node.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "os" - "strings" - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/bstream" - "github.com/streamingfast/bstream/blockstream" - "github.com/streamingfast/dlauncher/launcher" - firecore "github.com/streamingfast/firehose-core" - "github.com/streamingfast/firehose-ethereum/codec" - nodemanager "github.com/streamingfast/firehose-ethereum/node-manager" - "github.com/streamingfast/firehose-ethereum/node-manager/dev" - "github.com/streamingfast/firehose-ethereum/node-manager/geth" - "github.com/streamingfast/logging" - nodeManager "github.com/streamingfast/node-manager" - nodeManagerApp "github.com/streamingfast/node-manager/app/node_manager" - "github.com/streamingfast/node-manager/metrics" - reader "github.com/streamingfast/node-manager/mindreader" - "github.com/streamingfast/node-manager/operator" - pbbstream "github.com/streamingfast/pbgo/sf/bstream/v1" - pbheadinfo "github.com/streamingfast/pbgo/sf/headinfo/v1" - "go.uber.org/zap" - "google.golang.org/grpc" -) - -var nodeLogger, nodeTracer = logging.PackageLogger("node", "github.com/streamingfast/firehose-ethereum/node") -var nodeGethLogger, _ = logging.PackageLogger("node.geth", "github.com/streamingfast/firehose-ethereum/node/geth", DefaultLevelInfo) - -var readerLogger, readerTracer = logging.PackageLogger("reader", "github.com/streamingfast/firehose-ethereum/mindreader") -var readerGethLogger, _ = logging.PackageLogger("reader.geth", "github.com/streamingfast/firehose-ethereum/mindreader/geth", DefaultLevelInfo) - -func registerNodeApp(backupModuleFactories map[string]operator.BackupModuleFactory) { - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "node", - Title: "Ethereum Node", - Description: "Ethereum node with built-in operational manager", - RegisterFlags: registerEthereumNodeFlags, - InitFunc: func(runtime *launcher.Runtime) error { - return nil - }, - FactoryFunc: nodeFactoryFunc(false, backupModuleFactories)}) -} - -func nodeFactoryFunc(isReader bool, backupModuleFactories map[string]operator.BackupModuleFactory) func(*launcher.Runtime) (launcher.App, error) { - return func(runtime *launcher.Runtime) (launcher.App, error) { - appLogger := nodeLogger - appTracer := nodeTracer - if isReader { - appLogger = readerLogger - appTracer = readerTracer - } - - sfDataDir := runtime.AbsDataDir - - nodePath, - networkID, - nodeType, - nodeDataDir, - nodeIPCPath, - debugDeepMind, - logToZap, - httpAddr, - readinessMaxLatency, - nodeEnforcePeers, - bootstrapDataURL, - backupConfigs, - shutdownDelay, - nodeArguments, - err := parseCommonNodeFlags(appLogger, sfDataDir, isReader) - if err != nil { - return nil, err - } - - prefix := "node" - if isReader { - prefix = "reader-node" - } - - metricsAndReadinessManager := buildMetricsAndReadinessManager(prefix, readinessMaxLatency) - nodeLogger := getSupervisedProcessLogger(isReader, nodeType) - - superviser, err := buildSuperviser( - metricsAndReadinessManager, - nodeType, - nodePath, - nodeIPCPath, - nodeDataDir, - nodeArguments, - nodeEnforcePeers, - appLogger, - nodeLogger, - logToZap, - isReader, - debugDeepMind, - ) - if err != nil { - return nil, err - } - - var bootstrapper operator.Bootstrapper - if bootstrapDataURL != "" { - if nodeType != "geth" { - return nil, fmt.Errorf("feature bootstrap-data-url only supported for node type geth") - } - - switch { - case strings.HasSuffix(bootstrapDataURL, "tar.zst") || strings.HasSuffix(bootstrapDataURL, "tar.zstd"): - bootstrapper = geth.NewTarballBootstrapper(bootstrapDataURL, nodeDataDir, nodeLogger) - case strings.HasSuffix(bootstrapDataURL, "json"): - // special bootstrap case - bootstrapArgs, err := buildNodeArguments(appLogger, sfDataDir, networkID, nodeDataDir, nodeIPCPath, "", nodeType, "bootstrap", "") - if err != nil { - return nil, fmt.Errorf("cannot build node bootstrap arguments") - } - bootstrapper = geth.NewGenesisBootstrapper(nodeDataDir, bootstrapDataURL, nodePath, bootstrapArgs, nodeLogger) - default: - return nil, fmt.Errorf("bootstrap-data-url should point to either an archive ending in '.tar.zstd' or a genesis file ending in '.json', not %s", bootstrapDataURL) - } - } - - chainOperator, err := buildChainOperator( - superviser, - metricsAndReadinessManager, - shutdownDelay, - bootstrapper, - appLogger, - ) - if err != nil { - return nil, err - } - - backupModules, backupSchedules, err := operator.ParseBackupConfigs(appLogger, backupConfigs, backupModuleFactories) - if err != nil { - return nil, fmt.Errorf("parsing backup configs: %w", err) - } - - appLogger.Info("backup config", - zap.Strings("config", backupConfigs), - zap.Int("backup_module_count", len(backupModules)), - zap.Int("backup_schedule_count", len(backupSchedules)), - ) - - for name, mod := range backupModules { - appLogger.Info("registering backup module", zap.String("name", name), zap.Any("module", mod)) - err := chainOperator.RegisterBackupModule(name, mod) - if err != nil { - return nil, fmt.Errorf("unable to register backup module %s: %w", name, err) - } - appLogger.Info("backup module registered", zap.String("name", name), zap.Any("module", mod)) - } - - for _, sched := range backupSchedules { - chainOperator.RegisterBackupSchedule(sched) - } - - if !isReader { - return nodeManagerApp.New(&nodeManagerApp.Config{ - HTTPAddr: httpAddr, - }, &nodeManagerApp.Modules{ - Operator: chainOperator, - MetricsAndReadinessManager: metricsAndReadinessManager, - }, appLogger), nil - } - - blockStreamServer := blockstream.NewUnmanagedServer( - blockstream.ServerOptionWithLogger(appLogger), - blockstream.ServerOptionWithBuffer(1), - ) - gprcListenAddr := viper.GetString("reader-node-grpc-listen-addr") - _, oneBlocksStoreURL, _ := mustGetCommonStoresURLs(runtime.AbsDataDir) - workingDir := MustReplaceDataDir(sfDataDir, viper.GetString("reader-node-working-dir")) - batchStartBlockNum := viper.GetUint64("reader-node-start-block-num") - batchStopBlockNum := viper.GetUint64("reader-node-stop-block-num") - oneBlockFileSuffix := viper.GetString("reader-node-oneblock-suffix") - blocksChanCapacity := viper.GetInt("reader-node-blocks-chan-capacity") - - updateMetricsAndSuperviser := func(block *bstream.Block) error { - if s, ok := superviser.(UpdatableSuperviser); ok { - s.UpdateLastBlockSeen(block.Number) - } - return metricsAndReadinessManager.UpdateHeadBlock(block) - } - - readerPlugin, err := reader.NewMindReaderPlugin( - oneBlocksStoreURL, - workingDir, - func(lines chan string) (reader.ConsolerReader, error) { - return codec.NewConsoleReader(lines, firecore.NewBlockEncoder(), appLogger, appTracer) - }, - batchStartBlockNum, - batchStopBlockNum, - blocksChanCapacity, - updateMetricsAndSuperviser, - func(error) { - chainOperator.Shutdown(nil) - }, - oneBlockFileSuffix, - blockStreamServer, - appLogger, - appTracer, - ) - if err != nil { - return nil, fmt.Errorf("new reader plugin: %w", err) - } - - superviser.RegisterLogPlugin(readerPlugin) - - trxPoolLogPlugin := nodemanager.NewTrxPoolLogPlugin(appLogger) - superviser.RegisterLogPlugin(trxPoolLogPlugin) - - return nodeManagerApp.New(&nodeManagerApp.Config{ - HTTPAddr: httpAddr, - GRPCAddr: gprcListenAddr, - }, &nodeManagerApp.Modules{ - Operator: chainOperator, - MindreaderPlugin: readerPlugin, - MetricsAndReadinessManager: metricsAndReadinessManager, - RegisterGRPCService: func(server grpc.ServiceRegistrar) error { - pbheadinfo.RegisterHeadInfoServer(server, blockStreamServer) - pbbstream.RegisterBlockStreamServer(server, blockStreamServer) - - trxPoolLogPlugin.RegisterServices(server) - - return nil - }, - }, appLogger), nil - } -} - -func isGenesisBootstrapper(bootstrapDataURL string) bool { - return strings.HasSuffix(bootstrapDataURL, "json") -} - -func getSupervisedProcessLogger(isReader bool, nodeType string) *zap.Logger { - switch nodeType { - case "geth", "dev": - if isReader { - return readerGethLogger - } else { - return nodeGethLogger - } - default: - panic(fmt.Errorf("unknown node type %q, only knows about %q, %q and %q", nodeType, "geth", "openethereum", "dev")) - } -} - -type nodeArgsByRole map[string]string - -var nodeArgsByTypeAndRole = map[string]nodeArgsByRole{ - "geth": { - "dev-miner": "--networkid={network-id} --datadir={node-data-dir} --ipcpath={node-ipc-path} --port=" + NodeP2PPort + " --http --http.api=eth,net,web3,personal --http.port=" + NodeRPCPort + " --http.addr=0.0.0.0 --http.vhosts=* --mine --nodiscover --allow-insecure-unlock --password=/dev/null --miner.etherbase=" + devMinerAddress + " --unlock=" + devMinerAddress, - "peering": "--networkid={network-id} --datadir={node-data-dir} --ipcpath={node-ipc-path} --port=30304 --http --http.api=eth,net,web3 --http.port=8546 --http.addr=0.0.0.0 --http.vhosts=* --firehose-block-progress", - "reader": "--networkid={network-id} --datadir={node-data-dir} --ipcpath={node-ipc-path} --port=" + ReaderNodeP2PPort + " --http --http.api=eth,net,web3 --http.port=" + ReaderNodeRPCPort + " --http.addr=0.0.0.0 --http.vhosts=* --firehose-enabled", - "bootstrap": "--networkid={network-id} --datadir={node-data-dir} --maxpeers 10 init {node-data-dir}/genesis.json", - }, - "openethereum": { - "peering": "--network-id={network-id} --ipc-path={node-ipc-path} --base-path={node-data-dir} --port=" + NodeP2PPort + " --jsonrpc-port=" + NodeRPCPort + " --jsonrpc-apis=web3,net,eth,parity,parity,parity_pubsub,parity_accounts,parity_set --firehose-block-progress", - //"dev-miner": ... - "reader": "--network-id={network-id} --ipc-path={node-ipc-path} --base-path={node-data-dir} --port=" + ReaderNodeP2PPort + " --jsonrpc-port=" + ReaderNodeRPCPort + " --jsonrpc-apis=web3,net,eth,parity,parity,parity_pubsub,parity_accounts,parity_set --firehose-enabled --no-warp", - }, - "dev": { - "reader": "tools poll-rpc-blocks http://localhost:8545 0", - }, -} - -func registerEthereumNodeFlags(cmd *cobra.Command) error { - registerCommonNodeFlags(cmd, false) - cmd.Flags().String("node-role", "peering", "Sets default node arguments. accepted values: peering, dev-miner. See `fireeth help nodes` for more info") - return nil -} - -// flags common to reader and regular node -func registerCommonNodeFlags(cmd *cobra.Command, isReader bool) { - prefix := "node-" - managerAPIAddr := NodeManagerAPIAddr - if isReader { - prefix = "reader-node-" - managerAPIAddr = ReaderNodeManagerAPIAddr - } - - cmd.Flags().String(prefix+"path", "geth", "command that will be launched by the node manager (ignored on type 'dev')") - cmd.Flags().String(prefix+"type", "geth", "one of: ['dev', 'geth','openethereum']") - cmd.Flags().String(prefix+"arguments", "", "If not empty, overrides the list of default node arguments (computed from node type and role). Start with '+' to append to default args instead of replacing. You can use the {public-ip} token, that will be matched against space-separated hostname:IP pairs in PUBLIC_IPS env var, taking hostname from HOSTNAME env var.") - cmd.Flags().String(prefix+"data-dir", "{sf-data-dir}/{node-role}/data", "Directory for node data ({node-role} is either reader, peering or dev-miner)") - cmd.Flags().String(prefix+"ipc-path", "{sf-data-dir}/{node-role}/ipc", "IPC path cannot be more than 64chars on geth") - - cmd.Flags().String(prefix+"manager-api-addr", managerAPIAddr, "Ethereum node manager API address") - cmd.Flags().Duration(prefix+"readiness-max-latency", 30*time.Second, "Determine the maximum head block latency at which the instance will be determined healthy. Some chains have more regular block production than others.") - - cmd.Flags().String(prefix+"bootstrap-data-url", "", "URL (file or gs) to either a genesis.json file or a .tar.zst archive to decompress in the datadir. Only used when bootstrapping (no prior data)") - cmd.Flags().String(prefix+"enforce-peers", "", "Comma-separated list of operator nodes that will be queried for an 'enode' value and added as a peer") - - cmd.Flags().StringSlice(prefix+"backups", []string{}, "Repeatable, space-separated key=values definitions for backups. Example: 'type=gke-pvc-snapshot prefix= tag=v1 freq-blocks=1000 freq-time= project=myproj archive=true'") - - cmd.Flags().Bool(prefix+"log-to-zap", true, "Enable all node logs to transit into node's logger directly, when false, prints node logs directly to stdout") - cmd.Flags().Bool(prefix+"debug-firehose-logs", false, "[DEV] Prints firehose instrumentation logs to standard output, should be use for debugging purposes only") -} - -func parseCommonNodeFlags(appLogger *zap.Logger, sfDataDir string, isReader bool) ( - nodePath string, - networkID string, - nodeType string, - nodeDataDir string, - nodeIPCPath string, - debugDeepMind bool, - logToZap bool, - managerAPIAddress string, - readinessMaxLatency time.Duration, - nodeEnforcePeers string, - bootstrapDataURL string, - backupConfigs []string, - shutdownDelay time.Duration, - nodeArguments []string, - err error, -) { - prefix := "node-" - nodeRole := viper.GetString("node-role") - if isReader { - prefix = "reader-node-" - nodeRole = "reader" - } - - nodePath = viper.GetString(prefix + "path") - networkID = fmt.Sprintf("%d", viper.GetUint32("common-network-id")) - nodeType = viper.GetString(prefix + "type") - nodeDataDir = replaceNodeRole(nodeRole, - MustReplaceDataDir(sfDataDir, viper.GetString(prefix+"data-dir"))) - nodeIPCPath = replaceNodeRole(nodeRole, - MustReplaceDataDir(sfDataDir, viper.GetString(prefix+"ipc-path"))) - debugDeepMind = viper.GetBool(prefix + "debug-firehose-logs") - logToZap = viper.GetBool(prefix + "log-to-zap") - managerAPIAddress = viper.GetString(prefix + "manager-api-addr") - readinessMaxLatency = viper.GetDuration(prefix + "readiness-max-latency") - nodeEnforcePeers = viper.GetString(prefix + "enforce-peers") - bootstrapDataURL = viper.GetString(prefix + "bootstrap-data-url") - backupConfigs = viper.GetStringSlice(prefix + "backups") - shutdownDelay = viper.GetDuration(CommonSystemShutdownSignalDelayFlag) // we reuse this global value - - nodeArguments, err = buildNodeArguments( - appLogger, - sfDataDir, - networkID, - nodeDataDir, - nodeIPCPath, - viper.GetString(prefix+"arguments"), - nodeType, - nodeRole, - bootstrapDataURL, - ) - - return -} - -func buildNodeArguments(appLogger *zap.Logger, dataDir, networkID, nodeDataDir, nodeIPCPath, providedArgs, nodeType, nodeRole, bootstrapDataURL string) ([]string, error) { - zlog.Info("building node arguments", zap.String("node-type", nodeType), zap.String("node-role", nodeRole)) - typeRoles, ok := nodeArgsByTypeAndRole[nodeType] - if !ok { - return nil, fmt.Errorf("invalid node type: %s", nodeType) - } - - args, ok := typeRoles[nodeRole] - if !ok { - return nil, fmt.Errorf("invalid node role: %s for type %s", nodeRole, nodeType) - } - - // This sets `--firehose-genesis-file` if the node role is of type reader - // (for which case we are sure that Firehose patch is supported) and if the bootstrap data - // url is a `genesis.json` file. - if nodeRole == "reader" && isGenesisBootstrapper(bootstrapDataURL) { - args += fmt.Sprintf(" --firehose-genesis-file=%s", bootstrapDataURL) - } - - if providedArgs != "" { - if strings.HasPrefix(providedArgs, "+") { - args += " " + strings.TrimLeft(providedArgs, "+") - } else { - args = providedArgs // discard info provided by node type / role - } - } - - args = strings.Replace(args, "{node-data-dir}", nodeDataDir, -1) - args = strings.Replace(args, "{network-id}", networkID, -1) - args = strings.Replace(args, "{node-ipc-path}", nodeIPCPath, -1) - args = strings.Replace(args, "{data-dir}", dataDir, -1) - - if strings.Contains(args, "{public-ip}") { - var foundPublicIP string - hostname := os.Getenv("HOSTNAME") - publicIPs := os.Getenv("PUBLIC_IPS") // format is PUBLIC_IPS="reader-v3-1:1.2.3.4 backup-node:5.6.7.8" - for _, pairStr := range strings.Fields(publicIPs) { - pair := strings.Split(pairStr, ":") - if len(pair) != 2 { - continue - } - if pair[0] == hostname { - foundPublicIP = pair[1] - } - } - - if foundPublicIP == "" { - appLogger.Warn("cannot find public IP in environment variable PUBLIC_IPS (format: 'HOSTNAME:a.b.c.d HOSTNAME2:e.f.g.h'), using 127.0.0.1 as fallback", zap.String("hostname", hostname)) - foundPublicIP = "127.0.0.1" - } - args = strings.Replace(args, "{public-ip}", foundPublicIP, -1) - } - - return strings.Fields(args), nil -} - -type UpdatableSuperviser interface { - UpdateLastBlockSeen(blockNum uint64) -} - -func buildSuperviser( - metricsAndReadinessManager *nodeManager.MetricsAndReadinessManager, - nodeType string, - nodePath string, - nodeIPCPath string, - nodeDataDir string, - nodeArguments []string, - enforcedPeers string, - appLogger, - supervisedProcessLogger *zap.Logger, - logToZap, - deepMind, - debugDeepMind bool, -) (nodeManager.ChainSuperviser, error) { - - switch nodeType { - case "dev": - superviser, err := dev.NewSuperviser( - nodePath, - nodeArguments, - metricsAndReadinessManager.UpdateHeadBlock, - appLogger, - supervisedProcessLogger, - ) - if err != nil { - return nil, fmt.Errorf("unable to create chain superviser: %w", err) - } - - return superviser, nil - - case "geth": - superviser, err := geth.NewGethSuperviser( - nodePath, - nodeDataDir, - nodeIPCPath, - nodeArguments, - deepMind, - debugDeepMind, - metricsAndReadinessManager.UpdateHeadBlock, - enforcedPeers, - logToZap, - appLogger, - supervisedProcessLogger, - ) - if err != nil { - return nil, fmt.Errorf("unable to create chain superviser: %w", err) - } - - return superviser, nil - - default: - return nil, fmt.Errorf("unsupported node type: %s", nodeType) - } -} - -func buildMetricsAndReadinessManager(name string, maxLatency time.Duration) *nodeManager.MetricsAndReadinessManager { - headBlockTimeDrift := metrics.NewHeadBlockTimeDrift(name) - headBlockNumber := metrics.NewHeadBlockNumber(name) - appReadiness := metrics.NewAppReadiness(name) - - metricsAndReadinessManager := nodeManager.NewMetricsAndReadinessManager( - headBlockTimeDrift, - headBlockNumber, - appReadiness, - maxLatency, - ) - return metricsAndReadinessManager -} - -func buildChainOperator( - superviser nodeManager.ChainSuperviser, - metricsAndReadinessManager *nodeManager.MetricsAndReadinessManager, - shutdownDelay time.Duration, - bootstrapper operator.Bootstrapper, - appLogger *zap.Logger, -) (*operator.Operator, error) { - o, err := operator.New( - appLogger, - superviser, - metricsAndReadinessManager, - &operator.Options{ - ShutdownDelay: shutdownDelay, - EnableSupervisorMonitoring: true, - Bootstrapper: bootstrapper, - }) - - if err != nil { - return nil, fmt.Errorf("unable to create chain operator: %w", err) - } - return o, nil -} - -func replaceNodeRole(nodeRole, in string) string { - return strings.Replace(in, "{node-role}", nodeRole, -1) -} diff --git a/cmd/fireeth/cli/purge.go b/cmd/fireeth/cli/purge.go deleted file mode 100644 index 802d9206..00000000 --- a/cmd/fireeth/cli/purge.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "os" - "strings" - - "github.com/manifoldco/promptui" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var purgeCmd = &cobra.Command{Use: "purge", Short: "Purgeslocal data", RunE: sfPurgeE} - -func init() { - RootCmd.AddCommand(purgeCmd) - purgeCmd.Flags().BoolP("force", "f", false, "Force purging of data without user intervention") -} - -func sfPurgeE(cmd *cobra.Command, args []string) error { - cmd.SilenceUsage = true - - dataDir := viper.GetString("global-data-dir") - - if err := Purge(dataDir); err != nil { - return err - } - - zlog.Info("Purged data. Start a fresh instance with 'fireeth start'") - - return nil -} - -func Purge(dataDir string) error { - purge, err := confirmPurgeAll(dataDir) - if err != nil { - return fmt.Errorf("unable to purge environment %w", err) - } - - if purge { - if err := os.RemoveAll(dataDir); err != nil { - return fmt.Errorf("unable to correcty delete directory %q: %w", dataDir, err) - } - } - - return nil -} - -func confirmPurgeAll(dataDir string) (bool, error) { - if viper.GetBool("force") { - return true, nil - } - - prompt := promptui.Prompt{ - Label: fmt.Sprintf("You are about to delete %q. Are you sure", dataDir), - IsConfirm: true, - } - - result, err := prompt.Run() - - if err != nil { - return false, err - } - return strings.ToLower(result) == "y", nil -} diff --git a/cmd/fireeth/cli/reader-node-stdin.go b/cmd/fireeth/cli/reader-node-stdin.go deleted file mode 100644 index cbc31008..00000000 --- a/cmd/fireeth/cli/reader-node-stdin.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/dlauncher/launcher" - firecore "github.com/streamingfast/firehose-core" - "github.com/streamingfast/firehose-ethereum/codec" - "github.com/streamingfast/logging" - nodeManager "github.com/streamingfast/node-manager" - nodeReaderStdinApp "github.com/streamingfast/node-manager/app/node_reader_stdin" - "github.com/streamingfast/node-manager/metrics" - "github.com/streamingfast/node-manager/mindreader" -) - -func init() { - appLogger, appTracer := logging.PackageLogger("reader-node-stdin", "github.com/streamingfast/firehose-ethereum/reader-node-stdin") - - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "reader-node-stdin", - Title: "Reader Node (stdin)", - Description: "Blocks reading node, unmanaged, reads deep mind from standard input", - RegisterFlags: func(cmd *cobra.Command) error { return nil }, - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - sfDataDir := runtime.AbsDataDir - archiveStoreURL := MustReplaceDataDir(sfDataDir, viper.GetString("common-one-block-store-url")) - - consoleReaderFactory := func(lines chan string) (mindreader.ConsolerReader, error) { - r, err := codec.NewConsoleReader(lines, firecore.NewBlockEncoder(), appLogger, appTracer) - if err != nil { - return nil, fmt.Errorf("initiating console reader: %w", err) - } - - return r, nil - } - - metricID := "reader-geth-node-stdin" - headBlockTimeDrift := metrics.NewHeadBlockTimeDrift(metricID) - headBlockNumber := metrics.NewHeadBlockNumber(metricID) - appReadiness := metrics.NewAppReadiness(metricID) - metricsAndReadinessManager := nodeManager.NewMetricsAndReadinessManager(headBlockTimeDrift, headBlockNumber, appReadiness, viper.GetDuration("reader-node-readiness-max-latency")) - - return nodeReaderStdinApp.New(&nodeReaderStdinApp.Config{ - GRPCAddr: viper.GetString("reader-node-grpc-listen-addr"), - OneBlocksStoreURL: archiveStoreURL, - MindReadBlocksChanCapacity: viper.GetInt("reader-node-blocks-chan-capacity"), - StartBlockNum: viper.GetUint64("reader-node-start-block-num"), - StopBlockNum: viper.GetUint64("reader-node-stop-block-num"), - WorkingDir: MustReplaceDataDir(sfDataDir, viper.GetString("reader-node-working-dir")), - OneBlockSuffix: viper.GetString("reader-node-oneblock-suffix"), - }, &nodeReaderStdinApp.Modules{ - ConsoleReaderFactory: consoleReaderFactory, - MetricsAndReadinessManager: metricsAndReadinessManager, - }, appLogger, appTracer), nil - }, - }) -} diff --git a/cmd/fireeth/cli/reader-node.go b/cmd/fireeth/cli/reader-node.go deleted file mode 100644 index 064d615d..00000000 --- a/cmd/fireeth/cli/reader-node.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "github.com/spf13/cobra" - "github.com/streamingfast/dlauncher/launcher" - "github.com/streamingfast/node-manager/operator" -) - -func registerReaderNodeApp(backupModuleFactories map[string]operator.BackupModuleFactory) { - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "reader-node", - Title: "Ethereum reader Node", - Description: "Ethereum node with built-in operational manager and reader plugin to extract block data", - RegisterFlags: registerReaderNodeFlags, - InitFunc: func(runtime *launcher.Runtime) error { - return nil - }, - FactoryFunc: nodeFactoryFunc(true, backupModuleFactories), - }) -} - -func registerReaderNodeFlags(cmd *cobra.Command) error { - registerCommonNodeFlags(cmd, true) - - cmd.Flags().String("reader-node-grpc-listen-addr", ReaderGRPCAddr, "Address to listen for incoming gRPC requests") - cmd.Flags().String("reader-node-working-dir", "{sf-data-dir}/reader/work", "Path where reader will stores its files") - cmd.Flags().Uint("reader-node-stop-block-num", 0, "Shutdown reader node when we the following 'stop-block-num' has been reached, inclusively.") - cmd.Flags().Int("reader-node-blocks-chan-capacity", 100, "Capacity of the channel holding blocks read by the reader node. Process will shutdown superviser/geth if the channel gets over 90% of that capacity to prevent horrible consequences. Raise this number when processing tiny blocks very quickly") - cmd.Flags().String("reader-node-oneblock-suffix", "default", "Unique identifier for that reader, so that it can produce 'oneblock files' in the same store as another instance without competing for writes.") - - return nil -} diff --git a/cmd/fireeth/cli/relayer.go b/cmd/fireeth/cli/relayer.go deleted file mode 100644 index 8510bfbb..00000000 --- a/cmd/fireeth/cli/relayer.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/dlauncher/launcher" - relayerApp "github.com/streamingfast/relayer/app/relayer" -) - -func init() { - // Relayer - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "relayer", - Title: "Relayer", - Description: "Serves blocks as a stream, with a buffer", - RegisterFlags: func(cmd *cobra.Command) error { - cmd.Flags().String("relayer-grpc-listen-addr", RelayerServingAddr, "Address to listen for incoming gRPC requests") - cmd.Flags().StringSlice("relayer-source", []string{ReaderGRPCAddr}, "List of Blockstream sources (reader-nodes) to connect to for live block feeds (repeat flag as needed)") - cmd.Flags().Duration("relayer-max-source-latency", 999999*time.Hour, "Max latency tolerated to connect to a source. A performance optimization for when you have redundant sources and some may not have caught up") - return nil - }, - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - _, oneBlocksStoreURL, _, err := getCommonStoresURLs(runtime.AbsDataDir) - if err != nil { - return nil, err - } - return relayerApp.New(&relayerApp.Config{ - SourceRequestBurst: 1, - SourcesAddr: viper.GetStringSlice("relayer-source"), - OneBlocksURL: oneBlocksStoreURL, - GRPCListenAddr: viper.GetString("relayer-grpc-listen-addr"), - MaxSourceLatency: viper.GetDuration("relayer-max-source-latency"), - }), nil - }, - }) -} diff --git a/cmd/fireeth/cli/setup.go b/cmd/fireeth/cli/setup.go deleted file mode 100644 index 74dc7f54..00000000 --- a/cmd/fireeth/cli/setup.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - _ "net/http/pprof" - "os" - "strings" - - "github.com/spf13/viper" - dgrpcstandard "github.com/streamingfast/dgrpc/server/standard" - "github.com/streamingfast/dlauncher/launcher" -) - -func init() { - dgrpcstandard.Verbosity = 2 -} - -func setupCmd(cmd *cobra.Command) error { - cmd.SilenceUsage = true - - bstream.GetProtocolFirstStreamableBlock = uint64(viper.GetInt("common-first-streamable-block")) - - cmds := extractCmd(cmd) - subCommand := cmds[len(cmds)-1] - - forceConfigOn := []*cobra.Command{StartCmd} - logToFileOn := []*cobra.Command{StartCmd} - - if configFile := viper.GetString("global-config-file"); configFile != "" { - exists, err := fileExists(configFile) - if err != nil { - return fmt.Errorf("unable to check if config file exists: %w", err) - } - - if !exists && isMatchingCommand(cmds, forceConfigOn) { - return fmt.Errorf("Config file %q not found. Did you 'fireeth init'?", configFile) - } - - if exists { - if err := launcher.LoadConfigFile(configFile); err != nil { - return fmt.Errorf("unable to read config file %q: %w", configFile, err) - } - } - } - - subconf := launcher.Config[subCommand] - if subconf != nil { - for k, v := range subconf.Flags { - validFlag := false - if _, ok := allFlags["global-"+k]; ok { - viper.SetDefault("global-"+k, v) - validFlag = true - } - if _, ok := allFlags[k]; ok { - viper.SetDefault(k, v) - validFlag = true - } - if !validFlag { - return fmt.Errorf("invalid flag %s in config file under command %s", k, subCommand) - } - } - } - - launcher.SetupLogger(zlog, &launcher.LoggingOptions{ - WorkingDir: viper.GetString("global-data-dir"), - // We add +1 so our default verbosity is to show all packages in INFO mode - Verbosity: viper.GetInt("global-verbose") + 1, - LogFormat: viper.GetString("global-log-format"), - LogToFile: isMatchingCommand(cmds, logToFileOn) && viper.GetBool("global-log-to-file"), - LogListenAddr: viper.GetString("global-log-level-switcher-listen-addr"), - LogToStderr: true, - }) - launcher.SetupAnalyticsMetrics(zlog, viper.GetString("global-metrics-listen-addr"), viper.GetString("global-pprof-listen-addr")) - if viper.GetBool(CommonAutoMaxProcsFlag) { - launcher.SetAutoMaxProcs(zlog) - } - launcher.SetAutoMemoryLimit(viper.GetUint64(CommonAutoMemLimitFlag), zlog) - - return nil -} - -func isMatchingCommand(cmds []string, runSetupOn []*cobra.Command) bool { - for _, c := range runSetupOn { - baseChunks := extractCmd(c) - if strings.Join(cmds, ".") == strings.Join(baseChunks, ".") { - return true - } - } - return false -} - -func extractCmd(cmd *cobra.Command) []string { - cmds := []string{} - for { - if cmd == nil { - break - } - cmds = append(cmds, cmd.Use) - cmd = cmd.Parent() - } - - out := make([]string, len(cmds)) - - for itr, v := range cmds { - newIndex := len(cmds) - 1 - itr - out[newIndex] = v - } - return out -} - -func fileExists(file string) (bool, error) { - stat, err := os.Stat(file) - if os.IsNotExist(err) { - return false, nil - } - - if err != nil { - return false, err - } - - return !stat.IsDir(), nil -} diff --git a/cmd/fireeth/cli/start.go b/cmd/fireeth/cli/start.go deleted file mode 100644 index d4e61ec1..00000000 --- a/cmd/fireeth/cli/start.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/bstream" - dauthgrpc "github.com/streamingfast/dauth/grpc" - dauthnull "github.com/streamingfast/dauth/null" - dauthsecret "github.com/streamingfast/dauth/secret" - dauthtrust "github.com/streamingfast/dauth/trust" - dmeteringgrpc "github.com/streamingfast/dmetering/grpc" - dmeteringlogger "github.com/streamingfast/dmetering/logger" - - "github.com/streamingfast/derr" - "github.com/streamingfast/dlauncher/launcher" - "github.com/streamingfast/dmetering" - tracing "github.com/streamingfast/sf-tracing" - "go.uber.org/zap" -) - -var StartCmd = &cobra.Command{Use: "start", Short: "Starts Ethereum on StreamingFast services all at once", RunE: sfStartE, Args: cobra.ArbitraryArgs} - -func init() { - RootCmd.AddCommand(StartCmd) - dauthgrpc.Register() - dauthtrust.Register() - dauthnull.Register() - dauthsecret.Register() - - dmeteringgrpc.Register() - dmeteringlogger.Register() - dmetering.RegisterNull() -} - -func sfStartE(cmd *cobra.Command, args []string) (err error) { - cmd.SilenceUsage = true - - dataDir := viper.GetString("global-data-dir") - zlog.Debug("fireeth binary started", zap.String("data_dir", dataDir)) - - configFile := viper.GetString("global-config-file") - zlog.Info(fmt.Sprintf("starting with config file '%s'", configFile)) - - if err := Start(cmd.Context(), dataDir, args); err != nil { - return err - } - - zlog.Info("goodbye") - return nil -} - -func Start(ctx context.Context, dataDir string, args []string) (err error) { - - devMode := viper.GetBool("dev") - if devMode { - viper.Set("reader-node-type", "dev") - viper.Set("reader-node-path", os.Args[0]) - // viper.Set("reader-node-arguments", "tools poll-rpc-blocks http://localhost:8545 0") // set in node-type template 'dev' - } - - dataDirAbs, err := filepath.Abs(dataDir) - if err != nil { - return fmt.Errorf("unable to setup directory structure: %w", err) - } - - err = makeDirs([]string{dataDirAbs}) - if err != nil { - return err - } - - bstream.GetProtocolFirstStreamableBlock = uint64(viper.GetInt("common-first-streamable-block")) - modules := &launcher.Runtime{ - AbsDataDir: dataDirAbs, - ProtocolSpecificModules: map[string]interface{}{}, - } - - blocksCacheEnabled := viper.GetBool("common-blocks-cache-enabled") - if blocksCacheEnabled { - bstream.GetBlockPayloadSetter = bstream.ATMCachedPayloadSetter - - cacheDir := MustReplaceDataDir(modules.AbsDataDir, viper.GetString("common-blocks-cache-dir")) - storeUrl := MustReplaceDataDir(modules.AbsDataDir, viper.GetString("common-merged-blocks-store-url")) - maxRecentEntryBytes := viper.GetInt("common-blocks-cache-max-recent-entry-bytes") - maxEntryByAgeBytes := viper.GetInt("common-blocks-cache-max-entry-by-age-bytes") - bstream.InitCache(storeUrl, cacheDir, maxRecentEntryBytes, maxEntryByAgeBytes) - } - - if registerCommonModulesCallback != nil { - zlog.Debug("invoking register common modules callback since it's set") - if err := registerCommonModulesCallback(modules); err != nil { - return fmt.Errorf("register common modules: %w", err) - } - } - - err = bstream.ValidateRegistry() - if err != nil { - return fmt.Errorf("protocol specific hooks not configured correctly: %w", err) - } - - eventEmitter, err := dmetering.New(viper.GetString("common-metering-plugin"), zlog) - if err != nil { - return fmt.Errorf("unable to initialize dmetering: %w", err) - } - defer func() { - eventEmitter.Shutdown(nil) - }() - dmetering.SetDefaultEmitter(eventEmitter) - - launch := launcher.NewLauncher(zlog, modules) - zlog.Debug("launcher created") - runByDefault := func(app string) bool { - switch app { - case "node": - return !devMode - case "reader-node-stdin": - return false - } - return true - } - - apps := launcher.ParseAppsFromArgs(args, runByDefault) - if len(args) == 0 && launcher.Config["start"] != nil { - apps = launcher.ParseAppsFromArgs(launcher.Config["start"].Args, runByDefault) - } - if err := setupTracing(ctx, apps); err != nil { - return fmt.Errorf("failed to setup tracing: %w", err) - } - - zlog.Info(fmt.Sprintf("launching applications: %s", strings.Join(apps, ","))) - if err = launch.Launch(apps); err != nil { - return err - } - - printWelcomeMessage(apps) - - signalHandler := derr.SetupSignalHandler(viper.GetDuration(CommonSystemShutdownSignalDelayFlag)) - select { - case <-signalHandler: - zlog.Info("received termination signal, quitting") - go launch.Close() - case appID := <-launch.Terminating(): - if launch.Err() == nil { - zlog.Info(fmt.Sprintf("application %s triggered a clean shutdown, quitting", appID)) - } else { - zlog.Info(fmt.Sprintf("application %s shutdown unexpectedly, quitting", appID)) - err = launch.Err() - } - } - - launch.WaitForTermination() - - return -} - -func setupTracing(ctx context.Context, apps []string) error { - serviceName := "fireeth" - if len(apps) == 1 { - serviceName = serviceName + "/" + apps[0] - } - return tracing.SetupOpenTelemetry(ctx, serviceName) -} - -func printWelcomeMessage(apps []string) { - hasDashboard := containsApp(apps, "dashboard") - hasAPIProxy := containsApp(apps, "apiproxy") - if !hasDashboard && !hasAPIProxy { - // No welcome message to print, advanced usage - return - } - - zlog.Info("your instance should be ready in a few seconds") -} - -func containsApp(apps []string, searchedApp string) bool { - for _, app := range apps { - if app == searchedApp { - return true - } - } - - return false -} diff --git a/cmd/fireeth/cli/substreams-tier1.go b/cmd/fireeth/cli/substreams-tier1.go deleted file mode 100644 index ae269da2..00000000 --- a/cmd/fireeth/cli/substreams-tier1.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "net/url" - "os" - "sync" - "time" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/streamingfast/dauth" - discoveryservice "github.com/streamingfast/dgrpc/server/discovery-service" - "github.com/streamingfast/dlauncher/launcher" - ethss "github.com/streamingfast/firehose-ethereum/substreams" - "github.com/streamingfast/logging" - app "github.com/streamingfast/substreams/app" - "github.com/streamingfast/substreams/pipeline" - "github.com/streamingfast/substreams/wasm" -) - -var ss1HeadBlockNumMetric = metricset.NewHeadBlockNumber("substreams-tier1") -var ss1HeadTimeDriftmetric = metricset.NewHeadTimeDrift("substreams-tier1") - -var registerSSOnce sync.Once - -func registerCommonSubstreamsFlags(cmd *cobra.Command) { - registerSSOnce.Do(func() { - cmd.Flags().Uint64("substreams-state-bundle-size", uint64(1_000), "Interval in blocks at which to save store snapshots and output caches") - cmd.Flags().String("substreams-state-store-url", "{sf-data-dir}/localdata", "where substreams state data are stored") - cmd.Flags().String("substreams-state-store-default-tag", "", "If non-empty, will be appended to {substreams-state-store-url} (ex: 'v1'). Can be overriden per-request with 'X-Sf-Substreams-Cache-Tag' header") - cmd.Flags().StringArray("substreams-rpc-endpoints", nil, "Remote endpoints to contact to satisfy Substreams 'eth_call's") - cmd.Flags().String("substreams-rpc-cache-store-url", "{sf-data-dir}/rpc-cache", "where rpc cache will be store call responses") - cmd.Flags().Uint64("substreams-rpc-cache-chunk-size", uint64(1_000), "RPC cache chunk size in block") - }) -} - -func init() { - appLogger, _ := logging.PackageLogger("substreams-tier1", "github.com/streamingfast/firehose-ethereum/substreams-tier1") - - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "substreams-tier1", - Title: "Substreams tier1 server", - Description: "Provides a substreams grpc endpoint", - RegisterFlags: func(cmd *cobra.Command) error { - cmd.Flags().String("substreams-tier1-grpc-listen-addr", SubstreamsTier1GRPCServingAddr, "Address on which the substreams tier1 will listen. Default is plain-text, appending a '*' to the end") - cmd.Flags().String("substreams-tier1-subrequests-endpoint", SubstreamsTier2GRPCServingAddr, "Address on which the tier1 can reach the tier2") - - // communication with tier2 - cmd.Flags().String("substreams-tier1-discovery-service-url", "", "URL to configure the grpc discovery service, used for communication with tier2") //traffic-director://xds?vpc_network=vpc-global&use_xds_reds=true - cmd.Flags().Bool("substreams-tier1-subrequests-insecure", false, "Connect to tier2 without checking certificate validity") - cmd.Flags().Bool("substreams-tier1-subrequests-plaintext", true, "Connect to tier2 without client in plaintext mode") - cmd.Flags().Int("substreams-tier1-max-subrequests", 4, "number of parallel subrequests that the tier1 can make to the tier2 per request") - - // all substreams - registerCommonSubstreamsFlags(cmd) - return nil - }, - - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - blockstreamAddr := viper.GetString("common-live-blocks-addr") - - authenticator, err := dauth.New(viper.GetString("common-auth-plugin"), appLogger) - if err != nil { - return nil, fmt.Errorf("unable to initialize dauth: %w", err) - } - - mergedBlocksStoreURL, oneBlocksStoreURL, forkedBlocksStoreURL, err := getCommonStoresURLs(runtime.AbsDataDir) - if err != nil { - return nil, err - } - - sfDataDir := runtime.AbsDataDir - - rawServiceDiscoveryURL := viper.GetString("substreams-tier1-discovery-service-url") - grpcListenAddr := viper.GetString("substreams-tier1-grpc-listen-addr") - - rpcEndpoints := viper.GetStringSlice("substreams-rpc-endpoints") - rpcCacheStoreURL := MustReplaceDataDir(sfDataDir, viper.GetString("substreams-rpc-cache-store-url")) - rpcCacheChunkSize := viper.GetUint64("substreams-rpc-cache-chunk-size") - - stateStoreURL := MustReplaceDataDir(sfDataDir, viper.GetString("substreams-state-store-url")) - stateStoreDefaultTag := viper.GetString("substreams-state-store-default-tag") - stateBundleSize := viper.GetUint64("substreams-state-bundle-size") - - subrequestsEndpoint := viper.GetString("substreams-tier1-subrequests-endpoint") - subrequestsInsecure := viper.GetBool("substreams-tier1-subrequests-insecure") - subrequestsPlaintext := viper.GetBool("substreams-tier1-subrequests-plaintext") - maxSubrequests := viper.GetUint64("substreams-tier1-max-subrequests") - - tracing := os.Getenv("SUBSTREAMS_TRACING") == "modules_exec" - - var serviceDiscoveryURL *url.URL - if rawServiceDiscoveryURL != "" { - serviceDiscoveryURL, err = url.Parse(rawServiceDiscoveryURL) - if err != nil { - return nil, fmt.Errorf("unable to parse discovery service url: %w", err) - } - err = discoveryservice.Bootstrap(serviceDiscoveryURL) - if err != nil { - return nil, fmt.Errorf("unable to bootstrap discovery service: %w", err) - } - } - - for i, endpoint := range rpcEndpoints { - rpcEndpoints[i] = os.ExpandEnv(endpoint) - } - - rpcEngine, err := ethss.NewRPCEngine( - rpcCacheStoreURL, - rpcEndpoints, - rpcCacheChunkSize, - ) - if err != nil { - return nil, fmt.Errorf("setting up Ethereum rpc engine and cache: %w", err) - } - - return app.NewTier1(appLogger, - &app.Tier1Config{ - MergedBlocksStoreURL: mergedBlocksStoreURL, - OneBlocksStoreURL: oneBlocksStoreURL, - ForkedBlocksStoreURL: forkedBlocksStoreURL, - BlockStreamAddr: blockstreamAddr, - - StateStoreURL: stateStoreURL, - StateStoreDefaultTag: stateStoreDefaultTag, - StateBundleSize: stateBundleSize, - BlockType: "sf.ethereum.type.v2.Block", - MaxSubrequests: maxSubrequests, - SubrequestsEndpoint: subrequestsEndpoint, - SubrequestsInsecure: subrequestsInsecure, - SubrequestsPlaintext: subrequestsPlaintext, - - WASMExtensions: []wasm.WASMExtensioner{rpcEngine}, - PipelineOptions: []pipeline.PipelineOptioner{rpcEngine}, - - Tracing: tracing, - - GRPCListenAddr: grpcListenAddr, - GRPCShutdownGracePeriod: time.Second, - ServiceDiscoveryURL: serviceDiscoveryURL, - }, &app.Tier1Modules{ - Authenticator: authenticator, - HeadTimeDriftMetric: ss1HeadTimeDriftmetric, - HeadBlockNumberMetric: ss1HeadBlockNumMetric, - }), nil - }, - }) -} diff --git a/cmd/fireeth/cli/substreams-tier2.go b/cmd/fireeth/cli/substreams-tier2.go deleted file mode 100644 index f8f4b71f..00000000 --- a/cmd/fireeth/cli/substreams-tier2.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "net/url" - "os" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - discoveryservice "github.com/streamingfast/dgrpc/server/discovery-service" - "github.com/streamingfast/dlauncher/launcher" - ethss "github.com/streamingfast/firehose-ethereum/substreams" - "github.com/streamingfast/logging" - app "github.com/streamingfast/substreams/app" - "github.com/streamingfast/substreams/pipeline" - "github.com/streamingfast/substreams/wasm" -) - -var ss2HeadBlockNumMetric = metricset.NewHeadBlockNumber("substreams-tier2") -var ss2HeadTimeDriftmetric = metricset.NewHeadTimeDrift("substreams-tier2") - -func init() { - appLogger, _ := logging.PackageLogger("substreams-tier2", "github.com/streamingfast/firehose-ethereum/substreams-tier2") - - launcher.RegisterApp(zlog, &launcher.AppDef{ - ID: "substreams-tier2", - Title: "Substreams tier2 server", - Description: "Provides a substreams grpc endpoint", - RegisterFlags: func(cmd *cobra.Command) error { - cmd.Flags().String("substreams-tier2-grpc-listen-addr", SubstreamsTier2GRPCServingAddr, "Address on which the substreams tier2 will listen. Default is plain-text, appending a '*' to the end") - cmd.Flags().String("substreams-tier2-discovery-service-url", "", "URL to advertise presence to the grpc discovery service") //traffic-director://xds?vpc_network=vpc-global&use_xds_reds=true - - // all substreams - registerCommonSubstreamsFlags(cmd) - return nil - }, - - FactoryFunc: func(runtime *launcher.Runtime) (launcher.App, error) { - - mergedBlocksStoreURL, _, _, err := getCommonStoresURLs(runtime.AbsDataDir) - if err != nil { - return nil, err - } - - sfDataDir := runtime.AbsDataDir - - rawServiceDiscoveryURL := viper.GetString("substreams-tier2-discovery-service-url") - grpcListenAddr := viper.GetString("substreams-tier2-grpc-listen-addr") - - rpcEndpoints := viper.GetStringSlice("substreams-rpc-endpoints") - rpcCacheStoreURL := MustReplaceDataDir(sfDataDir, viper.GetString("substreams-rpc-cache-store-url")) - rpcCacheChunkSize := viper.GetUint64("substreams-rpc-cache-chunk-size") - - stateStoreURL := MustReplaceDataDir(sfDataDir, viper.GetString("substreams-state-store-url")) - stateStoreDefaultTag := viper.GetString("substreams-state-store-default-tag") - stateBundleSize := viper.GetUint64("substreams-state-bundle-size") - - tracing := os.Getenv("SUBSTREAMS_TRACING") == "modules_exec" - - var serviceDiscoveryURL *url.URL - if rawServiceDiscoveryURL != "" { - serviceDiscoveryURL, err = url.Parse(rawServiceDiscoveryURL) - if err != nil { - return nil, fmt.Errorf("unable to parse discovery service url: %w", err) - } - err = discoveryservice.Bootstrap(serviceDiscoveryURL) - if err != nil { - return nil, fmt.Errorf("unable to bootstrap discovery service: %w", err) - } - } - - for i, endpoint := range rpcEndpoints { - rpcEndpoints[i] = os.ExpandEnv(endpoint) - } - - rpcEngine, err := ethss.NewRPCEngine( - rpcCacheStoreURL, - rpcEndpoints, - rpcCacheChunkSize, - ) - if err != nil { - return nil, fmt.Errorf("setting up Ethereum rpc engine and cache: %w", err) - } - - return app.NewTier2(appLogger, - &app.Tier2Config{ - MergedBlocksStoreURL: mergedBlocksStoreURL, - - StateStoreURL: stateStoreURL, - StateStoreDefaultTag: stateStoreDefaultTag, - StateBundleSize: stateBundleSize, - BlockType: "sf.ethereum.type.v2.Block", - - WASMExtensions: []wasm.WASMExtensioner{rpcEngine}, - PipelineOptions: []pipeline.PipelineOptioner{rpcEngine}, - - Tracing: tracing, - - GRPCListenAddr: grpcListenAddr, - ServiceDiscoveryURL: serviceDiscoveryURL, - }), nil - }, - }) -} diff --git a/cmd/fireeth/cli/tools.go b/cmd/fireeth/cli/tools.go deleted file mode 100644 index 5cb315ff..00000000 --- a/cmd/fireeth/cli/tools.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import "github.com/streamingfast/firehose-ethereum/tools" - -func init() { - RootCmd.AddCommand(tools.Cmd) -} diff --git a/cmd/fireeth/cli/utils.go b/cmd/fireeth/cli/utils.go deleted file mode 100644 index 04aa1131..00000000 --- a/cmd/fireeth/cli/utils.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/lithammer/dedent" - "github.com/logrusorgru/aurora" - "github.com/spf13/viper" - "github.com/streamingfast/dstore" - "github.com/streamingfast/logging" - "go.uber.org/zap" -) - -var DefaultLevelInfo = logging.LoggerDefaultLevel(zap.InfoLevel) - -// MustReplaceDataDir is used in sf-ethereum-priv -func MustReplaceDataDir(dataDir, in string) string { - d, err := filepath.Abs(dataDir) - if err != nil { - panic(fmt.Errorf("file path abs: %w", err)) - } - - in = strings.Replace(in, "{sf-data-dir}", d, -1) - return in -} - -var commonStoresCreated bool -var indexStoreCreated bool - -func mustGetCommonStoresURLs(dataDir string) (mergedBlocksStoreURL, oneBlocksStoreURL, forkedBlocksStoreURL string) { - var err error - mergedBlocksStoreURL, oneBlocksStoreURL, forkedBlocksStoreURL, err = getCommonStoresURLs(dataDir) - if err != nil { - panic(err) - } - - return -} - -func getCommonStoresURLs(dataDir string) (mergedBlocksStoreURL, oneBlocksStoreURL, forkedBlocksStoreURL string, err error) { - mergedBlocksStoreURL = MustReplaceDataDir(dataDir, viper.GetString("common-merged-blocks-store-url")) - oneBlocksStoreURL = MustReplaceDataDir(dataDir, viper.GetString("common-one-block-store-url")) - forkedBlocksStoreURL = MustReplaceDataDir(dataDir, viper.GetString("common-forked-blocks-store-url")) - - if commonStoresCreated { - return - } - - if err = mkdirStorePathIfLocal(forkedBlocksStoreURL); err != nil { - return - } - if err = mkdirStorePathIfLocal(oneBlocksStoreURL); err != nil { - return - } - if err = mkdirStorePathIfLocal(mergedBlocksStoreURL); err != nil { - return - } - commonStoresCreated = true - return -} - -func GetIndexStore(dataDir string) (indexStore dstore.Store, possibleIndexSizes []uint64, err error) { - indexStoreURL := MustReplaceDataDir(dataDir, viper.GetString("common-index-store-url")) - - if indexStoreURL != "" { - s, err := dstore.NewStore(indexStoreURL, "", "", false) - if err != nil { - return nil, nil, fmt.Errorf("couldn't create index store: %w", err) - } - if !indexStoreCreated { - if err = mkdirStorePathIfLocal(indexStoreURL); err != nil { - return nil, nil, err - } - } - indexStoreCreated = true - indexStore = s - } - - for _, size := range viper.GetIntSlice("common-block-index-sizes") { - if size < 0 { - return nil, nil, fmt.Errorf("invalid negative size for common-block-index-sizes: %d", size) - } - possibleIndexSizes = append(possibleIndexSizes, uint64(size)) - } - return -} - -func mkdirStorePathIfLocal(storeURL string) (err error) { - if dirs := getDirsToMake(storeURL); len(dirs) > 0 { - zlog.Debug("creating directory and its parent(s)", zap.String("directory", storeURL)) - err = makeDirs(dirs) - } - return -} - -func getDirsToMake(storeURL string) []string { - parts := strings.Split(storeURL, "://") - if len(parts) > 1 { - if parts[0] != "file" { - // Not a local store, nothing to do - return nil - } - storeURL = parts[1] - } - - // Some of the store URL are actually a file directly, let's try our best to cope for that case - filename := filepath.Base(storeURL) - if strings.Contains(filename, ".") { - storeURL = filepath.Dir(storeURL) - } - - // If we reach here, it's a local store path - return []string{storeURL} -} - -func makeDirs(directories []string) error { - for _, directory := range directories { - err := os.MkdirAll(directory, 0755) - if err != nil { - return fmt.Errorf("failed to create directory %q: %w", directory, err) - } - } - - return nil -} - -func dfuseAbsoluteDataDir() (string, error) { - return filepath.Abs(viper.GetString("global-data-dir")) -} - -//var gethVersionRegexp = regexp.MustCompile("Version: ([0-9]+)\\.([0-9]+)\\.([0-9]+)(-(.*))?") -//var deepMindFlagRegexp = regexp.MustCompile(regexp.QuoteMeta("--firehose-enabled")) -// -//type gethVersion struct { -// full string -// -// major int -// minor int -// patch int -// suffix string -// -// hasDeepMind bool -//} -// -//// NewGethVersionFromSystem runs the `geth` binary found in `PATH` enviornment -//// variable and extract the version from it. -//func newGethVersionFromSystem() (out gethVersion, err error) { -// cmd := exec.Command(viper.GetString("global-node-path"), "version") -// versionStdout, err := cmd.Output() -// if err != nil { -// err = fmt.Errorf("unable to run command %q: %w", cmd.String(), err) -// return -// } -// -// cmd = exec.Command(viper.GetString("global-node-path"), "--help") -// helpStdout, err := cmd.Output() -// if err != nil { -// err = fmt.Errorf("unable to run command %q: %w", cmd.String(), err) -// return -// } -// -// return newGethVersionFromString(string(versionStdout), string(helpStdout)) -//} -// -//// NewGethVersionFromString parsed the received string and return a structured object -//// representing the version information. -//func newGethVersionFromString(version string, help string) (out gethVersion, err error) { -// matches := gethVersionRegexp.FindAllStringSubmatch(version, -1) -// if len(matches) == 0 { -// err = fmt.Errorf("unable to parse version %q, expected to match %s", version, gethVersionRegexp) -// return -// } -// -// zlog.Debug("geth version regexp matched", zap.Reflect("matches", matches)) -// -// // We don't care for multiple matches for now -// match := matches[0] -// -// // We skip the errors since the regex match only digits on those groups -// out.major, _ = strconv.Atoi(match[1]) -// out.minor, _ = strconv.Atoi(match[2]) -// out.patch, _ = strconv.Atoi(match[3]) -// -// if len(match) >= 5 { -// out.suffix = match[5] -// } -// -// out.full = fmt.Sprintf("%d.%d.%d", out.major, out.minor, out.patch) -// if out.suffix != "" { -// out.full += "-" + out.suffix -// } -// -// matches = deepMindFlagRegexp.FindAllStringSubmatch(help, -1) -// out.hasDeepMind = len(matches) > 0 -// -// return -//} -// -//func (v gethVersion) String() string { -// return v.full -//} -// -//func (v gethVersion) supportsDeepMind(deepMindMajor int) bool { -// // FIXME: We have not implemented version checking yet -// return v.hasDeepMind -//} -// -//func checkGethVersionOrExit() { -// -// version, err := newGethVersionFromSystem() -// if err != nil { -// zlog.Debug("unable to extract geth version from system", zap.Error(err)) -// cliErrorAndExit(dedentf(` -// We were unable to detect "geth" version on your system. This can be due to -// one of the following reasons: -// - You don't have "geth" installed on your system -// - It's installed but no referred by your PATH environment variable, so we did not find it -// - It's installed but execution of "geth version" or "geth --help" failed -// -// Make sure you have a Firehose instrumented 'geth' binary, follow instructions -// at https://github.com/streamingfast/firehose-ethereum/blob/develop/DEPENDENCIES.md#firehose-instrumented-ethereum-prebuilt-binaries -// to find how to install it. -// -// If you have your Firehose instrumented 'geth' binary outside your PATH, use --geth-path= -// argument to specify path to it. -// -// If you think this is a mistake, you can re-run this command adding --skip-checks, which -// will not perform this check. -// `)) -// } -// -// if !version.supportsDeepMind(12) { -// cliErrorAndExit(dedentf(` -// The "geth" binary found on your system with version %s does not seem to be a Firehose -// instrumented binary. Maybe your Firehose instrumented 'geth' binary is not in your -// PATH environment variable? -// -// Make sure you have a Firehose instrumented 'geth' binary, follow instructions -// at https://github.com/streamingfast/firehose-ethereum/blob/develop/DEPENDENCIES.md#firehose-instrumented-ethereum-prebuilt-binaries -// to find how to install it. -// -// If you have your Firehose instrumented 'geth' binary outside your PATH, use --geth-path= -// argument to specify path to it. -// -// If you think this is a mistake, you can re-run this command adding --skip-checks, which -// will not perform this check. -// `, version)) -// } -//} - -func cliErrorAndExit(message string) { - fmt.Println(aurora.Red(message).String()) - os.Exit(1) -} - -func dedentf(format string, args ...interface{}) string { - return fmt.Sprintf(dedent.Dedent(strings.TrimPrefix(format, "\n")), args...) -} diff --git a/cmd/fireeth/cli/utils_test.go b/cmd/fireeth/cli/utils_test.go deleted file mode 100644 index 47223009..00000000 --- a/cmd/fireeth/cli/utils_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 cli - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -//"/storage/megered-blocks" -//:// -> assume passit dreiclty -//NO -> "/" directly -//relative + datadir - -func Test_getDirsToMake(t *testing.T) { - tests := []struct { - name string - storeURL string - expectDirs []string - }{ - { - name: "google storage path", - storeURL: "gs://test-bucket/eos-local/v1", - expectDirs: nil, - }, - { - name: "relative local path", - storeURL: "myapp/blocks", - expectDirs: []string{"myapp/blocks"}, - }, - { - name: "absolute local path", - storeURL: "/data/myapp/blocks", - expectDirs: []string{"/data/myapp/blocks"}, - }, - } - - for _, test := range tests { - t.Run(t.Name(), func(t *testing.T) { - assert.Equal(t, test.expectDirs, getDirsToMake(test.storeURL)) - }) - } - -} diff --git a/cmd/fireeth/main.go b/cmd/fireeth/main.go index d9185272..18fa0330 100644 --- a/cmd/fireeth/main.go +++ b/cmd/fireeth/main.go @@ -59,11 +59,13 @@ var Chain = &firecore.Chain[*pbeth.Block]{ Tools: &firecore.ToolsConfig[*pbeth.Block]{ BlockPrinter: printBlock, - RegisterExtraCmd: func(_ *firecore.Chain[*pbeth.Block], toolsCmd *cobra.Command, zlog *zap.Logger, _ logging.Tracer) error { - toolsCmd.AddCommand(compareOneblockRPCCmd) - toolsCmd.AddCommand(newCompareBlocksRPCCmd(zlog)) - toolsCmd.AddCommand(newFixPolygonIndexCmd(zlog)) - toolsCmd.AddCommand(newPollRPCBlocksCmd(zlog)) + RegisterExtraCmd: func(chain *firecore.Chain[*pbeth.Block], parent *cobra.Command, zlog *zap.Logger, tracer logging.Tracer) error { + parent.AddCommand(compareOneblockRPCCmd) + parent.AddCommand(newCompareBlocksRPCCmd(zlog)) + parent.AddCommand(newFixPolygonIndexCmd(zlog)) + parent.AddCommand(newPollRPCBlocksCmd(zlog)) + + registerGethEnforcePeersCmd(parent, chain.BinaryName(), zlog, tracer) return nil }, diff --git a/cmd/fireeth/tools.go b/cmd/fireeth/tools.go index 4c9bd3a1..0c16a96a 100644 --- a/cmd/fireeth/tools.go +++ b/cmd/fireeth/tools.go @@ -5,6 +5,7 @@ import ( "fmt" "io" + "github.com/spf13/cobra" "github.com/streamingfast/bstream" "github.com/streamingfast/cli" firecore "github.com/streamingfast/firehose-core" @@ -36,6 +37,10 @@ func printBlock(blk *bstream.Block, alsoPrintTransactions bool, out io.Writer) e return nil } -func ExamplePrefixed(prefix, examples string) string { +func examplePrefixed(prefix, examples string) string { return string(cli.ExamplePrefixed(prefix, examples)) } + +func registerGroup(parent *cobra.Command, group cli.CommandOption) { + group.Apply(parent) +} diff --git a/cmd/fireeth/tools_compare_blocks_rpc.go b/cmd/fireeth/tools_compare_blocks_rpc.go index 145e5115..d5d19231 100644 --- a/cmd/fireeth/tools_compare_blocks_rpc.go +++ b/cmd/fireeth/tools_compare_blocks_rpc.go @@ -42,12 +42,6 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) -func init() { - - //compareBlocksRPCCmd.PersistentFlags().String("write-rpc-cache", "compared-rpc-blocks.jsonl", "When non-empty, the results of the RPC calls will be appended to this JSONL file") - //compareBlocksRPCCmd.PersistentFlags().String("read-rpc-cache", "compared-rpc-blocks.jsonl", "When non-empty, this file will be parsed before doing any RPC calls") -} - func newCompareBlocksRPCCmd(logger *zap.Logger) *cobra.Command { cmd := &cobra.Command{ Use: "compare-blocks-rpc ", @@ -57,7 +51,7 @@ func newCompareBlocksRPCCmd(logger *zap.Logger) *cobra.Command { `), Args: cobra.ExactArgs(4), RunE: createCompareBlocksRPCE(logger), - Example: ExamplePrefixed("fireeth tools compare-blocks-rpc", ` + Example: examplePrefixed("fireeth tools compare-blocks-rpc", ` # Run over full block range mainnet.eth.streamingfast.io:443 http://localhost:8545 1000000 1001000 `), diff --git a/cmd/fireeth/tools_compare_oneblock_rpc.go b/cmd/fireeth/tools_compare_oneblock_rpc.go index 3518c918..bc9e82ec 100644 --- a/cmd/fireeth/tools_compare_oneblock_rpc.go +++ b/cmd/fireeth/tools_compare_oneblock_rpc.go @@ -34,13 +34,12 @@ var compareOneblockRPCCmd = &cobra.Command{ `), Args: cobra.ExactArgs(2), RunE: compareOneblockRPCE, - Example: ExamplePrefixed("fireeth tools compare-oneblock-rpc", ` + Example: examplePrefixed("fireeth tools compare-oneblock-rpc", ` /path/to/oneblocks/0046904064-0061a308bf12bc2e-5b6ef5eed4e06d5b-46903864-default.dbin.zst http://localhost:8545 `), } func compareOneblockRPCE(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() filepath := args[0] rpcEndpoint := args[1] diff --git a/cmd/fireeth/tools_geth_enforce_peers.go b/cmd/fireeth/tools_geth_enforce_peers.go new file mode 100644 index 00000000..58546d8d --- /dev/null +++ b/cmd/fireeth/tools_geth_enforce_peers.go @@ -0,0 +1,431 @@ +// Copyright 2021 dfuse Platform Inc. +// +// 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 main + +import ( + "bufio" + "fmt" + "io" + "net" + "net/http" + "regexp" + "strconv" + "strings" + "sync" + "time" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/streamingfast/bstream" + "github.com/streamingfast/cli" + . "github.com/streamingfast/cli" + "github.com/streamingfast/cli/sflags" + firecore "github.com/streamingfast/firehose-core" + "github.com/streamingfast/logging" + "github.com/streamingfast/shutter" + "github.com/tidwall/gjson" + "go.uber.org/zap" +) + +func registerGethEnforcePeersCmd(parent *cobra.Command, binary string, logger *zap.Logger, tracer logging.Tracer) { + registerGroup(parent, + Group("geth", "Geth tools around peers management and some maintenance tasks", + Command(createGethEnforcePeersE(logger, tracer), + "enforce-peers", + "Enforce provided peers to be connected to the node, this tools is meant to run as a sidecar to a Geth node", + Flags(func(flags *pflag.FlagSet) { + flags.String("ipc-file-path", "", "Path to the IPC file to connect to") + flags.StringArray("ensure-peers", nil, "List of peers to ensure connection to") + + }), + ExamplePrefixed(fmt.Sprintf("%s tools geth enforce-peers", binary), ` + + `), + ), + ), + ) +} + +func createGethEnforcePeersE(logger *zap.Logger, tracer logging.Tracer) firecore.CommandExecutor { + return func(cmd *cobra.Command, _ []string) error { + node := &GethNode{ + ipcFilePath: sflags.MustGetString(cmd, "ipc-file-path"), + logger: logger, + } + + cli.Ensure(node.ipcFilePath != "", "--ipc-file-path is required") + + monitor := &GethMonitor{ + Shutter: shutter.New(), + node: node, + logger: logger.Named("monitor"), + tracer: tracer, + } + + peersEnforcer := &GethPeersEnforcer{ + Shutter: shutter.New(), + node: node, + wantedPeersHostnames: sflags.MustGetStringArray(cmd, "ensure-peers"), + logger: logger.Named("enforcer"), + } + + cli.Ensure(len(peersEnforcer.wantedPeersHostnames) > 0, "--ensure-peers is required") + + app := cli.NewApplication(cmd.Context()) + + logger.Info("starting Geth monitor") + app.SuperviseAndStart(monitor) + + logger.Info("starting Geth peers enforcer") + app.SuperviseAndStart(peersEnforcer) + + logger.Info("waiting for termination signal") + app.WaitForTermination(logger, 0, 0) + + return nil + } +} + +var enodeRegexp = regexp.MustCompile(`enode://([a-f0-9]*)@.*$`) + +type GethNode struct { + ipcFilePath string + logger *zap.Logger + + connectedPeers []string + enodeStr string + peerMutex sync.RWMutex + + lastBlock *bstream.Block + lastBlockMutex sync.RWMutex +} + +func (s *GethNode) sendGethCommand(cmd string) (string, error) { + c, err := net.Dial("unix", s.ipcFilePath) + if err != nil { + return "", err + } + defer c.Close() + + _, err = c.Write([]byte(cmd)) + if err != nil { + return "", err + } + + resp, err := readString(c) + return resp, err +} + +func (s *GethNode) setEnodeStr(enodeStr string) error { + ipAddr := getIPAddress() + if ipAddr == "" { + return fmt.Errorf("cannot find local IP address") + } + + s.peerMutex.Lock() + defer s.peerMutex.Unlock() + fixedEnodeStr := enodeRegexp.ReplaceAllString(enodeStr, fmt.Sprintf(`enode://${1}@%s:30303`, ipAddr)) + if fixedEnodeStr != "" && s.enodeStr != fixedEnodeStr { + s.enodeStr = fixedEnodeStr + } + return nil +} + +type GethPeersEnforcer struct { + *shutter.Shutter + + node *GethNode + wantedPeersHostnames []string + logger *zap.Logger +} + +// EnsurePeersByDNS periodically checks IP addresses on the given FQDNs, +// calls /v1/server_id on port 8080 (or other if specified in hostname) and adds them as peers +// wantedPeersHostnames can point to the headless service name in k8s +func (s *GethPeersEnforcer) Run() { + for { + select { + case <-s.Terminating(): + s.logger.Info("geth PeersEnforcer terminated") + return + case <-time.After(10 * time.Second): + } + + if len(s.node.enodeStr) < 20 { + s.logger.Info("wrong enode string will retry", zap.String("enode", s.node.enodeStr)) + continue + } + + allEnodes := map[string]bool{} + for _, hostname := range s.wantedPeersHostnames { + enodes := s.getEnodesFromPeers(hostname) + s.logger.Debug("got enode", zap.String("hostname", hostname), zap.Strings("enodes", enodes)) + + for _, enode := range enodes { + allEnodes[enode] = true + } + } + + for enode := range allEnodes { + if err := s.addPeer(enode); err != nil { + s.logger.Warn("cannot add peer", zap.String("enode", enode)) + } + } + } +} + +// AddPeer sends a command through IPC socket to connect geth to the given peer +func (s *GethPeersEnforcer) addPeer(peer string) error { + if s.mustIgnorePeer(peer) { + return nil + } + + resp, err := s.node.sendGethCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"admin_addPeer","params":["%s"],"id":1}`, peer)) + if err != nil { + return err + } + + if !gjson.Get(resp, "result").Bool() { + return fmt.Errorf("result not true, got '%s'", resp) + } + + return nil +} + +func (s *GethPeersEnforcer) mustIgnorePeer(peer string) bool { + s.node.peerMutex.RLock() + defer s.node.peerMutex.RUnlock() + + if strings.Contains(peer, s.node.enodeStr[0:19]) { + s.logger.Debug("peer is ourself due to same enode id, ignoring", zap.String("peer", peer), zap.String("ourself", s.node.enodeStr)) + return true + } + + for _, peerPrefix := range s.node.connectedPeers { + if strings.Contains(peer, peerPrefix) { + s.logger.Debug("peer already connected", zap.String("peer", peer), zap.String("peerPrefix", peerPrefix)) + return true + } + } + + return false +} + +func (s *GethPeersEnforcer) getEnodesFromPeers(hostname string) []string { + port := "8545" + if splitted := strings.Split(hostname, ":"); len(splitted) == 2 { + port = splitted[1] + hostname = splitted[0] + } + + s.logger.Debug("getting enodes from peers", zap.String("hostname", hostname), zap.String("port", port)) + + ips, err := net.LookupIP(hostname) + if err != nil { + s.logger.Warn("cannot get IP for hostname", zap.Error(err), zap.String("hostname", hostname)) + return nil + } + var enodes []string + for _, ip := range ips { + endpoint := fmt.Sprintf("http://%s:%s", ip, port) + body := `{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}` + + enodeAddr, err := httpPost(endpoint, body) + if err != nil { + s.logger.Warn("error getting enode string from RPC call", zap.String("endpoint", endpoint), zap.String("content", body), zap.Error(err)) + continue + } + + enodeStr := gjson.Get(enodeAddr, "result.enode").String() + if !strings.HasPrefix(enodeStr, "enode://") { + s.logger.Warn("got invalid enode string from IP", zap.Stringer("ip", ip), zap.String("enode", enodeStr)) + continue + } + enodes = append(enodes, enodeStr) + } + return enodes +} + +type GethMonitor struct { + *shutter.Shutter + node *GethNode + + logger *zap.Logger + tracer logging.Tracer +} + +// Monitor periodically checks the head block num and block time, as well as the enode string (server ID) +func (s *GethMonitor) Run() { + started := time.Now() + + var lastLog *time.Time + + for { + select { + case <-s.Terminating(): + s.logger.Info("geth Monitor terminated") + return + case <-time.After(2 * time.Second): + } + + resp, err := s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}`) + if err != nil { + s.logger.Warn("geth Monitor cannot get info from IPC socket", zap.Error(err)) + if time.Since(started) < time.Minute { + continue + } + } else { + enodeStr := gjson.Get(resp, "result.enode").String() + + fields := []zap.Field{zap.String("enode", enodeStr)} + if s.tracer.Enabled() { + fields = append(fields, zap.Reflect("resp", resp)) + } + + s.logger.Debug("geth Monitor got node info", fields...) + s.node.setEnodeStr(enodeStr) + } + + resp, err = s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}`) + if err != nil { + s.logger.Warn("geth Monitor cannot get peers from IPC socket", zap.Error(err)) + } else { + connectedPeers := []string{} + for _, peer := range gjson.Get(resp, "result").Array() { + connectedPeers = append(connectedPeers, peer.Get("enode").String()) + } + s.node.peerMutex.Lock() + s.node.connectedPeers = connectedPeers + s.node.peerMutex.Unlock() + } + + resp, err = s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}`) + if err != nil { + s.logger.Warn("geth Monitor cannot get blocknumber from IPC socket", zap.Error(err)) + continue + } + lastBlock := gjson.Get(resp, "result") + lastBlockNum := hex2uint(lastBlock.String()) + if lastBlockNum == 0 { + continue + } + + resp, err = s.node.sendGethCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["%s", true],"id":1}`, lastBlock)) + if err != nil { + s.logger.Warn("geth Monitor cannot get block by number", zap.Error(err)) + continue + } + timestamp := time.Unix(hex2int(gjson.Get(resp, "result.timestamp").String()), 0) + hash := hex2string(gjson.Get(resp, "result.hash").String()) + + s.node.lastBlockMutex.Lock() + s.node.lastBlock = &bstream.Block{ + Id: hash, + Number: uint64(lastBlockNum), + Timestamp: timestamp, + } + + if lastLog == nil || time.Since(*lastLog) > time.Minute { + s.logger.Info("monitor last block seen", zap.Stringer("block", s.node.lastBlock.AsRef())) + + now := time.Now() + lastLog = &now + } + + s.node.lastBlockMutex.Unlock() + } +} + +// cannot use ReadAll on an IPC socket +func readString(r io.Reader) (string, error) { + br := bufio.NewReader(r) + var line string + for { + l, err := br.ReadString('\n') + if len(l) > 0 { + line += l + } + switch err { + case bufio.ErrBufferFull: + continue + case io.EOF, nil: + return line, nil + default: + return "", err + } + } +} + +func getIPAddress() string { + ifaces, err := net.Interfaces() + if err != nil { + return "" + } + for _, i := range ifaces { + addrs, err := i.Addrs() + if err != nil { + continue + } + for _, addr := range addrs { + var ip net.IP + switch v := addr.(type) { + case *net.IPNet: + ip = v.IP + case *net.IPAddr: + ip = v.IP + } + if ip.IsGlobalUnicast() { + return ip.String() + } + } + } + return "" +} + +func httpPost(addr string, out string) (string, error) { + resp, err := http.Post(addr, "application/json", strings.NewReader(out)) + if err != nil { + return "", err + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + return string(body), nil +} + +func hex2int(hexStr string) int64 { + // remove 0x suffix if found in the input string + cleaned := strings.Replace(hexStr, "0x", "", -1) + + // base 16 for hexadecimal + result, _ := strconv.ParseInt(cleaned, 16, 64) + return result +} + +func hex2uint(hexStr string) uint64 { + // remove 0x suffix if found in the input string + cleaned := strings.Replace(hexStr, "0x", "", -1) + + // base 16 for hexadecimal + result, _ := strconv.ParseUint(cleaned, 16, 64) + return result +} + +func hex2string(hexStr string) string { + // remove 0x suffix if found in the input string + return strings.Replace(hexStr, "0x", "", -1) +} diff --git a/devel/standard/standard.yaml b/devel/standard/standard.yaml index 3a4042e9..bed59572 100644 --- a/devel/standard/standard.yaml +++ b/devel/standard/standard.yaml @@ -20,7 +20,7 @@ start: --nodiscover --authrpc.port=8552 --http - --http.api=eth,net,web3 + --http.api=admin,eth,net,web3 --http.port=8547 --http.addr=0.0.0.0 --http.vhosts=* diff --git a/node-manager/dev/superviser.go b/node-manager/dev/superviser.go deleted file mode 100644 index 1da5d6fe..00000000 --- a/node-manager/dev/superviser.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 dev - -import ( - "regexp" - "strings" - - "github.com/ShinyTrinkets/overseer" - nodemanager "github.com/streamingfast/firehose-ethereum/node-manager" - nodeManager "github.com/streamingfast/node-manager" - "github.com/streamingfast/node-manager/superviser" - "go.uber.org/zap" -) - -var enodeRegexp = regexp.MustCompile(`enode://([a-f0-9]*)@.*$`) - -type Superviser struct { - *nodemanager.Superviser - command string - headBlockUpdateFunc nodeManager.HeadBlockUpdater - lastBlockSeen uint64 -} - -func (s *Superviser) GetName() string { - return "geth" -} - -func NewSuperviser( - binary string, - arguments []string, - headBlockUpdateFunc nodeManager.HeadBlockUpdater, - appLogger *zap.Logger, - nodeLogger *zap.Logger, -) (*Superviser, error) { - // Ensure process manager line buffer is large enough (50 MiB) for our Deep Mind instrumentation outputting lot's of text. - overseer.DEFAULT_LINE_BUFFER_SIZE = 50 * 1024 * 1024 - - gethSuperviser := &Superviser{ - Superviser: &nodemanager.Superviser{ - Superviser: superviser.New(appLogger, binary, arguments), - Logger: appLogger, - }, - command: binary + " " + strings.Join(arguments, " "), - headBlockUpdateFunc: headBlockUpdateFunc, - } - - gethSuperviser.RegisterLogPlugin(nodemanager.NewGethToZapLogPlugin(false, nodeLogger)) - - return gethSuperviser, nil -} - -func (s *Superviser) GetCommand() string { - return s.command -} - -func (s *Superviser) LastSeenBlockNum() uint64 { - return s.lastBlockSeen -} - -func (s *Superviser) ServerID() (string, error) { - return "dev", nil -} - -// -//func (s *Superviser) ServerID() (string, error) { -// return "dev", nil -//} -// -//func (s *Superviser) UpdateLastBlockSeen(blockNum uint64) { -// s.lastBlockSeen = blockNum -//} - -//func (s *Superviser) lastBlockSeenLogPlugin(line string) { -// switch { -// case strings.HasPrefix(line, "DMLOG FINALIZE_BLOCK"): -// line = strings.TrimSpace(strings.TrimPrefix(line, "DMLOG FINALIZE_BLOCK")) -// case strings.HasPrefix(line, "FIRE FINALIZE_BLOCK"): -// line = strings.TrimSpace(strings.TrimPrefix(line, "FIRE FINALIZE_BLOCK")) -// default: -// return -// } -// -// blockNum, err := strconv.ParseUint(line, 10, 64) -// if err != nil { -// s.Logger.Error("unable to extract last block num", zap.String("line", line), zap.Error(err)) -// return -// } -// -// //metrics.SetHeadBlockNumber(blockNum) -// s.lastBlockSeen = blockNum -//} diff --git a/node-manager/geth/bootstrap.go b/node-manager/geth/bootstrap.go deleted file mode 100644 index 30a412c0..00000000 --- a/node-manager/geth/bootstrap.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 geth - -import ( - "archive/tar" - "context" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "time" - - "github.com/streamingfast/dstore" - "go.uber.org/zap" -) - -// GenesisBootstrapper needs to write genesis file, static node file, then run a command like 'geth init' -type GenesisBootstrapper struct { - dataDir string - genesisFileURL string - cmdArgs []string - nodePath string - // staticNodesFilepath string - logger *zap.Logger -} - -func NewGenesisBootstrapper(dataDir string, genesisFileURL string, nodePath string, cmdArgs []string, logger *zap.Logger) *GenesisBootstrapper { - return &GenesisBootstrapper{ - dataDir: dataDir, - genesisFileURL: genesisFileURL, - nodePath: nodePath, - cmdArgs: cmdArgs, - logger: logger, - } -} - -func downloadDstoreObject(url string, destpath string) error { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - reader, _, _, err := dstore.OpenObject(ctx, url) - if err != nil { - return fmt.Errorf("cannot get file from store: %w", err) - } - defer reader.Close() - data, err := ioutil.ReadAll(reader) - if err != nil { - return err - } - - return ioutil.WriteFile(destpath, data, 0644) -} - -func (b *GenesisBootstrapper) Bootstrap() error { - if b.genesisFileURL == "" || isBootstrapped(b.dataDir, b.logger) { - return nil - } - - genesisFilePath := filepath.Join(b.dataDir, "genesis.json") - - b.logger.Info("running bootstrap sequence", zap.String("data_dir", b.dataDir), zap.String("genesis_file_path", genesisFilePath)) - if err := os.MkdirAll(b.dataDir, 0755); err != nil { - return fmt.Errorf("cannot create folder %s to bootstrap node: %w", b.dataDir, err) - } - - if !fileExists(genesisFilePath) { - b.logger.Info("fetching genesis file", zap.String("source_url", b.genesisFileURL)) - if err := downloadDstoreObject(b.genesisFileURL, genesisFilePath); err != nil { - return err - } - } - - cmd := exec.Command(b.nodePath, b.cmdArgs...) - b.logger.Info("running node init command (creating genesis block from genesis.json)", zap.Stringer("cmd", cmd)) - if output, err := runCmd(cmd); err != nil { - return fmt.Errorf("failed to init node (output %s): %w", output, err) - } - - return nil -} - -func NewTarballBootstrapper( - url string, - dataDir string, - logger *zap.Logger, -) *TarballBootstrapper { - return &TarballBootstrapper{ - url: url, - dataDir: dataDir, - logger: logger, - } -} - -type TarballBootstrapper struct { - url string - dataDir string - logger *zap.Logger -} - -func isBootstrapped(dataDir string, logger *zap.Logger) bool { - var foundCURRENT bool - err := filepath.Walk(dataDir, - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.IsDir() { - return nil - } - if filepath.Base(path) == "CURRENT" { - foundCURRENT = true - return io.EOF - } - return nil - }) - if err != nil && !os.IsNotExist(err) && err != io.EOF { - logger.Warn("error while checking for bootstrapped status", zap.Error(err)) - } - - return foundCURRENT -} - -func (b *TarballBootstrapper) isBootstrapped() bool { - return isBootstrapped(b.dataDir, b.logger) -} - -func (b *TarballBootstrapper) Bootstrap() error { - if b.isBootstrapped() { - return nil - } - - b.logger.Info("bootstrapping geth chain data from pre-built data", zap.String("bootstrap_data_url", b.url)) - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) - defer cancel() - - reader, _, _, err := dstore.OpenObject(ctx, b.url, dstore.Compression("zstd")) - if err != nil { - return fmt.Errorf("cannot get snapshot from gstore: %w", err) - } - defer reader.Close() - - b.createChainData(reader) - return nil -} - -func (b *TarballBootstrapper) createChainData(reader io.Reader) error { - err := os.MkdirAll(b.dataDir, os.ModePerm) - if err != nil { - return fmt.Errorf("unable to create blocks log file: %w", err) - } - - b.logger.Info("extracting bootstrapping data into node data directory", zap.String("data_dir", b.dataDir)) - tr := tar.NewReader(reader) - for { - header, err := tr.Next() - if err != nil { - if err == io.EOF { - return nil - } - - return err - } - - path := filepath.Join(b.dataDir, header.Name) - b.logger.Debug("about to write content of entry", zap.String("name", header.Name), zap.String("path", path), zap.Bool("is_dir", header.FileInfo().IsDir())) - if header.FileInfo().IsDir() { - err = os.MkdirAll(path, os.ModePerm) - if err != nil { - return fmt.Errorf("unable to create directory: %w", err) - } - - continue - } - - file, err := os.Create(path) - if err != nil { - return fmt.Errorf("unable to create file: %w", err) - } - - if _, err := io.Copy(file, tr); err != nil { - file.Close() - return err - } - file.Close() - } -} - -func dirExists(filename string) bool { - info, err := os.Stat(filename) - if os.IsNotExist(err) { - return false - } - return info.IsDir() -} - -func fileExists(filename string) bool { - info, err := os.Stat(filename) - if os.IsNotExist(err) { - return false - } - return !info.IsDir() -} -func runCmd(cmd *exec.Cmd) (string, error) { - // This runs (and wait) the command, combines both stdout and stderr in a single stream and return everything - out, err := cmd.CombinedOutput() - if err == nil { - return "", nil - } - - return string(out), err -} diff --git a/node-manager/geth/monitoring.go b/node-manager/geth/monitoring.go deleted file mode 100644 index b4542015..00000000 --- a/node-manager/geth/monitoring.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 geth - -import ( - "fmt" - "time" - - "github.com/streamingfast/bstream" - "github.com/tidwall/gjson" - "go.uber.org/zap" -) - -// Monitor periodically checks the head block num and block time, as well as the enode string (server ID) -func (s *Superviser) Monitor() { - started := time.Now() - for { - time.Sleep(2 * time.Second) - - if !s.IsRunning() { - continue - } - resp, err := s.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}`) - if err != nil { - s.Logger.Warn("geth Monitor cannot get info from IPC socket", zap.Error(err)) - if time.Since(started) < time.Minute { - continue - } - } else { - s.setEnodeStr(gjson.Get(resp, "result.enode").String()) - } - - resp, err = s.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}`) - if err != nil { - s.Logger.Warn("geth Monitor cannot get peers from IPC socket", zap.Error(err)) - } else { - connectedPeers := []string{} - for _, peer := range gjson.Get(resp, "result").Array() { - connectedPeers = append(connectedPeers, peer.Get("enode").String()) - } - s.infoMutex.Lock() - s.connectedPeers = connectedPeers - s.infoMutex.Unlock() - } - - if s.headBlockUpdateFunc != nil { - resp, err = s.sendGethCommand(`{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}`) - if err != nil { - s.Logger.Warn("geth Monitor cannot get blocknumber from IPC socket", zap.Error(err)) - continue - } - lastBlock := gjson.Get(resp, "result") - lastBlockNum := hex2uint(lastBlock.String()) - if lastBlockNum == 0 { - continue - } - - resp, err = s.sendGethCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["%s", true],"id":1}`, lastBlock)) - if err != nil { - s.Logger.Warn("geth Monitor cannot get block by number", zap.Error(err)) - continue - } - timestamp := time.Unix(hex2int(gjson.Get(resp, "result.timestamp").String()), 0) - hash := hex2string(gjson.Get(resp, "result.hash").String()) - - s.headBlockUpdateFunc(&bstream.Block{ - Id: hash, - Number: uint64(lastBlockNum), - Timestamp: timestamp, - }) - } - - } -} diff --git a/node-manager/geth/superviser.go b/node-manager/geth/superviser.go deleted file mode 100644 index 179aa908..00000000 --- a/node-manager/geth/superviser.go +++ /dev/null @@ -1,348 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 geth - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "regexp" - "strconv" - "strings" - "sync" - "time" - - "github.com/ShinyTrinkets/overseer" - nodemanager "github.com/streamingfast/firehose-ethereum/node-manager" - nodeManager "github.com/streamingfast/node-manager" - logplugin "github.com/streamingfast/node-manager/log_plugin" - "github.com/streamingfast/node-manager/superviser" - "github.com/tidwall/gjson" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -var enodeRegexp = regexp.MustCompile(`enode://([a-f0-9]*)@.*$`) - -type Superviser struct { - *nodemanager.Superviser - - backupMutex sync.Mutex - infoMutex sync.Mutex - binary string - arguments []string - dataDir string - ipcFilePath string - lastBlockSeen uint64 - enodeStr string - connectedPeers []string - headBlockUpdateFunc nodeManager.HeadBlockUpdater -} - -func (s *Superviser) GetName() string { - return "geth" -} - -func NewGethSuperviser( - binary string, - dataDir string, - nodeIPCPath string, - arguments []string, - isReader bool, - debugDeepMind bool, - headBlockUpdateFunc nodeManager.HeadBlockUpdater, - enforcePeersStr string, - logToZap bool, - appLogger *zap.Logger, - nodelogger *zap.Logger, -) (*Superviser, error) { - // Ensure process manager line buffer is large enough (50 MiB) for our Deep Mind instrumentation outputting lot's of text. - overseer.DEFAULT_LINE_BUFFER_SIZE = 50 * 1024 * 1024 - - gethSuperviser := &Superviser{ - Superviser: &nodemanager.Superviser{ - Superviser: superviser.New(appLogger, binary, arguments), - Logger: appLogger, - }, - binary: binary, - arguments: arguments, - dataDir: dataDir, - ipcFilePath: nodeIPCPath, - connectedPeers: []string{}, - headBlockUpdateFunc: headBlockUpdateFunc, - } - - if !isReader { - gethSuperviser.RegisterLogPlugin(logplugin.LogPluginFunc(gethSuperviser.lastBlockSeenLogPlugin)) - } - - if logToZap { - gethSuperviser.RegisterLogPlugin(nodemanager.NewGethToZapLogPlugin(debugDeepMind, nodelogger)) - } else { - gethSuperviser.RegisterLogPlugin(logplugin.NewToConsoleLogPlugin(debugDeepMind)) - } - - if enforcePeersStr != "" { - enforcedPeers := strings.Split(enforcePeersStr, ",") - appLogger.Info("enforcing peers by dns", zap.Strings("peers", enforcedPeers)) - go gethSuperviser.EnsurePeersByDNS(enforcedPeers) - } - - appLogger.Info("created geth superviser", zap.Object("superviser", gethSuperviser)) - return gethSuperviser, nil -} - -func (s *Superviser) GetCommand() string { - return s.binary + " " + strings.Join(s.arguments, " ") -} - -func (s *Superviser) LastSeenBlockNum() uint64 { - return s.lastBlockSeen -} - -func (s *Superviser) ServerID() (string, error) { - id := s.enodeStr - if id != "" { - return id, nil - } - return "", fmt.Errorf("enode not fetched yet") -} - -func (s *Superviser) MarshalLogObject(enc zapcore.ObjectEncoder) error { - enc.AddString("binary", s.binary) - enc.AddArray("arguments", nodemanager.StringArray(s.arguments)) - enc.AddString("data_dir", s.dataDir) - enc.AddString("ipc_file_path", s.ipcFilePath) - enc.AddUint64("last_block_seen", s.lastBlockSeen) - enc.AddString("enode_str", s.enodeStr) - - return nil -} - -func (s *Superviser) UpdateLastBlockSeen(blockNum uint64) { - s.lastBlockSeen = blockNum -} - -func (s *Superviser) lastBlockSeenLogPlugin(line string) { - switch { - case strings.HasPrefix(line, "DMLOG FINALIZE_BLOCK"): - line = strings.TrimSpace(strings.TrimPrefix(line, "DMLOG FINALIZE_BLOCK")) - case strings.HasPrefix(line, "FIRE FINALIZE_BLOCK"): - line = strings.TrimSpace(strings.TrimPrefix(line, "FIRE FINALIZE_BLOCK")) - default: - return - } - - blockNum, err := strconv.ParseUint(line, 10, 64) - if err != nil { - s.Logger.Error("unable to extract last block num", zap.String("line", line), zap.Error(err)) - return - } - - //metrics.SetHeadBlockNumber(blockNum) - s.lastBlockSeen = blockNum -} - -// AddPeer sends a command through IPC socket to connect geth to the given peer -func (s *Superviser) AddPeer(peer string) error { - - for _, peerPrefix := range append(s.connectedPeers, s.enodeStr[0:19]) { //connected or ourself - if strings.Contains(peer, peerPrefix) { - return nil - } - } - - resp, err := s.sendGethCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"admin_addPeer","params":["%s"],"id":1}`, peer)) - if err != nil { - return err - } - if !gjson.Get(resp, "result").Bool() { - return fmt.Errorf("result not true") - } - return nil -} - -func (s *Superviser) sendGethCommand(cmd string) (string, error) { - c, err := net.Dial("unix", s.ipcFilePath) - if err != nil { - return "", err - } - defer c.Close() - - _, err = c.Write([]byte(cmd)) - if err != nil { - return "", err - } - - resp, err := readString(c) - return resp, err -} - -func (s *Superviser) setEnodeStr(enodeStr string) error { - ipAddr := getIPAddress() - if ipAddr == "" { - return fmt.Errorf("cannot find local IP address") - } - - s.infoMutex.Lock() - defer s.infoMutex.Unlock() - fixedEnodeStr := enodeRegexp.ReplaceAllString(enodeStr, fmt.Sprintf(`enode://${1}@%s:30303`, ipAddr)) - if fixedEnodeStr != "" && s.enodeStr != fixedEnodeStr { - s.enodeStr = fixedEnodeStr - } - return nil -} - -// EnsurePeersByDNS periodically checks IP addresses on the given FQDNs, -// calls /v1/server_id on port 8080 (or other if specified in hostname) and adds them as peers -// wantedPeersHostnames can point to the headless service name in k8s -func (s *Superviser) EnsurePeersByDNS(wantedPeersHostnames []string) { - for { - time.Sleep(10 * time.Second) - if !s.IsRunning() { - s.Logger.Info("supervisor not running, will try to add peers later") - continue - } - if len(s.enodeStr) < 20 { - s.Logger.Info("wrong enode string will retry", zap.String("enode", s.enodeStr)) - continue - } - - var allEnodes []string - for _, hostname := range wantedPeersHostnames { - enodes := s.getEnodesFromPeers(hostname) - s.Logger.Debug("got enode", zap.String("hostname", hostname), zap.Strings("enodes", enodes)) - allEnodes = append(allEnodes, enodes...) - } - - for _, enode := range allEnodes { - if err := s.AddPeer(enode); err != nil { - s.Logger.Warn("cannot add peer", zap.String("enode", enode)) - } - } - } -} - -func (s *Superviser) getEnodesFromPeers(hostname string) []string { - port := "8080" - if splitted := strings.Split(hostname, ":"); len(splitted) == 2 { - port = splitted[1] - hostname = splitted[0] - } - ips, err := net.LookupIP(hostname) - if err != nil { - s.Logger.Warn("cannot get IP for hostname", zap.Error(err), zap.String("hostname", hostname)) - return nil - } - var enodes []string - for _, ip := range ips { - enodeAddr, err := httpGet(fmt.Sprintf("http://%s:%s/v1/server_id", ip, port)) - if err != nil { - s.Logger.Warn("error getting enode string from IP", zap.Stringer("ip", ip)) - continue - } - if !strings.HasPrefix(enodeAddr, "enode://") { - s.Logger.Warn("got invalid enode string from IP", zap.Stringer("ip", ip), zap.String("enode", enodeAddr)) - continue - } - enodes = append(enodes, enodeAddr) - } - return enodes -} - -// cannot use ReadAll on an IPC socket -func readString(r io.Reader) (string, error) { - br := bufio.NewReader(r) - var line string - for { - l, err := br.ReadString('\n') - if len(l) > 0 { - line += l - } - switch err { - case bufio.ErrBufferFull: - continue - case io.EOF, nil: - return line, nil - default: - return "", err - } - } -} - -func hex2int(hexStr string) int64 { - // remove 0x suffix if found in the input string - cleaned := strings.Replace(hexStr, "0x", "", -1) - - // base 16 for hexadecimal - result, _ := strconv.ParseInt(cleaned, 16, 64) - return result -} - -func hex2uint(hexStr string) uint64 { - // remove 0x suffix if found in the input string - cleaned := strings.Replace(hexStr, "0x", "", -1) - - // base 16 for hexadecimal - result, _ := strconv.ParseUint(cleaned, 16, 64) - return result -} - -func hex2string(hexStr string) string { - // remove 0x suffix if found in the input string - return strings.Replace(hexStr, "0x", "", -1) -} - -func getIPAddress() string { - ifaces, err := net.Interfaces() - if err != nil { - return "" - } - for _, i := range ifaces { - addrs, err := i.Addrs() - if err != nil { - continue - } - for _, addr := range addrs { - var ip net.IP - switch v := addr.(type) { - case *net.IPNet: - ip = v.IP - case *net.IPAddr: - ip = v.IP - } - if ip.IsGlobalUnicast() { - return ip.String() - } - } - } - return "" -} - -func httpGet(addr string) (string, error) { - resp, err := http.Get(addr) - if err != nil { - return "", err - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - return string(body), nil -} diff --git a/node-manager/logging.go b/node-manager/logging.go deleted file mode 100644 index 83bb0ad0..00000000 --- a/node-manager/logging.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 nodemanager - -import ( - "regexp" - "strings" - "unicode" - "unicode/utf8" - - logplugin "github.com/streamingfast/node-manager/log_plugin" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -var gethLogLevelRegex = regexp.MustCompile("^(DEBUG|INFO|WARN|ERROR)") - -func NewGethToZapLogPlugin(debugDeepMind bool, logger *zap.Logger) *logplugin.ToZapLogPlugin { - return logplugin.NewToZapLogPlugin(debugDeepMind, logger, - logplugin.ToZapLogPluginLogLevel(gethLogLevelExtractor), - logplugin.ToZapLogPluginTransformer(gethLogTransformer), - ) -} - -func NewOpenEthereumToZapLogPlugin(debugDeepMind bool, logger *zap.Logger) *logplugin.ToZapLogPlugin { - // FIXME: This uses Geth version for now, fix this by running our OpenEthereum instrumentation - // and created new extractor and transformer. - return NewGethToZapLogPlugin(debugDeepMind, logger) -} - -func gethLogLevelExtractor(in string) zapcore.Level { - if strings.Contains(in, "Upgrade blockchain database version") { - return zap.InfoLevel - } - - if strings.Contains(in, "peer connected on snap without compatible eth support") { - return zap.DebugLevel - } - - groups := gethLogLevelRegex.FindStringSubmatch(in) - if len(groups) <= 1 { - return zap.InfoLevel - } - - switch groups[1] { - case "INFO": - return zap.InfoLevel - case "WARN": - return zap.WarnLevel - case "ERROR": - return zap.ErrorLevel - case "DEBUG": - return zap.DebugLevel - default: - return zap.InfoLevel - } -} - -var gethLogTransformRegex = regexp.MustCompile(`^[A-Z]{3,}\s+\[[0-9-_:\|\.]+\]\s+`) - -func gethLogTransformer(in string) string { - return lowerFirst(gethLogTransformRegex.ReplaceAllString(in, "")) -} - -// lowerFirst lowers the first character of the string with an exception case -// for strings starting with 2 consecutive upper characters or more which is common -// when a string start with an acronym like `HTTP status code is 200`. -func lowerFirst(s string) string { - if s == "" { - return "" - } - - firstRune, n := utf8.DecodeRuneInString(s) - if firstRune == utf8.RuneError { - // String is malformed, let's pass the problem to someone else - return s - } - - // Now that we have our first character and offset (n), if there is a following - // character to this and the following character is upper case, we won't lower - // case first, it's an exception so that `HTTP` remains `HTTP`. - afterFirst := s[n:] - if afterFirst != "" { - secondRune, _ := utf8.DecodeRuneInString(afterFirst) - if secondRune == utf8.RuneError { - // String is malformed, let's pass the problem to someone else - return s - } - - if unicode.IsUpper(secondRune) { - // We have our exception case, two consecutive upper case runes, we keep it untouched - return s - } - } - - return string(unicode.ToLower(firstRune)) + afterFirst -} diff --git a/node-manager/logging_test.go b/node-manager/logging_test.go deleted file mode 100644 index fafc85ea..00000000 --- a/node-manager/logging_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 nodemanager - -import ( - "testing" - - "github.com/streamingfast/logging" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestToZapLogPlugin_LogLevel(t *testing.T) { - tests := []struct { - name string - in string - out string - }{ - // The standard `geth` output - { - "debug", - "DEBUG [10-05|09:54:00.585] message ...", - `{"level":"debug","msg":"message ..."}`, - }, - { - "info", - "INFO [10-05|09:54:00.585] message ...", - `{"level":"info","msg":"message ..."}`, - }, - { - "warn", - "WARN [10-05|09:54:00.585] message ...", - `{"level":"warn","msg":"message ..."}`, - }, - { - "error", - "ERROR [10-05|09:54:00.585] message ...", - `{"level":"error","msg":"message ..."}`, - }, - { - "other", - "OTHER [10-05|09:54:00.585] message ...", - `{"level":"info","msg":"message ..."}`, - }, - { - "first upper is lowered", - "WARN [10-05|09:54:00.585] Message ...", - `{"level":"warn","msg":"message ..."}`, - }, - { - "two consecutive characters or more are untouched", - "WARN [10-05|09:54:00.585] HTTP ...", - `{"level":"warn","msg":"HTTP ..."}`, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - wrapper := logging.NewTestLogger(t) - plugin := NewGethToZapLogPlugin(false, wrapper.Instance()) - plugin.LogLine(test.in) - - loggedLines := wrapper.RecordedLines(t) - - if len(test.out) == 0 { - require.Len(t, loggedLines, 0) - } else { - require.Len(t, loggedLines, 1) - assert.Equal(t, test.out, loggedLines[0]) - } - }) - } -} diff --git a/node-manager/namer.go b/node-manager/namer.go deleted file mode 100644 index c84af513..00000000 --- a/node-manager/namer.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 nodemanager - -import ( - "fmt" - - "github.com/streamingfast/bstream" -) - -func BlockFileNamer(block *bstream.Block) string { - blockTime := block.Time() - blockTimeString := fmt.Sprintf("%s.%01d", blockTime.Format("20060102T150405"), blockTime.Nanosecond()/100000000) - - blockID := block.ID() - previousID := block.PreviousID() - - return fmt.Sprintf("%010d-%s-%s-%s", block.Num(), blockTimeString, blockID, previousID) -} diff --git a/node-manager/superviser.go b/node-manager/superviser.go deleted file mode 100644 index 4144b606..00000000 --- a/node-manager/superviser.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 nodemanager - -import ( - "github.com/streamingfast/node-manager/superviser" - "go.uber.org/zap" -) - -type Superviser struct { - *superviser.Superviser - - Logger *zap.Logger -} diff --git a/node-manager/trx_pool_log_plugin.go b/node-manager/trx_pool_log_plugin.go deleted file mode 100644 index 63253b4c..00000000 --- a/node-manager/trx_pool_log_plugin.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 nodemanager - -import ( - "fmt" - "strings" - - "github.com/streamingfast/eth-go" - "github.com/streamingfast/firehose-ethereum/codec" - "github.com/streamingfast/firehose-ethereum/node-manager/trxstream" - pbtrxstream "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/trxstream/v1" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - "github.com/streamingfast/shutter" - "go.uber.org/zap" - "google.golang.org/grpc" -) - -type TrxPoolLogPlugin struct { - *shutter.Shutter - - logLines chan string - server *trxstream.Server - logger *zap.Logger -} - -func NewTrxPoolLogPlugin(logger *zap.Logger) *TrxPoolLogPlugin { - trxServer := trxstream.NewServer(logger) - - return &TrxPoolLogPlugin{ - Shutter: shutter.New(), - - server: trxServer, - logLines: make(chan string), - logger: logger, - } -} - -func (p *TrxPoolLogPlugin) Launch() {} -func (p TrxPoolLogPlugin) Stop() {} - -func (p *TrxPoolLogPlugin) Name() string { - return "TrxPoolLogPlugin" -} -func (p *TrxPoolLogPlugin) Close(_ error) { - p.server.Shutdown(nil) -} - -func (p *TrxPoolLogPlugin) RegisterServices(gs grpc.ServiceRegistrar) { - pbtrxstream.RegisterTransactionStreamServer(gs, p.server) -} - -func (p *TrxPoolLogPlugin) LogLine(line string) { - switch { - case strings.HasPrefix(line, "DMLOG TRX_ENTER_POOL"): - line = line[6:] - case strings.HasPrefix(line, "FIRE TRX_ENTER_POOL"): - line = line[5:] - default: - return - } - - p.logger.Debug("detected trx enter pool event detected") - chunks, err := codec.SplitInChunks(line, 12) - if err != nil { - panic(fmt.Errorf("failed to spit log line %q: %w", line, err)) - } - - tx := readPoolTrxBegin(chunks) - p.logger.Debug("pushing transaction", zap.Stringer("trx_id", eth.Hash(tx.Hash))) - p.server.PushTransaction(tx) -} - -func readPoolTrxBegin(chunks []string) *pbtrxstream.Transaction { - hash := codec.FromHex(chunks[0], "TRX_POOL txHash") - from := codec.FromHex(chunks[1], "TRX_POOL from") - to := codec.FromHex(chunks[2], "TRX_POOL to") - value := pbeth.BigIntFromBytes(codec.FromHex(chunks[3], "TRX_POOL value")) - v := codec.FromHex(chunks[4], "TRX_POOL v") - r := codec.FromHex(chunks[5], "TRX_POOL r") - s := codec.FromHex(chunks[6], "TRX_POOL s") - gas := codec.FromUint64(chunks[7], "TRX_POOL gas") - gasPrice := pbeth.BigIntFromBytes(codec.FromHex(chunks[8], "TRX_POOL gasPrice")) - nonce := codec.FromUint64(chunks[9], "TRX_POOL nonce") - input := codec.FromHex(chunks[10], "TRX_POOL input") - - return &pbtrxstream.Transaction{ - To: to, - From: from, - Hash: hash, - Value: value, - R: r, - V: v, - S: s, - GasLimit: gas, - GasPrice: gasPrice, - Nonce: nonce, - Input: input, - } -} diff --git a/node-manager/trxstream/server.go b/node-manager/trxstream/server.go deleted file mode 100644 index c6df630b..00000000 --- a/node-manager/trxstream/server.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 trxstream - -import ( - "sync" - - "github.com/streamingfast/logging" - pbtrxstream "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/trxstream/v1" - "github.com/streamingfast/shutter" - "go.uber.org/zap" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -type Server struct { - *shutter.Shutter - - subscriptions []*subscription - lock sync.RWMutex - - logger *zap.Logger -} - -func NewServer(logger *zap.Logger) *Server { - return &Server{ - Shutter: shutter.New(), - logger: logger, - } -} - -func (s *Server) Transactions(r *pbtrxstream.TransactionRequest, stream pbtrxstream.TransactionStream_TransactionsServer) error { - zlogger := logging.Logger(stream.Context(), s.logger) - - subscription := s.subscribe(zlogger) - defer s.unsubscribe(subscription) - - for { - select { - case <-stream.Context().Done(): - return nil - case <-s.Terminating(): - return status.Error(codes.Unavailable, "service is terminating") - case trx, ok := <-subscription.incomingTrx: - if !ok { - // we've been shutdown somehow, simply close the current connection.. - // we'll have logged at the source - return nil - } - zlogger.Debug("sending transaction to subscription", zap.Stringer("transaction", trx)) - err := stream.Send(trx) - if err != nil { - zlogger.Info("failed writing to socket, shutting down subscription", zap.Error(err)) - break - } - } - } -} - -func (s *Server) Ready() bool { - return true -} - -func (s *Server) PushTransaction(trx *pbtrxstream.Transaction) { - if s.IsTerminating() { - return - } - - s.lock.RLock() - defer s.lock.RUnlock() - - for _, sub := range s.subscriptions { - sub.Push(trx) - } -} - -func (s *Server) subscribe(logger *zap.Logger) *subscription { - chanSize := 200 - sub := newSubscription(chanSize, s.logger.Named("sub")) - - s.lock.Lock() - defer s.lock.Unlock() - - s.subscriptions = append(s.subscriptions, sub) - s.logger.Info("subscribed", zap.Int("new_length", len(s.subscriptions))) - - return sub -} - -func (s *Server) unsubscribe(toRemove *subscription) { - var newListeners []*subscription - for _, sub := range s.subscriptions { - if sub != toRemove { - newListeners = append(newListeners, sub) - } - } - - s.lock.Lock() - defer s.lock.Unlock() - - s.subscriptions = newListeners - s.logger.Info("unsubscribed", zap.Int("new_length", len(s.subscriptions))) -} diff --git a/node-manager/trxstream/subscription.go b/node-manager/trxstream/subscription.go deleted file mode 100644 index a4faad36..00000000 --- a/node-manager/trxstream/subscription.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 trxstream - -import ( - "sync" - - pbtrxstream "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/trxstream/v1" - "go.uber.org/zap" -) - -func newSubscription(chanSize int, logger *zap.Logger) (out *subscription) { - return &subscription{ - incomingTrx: make(chan *pbtrxstream.Transaction, chanSize), - logger: logger, - } -} - -type subscription struct { - incomingTrx chan *pbtrxstream.Transaction - closed bool - quitOnce sync.Once - logger *zap.Logger -} - -func (s *subscription) Push(trx *pbtrxstream.Transaction) { - if len(s.incomingTrx) == cap(s.incomingTrx) { - s.quitOnce.Do(func() { - s.logger.Info("reach max buffer size for subscription, closing channel") - s.closed = true - close(s.incomingTrx) - }) - return - } - - if s.closed { - s.logger.Warn("received trx in a close subscription") - return - } - - s.logger.Debug("subscription writing accepted block", zap.Int("capacity", cap(s.incomingTrx))) - s.incomingTrx <- trx -} diff --git a/node-manager/types.go b/node-manager/types.go deleted file mode 100644 index 3d18fe29..00000000 --- a/node-manager/types.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 nodemanager - -import ( - "go.uber.org/zap/zapcore" -) - -type StringArray []string - -func (ss StringArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, element := range ss { - arr.AppendString(element) - } - - return nil -} diff --git a/tools/cmd.go b/tools/cmd.go deleted file mode 100644 index 687644ec..00000000 --- a/tools/cmd.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "fmt" - - "github.com/spf13/cobra" - "github.com/streamingfast/cli" - firecore "github.com/streamingfast/firehose-core" -) - -var blockEncoder = firecore.NewBlockEncoder() - -var Cmd = &cobra.Command{Use: "tools", Short: "Developer tools related to fireeth"} - -var Example = func(in string) string { - return string(cli.Example(in)) -} - -var ExamplePrefixed = func(prefix, in string) string { - return string(cli.ExamplePrefixed(prefix, in)) -} - -func mustGetString(cmd *cobra.Command, flagName string) string { - val, err := cmd.Flags().GetString(flagName) - if err != nil { - panic(fmt.Sprintf("flags: couldn't find flag %q", flagName)) - } - return val -} -func mustGetInt64(cmd *cobra.Command, flagName string) int64 { - val, err := cmd.Flags().GetInt64(flagName) - if err != nil { - panic(fmt.Sprintf("flags: couldn't find flag %q", flagName)) - } - return val -} -func mustGetUint64(cmd *cobra.Command, flagName string) uint64 { - val, err := cmd.Flags().GetUint64(flagName) - if err != nil { - panic(fmt.Sprintf("flags: couldn't find flag %q", flagName)) - } - return val -} -func mustGetBool(cmd *cobra.Command, flagName string) bool { - val, err := cmd.Flags().GetBool(flagName) - if err != nil { - panic(fmt.Sprintf("flags: couldn't find flag %q", flagName)) - } - return val -} diff --git a/tools/compare-rpc-oneblock.go b/tools/compare-rpc-oneblock.go deleted file mode 100644 index a86f6726..00000000 --- a/tools/compare-rpc-oneblock.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "fmt" - "os" - - "github.com/DataDog/zstd" - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/cli" - "github.com/streamingfast/eth-go/rpc" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" -) - -var compareOneblockRPCCmd = &cobra.Command{ - Use: "compare-oneblock-rpc ", - Short: "Checks for any differences between a firehose one-block and the same block from RPC endpoint (get_block).", - Long: cli.Dedent(` - The 'compare-oneblock-rpc' takes in a local path, an RPC endpoint URL and compares a single block at a time. - `), - Args: cobra.ExactArgs(2), - RunE: compareOneblockRPCE, - Example: ExamplePrefixed("fireeth tools compare-oneblock-rpc", ` - /path/to/oneblocks/0046904064-0061a308bf12bc2e-5b6ef5eed4e06d5b-46903864-default.dbin.zst http://localhost:8545 - `), -} - -func init() { - Cmd.AddCommand(compareOneblockRPCCmd) -} - -func compareOneblockRPCE(cmd *cobra.Command, args []string) error { - - ctx := cmd.Context() - filepath := args[0] - rpcEndpoint := args[1] - - fhBlock, err := getOneBlock(filepath) - if err != nil { - return err - } - - cli := rpc.NewClient(rpcEndpoint) - - rpcBlock, err := cli.GetBlockByNumber(ctx, rpc.BlockNumber(fhBlock.Number), rpc.WithGetBlockFullTransaction()) - if err != nil { - return err - } - - logs, err := cli.Logs(ctx, rpc.LogsParams{ - FromBlock: rpc.BlockNumber(fhBlock.Number), - ToBlock: rpc.BlockNumber(fhBlock.Number), - }) - if err != nil { - return err - } - - identical, diffs := CompareFirehoseToRPC(fhBlock, rpcBlock, logs) - if !identical { - fmt.Println("different", diffs) - } else { - fmt.Println(fhBlock.Number, "identical") - } - return nil -} - -func getOneBlock(path string) (*pbeth.Block, error) { - // Check if it's a file and if it exists - if !cli.FileExists(path) { - return nil, os.ErrNotExist - } - - file, err := os.Open(path) - if err != nil { - return nil, err - } - - uncompressedReader := zstd.NewReader(file) - defer uncompressedReader.Close() - - readerFactory, err := bstream.GetBlockReaderFactory.New(uncompressedReader) - if err != nil { - return nil, fmt.Errorf("new block reader: %w", err) - } - - block, err := readerFactory.Read() - if err != nil { - return nil, fmt.Errorf("reading block: %w", err) - } - - return block.ToProtocol().(*pbeth.Block), nil -} diff --git a/tools/compare-rpc.go b/tools/compare-rpc.go deleted file mode 100644 index 1fde9438..00000000 --- a/tools/compare-rpc.go +++ /dev/null @@ -1,437 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "bytes" - "fmt" - "io" - "os" - "strconv" - "time" - - "github.com/holiman/uint256" - jd "github.com/josephburnett/jd/lib" - "github.com/mostynb/go-grpc-compression/zstd" - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/cli" - "github.com/streamingfast/eth-go" - "github.com/streamingfast/eth-go/rpc" - firecore "github.com/streamingfast/firehose-core" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - "github.com/streamingfast/firehose/client" - pbfirehose "github.com/streamingfast/pbgo/sf/firehose/v2" - "go.uber.org/zap" - "google.golang.org/grpc" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/anypb" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" -) - -var compareBlocksRPCCmd = &cobra.Command{ - Use: "compare-blocks-rpc ", - Short: "Checks for any differences between a Firehose and RPC endpoint (get_block) for a specified range.", - Long: cli.Dedent(` - The 'compare-blocks-rpc' takes in a firehose URL, an RPC endpoint URL and inclusive start/stop block numbers. - `), - Args: cobra.ExactArgs(4), - RunE: compareBlocksRPCE, - Example: ExamplePrefixed("fireeth tools compare-blocks-rpc", ` - # Run over full block range - mainnet.eth.streamingfast.io:443 http://localhost:8545 1000000 1001000 - `), -} - -func init() { - Cmd.AddCommand(compareBlocksRPCCmd) - compareBlocksRPCCmd.PersistentFlags().Bool("diff", false, "When activated, difference is displayed for each block with a difference") - compareBlocksRPCCmd.Flags().BoolP("plaintext", "p", false, "Use plaintext connection to Firehose") - compareBlocksRPCCmd.Flags().BoolP("insecure", "k", false, "Use SSL connection to Firehose but skip SSL certificate validation") - - compareBlocksRPCCmd.Flags().StringP("api-token-env-var", "a", "FIREHOSE_API_TOKEN", "Look for a JWT in this environment variable to authenticate against endpoint") - - //compareBlocksRPCCmd.PersistentFlags().String("write-rpc-cache", "compared-rpc-blocks.jsonl", "When non-empty, the results of the RPC calls will be appended to this JSONL file") - //compareBlocksRPCCmd.PersistentFlags().String("read-rpc-cache", "compared-rpc-blocks.jsonl", "When non-empty, this file will be parsed before doing any RPC calls") -} - -func compareBlocksRPCE(cmd *cobra.Command, args []string) error { - - ctx := cmd.Context() - - firehoseEndpoint := args[0] - rpcEndpoint := args[1] - cli := rpc.NewClient(rpcEndpoint) - start, err := strconv.ParseInt(args[2], 10, 64) - if err != nil { - return fmt.Errorf("parsing start block num: %w", err) - } - stop, err := strconv.ParseUint(args[3], 10, 64) - if err != nil { - return fmt.Errorf("parsing stop block num: %w", err) - } - apiTokenEnvVar := mustGetString(cmd, "api-token-env-var") - jwt := os.Getenv(apiTokenEnvVar) - - plaintext := mustGetBool(cmd, "plaintext") - insecure := mustGetBool(cmd, "insecure") - - firehoseClient, connClose, grpcCallOpts, err := client.NewFirehoseClient(firehoseEndpoint, jwt, insecure, plaintext) - if err != nil { - return err - } - defer connClose() - - grpcCallOpts = append(grpcCallOpts, grpc.UseCompressor(zstd.Name)) - - request := &pbfirehose.Request{ - StartBlockNum: start, - StopBlockNum: stop, - FinalBlocksOnly: true, - } - - stream, err := firehoseClient.Blocks(ctx, request, grpcCallOpts...) - if err != nil { - return fmt.Errorf("unable to start blocks stream: %w", err) - } - - meta, err := stream.Header() - if err != nil { - zlog.Warn("cannot read header") - } else { - if hosts := meta.Get("hostname"); len(hosts) != 0 { - zlog = zlog.With(zap.String("remote_hostname", hosts[0])) - } - } - zlog.Info("connected") - - respChan := make(chan *pbeth.Block, 100) - - allDone := make(chan struct{}) - go func() { - - for fhBlock := range respChan { - - rpcBlock, err := cli.GetBlockByNumber(ctx, rpc.BlockNumber(fhBlock.Number), rpc.WithGetBlockFullTransaction()) - if err != nil { - panic(err) - } - - logs, err := cli.Logs(ctx, rpc.LogsParams{ - FromBlock: rpc.BlockNumber(fhBlock.Number), - ToBlock: rpc.BlockNumber(fhBlock.Number), - }) - if err != nil { - panic(err) - } - - identical, diffs := CompareFirehoseToRPC(fhBlock, rpcBlock, logs) - if !identical { - fmt.Println("different", diffs) - } else { - fmt.Println(fhBlock.Number, "identical") - } - } - close(allDone) - }() - - for { - response, err := stream.Recv() - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("stream error while receiving: %w", err) - } - blk, err := decodeAnyPB(response.Block) - if err != nil { - return fmt.Errorf("error while decoding block: %w", err) - } - respChan <- blk.ToProtocol().(*pbeth.Block) - } - close(respChan) - <-allDone - - return nil -} - -func bigIntFromEthUint256(in *eth.Uint256) *pbeth.BigInt { - if in == nil { - return &pbeth.BigInt{} - } - - in32 := (*uint256.Int)(in).Bytes32() - slice := bytes.TrimLeft(in32[:], string([]byte{0})) - if len(slice) == 0 { - return &pbeth.BigInt{} - } - return pbeth.BigIntFromBytes(slice) -} - -func toFirehoseBlock(in *rpc.Block, logs []*rpc.LogEntry) (*pbeth.Block, map[string]bool) { - - trx, hashesWithoutTo := toFirehoseTraces(in.Transactions, logs) - - out := &pbeth.Block{ - Hash: in.Hash.Bytes(), - Number: uint64(in.Number), - Ver: 3, - Size: uint64(in.BlockSize), - Uncles: toFirehoseUncles(in.Uncles), - TransactionTraces: trx, - Header: &pbeth.BlockHeader{ - ParentHash: in.ParentHash.Bytes(), - // Coinbase: nil, // FIXME - // UncleHash: nil, - StateRoot: in.StateRoot.Bytes(), - TransactionsRoot: in.TransactionsRoot.Bytes(), - ReceiptRoot: in.ReceiptsRoot.Bytes(), - LogsBloom: in.LogsBloom.Bytes(), - Difficulty: bigIntFromEthUint256(in.Difficulty), - TotalDifficulty: bigIntFromEthUint256(in.TotalDifficulty), - Number: uint64(in.Number), - GasLimit: uint64(in.GasLimit), - GasUsed: uint64(in.GasUsed), - Timestamp: timestamppb.New(time.Time(in.Timestamp)), - ExtraData: in.ExtraData.Bytes(), - Nonce: uint64(in.Nonce), - Hash: in.Hash.Bytes(), - MixHash: in.MixHash.Bytes(), - BaseFeePerGas: bigIntFromEthUint256(in.BaseFeePerGas), - // WithdrawalsRoot: in.WithdrawalsRoot, // FIXME - // TxDependency: in.TxDependency // FIXME - }, - } - return out, hashesWithoutTo -} - -func toFirehoseUncles(in []eth.Hash) []*pbeth.BlockHeader { - out := make([]*pbeth.BlockHeader, len(in)) - for i := range in { - out[i] = &pbeth.BlockHeader{ - Hash: in[i].Bytes(), - } - } - return out -} - -func toFirehoseTraces(in *rpc.BlockTransactions, logs []*rpc.LogEntry) (traces []*pbeth.TransactionTrace, hashesWithoutTo map[string]bool) { - - receipts, _ := in.Receipts() - out := make([]*pbeth.TransactionTrace, len(receipts)) - hashesWithoutTo = make(map[string]bool) - for i := range receipts { - txHash := eth.Hash(receipts[i].Hash.Bytes()).String() - var toBytes []byte - if receipts[i].To != nil { - toBytes = receipts[i].To.Bytes() - } else { - hashesWithoutTo[txHash] = true - } - - out[i] = &pbeth.TransactionTrace{ - Hash: receipts[i].Hash.Bytes(), - To: toBytes, - Nonce: uint64(receipts[i].Nonce), - GasLimit: uint64(receipts[i].Gas), - GasPrice: bigIntFromEthUint256(receipts[i].GasPrice), - Input: receipts[i].Input.Bytes(), - Value: bigIntFromEthUint256(receipts[i].Value), - From: receipts[i].From.Bytes(), - Index: uint32(receipts[i].TransactionIndex), - Receipt: &pbeth.TransactionReceipt{ - // filled next - }, - V: pbeth.NewBigInt(int64(receipts[i].V)).Bytes, - //R: bigIntFromEthUint256(receipts[i].R).Bytes, - //S: bigIntFromEthUint256(receipts[i].S).Bytes, - } - - for _, log := range logs { - if eth.Hash(log.TransactionHash).String() == txHash { - out[i].Receipt.Logs = append(out[i].Receipt.Logs, &pbeth.Log{ - Address: log.Address.Bytes(), //[]byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - Topics: hashesToBytes(log.Topics), //[][]byte `protobuf:"bytes,2,rep,name=topics,proto3" json:"topics,omitempty"` - Data: log.Data.Bytes(), //[]byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - BlockIndex: uint32(log.ToLog().BlockIndex), //uint32 `protobuf:"varint,6,opt,name=blockIndex,proto3" json:"blockIndex,omitempty"` - }) - } - } - - } - return out, hashesWithoutTo -} - -func hashesToBytes(in []eth.Hash) [][]byte { - out := make([][]byte, len(in)) - for i := range in { - out[i] = in[i].Bytes() - } - return out -} - -// only keep hash -func stripFirehoseUncles(in []*pbeth.BlockHeader) { - for _, uncle := range in { - uncle.BaseFeePerGas = nil - uncle.Coinbase = nil - uncle.Difficulty = nil - uncle.ExtraData = nil - uncle.GasLimit = 0 - uncle.GasUsed = 0 - uncle.LogsBloom = nil - uncle.MixHash = nil - uncle.Nonce = 0 - uncle.Number = 0 - uncle.ParentHash = nil - uncle.ReceiptRoot = nil - uncle.StateRoot = nil - uncle.Timestamp = nil - uncle.TotalDifficulty = nil - uncle.TransactionsRoot = nil - uncle.TxDependency = nil - uncle.UncleHash = nil - uncle.WithdrawalsRoot = nil - } -} - -func stripFirehoseHeader(in *pbeth.BlockHeader) { - in.Coinbase = nil - in.Timestamp = nil - in.TxDependency = nil - in.UncleHash = nil - in.WithdrawalsRoot = nil - - if in.BaseFeePerGas == nil { - in.BaseFeePerGas = &pbeth.BigInt{} - } - - if len(in.Difficulty.Bytes) == 1 && in.Difficulty.Bytes[0] == 0x0 { - in.Difficulty.Bytes = nil - } -} - -func stripFirehoseBlock(in *pbeth.Block, hashesWithoutTo map[string]bool) { - // clean up internal values - msg := in.ProtoReflect() - msg.SetUnknown(nil) - in = msg.Interface().(*pbeth.Block) - - in.Ver = 0 - stripFirehoseHeader(in.Header) - stripFirehoseUncles(in.Uncles) - stripFirehoseTransactionTraces(in.TransactionTraces, hashesWithoutTo) - - // ARB-ONE FIX - if in.Header.TotalDifficulty.Uint64() == 2 { - in.Header.TotalDifficulty = pbeth.NewBigInt(int64(in.Number) - 22207816) - } - - // FIXME temp - in.BalanceChanges = nil - in.CodeChanges = nil -} - -func stripFirehoseTransactionTraces(in []*pbeth.TransactionTrace, hashesWithoutTo map[string]bool) { - idx := uint32(0) - for _, trace := range in { - - if hashesWithoutTo[eth.Hash(trace.Hash).String()] { - trace.To = nil // FIXME: we could compute this from nonce+address - } - - trace.BeginOrdinal = 0 - trace.EndOrdinal = 0 - trace.AccessList = nil - - trace.GasUsed = 0 // FIXME receipt? - - if trace.GasPrice == nil { - trace.GasPrice = &pbeth.BigInt{} - } - - // FIXME ... - trace.R = nil - trace.S = nil - - trace.Type = 0 - trace.AccessList = nil - trace.MaxFeePerGas = nil - trace.MaxPriorityFeePerGas = nil - - trace.ReturnData = nil - trace.PublicKey = nil - - trace.Status = 0 - stripFirehoseTrxReceipt(trace.Receipt) - trace.Calls = nil - - if trace.Value == nil { - trace.Value = &pbeth.BigInt{} - } - idx++ - } -} - -func stripFirehoseTrxReceipt(in *pbeth.TransactionReceipt) { - for _, log := range in.Logs { - log.Ordinal = 0 - log.Index = 0 // index inside transaction is a pbeth construct, it doesn't exist in RPC interface and we can't reconstruct exactly the same from RPC because the pbeth ones are increased even when a call is reverted. - } - in.LogsBloom = nil - in.StateRoot = nil - in.CumulativeGasUsed = 0 -} - -func CompareFirehoseToRPC(fhBlock *pbeth.Block, rpcBlock *rpc.Block, logs []*rpc.LogEntry) (isEqual bool, differences []string) { - if fhBlock == nil && rpcBlock == nil { - return true, nil - } - - rpcAsPBEth, hashesWithoutTo := toFirehoseBlock(rpcBlock, logs) - stripFirehoseBlock(fhBlock, hashesWithoutTo) - - if !proto.Equal(fhBlock, rpcAsPBEth) { - fh, err := rpc.MarshalJSONRPCIndent(fhBlock, "", " ") - mustNoError(err) - rpc, err := rpc.MarshalJSONRPCIndent(rpcAsPBEth, "", " ") - mustNoError(err) - f, err := jd.ReadJsonString(string(fh)) - mustNoError(err) - r, err := jd.ReadJsonString(string(rpc)) - mustNoError(err) - // fmt.Println(string(fh)) - // fmt.Println("RPC") - // fmt.Println(string(rpc)) - - if diff := r.Diff(f).Render(); diff != "" { - differences = append(differences, diff) - } - return false, differences - } - return true, nil -} - -func decodeAnyPB(in *anypb.Any) (*bstream.Block, error) { - block := &pbeth.Block{} - if err := anypb.UnmarshalTo(in, block, proto.UnmarshalOptions{}); err != nil { - return nil, fmt.Errorf("unmarshal anypb: %w", err) - } - - // We are downloading only final blocks from the Firehose connection which means the LIB for them - // can be set to themself (althought we use `- 1` to ensure problem would occur if codde don't like - // `LIBNum == self.BlockNum`). - return blockEncoder.Encode(firecore.BlockEnveloppe{Block: block, LIBNum: block.Number - 1}) -} diff --git a/tools/compare.go b/tools/compare.go deleted file mode 100644 index 54684b33..00000000 --- a/tools/compare.go +++ /dev/null @@ -1,380 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "bytes" - "context" - "fmt" - "io" - "reflect" - "strconv" - "sync" - - jd "github.com/josephburnett/jd/lib" - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/cli" - "github.com/streamingfast/dstore" - "github.com/streamingfast/eth-go/rpc" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - sftools "github.com/streamingfast/sf-tools" - "go.uber.org/multierr" - "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" -) - -var compareBlocksCmd = &cobra.Command{ - Use: "compare-blocks []", - Short: "Checks for any differences between two block stores between a specified range. (To compare the likeness of two block ranges, for example)", - Long: cli.Dedent(` - The 'compare-blocks' takes in two paths to stores of merged blocks and a range specifying the blocks you - want to compare, written as: ':'. It will output the status of the likeness of every - 100,000 blocks, on completion, or on encountering a difference. Increments that contain a difference will - be communicated as well as the blocks within that contain differences. Increments that do not have any - differences will be outputted as identical. - - After passing through the blocks, it will output instructions on how to locate a specific difference - based on the blocks that were given. This is done by applying the '--diff' flag before your args. - - Commands inputted with '--diff' will display the blocks that have differences, as well as the - difference. - `), - Args: cobra.ExactArgs(3), - RunE: compareBlocksE, - Example: ExamplePrefixed("fireeth tools compare-blocks", ` - # Run over full block range - reference_store/ current_store/ 0:16000000 - - # Run over specific block range, displaying differences in blocks - --diff reference_store/ current_store/ 100:200 - `), -} - -var warnAboutExtraBlocks sync.Once - -func init() { - Cmd.AddCommand(compareBlocksCmd) - compareBlocksCmd.PersistentFlags().Bool("diff", false, "When activated, difference is displayed for each block with a difference") - compareBlocksCmd.PersistentFlags().Bool("include-unknown-fields", false, "When activated, the 'unknown fields' in the protobuf message will also be compared. These would not generate any difference when unmarshalled with the current protobuf definition.") -} - -func sanitizeBlock(block *pbeth.Block) *pbeth.Block { - for _, trxTrace := range block.TransactionTraces { - for _, call := range trxTrace.Calls { - if call.FailureReason != "" { - call.FailureReason = "(varying field)" - } - } - } - - return block -} - -func readBundle(ctx context.Context, filename string, store dstore.Store, fileStartBlock, stopBlock uint64) ([]string, map[string]*pbeth.Block, error) { - fileReader, err := store.OpenObject(ctx, filename) - if err != nil { - return nil, nil, fmt.Errorf("creating reader: %w", err) - } - - blockReader, err := bstream.GetBlockReaderFactory.New(fileReader) - if err != nil { - return nil, nil, fmt.Errorf("creating block reader: %w", err) - } - - var blockHashes []string - blocksMap := make(map[string]*pbeth.Block) - for { - curBlock, err := blockReader.Read() - if err == io.EOF { - break - } - if err != nil { - return nil, nil, fmt.Errorf("reading blocks: %w", err) - } - if curBlock.Number >= stopBlock { - break - } - if curBlock.Number < fileStartBlock { - warnAboutExtraBlocks.Do(func() { - fmt.Printf("Warn: Bundle file %s contains block %d, preceding its start_block. This 'feature' is not used anymore and extra blocks like this one will be ignored during compare\n", store.ObjectURL(filename), curBlock.Number) - }) - continue - } - - curBlockPB := sanitizeBlock(curBlock.ToProtocol().(*pbeth.Block)) - blockHashes = append(blockHashes, string(curBlockPB.Hash)) - blocksMap[string(curBlockPB.Hash)] = curBlockPB - } - - return blockHashes, blocksMap, nil -} - -func compareBlocksE(cmd *cobra.Command, args []string) error { - displayDiff := mustGetBool(cmd, "diff") - ignoreUnknown := !mustGetBool(cmd, "include-unknown-fields") - segmentSize := uint64(100000) - - ctx := cmd.Context() - blockRange, err := bstream.ParseRange(args[2]) - if err != nil { - return fmt.Errorf("parsing range: %w", err) - } - blockRangeSize, err := blockRange.Size() - if err != nil { - return fmt.Errorf("checking for valid range: %w", err) - } - if blockRangeSize == 0 { - return fmt.Errorf("invalid block range") - } - - stopBlock := *blockRange.EndBlock() - blockRangePrefix := sftools.WalkBlockPrefix(sftools.BlockRange{ - Start: blockRange.StartBlock(), - Stop: stopBlock, - }, 100) - - // Create stores - storeReference, err := dstore.NewDBinStore(args[0]) - if err != nil { - return fmt.Errorf("unable to create store at path %q: %w", args[0], err) - } - storeCurrent, err := dstore.NewDBinStore(args[1]) - if err != nil { - return fmt.Errorf("unable to create store at path %q: %w", args[1], err) - } - - segments, err := blockRange.Split(segmentSize) - if err != nil { - return fmt.Errorf("unable to split blockrage in segments: %w", err) - } - processState := &state{ - segments: segments, - } - - err = storeReference.Walk(ctx, blockRangePrefix, func(filename string) (err error) { - fileStartBlock, err := strconv.Atoi(filename) - if err != nil { - return fmt.Errorf("parsing filename: %w", err) - } - - // If reached end of range - if *blockRange.EndBlock() <= uint64(fileStartBlock) { - return dstore.StopIteration - } - - if blockRange.Contains(uint64(fileStartBlock)) { - var wg sync.WaitGroup - var bundleErrLock sync.Mutex - var bundleReadErr error - var referenceBlockHashes []string - var referenceBlocks map[string]*pbeth.Block - var currentBlocks map[string]*pbeth.Block - - wg.Add(1) - go func() { - defer wg.Done() - referenceBlockHashes, referenceBlocks, err = readBundle(ctx, filename, storeReference, uint64(fileStartBlock), stopBlock) - if err != nil { - bundleErrLock.Lock() - bundleReadErr = multierr.Append(bundleReadErr, err) - bundleErrLock.Unlock() - } - }() - - wg.Add(1) - go func() { - defer wg.Done() - _, currentBlocks, err = readBundle(ctx, filename, storeCurrent, uint64(fileStartBlock), stopBlock) - if err != nil { - bundleErrLock.Lock() - bundleReadErr = multierr.Append(bundleReadErr, err) - bundleErrLock.Unlock() - } - }() - wg.Wait() - if bundleReadErr != nil { - return fmt.Errorf("reading bundles: %w", bundleReadErr) - } - - for _, referenceBlockHash := range referenceBlockHashes { - referenceBlock := referenceBlocks[referenceBlockHash] - currentBlock, existsInCurrent := currentBlocks[referenceBlockHash] - - var isEqual bool - if existsInCurrent { - var differences []string - isEqual, differences = Compare(referenceBlock, currentBlock, ignoreUnknown) - if !isEqual { - fmt.Printf("- Block (%s) is different\n", referenceBlock.AsRef()) - if displayDiff { - for _, diff := range differences { - fmt.Println(" · ", diff) - } - } - } - } - processState.process(referenceBlock.Number, !isEqual, !existsInCurrent) - } - } - return nil - }) - if err != nil { - return fmt.Errorf("walking files: %w", err) - } - processState.print() - - return nil -} - -type state struct { - segments []*bstream.Range - currentSegmentIdx int - blocksCountedInThisSegment int - differencesFound int - missingBlocks int - totalBlocksCounted int -} - -func (s *state) process(blockNum uint64, isDifferent bool, isMissing bool) { - if !s.segments[s.currentSegmentIdx].Contains(blockNum) { // moving forward - s.print() - for i := s.currentSegmentIdx; i < len(s.segments); i++ { - if s.segments[i].Contains(blockNum) { - s.currentSegmentIdx = i - s.totalBlocksCounted += s.blocksCountedInThisSegment - s.differencesFound = 0 - s.missingBlocks = 0 - s.blocksCountedInThisSegment = 0 - } - } - } - - s.totalBlocksCounted++ - if isMissing { - s.missingBlocks++ - } else if isDifferent { - s.differencesFound++ - } - -} - -func (s *state) print() { - endBlock := "∞" - if end := s.segments[s.currentSegmentIdx].EndBlock(); end != nil { - endBlock = fmt.Sprintf("%d", *end) - } - if s.totalBlocksCounted == 0 { - fmt.Printf("✖ No blocks were found at all for segment %d - %s\n", s.segments[s.currentSegmentIdx].StartBlock(), endBlock) - return - } - - if s.differencesFound == 0 && s.missingBlocks == 0 { - fmt.Printf("✓ Segment %d - %s has no differences (%d blocks counted)\n", s.segments[s.currentSegmentIdx].StartBlock(), endBlock, s.totalBlocksCounted) - return - } - - if s.differencesFound == 0 && s.missingBlocks == 0 { - fmt.Printf("✓~ Segment %d - %s has no differences but does have %d missing blocks (%d blocks counted)\n", s.segments[s.currentSegmentIdx].StartBlock(), endBlock, s.missingBlocks, s.totalBlocksCounted) - return - } - - fmt.Printf("✖ Segment %d - %s has %d different blocks and %d missing blocks (%d blocks counted)\n", s.segments[s.currentSegmentIdx].StartBlock(), endBlock, s.differencesFound, s.missingBlocks, s.totalBlocksCounted) -} - -func Compare(reference, current *pbeth.Block, ignoreUnknown bool) (isEqual bool, differences []string) { - if reference == nil && current == nil { - return true, nil - } - if reflect.TypeOf(reference).Kind() == reflect.Ptr && reference == current { - return true, nil - } - - referenceMsg := reference.ProtoReflect() - currentMsg := current.ProtoReflect() - if referenceMsg.IsValid() && !currentMsg.IsValid() { - return false, []string{fmt.Sprintf("reference block is valid protobuf message, but current block is invalid")} - } - if !referenceMsg.IsValid() && currentMsg.IsValid() { - return false, []string{fmt.Sprintf("reference block is invalid protobuf message, but current block is valid")} - } - - if ignoreUnknown { - referenceMsg.SetUnknown(nil) - currentMsg.SetUnknown(nil) - reference = referenceMsg.Interface().(*pbeth.Block) - current = currentMsg.Interface().(*pbeth.Block) - } else { - x := referenceMsg.GetUnknown() - y := currentMsg.GetUnknown() - - if !bytes.Equal(x, y) { - // from https://github.com/protocolbuffers/protobuf-go/tree/v1.28.1/proto - mx := make(map[protoreflect.FieldNumber]protoreflect.RawFields) - my := make(map[protoreflect.FieldNumber]protoreflect.RawFields) - for len(x) > 0 { - fnum, _, n := protowire.ConsumeField(x) - mx[fnum] = append(mx[fnum], x[:n]...) - x = x[n:] - } - for len(y) > 0 { - fnum, _, n := protowire.ConsumeField(y) - my[fnum] = append(my[fnum], y[:n]...) - y = y[n:] - } - for k, v := range mx { - vv, ok := my[k] - if !ok { - differences = append(differences, fmt.Sprintf("reference block contains unknown protobuf field number %d (%x), but current block does not", k, v)) - continue - } - if !bytes.Equal(v, vv) { - differences = append(differences, fmt.Sprintf("unknown protobuf field number %d has different values. Reference: %x, current: %x", k, v, vv)) - } - } - for k := range my { - v, ok := my[k] - if !ok { - differences = append(differences, fmt.Sprintf("current block contains unknown protobuf field number %d (%x), but reference block does not", k, v)) - continue - } - } - } - } - - if !proto.Equal(reference, current) { - ref, err := rpc.MarshalJSONRPCIndent(reference, "", " ") - mustNoError(err) - cur, err := rpc.MarshalJSONRPCIndent(current, "", " ") - mustNoError(err) - r, err := jd.ReadJsonString(string(ref)) - mustNoError(err) - c, err := jd.ReadJsonString(string(cur)) - mustNoError(err) - - if diff := r.Diff(c).Render(); diff != "" { - differences = append(differences, diff) - } - return false, differences - } - return true, nil -} - -func mustNoError(err error) { - if err != nil { - panic(err) - } -} diff --git a/tools/fix-polygon-index.go b/tools/fix-polygon-index.go deleted file mode 100644 index c3f33fe8..00000000 --- a/tools/fix-polygon-index.go +++ /dev/null @@ -1,164 +0,0 @@ -package tools - -import ( - "context" - "fmt" - "io" - "strconv" - - "github.com/spf13/cobra" - "github.com/streamingfast/bstream" - "github.com/streamingfast/dstore" - firecore "github.com/streamingfast/firehose-core" - pbeth "github.com/streamingfast/firehose-ethereum/types/pb/sf/ethereum/type/v2" - "go.uber.org/zap" -) - -var fixPolygonIndexCmd = &cobra.Command{ - Use: "fix-polygon-index ", - Short: "look for blocks containing a single transaction with index==1 (where it should be index==0) and rewrite the affected 100-block-files to dest. it does not rewrite correct merged-files-bundles", - Args: cobra.ExactArgs(4), - RunE: fixPolygonIndexE, -} - -func init() { - Cmd.AddCommand(fixPolygonIndexCmd) -} - -func fixPolygonIndexE(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - - srcStore, err := dstore.NewDBinStore(args[0]) - if err != nil { - return fmt.Errorf("unable to create source store: %w", err) - } - - destStore, err := dstore.NewDBinStore(args[1]) - if err != nil { - return fmt.Errorf("unable to create destination store: %w", err) - } - - start := mustParseUint64(args[2]) - stop := mustParseUint64(args[3]) - - if stop <= start { - return fmt.Errorf("stop block must be greater than start block") - } - - startWalkFrom := fmt.Sprintf("%010d", start-(start%100)) - err = srcStore.WalkFrom(ctx, "", startWalkFrom, func(filename string) error { - zlog.Debug("checking merged block file", zap.String("filename", filename)) - - startBlock := mustParseUint64(filename) - - if startBlock > stop { - zlog.Debug("skipping merged block file", zap.String("reason", "past stop block"), zap.String("filename", filename)) - return io.EOF - } - - if startBlock+100 < start { - zlog.Debug("skipping merged block file", zap.String("reason", "before start block"), zap.String("filename", filename)) - return nil - } - - rc, err := srcStore.OpenObject(ctx, filename) - if err != nil { - return fmt.Errorf("failed to open %s: %w", filename, err) - } - defer rc.Close() - - br, err := bstream.GetBlockReaderFactory.New(rc) - if err != nil { - return fmt.Errorf("creating block reader: %w", err) - } - - var mustWrite bool - blocks := make([]*bstream.Block, 100) - i := 0 - for { - block, err := br.Read() - if err == io.EOF { - break - } - - ethBlock := block.ToProtocol().(*pbeth.Block) - if len(ethBlock.TransactionTraces) == 1 && - ethBlock.TransactionTraces[0].Index == 1 { - fmt.Println("ERROR FOUND AT BLOCK", block.Number) - mustWrite = true - ethBlock.TransactionTraces[0].Index = 0 - block, err = blockEncoder.Encode(firecore.BlockEnveloppe{Block: ethBlock, LIBNum: block.LibNum}) - if err != nil { - return fmt.Errorf("re-packing the block: %w", err) - } - } - blocks[i] = block - i++ - } - if i != 100 { - return fmt.Errorf("expected to have read 100 blocks, we have read %d. Bailing out.", i) - } - if mustWrite { - if err := writeMergedBlocks(startBlock, destStore, blocks); err != nil { - return fmt.Errorf("writing merged block %d: %w", startBlock, err) - } - } - - return nil - }) - - if err == io.EOF { - return nil - } - - if err != nil { - return err - } - - return nil -} - -func writeMergedBlocks(lowBlockNum uint64, store dstore.Store, blocks []*bstream.Block) error { - file := filename(lowBlockNum) - fmt.Printf("writing merged file %s.dbin.zst\n", file) - - if len(blocks) == 0 { - return fmt.Errorf("no blocks to write to bundle") - } - - pr, pw := io.Pipe() - - go func() { - var err error - defer func() { - pw.CloseWithError(err) - }() - - blockWriter, err := bstream.GetBlockWriterFactory.New(pw) - if err != nil { - return - } - - for _, blk := range blocks { - err = blockWriter.Write(blk) - if err != nil { - return - } - } - }() - - return store.WriteObject(context.Background(), file, pr) -} - -func filename(num uint64) string { - return fmt.Sprintf("%010d", num) -} - -func mustParseUint64(in string) uint64 { - out, err := strconv.ParseUint(in, 0, 64) - if err != nil { - panic(fmt.Errorf("unable to parse %q as uint64: %w", in, err)) - } - - return out -} diff --git a/tools/logging.go b/tools/logging.go deleted file mode 100644 index 3bfcacef..00000000 --- a/tools/logging.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 dfuse Platform Inc. -// -// 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 tools - -import ( - "github.com/streamingfast/logging" - "go.uber.org/zap" -) - -var zlog, tracer = logging.PackageLogger("tools", "github.com/streamingfast/firehose-ethereum/tools", logging.LoggerDefaultLevel(zap.InfoLevel)) diff --git a/tools/poll-rpc-blocks.go b/tools/poll-rpc-blocks.go deleted file mode 100644 index 3399ef17..00000000 --- a/tools/poll-rpc-blocks.go +++ /dev/null @@ -1,107 +0,0 @@ -package tools - -import ( - "encoding/base64" - "encoding/hex" - "fmt" - "strconv" - "time" - - "github.com/spf13/cobra" - "github.com/streamingfast/eth-go/rpc" - "go.uber.org/zap" - "google.golang.org/protobuf/proto" -) - -func init() { - Cmd.AddCommand(pollRPCBlocksCmd) -} - -var pollRPCBlocksCmd = &cobra.Command{ - Use: "poll-rpc-blocks ", - Short: "Generate 'light' firehose blocks from an RPC endpoint", - Args: cobra.ExactArgs(2), - RunE: pollRPCBlocksE, -} - -var pollDelay = time.Millisecond * 100 - -var lastDelayWarning time.Time - -func delay(err error) { - if err != nil { - zlog.Warn("retrying...", zap.Error(err)) - } - time.Sleep(pollDelay) -} - -func pollRPCBlocksE(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - - rpcEndpoint := args[0] - startBlockNumStr := args[1] - - zlog.Info("retrieving from rpc endpoint", - zap.String("start_block_num", startBlockNumStr), - zap.String("rpc_endpoint", rpcEndpoint), - ) - startBlockNum, err := strconv.ParseUint(startBlockNumStr, 10, 64) - if err != nil { - return fmt.Errorf("unable to parse start block number %s: %w", startBlockNumStr, err) - } - client := rpc.NewClient(rpcEndpoint) - - fmt.Println("FIRE INIT 2.3 local v1.0.0") - - blockNum := startBlockNum - latestBlockNum := uint64(0) - for { - - if latestBlockNum < blockNum { - latestBlockNum, err = client.LatestBlockNum(ctx) - zlog.Info("fetched latest block num", zap.Uint64("latest_block_num", latestBlockNum), zap.Uint64("block_num", blockNum)) - if err != nil { - delay(err) - continue - } - - if latestBlockNum < blockNum { - delay(nil) - continue - } - } - - rpcBlock, err := client.GetBlockByNumber(ctx, rpc.BlockNumber(blockNum), rpc.WithGetBlockFullTransaction()) - if err != nil { - delay(err) - continue - } - - logs, err := client.Logs(ctx, rpc.LogsParams{ - FromBlock: rpc.BlockNumber(blockNum), - ToBlock: rpc.BlockNumber(blockNum), - }) - - if err != nil { - delay(err) - continue - } - - block, _ := toFirehoseBlock(rpcBlock, logs) - cnt, err := proto.Marshal(block) - if err != nil { - return fmt.Errorf("failed to proto marshal pb sol block: %w", err) - } - - libNum := uint64(0) - if blockNum != 0 { - libNum = blockNum - 1 - } - b64Cnt := base64.StdEncoding.EncodeToString(cnt) - lineCnt := fmt.Sprintf("FIRE BLOCK %d %s %d %s %s", blockNum, hex.EncodeToString(block.Hash), libNum, hex.EncodeToString(block.Header.ParentHash), b64Cnt) - if _, err := fmt.Println(lineCnt); err != nil { - return fmt.Errorf("failed to write log line (char lenght %d): %w", len(lineCnt), err) - } - blockNum++ - } -} From 31a3bd36635063620a3ceb05138fd7e9fbc8df8b Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Thu, 2 Nov 2023 15:00:38 -0400 Subject: [PATCH 10/11] Added example of how to call enforce peers and enabled `--once` mode for single time call --- cmd/fireeth/tools_geth_enforce_peers.go | 275 ++++++++++++++++-------- devel/standard/miner/config.toml | 4 +- 2 files changed, 188 insertions(+), 91 deletions(-) diff --git a/cmd/fireeth/tools_geth_enforce_peers.go b/cmd/fireeth/tools_geth_enforce_peers.go index 58546d8d..42b1e67f 100644 --- a/cmd/fireeth/tools_geth_enforce_peers.go +++ b/cmd/fireeth/tools_geth_enforce_peers.go @@ -16,6 +16,7 @@ package main import ( "bufio" + "context" "fmt" "io" "net" @@ -26,6 +27,7 @@ import ( "sync" "time" + "github.com/bobg/go-generics/v2/slices" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/streamingfast/bstream" @@ -46,12 +48,16 @@ func registerGethEnforcePeersCmd(parent *cobra.Command, binary string, logger *z "enforce-peers", "Enforce provided peers to be connected to the node, this tools is meant to run as a sidecar to a Geth node", Flags(func(flags *pflag.FlagSet) { + flags.BoolP("once", "o", false, "Run as a unit operation and avoid launching a long running process") flags.String("ipc-file-path", "", "Path to the IPC file to connect to") flags.StringArray("ensure-peers", nil, "List of peers to ensure connection to") - }), ExamplePrefixed(fmt.Sprintf("%s tools geth enforce-peers", binary), ` + # Run as a long running process + --ipc-file-path=/var/data/geth/ipc --ensure-peers=[:] + # Run only once instead of launching a long running process + --ipc-file-path=/var/data/geth/ipc --ensure-peers=[:] --once `), ), ), @@ -78,24 +84,66 @@ func createGethEnforcePeersE(logger *zap.Logger, tracer logging.Tracer) firecore Shutter: shutter.New(), node: node, wantedPeersHostnames: sflags.MustGetStringArray(cmd, "ensure-peers"), + wantedPeers: map[string]*Enode{}, logger: logger.Named("enforcer"), } cli.Ensure(len(peersEnforcer.wantedPeersHostnames) > 0, "--ensure-peers is required") - app := cli.NewApplication(cmd.Context()) + if sflags.MustGetBool(cmd, "once") { + return runOnce(node, monitor, peersEnforcer) + } + + return runDaemon(cmd.Context(), logger, monitor, peersEnforcer) + } +} - logger.Info("starting Geth monitor") - app.SuperviseAndStart(monitor) +func runOnce(node *GethNode, monitor *GethMonitor, enforcer *GethPeersEnforcer) error { + if err := monitor.runOnce(); err != nil { + return fmt.Errorf("cannot run monitor once: %w", err) + } - logger.Info("starting Geth peers enforcer") - app.SuperviseAndStart(peersEnforcer) + if err := enforcer.runOnce(); err != nil { + return fmt.Errorf("cannot run peers enforcer once: %w", err) + } - logger.Info("waiting for termination signal") - app.WaitForTermination(logger, 0, 0) + // The second run of the monitor is to ensure that connected peers were recorded + if err := monitor.runOnce(); err != nil { + return fmt.Errorf("cannot run monitor once: %w", err) + } - return nil + fmt.Printf("Connected peers (%d)\n", len(node.connectedPeers)) + for _, peer := range node.connectedPeers { + peerEnode, err := parseEnode(peer) + if err != nil { + fmt.Println("- " + peer) + continue + } + + suffix := "" + if _, found := enforcer.wantedPeers[peerEnode.ID]; found { + suffix = " (wanted)" + } + + fmt.Println("- " + peer + suffix) } + + return nil +} + +func runDaemon(ctx context.Context, logger *zap.Logger, monitor *GethMonitor, enforcer *GethPeersEnforcer) error { + app := cli.NewApplication(ctx) + + logger.Info("starting Geth monitor") + app.SuperviseAndStart(monitor) + + logger.Info("starting Geth peers enforcer") + app.SuperviseAndStart(enforcer) + + logger.Info("waiting for termination signal") + app.WaitForTermination(logger, 0, 0) + + return nil } var enodeRegexp = regexp.MustCompile(`enode://([a-f0-9]*)@.*$`) @@ -148,6 +196,7 @@ type GethPeersEnforcer struct { node *GethNode wantedPeersHostnames []string + wantedPeers map[string]*Enode logger *zap.Logger } @@ -158,37 +207,46 @@ func (s *GethPeersEnforcer) Run() { for { select { case <-s.Terminating(): - s.logger.Info("geth PeersEnforcer terminated") + s.logger.Info("geth peers enforced terminated") return case <-time.After(10 * time.Second): } - if len(s.node.enodeStr) < 20 { - s.logger.Info("wrong enode string will retry", zap.String("enode", s.node.enodeStr)) - continue + if err := s.runOnce(); err != nil { + s.logger.Warn("enforce peer run failed", zap.Error(err)) } + } +} - allEnodes := map[string]bool{} - for _, hostname := range s.wantedPeersHostnames { - enodes := s.getEnodesFromPeers(hostname) - s.logger.Debug("got enode", zap.String("hostname", hostname), zap.Strings("enodes", enodes)) +func (s *GethPeersEnforcer) runOnce() error { + if len(s.node.enodeStr) < 20 { + s.logger.Info("wrong enode string will retry", zap.String("enode", s.node.enodeStr)) + return nil + } - for _, enode := range enodes { - allEnodes[enode] = true - } + for _, hostname := range s.wantedPeersHostnames { + enodes := s.getEnodesFromPeers(hostname) + + enodesString := slices.Map(enodes, func(e *Enode) string { return e.String() }) + s.logger.Debug("got enode", zap.String("hostname", hostname), zap.Strings("enodes", enodesString)) + + for _, enode := range enodes { + s.wantedPeers[enode.ID] = enode } + } - for enode := range allEnodes { - if err := s.addPeer(enode); err != nil { - s.logger.Warn("cannot add peer", zap.String("enode", enode)) - } + for _, enode := range s.wantedPeers { + if err := s.addPeer(enode); err != nil { + return fmt.Errorf("cannot add peer: %w", err) } } + + return nil } // AddPeer sends a command through IPC socket to connect geth to the given peer -func (s *GethPeersEnforcer) addPeer(peer string) error { - if s.mustIgnorePeer(peer) { +func (s *GethPeersEnforcer) addPeer(peer *Enode) error { + if s.mustIgnorePeer(peer.Full) { return nil } @@ -223,7 +281,36 @@ func (s *GethPeersEnforcer) mustIgnorePeer(peer string) bool { return false } -func (s *GethPeersEnforcer) getEnodesFromPeers(hostname string) []string { +type Enode struct { + Full string + ID string + IP string +} + +func (e *Enode) String() string { + return e.Full +} + +func parseEnode(in string) (*Enode, error) { + // enode://e4d5433fd9e84930cd38028f2fdb1ca8d55bdb7b6a749da57e8aa7fc5d3c146c44c0d129a14cecc7b0f13bb98700bf392dd4fd7c31bf2fe26038d4ba8f5a8e32@127.0.0.1:30303 + if !strings.HasPrefix(in, "enode://") { + return nil, fmt.Errorf("invalid enode string, must start with 'enode://': %s", in) + } + + raw := strings.TrimPrefix(in, "enode://") + id, ip, ok := strings.Cut(raw, "@") + if !ok { + return nil, fmt.Errorf("invalid enode string, must have '@' separator: %s", in) + } + + return &Enode{ + Full: in, + ID: id, + IP: ip, + }, nil +} + +func (s *GethPeersEnforcer) getEnodesFromPeers(hostname string) []*Enode { port := "8545" if splitted := strings.Split(hostname, ":"); len(splitted) == 2 { port = splitted[1] @@ -237,7 +324,8 @@ func (s *GethPeersEnforcer) getEnodesFromPeers(hostname string) []string { s.logger.Warn("cannot get IP for hostname", zap.Error(err), zap.String("hostname", hostname)) return nil } - var enodes []string + + var enodes []*Enode for _, ip := range ips { endpoint := fmt.Sprintf("http://%s:%s", ip, port) body := `{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}` @@ -249,11 +337,14 @@ func (s *GethPeersEnforcer) getEnodesFromPeers(hostname string) []string { } enodeStr := gjson.Get(enodeAddr, "result.enode").String() - if !strings.HasPrefix(enodeStr, "enode://") { - s.logger.Warn("got invalid enode string from IP", zap.Stringer("ip", ip), zap.String("enode", enodeStr)) + + enode, err := parseEnode(enodeStr) + if err != nil { + s.logger.Warn("got invalid enode string from IP", zap.String("enode", enodeStr), zap.Error(err)) continue } - enodes = append(enodes, enodeStr) + + enodes = append(enodes, enode) } return enodes } @@ -268,84 +359,90 @@ type GethMonitor struct { // Monitor periodically checks the head block num and block time, as well as the enode string (server ID) func (s *GethMonitor) Run() { - started := time.Now() - var lastLog *time.Time for { select { case <-s.Terminating(): - s.logger.Info("geth Monitor terminated") + s.logger.Info("geth monitor terminated") return case <-time.After(2 * time.Second): } - resp, err := s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}`) - if err != nil { - s.logger.Warn("geth Monitor cannot get info from IPC socket", zap.Error(err)) - if time.Since(started) < time.Minute { - continue - } - } else { - enodeStr := gjson.Get(resp, "result.enode").String() + if err := s.runOnce(); err != nil { + s.logger.Warn("geth monitor run failed", zap.Error(err)) + } - fields := []zap.Field{zap.String("enode", enodeStr)} - if s.tracer.Enabled() { - fields = append(fields, zap.Reflect("resp", resp)) + if lastLog == nil || time.Since(*lastLog) > time.Minute { + if s.node.lastBlock == nil { + s.logger.Info("geth monitor never seen last block yet") + } else { + s.logger.Info("geth monitor last block seen", zap.Stringer("block", s.node.lastBlock.AsRef())) } - s.logger.Debug("geth Monitor got node info", fields...) - s.node.setEnodeStr(enodeStr) + now := time.Now() + lastLog = &now } + } +} - resp, err = s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}`) - if err != nil { - s.logger.Warn("geth Monitor cannot get peers from IPC socket", zap.Error(err)) - } else { - connectedPeers := []string{} - for _, peer := range gjson.Get(resp, "result").Array() { - connectedPeers = append(connectedPeers, peer.Get("enode").String()) - } - s.node.peerMutex.Lock() - s.node.connectedPeers = connectedPeers - s.node.peerMutex.Unlock() - } +func (s *GethMonitor) runOnce() error { + resp, err := s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_nodeInfo","params":[],"id":1}`) + if err != nil { + return fmt.Errorf("cannot get info from IPC socket: %w", err) + } - resp, err = s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}`) - if err != nil { - s.logger.Warn("geth Monitor cannot get blocknumber from IPC socket", zap.Error(err)) - continue - } - lastBlock := gjson.Get(resp, "result") - lastBlockNum := hex2uint(lastBlock.String()) - if lastBlockNum == 0 { - continue - } + enodeStr := gjson.Get(resp, "result.enode").String() - resp, err = s.node.sendGethCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["%s", true],"id":1}`, lastBlock)) - if err != nil { - s.logger.Warn("geth Monitor cannot get block by number", zap.Error(err)) - continue - } - timestamp := time.Unix(hex2int(gjson.Get(resp, "result.timestamp").String()), 0) - hash := hex2string(gjson.Get(resp, "result.hash").String()) - - s.node.lastBlockMutex.Lock() - s.node.lastBlock = &bstream.Block{ - Id: hash, - Number: uint64(lastBlockNum), - Timestamp: timestamp, - } + fields := []zap.Field{zap.String("enode", enodeStr)} + if s.tracer.Enabled() { + fields = append(fields, zap.Reflect("resp", resp)) + } - if lastLog == nil || time.Since(*lastLog) > time.Minute { - s.logger.Info("monitor last block seen", zap.Stringer("block", s.node.lastBlock.AsRef())) + s.logger.Debug("got node info", fields...) + s.node.setEnodeStr(enodeStr) - now := time.Now() - lastLog = &now - } + resp, err = s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"admin_peers","params":[],"id":1}`) + if err != nil { + return fmt.Errorf("cannot get peers from IPC socket: %w", err) + } - s.node.lastBlockMutex.Unlock() + connectedPeers := []string{} + for _, peer := range gjson.Get(resp, "result").Array() { + connectedPeers = append(connectedPeers, peer.Get("enode").String()) } + s.node.peerMutex.Lock() + s.node.connectedPeers = connectedPeers + s.node.peerMutex.Unlock() + + resp, err = s.node.sendGethCommand(`{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}`) + if err != nil { + return fmt.Errorf("cannot get blocknumber from IPC socket: %w", err) + } + + lastBlock := gjson.Get(resp, "result") + lastBlockNum := hex2uint(lastBlock.String()) + if lastBlockNum == 0 { + return fmt.Errorf("last block is 0, skipping") + } + + resp, err = s.node.sendGethCommand(fmt.Sprintf(`{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["%s", true],"id":1}`, lastBlock)) + if err != nil { + return fmt.Errorf("cannot get block by number: %w", err) + } + + timestamp := time.Unix(hex2int(gjson.Get(resp, "result.timestamp").String()), 0) + hash := hex2string(gjson.Get(resp, "result.hash").String()) + + s.node.lastBlockMutex.Lock() + s.node.lastBlock = &bstream.Block{ + Id: hash, + Number: uint64(lastBlockNum), + Timestamp: timestamp, + } + s.node.lastBlockMutex.Unlock() + + return nil } // cannot use ReadAll on an IPC socket diff --git a/devel/standard/miner/config.toml b/devel/standard/miner/config.toml index 594ffb79..e11de29a 100644 --- a/devel/standard/miner/config.toml +++ b/devel/standard/miner/config.toml @@ -5,9 +5,9 @@ SyncMode = "full" NoPruning = true [Node] -HTTPHost = "" +HTTPHost = "localhost" HTTPPort = 8545 -HTTPModules = ["personal", "net", "web3", "eth"] +HTTPModules = ["admin", "personal", "net", "web3", "eth"] AuthPort = 8551 [Node.P2P] From 1bb5c8651ccd05b8057971a5315413e15363c2c7 Mon Sep 17 00:00:00 2001 From: Matthieu Vachon Date: Thu, 2 Nov 2023 15:27:54 -0400 Subject: [PATCH 11/11] Updated to latest `firehose-core` --- go.mod | 33 +++--- go.sum | 360 +-------------------------------------------------------- 2 files changed, 20 insertions(+), 373 deletions(-) diff --git a/go.mod b/go.mod index 6ae709af..58306b6f 100644 --- a/go.mod +++ b/go.mod @@ -5,39 +5,25 @@ go 1.21 require ( github.com/DataDog/zstd v1.5.5 github.com/RoaringBitmap/roaring v0.9.4 - github.com/ShinyTrinkets/overseer v0.3.0 + github.com/bobg/go-generics/v2 v2.1.1 github.com/golang/protobuf v1.5.3 github.com/holiman/uint256 v1.2.0 github.com/josephburnett/jd v1.7.1 - github.com/lithammer/dedent v1.1.0 - github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/manifoldco/promptui v0.9.0 github.com/mitchellh/go-testing-interface v1.14.1 github.com/mostynb/go-grpc-compression v1.1.17 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.15.0 github.com/streamingfast/bstream v0.0.2-0.20230829131224-b9272048dc6a github.com/streamingfast/cli v0.0.4-0.20230825151644-8cc84512cd80 - github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330 - github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1 - github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa - github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e - github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa github.com/streamingfast/dmetrics v0.0.0-20230919161904-206fa8ebd545 github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9 - github.com/streamingfast/firehose-core v0.1.12-0.20231030151853-bc6879426511 - github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 + github.com/streamingfast/firehose-core v0.1.13-0.20231102161517-3bc681ef5fc3 github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 - github.com/streamingfast/merger v0.0.3-0.20230413191947-fe3ce68cb9f8 github.com/streamingfast/node-manager v0.0.2-0.20230406142433-692298a8b8d2 github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 - github.com/streamingfast/relayer v0.0.2-0.20220909122435-e67fbc964fd9 - github.com/streamingfast/sf-tools v0.0.0-20230811131237-97a5d4afa459 - github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9 github.com/streamingfast/shutter v1.5.0 github.com/streamingfast/substreams v1.1.20 github.com/stretchr/testify v1.8.4 @@ -70,13 +56,13 @@ require ( github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/ShinyTrinkets/meta-logger v0.2.0 // indirect + github.com/ShinyTrinkets/overseer v0.3.0 // indirect github.com/abourget/llerrgroup v0.2.0 // indirect github.com/aws/aws-sdk-go v1.44.325 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.3.1 // indirect github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d // indirect - github.com/bobg/go-generics/v2 v2.1.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/bufbuild/connect-go v1.10.0 // indirect github.com/bufbuild/connect-grpchealth-go v1.1.1 // indirect @@ -134,8 +120,11 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p v0.26.3 // indirect + github.com/lithammer/dedent v1.1.0 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-ieproxy v0.0.1 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/sha256-simd v1.0.0 // indirect @@ -172,10 +161,20 @@ require ( github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/viper v1.15.0 // indirect github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 // indirect + github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330 // indirect github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad // indirect + github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1 // indirect + github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa // indirect + github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e // indirect + github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa // indirect github.com/streamingfast/dtracing v0.0.0-20220305214756-b5c0e8699839 // indirect + github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 // indirect + github.com/streamingfast/merger v0.0.3-0.20231027161314-209c2ddd8d96 // indirect github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 // indirect + github.com/streamingfast/relayer v0.0.2-0.20220909122435-e67fbc964fd9 // indirect + github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9 // indirect github.com/streamingfast/snapshotter v0.0.0-20230316190750-5bcadfde44d0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf // indirect diff --git a/go.sum b/go.sum index 4fafd56b..cd807ae0 100644 --- a/go.sum +++ b/go.sum @@ -28,11 +28,6 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -41,23 +36,12 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf 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/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= 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/container v1.3.1/go.mod h1:/mI/mTug/DwXJPxysUoInyvF3ekeXGiP8teCAtgGMdM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/logging v1.7.0 h1:CJYxlNNNNAMkHp9em/YEXcfJg+rPDg7YfwoRpMU+t5I= @@ -65,7 +49,6 @@ cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeN cloud.google.com/go/longrunning v0.5.1 h1:Fr7TXftcqTudoyRJa113hyaqlGdiBQkp0Gq7tErFDWI= cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= -cloud.google.com/go/monitoring v1.6.0/go.mod h1:w+OY1TYCk4MtvY7WfEHlIp5mP8SV/gDSqOsvGhVa2KM= cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58= cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -78,16 +61,12 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM= cloud.google.com/go/trace v1.10.1 h1:EwGdOLCNfYOOPtgqo+D2sDLZmRCEO1AagRTJCU6ztdg= cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk= -contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ= contrib.go.opencensus.io/exporter/stackdriver v0.13.10 h1:a9+GZPUe+ONKUwULjlEOucMMG0qfSCCenlji0Nhqbys= contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8= contrib.go.opencensus.io/exporter/zipkin v0.1.1 h1:PR+1zWqY8ceXs1qDQQIlgXe+sdiwCf0n32bH4+Epk8g= @@ -116,12 +95,10 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.3 h1:fiyErF/p5fz79DvMCca9ayvYiWYsFP1oJbskt9fjo8I= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.3/go.mod h1:s7Gpwj0tk7XnVCm4BQEmx/mbS36SuTCY/vMB2SNxe8o= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.6/go.mod h1:NE8dAwJ1VU4WFdJYTlO0tdobQFdy70z8wNDU1L3VAr4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.15.0 h1:5uR5WqunMUqN5Z+USN/N25aM7zWd0JUCIfz1B/w0HtA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.15.0/go.mod h1:LTScD9l1w6+z1IB3FKtXxS4oenRlIJQQrIiV/Iq1Bsw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.39.0 h1:RDD62LpQbuv4rpLOm0w1zlLIcIo7k+zi3EZV5nVyAo8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.39.0/go.mod h1:PV+bUv9S+/W9PmZECvnC39uIEYnDL9veytwZrMqPexc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.32.6/go.mod h1:/G0zPXsUx5gZUd6ryJakuDo4VR7EJScegf1ZNK8xIGs= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.39.0 h1:uZvy89rOd+9ryIir65RO7BmKYxQ9uBbFcnNcslu6RIM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.39.0/go.mod h1:lz6DEePTxmjvYMtusOoS3qDAErC0STi/wmvqJucKY28= github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221018185641-36f91511cfd7 h1:4cXY9jZO7UoRYKyD+CssnBlwn2HTeUzCQ1b44PJijzc= @@ -138,23 +115,12 @@ github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h github.com/ShinyTrinkets/meta-logger v0.2.0 h1:oR533+wuhSJ+vLsnSq1CBSGQygNv8nDsvuRUVcOls0g= github.com/ShinyTrinkets/meta-logger v0.2.0/go.mod h1:cY1KnpPfpLIopR+arZXHYVrVGO6AETrhi3HmRGFjU+U= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= github.com/abourget/llerrgroup v0.2.0 h1:2nPXy6Owo/KOKDQYvjMmS8rsjtitvuP2OEGrqgpj428= github.com/abourget/llerrgroup v0.2.0/go.mod h1:QukSa1Sim/0R4aRlWdiBdAy+0i1PBfOd1WHpfYM1ngA= github.com/alecthomas/gometalinter v2.0.11+incompatible/go.mod h1:qfIpQGGz3d+NmgyPBqv+LSh50emm1pt72EtcX2vKYQk= -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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.43/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.325 h1:jF/L99fJSq/BfiLmUOflO/aM+LwcqBm0Fe/qTK5xxuI= github.com/aws/aws-sdk-go v1.44.325/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= @@ -165,15 +131,11 @@ github.com/azer/logger v1.0.0/go.mod h1:iaDID7UeBTyUh31bjGFlLkr87k23z/mHMMLzt6YQ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bits-and-blooms/bitset v1.3.1 h1:y+qrlmq3XsWi+xZqSaueaE8ry8Y127iMxlMfqcK8p0g= github.com/bits-and-blooms/bitset v1.3.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d h1:fSlGu5ePbkjBidXuj2O5j9EcYrVB5Cr6/wdkYyDgxZk= github.com/blendle/zapdriver v1.3.2-0.20200203083823-9200777f8a3d/go.mod h1:yCBkgASmKHgUOFjK9h1sOytUVgA+JkQjqj3xYP4AdWY= @@ -191,7 +153,6 @@ github.com/bufbuild/connect-grpcreflect-go v1.0.0 h1:zWsLFYqrT1O2sNJFYfTXI5WxbAy github.com/bufbuild/connect-grpcreflect-go v1.0.0/go.mod h1:825I20H8bfE9rLnBH/046JSpmm3uwpNYdG4duCARetc= github.com/bufbuild/connect-opentelemetry-go v0.3.0 h1:AuZi3asTDKmjGtd2aqpyP4p5QvBFG/YEaHopViLatnk= github.com/bufbuild/connect-opentelemetry-go v0.3.0/go.mod h1:r1ppyTtu1EWeRodk4Q/JbyQhIWtO7eR3GoRDzjeEcNU= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -200,7 +161,6 @@ github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMr github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= @@ -226,18 +186,13 @@ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= @@ -256,7 +211,6 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= @@ -269,38 +223,28 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -314,20 +258,17 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg= github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -383,8 +324,6 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -420,67 +359,37 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3/go.mod h1:h/KNeRx7oYU4SpA4SoY7W2/NxDKEEVuwA6j9A27L4OI= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ipfs/boxo v0.8.0 h1:UdjAJmHzQHo/j3g3b1bAcAXCj/GM6iTwvSlBDvPBNBs= @@ -489,12 +398,6 @@ github.com/ipfs/go-cid v0.4.0 h1:a4pdZq0sx6ZSxbCizebnKiMCx/xI/aBBFlB73IgH4rA= github.com/ipfs/go-cid v0.4.0/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-ipfs-api v0.6.0 h1:JARgG0VTbjyVhO5ZfesnbXv9wTcMvoKRBLF1SzJqzmg= github.com/ipfs/go-ipfs-api v0.6.0/go.mod h1:iDC2VMwN9LUpQV/GzEeZ2zNqd8NUdRmWcFM+K/6odf0= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= @@ -510,24 +413,15 @@ github.com/josephburnett/jd v1.7.1 h1:oXBPMS+SNnILTMGj1fWLK9pexpeJUXtbVFfRku/PjB github.com/josephburnett/jd v1.7.1/go.mod h1:R8ZnZnLt2D4rhW4NvBc/USTo6mzyNT6fYNIIWOJA9GY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= -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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= @@ -536,7 +430,6 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -560,7 +453,6 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -574,35 +466,22 @@ github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mostynb/go-grpc-compression v1.1.17 h1:N9t6taOJN3mNTTi0wDf4e3lp/G/ON1TP67Pn0vTUA9I= @@ -629,83 +508,45 @@ github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/n github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nicksnyder/go-i18n v1.10.1/go.mod h1:e4Di5xjP9oTVrC6y3C7C0HoSYXjSbhh/dU0eUV32nB4= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.5.1 h1:auzK7OI497k6x4OvWq+TKAcpcSAlod0doAH72oIN0Jw= github.com/onsi/ginkgo/v2 v2.5.1/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A= github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -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/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -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/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -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/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -713,115 +554,85 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sethvargo/go-retry v0.1.0/go.mod h1:JzIOdZqQDNpPkQDmcqgtteAcxFLtYpNF/zJCM1ysDg8= github.com/sethvargo/go-retry v0.2.3 h1:oYlgvIvsju3jNbottWABtbnoLC+GDtLdBHxKWxQm/iU= github.com/sethvargo/go-retry v0.2.3/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 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.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= 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.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 h1:fGJnUx0shX9Y312QOlz+/+yLquihXRhNqctJ26jtZZM= github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680/go.mod h1:iISPGAstbUsPgyC3auLLi7PYUTi9lHv5z0COam0OPOY= -github.com/streamingfast/bstream v0.0.2-0.20221017131819-2a7e38be1047/go.mod h1:Njkx972HcZiz0djWBylxqO/eq686eDGr+egQ1lePj3Q= github.com/streamingfast/bstream v0.0.2-0.20230829131224-b9272048dc6a h1:NeCO5JLz38HRK1uaV1Emo9u5gUSRtmtZZGNK8BKyLIE= github.com/streamingfast/bstream v0.0.2-0.20230829131224-b9272048dc6a/go.mod h1:Njkx972HcZiz0djWBylxqO/eq686eDGr+egQ1lePj3Q= github.com/streamingfast/cli v0.0.4-0.20230825151644-8cc84512cd80 h1:UxJUTcEVkdZy8N77E3exz0iNlgQuxl4m220GPvzdZ2s= github.com/streamingfast/cli v0.0.4-0.20230825151644-8cc84512cd80/go.mod h1:QxjVH73Lkqk+mP8bndvhMuQDUINfkgsYhdCH/5TJFKI= -github.com/streamingfast/dauth v0.0.0-20210812020920-1c83ba29add1/go.mod h1:FIYpVqt+ICVuNBoOH3ZIicIctpVoCq3393+RpfXsPEM= github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330 h1:49JYZkn8ALGe+LhcACZyX3L9B8tIxRZ3F3l+OxmNMhY= github.com/streamingfast/dauth v0.0.0-20230929180355-921f9c9be330/go.mod h1:zfq+mtesfbaZnNeh1BF+vo+zEFP1sat4pm3lvt40nRw= -github.com/streamingfast/dbin v0.0.0-20210809205249-73d5eca35dc5/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad h1:6z4uS6TlD9KoHdyE1vzoGsELVCCcviTFT/3/vqCylh8= github.com/streamingfast/dbin v0.9.1-0.20220513054835-1abebbb944ad/go.mod h1:YStE7K5/GH47JsWpY7LMKsDaXXpMLU/M26vYFzXHYRk= -github.com/streamingfast/derr v0.0.0-20210811180100-9138d738bcec/go.mod h1:ulVfui/yGXmPBbt9aAqCWdAjM7YxnZkYHzvQktLfw3M= github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1 h1:xJB7rXnOHLesosMjfwWsEL2i/40mFSkzenEb3M0qTyM= github.com/streamingfast/derr v0.0.0-20230515163924-8570aaa43fe1/go.mod h1:QSm/AfaDsE0k1xBYi0lW580YJ/WDV/FKZI628tkZR0Y= -github.com/streamingfast/dgrpc v0.0.0-20220909121013-162e9305bbfc/go.mod h1:YlFJuFiB9rmglB5UfTfnsOTfKC1rFo+D0sRbTzLcqgc= github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa h1:L/Ipge5pkZtyHucT7c8F/PiCitiNqQxjoUuxyzWKZew= github.com/streamingfast/dgrpc v0.0.0-20230929132851-893fc52687fa/go.mod h1:AcY2kk28XswihgU6z37288a3ZF4gGGO7nNwlTI/vET4= github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e h1:Nh/gLDv8rOMIidb/gpO4rZOYVe09k+tof/trezkpku4= github.com/streamingfast/dlauncher v0.0.0-20230607184145-76399faad89e/go.mod h1:xErlHEDd5+4NlR+Mg3ZtW7BTTLB0yZBxZAjHPrkk8X4= -github.com/streamingfast/dmetering v0.0.0-20220301165106-a642bb6a21bd/go.mod h1:Eu1SH2HyBbDUmQqJV+f5oowCQ/c02HkAZyR5U2BKIT8= github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa h1:bM6iy5X7Gtw1oh1bMxFmtroouKZu4K4BHXaFvR96jNw= github.com/streamingfast/dmetering v0.0.0-20230731155453-e1df53e362aa/go.mod h1:3XggUfQMyciaue133qhbIkFqJQqNzozGpa/gI3sdwac= -github.com/streamingfast/dmetrics v0.0.0-20210811180524-8494aeb34447/go.mod h1:VLdQY/FwczmC/flqWkcsBbqXO4BhU4zQDSK7GMrpcjY= -github.com/streamingfast/dmetrics v0.0.0-20220811180000-3e513057d17c/go.mod h1:fWoyaD76fE7mXZfkfcAfNeU/Hv/y6yJ/RgEcInQLwSw= github.com/streamingfast/dmetrics v0.0.0-20230919161904-206fa8ebd545 h1:SUl04bZKGAv207lp7/6CHOJIRpjUKunwItrno3K463Y= github.com/streamingfast/dmetrics v0.0.0-20230919161904-206fa8ebd545/go.mod h1:JbxEDbzWRG1dHdNIPrYfuPllEkktZMgm40AwVIBENcw= -github.com/streamingfast/dstore v0.1.1-0.20220607202639-35118aeaf648/go.mod h1:SHSEIPowGeE1TfNNmGeAUUnlO3dwevmX5kFOSazU60M= github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77 h1:u7FWLqz3Uwff609Ja9M+3aGOWqBCVU7dx9i6R6Qc4qI= github.com/streamingfast/dstore v0.1.1-0.20230620124109-3924b3b36c77/go.mod h1:ngKU7WzHwVjOFpt2g+Wtob5mX4IvN90HYlnARcTRbmQ= -github.com/streamingfast/dtracing v0.0.0-20210811175635-d55665d3622a/go.mod h1:bqiYZaX6L/MoXNfFQeAdau6g9HLA3yKHkX8KzStt58Q= github.com/streamingfast/dtracing v0.0.0-20220305214756-b5c0e8699839 h1:K6mJPvh1jAL+/gBS7Bh9jyzWaTib6N47m06gZOTUPwQ= github.com/streamingfast/dtracing v0.0.0-20220305214756-b5c0e8699839/go.mod h1:huOJyjMYS6K8upTuxDxaNd+emD65RrXoVBvh8f1/7Ns= github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1 h1:CGU52NV9heyO2Wb4ImDBy+1bVCeCsrEuu7WN/o/JGy0= github.com/streamingfast/eth-go v0.0.0-20230410173454-433bd8803da1/go.mod h1:UEm8dqibr3c3A1iIA3CHpkhN7j3X78prN7/55sXf3A0= -github.com/streamingfast/firehose v0.1.1-0.20221017171248-8fd3adbe7b4d/go.mod h1:weGz9xDNJMBNmn03XiJZ/b5Ngw8UAUoLirarqG7OwQY= github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9 h1:SybLEPFkJk8EINJGDlijSWxEZGNXDul4zqlDpttQUCI= github.com/streamingfast/firehose v0.1.1-0.20230731171526-3428fc0ff8d9/go.mod h1:lGC1T6mpAAApjBQNF5COSXb3SbrYRI3dBR1f6/PZE54= -github.com/streamingfast/firehose-core v0.1.12-0.20231030151853-bc6879426511 h1:ufAHt1DaBf5NHi8gfiM3ms89JhqNf73/s7R8V2bN77c= -github.com/streamingfast/firehose-core v0.1.12-0.20231030151853-bc6879426511/go.mod h1:S5jeP4FYeWghjEY4L1LFIXfF1tl9/cyaAQZM9Or9+L4= +github.com/streamingfast/firehose-core v0.1.13-0.20231102161517-3bc681ef5fc3 h1:HSxvhLx5ft23rmNp9tNqDVYejJPTmhrlEGQoVe8aL0A= +github.com/streamingfast/firehose-core v0.1.13-0.20231102161517-3bc681ef5fc3/go.mod h1:QS4D/7sgtxQLBtaMBVmJP0Q0NyXx6Wdcwj4a0gVQFVY= github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2 h1:dgYLhP3STiPi30fISAijFPEB11D4r1fQFc8D3cpgV5s= github.com/streamingfast/index-builder v0.0.0-20221031203737-fa2e70f09dc2/go.mod h1:OYv1UX/kRsV9aP4SEwa9zpt34qGzdtJzOvdGn+n56as= github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0 h1:g8eEYbFSykyzIyuxNMmHEUGGUvJE0ivmqZagLDK42gw= github.com/streamingfast/jsonpb v0.0.0-20210811021341-3670f0aa02d0/go.mod h1:cTNObq2Uofb330y05JbbZZ6RwE6QUXw5iVcHk1Fx3fk= github.com/streamingfast/logging v0.0.0-20210811175431-f3b44b61606a/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= github.com/streamingfast/logging v0.0.0-20210908162127-bdc5856d5341/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= -github.com/streamingfast/logging v0.0.0-20220222131651-12c3943aac2e/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= github.com/streamingfast/logging v0.0.0-20220304183711-ddba33d79e27/go.mod h1:4GdqELhZOXj4xwc4IaBmzofzdErGynnaSzuzxy0ZIBo= github.com/streamingfast/logging v0.0.0-20220304214715-bc750a74b424/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= -github.com/streamingfast/merger v0.0.3-0.20230413191947-fe3ce68cb9f8 h1:riOEu4aTwjy7Gjq8safA8kYUs+jVKi/gZ0+k7S/w/u8= -github.com/streamingfast/merger v0.0.3-0.20230413191947-fe3ce68cb9f8/go.mod h1:WGMs+zwpPQNfzRnOqnyNdQfyGSG4lXYWQacicAGiP4s= +github.com/streamingfast/merger v0.0.3-0.20231027161314-209c2ddd8d96 h1:aq5hUjo+Y+3OUH2z1egyJ9fSepRvOzxgR+TYICdSEgE= +github.com/streamingfast/merger v0.0.3-0.20231027161314-209c2ddd8d96/go.mod h1:WGMs+zwpPQNfzRnOqnyNdQfyGSG4lXYWQacicAGiP4s= github.com/streamingfast/node-manager v0.0.2-0.20230406142433-692298a8b8d2 h1:6Jdu6LBwaW38n2jjInFk1fM460cq+5paEAHGPPRWWN0= github.com/streamingfast/node-manager v0.0.2-0.20230406142433-692298a8b8d2/go.mod h1:R5WwJuyNueq0QXKAFinTGU8zaON0hWJBFHX6KA9WZqk= github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308 h1:xlWSfi1BoPfsHtPb0VEHGUcAdBF208LUiFCwfaVPfLA= github.com/streamingfast/opaque v0.0.0-20210811180740-0c01d37ea308/go.mod h1:K1p8Bj/wG34KJvYzPUqtzpndffmpkrVY11u2hkyxCWQ= github.com/streamingfast/overseer v0.2.1-0.20210326144022-ee491780e3ef h1:9IVFHRsqvI+vKJwgF1OMV6L55jHbaV/ZLoU4IAG/dME= github.com/streamingfast/overseer v0.2.1-0.20210326144022-ee491780e3ef/go.mod h1:cq8CvbZ3ioFmGrHokSAJalS0lC+pVXLKhITScItUGXY= -github.com/streamingfast/pbgo v0.0.6-0.20220629184423-cfd0608e0cf4/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= -github.com/streamingfast/pbgo v0.0.6-0.20221014191646-3a05d7bc30c8/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28 h1:wmQg8T0rIFl/R3dy97OWRi8OSdM3llvRw2p3TPFVKZQ= github.com/streamingfast/pbgo v0.0.6-0.20221020131607-255008258d28/go.mod h1:huKwfgTGFIFZMKSVbD5TywClM7zAeBUG/zePZMqvXQQ= github.com/streamingfast/relayer v0.0.2-0.20220909122435-e67fbc964fd9 h1:V3LPBmTofZbmT46qQsr0lFa+0qDHZNJXgqLRo9iZBHY= github.com/streamingfast/relayer v0.0.2-0.20220909122435-e67fbc964fd9/go.mod h1:55E/1g+ojZoX86Odp48LFgceJVyh1xx9ZuhknKfmc/o= -github.com/streamingfast/sf-tools v0.0.0-20230811131237-97a5d4afa459 h1:tDx8R58G68Ir6N2lEkD7iU1SavYLr3CxokQRWicnNjg= -github.com/streamingfast/sf-tools v0.0.0-20230811131237-97a5d4afa459/go.mod h1:uM2R0jdjcHiMONKawyr1XNh8B+qebPJvuApGYn0l/rI= -github.com/streamingfast/sf-tracing v0.0.0-20220829120927-5a5d2e0fe525/go.mod h1:k3hivbalRWW6hvGSV3vJ3wtBSt1pszXI6m9MJa5k0/I= github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9 h1:YRwpVvLYa+FEJlTy0S7mk4UptYjk5zac+A+ZE1phOeA= github.com/streamingfast/sf-tracing v0.0.0-20230616174903-cd2ade641ca9/go.mod h1:ktzt1BUj3GF+SKQHEmn3ShryJ7y87JeCHtaTGaDVATs= github.com/streamingfast/shutter v1.5.0 h1:NpzDYzj0HVpSiDJVO/FFSL6QIK/YKOxY0gJAtyaTOgs= @@ -846,7 +657,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf h1:Z2X3Os7oRzpdJ75iPqWZc0HeJWFYNCvKsfpQwFpRNTA= @@ -863,12 +673,8 @@ github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9/go.mod h1:q+QjxYvZ+fpjMXqs+XEriussHjSYqeXVnAdSV1tkMYk= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c h1:GGsyl0dZ2jJgVT+VvWBf/cNijrHRhkrTjkmp5wg7li0= github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c/go.mod h1:xxcJeBb7SIUl/Wzkz1eVKJE/CB34YNrqX2TQI6jY9zs= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/yourbasic/graph v0.0.0-20210606180040-8ecfec1c2869 h1:7v7L5lsfw4w8iqBBXETukHo4IPltmD+mWoLRYUmeGN8= github.com/yourbasic/graph v0.0.0-20210606180040-8ecfec1c2869/go.mod h1:Rfzr+sqaDreiCaoQbFCu3sTXxeFq/9kXRuyOoSlGQHE= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -877,9 +683,6 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= 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.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= @@ -887,96 +690,66 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/detectors/gcp v1.9.0 h1:en6EnI47A3nrVtKCIgwFS5SUAhYW8LHn4Rkmm6HGhzg= go.opentelemetry.io/contrib/detectors/gcp v1.9.0/go.mod h1:OqG0FEnmWeJWYVrEovaHXHXY4bVTnp/WfTzhwrsGWlw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.34.0/go.mod h1:fk1+icoN47ytLSgkoWHLJrtVTSQ+HgmkNgPTKrk/Nsc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0 h1:b8xjZxHbLrXAum4SxJd1Rlm7Y/fKaB+6ACI7/e5EfSA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.44.0/go.mod h1:1ei0a32xOGkFoySu7y1DAHfcuIhC0pNZpvY2huXuMy4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0/go.mod h1:548ZsYzmT4PL4zWKRd8q/N4z0Wxzn/ZxUE+lkEpwWQA= -go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= go.opentelemetry.io/otel v1.18.0 h1:TgVozPGZ01nHyDZxK5WGPFB9QexeTMXEH7+tIClWfzs= go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= -go.opentelemetry.io/otel/exporters/jaeger v1.9.0/go.mod h1:hquezOLVAybNW6vanIxkdLXTXvzlj2Vn3wevSP15RYs= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0/go.mod h1:0EsCXjZAiiZGnLdEUXM9YjCKuuLZMYyglh2QDXcYKVA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0 h1:IAtl+7gua134xcV3NieDhJHjjOVeJhXAnYf/0hswjUY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.18.0/go.mod h1:w+pXobnBzh95MNIkeIuAKcHe/Uu/CX2PKIvBP6ipKRA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.9.0/go.mod h1:K5G92gbtCrYJ0mn6zj9Pst7YFsDFuvSYEhYKRMcufnM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0 h1:yE32ay7mJG2leczfREEhoW3VfSZIvHaB+gvVo1o8DQ8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.18.0/go.mod h1:G17FHPDLt74bCI7tJ4CMitEk4BXTYG4FW6XUpkPBXa4= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.9.0/go.mod h1:Fl1iS5ZhWgXXXTdJMuBSVsS5nkL5XluHbg97kjOuYU4= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.15.1 h1:2PunuO5SbkN5MhCbuHCd3tC6qrcaj+uDAkX/qBU5BAs= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.15.1/go.mod h1:q8+Tha+5LThjeSU8BW93uUC5w5/+DnYHMKBMpRCsui0= -go.opentelemetry.io/otel/exporters/zipkin v1.9.0/go.mod h1:HyIvYIu37wV4Wx5azd7e05x9k/dOz9KB4x0plw2QNvs= go.opentelemetry.io/otel/exporters/zipkin v1.15.1 h1:B6s/o48bx00ayJu7F+jIMJfhPTyxW+S8vthjTZMNBj0= go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= go.opentelemetry.io/otel/metric v1.18.0 h1:JwVzw94UYmbx3ej++CwLUQZxEODDj/pOuTCvzhtRrSQ= go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= go.opentelemetry.io/otel/sdk v1.18.0 h1:e3bAB0wB3MljH38sHzpV/qWrOTCFrdZF2ct9F8rBkcY= go.opentelemetry.io/otel/sdk v1.18.0/go.mod h1:1RCygWV7plY2KmdskZEDDBs4tJeHG92MdHZIluiYs/M= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= go.opentelemetry.io/otel/trace v1.18.0 h1:NY+czwbHbmndxojTEKiSMHkG2ClNH2PwmcHrdo0JY10= go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.18.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= 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/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -1026,9 +799,7 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-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= @@ -1036,7 +807,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn 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= @@ -1052,9 +822,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/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= @@ -1067,18 +835,8 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= @@ -1091,22 +849,14 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1120,16 +870,11 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/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= @@ -1141,15 +886,11 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1162,17 +903,13 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201113233024-12cec1faf1ba/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1181,12 +918,10 @@ golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1196,21 +931,9 @@ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1248,7 +971,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1260,7 +982,6 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1284,16 +1005,13 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200701151220-7cb253f4c4f8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1308,9 +1026,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 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= @@ -1331,11 +1046,9 @@ google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSr google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= @@ -1346,21 +1059,6 @@ google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.91.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -1379,7 +1077,6 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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-20190905072037-92dd089d5514/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= @@ -1400,7 +1097,6 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200605102947-12044bf5ea91/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 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= @@ -1412,13 +1108,11 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1440,38 +1134,6 @@ google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220405205423-9d709892a2bf/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220802133213-ce4fa296bf78/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220808131553-a91ffa7f803e/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= @@ -1505,16 +1167,9 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1531,11 +1186,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA= 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= @@ -1546,7 +1198,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/olivere/elastic.v3 v3.0.75 h1:u3B8p1VlHF3yNLVOlhIWFT3F1ICcHfM5V6FFJe6pPSo= @@ -1555,10 +1206,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -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=